```
-## 3. Uhr per Javascript konfigurieren
+3. Uhr per Javascript konfigurieren
+-----------------------------------
Initialisiere die Uhr mit einer einzigen Zeile Javascript:
```javascript
@@ -83,7 +88,8 @@ jQuery('div').uhr();
würde also jedes `
`-Element der Seite in eine Uhr umgewandelt.
-## 4. Weitere Optionen
+4. Weitere Optionen
+-------------------
Der uhr()-Methode kann ein Options-Objekt mitgegeben werden:
```javascript
@@ -93,7 +99,7 @@ jQuery('#uhrcontainer').uhr({
language: 'de_CH', // 'de_CH' (default), 'de_CH_genau', 'de', 'dk', 'en', 'es', 'fr', 'it', 'nl' oder 'pt' (je nach eingebundenen Sprachdateien)
mode: 'normal', // 'normal' (default): Die Uhr zeigt die aktuelle Zeit (Stunden und Minuten) in Worten an
// 'seconds': Die Uhr zeigt die aktuellen Sekunden als grosse Ziffern an
- width: '100%', // Eine CSS-Grössenangabe (default: 100%)
+ width: '100%', // eine CSS-Grössenangabe (default: 100%)
force: false, // false (default): Falls ein Cookie im Browser besteht, werden dessen Konfigurationswerte übernommen;
// true: immer die angegebene Konfiguration verwenden
controls: true, // true (default): Die Bedienelemente (Ein-/Ausschalter, Theme-, Zeitmodus- und Sprachwähler) werden angezeigt
@@ -104,7 +110,8 @@ jQuery('#uhrcontainer').uhr({
});
```
-## 5. Sonderfunktionen
+5. Sonderfunktionen
+-------------------
Es gibt noch einen zusätzlichen Konfigurationsparameter. Mittels
```javascript
@@ -120,8 +127,9 @@ Die Zeit kann auch über einen Methodenaufruf dynamisch eingestellt werden:
jQuery('#uhrcontainer').uhr("time", new Date());
```
-## 6. Konfiguration über die URL
-Es ist möglich, die Uhr durch den Aufruf mit URL-Parametern zu konfigurieren. Dies übersteuert auch allfällig bereits in einem Cookie gespeicherte Einstellungen. Die Einstellungen werden für alle Uhr-Elemente übernommen, welche sich auf der Seite befinden. Folgende Parameter werden unterstützt, wenn du sie mit einem Hash (`#`) an die URL anhängst:
+6. Konfiguration über die URL
+-----------------------------
+Es ist möglich, die Uhr durch den Aufruf mit URL-Parameters zu konfigurieren. Dies übersteuert auch allfällig bereits in einem Cookie gespeicherte Einstellungen. Die Einstellungen werden für alle Uhr-Elemente übernommen, welche sich auf der Seite befinden. Folgende Parameter werden unterstützt, wenn du sie mit einem Hash (`#`) an die URL anhängst:
* `l` oder `language`: Bestimmt die Sprache. Der Wert ist der Sprach-Code (abhängig von den eingebundenen Sprachdateien):
* de_CH: Bärndütsch
@@ -149,7 +157,7 @@ Es ist möglich, die Uhr durch den Aufruf mit URL-Parametern zu konfigurieren. D
* on: Die Uhr ist eingeschaltet
* off: Die Uhr ist ausgeschaltet
-Eine URL kann also beispielsweise so aussehen:
+Eine URL kann also beispielweise so aussehen:
http://example.com/uhr.html#l=fr&t=red&m=seconds&s=on
@@ -157,7 +165,8 @@ Dies zeigt dann die Uhr auf Französisch in Rot, im Sekunden-Modus und eingescha
Viel Spass!
-# A. Lizenzbestimmungen
+A. Lizenzbestimmungen
+=====================
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
diff --git a/VERSION b/VERSION
index 2b1a7b3..d3ae6cf 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-9.0.0-dev.0
+8.0.4-dev.0
diff --git a/build-config/entrypoints/css-app.js b/build-config/entrypoints/css-app.js
deleted file mode 100644
index f57a652..0000000
--- a/build-config/entrypoints/css-app.js
+++ /dev/null
@@ -1 +0,0 @@
-import '../../css/uhr.css';
diff --git a/build-config/entrypoints/css-black.js b/build-config/entrypoints/css-black.js
deleted file mode 100644
index 9924336..0000000
--- a/build-config/entrypoints/css-black.js
+++ /dev/null
@@ -1 +0,0 @@
-import '../../css/uhr-black.css';
diff --git a/build-config/entrypoints/css-blue.js b/build-config/entrypoints/css-blue.js
deleted file mode 100644
index 13e3df9..0000000
--- a/build-config/entrypoints/css-blue.js
+++ /dev/null
@@ -1 +0,0 @@
-import '../../css/uhr-blue.css';
diff --git a/build-config/entrypoints/css-green.js b/build-config/entrypoints/css-green.js
deleted file mode 100644
index ff54518..0000000
--- a/build-config/entrypoints/css-green.js
+++ /dev/null
@@ -1 +0,0 @@
-import '../../css/uhr-green.css';
diff --git a/build-config/entrypoints/css-pink.js b/build-config/entrypoints/css-pink.js
deleted file mode 100644
index d314a16..0000000
--- a/build-config/entrypoints/css-pink.js
+++ /dev/null
@@ -1 +0,0 @@
-import '../../css/uhr-pink.css';
diff --git a/build-config/entrypoints/css-red.js b/build-config/entrypoints/css-red.js
deleted file mode 100644
index caca988..0000000
--- a/build-config/entrypoints/css-red.js
+++ /dev/null
@@ -1 +0,0 @@
-import '../../css/uhr-red.css';
diff --git a/build-config/entrypoints/css-white.js b/build-config/entrypoints/css-white.js
deleted file mode 100644
index b3c2dc6..0000000
--- a/build-config/entrypoints/css-white.js
+++ /dev/null
@@ -1 +0,0 @@
-import '../../css/uhr-white.css';
diff --git a/build-config/entrypoints/css-yellow.js b/build-config/entrypoints/css-yellow.js
deleted file mode 100644
index 6f1f258..0000000
--- a/build-config/entrypoints/css-yellow.js
+++ /dev/null
@@ -1 +0,0 @@
-import '../../css/uhr-yellow.css';
diff --git a/build-config/entrypoints/js-app.js b/build-config/entrypoints/js-app.js
deleted file mode 100644
index b764aac..0000000
--- a/build-config/entrypoints/js-app.js
+++ /dev/null
@@ -1 +0,0 @@
-import '../../src/uhr';
diff --git a/build-config/entrypoints/js-base.js b/build-config/entrypoints/js-base.js
deleted file mode 100644
index 51f9973..0000000
--- a/build-config/entrypoints/js-base.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import '../../src/uhr';
-import '../../src/uhr-de_CH';
diff --git a/build-config/entrypoints/js-baselangs.js b/build-config/entrypoints/js-baselangs.js
deleted file mode 100644
index 503ee3d..0000000
--- a/build-config/entrypoints/js-baselangs.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import '../../src/uhr-de';
-import '../../src/uhr-de_CH_genau';
-import '../../src/uhr-dk';
-import '../../src/uhr-en';
-import '../../src/uhr-es';
-import '../../src/uhr-fr';
-import '../../src/uhr-it';
-import '../../src/uhr-nl';
-import '../../src/uhr-pt';
diff --git a/build-config/entrypoints/js-complete.js b/build-config/entrypoints/js-complete.js
deleted file mode 100644
index 8f63442..0000000
--- a/build-config/entrypoints/js-complete.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import '../../src/uhr';
-import '../../src/uhr-de';
-import '../../src/uhr-de_CH';
-import '../../src/uhr-de_CH_genau';
-import '../../src/uhr-dk';
-import '../../src/uhr-en';
-import '../../src/uhr-es';
-import '../../src/uhr-fr';
-import '../../src/uhr-it';
-import '../../src/uhr-nl';
-import '../../src/uhr-pt';
diff --git a/build-config/entrypoints/js-langs.js b/build-config/entrypoints/js-langs.js
deleted file mode 100644
index 938e011..0000000
--- a/build-config/entrypoints/js-langs.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import '../../src/uhr-de';
-import '../../src/uhr-de_CH';
-import '../../src/uhr-de_CH_genau';
-import '../../src/uhr-dk';
-import '../../src/uhr-en';
-import '../../src/uhr-es';
-import '../../src/uhr-fr';
-import '../../src/uhr-it';
-import '../../src/uhr-nl';
-import '../../src/uhr-pt';
diff --git a/build-config/entrypoints/js-libs.js b/build-config/entrypoints/js-libs.js
deleted file mode 100644
index 6642c62..0000000
--- a/build-config/entrypoints/js-libs.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import 'jquery';
-import 'jquery-ui';
-import 'jquery.cookie';
diff --git a/build-config/rollup.config.css-app.js b/build-config/rollup.config.css-app.js
deleted file mode 100644
index f7d53b3..0000000
--- a/build-config/rollup.config.css-app.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import cssbundle from 'rollup-plugin-css-bundle';
-import postcss from "postcss";
-import cssnano from "cssnano";
-
-export default {
- input: 'build-config/entrypoints/css-app.js',
- plugins: [cssbundle({
- transform: code => postcss([cssnano]).process(code),
- output: 'dist/uhr.min.css'
- })]
-}
diff --git a/build-config/rollup.config.css-black.js b/build-config/rollup.config.css-black.js
deleted file mode 100644
index b402865..0000000
--- a/build-config/rollup.config.css-black.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import cssbundle from 'rollup-plugin-css-bundle';
-import postcss from 'postcss';
-import cssnano from 'cssnano';
-
-export default {
- input: 'build-config/entrypoints/css-black.js',
- plugins: [cssbundle({
- transform: code => postcss([cssnano]).process(code),
- output: 'dist/uhr-black.min.css'
- })]
-}
diff --git a/build-config/rollup.config.css-blue.js b/build-config/rollup.config.css-blue.js
deleted file mode 100644
index 8b00d77..0000000
--- a/build-config/rollup.config.css-blue.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import cssbundle from 'rollup-plugin-css-bundle';
-import postcss from 'postcss';
-import cssnano from 'cssnano';
-
-export default {
- input: 'build-config/entrypoints/css-blue.js',
- plugins: [cssbundle({
- transform: code => postcss([cssnano]).process(code),
- output: 'dist/uhr-blue.min.css'
- })]
-}
diff --git a/build-config/rollup.config.css-green.js b/build-config/rollup.config.css-green.js
deleted file mode 100644
index 949dbd0..0000000
--- a/build-config/rollup.config.css-green.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import cssbundle from 'rollup-plugin-css-bundle';
-import postcss from 'postcss';
-import cssnano from 'cssnano';
-
-export default {
- input: 'build-config/entrypoints/css-green.js',
- plugins: [cssbundle({
- transform: code => postcss([cssnano]).process(code),
- output: 'dist/uhr-green.min.css'
- })]
-}
diff --git a/build-config/rollup.config.css-pink.js b/build-config/rollup.config.css-pink.js
deleted file mode 100644
index 1eadbae..0000000
--- a/build-config/rollup.config.css-pink.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import cssbundle from 'rollup-plugin-css-bundle';
-import postcss from 'postcss';
-import cssnano from 'cssnano';
-
-export default {
- input: 'build-config/entrypoints/css-pink.js',
- plugins: [cssbundle({
- transform: code => postcss([cssnano]).process(code),
- output: 'dist/uhr-pink.min.css'
- })]
-}
diff --git a/build-config/rollup.config.css-red.js b/build-config/rollup.config.css-red.js
deleted file mode 100644
index 9cfec11..0000000
--- a/build-config/rollup.config.css-red.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import cssbundle from 'rollup-plugin-css-bundle';
-import postcss from 'postcss';
-import cssnano from 'cssnano';
-
-export default {
- input: 'build-config/entrypoints/css-red.js',
- plugins: [cssbundle({
- transform: code => postcss([cssnano]).process(code),
- output: 'dist/uhr-red.min.css'
- })]
-}
diff --git a/build-config/rollup.config.css-white.js b/build-config/rollup.config.css-white.js
deleted file mode 100644
index 62f2808..0000000
--- a/build-config/rollup.config.css-white.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import cssbundle from 'rollup-plugin-css-bundle';
-import postcss from 'postcss';
-import cssnano from 'cssnano';
-
-export default {
- input: 'build-config/entrypoints/css-white.js',
- plugins: [cssbundle({
- transform: code => postcss([cssnano]).process(code),
- output: 'dist/uhr-white.min.css'
- })]
-}
diff --git a/build-config/rollup.config.css-yellow.js b/build-config/rollup.config.css-yellow.js
deleted file mode 100644
index 9ec2766..0000000
--- a/build-config/rollup.config.css-yellow.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import cssbundle from 'rollup-plugin-css-bundle';
-import postcss from 'postcss';
-import cssnano from 'cssnano';
-
-export default {
- input: 'build-config/entrypoints/css-yellow.js',
- plugins: [cssbundle({
- transform: code => postcss([cssnano]).process(code),
- output: 'dist/uhr-yellow.min.css'
- })]
-}
diff --git a/build-config/rollup.config.js-app.js b/build-config/rollup.config.js-app.js
deleted file mode 100644
index 5a040ca..0000000
--- a/build-config/rollup.config.js-app.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import {terser} from 'rollup-plugin-terser';
-
-export default {
- external: [
- 'jquery',
- 'jquery-ui',
- 'jquery.cookie'
- ],
- input: 'build-config/entrypoints/js-app.js',
- output: [
- {
- dir: 'dist',
- entryFileNames: 'jquery.uhr.main.js',
- format: 'cjs'
- },
- {
- dir: 'dist',
- entryFileNames: 'jquery.uhr.main.min.js',
- format: 'cjs',
- plugins: [terser()]
- }
- ]
-}
diff --git a/build-config/rollup.config.js-base.js b/build-config/rollup.config.js-base.js
deleted file mode 100644
index 0c5f2ba..0000000
--- a/build-config/rollup.config.js-base.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import {terser} from 'rollup-plugin-terser';
-
-export default {
- external: [
- 'jquery',
- 'jquery-ui',
- 'jquery.cookie'
- ],
- input: 'build-config/entrypoints/js-base.js',
- output: [
- {
- dir: 'dist',
- entryFileNames: 'jquery.uhr.base.js',
- format: 'cjs'
- },
- {
- dir: 'dist',
- entryFileNames: 'jquery.uhr.base.min.js',
- format: 'cjs',
- plugins: [terser()]
- }
- ]
-}
diff --git a/build-config/rollup.config.js-baselangs.js b/build-config/rollup.config.js-baselangs.js
deleted file mode 100644
index c53f20e..0000000
--- a/build-config/rollup.config.js-baselangs.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import {terser} from 'rollup-plugin-terser';
-
-export default {
- external: [
- 'jquery',
- 'jquery-ui',
- 'jquery.cookie'
- ],
- input: 'build-config/entrypoints/js-baselangs.js',
- output: [
- {
- dir: 'dist',
- entryFileNames: 'jquery.uhr.baselangs.js',
- format: 'cjs'
- },
- {
- dir: 'dist',
- entryFileNames: 'jquery.uhr.baselangs.min.js',
- format: 'cjs',
- plugins: [terser()]
- }
- ]
-}
diff --git a/build-config/rollup.config.js-complete.js b/build-config/rollup.config.js-complete.js
deleted file mode 100644
index 36405df..0000000
--- a/build-config/rollup.config.js-complete.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import {terser} from 'rollup-plugin-terser';
-
-export default {
- external: [
- 'jquery',
- 'jquery-ui',
- 'jquery.cookie'
- ],
- input: 'build-config/entrypoints/js-complete.js',
- output: [
- {
- dir: 'dist',
- entryFileNames: 'jquery.uhr.complete.js',
- format: 'cjs'
- },
- {
- dir: 'dist',
- entryFileNames: 'jquery.uhr.complete.min.js',
- format: 'cjs',
- plugins: [terser()]
- }
- ]
-}
diff --git a/build-config/rollup.config.js-langs.js b/build-config/rollup.config.js-langs.js
deleted file mode 100644
index 3024332..0000000
--- a/build-config/rollup.config.js-langs.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import {terser} from 'rollup-plugin-terser';
-
-export default {
- external: [
- 'jquery',
- 'jquery-ui',
- 'jquery.cookie'
- ],
- input: 'build-config/entrypoints/js-langs.js',
- output: [
- {
- dir: 'dist',
- entryFileNames: 'jquery.uhr.langs.js',
- format: 'cjs'
- },
- {
- dir: 'dist',
- entryFileNames: 'jquery.uhr.langs.min.js',
- format: 'cjs',
- plugins: [terser()]
- }
- ]
-}
diff --git a/build-config/rollup.config.js-libs.js b/build-config/rollup.config.js-libs.js
deleted file mode 100644
index 238fad0..0000000
--- a/build-config/rollup.config.js-libs.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import {terser} from 'rollup-plugin-terser';
-import {nodeResolve} from '@rollup/plugin-node-resolve';
-
-export default {
- input: 'build-config/entrypoints/js-libs.js',
- output: [
- {
- dir: 'dist',
- entryFileNames: 'libs.js',
- format: 'cjs'
- },
- {
- dir: 'dist',
- entryFileNames: 'libs.min.js',
- format: 'cjs',
- plugins: [terser()]
- }
- ],
- context: 'this',
- plugins: [nodeResolve()]
-}
diff --git a/deploy.sh b/deploy.sh
new file mode 100644
index 0000000..b5515ed
--- /dev/null
+++ b/deploy.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+declare destination
+case "${TARGET}" in
+ "${WWW_DEPLOY_ROOT_DEVELOP}")
+ destination="${TARGET}/${CI_BUILD_REF_NAME}"
+ ;;
+ "${WWW_DEPLOY_ROOT_STAGING}"|"${WWW_DEPLOY_ROOT_PRODUCTION}")
+ destination="${TARGET}"
+ ;;
+ *)
+ echo "Invalid TARGET specified. Aborting deployment."
+ exit 1
+ ;;
+esac
+
+rm -rf "${destination}/*"
+rm -rf "${destination}/.??*"
+mkdir -p "${destination}/dist"
+cp -a index.html manifest.appcache info resources "${destination}"
+cp -a dist/*.min.* "${destination}/dist"
+
+echo "Deployment successful."
diff --git a/dist/jquery.uhr.base.js b/dist/jquery.uhr.base.js
index 0356c71..bbd5b72 100644
--- a/dist/jquery.uhr.base.js
+++ b/dist/jquery.uhr.base.js
@@ -1,29 +1,17 @@
-'use strict';
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see
.
- */
-(function ($) {
+/*! uhr - v8.0.4-dev.0 - 2016-06-27
+* http://bärneruhr.ch/
+* Copyright (c) 2016 Manuel Friedli; Licensed GPL-3.0 */
+(function($) {
+ 'use strict';
var uhrGlobals = {
"id": 0,
"languages": [],
"themes": [],
registerLanguage: function registerLanguage(code, language) {
- var alreadyExists = uhrGlobals.languages.some(function (element) {
+ var alreadyExists = uhrGlobals.languages.some(function(element) {
if (code === element.code) {
console.error("Error: Language code '" + code + "' cannot be registered for language '" + language.language +
- "' because it is already registered for language '" + element.language + "'!");
+ "' because it is already registered for language '" + element.language + "'!");
return true;
}
return false;
@@ -36,7 +24,7 @@
};
// auto-detect themes
- $('link[rel=stylesheet]').each(function (index, item) {
+ $('link[rel=stylesheet]').each(function(index, item) {
var styleSheet = $(item);
var styleClass = styleSheet.attr('data-class');
if (styleClass !== undefined) {
@@ -53,12 +41,9 @@
}
// public interface methods (exported later)
- var setCookie;
- var isOn;
- var update;
var start = function start() {
if (!isOn.bind(this)()) {
- this.timer = window.setInterval(function () {
+ this.timer = window.setInterval(function() {
this.options.time = new Date();
update.bind(this)();
}.bind(this), 1000);
@@ -81,25 +66,436 @@
this.start();
}
};
- var language;
-
- /**
- * Ein Buchstabe. Hilfsklasse für den Renderer und Inhalt der Layout-Arrays.
- * @param value Der Buchstabe, der Dargestellt werden soll.
- * @param style Die CSS-Styleklassen des Buchstabens.
- */
- function Letter(value, style) {
- var myValue = value;
- var myStyle = style || '';
- this.addStyle = function (style) {
- if (myStyle === '') {
- myStyle = style;
- } else {
- myStyle += ' ' + style;
+ var setLanguage = function setLanguage(languageKey) {
+ if (languageKey !== this.options.language) {
+ this.options.language = languageKey;
+ var renderer = new UhrRenderer(language.bind(this)(), this.element.find('.letterarea'));
+ renderer.render.bind(this)(function() {
+ this.currentMinute = -1;
+ update.bind(this)();
+ }.bind(this));
+ setCookie.bind(this)('uhr-language', languageKey);
+ update.bind(this)();
+ }
+ };
+ var setTheme = function setTheme(theme) {
+ if (theme !== this.options.theme) {
+ this.element.removeClass(this.options.theme).addClass(theme);
+ $('#uhr-onoffswitch' + this.id).removeClass(this.options.theme).addClass(theme);
+ this.options.theme = theme;
+ setCookie.bind(this)('uhr-theme', theme);
+ }
+ };
+ var setTime = function setTime(time) {
+ this.currentMinute = -1;
+ if (time === null) {
+ this.options.time = new Date();
+ } else {
+ if (this.timer !== null) {
+ window.clearInterval(this.timer);
}
- };
- this.toString = function () {
- return '
' + myValue + ' ';
+ this.options.time = time;
+ }
+ update.bind(this)();
+ };
+ var setMode = function(mode) {
+ this.options.mode = mode;
+ this.currentMinute = -1;
+ update.bind(this)();
+ setCookie.bind(this)('uhr-mode', mode);
+ };
+ var setWidth = function setWidth(width) {
+ var e = this.element;
+ e.css('width', width);
+ var realWidth = e.width();
+ e.width(realWidth);
+ e.height(realWidth);
+ e.css('font-size', (realWidth / 40) + 'px');
+ };
+
+ // private interface methods
+ var create = function create() {
+ this.id = uhrGlobals.id++;
+ this.timer = null;
+ this.currentMinute = -1;
+ var userTime = this.options.time;
+ var hash, params;
+ if (this.options.time === undefined) {
+ this.options.time = new Date();
+ }
+ // parse the URL params
+ hash = window.location.hash;
+ if (hash !== undefined && typeof hash === 'string' && hash.charAt(0) === '#') {
+ hash = hash.substring(1);
+ hash = decodeURIComponent(hash);
+ params = hash.split('&');
+ params.forEach(function (element) {
+ var pair = element.split('=');
+ var key = pair[0];
+ var value = pair[1];
+ switch (key) {
+ case 'l':
+ case 'language':
+ this.options.language = value;
+ this.options.force = true;
+ break;
+ case 't':
+ case 'theme':
+ this.options.theme = value;
+ this.options.force = true;
+ break;
+ case 'm':
+ case 'mode':
+ this.options.mode = value;
+ this.options.force = true;
+ break;
+ case 's':
+ case 'status':
+ this.options.status = value;
+ this.options.force = true;
+ break;
+ }
+ }.bind(this));
+ }
+ // end parse the URL params
+ setupHTML.bind(this)();
+ wireFunctionality.bind(this)();
+ if (userTime !== undefined) {
+ this.time(userTime);
+ }
+ };
+ // private helper methods (not exported)
+ var toggleConfigScreen = function toggleConfigScreen() {
+ $('#uhr-controlpanel' + this.id).toggle('fast');
+ };
+ // set up
+ var setupHTML = function setupHTML() {
+ var e = this.element;
+ // Base clock area
+ e.addClass('uhr');
+ e.empty();
+ e.append('
');
+ e.append('
');
+ e.append('
');
+ e.append('
');
+ e.append('
');
+ e.append('
');
+ setWidth.bind(this)(this.options.width);
+
+ if (this.options.controls) {
+ var controlpanel = $('
');
+ var content = $('
');
+ controlpanel.append(content);
+ // on/off switch
+ var toggleSwitch = $('
');
+ toggleSwitch.append('
');
+ toggleSwitch.append('
' +
+ '
' + '
' + ' ');
+ content.append(toggleSwitch);
+
+ // time mode switch
+ var modeSwitch = $('
');
+ modeSwitch.append('
');
+ modeSwitch.append('
' +
+ '
' + '
' +
+ ' ');
+ content.append(modeSwitch);
+ // language chooser
+ if (uhrGlobals.languages.length > 1) {
+ var languageChooser = $('
');
+ uhrGlobals.languages.forEach(function(item) {
+ languageChooser.append('
' + item.language + ' ');
+ });
+ content.append(languageChooser);
+ }
+
+ // theme chooser
+ if (uhrGlobals.themes.length > 1) {
+ var themeChooser = $('
');
+ uhrGlobals.themes.forEach(function(item) {
+ themeChooser.append('
' + item.name + ' ');
+ });
+ content.append(themeChooser);
+ }
+ var closebutton = $('
');
+ closebutton.on('click', function() {
+ $('#uhr-controlpanel' + this.id).hide('fast');
+ }.bind(this));
+ content.append(closebutton);
+ e.after(controlpanel);
+ controlpanel.hide();
+ var configlink = $('
');
+ configlink.on('click', function() {
+ toggleConfigScreen.bind(this)();
+ }.bind(this));
+ e.after(configlink);
+ }
+ };
+ var wireFunctionality = function wireFunctionality() {
+ // on/off switch
+ var toggleSwitch = $('#uhr-onoffswitch-checkbox' + this.id);
+ toggleSwitch.on('click', function() {
+ this.toggle();
+ }.bind(this));
+ var status = $.cookie('uhr-status' + this.id);
+ if (status === undefined || this.options.force) {
+ status = this.options.status;
+ }
+ toggleSwitch.prop('checked', status === 'on');
+ if (status === 'on') {
+ this.start();
+ } else {
+ this.stop();
+ }
+
+ // time mode switch
+ var modeSwitch = $('#uhr-modeswitch-checkbox' + this.id);
+ modeSwitch.on('click', function() {
+ if (this.options.mode === 'seconds') {
+ setMode.bind(this)('normal');
+ } else {
+ setMode.bind(this)('seconds');
+ }
+ }.bind(this));
+
+ var mode = $.cookie('uhr-mode' + this.id);
+ if (mode === undefined || this.options.force) {
+ mode = this.options.mode;
+ }
+ modeSwitch.prop('checked', mode !== 'seconds');
+ if (mode === 'seconds') {
+ setMode.bind(this)('seconds');
+ } else {
+ setMode.bind(this)('normal');
+ }
+
+ // language chooser
+ var languageChooser = $('#uhr-languagechooser' + this.id);
+ languageChooser.on('change', function() {
+ var languageKey = $('#uhr-languagechooser' + this.id).val();
+ this.language(languageKey);
+ }.bind(this));
+ var selectedLanguage = $.cookie('uhr-language' + this.id);
+ if (selectedLanguage === undefined || this.options.force) {
+ selectedLanguage = this.options.language;
+ }
+ var found = uhrGlobals.languages.some(function(item) {
+ return selectedLanguage === item.code;
+ });
+ if (!found) {
+ var fallbackLanguage;
+ if (uhrGlobals.languages.length > 0) {
+ fallbackLanguage = uhrGlobals.languages[0].code;
+ } else {
+ fallbackLanguage = '';
+ }
+ console.warn("Language '" + selectedLanguage + "' not found! Using fallback '" + fallbackLanguage + "'");
+ selectedLanguage = fallbackLanguage;
+ }
+ languageChooser.val(selectedLanguage);
+ this.options.language = "";
+ this.language(selectedLanguage);
+
+ // theme chooser
+ var themeChooser = $('#uhr-themechooser' + this.id);
+ themeChooser.on('change', function() {
+ var themeKey = $('#uhr-themechooser' + this.id).val();
+ this.theme(themeKey);
+ }.bind(this));
+ var selectedTheme = $.cookie('uhr-theme' + this.id);
+ if (selectedTheme === undefined || this.options.force) {
+ selectedTheme = this.options.theme;
+ }
+ found = uhrGlobals.themes.some(function(item) {
+ return selectedTheme === item.styleClass;
+ });
+ if (!found) {
+ var fallbackTheme = uhrGlobals.themes[0].styleClass;
+ console.warn("Theme '" + selectedTheme + "' not found! Using fallback '" + fallbackTheme + "'");
+ selectedTheme = fallbackTheme;
+ }
+ themeChooser.val(selectedTheme);
+ this.options.theme = "";
+ this.theme(selectedTheme);
+ if (this.options.autoresize) {
+ $(window).on('resize', function() {
+ var $e = this.element;
+ var $parent = $e.parent();
+ var $window = $(window);
+ var parentWidth = $parent.width();
+ var parentHeight = $parent.height();
+ var windowWidth = $window.width();
+ var windowHeight = $window.height();
+ var size = Math.min(parentWidth, parentHeight, windowWidth, windowHeight) + 'px';
+ setWidth.bind(this)(size);
+ }.bind(this));
+ }
+ };
+ var destroy = function destroy() {
+ this.timer = null;
+ $(this.element)
+ .removeAttr('style')
+ .removeAttr('class')
+ .empty();
+ $('#uhr-configlink' + this.id).remove();
+ $('#uhr-controlpanel' + this.id).remove();
+
+ };
+ var setCookie = function setCookie(cookieName, cookieValue) {
+ var options = {};
+ if (this.options.cookiePath !== undefined) {
+ options = {expires: 365, path: this.options.cookiePath};
+ } else {
+ options = {expires: 365};
+ }
+ $.cookie(cookieName + this.id, cookieValue, options);
+ };
+
+ // business logic
+ var isOn = function isOn() {
+ return this.timer !== null;
+ };
+ var update = function update() {
+ if (isOn.bind(this)()) {
+ var time = this.options.time;
+ if (!language.bind(this)().hasOwnProperty('seconds') && this.options.mode !== 'seconds') {
+ if (time.getMinutes() === this.currentMinute) {
+ return;
+ }
+ this.currentMinute = time.getMinutes();
+ }
+ show.bind(this)(time);
+ } else {
+ clear.bind(this)();
+ this.currentMinute = -1;
+ }
+ };
+ var show = function show(time) {
+ var second = getSecond.bind(this)(time);
+ var dotMinute = getDotMinute.bind(this)(time);
+ var hour = getHour.bind(this)(time);
+ var coarseMinute = getCoarseMinute.bind(this)(time);
+ clear.bind(this)();
+ if (this.options.mode === 'seconds') {
+ highlight.bind(this)('second' + second);
+ } else {
+ highlight.bind(this)('on');
+ for (var i = 1; i <= dotMinute; i++) {
+ highlight.bind(this)('dot' + i);
+ }
+ highlight.bind(this)('minute' + coarseMinute);
+ highlight.bind(this)('hour' + hour);
+ }
+ };
+ var highlight = function highlight(itemClass) {
+ this.element.find('.item.' + itemClass).addClass('active');
+ };
+ var clear = function clear() {
+ this.element.find('.item').removeClass('active');
+ };
+ var getSecond = function getSecond(date) {
+ if (typeof language.bind(this)().getSeconds === 'function') {
+ return language.bind(this)().getSeconds(date);
+ }
+ return date.getSeconds();
+ };
+ var getDotMinute = function getDotMinute(date) {
+ if (typeof language.bind(this)().getDotMinute === 'function') {
+ return language.bind(this)().getDotMinute(date);
+ }
+ var minutes = date.getMinutes();
+ return minutes % 5;
+ };
+ var getCoarseMinute = function getCoarseMinute(date) {
+ if (typeof language.bind(this)().getCoarseMinute === 'function') {
+ return language.bind(this)().getCoarseMinute(date);
+ }
+ return date.getMinutes();
+ };
+ var getHour = function getHour(date) {
+ if (typeof language.bind(this)().getHour === 'function') {
+ return language.bind(this)().getHour(date);
+ }
+ var hour = date.getHours();
+ if (date.getMinutes() >= 25) {
+ return (hour + 1) % 24;
+ }
+ return hour;
+ };
+ var language = function language() {
+ var matchingLanguages = uhrGlobals.languages.filter(function(element) {
+ return (element.code === this.options.language);
+ }, this);
+ if (matchingLanguages.length > 0) {
+ return matchingLanguages[0];
+ }
+ // fallback: return empty object
+ return {};
+ };
+
+ $.widget("fritteli.uhr", {
+ "options": {
+ width: '100%',
+ status: 'on',
+ language: 'de_CH',
+ theme: uhrGlobals.themes[0].styleClass,
+ force: false,
+ controls: true,
+ cookiePath: undefined,
+ autoresize: true,
+ mode: 'normal'
+ },
+ "start": start,
+ "stop": stop,
+ "toggle": toggle,
+ "language": setLanguage,
+ "theme": setTheme,
+ "time": setTime,
+ "mode": setMode,
+ "width": setWidth,
+ // constructor method
+ "_create": create,
+ // destructor method
+ "_destroy": destroy
+ });
+ $.fritteli.uhr.register = uhrGlobals.registerLanguage;
+ /**
+ * Hilfsklasse zum Rendern der Uhr.
+ * @param layout Layout-Objekt, das gerendert werden soll.
+ * @param renderarea Das jQuery-gewrappte HTML-Element, auf dem gerendert werden soll.
+ */
+ function UhrRenderer(layout, renderarea) {
+ this.render = function render(beforeshow) {
+ if (layout.parsed === undefined) {
+ switch (layout.version) {
+ case 2:
+ var delegate = new UhrRendererV2Delegate(layout);
+ var parsedLayout = delegate.parse();
+ Object.defineProperty(layout, "parsed", {"value": parsedLayout, "writable": false, "configurable": false});
+ break;
+ default:
+ console.warn("Unknown layout version: '" + layout.version + "'");
+ return;
+ }
+ }
+ var letters = layout.parsed;
+ renderarea.fadeOut('fast', function() {
+ renderarea.empty();
+ letters.forEach(function(line, index, array) {
+ line.forEach(function(letter) {
+ renderarea.append(letter.toString());
+ });
+ if (index < array.length - 1) {
+ renderarea.append('
');
+ }
+ });
+ if (typeof beforeshow === 'function') {
+ beforeshow();
+ }
+ renderarea.fadeIn('fast');
+ });
};
}
@@ -248,7 +644,7 @@
8: [10],
9: [8, 9]
};
- var seconds = {
+ var seconds= {
"0": [vorne0, hinten0],
"1": [vorne0, hinten1],
"2": [vorne0, hinten2],
@@ -311,21 +707,10 @@
"59": [vorne5, hinten9]
};
- function parseObject(letters, styleClass, object) {
- if (typeof object !== 'undefined' && object !== null) {
- Object.keys(object).forEach(function (y) {
- var highlightLetters = object[y];
- highlightLetters.forEach(function (x) {
- letters[y - 1][x - 1].addStyle(styleClass);
- });
- });
- }
- }
-
function parseArrayOrObject(letters, styleClass, input) {
if (typeof input !== 'undefined' && input !== null) {
if (Array.isArray(input)) {
- input.forEach(function (item) {
+ input.forEach(function(item) {
parseObject(letters, styleClass, item);
});
} else {
@@ -334,12 +719,23 @@
}
}
+ function parseObject(letters, styleClass, object) {
+ if (typeof object !== 'undefined' && object !== null) {
+ Object.keys(object).forEach(function(y) {
+ var highlightLetters = object[y];
+ highlightLetters.forEach(function(x) {
+ letters[y - 1][x - 1].addStyle(styleClass);
+ });
+ });
+ }
+ }
+
function parseTimeDefinition(letters, styleClass, definition) {
if (typeof definition !== 'undefined' && definition !== null) {
- Object.keys(definition).forEach(function (listString) {
+ Object.keys(definition).forEach(function(listString) {
var array = listString.split(',');
var highlightLetters = definition[listString];
- array.forEach(function (item) {
+ array.forEach(function(item) {
parseArrayOrObject(letters, styleClass + item, highlightLetters);
});
});
@@ -348,7 +744,7 @@
this.parse = function parse() {
var letters = [];
- layout.letters.forEach(function (string) {
+ layout.letters.forEach(function(string) {
var line = [];
for (var c = 0; c < string.length; c++) {
var character = new Letter(string[c]);
@@ -369,468 +765,28 @@
}
/**
- * Hilfsklasse zum Rendern der Uhr.
- * @param layout Layout-Objekt, das gerendert werden soll.
- * @param renderarea Das jQuery-gewrappte HTML-Element, auf dem gerendert werden soll.
+ * Ein Buchstabe. Hilfsklasse für den Renderer und Inhalt der Layout-Arrays.
+ * @param value Der Buchstabe, der Dargestellt werden soll.
+ * @param style Die CSS-Styleklassen des Buchstabens.
*/
- function UhrRenderer(layout, renderarea) {
- this.render = function render(beforeshow) {
- if (layout.parsed === undefined) {
- switch (layout.version) {
- case 2:
- var delegate = new UhrRendererV2Delegate(layout);
- var parsedLayout = delegate.parse();
- Object.defineProperty(layout, "parsed", {
- "value": parsedLayout,
- "writable": false,
- "configurable": false
- });
- break;
- default:
- console.warn("Unknown layout version: '" + layout.version + "'");
- return;
- }
+ function Letter(value, style) {
+ var myValue = value;
+ var myStyle = style || '';
+ this.addStyle = function(style) {
+ if (myStyle === '') {
+ myStyle = style;
+ } else {
+ myStyle += ' ' + style;
}
- var letters = layout.parsed;
- renderarea.fadeOut('fast', function () {
- renderarea.empty();
- letters.forEach(function (line, index, array) {
- line.forEach(function (letter) {
- renderarea.append(letter.toString());
- });
- if (index < array.length - 1) {
- renderarea.append('
');
- }
- });
- if (typeof beforeshow === 'function') {
- beforeshow();
- }
- renderarea.fadeIn('fast');
- });
+ };
+ this.toString = function() {
+ return '
' + myValue + ' ';
};
}
-
- var setLanguage = function setLanguage(languageKey) {
- if (languageKey !== this.options.language) {
- this.options.language = languageKey;
- var renderer = new UhrRenderer(language.bind(this)(), this.element.find('.letterarea'));
- renderer.render.bind(this)(function () {
- this.currentMinute = -1;
- update.bind(this)();
- }.bind(this));
- setCookie.bind(this)('uhr-language', languageKey);
- update.bind(this)();
- }
- };
- var setTheme = function setTheme(theme) {
- if (theme !== this.options.theme) {
- this.element.removeClass(this.options.theme).addClass(theme);
- $('#uhr-onoffswitch' + this.id).removeClass(this.options.theme).addClass(theme);
- this.options.theme = theme;
- setCookie.bind(this)('uhr-theme', theme);
- }
- };
- var setTime = function setTime(time) {
- this.currentMinute = -1;
- if (time === null) {
- this.options.time = new Date();
- } else {
- if (this.timer !== null) {
- window.clearInterval(this.timer);
- }
- this.options.time = time;
- }
- update.bind(this)();
- };
- var setMode = function (mode) {
- this.options.mode = mode;
- this.currentMinute = -1;
- update.bind(this)();
- setCookie.bind(this)('uhr-mode', mode);
- };
- var setWidth = function setWidth(width) {
- var e = this.element;
- e.css('width', width);
- var realWidth = e.width();
- e.width(realWidth);
- e.height(realWidth);
- e.css('font-size', (realWidth / 40) + 'px');
- };
-
- // private interface methods
- var setupHTML;
- var wireFunctionality;
- var create = function create() {
- this.id = uhrGlobals.id++;
- this.timer = null;
- this.currentMinute = -1;
- var userTime = this.options.time;
- var hash, params;
- if (this.options.time === undefined) {
- this.options.time = new Date();
- }
- // parse the URL params
- hash = window.location.hash;
- if (hash !== undefined && typeof hash === 'string' && hash.charAt(0) === '#') {
- hash = hash.substring(1);
- hash = decodeURIComponent(hash);
- params = hash.split('&');
- params.forEach(function (element) {
- var pair = element.split('=');
- var key = pair[0];
- var value = pair[1];
- switch (key) {
- case 'l':
- case 'language':
- this.options.language = value;
- this.options.force = true;
- break;
- case 't':
- case 'theme':
- this.options.theme = value;
- this.options.force = true;
- break;
- case 'm':
- case 'mode':
- this.options.mode = value;
- this.options.force = true;
- break;
- case 's':
- case 'status':
- this.options.status = value;
- this.options.force = true;
- break;
- }
- }.bind(this));
- }
- // end parse the URL params
- setupHTML.bind(this)();
- wireFunctionality.bind(this)();
- if (userTime !== undefined) {
- this.time(userTime);
- }
- };
- // private helper methods (not exported)
- var toggleConfigScreen = function toggleConfigScreen() {
- $('#uhr-controlpanel' + this.id).toggle('fast');
- };
- // set up
- setupHTML = function setupHTML() {
- var e = this.element;
- // Base clock area
- e.addClass('uhr');
- e.empty();
- e.append('
');
- e.append('
');
- e.append('
');
- e.append('
');
- e.append('
');
- e.append('
');
- setWidth.bind(this)(this.options.width);
-
- if (this.options.controls) {
- var controlpanel = $('
');
- var content = $('
');
- controlpanel.append(content);
- // on/off switch
- var toggleSwitch = $('
');
- toggleSwitch.append('
');
- toggleSwitch.append('
' +
- '
' + '
' + ' ');
- content.append(toggleSwitch);
-
- // time mode switch
- var modeSwitch = $('
');
- modeSwitch.append('
');
- modeSwitch.append('
' +
- '
' + '
' +
- ' ');
- content.append(modeSwitch);
- // language chooser
- if (uhrGlobals.languages.length > 1) {
- var languageChooser = $('
');
- uhrGlobals.languages.forEach(function (item) {
- languageChooser.append('
' + item.language + ' ');
- });
- content.append(languageChooser);
- }
-
- // theme chooser
- if (uhrGlobals.themes.length > 1) {
- var themeChooser = $('
');
- uhrGlobals.themes.forEach(function (item) {
- themeChooser.append('
' + item.name + ' ');
- });
- content.append(themeChooser);
- }
- var closebutton = $('
');
- closebutton.on('click', function () {
- $('#uhr-controlpanel' + this.id).hide('fast');
- }.bind(this));
- content.append(closebutton);
- e.after(controlpanel);
- controlpanel.hide();
- var configlink = $('
');
- configlink.on('click', function () {
- toggleConfigScreen.bind(this)();
- }.bind(this));
- e.after(configlink);
- }
- };
- wireFunctionality = function wireFunctionality() {
- // on/off switch
- var toggleSwitch = $('#uhr-onoffswitch-checkbox' + this.id);
- toggleSwitch.on('click', function () {
- this.toggle();
- }.bind(this));
- var status = $.cookie('uhr-status' + this.id);
- if (status === undefined || this.options.force) {
- status = this.options.status;
- }
- toggleSwitch.prop('checked', status === 'on');
- if (status === 'on') {
- this.start();
- } else {
- this.stop();
- }
-
- // time mode switch
- var modeSwitch = $('#uhr-modeswitch-checkbox' + this.id);
- modeSwitch.on('click', function () {
- if (this.options.mode === 'seconds') {
- setMode.bind(this)('normal');
- } else {
- setMode.bind(this)('seconds');
- }
- }.bind(this));
-
- var mode = $.cookie('uhr-mode' + this.id);
- if (mode === undefined || this.options.force) {
- mode = this.options.mode;
- }
- modeSwitch.prop('checked', mode !== 'seconds');
- if (mode === 'seconds') {
- setMode.bind(this)('seconds');
- } else {
- setMode.bind(this)('normal');
- }
-
- // language chooser
- var languageChooser = $('#uhr-languagechooser' + this.id);
- languageChooser.on('change', function () {
- var languageKey = $('#uhr-languagechooser' + this.id).val();
- this.language(languageKey);
- }.bind(this));
- var selectedLanguage = $.cookie('uhr-language' + this.id);
- if (selectedLanguage === undefined || this.options.force) {
- selectedLanguage = this.options.language;
- }
- var found = uhrGlobals.languages.some(function (item) {
- return selectedLanguage === item.code;
- });
- if (!found) {
- var fallbackLanguage;
- if (uhrGlobals.languages.length > 0) {
- fallbackLanguage = uhrGlobals.languages[0].code;
- } else {
- fallbackLanguage = '';
- }
- console.warn("Language '" + selectedLanguage + "' not found! Using fallback '" + fallbackLanguage + "'");
- selectedLanguage = fallbackLanguage;
- }
- languageChooser.val(selectedLanguage);
- this.options.language = "";
- this.language(selectedLanguage);
-
- // theme chooser
- var themeChooser = $('#uhr-themechooser' + this.id);
- themeChooser.on('change', function () {
- var themeKey = $('#uhr-themechooser' + this.id).val();
- this.theme(themeKey);
- }.bind(this));
- var selectedTheme = $.cookie('uhr-theme' + this.id);
- if (selectedTheme === undefined || this.options.force) {
- selectedTheme = this.options.theme;
- }
- found = uhrGlobals.themes.some(function (item) {
- return selectedTheme === item.styleClass;
- });
- if (!found) {
- var fallbackTheme = uhrGlobals.themes[0].styleClass;
- console.warn("Theme '" + selectedTheme + "' not found! Using fallback '" + fallbackTheme + "'");
- selectedTheme = fallbackTheme;
- }
- themeChooser.val(selectedTheme);
- this.options.theme = "";
- this.theme(selectedTheme);
- if (this.options.autoresize) {
- $(window).on('resize', function () {
- var $e = this.element;
- var $parent = $e.parent();
- var $window = $(window);
- var parentWidth = $parent.width();
- var parentHeight = $parent.height();
- var windowWidth = $window.width();
- var windowHeight = $window.height();
- var size = Math.min(parentWidth, parentHeight, windowWidth, windowHeight) + 'px';
- setWidth.bind(this)(size);
- }.bind(this));
- }
- };
- var destroy = function destroy() {
- this.timer = null;
- $(this.element)
- .removeAttr('style')
- .removeAttr('class')
- .empty();
- $('#uhr-configlink' + this.id).remove();
- $('#uhr-controlpanel' + this.id).remove();
-
- };
- setCookie = function setCookie(cookieName, cookieValue) {
- var options = {};
- if (this.options.cookiePath !== undefined) {
- options = {expires: 365, path: this.options.cookiePath};
- } else {
- options = {expires: 365};
- }
- $.cookie(cookieName + this.id, cookieValue, options);
- };
-
- // business logic
- isOn = function isOn() {
- return this.timer !== null;
- };
- var show;
- var clear;
- update = function update() {
- if (isOn.bind(this)()) {
- var time = this.options.time;
- if (!language.bind(this)().hasOwnProperty('seconds') && this.options.mode !== 'seconds') {
- if (time.getMinutes() === this.currentMinute) {
- return;
- }
- this.currentMinute = time.getMinutes();
- }
- show.bind(this)(time);
- } else {
- clear.bind(this)();
- this.currentMinute = -1;
- }
- };
- var highlight;
- var getSecond;
- var getDotMinute;
- var getCoarseMinute;
- var getHour;
- show = function show(time) {
- var second = getSecond.bind(this)(time);
- var dotMinute = getDotMinute.bind(this)(time);
- var hour = getHour.bind(this)(time);
- var coarseMinute = getCoarseMinute.bind(this)(time);
- clear.bind(this)();
- if (this.options.mode === 'seconds') {
- highlight.bind(this)('second' + second);
- } else {
- highlight.bind(this)('on');
- for (var i = 1; i <= dotMinute; i++) {
- highlight.bind(this)('dot' + i);
- }
- highlight.bind(this)('minute' + coarseMinute);
- highlight.bind(this)('hour' + hour);
- }
- };
- highlight = function highlight(itemClass) {
- this.element.find('.item.' + itemClass).addClass('active');
- };
- clear = function clear() {
- this.element.find('.item').removeClass('active');
- };
- getSecond = function getSecond(date) {
- if (typeof language.bind(this)().getSeconds === 'function') {
- return language.bind(this)().getSeconds(date);
- }
- return date.getSeconds();
- };
- getDotMinute = function getDotMinute(date) {
- if (typeof language.bind(this)().getDotMinute === 'function') {
- return language.bind(this)().getDotMinute(date);
- }
- var minutes = date.getMinutes();
- return minutes % 5;
- };
- getCoarseMinute = function getCoarseMinute(date) {
- if (typeof language.bind(this)().getCoarseMinute === 'function') {
- return language.bind(this)().getCoarseMinute(date);
- }
- return date.getMinutes();
- };
- getHour = function getHour(date) {
- if (typeof language.bind(this)().getHour === 'function') {
- return language.bind(this)().getHour(date);
- }
- var hour = date.getHours();
- if (date.getMinutes() >= 25) {
- return (hour + 1) % 24;
- }
- return hour;
- };
- language = function language() {
- var matchingLanguages = uhrGlobals.languages.filter(function (element) {
- return (element.code === this.options.language);
- }, this);
- if (matchingLanguages.length > 0) {
- return matchingLanguages[0];
- }
- // fallback: return empty object
- return {};
- };
-
- $.widget("fritteli.uhr", {
- "options": {
- width: '100%',
- status: 'on',
- language: 'de_CH',
- theme: uhrGlobals.themes[0].styleClass,
- force: false,
- controls: true,
- cookiePath: undefined,
- autoresize: true,
- mode: 'normal'
- },
- "start": start,
- "stop": stop,
- "toggle": toggle,
- "language": setLanguage,
- "theme": setTheme,
- "time": setTime,
- "mode": setMode,
- "width": setWidth,
- // constructor method
- "_create": create,
- // destructor method
- "_destroy": destroy
- });
- $.fritteli.uhr.register = uhrGlobals.registerLanguage;
})(jQuery);
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see
.
- */
(function($) {
+ 'use strict';
// hilfsvariablen
var es_isch = {1: [1, 2, 4, 5, 6, 7]};
var ab = {4: [1, 2]};
@@ -911,4 +867,4 @@
};
// Das Layout bei der Uhr unter dem Code "de_CH" registrieren.
$.fritteli.uhr.register('de_CH', layout);
-}(jQuery));
+}(jQuery));
\ No newline at end of file
diff --git a/dist/jquery.uhr.base.min.js b/dist/jquery.uhr.base.min.js
index 0025b56..3d91901 100644
--- a/dist/jquery.uhr.base.min.js
+++ b/dist/jquery.uhr.base.min.js
@@ -1 +1,4 @@
-"use strict";var t,i,e,n,s,o,h,a;!function(t){var i,e,n,s={id:0,languages:[],themes:[],registerLanguage:function(t,i){s.languages.some((function(e){return t===e.code&&(console.error("Error: Language code '"+t+"' cannot be registered for language '"+i.language+"' because it is already registered for language '"+e.language+"'!"),!0)}))||(i.code=t,s.languages.push(i))}};t("link[rel=stylesheet]").each((function(i,e){var n=t(e),o=n.attr("data-class");if(void 0!==o){var h=n.attr("data-name");void 0===h&&(h=o),s.themes.push({styleClass:o,name:h})}})),0===s.themes.length&&s.themes.push({});var o;function h(t,i){var e=t,n=i||"";this.addStyle=function(t){""===n?n=t:n+=" "+t},this.toString=function(){return'
'+e+" "}}function a(t){var i={3:[2,3,4],4:[1,5],5:[1,4,5],6:[1,3,5],7:[1,2,5],8:[1,5],9:[2,3,4]},e={3:[8,9,10],4:[7,11],5:[7,10,11],6:[7,9,11],7:[7,8,11],8:[7,11],9:[8,9,10]},n={3:[3],4:[2,3],5:[3],6:[3],7:[3],8:[3],9:[2,3,4]},s={3:[9],4:[8,9],5:[9],6:[9],7:[9],8:[9],9:[8,9,10]},o={3:[2,3,4],4:[1,5],5:[5],6:[4],7:[3],8:[2],9:[1,2,3,4,5]},a={3:[8,9,10],4:[7,11],5:[11],6:[10],7:[9],8:[8],9:[7,8,9,10,11]},r={3:[1,2,3,4,5],4:[4],5:[3],6:[4],7:[5],8:[1,5],9:[2,3,4]},c={3:[7,8,9,10,11],4:[10],5:[9],6:[10],7:[11],8:[7,11],9:[8,9,10]},d={3:[4],4:[3,4],5:[2,4],6:[1,4],7:[1,2,3,4,5],8:[4],9:[4]},u={3:[10],4:[9,10],5:[8,10],6:[7,10],7:[7,8,9,10,11],8:[10],9:[10]},l={3:[1,2,3,4,5],4:[1],5:[1,2,3,4],6:[5],7:[5],8:[1,5],9:[2,3,4]},f={3:[7,8,9,10,11],4:[7],5:[7,8,9,10],6:[11],7:[11],8:[7,11],9:[8,9,10]},p={3:[9,10],4:[8],5:[7],6:[7,8,9,10],7:[7,11],8:[7,11],9:[8,9,10]},g={3:[7,8,9,10,11],4:[11],5:[10],6:[9],7:[8],8:[8],9:[8]},m={3:[8,9,10],4:[7,11],5:[7,11],6:[8,9,10],7:[7,11],8:[7,11],9:[8,9,10]},v={3:[8,9,10],4:[7,11],5:[7,11],6:[8,9,10,11],7:[11],8:[10],9:[8,9]},b={0:[i,e],1:[i,s],2:[i,a],3:[i,c],4:[i,u],5:[i,f],6:[i,p],7:[i,g],8:[i,m],9:[i,v],10:[n,e],11:[n,s],12:[n,a],13:[n,c],14:[n,u],15:[n,f],16:[n,p],17:[n,g],18:[n,m],19:[n,v],20:[o,e],21:[o,s],22:[o,a],23:[o,c],24:[o,u],25:[o,f],26:[o,p],27:[o,g],28:[o,m],29:[o,v],30:[r,e],31:[r,s],32:[r,a],33:[r,c],34:[r,u],35:[r,f],36:[r,p],37:[r,g],38:[r,m],39:[r,v],40:[d,e],41:[d,s],42:[d,a],43:[d,c],44:[d,u],45:[d,f],46:[d,p],47:[d,g],48:[d,m],49:[d,v],50:[l,e],51:[l,s],52:[l,a],53:[l,c],54:[l,u],55:[l,f],56:[l,p],57:[l,g],58:[l,m],59:[l,v]};function w(t,i,e){null!=e&&Object.keys(e).forEach((function(n){e[n].forEach((function(e){t[n-1][e-1].addStyle(i)}))}))}function k(t,i,e){null!=e&&(Array.isArray(e)?e.forEach((function(e){w(t,i,e)})):w(t,i,e))}function y(t,i,e){null!=e&&Object.keys(e).forEach((function(n){var s=n.split(","),o=e[n];s.forEach((function(e){k(t,i+e,o)}))}))}this.parse=function(){var i=[];return t.letters.forEach((function(t){for(var e=[],n=0;n
")})),"function"==typeof e&&e(),i.fadeIn("fast")}))}}var c,d,u=function(t){this.options.mode=t,this.currentMinute=-1,n.bind(this)(),i.bind(this)("uhr-mode",t)},l=function(t){var i=this.element;i.css("width",t);var e=i.width();i.width(e),i.height(e),i.css("font-size",e/40+"px")},f=function(){t("#uhr-controlpanel"+this.id).toggle("fast")};c=function(){var i=this.element;if(i.addClass("uhr"),i.empty(),i.append(' '),i.append(' '),i.append(' '),i.append(' '),i.append('
'),i.append('
'),l.bind(this)(this.options.width),this.options.controls){var e=t('
'),n=t('
');e.append(n);var o=t('
');o.append(' '),o.append('
'),n.append(o);var h=t('
');if(h.append(' '),h.append('
'),n.append(h),s.languages.length>1){var a=t(' ');s.languages.forEach((function(t){a.append(''+t.language+" ")})),n.append(a)}if(s.themes.length>1){var r=t(' ');s.themes.forEach((function(t){r.append(''+t.name+" ")})),n.append(r)}var c=t(' ');c.on("click",function(){t("#uhr-controlpanel"+this.id).hide("fast")}.bind(this)),n.append(c),i.after(e),e.hide();var d=t(' ');d.on("click",function(){f.bind(this)()}.bind(this)),i.after(d)}},d=function(){var i=t("#uhr-onoffswitch-checkbox"+this.id);i.on("click",function(){this.toggle()}.bind(this));var e=t.cookie("uhr-status"+this.id);(void 0===e||this.options.force)&&(e=this.options.status),i.prop("checked","on"===e),"on"===e?this.start():this.stop();var n=t("#uhr-modeswitch-checkbox"+this.id);n.on("click",function(){"seconds"===this.options.mode?u.bind(this)("normal"):u.bind(this)("seconds")}.bind(this));var o=t.cookie("uhr-mode"+this.id);(void 0===o||this.options.force)&&(o=this.options.mode),n.prop("checked","seconds"!==o),"seconds"===o?u.bind(this)("seconds"):u.bind(this)("normal");var h=t("#uhr-languagechooser"+this.id);h.on("change",function(){var i=t("#uhr-languagechooser"+this.id).val();this.language(i)}.bind(this));var a=t.cookie("uhr-language"+this.id);(void 0===a||this.options.force)&&(a=this.options.language);var r,c=s.languages.some((function(t){return a===t.code}));c||(r=s.languages.length>0?s.languages[0].code:"",console.warn("Language '"+a+"' not found! Using fallback '"+r+"'"),a=r);h.val(a),this.options.language="",this.language(a);var d=t("#uhr-themechooser"+this.id);d.on("change",function(){var i=t("#uhr-themechooser"+this.id).val();this.theme(i)}.bind(this));var f=t.cookie("uhr-theme"+this.id);if((void 0===f||this.options.force)&&(f=this.options.theme),!(c=s.themes.some((function(t){return f===t.styleClass})))){var p=s.themes[0].styleClass;console.warn("Theme '"+f+"' not found! Using fallback '"+p+"'"),f=p}d.val(f),this.options.theme="",this.theme(f),this.options.autoresize&&t(window).on("resize",function(){var i=this.element.parent(),e=t(window),n=i.width(),s=i.height(),o=e.width(),h=e.height(),a=Math.min(n,s,o,h)+"px";l.bind(this)(a)}.bind(this))};var p,g,m,v,b,w,k;i=function(i,e){var n={};n=void 0!==this.options.cookiePath?{expires:365,path:this.options.cookiePath}:{expires:365},t.cookie(i+this.id,e,n)},e=function(){return null!==this.timer},n=function(){if(e.bind(this)()){var t=this.options.time;if(!o.bind(this)().hasOwnProperty("seconds")&&"seconds"!==this.options.mode){if(t.getMinutes()===this.currentMinute)return;this.currentMinute=t.getMinutes()}p.bind(this)(t)}else g.bind(this)(),this.currentMinute=-1},p=function(t){var i=v.bind(this)(t),e=b.bind(this)(t),n=k.bind(this)(t),s=w.bind(this)(t);if(g.bind(this)(),"seconds"===this.options.mode)m.bind(this)("second"+i);else{m.bind(this)("on");for(var o=1;o<=e;o++)m.bind(this)("dot"+o);m.bind(this)("minute"+s),m.bind(this)("hour"+n)}},m=function(t){this.element.find(".item."+t).addClass("active")},g=function(){this.element.find(".item").removeClass("active")},v=function(t){return"function"==typeof o.bind(this)().getSeconds?o.bind(this)().getSeconds(t):t.getSeconds()},b=function(t){return"function"==typeof o.bind(this)().getDotMinute?o.bind(this)().getDotMinute(t):t.getMinutes()%5},w=function(t){return"function"==typeof o.bind(this)().getCoarseMinute?o.bind(this)().getCoarseMinute(t):t.getMinutes()},k=function(t){if("function"==typeof o.bind(this)().getHour)return o.bind(this)().getHour(t);var i=t.getHours();return t.getMinutes()>=25?(i+1)%24:i},o=function(){var t=s.languages.filter((function(t){return t.code===this.options.language}),this);return t.length>0?t[0]:{}},t.widget("fritteli.uhr",{options:{width:"100%",status:"on",language:"de_CH",theme:s.themes[0].styleClass,force:!1,controls:!0,cookiePath:void 0,autoresize:!0,mode:"normal"},start:function(){e.bind(this)()||(this.timer=window.setInterval(function(){this.options.time=new Date,n.bind(this)()}.bind(this),1e3),n.bind(this)(),i.bind(this)("uhr-status","on"))},stop:function(){e.bind(this)()&&(window.clearInterval(this.timer),this.timer=null,n.bind(this)(),i.bind(this)("uhr-status","off"))},toggle:function(){e.bind(this)()?this.stop():this.start()},language:function(t){t!==this.options.language&&(this.options.language=t,new r(o.bind(this)(),this.element.find(".letterarea")).render.bind(this)(function(){this.currentMinute=-1,n.bind(this)()}.bind(this)),i.bind(this)("uhr-language",t),n.bind(this)())},theme:function(e){e!==this.options.theme&&(this.element.removeClass(this.options.theme).addClass(e),t("#uhr-onoffswitch"+this.id).removeClass(this.options.theme).addClass(e),this.options.theme=e,i.bind(this)("uhr-theme",e))},time:function(t){this.currentMinute=-1,null===t?this.options.time=new Date:(null!==this.timer&&window.clearInterval(this.timer),this.options.time=t),n.bind(this)()},mode:u,width:l,_create:function(){this.id=s.id++,this.timer=null,this.currentMinute=-1;var t,i=this.options.time;void 0===this.options.time&&(this.options.time=new Date),void 0!==(t=window.location.hash)&&"string"==typeof t&&"#"===t.charAt(0)&&(t=t.substring(1),(t=decodeURIComponent(t)).split("&").forEach(function(t){var i=t.split("="),e=i[0],n=i[1];switch(e){case"l":case"language":this.options.language=n,this.options.force=!0;break;case"t":case"theme":this.options.theme=n,this.options.force=!0;break;case"m":case"mode":this.options.mode=n,this.options.force=!0;break;case"s":case"status":this.options.status=n,this.options.force=!0}}.bind(this))),c.bind(this)(),d.bind(this)(),void 0!==i&&this.time(i)},_destroy:function(){this.timer=null,t(this.element).removeAttr("style").removeAttr("class").empty(),t("#uhr-configlink"+this.id).remove(),t("#uhr-controlpanel"+this.id).remove()}}),t.fritteli.uhr.register=s.registerLanguage}(jQuery),a={version:2,language:"Bärndütsch",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGSIVOR","ABOHAUBIEGE","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:{1:[1,2,4,5,6,7]},minutes:{"5,6,7,8,9":[n={1:[9,10,11]},t={4:[1,2]}],"10,11,12,13,14":[s={2:[9,10,11]},t],"15,16,17,18,19":[o={2:[1,2,3,4,5,6]},t],"20,21,22,23,24":[h={3:[1,2,3,4,5,6]},t],"25,26,27,28,29":[n,i={3:[9,10,11]},e={4:[4,5,6,7,8]}],"30,31,32,33,34":e,"35,36,37,38,39":[n,t,e],"40,41,42,43,44":[h,i],"45,46,47,48,49":[o,i],"50,51,52,53,54":[s,i],"55,56,57,58,59":[n,i]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}},jQuery.fritteli.uhr.register("de_CH",a);
+/*! uhr - v8.0.4-dev.0 - 2016-06-27
+* http://bärneruhr.ch/
+* Copyright (c) 2016 Manuel Friedli; Licensed GPL-3.0 */
+!function(a){"use strict";function b(a,b){this.render=function(d){if(void 0===a.parsed)switch(a.version){case 2:var e=new c(a),f=e.parse();Object.defineProperty(a,"parsed",{value:f,writable:!1,configurable:!1});break;default:return void console.warn("Unknown layout version: '"+a.version+"'")}var g=a.parsed;b.fadeOut("fast",function(){b.empty(),g.forEach(function(a,c,d){a.forEach(function(a){b.append(a.toString())}),c ")}),"function"==typeof d&&d(),b.fadeIn("fast")})}}function c(a){function b(a,b,d){"undefined"!=typeof d&&null!==d&&(Array.isArray(d)?d.forEach(function(d){c(a,b,d)}):c(a,b,d))}function c(a,b,c){"undefined"!=typeof c&&null!==c&&Object.keys(c).forEach(function(d){var e=c[d];e.forEach(function(c){a[d-1][c-1].addStyle(b)})})}function e(a,c,d){"undefined"!=typeof d&&null!==d&&Object.keys(d).forEach(function(e){var f=e.split(","),g=d[e];f.forEach(function(d){b(a,c+d,g)})})}var f={3:[2,3,4],4:[1,5],5:[1,4,5],6:[1,3,5],7:[1,2,5],8:[1,5],9:[2,3,4]},g={3:[8,9,10],4:[7,11],5:[7,10,11],6:[7,9,11],7:[7,8,11],8:[7,11],9:[8,9,10]},h={3:[3],4:[2,3],5:[3],6:[3],7:[3],8:[3],9:[2,3,4]},i={3:[9],4:[8,9],5:[9],6:[9],7:[9],8:[9],9:[8,9,10]},j={3:[2,3,4],4:[1,5],5:[5],6:[4],7:[3],8:[2],9:[1,2,3,4,5]},k={3:[8,9,10],4:[7,11],5:[11],6:[10],7:[9],8:[8],9:[7,8,9,10,11]},l={3:[1,2,3,4,5],4:[4],5:[3],6:[4],7:[5],8:[1,5],9:[2,3,4]},m={3:[7,8,9,10,11],4:[10],5:[9],6:[10],7:[11],8:[7,11],9:[8,9,10]},n={3:[4],4:[3,4],5:[2,4],6:[1,4],7:[1,2,3,4,5],8:[4],9:[4]},o={3:[10],4:[9,10],5:[8,10],6:[7,10],7:[7,8,9,10,11],8:[10],9:[10]},p={3:[1,2,3,4,5],4:[1],5:[1,2,3,4],6:[5],7:[5],8:[1,5],9:[2,3,4]},q={3:[7,8,9,10,11],4:[7],5:[7,8,9,10],6:[11],7:[11],8:[7,11],9:[8,9,10]},r={3:[9,10],4:[8],5:[7],6:[7,8,9,10],7:[7,11],8:[7,11],9:[8,9,10]},s={3:[7,8,9,10,11],4:[11],5:[10],6:[9],7:[8],8:[8],9:[8]},t={3:[8,9,10],4:[7,11],5:[7,11],6:[8,9,10],7:[7,11],8:[7,11],9:[8,9,10]},u={3:[8,9,10],4:[7,11],5:[7,11],6:[8,9,10,11],7:[11],8:[10],9:[8,9]},v={0:[f,g],1:[f,i],2:[f,k],3:[f,m],4:[f,o],5:[f,q],6:[f,r],7:[f,s],8:[f,t],9:[f,u],10:[h,g],11:[h,i],12:[h,k],13:[h,m],14:[h,o],15:[h,q],16:[h,r],17:[h,s],18:[h,t],19:[h,u],20:[j,g],21:[j,i],22:[j,k],23:[j,m],24:[j,o],25:[j,q],26:[j,r],27:[j,s],28:[j,t],29:[j,u],30:[l,g],31:[l,i],32:[l,k],33:[l,m],34:[l,o],35:[l,q],36:[l,r],37:[l,s],38:[l,t],39:[l,u],40:[n,g],41:[n,i],42:[n,k],43:[n,m],44:[n,o],45:[n,q],46:[n,r],47:[n,s],48:[n,t],49:[n,u],50:[p,g],51:[p,i],52:[p,k],53:[p,m],54:[p,o],55:[p,q],56:[p,r],57:[p,s],58:[p,t],59:[p,u]};this.parse=function(){var c=[];return a.letters.forEach(function(a){for(var b=[],e=0;e'+c+""}}var e={id:0,languages:[],themes:[],registerLanguage:function(a,b){var c=e.languages.some(function(c){return a===c.code&&(console.error("Error: Language code '"+a+"' cannot be registered for language '"+b.language+"' because it is already registered for language '"+c.language+"'!"),!0)});c||(b.code=a,e.languages.push(b))}};a("link[rel=stylesheet]").each(function(b,c){var d=a(c),f=d.attr("data-class");if(void 0!==f){var g=d.attr("data-name");void 0===g&&(g=f),e.themes.push({styleClass:f,name:g})}}),0===e.themes.length&&e.themes.push({});var f=function(){t.bind(this)()||(this.timer=window.setInterval(function(){this.options.time=new Date,u.bind(this)()}.bind(this),1e3),u.bind(this)(),s.bind(this)("uhr-status","on"))},g=function(){t.bind(this)()&&(window.clearInterval(this.timer),this.timer=null,u.bind(this)(),s.bind(this)("uhr-status","off"))},h=function(){t.bind(this)()?this.stop():this.start()},i=function(a){if(a!==this.options.language){this.options.language=a;var c=new b(C.bind(this)(),this.element.find(".letterarea"));c.render.bind(this)(function(){this.currentMinute=-1,u.bind(this)()}.bind(this)),s.bind(this)("uhr-language",a),u.bind(this)()}},j=function(b){b!==this.options.theme&&(this.element.removeClass(this.options.theme).addClass(b),a("#uhr-onoffswitch"+this.id).removeClass(this.options.theme).addClass(b),this.options.theme=b,s.bind(this)("uhr-theme",b))},k=function(a){this.currentMinute=-1,null===a?this.options.time=new Date:(null!==this.timer&&window.clearInterval(this.timer),this.options.time=a),u.bind(this)()},l=function(a){this.options.mode=a,this.currentMinute=-1,u.bind(this)(),s.bind(this)("uhr-mode",a)},m=function(a){var b=this.element;b.css("width",a);var c=b.width();b.width(c),b.height(c),b.css("font-size",c/40+"px")},n=function(){this.id=e.id++,this.timer=null,this.currentMinute=-1;var a,b,c=this.options.time;void 0===this.options.time&&(this.options.time=new Date),a=window.location.hash,void 0!==a&&"string"==typeof a&&"#"===a.charAt(0)&&(a=a.substring(1),a=decodeURIComponent(a),b=a.split("&"),b.forEach(function(a){var b=a.split("="),c=b[0],d=b[1];switch(c){case"l":case"language":this.options.language=d,this.options.force=!0;break;case"t":case"theme":this.options.theme=d,this.options.force=!0;break;case"m":case"mode":this.options.mode=d,this.options.force=!0;break;case"s":case"status":this.options.status=d,this.options.force=!0}}.bind(this))),p.bind(this)(),q.bind(this)(),void 0!==c&&this.time(c)},o=function(){a("#uhr-controlpanel"+this.id).toggle("fast")},p=function(){var b=this.element;if(b.addClass("uhr"),b.empty(),b.append(' '),b.append(' '),b.append(' '),b.append(' '),b.append('
'),b.append('
'),m.bind(this)(this.options.width),this.options.controls){var c=a('
'),d=a('
');c.append(d);var f=a('
');f.append(' '),f.append('
'),d.append(f);var g=a('
');if(g.append(' '),g.append('
'),d.append(g),e.languages.length>1){var h=a(' ');e.languages.forEach(function(a){h.append(''+a.language+" ")}),d.append(h)}if(e.themes.length>1){var i=a(' ');e.themes.forEach(function(a){i.append(''+a.name+" ")}),d.append(i)}var j=a(' ');j.on("click",function(){a("#uhr-controlpanel"+this.id).hide("fast")}.bind(this)),d.append(j),b.after(c),c.hide();var k=a(' ');k.on("click",function(){o.bind(this)()}.bind(this)),b.after(k)}},q=function(){var b=a("#uhr-onoffswitch-checkbox"+this.id);b.on("click",function(){this.toggle()}.bind(this));var c=a.cookie("uhr-status"+this.id);(void 0===c||this.options.force)&&(c=this.options.status),b.prop("checked","on"===c),"on"===c?this.start():this.stop();var d=a("#uhr-modeswitch-checkbox"+this.id);d.on("click",function(){"seconds"===this.options.mode?l.bind(this)("normal"):l.bind(this)("seconds")}.bind(this));var f=a.cookie("uhr-mode"+this.id);(void 0===f||this.options.force)&&(f=this.options.mode),d.prop("checked","seconds"!==f),"seconds"===f?l.bind(this)("seconds"):l.bind(this)("normal");var g=a("#uhr-languagechooser"+this.id);g.on("change",function(){var b=a("#uhr-languagechooser"+this.id).val();this.language(b)}.bind(this));var h=a.cookie("uhr-language"+this.id);(void 0===h||this.options.force)&&(h=this.options.language);var i=e.languages.some(function(a){return h===a.code});if(!i){var j;j=e.languages.length>0?e.languages[0].code:"",console.warn("Language '"+h+"' not found! Using fallback '"+j+"'"),h=j}g.val(h),this.options.language="",this.language(h);var k=a("#uhr-themechooser"+this.id);k.on("change",function(){var b=a("#uhr-themechooser"+this.id).val();this.theme(b)}.bind(this));var n=a.cookie("uhr-theme"+this.id);if((void 0===n||this.options.force)&&(n=this.options.theme),i=e.themes.some(function(a){return n===a.styleClass}),!i){var o=e.themes[0].styleClass;console.warn("Theme '"+n+"' not found! Using fallback '"+o+"'"),n=o}k.val(n),this.options.theme="",this.theme(n),this.options.autoresize&&a(window).on("resize",function(){var b=this.element,c=b.parent(),d=a(window),e=c.width(),f=c.height(),g=d.width(),h=d.height(),i=Math.min(e,f,g,h)+"px";m.bind(this)(i)}.bind(this))},r=function(){this.timer=null,a(this.element).removeAttr("style").removeAttr("class").empty(),a("#uhr-configlink"+this.id).remove(),a("#uhr-controlpanel"+this.id).remove()},s=function(b,c){var d={};d=void 0!==this.options.cookiePath?{expires:365,path:this.options.cookiePath}:{expires:365},a.cookie(b+this.id,c,d)},t=function(){return null!==this.timer},u=function(){if(t.bind(this)()){var a=this.options.time;if(!C.bind(this)().hasOwnProperty("seconds")&&"seconds"!==this.options.mode){if(a.getMinutes()===this.currentMinute)return;this.currentMinute=a.getMinutes()}v.bind(this)(a)}else x.bind(this)(),this.currentMinute=-1},v=function(a){var b=y.bind(this)(a),c=z.bind(this)(a),d=B.bind(this)(a),e=A.bind(this)(a);if(x.bind(this)(),"seconds"===this.options.mode)w.bind(this)("second"+b);else{w.bind(this)("on");for(var f=1;f<=c;f++)w.bind(this)("dot"+f);w.bind(this)("minute"+e),w.bind(this)("hour"+d)}},w=function(a){this.element.find(".item."+a).addClass("active")},x=function(){this.element.find(".item").removeClass("active")},y=function(a){return"function"==typeof C.bind(this)().getSeconds?C.bind(this)().getSeconds(a):a.getSeconds()},z=function(a){if("function"==typeof C.bind(this)().getDotMinute)return C.bind(this)().getDotMinute(a);var b=a.getMinutes();return b%5},A=function(a){return"function"==typeof C.bind(this)().getCoarseMinute?C.bind(this)().getCoarseMinute(a):a.getMinutes()},B=function(a){if("function"==typeof C.bind(this)().getHour)return C.bind(this)().getHour(a);var b=a.getHours();return a.getMinutes()>=25?(b+1)%24:b},C=function(){var a=e.languages.filter(function(a){return a.code===this.options.language},this);return a.length>0?a[0]:{}};a.widget("fritteli.uhr",{options:{width:"100%",status:"on",language:"de_CH",theme:e.themes[0].styleClass,force:!1,controls:!0,cookiePath:void 0,autoresize:!0,mode:"normal"},start:f,stop:g,toggle:h,language:i,theme:j,time:k,mode:l,width:m,_create:n,_destroy:r}),a.fritteli.uhr.register=e.registerLanguage}(jQuery),function(a){"use strict";var b={1:[1,2,4,5,6,7]},c={4:[1,2]},d={3:[9,10,11]},e={4:[4,5,6,7,8]},f={1:[9,10,11]},g={2:[9,10,11]},h={2:[1,2,3,4,5,6]},i={3:[1,2,3,4,5,6]},j={version:2,language:"Bärndütsch",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGSIVOR","ABOHAUBIEGE","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:b,minutes:{"5,6,7,8,9":[f,c],"10,11,12,13,14":[g,c],"15,16,17,18,19":[h,c],"20,21,22,23,24":[i,c],"25,26,27,28,29":[f,d,e],"30,31,32,33,34":e,"35,36,37,38,39":[f,c,e],"40,41,42,43,44":[i,d],"45,46,47,48,49":[h,d],"50,51,52,53,54":[g,d],"55,56,57,58,59":[f,d]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}};a.fritteli.uhr.register("de_CH",j)}(jQuery);
\ No newline at end of file
diff --git a/dist/jquery.uhr.baselangs.js b/dist/jquery.uhr.baselangs.js
index 10d70de..a8ab4c2 100644
--- a/dist/jquery.uhr.baselangs.js
+++ b/dist/jquery.uhr.baselangs.js
@@ -1,20 +1,8 @@
-'use strict';
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
+/*! uhr - v8.0.4-dev.0 - 2016-06-27
+* http://bärneruhr.ch/
+* Copyright (c) 2016 Manuel Friedli; Licensed GPL-3.0 */
(function($) {
+ 'use strict';
var es_ist = {1: [1, 2, 4, 5, 6]};
var uhr = {10: [9, 10, 11]};
var nach = {4: [8, 9, 10, 11]};
@@ -73,22 +61,91 @@
};
$.fritteli.uhr.register('de', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
+// hilfsvariablen
+ var es_isch = {1: [1, 2, 4, 5, 6, 7]};
+ var ab = {4: [1, 2]};
+ var vor = {3: [9, 10, 11]};
+ var haubi = {4: [4, 5, 6, 7, 8]};
+ var fuef = {1: [9, 10, 11]};
+ var zae = {2: [9, 10, 11]};
+ var viertu = {2: [1, 2, 3, 4, 5, 6]};
+ var zwaenzg = {3: [1, 2, 3, 4, 5, 6]};
+ var layout = {
+ // version: zur Zeit immer 2 (Pflichtattribut)
+ "version": 2,
+ // Sprechender Name der Sprache
+ "language": 'Bärndütsch',
+ // Buchstabenfeld als Array von Strings.
+ "letters": [
+ 'ESKISCHAFÜF',
+ 'VIERTUBFZÄÄ',
+ 'ZWÄNZGSIVOR',
+ 'ABOHAUBIEGE',
+ 'EISZWÖISDRÜ',
+ 'VIERIFÜFIQT',
+ 'SÄCHSISIBNI',
+ 'ACHTINÜNIEL',
+ 'ZÄNIERBEUFI',
+ 'ZWÖUFINAUHR'
+ ],
+ // Permanent aktive Buchstaben. , vgl. ausführliche Beschreibung bei "minutes".
+ "permanent": es_isch,
+ /*
+ * Minuten: Objekt im folgenden Format:
+ * {
+ * : ,
+ * ...
+ * }
+ * : String von Komma-separierten Minutenwerten, zu welchem die in angegebenen Buchstaben aktiv sein sollen
+ * : [ , ...] |
+ * : { : [ , ... ] }
+ * : Die Zeile, in welcher die Buchstaben liegen; von oben gezählt, oben ist 1.
+ * : Die Spalte, in der ein einzelner Buchstabe liegt; von links gezählt, links ist 1.
+ * Beispiel:
+ * "minutes": {
+ * "0,1": {1: [6, 7, 9]},
+ * "5": [ {3: [1, 2]}, {4: [10, 11]} ]
+ * }
+ * Erklärung:
+ * Bei Minuten 0 und 1 sind die Buchstaben 6, 7 und 9 der ersten Zeile aktiv.
+ * Bei Minute 5 sind die Buchstaben 1 und 2 der Zeile 3 sowie die Buchstaben 10 und 11 der Zeile 4 aktiv.
+ */
+ "minutes": {
+ "5,6,7,8,9": [fuef, ab],
+ "10,11,12,13,14": [zae, ab],
+ "15,16,17,18,19": [viertu, ab],
+ "20,21,22,23,24": [zwaenzg, ab],
+ "25,26,27,28,29": [fuef, vor, haubi],
+ "30,31,32,33,34": haubi,
+ "35,36,37,38,39": [fuef, ab, haubi],
+ "40,41,42,43,44": [zwaenzg, vor],
+ "45,46,47,48,49": [viertu, vor],
+ "50,51,52,53,54": [zae, vor],
+ "55,56,57,58,59": [fuef, vor]
+ },
+ // Die Stunden; gleiches Format wie bei den Minuten
+ "hours": {
+ "0,12": {10: [1, 2, 3, 4, 5, 6]},
+ "1,13": {5: [1, 2, 3]},
+ "2,14": {5: [4, 5, 6, 7]},
+ "3,15": {5: [9, 10, 11]},
+ "4,16": {6: [1, 2, 3, 4, 5]},
+ "5,17": {6: [6, 7, 8, 9]},
+ "6,18": {7: [1, 2, 3, 4, 5, 6]},
+ "7,19": {7: [7, 8, 9, 10, 11]},
+ "8,20": {8: [1, 2, 3, 4, 5]},
+ "9,21": {8: [6, 7, 8, 9]},
+ "10,22": {9: [1, 2, 3, 4]},
+ "11,23": {9: [8, 9, 10, 11]}
+ }
+ };
+// Das Layout bei der Uhr unter dem Code "de_CH" registrieren.
+ $.fritteli.uhr.register('de_CH', layout);
+}(jQuery));
+(function($) {
+ 'use strict';
var es_isch = {1: [1, 2, 4, 5, 6, 7]};
var genau = {3: [7, 8, 9, 10, 11]};
var ab = {4: [4, 5]};
@@ -145,7 +202,6 @@
};
$.fritteli.uhr.register('de_CH_genau', layout);
}(jQuery));
-
/*
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -161,6 +217,7 @@
along with this program. If not, see .
*/
(function($) {
+ 'use strict';
var klokken_er = {1: [1, 2, 3, 4, 5, 6, 7, 9, 10]};
var minutter = {4: [4, 5, 6, 7, 8, 9, 10, 11]};
@@ -225,22 +282,8 @@
};
$.fritteli.uhr.register('dk', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var it_is = {1: [1, 2, 4, 5]};
var half = {4: [1, 2, 3, 4]};
var to = {4: [10, 11]};
@@ -306,22 +349,8 @@
};
$.fritteli.uhr.register('en', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var es_la = {1: [1, 2, 6, 7]};
var son_las = {1: [2, 3, 4, 6, 7, 8]};
var y = {7: [6]};
@@ -387,21 +416,8 @@
$.fritteli.uhr.register('es', layout);
}(jQuery));
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var il_est = {1: [1, 2, 4, 5, 6]};
var et = {8: [1, 2]};
var moins = {7: [1, 2, 3, 4, 5]};
@@ -501,22 +517,8 @@
};
$.fritteli.uhr.register('fr', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var sono_le = {1: [1, 2, 3, 4, 6, 7]};
var e_l = {2: [1, 3, 4]};
var e = {8: [1]};
@@ -581,22 +583,8 @@
};
$.fritteli.uhr.register('it', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var het_is = {1: [1, 2, 3, 5, 6]};
var over1 = {3: [1, 2, 3, 4]};
var voor1 = {2: [8, 9, 10, 11]};
@@ -662,22 +650,8 @@
};
$.fritteli.uhr.register('nl', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function ($) {
+ 'use strict';
var e_ = {1: [1]};
var sao = {1: [2, 3, 4]};
var e1 = {7: [8]};
diff --git a/dist/jquery.uhr.baselangs.min.js b/dist/jquery.uhr.baselangs.min.js
index 448074e..cad339c 100644
--- a/dist/jquery.uhr.baselangs.min.js
+++ b/dist/jquery.uhr.baselangs.min.js
@@ -1 +1,4 @@
-"use strict";var e,E,r,t,n,u,I;I={version:2,language:"Deutsch",letters:["ESKISTAFÜNF","ZEHNZWANZIG","DREIVIERTEL","VORFUNKNACH","HALBAELFÜNF","EINSXAMZWEI","DREIPMJVIER","SECHSNLACHT","SIEBENZWÖLF","ZEHNEUNKUHR"],permanent:{1:[1,2,4,5,6]},minutes:{"0,1,2,3,4":{10:[9,10,11]},"5,6,7,8,9":[t={1:[8,9,10,11]},e={4:[8,9,10,11]}],"10,11,12,13,14":[n={2:[1,2,3,4]},e],"15,16,17,18,19":[{3:[5,6,7,8,9,10,11]},e],"20,21,22,23,24":[u={2:[5,6,7,8,9,10,11]},e],"25,26,27,28,29":[t,E={4:[1,2,3]},r={5:[1,2,3,4]}],"30,31,32,33,34":r,"35,36,37,38,39":[t,e,r],"40,41,42,43,44":[u,E],"45,46,47,48,49":{3:[1,2,3,4,5,6,7,8,9,10,11]},"50,51,52,53,54":[n,E],"55,56,57,58,59":[t,E]},hours:{"0,12":{9:[7,8,9,10,11]},"1,13":{6:[1,2,3,4]},"2,14":{6:[8,9,10,11]},"3,15":{7:[1,2,3,4]},"4,16":{7:[8,9,10,11]},"5,17":{5:[8,9,10,11]},"6,18":{8:[1,2,3,4,5]},"7,19":{9:[1,2,3,4,5,6]},"8,20":{8:[8,9,10,11]},"9,21":{10:[4,5,6,7]},"10,22":{10:[1,2,3,4]},"11,23":{5:[6,7,8]}}},jQuery.fritteli.uhr.register("de",I),function(e){var E={4:[4,5]},r={4:[1,2,3]},t={4:[7,8,9,10,11]},n={1:[9,10,11]},u={2:[9,10,11]},I={2:[1,2,3,4,5,6]},i={3:[1,2,3,4,5,6]},N={version:2,language:"Bärndütsch (genau)",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGGENAU","VORABOHAUBI","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:{1:[1,2,4,5,6,7]},minutes:{0:{3:[7,8,9,10,11]},"5,6,7,8,9":[n,E],"10,11,12,13,14":[u,E],"15,16,17,18,19":[I,E],"20,21,22,23,24":[i,E],"25,26,27,28,29":[n,r,t],"30,31,32,33,34":t,"35,36,37,38,39":[n,E,t],"40,41,42,43,44":[i,r],"45,46,47,48,49":[I,r],"50,51,52,53,54":[u,r],"55,56,57,58,59":[n,r]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}};jQuery.fritteli.uhr.register("de_CH_genau",N)}(),function(e){var E={4:[4,5,6,7,8,9,10,11]},r={5:[8]},t={5:[4,5,6,7]},n={2:[1,2,3]},u={4:[1,2]},I={3:[4,5,6,7,8]},i={2:[4,5,6,7]},N={6:[8,9,10,11]},T={version:2,language:"Dansk",letters:["KLOKKENVERO","FEMTYVESKLA","OJEKVARTVAT","TIAMINUTTER","VEMOVERILMF","MONALISHALV","ETTOTREFIRE","FEMSEKSRSYV","OTTERNIMETI","ELLEVEATOLV"],permanent:{1:[1,2,3,4,5,6,7,9,10]},minutes:{"5,6,7,8,9":[n,E,t],"10,11,12,13,14":[u,E,t],"15,16,17,18,19":[I,t],"20,21,22,23,24":[i,E,t],"25,26,27,28,29":[n,E,r,N],"30,31,32,33,34":[N],"35,36,37,38,39":[n,E,t,N],"40,41,42,43,44":[i,E,r],"45,46,47,48,49":[I,r],"50,51,52,53,54":[u,E,r],"55,56,57,58,59":[n,E,r]},hours:{"0,12":{10:[8,9,10,11]},"1,13":{7:[1,2]},"2,14":{7:[3,4]},"3,15":{7:[5,6,7]},"4,16":{7:[8,9,10,11]},"5,17":{8:[1,2,3]},"6,18":{8:[4,5,6,7]},"7,19":{8:[9,10,11]},"8,20":{9:[1,2,3,4]},"9,21":{9:[6,7]},"10,22":{9:[10,11]},"11,23":{10:[1,2,3,4,5,6]}},getHour:function(e){var E=e.getHours();return e.getMinutes()>=25?(E+1)%24:E}};jQuery.fritteli.uhr.register("dk",T)}(),function(e){var E={4:[10,11]},r={5:[1,2,3,4]},t={3:[7,8,9,10]},n={4:[6,7,8]},u={2:[1,3,4,5,6,7,8,9]},I={3:[1,2,3,4,5,6]},i={3:[1,2,3,4,5,6,7,8,9,10]},N={version:2,language:"English",letters:["ITLISBFAMPM","ACQUARTERDC","TWENTYFIVEX","HALFBTENFTO","PASTERUNINE","ONESIXTHREE","FOURFIVETWO","EIGHTELEVEN","SEVENTWELVE","TENSO'CLOCK"],permanent:{1:[1,2,4,5]},minutes:{"0,1,2,3,4":{10:[5,6,7,8,9,10,11]},"5,6,7,8,9":[t,r],"10,11,12,13,14":[n,r],"15,16,17,18,19":[u,r],"20,21,22,23,24":[I,r],"25,26,27,28,29":[i,r],"30,31,32,33,34":[{4:[1,2,3,4]},r],"35,36,37,38,39":[i,E],"40,41,42,43,44":[I,E],"45,46,47,48,49":[u,E],"50,51,52,53,54":[n,E],"55,56,57,58,59":[t,E]},hours:{"0,12":{9:[6,7,8,9,10,11]},"1,13":{6:[1,2,3]},"2,14":{7:[9,10,11]},"3,15":{6:[7,8,9,10,11]},"4,16":{7:[1,2,3,4]},"5,17":{7:[5,6,7,8]},"6,18":{6:[4,5,6]},"7,19":{9:[1,2,3,4,5]},"8,20":{8:[1,2,3,4,5]},"9,21":{5:[8,9,10,11]},"10,22":{10:[1,2,3]},"11,23":{8:[6,7,8,9,10,11]}},getHour:function(e){var E=e.getHours();return e.getMinutes()>=35?(E+1)%24:E}};jQuery.fritteli.uhr.register("en",N)}(),function(e){var E={1:[2,3,4,6,7,8]},r={7:[6]},t={7:[7,8,9,10,11]},n={9:[7,8,9,10,11]},u={8:[8,9,10,11]},I={10:[6,7,8,9,10,11]},i={8:[2,3,4,5,6,7]},N={9:[1,2,3,4,5,6,7,8,9,10,11]},T={version:2,language:"Español",letters:["ESONELASUNA","DOSITRESORE","CUATROCINCO","SEISASIETEN","OCHONUEVEYO","LADIEZSONCE","DOCELYMENOS","OVEINTEDIEZ","VEINTICINCO","MEDIACUARTO"],permanent:[],minutes:{"5,6,7,8,9":[r,n],"10,11,12,13,14":[r,u],"15,16,17,18,19":[r,I],"20,21,22,23,24":[r,i],"25,26,27,28,29":[r,N],"30,31,32,33,34":[r,{10:[1,2,3,4,5]}],"35,36,37,38,39":[t,N],"40,41,42,43,44":[t,i],"45,46,47,48,49":[t,I],"50,51,52,53,54":[t,u],"55,56,57,58,59":[t,n]},hours:{"0,12":[E,{7:[1,2,3,4]}],"1,13":[{1:[1,2,6,7]},{1:[9,10,11]}],"2,14":[E,{2:[1,2,3]}],"3,15":[E,{2:[5,6,7,8]}],"4,16":[E,{3:[1,2,3,4,5,6]}],"5,17":[E,{3:[7,8,9,10,11]}],"6,18":[E,{4:[1,2,3,4]}],"7,19":[E,{4:[6,7,8,9,10]}],"8,20":[E,{5:[1,2,3,4]}],"9,21":[E,{5:[5,6,7,8,9]}],"10,22":[E,{6:[3,4,5,6]}],"11,23":[E,{6:[8,9,10,11]}]},getHour:function(e){var E=e.getHours();return e.getMinutes()>=35?(E+1)%24:E}};jQuery.fritteli.uhr.register("es",T)}(),function(e){var E={8:[1,2]},r={7:[1,2,3,4,5]},t={6:[6,7,8,9,10,11]},n={9:[7,8,9,10]},u={7:[9,10,11]},I={8:[4,5,6,7,8]},i={9:[1,2,3,4,5]},N={9:[1,2,3,4,5,6,7,8,9,10]},T={version:2,language:"Français",letters:["ILNESTODEUX","QUATRETROIS","NEUFUNESEPT","HUITSIXCINQ","MIDIXMINUIT","ONZERHEURES","MOINSOLEDIX","ETRQUARTPMD","VINGT-CINQU","ETSDEMIEPAM"],permanent:{1:[1,2,4,5,6]},minutes:{"5,6,7,8,9":n,"10,11,12,13,14":u,"15,16,17,18,19":[E,I],"20,21,22,23,24":i,"25,26,27,28,29":N,"30,31,32,33,34":[E,{10:[4,5,6,7,8]}],"35,36,37,38,39":[r,N],"40,41,42,43,44":[r,i],"45,46,47,48,49":[r,{7:[7,8]},I],"50,51,52,53,54":[r,u],"55,56,57,58,59":[r,n]},hours:{0:{5:[6,7,8,9,10,11]},"1,13":[{3:[5,6,7]},t],"2,14":[{1:[8,9,10,11]},t],"3,15":[{2:[7,8,9,10,11]},t],"4,16":[{2:[1,2,3,4,5,6]},t],"5,17":[{4:[8,9,10,11]},t],"6,18":[{4:[5,6,7]},t],"7,19":[{3:[8,9,10,11]},t],"8,20":[{4:[1,2,3,4]},t],"9,21":[{3:[1,2,3,4]},t],"10,22":[{5:[3,4,5]},t],"11,23":[{6:[1,2,3,4]},t],12:{5:[1,2,3,4]}},getHour:function(e){var E=e.getHours();return e.getMinutes()>=35?(E+1)%24:E}};jQuery.fritteli.uhr.register("fr",T)}(),function(e){var E={1:[1,2,3,4,6,7]},r={8:[1]},t={7:[8,9,10,11]},n={9:[6,7,8,9,10,11]},u={10:[1,2,3,4,5]},I={8:[3,4,6,7,8,9,10,11]},i={9:[1,2,3,4,5]},N={9:[1,2,3,4,5,6,7,8,9,10,11]},T={version:2,language:"Italiano",letters:["SONORLEBORE","ÈRL'UNASDUE","TREOTTONOVE","DIECIUNDICI","DODICISETTE","QUATTROCSEI","CINQUEAMENO","ECUNOQUARTO","VENTICINQUE","DIECIPMEZZA"],permanent:[],minutes:{"5,6,7,8,9":[r,n],"10,11,12,13,14":[r,u],"15,16,17,18,19":[r,I],"20,21,22,23,24":[r,i],"25,26,27,28,29":[r,N],"30,31,32,33,34":[r,{10:[7,8,9,10,11]}],"35,36,37,38,39":[t,N],"40,41,42,43,44":[t,i],"45,46,47,48,49":[t,I],"50,51,52,53,54":[t,u],"55,56,57,58,59":[t,n]},hours:{"0,12":[E,{5:[1,2,3,4,5,6]}],"1,13":[{2:[1,3,4]},{2:[5,6,7]}],"2,14":[E,{2:[9,10,11]}],"3,15":[E,{3:[1,2,3]}],"4,16":[E,{6:[1,2,3,4,5,6,7]}],"5,17":[E,{7:[1,2,3,4,5,6]}],"6,18":[E,{6:[9,10,11]}],"7,19":[E,{5:[7,8,9,10,11]}],"8,20":[E,{3:[4,5,6,7]}],"9,21":[E,{3:[8,9,10,11]}],"10,22":[E,{4:[1,2,3,4,5]}],"11,23":[E,{4:[6,7,8,9,10,11]}]},getHour:function(e){var E=e.getHours();return e.getMinutes()>=35?(E+1)%24:E}};jQuery.fritteli.uhr.register("it",T)}(),function(e){var E={3:[1,2,3,4]},r={2:[8,9,10,11]},t={4:[1,2,3,4]},n={1:[8,9,10,11]},u={2:[1,2,3,4]},I={3:[7,8,9,10,11]},i={version:2,language:"Nederlands",letters:["HETKISAVIJF","TIENBTZVOOR","OVERMEKWART","HALFSPWOVER","VOORTHGEENS","TWEEPVCDRIE","VIERVIJFZES","ZEVENONEGEN","ACHTTIENELF","TWAALFBFUUR"],permanent:{1:[1,2,3,5,6]},minutes:{"0,1,2,3,4":{10:[9,10,11]},"5,6,7,8,9":[n,E],"10,11,12,13,14":[u,E],"15,16,17,18,19":[I,{4:[8,9,10,11]}],"20,21,22,23,24":[u,r,t],"25,26,27,28,29":[n,r,t],"30,31,32,33,34":t,"35,36,37,38,39":[n,E,t],"40,41,42,43,44":[u,E,t],"45,46,47,48,49":[I,{5:[1,2,3,4]}],"50,51,52,53,54":[u,r],"55,56,57,58,59":[n,r]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[8,9,10]},"2,14":{6:[1,2,3,4]},"3,15":{6:[8,9,10,11]},"4,16":{7:[1,2,3,4]},"5,17":{7:[5,6,7,8]},"6,18":{7:[9,10,11]},"7,19":{8:[1,2,3,4,5]},"8,20":{9:[1,2,3,4]},"9,21":{8:[7,8,9,10,11]},"10,22":{9:[5,6,7,8]},"11,23":{9:[9,10,11]}},getHour:function(e){var E=e.getHours();return e.getMinutes()>=20?(E+1)%24:E}};jQuery.fritteli.uhr.register("nl",i)}(),function(e){var E={1:[1]},r={1:[2,3,4]},t={7:[8]},n={10:[5]},u={7:[7,8,9,10,11]},I={10:[7,8,9,10,11]},i={10:[1,2,3]},N={9:[1,2,4,5,6,7,8,9]},T={8:[1,2,3,4,5]},s={version:2,language:"Português",letters:["ÉSÃOUMATRÊS","MEIOLDIADEZ","DUASEISETEY","QUATROHNOVE","CINCOITONZE","ZMEIALNOITE","HORASYMENOS","VINTECAMEIA","UMVQUARTOPM","DEZOEYCINCO"],minutes:{"5,6,7,8,9":[t,I],"10,11,12,13,14":[t,i],"15,16,17,18,19":[t,N],"20,21,22,23,24":[t,T],"25,26,27,28,29":[t,T,n,I],"30,31,32,33,34":[t,{8:[8,9,10,11]}],"35,36,37,38,39":[u,T,n,I],"40,41,42,43,44":[u,T],"45,46,47,48,49":[u,N],"50,51,52,53,54":[u,i],"55,56,57,58,59":[u,I]},hours:{0:[E,{6:[2,3,4,5,7,8,9,10,11]}],12:[E,{2:[1,2,3,4,6,7,8]}],"1,13":[E,{1:[5,6,7]}],"2,14":[r,{3:[1,2,3,4]}],"3,15":[r,{1:[8,9,10,11]}],"4,16":[r,{4:[1,2,3,4,5,6]}],"5,17":[r,{5:[1,2,3,4,5]}],"6,18":[r,{3:[4,5,6,7]}],"7,19":[r,{3:[7,8,9,10]}],"8,20":[r,{5:[5,6,7,8]}],"9,21":[r,{4:[8,9,10,11]}],"10,22":[r,{2:[9,10,11]}],"11,23":[r,{5:[8,9,10,11]}]},getHour:function(e){var E=e.getHours();return e.getMinutes()>=35?(E+1)%24:E}};jQuery.fritteli.uhr.register("pt",s)}();
+/*! uhr - v8.0.4-dev.0 - 2016-06-27
+* http://bärneruhr.ch/
+* Copyright (c) 2016 Manuel Friedli; Licensed GPL-3.0 */
+!function(a){"use strict";var b={1:[1,2,4,5,6]},c={10:[9,10,11]},d={4:[8,9,10,11]},e={4:[1,2,3]},f={5:[1,2,3,4]},g={1:[8,9,10,11]},h={2:[1,2,3,4]},i={3:[5,6,7,8,9,10,11]},j={2:[5,6,7,8,9,10,11]},k={3:[1,2,3,4,5,6,7,8,9,10,11]},l={version:2,language:"Deutsch",letters:["ESKISTAFÜNF","ZEHNZWANZIG","DREIVIERTEL","VORFUNKNACH","HALBAELFÜNF","EINSXAMZWEI","DREIPMJVIER","SECHSNLACHT","SIEBENZWÖLF","ZEHNEUNKUHR"],permanent:b,minutes:{"0,1,2,3,4":c,"5,6,7,8,9":[g,d],"10,11,12,13,14":[h,d],"15,16,17,18,19":[i,d],"20,21,22,23,24":[j,d],"25,26,27,28,29":[g,e,f],"30,31,32,33,34":f,"35,36,37,38,39":[g,d,f],"40,41,42,43,44":[j,e],"45,46,47,48,49":k,"50,51,52,53,54":[h,e],"55,56,57,58,59":[g,e]},hours:{"0,12":{9:[7,8,9,10,11]},"1,13":{6:[1,2,3,4]},"2,14":{6:[8,9,10,11]},"3,15":{7:[1,2,3,4]},"4,16":{7:[8,9,10,11]},"5,17":{5:[8,9,10,11]},"6,18":{8:[1,2,3,4,5]},"7,19":{9:[1,2,3,4,5,6]},"8,20":{8:[8,9,10,11]},"9,21":{10:[4,5,6,7]},"10,22":{10:[1,2,3,4]},"11,23":{5:[6,7,8]}}};a.fritteli.uhr.register("de",l)}(jQuery),function(a){"use strict";var b={1:[1,2,4,5,6,7]},c={4:[1,2]},d={3:[9,10,11]},e={4:[4,5,6,7,8]},f={1:[9,10,11]},g={2:[9,10,11]},h={2:[1,2,3,4,5,6]},i={3:[1,2,3,4,5,6]},j={version:2,language:"Bärndütsch",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGSIVOR","ABOHAUBIEGE","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:b,minutes:{"5,6,7,8,9":[f,c],"10,11,12,13,14":[g,c],"15,16,17,18,19":[h,c],"20,21,22,23,24":[i,c],"25,26,27,28,29":[f,d,e],"30,31,32,33,34":e,"35,36,37,38,39":[f,c,e],"40,41,42,43,44":[i,d],"45,46,47,48,49":[h,d],"50,51,52,53,54":[g,d],"55,56,57,58,59":[f,d]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}};a.fritteli.uhr.register("de_CH",j)}(jQuery),function(a){"use strict";var b={1:[1,2,4,5,6,7]},c={3:[7,8,9,10,11]},d={4:[4,5]},e={4:[1,2,3]},f={4:[7,8,9,10,11]},g={1:[9,10,11]},h={2:[9,10,11]},i={2:[1,2,3,4,5,6]},j={3:[1,2,3,4,5,6]},k={version:2,language:"Bärndütsch (genau)",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGGENAU","VORABOHAUBI","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:b,minutes:{0:c,"5,6,7,8,9":[g,d],"10,11,12,13,14":[h,d],"15,16,17,18,19":[i,d],"20,21,22,23,24":[j,d],"25,26,27,28,29":[g,e,f],"30,31,32,33,34":f,"35,36,37,38,39":[g,d,f],"40,41,42,43,44":[j,e],"45,46,47,48,49":[i,e],"50,51,52,53,54":[h,e],"55,56,57,58,59":[g,e]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}};a.fritteli.uhr.register("de_CH_genau",k)}(jQuery),function(a){"use strict";var b={1:[1,2,3,4,5,6,7,9,10]},c={4:[4,5,6,7,8,9,10,11]},d={5:[8]},e={5:[4,5,6,7]},f={2:[1,2,3]},g={4:[1,2]},h={3:[4,5,6,7,8]},i={2:[4,5,6,7]},j={6:[8,9,10,11]},k={version:2,language:"Dansk",letters:["KLOKKENVERO","FEMTYVESKLA","OJEKVARTVAT","TIAMINUTTER","VEMOVERILMF","MONALISHALV","ETTOTREFIRE","FEMSEKSRSYV","OTTERNIMETI","ELLEVEATOLV"],permanent:b,minutes:{"5,6,7,8,9":[f,c,e],"10,11,12,13,14":[g,c,e],"15,16,17,18,19":[h,e],"20,21,22,23,24":[i,c,e],"25,26,27,28,29":[f,c,d,j],"30,31,32,33,34":[j],"35,36,37,38,39":[f,c,e,j],"40,41,42,43,44":[i,c,d],"45,46,47,48,49":[h,d],"50,51,52,53,54":[g,c,d],"55,56,57,58,59":[f,c,d]},hours:{"0,12":{10:[8,9,10,11]},"1,13":{7:[1,2]},"2,14":{7:[3,4]},"3,15":{7:[5,6,7]},"4,16":{7:[8,9,10,11]},"5,17":{8:[1,2,3]},"6,18":{8:[4,5,6,7]},"7,19":{8:[9,10,11]},"8,20":{9:[1,2,3,4]},"9,21":{9:[6,7]},"10,22":{9:[10,11]},"11,23":{10:[1,2,3,4,5,6]}},getHour:function(a){var b=a.getHours();return a.getMinutes()>=25?(b+1)%24:b}};a.fritteli.uhr.register("dk",k)}(jQuery),function(a){"use strict";var b={1:[1,2,4,5]},c={4:[1,2,3,4]},d={4:[10,11]},e={5:[1,2,3,4]},f={10:[5,6,7,8,9,10,11]},g={3:[7,8,9,10]},h={4:[6,7,8]},i={2:[1,3,4,5,6,7,8,9]},j={3:[1,2,3,4,5,6]},k={3:[1,2,3,4,5,6,7,8,9,10]},l={version:2,language:"English",letters:["ITLISBFAMPM","ACQUARTERDC","TWENTYFIVEX","HALFBTENFTO","PASTERUNINE","ONESIXTHREE","FOURFIVETWO","EIGHTELEVEN","SEVENTWELVE","TENSO'CLOCK"],permanent:b,minutes:{"0,1,2,3,4":f,"5,6,7,8,9":[g,e],"10,11,12,13,14":[h,e],"15,16,17,18,19":[i,e],"20,21,22,23,24":[j,e],"25,26,27,28,29":[k,e],"30,31,32,33,34":[c,e],"35,36,37,38,39":[k,d],"40,41,42,43,44":[j,d],"45,46,47,48,49":[i,d],"50,51,52,53,54":[h,d],"55,56,57,58,59":[g,d]},hours:{"0,12":{9:[6,7,8,9,10,11]},"1,13":{6:[1,2,3]},"2,14":{7:[9,10,11]},"3,15":{6:[7,8,9,10,11]},"4,16":{7:[1,2,3,4]},"5,17":{7:[5,6,7,8]},"6,18":{6:[4,5,6]},"7,19":{9:[1,2,3,4,5]},"8,20":{8:[1,2,3,4,5]},"9,21":{5:[8,9,10,11]},"10,22":{10:[1,2,3]},"11,23":{8:[6,7,8,9,10,11]}},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("en",l)}(jQuery),function(a){"use strict";var b={1:[1,2,6,7]},c={1:[2,3,4,6,7,8]},d={7:[6]},e={7:[7,8,9,10,11]},f={10:[1,2,3,4,5]},g={9:[7,8,9,10,11]},h={8:[8,9,10,11]},i={10:[6,7,8,9,10,11]},j={8:[2,3,4,5,6,7]},k={9:[1,2,3,4,5,6,7,8,9,10,11]},l={version:2,language:"Español",letters:["ESONELASUNA","DOSITRESORE","CUATROCINCO","SEISASIETEN","OCHONUEVEYO","LADIEZSONCE","DOCELYMENOS","OVEINTEDIEZ","VEINTICINCO","MEDIACUARTO"],permanent:[],minutes:{"5,6,7,8,9":[d,g],"10,11,12,13,14":[d,h],"15,16,17,18,19":[d,i],"20,21,22,23,24":[d,j],"25,26,27,28,29":[d,k],"30,31,32,33,34":[d,f],"35,36,37,38,39":[e,k],"40,41,42,43,44":[e,j],"45,46,47,48,49":[e,i],"50,51,52,53,54":[e,h],"55,56,57,58,59":[e,g]},hours:{"0,12":[c,{7:[1,2,3,4]}],"1,13":[b,{1:[9,10,11]}],"2,14":[c,{2:[1,2,3]}],"3,15":[c,{2:[5,6,7,8]}],"4,16":[c,{3:[1,2,3,4,5,6]}],"5,17":[c,{3:[7,8,9,10,11]}],"6,18":[c,{4:[1,2,3,4]}],"7,19":[c,{4:[6,7,8,9,10]}],"8,20":[c,{5:[1,2,3,4]}],"9,21":[c,{5:[5,6,7,8,9]}],"10,22":[c,{6:[3,4,5,6]}],"11,23":[c,{6:[8,9,10,11]}]},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("es",l)}(jQuery),function(a){"use strict";var b={1:[1,2,4,5,6]},c={8:[1,2]},d={7:[1,2,3,4,5]},e={10:[4,5,6,7,8]},f={6:[6,7,8,9,10,11]},g={7:[7,8]},h={9:[7,8,9,10]},i={7:[9,10,11]},j={8:[4,5,6,7,8]},k={9:[1,2,3,4,5]},l={9:[1,2,3,4,5,6,7,8,9,10]},m={version:2,language:"Français",letters:["ILNESTODEUX","QUATRETROIS","NEUFUNESEPT","HUITSIXCINQ","MIDIXMINUIT","ONZERHEURES","MOINSOLEDIX","ETRQUARTPMD","VINGT-CINQU","ETSDEMIEPAM"],permanent:b,minutes:{"5,6,7,8,9":h,"10,11,12,13,14":i,"15,16,17,18,19":[c,j],"20,21,22,23,24":k,"25,26,27,28,29":l,"30,31,32,33,34":[c,e],"35,36,37,38,39":[d,l],"40,41,42,43,44":[d,k],"45,46,47,48,49":[d,g,j],"50,51,52,53,54":[d,i],"55,56,57,58,59":[d,h]},hours:{0:{5:[6,7,8,9,10,11]},"1,13":[{3:[5,6,7]},f],"2,14":[{1:[8,9,10,11]},f],"3,15":[{2:[7,8,9,10,11]},f],"4,16":[{2:[1,2,3,4,5,6]},f],"5,17":[{4:[8,9,10,11]},f],"6,18":[{4:[5,6,7]},f],"7,19":[{3:[8,9,10,11]},f],"8,20":[{4:[1,2,3,4]},f],"9,21":[{3:[1,2,3,4]},f],"10,22":[{5:[3,4,5]},f],"11,23":[{6:[1,2,3,4]},f],12:{5:[1,2,3,4]}},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("fr",m)}(jQuery),function(a){"use strict";var b={1:[1,2,3,4,6,7]},c={2:[1,3,4]},d={8:[1]},e={7:[8,9,10,11]},f={10:[7,8,9,10,11]},g={9:[6,7,8,9,10,11]},h={10:[1,2,3,4,5]},i={8:[3,4,6,7,8,9,10,11]},j={9:[1,2,3,4,5]},k={9:[1,2,3,4,5,6,7,8,9,10,11]},l={version:2,language:"Italiano",letters:["SONORLEBORE","ÈRL'UNASDUE","TREOTTONOVE","DIECIUNDICI","DODICISETTE","QUATTROCSEI","CINQUEAMENO","ECUNOQUARTO","VENTICINQUE","DIECIPMEZZA"],permanent:[],minutes:{"5,6,7,8,9":[d,g],"10,11,12,13,14":[d,h],"15,16,17,18,19":[d,i],"20,21,22,23,24":[d,j],"25,26,27,28,29":[d,k],"30,31,32,33,34":[d,f],"35,36,37,38,39":[e,k],"40,41,42,43,44":[e,j],"45,46,47,48,49":[e,i],"50,51,52,53,54":[e,h],"55,56,57,58,59":[e,g]},hours:{"0,12":[b,{5:[1,2,3,4,5,6]}],"1,13":[c,{2:[5,6,7]}],"2,14":[b,{2:[9,10,11]}],"3,15":[b,{3:[1,2,3]}],"4,16":[b,{6:[1,2,3,4,5,6,7]}],"5,17":[b,{7:[1,2,3,4,5,6]}],"6,18":[b,{6:[9,10,11]}],"7,19":[b,{5:[7,8,9,10,11]}],"8,20":[b,{3:[4,5,6,7]}],"9,21":[b,{3:[8,9,10,11]}],"10,22":[b,{4:[1,2,3,4,5]}],"11,23":[b,{4:[6,7,8,9,10,11]}]},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("it",l)}(jQuery),function(a){"use strict";var b={1:[1,2,3,5,6]},c={3:[1,2,3,4]},d={2:[8,9,10,11]},e={4:[8,9,10,11]},f={5:[1,2,3,4]},g={4:[1,2,3,4]},h={1:[8,9,10,11]},i={2:[1,2,3,4]},j={3:[7,8,9,10,11]},k={10:[9,10,11]},l={version:2,language:"Nederlands",letters:["HETKISAVIJF","TIENBTZVOOR","OVERMEKWART","HALFSPWOVER","VOORTHGEENS","TWEEPVCDRIE","VIERVIJFZES","ZEVENONEGEN","ACHTTIENELF","TWAALFBFUUR"],permanent:b,minutes:{"0,1,2,3,4":k,"5,6,7,8,9":[h,c],"10,11,12,13,14":[i,c],"15,16,17,18,19":[j,e],"20,21,22,23,24":[i,d,g],"25,26,27,28,29":[h,d,g],"30,31,32,33,34":g,"35,36,37,38,39":[h,c,g],"40,41,42,43,44":[i,c,g],"45,46,47,48,49":[j,f],"50,51,52,53,54":[i,d],"55,56,57,58,59":[h,d]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[8,9,10]},"2,14":{6:[1,2,3,4]},"3,15":{6:[8,9,10,11]},"4,16":{7:[1,2,3,4]},"5,17":{7:[5,6,7,8]},"6,18":{7:[9,10,11]},"7,19":{8:[1,2,3,4,5]},"8,20":{9:[1,2,3,4]},"9,21":{8:[7,8,9,10,11]},"10,22":{9:[5,6,7,8]},"11,23":{9:[9,10,11]}},getHour:function(a){var b=a.getHours();return a.getMinutes()>=20?(b+1)%24:b}};a.fritteli.uhr.register("nl",l)}(jQuery),function(a){"use strict";var b={1:[1]},c={1:[2,3,4]},d={7:[8]},e={10:[5]},f={7:[7,8,9,10,11]},g={8:[8,9,10,11]},h={10:[7,8,9,10,11]},i={10:[1,2,3]},j={9:[1,2,4,5,6,7,8,9]},k={8:[1,2,3,4,5]},l={version:2,language:"Português",letters:["ÉSÃOUMATRÊS","MEIOLDIADEZ","DUASEISETEY","QUATROHNOVE","CINCOITONZE","ZMEIALNOITE","HORASYMENOS","VINTECAMEIA","UMVQUARTOPM","DEZOEYCINCO"],minutes:{"5,6,7,8,9":[d,h],"10,11,12,13,14":[d,i],"15,16,17,18,19":[d,j],"20,21,22,23,24":[d,k],"25,26,27,28,29":[d,k,e,h],"30,31,32,33,34":[d,g],"35,36,37,38,39":[f,k,e,h],"40,41,42,43,44":[f,k],"45,46,47,48,49":[f,j],"50,51,52,53,54":[f,i],"55,56,57,58,59":[f,h]},hours:{0:[b,{6:[2,3,4,5,7,8,9,10,11]}],12:[b,{2:[1,2,3,4,6,7,8]}],"1,13":[b,{1:[5,6,7]}],"2,14":[c,{3:[1,2,3,4]}],"3,15":[c,{1:[8,9,10,11]}],"4,16":[c,{4:[1,2,3,4,5,6]}],"5,17":[c,{5:[1,2,3,4,5]}],"6,18":[c,{3:[4,5,6,7]}],"7,19":[c,{3:[7,8,9,10]}],"8,20":[c,{5:[5,6,7,8]}],"9,21":[c,{4:[8,9,10,11]}],"10,22":[c,{2:[9,10,11]}],"11,23":[c,{5:[8,9,10,11]}]},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("pt",l)}(jQuery);
\ No newline at end of file
diff --git a/dist/jquery.uhr.complete.js b/dist/jquery.uhr.complete.js
index 4f0d333..a5796c3 100644
--- a/dist/jquery.uhr.complete.js
+++ b/dist/jquery.uhr.complete.js
@@ -1,29 +1,17 @@
-'use strict';
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
-(function ($) {
+/*! uhr - v8.0.4-dev.0 - 2016-06-27
+* http://bärneruhr.ch/
+* Copyright (c) 2016 Manuel Friedli; Licensed GPL-3.0 */
+(function($) {
+ 'use strict';
var uhrGlobals = {
"id": 0,
"languages": [],
"themes": [],
registerLanguage: function registerLanguage(code, language) {
- var alreadyExists = uhrGlobals.languages.some(function (element) {
+ var alreadyExists = uhrGlobals.languages.some(function(element) {
if (code === element.code) {
console.error("Error: Language code '" + code + "' cannot be registered for language '" + language.language +
- "' because it is already registered for language '" + element.language + "'!");
+ "' because it is already registered for language '" + element.language + "'!");
return true;
}
return false;
@@ -36,7 +24,7 @@
};
// auto-detect themes
- $('link[rel=stylesheet]').each(function (index, item) {
+ $('link[rel=stylesheet]').each(function(index, item) {
var styleSheet = $(item);
var styleClass = styleSheet.attr('data-class');
if (styleClass !== undefined) {
@@ -53,12 +41,9 @@
}
// public interface methods (exported later)
- var setCookie;
- var isOn;
- var update;
var start = function start() {
if (!isOn.bind(this)()) {
- this.timer = window.setInterval(function () {
+ this.timer = window.setInterval(function() {
this.options.time = new Date();
update.bind(this)();
}.bind(this), 1000);
@@ -81,25 +66,436 @@
this.start();
}
};
- var language;
-
- /**
- * Ein Buchstabe. Hilfsklasse für den Renderer und Inhalt der Layout-Arrays.
- * @param value Der Buchstabe, der Dargestellt werden soll.
- * @param style Die CSS-Styleklassen des Buchstabens.
- */
- function Letter(value, style) {
- var myValue = value;
- var myStyle = style || '';
- this.addStyle = function (style) {
- if (myStyle === '') {
- myStyle = style;
- } else {
- myStyle += ' ' + style;
+ var setLanguage = function setLanguage(languageKey) {
+ if (languageKey !== this.options.language) {
+ this.options.language = languageKey;
+ var renderer = new UhrRenderer(language.bind(this)(), this.element.find('.letterarea'));
+ renderer.render.bind(this)(function() {
+ this.currentMinute = -1;
+ update.bind(this)();
+ }.bind(this));
+ setCookie.bind(this)('uhr-language', languageKey);
+ update.bind(this)();
+ }
+ };
+ var setTheme = function setTheme(theme) {
+ if (theme !== this.options.theme) {
+ this.element.removeClass(this.options.theme).addClass(theme);
+ $('#uhr-onoffswitch' + this.id).removeClass(this.options.theme).addClass(theme);
+ this.options.theme = theme;
+ setCookie.bind(this)('uhr-theme', theme);
+ }
+ };
+ var setTime = function setTime(time) {
+ this.currentMinute = -1;
+ if (time === null) {
+ this.options.time = new Date();
+ } else {
+ if (this.timer !== null) {
+ window.clearInterval(this.timer);
}
- };
- this.toString = function () {
- return '' + myValue + ' ';
+ this.options.time = time;
+ }
+ update.bind(this)();
+ };
+ var setMode = function(mode) {
+ this.options.mode = mode;
+ this.currentMinute = -1;
+ update.bind(this)();
+ setCookie.bind(this)('uhr-mode', mode);
+ };
+ var setWidth = function setWidth(width) {
+ var e = this.element;
+ e.css('width', width);
+ var realWidth = e.width();
+ e.width(realWidth);
+ e.height(realWidth);
+ e.css('font-size', (realWidth / 40) + 'px');
+ };
+
+ // private interface methods
+ var create = function create() {
+ this.id = uhrGlobals.id++;
+ this.timer = null;
+ this.currentMinute = -1;
+ var userTime = this.options.time;
+ var hash, params;
+ if (this.options.time === undefined) {
+ this.options.time = new Date();
+ }
+ // parse the URL params
+ hash = window.location.hash;
+ if (hash !== undefined && typeof hash === 'string' && hash.charAt(0) === '#') {
+ hash = hash.substring(1);
+ hash = decodeURIComponent(hash);
+ params = hash.split('&');
+ params.forEach(function (element) {
+ var pair = element.split('=');
+ var key = pair[0];
+ var value = pair[1];
+ switch (key) {
+ case 'l':
+ case 'language':
+ this.options.language = value;
+ this.options.force = true;
+ break;
+ case 't':
+ case 'theme':
+ this.options.theme = value;
+ this.options.force = true;
+ break;
+ case 'm':
+ case 'mode':
+ this.options.mode = value;
+ this.options.force = true;
+ break;
+ case 's':
+ case 'status':
+ this.options.status = value;
+ this.options.force = true;
+ break;
+ }
+ }.bind(this));
+ }
+ // end parse the URL params
+ setupHTML.bind(this)();
+ wireFunctionality.bind(this)();
+ if (userTime !== undefined) {
+ this.time(userTime);
+ }
+ };
+ // private helper methods (not exported)
+ var toggleConfigScreen = function toggleConfigScreen() {
+ $('#uhr-controlpanel' + this.id).toggle('fast');
+ };
+ // set up
+ var setupHTML = function setupHTML() {
+ var e = this.element;
+ // Base clock area
+ e.addClass('uhr');
+ e.empty();
+ e.append(' ');
+ e.append(' ');
+ e.append(' ');
+ e.append(' ');
+ e.append('
');
+ e.append('
');
+ setWidth.bind(this)(this.options.width);
+
+ if (this.options.controls) {
+ var controlpanel = $('
');
+ var content = $('
');
+ controlpanel.append(content);
+ // on/off switch
+ var toggleSwitch = $('
');
+ toggleSwitch.append(' ');
+ toggleSwitch.append('' +
+ '
' + '
' + ' ');
+ content.append(toggleSwitch);
+
+ // time mode switch
+ var modeSwitch = $('
');
+ modeSwitch.append(' ');
+ modeSwitch.append('' +
+ '
' + '
' +
+ ' ');
+ content.append(modeSwitch);
+ // language chooser
+ if (uhrGlobals.languages.length > 1) {
+ var languageChooser = $(' ');
+ uhrGlobals.languages.forEach(function(item) {
+ languageChooser.append('' + item.language + ' ');
+ });
+ content.append(languageChooser);
+ }
+
+ // theme chooser
+ if (uhrGlobals.themes.length > 1) {
+ var themeChooser = $(' ');
+ uhrGlobals.themes.forEach(function(item) {
+ themeChooser.append('' + item.name + ' ');
+ });
+ content.append(themeChooser);
+ }
+ var closebutton = $(' ');
+ closebutton.on('click', function() {
+ $('#uhr-controlpanel' + this.id).hide('fast');
+ }.bind(this));
+ content.append(closebutton);
+ e.after(controlpanel);
+ controlpanel.hide();
+ var configlink = $(' ');
+ configlink.on('click', function() {
+ toggleConfigScreen.bind(this)();
+ }.bind(this));
+ e.after(configlink);
+ }
+ };
+ var wireFunctionality = function wireFunctionality() {
+ // on/off switch
+ var toggleSwitch = $('#uhr-onoffswitch-checkbox' + this.id);
+ toggleSwitch.on('click', function() {
+ this.toggle();
+ }.bind(this));
+ var status = $.cookie('uhr-status' + this.id);
+ if (status === undefined || this.options.force) {
+ status = this.options.status;
+ }
+ toggleSwitch.prop('checked', status === 'on');
+ if (status === 'on') {
+ this.start();
+ } else {
+ this.stop();
+ }
+
+ // time mode switch
+ var modeSwitch = $('#uhr-modeswitch-checkbox' + this.id);
+ modeSwitch.on('click', function() {
+ if (this.options.mode === 'seconds') {
+ setMode.bind(this)('normal');
+ } else {
+ setMode.bind(this)('seconds');
+ }
+ }.bind(this));
+
+ var mode = $.cookie('uhr-mode' + this.id);
+ if (mode === undefined || this.options.force) {
+ mode = this.options.mode;
+ }
+ modeSwitch.prop('checked', mode !== 'seconds');
+ if (mode === 'seconds') {
+ setMode.bind(this)('seconds');
+ } else {
+ setMode.bind(this)('normal');
+ }
+
+ // language chooser
+ var languageChooser = $('#uhr-languagechooser' + this.id);
+ languageChooser.on('change', function() {
+ var languageKey = $('#uhr-languagechooser' + this.id).val();
+ this.language(languageKey);
+ }.bind(this));
+ var selectedLanguage = $.cookie('uhr-language' + this.id);
+ if (selectedLanguage === undefined || this.options.force) {
+ selectedLanguage = this.options.language;
+ }
+ var found = uhrGlobals.languages.some(function(item) {
+ return selectedLanguage === item.code;
+ });
+ if (!found) {
+ var fallbackLanguage;
+ if (uhrGlobals.languages.length > 0) {
+ fallbackLanguage = uhrGlobals.languages[0].code;
+ } else {
+ fallbackLanguage = '';
+ }
+ console.warn("Language '" + selectedLanguage + "' not found! Using fallback '" + fallbackLanguage + "'");
+ selectedLanguage = fallbackLanguage;
+ }
+ languageChooser.val(selectedLanguage);
+ this.options.language = "";
+ this.language(selectedLanguage);
+
+ // theme chooser
+ var themeChooser = $('#uhr-themechooser' + this.id);
+ themeChooser.on('change', function() {
+ var themeKey = $('#uhr-themechooser' + this.id).val();
+ this.theme(themeKey);
+ }.bind(this));
+ var selectedTheme = $.cookie('uhr-theme' + this.id);
+ if (selectedTheme === undefined || this.options.force) {
+ selectedTheme = this.options.theme;
+ }
+ found = uhrGlobals.themes.some(function(item) {
+ return selectedTheme === item.styleClass;
+ });
+ if (!found) {
+ var fallbackTheme = uhrGlobals.themes[0].styleClass;
+ console.warn("Theme '" + selectedTheme + "' not found! Using fallback '" + fallbackTheme + "'");
+ selectedTheme = fallbackTheme;
+ }
+ themeChooser.val(selectedTheme);
+ this.options.theme = "";
+ this.theme(selectedTheme);
+ if (this.options.autoresize) {
+ $(window).on('resize', function() {
+ var $e = this.element;
+ var $parent = $e.parent();
+ var $window = $(window);
+ var parentWidth = $parent.width();
+ var parentHeight = $parent.height();
+ var windowWidth = $window.width();
+ var windowHeight = $window.height();
+ var size = Math.min(parentWidth, parentHeight, windowWidth, windowHeight) + 'px';
+ setWidth.bind(this)(size);
+ }.bind(this));
+ }
+ };
+ var destroy = function destroy() {
+ this.timer = null;
+ $(this.element)
+ .removeAttr('style')
+ .removeAttr('class')
+ .empty();
+ $('#uhr-configlink' + this.id).remove();
+ $('#uhr-controlpanel' + this.id).remove();
+
+ };
+ var setCookie = function setCookie(cookieName, cookieValue) {
+ var options = {};
+ if (this.options.cookiePath !== undefined) {
+ options = {expires: 365, path: this.options.cookiePath};
+ } else {
+ options = {expires: 365};
+ }
+ $.cookie(cookieName + this.id, cookieValue, options);
+ };
+
+ // business logic
+ var isOn = function isOn() {
+ return this.timer !== null;
+ };
+ var update = function update() {
+ if (isOn.bind(this)()) {
+ var time = this.options.time;
+ if (!language.bind(this)().hasOwnProperty('seconds') && this.options.mode !== 'seconds') {
+ if (time.getMinutes() === this.currentMinute) {
+ return;
+ }
+ this.currentMinute = time.getMinutes();
+ }
+ show.bind(this)(time);
+ } else {
+ clear.bind(this)();
+ this.currentMinute = -1;
+ }
+ };
+ var show = function show(time) {
+ var second = getSecond.bind(this)(time);
+ var dotMinute = getDotMinute.bind(this)(time);
+ var hour = getHour.bind(this)(time);
+ var coarseMinute = getCoarseMinute.bind(this)(time);
+ clear.bind(this)();
+ if (this.options.mode === 'seconds') {
+ highlight.bind(this)('second' + second);
+ } else {
+ highlight.bind(this)('on');
+ for (var i = 1; i <= dotMinute; i++) {
+ highlight.bind(this)('dot' + i);
+ }
+ highlight.bind(this)('minute' + coarseMinute);
+ highlight.bind(this)('hour' + hour);
+ }
+ };
+ var highlight = function highlight(itemClass) {
+ this.element.find('.item.' + itemClass).addClass('active');
+ };
+ var clear = function clear() {
+ this.element.find('.item').removeClass('active');
+ };
+ var getSecond = function getSecond(date) {
+ if (typeof language.bind(this)().getSeconds === 'function') {
+ return language.bind(this)().getSeconds(date);
+ }
+ return date.getSeconds();
+ };
+ var getDotMinute = function getDotMinute(date) {
+ if (typeof language.bind(this)().getDotMinute === 'function') {
+ return language.bind(this)().getDotMinute(date);
+ }
+ var minutes = date.getMinutes();
+ return minutes % 5;
+ };
+ var getCoarseMinute = function getCoarseMinute(date) {
+ if (typeof language.bind(this)().getCoarseMinute === 'function') {
+ return language.bind(this)().getCoarseMinute(date);
+ }
+ return date.getMinutes();
+ };
+ var getHour = function getHour(date) {
+ if (typeof language.bind(this)().getHour === 'function') {
+ return language.bind(this)().getHour(date);
+ }
+ var hour = date.getHours();
+ if (date.getMinutes() >= 25) {
+ return (hour + 1) % 24;
+ }
+ return hour;
+ };
+ var language = function language() {
+ var matchingLanguages = uhrGlobals.languages.filter(function(element) {
+ return (element.code === this.options.language);
+ }, this);
+ if (matchingLanguages.length > 0) {
+ return matchingLanguages[0];
+ }
+ // fallback: return empty object
+ return {};
+ };
+
+ $.widget("fritteli.uhr", {
+ "options": {
+ width: '100%',
+ status: 'on',
+ language: 'de_CH',
+ theme: uhrGlobals.themes[0].styleClass,
+ force: false,
+ controls: true,
+ cookiePath: undefined,
+ autoresize: true,
+ mode: 'normal'
+ },
+ "start": start,
+ "stop": stop,
+ "toggle": toggle,
+ "language": setLanguage,
+ "theme": setTheme,
+ "time": setTime,
+ "mode": setMode,
+ "width": setWidth,
+ // constructor method
+ "_create": create,
+ // destructor method
+ "_destroy": destroy
+ });
+ $.fritteli.uhr.register = uhrGlobals.registerLanguage;
+ /**
+ * Hilfsklasse zum Rendern der Uhr.
+ * @param layout Layout-Objekt, das gerendert werden soll.
+ * @param renderarea Das jQuery-gewrappte HTML-Element, auf dem gerendert werden soll.
+ */
+ function UhrRenderer(layout, renderarea) {
+ this.render = function render(beforeshow) {
+ if (layout.parsed === undefined) {
+ switch (layout.version) {
+ case 2:
+ var delegate = new UhrRendererV2Delegate(layout);
+ var parsedLayout = delegate.parse();
+ Object.defineProperty(layout, "parsed", {"value": parsedLayout, "writable": false, "configurable": false});
+ break;
+ default:
+ console.warn("Unknown layout version: '" + layout.version + "'");
+ return;
+ }
+ }
+ var letters = layout.parsed;
+ renderarea.fadeOut('fast', function() {
+ renderarea.empty();
+ letters.forEach(function(line, index, array) {
+ line.forEach(function(letter) {
+ renderarea.append(letter.toString());
+ });
+ if (index < array.length - 1) {
+ renderarea.append(' ');
+ }
+ });
+ if (typeof beforeshow === 'function') {
+ beforeshow();
+ }
+ renderarea.fadeIn('fast');
+ });
};
}
@@ -248,7 +644,7 @@
8: [10],
9: [8, 9]
};
- var seconds = {
+ var seconds= {
"0": [vorne0, hinten0],
"1": [vorne0, hinten1],
"2": [vorne0, hinten2],
@@ -311,21 +707,10 @@
"59": [vorne5, hinten9]
};
- function parseObject(letters, styleClass, object) {
- if (typeof object !== 'undefined' && object !== null) {
- Object.keys(object).forEach(function (y) {
- var highlightLetters = object[y];
- highlightLetters.forEach(function (x) {
- letters[y - 1][x - 1].addStyle(styleClass);
- });
- });
- }
- }
-
function parseArrayOrObject(letters, styleClass, input) {
if (typeof input !== 'undefined' && input !== null) {
if (Array.isArray(input)) {
- input.forEach(function (item) {
+ input.forEach(function(item) {
parseObject(letters, styleClass, item);
});
} else {
@@ -334,12 +719,23 @@
}
}
+ function parseObject(letters, styleClass, object) {
+ if (typeof object !== 'undefined' && object !== null) {
+ Object.keys(object).forEach(function(y) {
+ var highlightLetters = object[y];
+ highlightLetters.forEach(function(x) {
+ letters[y - 1][x - 1].addStyle(styleClass);
+ });
+ });
+ }
+ }
+
function parseTimeDefinition(letters, styleClass, definition) {
if (typeof definition !== 'undefined' && definition !== null) {
- Object.keys(definition).forEach(function (listString) {
+ Object.keys(definition).forEach(function(listString) {
var array = listString.split(',');
var highlightLetters = definition[listString];
- array.forEach(function (item) {
+ array.forEach(function(item) {
parseArrayOrObject(letters, styleClass + item, highlightLetters);
});
});
@@ -348,7 +744,7 @@
this.parse = function parse() {
var letters = [];
- layout.letters.forEach(function (string) {
+ layout.letters.forEach(function(string) {
var line = [];
for (var c = 0; c < string.length; c++) {
var character = new Letter(string[c]);
@@ -369,468 +765,28 @@
}
/**
- * Hilfsklasse zum Rendern der Uhr.
- * @param layout Layout-Objekt, das gerendert werden soll.
- * @param renderarea Das jQuery-gewrappte HTML-Element, auf dem gerendert werden soll.
+ * Ein Buchstabe. Hilfsklasse für den Renderer und Inhalt der Layout-Arrays.
+ * @param value Der Buchstabe, der Dargestellt werden soll.
+ * @param style Die CSS-Styleklassen des Buchstabens.
*/
- function UhrRenderer(layout, renderarea) {
- this.render = function render(beforeshow) {
- if (layout.parsed === undefined) {
- switch (layout.version) {
- case 2:
- var delegate = new UhrRendererV2Delegate(layout);
- var parsedLayout = delegate.parse();
- Object.defineProperty(layout, "parsed", {
- "value": parsedLayout,
- "writable": false,
- "configurable": false
- });
- break;
- default:
- console.warn("Unknown layout version: '" + layout.version + "'");
- return;
- }
+ function Letter(value, style) {
+ var myValue = value;
+ var myStyle = style || '';
+ this.addStyle = function(style) {
+ if (myStyle === '') {
+ myStyle = style;
+ } else {
+ myStyle += ' ' + style;
}
- var letters = layout.parsed;
- renderarea.fadeOut('fast', function () {
- renderarea.empty();
- letters.forEach(function (line, index, array) {
- line.forEach(function (letter) {
- renderarea.append(letter.toString());
- });
- if (index < array.length - 1) {
- renderarea.append(' ');
- }
- });
- if (typeof beforeshow === 'function') {
- beforeshow();
- }
- renderarea.fadeIn('fast');
- });
+ };
+ this.toString = function() {
+ return '' + myValue + ' ';
};
}
-
- var setLanguage = function setLanguage(languageKey) {
- if (languageKey !== this.options.language) {
- this.options.language = languageKey;
- var renderer = new UhrRenderer(language.bind(this)(), this.element.find('.letterarea'));
- renderer.render.bind(this)(function () {
- this.currentMinute = -1;
- update.bind(this)();
- }.bind(this));
- setCookie.bind(this)('uhr-language', languageKey);
- update.bind(this)();
- }
- };
- var setTheme = function setTheme(theme) {
- if (theme !== this.options.theme) {
- this.element.removeClass(this.options.theme).addClass(theme);
- $('#uhr-onoffswitch' + this.id).removeClass(this.options.theme).addClass(theme);
- this.options.theme = theme;
- setCookie.bind(this)('uhr-theme', theme);
- }
- };
- var setTime = function setTime(time) {
- this.currentMinute = -1;
- if (time === null) {
- this.options.time = new Date();
- } else {
- if (this.timer !== null) {
- window.clearInterval(this.timer);
- }
- this.options.time = time;
- }
- update.bind(this)();
- };
- var setMode = function (mode) {
- this.options.mode = mode;
- this.currentMinute = -1;
- update.bind(this)();
- setCookie.bind(this)('uhr-mode', mode);
- };
- var setWidth = function setWidth(width) {
- var e = this.element;
- e.css('width', width);
- var realWidth = e.width();
- e.width(realWidth);
- e.height(realWidth);
- e.css('font-size', (realWidth / 40) + 'px');
- };
-
- // private interface methods
- var setupHTML;
- var wireFunctionality;
- var create = function create() {
- this.id = uhrGlobals.id++;
- this.timer = null;
- this.currentMinute = -1;
- var userTime = this.options.time;
- var hash, params;
- if (this.options.time === undefined) {
- this.options.time = new Date();
- }
- // parse the URL params
- hash = window.location.hash;
- if (hash !== undefined && typeof hash === 'string' && hash.charAt(0) === '#') {
- hash = hash.substring(1);
- hash = decodeURIComponent(hash);
- params = hash.split('&');
- params.forEach(function (element) {
- var pair = element.split('=');
- var key = pair[0];
- var value = pair[1];
- switch (key) {
- case 'l':
- case 'language':
- this.options.language = value;
- this.options.force = true;
- break;
- case 't':
- case 'theme':
- this.options.theme = value;
- this.options.force = true;
- break;
- case 'm':
- case 'mode':
- this.options.mode = value;
- this.options.force = true;
- break;
- case 's':
- case 'status':
- this.options.status = value;
- this.options.force = true;
- break;
- }
- }.bind(this));
- }
- // end parse the URL params
- setupHTML.bind(this)();
- wireFunctionality.bind(this)();
- if (userTime !== undefined) {
- this.time(userTime);
- }
- };
- // private helper methods (not exported)
- var toggleConfigScreen = function toggleConfigScreen() {
- $('#uhr-controlpanel' + this.id).toggle('fast');
- };
- // set up
- setupHTML = function setupHTML() {
- var e = this.element;
- // Base clock area
- e.addClass('uhr');
- e.empty();
- e.append(' ');
- e.append(' ');
- e.append(' ');
- e.append(' ');
- e.append('
');
- e.append('
');
- setWidth.bind(this)(this.options.width);
-
- if (this.options.controls) {
- var controlpanel = $('
');
- var content = $('
');
- controlpanel.append(content);
- // on/off switch
- var toggleSwitch = $('
');
- toggleSwitch.append(' ');
- toggleSwitch.append('' +
- '
' + '
' + ' ');
- content.append(toggleSwitch);
-
- // time mode switch
- var modeSwitch = $('
');
- modeSwitch.append(' ');
- modeSwitch.append('' +
- '
' + '
' +
- ' ');
- content.append(modeSwitch);
- // language chooser
- if (uhrGlobals.languages.length > 1) {
- var languageChooser = $(' ');
- uhrGlobals.languages.forEach(function (item) {
- languageChooser.append('' + item.language + ' ');
- });
- content.append(languageChooser);
- }
-
- // theme chooser
- if (uhrGlobals.themes.length > 1) {
- var themeChooser = $(' ');
- uhrGlobals.themes.forEach(function (item) {
- themeChooser.append('' + item.name + ' ');
- });
- content.append(themeChooser);
- }
- var closebutton = $(' ');
- closebutton.on('click', function () {
- $('#uhr-controlpanel' + this.id).hide('fast');
- }.bind(this));
- content.append(closebutton);
- e.after(controlpanel);
- controlpanel.hide();
- var configlink = $(' ');
- configlink.on('click', function () {
- toggleConfigScreen.bind(this)();
- }.bind(this));
- e.after(configlink);
- }
- };
- wireFunctionality = function wireFunctionality() {
- // on/off switch
- var toggleSwitch = $('#uhr-onoffswitch-checkbox' + this.id);
- toggleSwitch.on('click', function () {
- this.toggle();
- }.bind(this));
- var status = $.cookie('uhr-status' + this.id);
- if (status === undefined || this.options.force) {
- status = this.options.status;
- }
- toggleSwitch.prop('checked', status === 'on');
- if (status === 'on') {
- this.start();
- } else {
- this.stop();
- }
-
- // time mode switch
- var modeSwitch = $('#uhr-modeswitch-checkbox' + this.id);
- modeSwitch.on('click', function () {
- if (this.options.mode === 'seconds') {
- setMode.bind(this)('normal');
- } else {
- setMode.bind(this)('seconds');
- }
- }.bind(this));
-
- var mode = $.cookie('uhr-mode' + this.id);
- if (mode === undefined || this.options.force) {
- mode = this.options.mode;
- }
- modeSwitch.prop('checked', mode !== 'seconds');
- if (mode === 'seconds') {
- setMode.bind(this)('seconds');
- } else {
- setMode.bind(this)('normal');
- }
-
- // language chooser
- var languageChooser = $('#uhr-languagechooser' + this.id);
- languageChooser.on('change', function () {
- var languageKey = $('#uhr-languagechooser' + this.id).val();
- this.language(languageKey);
- }.bind(this));
- var selectedLanguage = $.cookie('uhr-language' + this.id);
- if (selectedLanguage === undefined || this.options.force) {
- selectedLanguage = this.options.language;
- }
- var found = uhrGlobals.languages.some(function (item) {
- return selectedLanguage === item.code;
- });
- if (!found) {
- var fallbackLanguage;
- if (uhrGlobals.languages.length > 0) {
- fallbackLanguage = uhrGlobals.languages[0].code;
- } else {
- fallbackLanguage = '';
- }
- console.warn("Language '" + selectedLanguage + "' not found! Using fallback '" + fallbackLanguage + "'");
- selectedLanguage = fallbackLanguage;
- }
- languageChooser.val(selectedLanguage);
- this.options.language = "";
- this.language(selectedLanguage);
-
- // theme chooser
- var themeChooser = $('#uhr-themechooser' + this.id);
- themeChooser.on('change', function () {
- var themeKey = $('#uhr-themechooser' + this.id).val();
- this.theme(themeKey);
- }.bind(this));
- var selectedTheme = $.cookie('uhr-theme' + this.id);
- if (selectedTheme === undefined || this.options.force) {
- selectedTheme = this.options.theme;
- }
- found = uhrGlobals.themes.some(function (item) {
- return selectedTheme === item.styleClass;
- });
- if (!found) {
- var fallbackTheme = uhrGlobals.themes[0].styleClass;
- console.warn("Theme '" + selectedTheme + "' not found! Using fallback '" + fallbackTheme + "'");
- selectedTheme = fallbackTheme;
- }
- themeChooser.val(selectedTheme);
- this.options.theme = "";
- this.theme(selectedTheme);
- if (this.options.autoresize) {
- $(window).on('resize', function () {
- var $e = this.element;
- var $parent = $e.parent();
- var $window = $(window);
- var parentWidth = $parent.width();
- var parentHeight = $parent.height();
- var windowWidth = $window.width();
- var windowHeight = $window.height();
- var size = Math.min(parentWidth, parentHeight, windowWidth, windowHeight) + 'px';
- setWidth.bind(this)(size);
- }.bind(this));
- }
- };
- var destroy = function destroy() {
- this.timer = null;
- $(this.element)
- .removeAttr('style')
- .removeAttr('class')
- .empty();
- $('#uhr-configlink' + this.id).remove();
- $('#uhr-controlpanel' + this.id).remove();
-
- };
- setCookie = function setCookie(cookieName, cookieValue) {
- var options = {};
- if (this.options.cookiePath !== undefined) {
- options = {expires: 365, path: this.options.cookiePath};
- } else {
- options = {expires: 365};
- }
- $.cookie(cookieName + this.id, cookieValue, options);
- };
-
- // business logic
- isOn = function isOn() {
- return this.timer !== null;
- };
- var show;
- var clear;
- update = function update() {
- if (isOn.bind(this)()) {
- var time = this.options.time;
- if (!language.bind(this)().hasOwnProperty('seconds') && this.options.mode !== 'seconds') {
- if (time.getMinutes() === this.currentMinute) {
- return;
- }
- this.currentMinute = time.getMinutes();
- }
- show.bind(this)(time);
- } else {
- clear.bind(this)();
- this.currentMinute = -1;
- }
- };
- var highlight;
- var getSecond;
- var getDotMinute;
- var getCoarseMinute;
- var getHour;
- show = function show(time) {
- var second = getSecond.bind(this)(time);
- var dotMinute = getDotMinute.bind(this)(time);
- var hour = getHour.bind(this)(time);
- var coarseMinute = getCoarseMinute.bind(this)(time);
- clear.bind(this)();
- if (this.options.mode === 'seconds') {
- highlight.bind(this)('second' + second);
- } else {
- highlight.bind(this)('on');
- for (var i = 1; i <= dotMinute; i++) {
- highlight.bind(this)('dot' + i);
- }
- highlight.bind(this)('minute' + coarseMinute);
- highlight.bind(this)('hour' + hour);
- }
- };
- highlight = function highlight(itemClass) {
- this.element.find('.item.' + itemClass).addClass('active');
- };
- clear = function clear() {
- this.element.find('.item').removeClass('active');
- };
- getSecond = function getSecond(date) {
- if (typeof language.bind(this)().getSeconds === 'function') {
- return language.bind(this)().getSeconds(date);
- }
- return date.getSeconds();
- };
- getDotMinute = function getDotMinute(date) {
- if (typeof language.bind(this)().getDotMinute === 'function') {
- return language.bind(this)().getDotMinute(date);
- }
- var minutes = date.getMinutes();
- return minutes % 5;
- };
- getCoarseMinute = function getCoarseMinute(date) {
- if (typeof language.bind(this)().getCoarseMinute === 'function') {
- return language.bind(this)().getCoarseMinute(date);
- }
- return date.getMinutes();
- };
- getHour = function getHour(date) {
- if (typeof language.bind(this)().getHour === 'function') {
- return language.bind(this)().getHour(date);
- }
- var hour = date.getHours();
- if (date.getMinutes() >= 25) {
- return (hour + 1) % 24;
- }
- return hour;
- };
- language = function language() {
- var matchingLanguages = uhrGlobals.languages.filter(function (element) {
- return (element.code === this.options.language);
- }, this);
- if (matchingLanguages.length > 0) {
- return matchingLanguages[0];
- }
- // fallback: return empty object
- return {};
- };
-
- $.widget("fritteli.uhr", {
- "options": {
- width: '100%',
- status: 'on',
- language: 'de_CH',
- theme: uhrGlobals.themes[0].styleClass,
- force: false,
- controls: true,
- cookiePath: undefined,
- autoresize: true,
- mode: 'normal'
- },
- "start": start,
- "stop": stop,
- "toggle": toggle,
- "language": setLanguage,
- "theme": setTheme,
- "time": setTime,
- "mode": setMode,
- "width": setWidth,
- // constructor method
- "_create": create,
- // destructor method
- "_destroy": destroy
- });
- $.fritteli.uhr.register = uhrGlobals.registerLanguage;
})(jQuery);
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var es_ist = {1: [1, 2, 4, 5, 6]};
var uhr = {10: [9, 10, 11]};
var nach = {4: [8, 9, 10, 11]};
@@ -889,22 +845,8 @@
};
$.fritteli.uhr.register('de', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
// hilfsvariablen
var es_isch = {1: [1, 2, 4, 5, 6, 7]};
var ab = {4: [1, 2]};
@@ -986,22 +928,8 @@
// Das Layout bei der Uhr unter dem Code "de_CH" registrieren.
$.fritteli.uhr.register('de_CH', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var es_isch = {1: [1, 2, 4, 5, 6, 7]};
var genau = {3: [7, 8, 9, 10, 11]};
var ab = {4: [4, 5]};
@@ -1058,7 +986,6 @@
};
$.fritteli.uhr.register('de_CH_genau', layout);
}(jQuery));
-
/*
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -1074,6 +1001,7 @@
along with this program. If not, see .
*/
(function($) {
+ 'use strict';
var klokken_er = {1: [1, 2, 3, 4, 5, 6, 7, 9, 10]};
var minutter = {4: [4, 5, 6, 7, 8, 9, 10, 11]};
@@ -1138,22 +1066,8 @@
};
$.fritteli.uhr.register('dk', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var it_is = {1: [1, 2, 4, 5]};
var half = {4: [1, 2, 3, 4]};
var to = {4: [10, 11]};
@@ -1219,22 +1133,8 @@
};
$.fritteli.uhr.register('en', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var es_la = {1: [1, 2, 6, 7]};
var son_las = {1: [2, 3, 4, 6, 7, 8]};
var y = {7: [6]};
@@ -1300,21 +1200,8 @@
$.fritteli.uhr.register('es', layout);
}(jQuery));
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var il_est = {1: [1, 2, 4, 5, 6]};
var et = {8: [1, 2]};
var moins = {7: [1, 2, 3, 4, 5]};
@@ -1414,22 +1301,8 @@
};
$.fritteli.uhr.register('fr', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var sono_le = {1: [1, 2, 3, 4, 6, 7]};
var e_l = {2: [1, 3, 4]};
var e = {8: [1]};
@@ -1494,22 +1367,8 @@
};
$.fritteli.uhr.register('it', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var het_is = {1: [1, 2, 3, 5, 6]};
var over1 = {3: [1, 2, 3, 4]};
var voor1 = {2: [8, 9, 10, 11]};
@@ -1575,22 +1434,8 @@
};
$.fritteli.uhr.register('nl', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function ($) {
+ 'use strict';
var e_ = {1: [1]};
var sao = {1: [2, 3, 4]};
var e1 = {7: [8]};
diff --git a/dist/jquery.uhr.complete.min.js b/dist/jquery.uhr.complete.min.js
index 9cb751b..e8b059f 100644
--- a/dist/jquery.uhr.complete.min.js
+++ b/dist/jquery.uhr.complete.min.js
@@ -1 +1,4 @@
-"use strict";var t,e,i,n,s,o,r;!function(t){var e,i,n,s={id:0,languages:[],themes:[],registerLanguage:function(t,e){s.languages.some((function(i){return t===i.code&&(console.error("Error: Language code '"+t+"' cannot be registered for language '"+e.language+"' because it is already registered for language '"+i.language+"'!"),!0)}))||(e.code=t,s.languages.push(e))}};t("link[rel=stylesheet]").each((function(e,i){var n=t(i),o=n.attr("data-class");if(void 0!==o){var r=n.attr("data-name");void 0===r&&(r=o),s.themes.push({styleClass:o,name:r})}})),0===s.themes.length&&s.themes.push({});var o;function r(t,e){var i=t,n=e||"";this.addStyle=function(t){""===n?n=t:n+=" "+t},this.toString=function(){return''+i+" "}}function a(t){var e={3:[2,3,4],4:[1,5],5:[1,4,5],6:[1,3,5],7:[1,2,5],8:[1,5],9:[2,3,4]},i={3:[8,9,10],4:[7,11],5:[7,10,11],6:[7,9,11],7:[7,8,11],8:[7,11],9:[8,9,10]},n={3:[3],4:[2,3],5:[3],6:[3],7:[3],8:[3],9:[2,3,4]},s={3:[9],4:[8,9],5:[9],6:[9],7:[9],8:[9],9:[8,9,10]},o={3:[2,3,4],4:[1,5],5:[5],6:[4],7:[3],8:[2],9:[1,2,3,4,5]},a={3:[8,9,10],4:[7,11],5:[11],6:[10],7:[9],8:[8],9:[7,8,9,10,11]},h={3:[1,2,3,4,5],4:[4],5:[3],6:[4],7:[5],8:[1,5],9:[2,3,4]},u={3:[7,8,9,10,11],4:[10],5:[9],6:[10],7:[11],8:[7,11],9:[8,9,10]},c={3:[4],4:[3,4],5:[2,4],6:[1,4],7:[1,2,3,4,5],8:[4],9:[4]},d={3:[10],4:[9,10],5:[8,10],6:[7,10],7:[7,8,9,10,11],8:[10],9:[10]},l={3:[1,2,3,4,5],4:[1],5:[1,2,3,4],6:[5],7:[5],8:[1,5],9:[2,3,4]},f={3:[7,8,9,10,11],4:[7],5:[7,8,9,10],6:[11],7:[11],8:[7,11],9:[8,9,10]},g={3:[9,10],4:[8],5:[7],6:[7,8,9,10],7:[7,11],8:[7,11],9:[8,9,10]},E={3:[7,8,9,10,11],4:[11],5:[10],6:[9],7:[8],8:[8],9:[8]},p={3:[8,9,10],4:[7,11],5:[7,11],6:[8,9,10],7:[7,11],8:[7,11],9:[8,9,10]},v={3:[8,9,10],4:[7,11],5:[7,11],6:[8,9,10,11],7:[11],8:[10],9:[8,9]},m={0:[e,i],1:[e,s],2:[e,a],3:[e,u],4:[e,d],5:[e,f],6:[e,g],7:[e,E],8:[e,p],9:[e,v],10:[n,i],11:[n,s],12:[n,a],13:[n,u],14:[n,d],15:[n,f],16:[n,g],17:[n,E],18:[n,p],19:[n,v],20:[o,i],21:[o,s],22:[o,a],23:[o,u],24:[o,d],25:[o,f],26:[o,g],27:[o,E],28:[o,p],29:[o,v],30:[h,i],31:[h,s],32:[h,a],33:[h,u],34:[h,d],35:[h,f],36:[h,g],37:[h,E],38:[h,p],39:[h,v],40:[c,i],41:[c,s],42:[c,a],43:[c,u],44:[c,d],45:[c,f],46:[c,g],47:[c,E],48:[c,p],49:[c,v],50:[l,i],51:[l,s],52:[l,a],53:[l,u],54:[l,d],55:[l,f],56:[l,g],57:[l,E],58:[l,p],59:[l,v]};function I(t,e,i){null!=i&&Object.keys(i).forEach((function(n){i[n].forEach((function(i){t[n-1][i-1].addStyle(e)}))}))}function b(t,e,i){null!=i&&(Array.isArray(i)?i.forEach((function(i){I(t,e,i)})):I(t,e,i))}function N(t,e,i){null!=i&&Object.keys(i).forEach((function(n){var s=n.split(","),o=i[n];s.forEach((function(i){b(t,e+i,o)}))}))}this.parse=function(){var e=[];return t.letters.forEach((function(t){for(var i=[],n=0;n")})),"function"==typeof i&&i(),e.fadeIn("fast")}))}}var u,c,d=function(t){this.options.mode=t,this.currentMinute=-1,n.bind(this)(),e.bind(this)("uhr-mode",t)},l=function(t){var e=this.element;e.css("width",t);var i=e.width();e.width(i),e.height(i),e.css("font-size",i/40+"px")},f=function(){t("#uhr-controlpanel"+this.id).toggle("fast")};u=function(){var e=this.element;if(e.addClass("uhr"),e.empty(),e.append(' '),e.append(' '),e.append(' '),e.append(' '),e.append('
'),e.append('
'),l.bind(this)(this.options.width),this.options.controls){var i=t('
'),n=t('
');i.append(n);var o=t('
');o.append(' '),o.append('
'),n.append(o);var r=t('
');if(r.append(' '),r.append('
'),n.append(r),s.languages.length>1){var a=t(' ');s.languages.forEach((function(t){a.append(''+t.language+" ")})),n.append(a)}if(s.themes.length>1){var h=t(' ');s.themes.forEach((function(t){h.append(''+t.name+" ")})),n.append(h)}var u=t(' ');u.on("click",function(){t("#uhr-controlpanel"+this.id).hide("fast")}.bind(this)),n.append(u),e.after(i),i.hide();var c=t(' ');c.on("click",function(){f.bind(this)()}.bind(this)),e.after(c)}},c=function(){var e=t("#uhr-onoffswitch-checkbox"+this.id);e.on("click",function(){this.toggle()}.bind(this));var i=t.cookie("uhr-status"+this.id);(void 0===i||this.options.force)&&(i=this.options.status),e.prop("checked","on"===i),"on"===i?this.start():this.stop();var n=t("#uhr-modeswitch-checkbox"+this.id);n.on("click",function(){"seconds"===this.options.mode?d.bind(this)("normal"):d.bind(this)("seconds")}.bind(this));var o=t.cookie("uhr-mode"+this.id);(void 0===o||this.options.force)&&(o=this.options.mode),n.prop("checked","seconds"!==o),"seconds"===o?d.bind(this)("seconds"):d.bind(this)("normal");var r=t("#uhr-languagechooser"+this.id);r.on("change",function(){var e=t("#uhr-languagechooser"+this.id).val();this.language(e)}.bind(this));var a=t.cookie("uhr-language"+this.id);(void 0===a||this.options.force)&&(a=this.options.language);var h,u=s.languages.some((function(t){return a===t.code}));u||(h=s.languages.length>0?s.languages[0].code:"",console.warn("Language '"+a+"' not found! Using fallback '"+h+"'"),a=h);r.val(a),this.options.language="",this.language(a);var c=t("#uhr-themechooser"+this.id);c.on("change",function(){var e=t("#uhr-themechooser"+this.id).val();this.theme(e)}.bind(this));var f=t.cookie("uhr-theme"+this.id);if((void 0===f||this.options.force)&&(f=this.options.theme),!(u=s.themes.some((function(t){return f===t.styleClass})))){var g=s.themes[0].styleClass;console.warn("Theme '"+f+"' not found! Using fallback '"+g+"'"),f=g}c.val(f),this.options.theme="",this.theme(f),this.options.autoresize&&t(window).on("resize",function(){var e=this.element.parent(),i=t(window),n=e.width(),s=e.height(),o=i.width(),r=i.height(),a=Math.min(n,s,o,r)+"px";l.bind(this)(a)}.bind(this))};var g,E,p,v,m,I,b;e=function(e,i){var n={};n=void 0!==this.options.cookiePath?{expires:365,path:this.options.cookiePath}:{expires:365},t.cookie(e+this.id,i,n)},i=function(){return null!==this.timer},n=function(){if(i.bind(this)()){var t=this.options.time;if(!o.bind(this)().hasOwnProperty("seconds")&&"seconds"!==this.options.mode){if(t.getMinutes()===this.currentMinute)return;this.currentMinute=t.getMinutes()}g.bind(this)(t)}else E.bind(this)(),this.currentMinute=-1},g=function(t){var e=v.bind(this)(t),i=m.bind(this)(t),n=b.bind(this)(t),s=I.bind(this)(t);if(E.bind(this)(),"seconds"===this.options.mode)p.bind(this)("second"+e);else{p.bind(this)("on");for(var o=1;o<=i;o++)p.bind(this)("dot"+o);p.bind(this)("minute"+s),p.bind(this)("hour"+n)}},p=function(t){this.element.find(".item."+t).addClass("active")},E=function(){this.element.find(".item").removeClass("active")},v=function(t){return"function"==typeof o.bind(this)().getSeconds?o.bind(this)().getSeconds(t):t.getSeconds()},m=function(t){return"function"==typeof o.bind(this)().getDotMinute?o.bind(this)().getDotMinute(t):t.getMinutes()%5},I=function(t){return"function"==typeof o.bind(this)().getCoarseMinute?o.bind(this)().getCoarseMinute(t):t.getMinutes()},b=function(t){if("function"==typeof o.bind(this)().getHour)return o.bind(this)().getHour(t);var e=t.getHours();return t.getMinutes()>=25?(e+1)%24:e},o=function(){var t=s.languages.filter((function(t){return t.code===this.options.language}),this);return t.length>0?t[0]:{}},t.widget("fritteli.uhr",{options:{width:"100%",status:"on",language:"de_CH",theme:s.themes[0].styleClass,force:!1,controls:!0,cookiePath:void 0,autoresize:!0,mode:"normal"},start:function(){i.bind(this)()||(this.timer=window.setInterval(function(){this.options.time=new Date,n.bind(this)()}.bind(this),1e3),n.bind(this)(),e.bind(this)("uhr-status","on"))},stop:function(){i.bind(this)()&&(window.clearInterval(this.timer),this.timer=null,n.bind(this)(),e.bind(this)("uhr-status","off"))},toggle:function(){i.bind(this)()?this.stop():this.start()},language:function(t){t!==this.options.language&&(this.options.language=t,new h(o.bind(this)(),this.element.find(".letterarea")).render.bind(this)(function(){this.currentMinute=-1,n.bind(this)()}.bind(this)),e.bind(this)("uhr-language",t),n.bind(this)())},theme:function(i){i!==this.options.theme&&(this.element.removeClass(this.options.theme).addClass(i),t("#uhr-onoffswitch"+this.id).removeClass(this.options.theme).addClass(i),this.options.theme=i,e.bind(this)("uhr-theme",i))},time:function(t){this.currentMinute=-1,null===t?this.options.time=new Date:(null!==this.timer&&window.clearInterval(this.timer),this.options.time=t),n.bind(this)()},mode:d,width:l,_create:function(){this.id=s.id++,this.timer=null,this.currentMinute=-1;var t,e=this.options.time;void 0===this.options.time&&(this.options.time=new Date),void 0!==(t=window.location.hash)&&"string"==typeof t&&"#"===t.charAt(0)&&(t=t.substring(1),(t=decodeURIComponent(t)).split("&").forEach(function(t){var e=t.split("="),i=e[0],n=e[1];switch(i){case"l":case"language":this.options.language=n,this.options.force=!0;break;case"t":case"theme":this.options.theme=n,this.options.force=!0;break;case"m":case"mode":this.options.mode=n,this.options.force=!0;break;case"s":case"status":this.options.status=n,this.options.force=!0}}.bind(this))),u.bind(this)(),c.bind(this)(),void 0!==e&&this.time(e)},_destroy:function(){this.timer=null,t(this.element).removeAttr("style").removeAttr("class").empty(),t("#uhr-configlink"+this.id).remove(),t("#uhr-controlpanel"+this.id).remove()}}),t.fritteli.uhr.register=s.registerLanguage}(jQuery),r={version:2,language:"Deutsch",letters:["ESKISTAFÜNF","ZEHNZWANZIG","DREIVIERTEL","VORFUNKNACH","HALBAELFÜNF","EINSXAMZWEI","DREIPMJVIER","SECHSNLACHT","SIEBENZWÖLF","ZEHNEUNKUHR"],permanent:{1:[1,2,4,5,6]},minutes:{"0,1,2,3,4":{10:[9,10,11]},"5,6,7,8,9":[n={1:[8,9,10,11]},t={4:[8,9,10,11]}],"10,11,12,13,14":[s={2:[1,2,3,4]},t],"15,16,17,18,19":[{3:[5,6,7,8,9,10,11]},t],"20,21,22,23,24":[o={2:[5,6,7,8,9,10,11]},t],"25,26,27,28,29":[n,e={4:[1,2,3]},i={5:[1,2,3,4]}],"30,31,32,33,34":i,"35,36,37,38,39":[n,t,i],"40,41,42,43,44":[o,e],"45,46,47,48,49":{3:[1,2,3,4,5,6,7,8,9,10,11]},"50,51,52,53,54":[s,e],"55,56,57,58,59":[n,e]},hours:{"0,12":{9:[7,8,9,10,11]},"1,13":{6:[1,2,3,4]},"2,14":{6:[8,9,10,11]},"3,15":{7:[1,2,3,4]},"4,16":{7:[8,9,10,11]},"5,17":{5:[8,9,10,11]},"6,18":{8:[1,2,3,4,5]},"7,19":{9:[1,2,3,4,5,6]},"8,20":{8:[8,9,10,11]},"9,21":{10:[4,5,6,7]},"10,22":{10:[1,2,3,4]},"11,23":{5:[6,7,8]}}},jQuery.fritteli.uhr.register("de",r),function(t){var e={4:[1,2]},i={3:[9,10,11]},n={4:[4,5,6,7,8]},s={1:[9,10,11]},o={2:[9,10,11]},r={2:[1,2,3,4,5,6]},a={3:[1,2,3,4,5,6]},h={version:2,language:"Bärndütsch",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGSIVOR","ABOHAUBIEGE","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:{1:[1,2,4,5,6,7]},minutes:{"5,6,7,8,9":[s,e],"10,11,12,13,14":[o,e],"15,16,17,18,19":[r,e],"20,21,22,23,24":[a,e],"25,26,27,28,29":[s,i,n],"30,31,32,33,34":n,"35,36,37,38,39":[s,e,n],"40,41,42,43,44":[a,i],"45,46,47,48,49":[r,i],"50,51,52,53,54":[o,i],"55,56,57,58,59":[s,i]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}};jQuery.fritteli.uhr.register("de_CH",h)}(),function(t){var e={4:[4,5]},i={4:[1,2,3]},n={4:[7,8,9,10,11]},s={1:[9,10,11]},o={2:[9,10,11]},r={2:[1,2,3,4,5,6]},a={3:[1,2,3,4,5,6]},h={version:2,language:"Bärndütsch (genau)",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGGENAU","VORABOHAUBI","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:{1:[1,2,4,5,6,7]},minutes:{0:{3:[7,8,9,10,11]},"5,6,7,8,9":[s,e],"10,11,12,13,14":[o,e],"15,16,17,18,19":[r,e],"20,21,22,23,24":[a,e],"25,26,27,28,29":[s,i,n],"30,31,32,33,34":n,"35,36,37,38,39":[s,e,n],"40,41,42,43,44":[a,i],"45,46,47,48,49":[r,i],"50,51,52,53,54":[o,i],"55,56,57,58,59":[s,i]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}};jQuery.fritteli.uhr.register("de_CH_genau",h)}(),function(t){var e={4:[4,5,6,7,8,9,10,11]},i={5:[8]},n={5:[4,5,6,7]},s={2:[1,2,3]},o={4:[1,2]},r={3:[4,5,6,7,8]},a={2:[4,5,6,7]},h={6:[8,9,10,11]},u={version:2,language:"Dansk",letters:["KLOKKENVERO","FEMTYVESKLA","OJEKVARTVAT","TIAMINUTTER","VEMOVERILMF","MONALISHALV","ETTOTREFIRE","FEMSEKSRSYV","OTTERNIMETI","ELLEVEATOLV"],permanent:{1:[1,2,3,4,5,6,7,9,10]},minutes:{"5,6,7,8,9":[s,e,n],"10,11,12,13,14":[o,e,n],"15,16,17,18,19":[r,n],"20,21,22,23,24":[a,e,n],"25,26,27,28,29":[s,e,i,h],"30,31,32,33,34":[h],"35,36,37,38,39":[s,e,n,h],"40,41,42,43,44":[a,e,i],"45,46,47,48,49":[r,i],"50,51,52,53,54":[o,e,i],"55,56,57,58,59":[s,e,i]},hours:{"0,12":{10:[8,9,10,11]},"1,13":{7:[1,2]},"2,14":{7:[3,4]},"3,15":{7:[5,6,7]},"4,16":{7:[8,9,10,11]},"5,17":{8:[1,2,3]},"6,18":{8:[4,5,6,7]},"7,19":{8:[9,10,11]},"8,20":{9:[1,2,3,4]},"9,21":{9:[6,7]},"10,22":{9:[10,11]},"11,23":{10:[1,2,3,4,5,6]}},getHour:function(t){var e=t.getHours();return t.getMinutes()>=25?(e+1)%24:e}};jQuery.fritteli.uhr.register("dk",u)}(),function(t){var e={4:[10,11]},i={5:[1,2,3,4]},n={3:[7,8,9,10]},s={4:[6,7,8]},o={2:[1,3,4,5,6,7,8,9]},r={3:[1,2,3,4,5,6]},a={3:[1,2,3,4,5,6,7,8,9,10]},h={version:2,language:"English",letters:["ITLISBFAMPM","ACQUARTERDC","TWENTYFIVEX","HALFBTENFTO","PASTERUNINE","ONESIXTHREE","FOURFIVETWO","EIGHTELEVEN","SEVENTWELVE","TENSO'CLOCK"],permanent:{1:[1,2,4,5]},minutes:{"0,1,2,3,4":{10:[5,6,7,8,9,10,11]},"5,6,7,8,9":[n,i],"10,11,12,13,14":[s,i],"15,16,17,18,19":[o,i],"20,21,22,23,24":[r,i],"25,26,27,28,29":[a,i],"30,31,32,33,34":[{4:[1,2,3,4]},i],"35,36,37,38,39":[a,e],"40,41,42,43,44":[r,e],"45,46,47,48,49":[o,e],"50,51,52,53,54":[s,e],"55,56,57,58,59":[n,e]},hours:{"0,12":{9:[6,7,8,9,10,11]},"1,13":{6:[1,2,3]},"2,14":{7:[9,10,11]},"3,15":{6:[7,8,9,10,11]},"4,16":{7:[1,2,3,4]},"5,17":{7:[5,6,7,8]},"6,18":{6:[4,5,6]},"7,19":{9:[1,2,3,4,5]},"8,20":{8:[1,2,3,4,5]},"9,21":{5:[8,9,10,11]},"10,22":{10:[1,2,3]},"11,23":{8:[6,7,8,9,10,11]}},getHour:function(t){var e=t.getHours();return t.getMinutes()>=35?(e+1)%24:e}};jQuery.fritteli.uhr.register("en",h)}(),function(t){var e={1:[2,3,4,6,7,8]},i={7:[6]},n={7:[7,8,9,10,11]},s={9:[7,8,9,10,11]},o={8:[8,9,10,11]},r={10:[6,7,8,9,10,11]},a={8:[2,3,4,5,6,7]},h={9:[1,2,3,4,5,6,7,8,9,10,11]},u={version:2,language:"Español",letters:["ESONELASUNA","DOSITRESORE","CUATROCINCO","SEISASIETEN","OCHONUEVEYO","LADIEZSONCE","DOCELYMENOS","OVEINTEDIEZ","VEINTICINCO","MEDIACUARTO"],permanent:[],minutes:{"5,6,7,8,9":[i,s],"10,11,12,13,14":[i,o],"15,16,17,18,19":[i,r],"20,21,22,23,24":[i,a],"25,26,27,28,29":[i,h],"30,31,32,33,34":[i,{10:[1,2,3,4,5]}],"35,36,37,38,39":[n,h],"40,41,42,43,44":[n,a],"45,46,47,48,49":[n,r],"50,51,52,53,54":[n,o],"55,56,57,58,59":[n,s]},hours:{"0,12":[e,{7:[1,2,3,4]}],"1,13":[{1:[1,2,6,7]},{1:[9,10,11]}],"2,14":[e,{2:[1,2,3]}],"3,15":[e,{2:[5,6,7,8]}],"4,16":[e,{3:[1,2,3,4,5,6]}],"5,17":[e,{3:[7,8,9,10,11]}],"6,18":[e,{4:[1,2,3,4]}],"7,19":[e,{4:[6,7,8,9,10]}],"8,20":[e,{5:[1,2,3,4]}],"9,21":[e,{5:[5,6,7,8,9]}],"10,22":[e,{6:[3,4,5,6]}],"11,23":[e,{6:[8,9,10,11]}]},getHour:function(t){var e=t.getHours();return t.getMinutes()>=35?(e+1)%24:e}};jQuery.fritteli.uhr.register("es",u)}(),function(t){var e={8:[1,2]},i={7:[1,2,3,4,5]},n={6:[6,7,8,9,10,11]},s={9:[7,8,9,10]},o={7:[9,10,11]},r={8:[4,5,6,7,8]},a={9:[1,2,3,4,5]},h={9:[1,2,3,4,5,6,7,8,9,10]},u={version:2,language:"Français",letters:["ILNESTODEUX","QUATRETROIS","NEUFUNESEPT","HUITSIXCINQ","MIDIXMINUIT","ONZERHEURES","MOINSOLEDIX","ETRQUARTPMD","VINGT-CINQU","ETSDEMIEPAM"],permanent:{1:[1,2,4,5,6]},minutes:{"5,6,7,8,9":s,"10,11,12,13,14":o,"15,16,17,18,19":[e,r],"20,21,22,23,24":a,"25,26,27,28,29":h,"30,31,32,33,34":[e,{10:[4,5,6,7,8]}],"35,36,37,38,39":[i,h],"40,41,42,43,44":[i,a],"45,46,47,48,49":[i,{7:[7,8]},r],"50,51,52,53,54":[i,o],"55,56,57,58,59":[i,s]},hours:{0:{5:[6,7,8,9,10,11]},"1,13":[{3:[5,6,7]},n],"2,14":[{1:[8,9,10,11]},n],"3,15":[{2:[7,8,9,10,11]},n],"4,16":[{2:[1,2,3,4,5,6]},n],"5,17":[{4:[8,9,10,11]},n],"6,18":[{4:[5,6,7]},n],"7,19":[{3:[8,9,10,11]},n],"8,20":[{4:[1,2,3,4]},n],"9,21":[{3:[1,2,3,4]},n],"10,22":[{5:[3,4,5]},n],"11,23":[{6:[1,2,3,4]},n],12:{5:[1,2,3,4]}},getHour:function(t){var e=t.getHours();return t.getMinutes()>=35?(e+1)%24:e}};jQuery.fritteli.uhr.register("fr",u)}(),function(t){var e={1:[1,2,3,4,6,7]},i={8:[1]},n={7:[8,9,10,11]},s={9:[6,7,8,9,10,11]},o={10:[1,2,3,4,5]},r={8:[3,4,6,7,8,9,10,11]},a={9:[1,2,3,4,5]},h={9:[1,2,3,4,5,6,7,8,9,10,11]},u={version:2,language:"Italiano",letters:["SONORLEBORE","ÈRL'UNASDUE","TREOTTONOVE","DIECIUNDICI","DODICISETTE","QUATTROCSEI","CINQUEAMENO","ECUNOQUARTO","VENTICINQUE","DIECIPMEZZA"],permanent:[],minutes:{"5,6,7,8,9":[i,s],"10,11,12,13,14":[i,o],"15,16,17,18,19":[i,r],"20,21,22,23,24":[i,a],"25,26,27,28,29":[i,h],"30,31,32,33,34":[i,{10:[7,8,9,10,11]}],"35,36,37,38,39":[n,h],"40,41,42,43,44":[n,a],"45,46,47,48,49":[n,r],"50,51,52,53,54":[n,o],"55,56,57,58,59":[n,s]},hours:{"0,12":[e,{5:[1,2,3,4,5,6]}],"1,13":[{2:[1,3,4]},{2:[5,6,7]}],"2,14":[e,{2:[9,10,11]}],"3,15":[e,{3:[1,2,3]}],"4,16":[e,{6:[1,2,3,4,5,6,7]}],"5,17":[e,{7:[1,2,3,4,5,6]}],"6,18":[e,{6:[9,10,11]}],"7,19":[e,{5:[7,8,9,10,11]}],"8,20":[e,{3:[4,5,6,7]}],"9,21":[e,{3:[8,9,10,11]}],"10,22":[e,{4:[1,2,3,4,5]}],"11,23":[e,{4:[6,7,8,9,10,11]}]},getHour:function(t){var e=t.getHours();return t.getMinutes()>=35?(e+1)%24:e}};jQuery.fritteli.uhr.register("it",u)}(),function(t){var e={3:[1,2,3,4]},i={2:[8,9,10,11]},n={4:[1,2,3,4]},s={1:[8,9,10,11]},o={2:[1,2,3,4]},r={3:[7,8,9,10,11]},a={version:2,language:"Nederlands",letters:["HETKISAVIJF","TIENBTZVOOR","OVERMEKWART","HALFSPWOVER","VOORTHGEENS","TWEEPVCDRIE","VIERVIJFZES","ZEVENONEGEN","ACHTTIENELF","TWAALFBFUUR"],permanent:{1:[1,2,3,5,6]},minutes:{"0,1,2,3,4":{10:[9,10,11]},"5,6,7,8,9":[s,e],"10,11,12,13,14":[o,e],"15,16,17,18,19":[r,{4:[8,9,10,11]}],"20,21,22,23,24":[o,i,n],"25,26,27,28,29":[s,i,n],"30,31,32,33,34":n,"35,36,37,38,39":[s,e,n],"40,41,42,43,44":[o,e,n],"45,46,47,48,49":[r,{5:[1,2,3,4]}],"50,51,52,53,54":[o,i],"55,56,57,58,59":[s,i]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[8,9,10]},"2,14":{6:[1,2,3,4]},"3,15":{6:[8,9,10,11]},"4,16":{7:[1,2,3,4]},"5,17":{7:[5,6,7,8]},"6,18":{7:[9,10,11]},"7,19":{8:[1,2,3,4,5]},"8,20":{9:[1,2,3,4]},"9,21":{8:[7,8,9,10,11]},"10,22":{9:[5,6,7,8]},"11,23":{9:[9,10,11]}},getHour:function(t){var e=t.getHours();return t.getMinutes()>=20?(e+1)%24:e}};jQuery.fritteli.uhr.register("nl",a)}(),function(t){var e={1:[1]},i={1:[2,3,4]},n={7:[8]},s={10:[5]},o={7:[7,8,9,10,11]},r={10:[7,8,9,10,11]},a={10:[1,2,3]},h={9:[1,2,4,5,6,7,8,9]},u={8:[1,2,3,4,5]},c={version:2,language:"Português",letters:["ÉSÃOUMATRÊS","MEIOLDIADEZ","DUASEISETEY","QUATROHNOVE","CINCOITONZE","ZMEIALNOITE","HORASYMENOS","VINTECAMEIA","UMVQUARTOPM","DEZOEYCINCO"],minutes:{"5,6,7,8,9":[n,r],"10,11,12,13,14":[n,a],"15,16,17,18,19":[n,h],"20,21,22,23,24":[n,u],"25,26,27,28,29":[n,u,s,r],"30,31,32,33,34":[n,{8:[8,9,10,11]}],"35,36,37,38,39":[o,u,s,r],"40,41,42,43,44":[o,u],"45,46,47,48,49":[o,h],"50,51,52,53,54":[o,a],"55,56,57,58,59":[o,r]},hours:{0:[e,{6:[2,3,4,5,7,8,9,10,11]}],12:[e,{2:[1,2,3,4,6,7,8]}],"1,13":[e,{1:[5,6,7]}],"2,14":[i,{3:[1,2,3,4]}],"3,15":[i,{1:[8,9,10,11]}],"4,16":[i,{4:[1,2,3,4,5,6]}],"5,17":[i,{5:[1,2,3,4,5]}],"6,18":[i,{3:[4,5,6,7]}],"7,19":[i,{3:[7,8,9,10]}],"8,20":[i,{5:[5,6,7,8]}],"9,21":[i,{4:[8,9,10,11]}],"10,22":[i,{2:[9,10,11]}],"11,23":[i,{5:[8,9,10,11]}]},getHour:function(t){var e=t.getHours();return t.getMinutes()>=35?(e+1)%24:e}};jQuery.fritteli.uhr.register("pt",c)}();
+/*! uhr - v8.0.4-dev.0 - 2016-06-27
+* http://bärneruhr.ch/
+* Copyright (c) 2016 Manuel Friedli; Licensed GPL-3.0 */
+!function(a){"use strict";function b(a,b){this.render=function(d){if(void 0===a.parsed)switch(a.version){case 2:var e=new c(a),f=e.parse();Object.defineProperty(a,"parsed",{value:f,writable:!1,configurable:!1});break;default:return void console.warn("Unknown layout version: '"+a.version+"'")}var g=a.parsed;b.fadeOut("fast",function(){b.empty(),g.forEach(function(a,c,d){a.forEach(function(a){b.append(a.toString())}),c ")}),"function"==typeof d&&d(),b.fadeIn("fast")})}}function c(a){function b(a,b,d){"undefined"!=typeof d&&null!==d&&(Array.isArray(d)?d.forEach(function(d){c(a,b,d)}):c(a,b,d))}function c(a,b,c){"undefined"!=typeof c&&null!==c&&Object.keys(c).forEach(function(d){var e=c[d];e.forEach(function(c){a[d-1][c-1].addStyle(b)})})}function e(a,c,d){"undefined"!=typeof d&&null!==d&&Object.keys(d).forEach(function(e){var f=e.split(","),g=d[e];f.forEach(function(d){b(a,c+d,g)})})}var f={3:[2,3,4],4:[1,5],5:[1,4,5],6:[1,3,5],7:[1,2,5],8:[1,5],9:[2,3,4]},g={3:[8,9,10],4:[7,11],5:[7,10,11],6:[7,9,11],7:[7,8,11],8:[7,11],9:[8,9,10]},h={3:[3],4:[2,3],5:[3],6:[3],7:[3],8:[3],9:[2,3,4]},i={3:[9],4:[8,9],5:[9],6:[9],7:[9],8:[9],9:[8,9,10]},j={3:[2,3,4],4:[1,5],5:[5],6:[4],7:[3],8:[2],9:[1,2,3,4,5]},k={3:[8,9,10],4:[7,11],5:[11],6:[10],7:[9],8:[8],9:[7,8,9,10,11]},l={3:[1,2,3,4,5],4:[4],5:[3],6:[4],7:[5],8:[1,5],9:[2,3,4]},m={3:[7,8,9,10,11],4:[10],5:[9],6:[10],7:[11],8:[7,11],9:[8,9,10]},n={3:[4],4:[3,4],5:[2,4],6:[1,4],7:[1,2,3,4,5],8:[4],9:[4]},o={3:[10],4:[9,10],5:[8,10],6:[7,10],7:[7,8,9,10,11],8:[10],9:[10]},p={3:[1,2,3,4,5],4:[1],5:[1,2,3,4],6:[5],7:[5],8:[1,5],9:[2,3,4]},q={3:[7,8,9,10,11],4:[7],5:[7,8,9,10],6:[11],7:[11],8:[7,11],9:[8,9,10]},r={3:[9,10],4:[8],5:[7],6:[7,8,9,10],7:[7,11],8:[7,11],9:[8,9,10]},s={3:[7,8,9,10,11],4:[11],5:[10],6:[9],7:[8],8:[8],9:[8]},t={3:[8,9,10],4:[7,11],5:[7,11],6:[8,9,10],7:[7,11],8:[7,11],9:[8,9,10]},u={3:[8,9,10],4:[7,11],5:[7,11],6:[8,9,10,11],7:[11],8:[10],9:[8,9]},v={0:[f,g],1:[f,i],2:[f,k],3:[f,m],4:[f,o],5:[f,q],6:[f,r],7:[f,s],8:[f,t],9:[f,u],10:[h,g],11:[h,i],12:[h,k],13:[h,m],14:[h,o],15:[h,q],16:[h,r],17:[h,s],18:[h,t],19:[h,u],20:[j,g],21:[j,i],22:[j,k],23:[j,m],24:[j,o],25:[j,q],26:[j,r],27:[j,s],28:[j,t],29:[j,u],30:[l,g],31:[l,i],32:[l,k],33:[l,m],34:[l,o],35:[l,q],36:[l,r],37:[l,s],38:[l,t],39:[l,u],40:[n,g],41:[n,i],42:[n,k],43:[n,m],44:[n,o],45:[n,q],46:[n,r],47:[n,s],48:[n,t],49:[n,u],50:[p,g],51:[p,i],52:[p,k],53:[p,m],54:[p,o],55:[p,q],56:[p,r],57:[p,s],58:[p,t],59:[p,u]};this.parse=function(){var c=[];return a.letters.forEach(function(a){for(var b=[],e=0;e'+c+""}}var e={id:0,languages:[],themes:[],registerLanguage:function(a,b){var c=e.languages.some(function(c){return a===c.code&&(console.error("Error: Language code '"+a+"' cannot be registered for language '"+b.language+"' because it is already registered for language '"+c.language+"'!"),!0)});c||(b.code=a,e.languages.push(b))}};a("link[rel=stylesheet]").each(function(b,c){var d=a(c),f=d.attr("data-class");if(void 0!==f){var g=d.attr("data-name");void 0===g&&(g=f),e.themes.push({styleClass:f,name:g})}}),0===e.themes.length&&e.themes.push({});var f=function(){t.bind(this)()||(this.timer=window.setInterval(function(){this.options.time=new Date,u.bind(this)()}.bind(this),1e3),u.bind(this)(),s.bind(this)("uhr-status","on"))},g=function(){t.bind(this)()&&(window.clearInterval(this.timer),this.timer=null,u.bind(this)(),s.bind(this)("uhr-status","off"))},h=function(){t.bind(this)()?this.stop():this.start()},i=function(a){if(a!==this.options.language){this.options.language=a;var c=new b(C.bind(this)(),this.element.find(".letterarea"));c.render.bind(this)(function(){this.currentMinute=-1,u.bind(this)()}.bind(this)),s.bind(this)("uhr-language",a),u.bind(this)()}},j=function(b){b!==this.options.theme&&(this.element.removeClass(this.options.theme).addClass(b),a("#uhr-onoffswitch"+this.id).removeClass(this.options.theme).addClass(b),this.options.theme=b,s.bind(this)("uhr-theme",b))},k=function(a){this.currentMinute=-1,null===a?this.options.time=new Date:(null!==this.timer&&window.clearInterval(this.timer),this.options.time=a),u.bind(this)()},l=function(a){this.options.mode=a,this.currentMinute=-1,u.bind(this)(),s.bind(this)("uhr-mode",a)},m=function(a){var b=this.element;b.css("width",a);var c=b.width();b.width(c),b.height(c),b.css("font-size",c/40+"px")},n=function(){this.id=e.id++,this.timer=null,this.currentMinute=-1;var a,b,c=this.options.time;void 0===this.options.time&&(this.options.time=new Date),a=window.location.hash,void 0!==a&&"string"==typeof a&&"#"===a.charAt(0)&&(a=a.substring(1),a=decodeURIComponent(a),b=a.split("&"),b.forEach(function(a){var b=a.split("="),c=b[0],d=b[1];switch(c){case"l":case"language":this.options.language=d,this.options.force=!0;break;case"t":case"theme":this.options.theme=d,this.options.force=!0;break;case"m":case"mode":this.options.mode=d,this.options.force=!0;break;case"s":case"status":this.options.status=d,this.options.force=!0}}.bind(this))),p.bind(this)(),q.bind(this)(),void 0!==c&&this.time(c)},o=function(){a("#uhr-controlpanel"+this.id).toggle("fast")},p=function(){var b=this.element;if(b.addClass("uhr"),b.empty(),b.append(' '),b.append(' '),b.append(' '),b.append(' '),b.append('
'),b.append('
'),m.bind(this)(this.options.width),this.options.controls){var c=a('
'),d=a('
');c.append(d);var f=a('
');f.append(' '),f.append('
'),d.append(f);var g=a('
');if(g.append(' '),g.append('
'),d.append(g),e.languages.length>1){var h=a(' ');e.languages.forEach(function(a){h.append(''+a.language+" ")}),d.append(h)}if(e.themes.length>1){var i=a(' ');e.themes.forEach(function(a){i.append(''+a.name+" ")}),d.append(i)}var j=a(' ');j.on("click",function(){a("#uhr-controlpanel"+this.id).hide("fast")}.bind(this)),d.append(j),b.after(c),c.hide();var k=a(' ');k.on("click",function(){o.bind(this)()}.bind(this)),b.after(k)}},q=function(){var b=a("#uhr-onoffswitch-checkbox"+this.id);b.on("click",function(){this.toggle()}.bind(this));var c=a.cookie("uhr-status"+this.id);(void 0===c||this.options.force)&&(c=this.options.status),b.prop("checked","on"===c),"on"===c?this.start():this.stop();var d=a("#uhr-modeswitch-checkbox"+this.id);d.on("click",function(){"seconds"===this.options.mode?l.bind(this)("normal"):l.bind(this)("seconds")}.bind(this));var f=a.cookie("uhr-mode"+this.id);(void 0===f||this.options.force)&&(f=this.options.mode),d.prop("checked","seconds"!==f),"seconds"===f?l.bind(this)("seconds"):l.bind(this)("normal");var g=a("#uhr-languagechooser"+this.id);g.on("change",function(){var b=a("#uhr-languagechooser"+this.id).val();this.language(b)}.bind(this));var h=a.cookie("uhr-language"+this.id);(void 0===h||this.options.force)&&(h=this.options.language);var i=e.languages.some(function(a){return h===a.code});if(!i){var j;j=e.languages.length>0?e.languages[0].code:"",console.warn("Language '"+h+"' not found! Using fallback '"+j+"'"),h=j}g.val(h),this.options.language="",this.language(h);var k=a("#uhr-themechooser"+this.id);k.on("change",function(){var b=a("#uhr-themechooser"+this.id).val();this.theme(b)}.bind(this));var n=a.cookie("uhr-theme"+this.id);if((void 0===n||this.options.force)&&(n=this.options.theme),i=e.themes.some(function(a){return n===a.styleClass}),!i){var o=e.themes[0].styleClass;console.warn("Theme '"+n+"' not found! Using fallback '"+o+"'"),n=o}k.val(n),this.options.theme="",this.theme(n),this.options.autoresize&&a(window).on("resize",function(){var b=this.element,c=b.parent(),d=a(window),e=c.width(),f=c.height(),g=d.width(),h=d.height(),i=Math.min(e,f,g,h)+"px";m.bind(this)(i)}.bind(this))},r=function(){this.timer=null,a(this.element).removeAttr("style").removeAttr("class").empty(),a("#uhr-configlink"+this.id).remove(),a("#uhr-controlpanel"+this.id).remove()},s=function(b,c){var d={};d=void 0!==this.options.cookiePath?{expires:365,path:this.options.cookiePath}:{expires:365},a.cookie(b+this.id,c,d)},t=function(){return null!==this.timer},u=function(){if(t.bind(this)()){var a=this.options.time;if(!C.bind(this)().hasOwnProperty("seconds")&&"seconds"!==this.options.mode){if(a.getMinutes()===this.currentMinute)return;this.currentMinute=a.getMinutes()}v.bind(this)(a)}else x.bind(this)(),this.currentMinute=-1},v=function(a){var b=y.bind(this)(a),c=z.bind(this)(a),d=B.bind(this)(a),e=A.bind(this)(a);if(x.bind(this)(),"seconds"===this.options.mode)w.bind(this)("second"+b);else{w.bind(this)("on");for(var f=1;f<=c;f++)w.bind(this)("dot"+f);w.bind(this)("minute"+e),w.bind(this)("hour"+d)}},w=function(a){this.element.find(".item."+a).addClass("active")},x=function(){this.element.find(".item").removeClass("active")},y=function(a){return"function"==typeof C.bind(this)().getSeconds?C.bind(this)().getSeconds(a):a.getSeconds()},z=function(a){if("function"==typeof C.bind(this)().getDotMinute)return C.bind(this)().getDotMinute(a);var b=a.getMinutes();return b%5},A=function(a){return"function"==typeof C.bind(this)().getCoarseMinute?C.bind(this)().getCoarseMinute(a):a.getMinutes()},B=function(a){if("function"==typeof C.bind(this)().getHour)return C.bind(this)().getHour(a);var b=a.getHours();return a.getMinutes()>=25?(b+1)%24:b},C=function(){var a=e.languages.filter(function(a){return a.code===this.options.language},this);return a.length>0?a[0]:{}};a.widget("fritteli.uhr",{options:{width:"100%",status:"on",language:"de_CH",theme:e.themes[0].styleClass,force:!1,controls:!0,cookiePath:void 0,autoresize:!0,mode:"normal"},start:f,stop:g,toggle:h,language:i,theme:j,time:k,mode:l,width:m,_create:n,_destroy:r}),a.fritteli.uhr.register=e.registerLanguage}(jQuery),function(a){"use strict";var b={1:[1,2,4,5,6]},c={10:[9,10,11]},d={4:[8,9,10,11]},e={4:[1,2,3]},f={5:[1,2,3,4]},g={1:[8,9,10,11]},h={2:[1,2,3,4]},i={3:[5,6,7,8,9,10,11]},j={2:[5,6,7,8,9,10,11]},k={3:[1,2,3,4,5,6,7,8,9,10,11]},l={version:2,language:"Deutsch",letters:["ESKISTAFÜNF","ZEHNZWANZIG","DREIVIERTEL","VORFUNKNACH","HALBAELFÜNF","EINSXAMZWEI","DREIPMJVIER","SECHSNLACHT","SIEBENZWÖLF","ZEHNEUNKUHR"],permanent:b,minutes:{"0,1,2,3,4":c,"5,6,7,8,9":[g,d],"10,11,12,13,14":[h,d],"15,16,17,18,19":[i,d],"20,21,22,23,24":[j,d],"25,26,27,28,29":[g,e,f],"30,31,32,33,34":f,"35,36,37,38,39":[g,d,f],"40,41,42,43,44":[j,e],"45,46,47,48,49":k,"50,51,52,53,54":[h,e],"55,56,57,58,59":[g,e]},hours:{"0,12":{9:[7,8,9,10,11]},"1,13":{6:[1,2,3,4]},"2,14":{6:[8,9,10,11]},"3,15":{7:[1,2,3,4]},"4,16":{7:[8,9,10,11]},"5,17":{5:[8,9,10,11]},"6,18":{8:[1,2,3,4,5]},"7,19":{9:[1,2,3,4,5,6]},"8,20":{8:[8,9,10,11]},"9,21":{10:[4,5,6,7]},"10,22":{10:[1,2,3,4]},"11,23":{5:[6,7,8]}}};a.fritteli.uhr.register("de",l)}(jQuery),function(a){"use strict";var b={1:[1,2,4,5,6,7]},c={4:[1,2]},d={3:[9,10,11]},e={4:[4,5,6,7,8]},f={1:[9,10,11]},g={2:[9,10,11]},h={2:[1,2,3,4,5,6]},i={3:[1,2,3,4,5,6]},j={version:2,language:"Bärndütsch",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGSIVOR","ABOHAUBIEGE","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:b,minutes:{"5,6,7,8,9":[f,c],"10,11,12,13,14":[g,c],"15,16,17,18,19":[h,c],"20,21,22,23,24":[i,c],"25,26,27,28,29":[f,d,e],"30,31,32,33,34":e,"35,36,37,38,39":[f,c,e],"40,41,42,43,44":[i,d],"45,46,47,48,49":[h,d],"50,51,52,53,54":[g,d],"55,56,57,58,59":[f,d]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}};a.fritteli.uhr.register("de_CH",j)}(jQuery),function(a){"use strict";var b={1:[1,2,4,5,6,7]},c={3:[7,8,9,10,11]},d={4:[4,5]},e={4:[1,2,3]},f={4:[7,8,9,10,11]},g={1:[9,10,11]},h={2:[9,10,11]},i={2:[1,2,3,4,5,6]},j={3:[1,2,3,4,5,6]},k={version:2,language:"Bärndütsch (genau)",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGGENAU","VORABOHAUBI","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:b,minutes:{0:c,"5,6,7,8,9":[g,d],"10,11,12,13,14":[h,d],"15,16,17,18,19":[i,d],"20,21,22,23,24":[j,d],"25,26,27,28,29":[g,e,f],"30,31,32,33,34":f,"35,36,37,38,39":[g,d,f],"40,41,42,43,44":[j,e],"45,46,47,48,49":[i,e],"50,51,52,53,54":[h,e],"55,56,57,58,59":[g,e]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}};a.fritteli.uhr.register("de_CH_genau",k)}(jQuery),function(a){"use strict";var b={1:[1,2,3,4,5,6,7,9,10]},c={4:[4,5,6,7,8,9,10,11]},d={5:[8]},e={5:[4,5,6,7]},f={2:[1,2,3]},g={4:[1,2]},h={3:[4,5,6,7,8]},i={2:[4,5,6,7]},j={6:[8,9,10,11]},k={version:2,language:"Dansk",letters:["KLOKKENVERO","FEMTYVESKLA","OJEKVARTVAT","TIAMINUTTER","VEMOVERILMF","MONALISHALV","ETTOTREFIRE","FEMSEKSRSYV","OTTERNIMETI","ELLEVEATOLV"],permanent:b,minutes:{"5,6,7,8,9":[f,c,e],"10,11,12,13,14":[g,c,e],"15,16,17,18,19":[h,e],"20,21,22,23,24":[i,c,e],"25,26,27,28,29":[f,c,d,j],"30,31,32,33,34":[j],"35,36,37,38,39":[f,c,e,j],"40,41,42,43,44":[i,c,d],"45,46,47,48,49":[h,d],"50,51,52,53,54":[g,c,d],"55,56,57,58,59":[f,c,d]},hours:{"0,12":{10:[8,9,10,11]},"1,13":{7:[1,2]},"2,14":{7:[3,4]},"3,15":{7:[5,6,7]},"4,16":{7:[8,9,10,11]},"5,17":{8:[1,2,3]},"6,18":{8:[4,5,6,7]},"7,19":{8:[9,10,11]},"8,20":{9:[1,2,3,4]},"9,21":{9:[6,7]},"10,22":{9:[10,11]},"11,23":{10:[1,2,3,4,5,6]}},getHour:function(a){var b=a.getHours();return a.getMinutes()>=25?(b+1)%24:b}};a.fritteli.uhr.register("dk",k)}(jQuery),function(a){"use strict";var b={1:[1,2,4,5]},c={4:[1,2,3,4]},d={4:[10,11]},e={5:[1,2,3,4]},f={10:[5,6,7,8,9,10,11]},g={3:[7,8,9,10]},h={4:[6,7,8]},i={2:[1,3,4,5,6,7,8,9]},j={3:[1,2,3,4,5,6]},k={3:[1,2,3,4,5,6,7,8,9,10]},l={version:2,language:"English",letters:["ITLISBFAMPM","ACQUARTERDC","TWENTYFIVEX","HALFBTENFTO","PASTERUNINE","ONESIXTHREE","FOURFIVETWO","EIGHTELEVEN","SEVENTWELVE","TENSO'CLOCK"],permanent:b,minutes:{"0,1,2,3,4":f,"5,6,7,8,9":[g,e],"10,11,12,13,14":[h,e],"15,16,17,18,19":[i,e],"20,21,22,23,24":[j,e],"25,26,27,28,29":[k,e],"30,31,32,33,34":[c,e],"35,36,37,38,39":[k,d],"40,41,42,43,44":[j,d],"45,46,47,48,49":[i,d],"50,51,52,53,54":[h,d],"55,56,57,58,59":[g,d]},hours:{"0,12":{9:[6,7,8,9,10,11]},"1,13":{6:[1,2,3]},"2,14":{7:[9,10,11]},"3,15":{6:[7,8,9,10,11]},"4,16":{7:[1,2,3,4]},"5,17":{7:[5,6,7,8]},"6,18":{6:[4,5,6]},"7,19":{9:[1,2,3,4,5]},"8,20":{8:[1,2,3,4,5]},"9,21":{5:[8,9,10,11]},"10,22":{10:[1,2,3]},"11,23":{8:[6,7,8,9,10,11]}},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("en",l)}(jQuery),function(a){"use strict";var b={1:[1,2,6,7]},c={1:[2,3,4,6,7,8]},d={7:[6]},e={7:[7,8,9,10,11]},f={10:[1,2,3,4,5]},g={9:[7,8,9,10,11]},h={8:[8,9,10,11]},i={10:[6,7,8,9,10,11]},j={8:[2,3,4,5,6,7]},k={9:[1,2,3,4,5,6,7,8,9,10,11]},l={version:2,language:"Español",letters:["ESONELASUNA","DOSITRESORE","CUATROCINCO","SEISASIETEN","OCHONUEVEYO","LADIEZSONCE","DOCELYMENOS","OVEINTEDIEZ","VEINTICINCO","MEDIACUARTO"],permanent:[],minutes:{"5,6,7,8,9":[d,g],"10,11,12,13,14":[d,h],"15,16,17,18,19":[d,i],"20,21,22,23,24":[d,j],"25,26,27,28,29":[d,k],"30,31,32,33,34":[d,f],"35,36,37,38,39":[e,k],"40,41,42,43,44":[e,j],"45,46,47,48,49":[e,i],"50,51,52,53,54":[e,h],"55,56,57,58,59":[e,g]},hours:{"0,12":[c,{7:[1,2,3,4]}],"1,13":[b,{1:[9,10,11]}],"2,14":[c,{2:[1,2,3]}],"3,15":[c,{2:[5,6,7,8]}],"4,16":[c,{3:[1,2,3,4,5,6]}],"5,17":[c,{3:[7,8,9,10,11]}],"6,18":[c,{4:[1,2,3,4]}],"7,19":[c,{4:[6,7,8,9,10]}],"8,20":[c,{5:[1,2,3,4]}],"9,21":[c,{5:[5,6,7,8,9]}],"10,22":[c,{6:[3,4,5,6]}],"11,23":[c,{6:[8,9,10,11]}]},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("es",l)}(jQuery),function(a){"use strict";var b={1:[1,2,4,5,6]},c={8:[1,2]},d={7:[1,2,3,4,5]},e={10:[4,5,6,7,8]},f={6:[6,7,8,9,10,11]},g={7:[7,8]},h={9:[7,8,9,10]},i={7:[9,10,11]},j={8:[4,5,6,7,8]},k={9:[1,2,3,4,5]},l={9:[1,2,3,4,5,6,7,8,9,10]},m={version:2,language:"Français",letters:["ILNESTODEUX","QUATRETROIS","NEUFUNESEPT","HUITSIXCINQ","MIDIXMINUIT","ONZERHEURES","MOINSOLEDIX","ETRQUARTPMD","VINGT-CINQU","ETSDEMIEPAM"],permanent:b,minutes:{"5,6,7,8,9":h,"10,11,12,13,14":i,"15,16,17,18,19":[c,j],"20,21,22,23,24":k,"25,26,27,28,29":l,"30,31,32,33,34":[c,e],"35,36,37,38,39":[d,l],"40,41,42,43,44":[d,k],"45,46,47,48,49":[d,g,j],"50,51,52,53,54":[d,i],"55,56,57,58,59":[d,h]},hours:{0:{5:[6,7,8,9,10,11]},"1,13":[{3:[5,6,7]},f],"2,14":[{1:[8,9,10,11]},f],"3,15":[{2:[7,8,9,10,11]},f],"4,16":[{2:[1,2,3,4,5,6]},f],"5,17":[{4:[8,9,10,11]},f],"6,18":[{4:[5,6,7]},f],"7,19":[{3:[8,9,10,11]},f],"8,20":[{4:[1,2,3,4]},f],"9,21":[{3:[1,2,3,4]},f],"10,22":[{5:[3,4,5]},f],"11,23":[{6:[1,2,3,4]},f],12:{5:[1,2,3,4]}},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("fr",m)}(jQuery),function(a){"use strict";var b={1:[1,2,3,4,6,7]},c={2:[1,3,4]},d={8:[1]},e={7:[8,9,10,11]},f={10:[7,8,9,10,11]},g={9:[6,7,8,9,10,11]},h={10:[1,2,3,4,5]},i={8:[3,4,6,7,8,9,10,11]},j={9:[1,2,3,4,5]},k={9:[1,2,3,4,5,6,7,8,9,10,11]},l={version:2,language:"Italiano",letters:["SONORLEBORE","ÈRL'UNASDUE","TREOTTONOVE","DIECIUNDICI","DODICISETTE","QUATTROCSEI","CINQUEAMENO","ECUNOQUARTO","VENTICINQUE","DIECIPMEZZA"],permanent:[],minutes:{"5,6,7,8,9":[d,g],"10,11,12,13,14":[d,h],"15,16,17,18,19":[d,i],"20,21,22,23,24":[d,j],"25,26,27,28,29":[d,k],"30,31,32,33,34":[d,f],"35,36,37,38,39":[e,k],"40,41,42,43,44":[e,j],"45,46,47,48,49":[e,i],"50,51,52,53,54":[e,h],"55,56,57,58,59":[e,g]},hours:{"0,12":[b,{5:[1,2,3,4,5,6]}],"1,13":[c,{2:[5,6,7]}],"2,14":[b,{2:[9,10,11]}],"3,15":[b,{3:[1,2,3]}],"4,16":[b,{6:[1,2,3,4,5,6,7]}],"5,17":[b,{7:[1,2,3,4,5,6]}],"6,18":[b,{6:[9,10,11]}],"7,19":[b,{5:[7,8,9,10,11]}],"8,20":[b,{3:[4,5,6,7]}],"9,21":[b,{3:[8,9,10,11]}],"10,22":[b,{4:[1,2,3,4,5]}],"11,23":[b,{4:[6,7,8,9,10,11]}]},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("it",l)}(jQuery),function(a){"use strict";var b={1:[1,2,3,5,6]},c={3:[1,2,3,4]},d={2:[8,9,10,11]},e={4:[8,9,10,11]},f={5:[1,2,3,4]},g={4:[1,2,3,4]},h={1:[8,9,10,11]},i={2:[1,2,3,4]},j={3:[7,8,9,10,11]},k={10:[9,10,11]},l={version:2,language:"Nederlands",letters:["HETKISAVIJF","TIENBTZVOOR","OVERMEKWART","HALFSPWOVER","VOORTHGEENS","TWEEPVCDRIE","VIERVIJFZES","ZEVENONEGEN","ACHTTIENELF","TWAALFBFUUR"],permanent:b,minutes:{"0,1,2,3,4":k,"5,6,7,8,9":[h,c],"10,11,12,13,14":[i,c],"15,16,17,18,19":[j,e],"20,21,22,23,24":[i,d,g],"25,26,27,28,29":[h,d,g],"30,31,32,33,34":g,"35,36,37,38,39":[h,c,g],"40,41,42,43,44":[i,c,g],"45,46,47,48,49":[j,f],"50,51,52,53,54":[i,d],"55,56,57,58,59":[h,d]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[8,9,10]},"2,14":{6:[1,2,3,4]},"3,15":{6:[8,9,10,11]},"4,16":{7:[1,2,3,4]},"5,17":{7:[5,6,7,8]},"6,18":{7:[9,10,11]},"7,19":{8:[1,2,3,4,5]},"8,20":{9:[1,2,3,4]},"9,21":{8:[7,8,9,10,11]},"10,22":{9:[5,6,7,8]},"11,23":{9:[9,10,11]}},getHour:function(a){var b=a.getHours();return a.getMinutes()>=20?(b+1)%24:b}};a.fritteli.uhr.register("nl",l)}(jQuery),function(a){"use strict";var b={1:[1]},c={1:[2,3,4]},d={7:[8]},e={10:[5]},f={7:[7,8,9,10,11]},g={8:[8,9,10,11]},h={10:[7,8,9,10,11]},i={10:[1,2,3]},j={9:[1,2,4,5,6,7,8,9]},k={8:[1,2,3,4,5]},l={version:2,language:"Português",letters:["ÉSÃOUMATRÊS","MEIOLDIADEZ","DUASEISETEY","QUATROHNOVE","CINCOITONZE","ZMEIALNOITE","HORASYMENOS","VINTECAMEIA","UMVQUARTOPM","DEZOEYCINCO"],minutes:{"5,6,7,8,9":[d,h],"10,11,12,13,14":[d,i],"15,16,17,18,19":[d,j],"20,21,22,23,24":[d,k],"25,26,27,28,29":[d,k,e,h],"30,31,32,33,34":[d,g],"35,36,37,38,39":[f,k,e,h],"40,41,42,43,44":[f,k],"45,46,47,48,49":[f,j],"50,51,52,53,54":[f,i],"55,56,57,58,59":[f,h]},hours:{0:[b,{6:[2,3,4,5,7,8,9,10,11]}],12:[b,{2:[1,2,3,4,6,7,8]}],"1,13":[b,{1:[5,6,7]}],"2,14":[c,{3:[1,2,3,4]}],"3,15":[c,{1:[8,9,10,11]}],"4,16":[c,{4:[1,2,3,4,5,6]}],"5,17":[c,{5:[1,2,3,4,5]}],"6,18":[c,{3:[4,5,6,7]}],"7,19":[c,{3:[7,8,9,10]}],"8,20":[c,{5:[5,6,7,8]}],"9,21":[c,{4:[8,9,10,11]}],"10,22":[c,{2:[9,10,11]}],"11,23":[c,{5:[8,9,10,11]}]},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("pt",l)}(jQuery);
\ No newline at end of file
diff --git a/dist/jquery.uhr.langs.js b/dist/jquery.uhr.langs.js
index 8c857a4..a8ab4c2 100644
--- a/dist/jquery.uhr.langs.js
+++ b/dist/jquery.uhr.langs.js
@@ -1,20 +1,8 @@
-'use strict';
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
+/*! uhr - v8.0.4-dev.0 - 2016-06-27
+* http://bärneruhr.ch/
+* Copyright (c) 2016 Manuel Friedli; Licensed GPL-3.0 */
(function($) {
+ 'use strict';
var es_ist = {1: [1, 2, 4, 5, 6]};
var uhr = {10: [9, 10, 11]};
var nach = {4: [8, 9, 10, 11]};
@@ -73,22 +61,8 @@
};
$.fritteli.uhr.register('de', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
// hilfsvariablen
var es_isch = {1: [1, 2, 4, 5, 6, 7]};
var ab = {4: [1, 2]};
@@ -170,22 +144,8 @@
// Das Layout bei der Uhr unter dem Code "de_CH" registrieren.
$.fritteli.uhr.register('de_CH', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var es_isch = {1: [1, 2, 4, 5, 6, 7]};
var genau = {3: [7, 8, 9, 10, 11]};
var ab = {4: [4, 5]};
@@ -242,7 +202,6 @@
};
$.fritteli.uhr.register('de_CH_genau', layout);
}(jQuery));
-
/*
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -258,6 +217,7 @@
along with this program. If not, see .
*/
(function($) {
+ 'use strict';
var klokken_er = {1: [1, 2, 3, 4, 5, 6, 7, 9, 10]};
var minutter = {4: [4, 5, 6, 7, 8, 9, 10, 11]};
@@ -322,22 +282,8 @@
};
$.fritteli.uhr.register('dk', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var it_is = {1: [1, 2, 4, 5]};
var half = {4: [1, 2, 3, 4]};
var to = {4: [10, 11]};
@@ -403,22 +349,8 @@
};
$.fritteli.uhr.register('en', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var es_la = {1: [1, 2, 6, 7]};
var son_las = {1: [2, 3, 4, 6, 7, 8]};
var y = {7: [6]};
@@ -484,21 +416,8 @@
$.fritteli.uhr.register('es', layout);
}(jQuery));
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var il_est = {1: [1, 2, 4, 5, 6]};
var et = {8: [1, 2]};
var moins = {7: [1, 2, 3, 4, 5]};
@@ -598,22 +517,8 @@
};
$.fritteli.uhr.register('fr', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var sono_le = {1: [1, 2, 3, 4, 6, 7]};
var e_l = {2: [1, 3, 4]};
var e = {8: [1]};
@@ -678,22 +583,8 @@
};
$.fritteli.uhr.register('it', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function($) {
+ 'use strict';
var het_is = {1: [1, 2, 3, 5, 6]};
var over1 = {3: [1, 2, 3, 4]};
var voor1 = {2: [8, 9, 10, 11]};
@@ -759,22 +650,8 @@
};
$.fritteli.uhr.register('nl', layout);
}(jQuery));
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
(function ($) {
+ 'use strict';
var e_ = {1: [1]};
var sao = {1: [2, 3, 4]};
var e1 = {7: [8]};
diff --git a/dist/jquery.uhr.langs.min.js b/dist/jquery.uhr.langs.min.js
index 4841912..cad339c 100644
--- a/dist/jquery.uhr.langs.min.js
+++ b/dist/jquery.uhr.langs.min.js
@@ -1 +1,4 @@
-"use strict";var e,E,r,t,I,n,u;u={version:2,language:"Deutsch",letters:["ESKISTAFÜNF","ZEHNZWANZIG","DREIVIERTEL","VORFUNKNACH","HALBAELFÜNF","EINSXAMZWEI","DREIPMJVIER","SECHSNLACHT","SIEBENZWÖLF","ZEHNEUNKUHR"],permanent:{1:[1,2,4,5,6]},minutes:{"0,1,2,3,4":{10:[9,10,11]},"5,6,7,8,9":[t={1:[8,9,10,11]},e={4:[8,9,10,11]}],"10,11,12,13,14":[I={2:[1,2,3,4]},e],"15,16,17,18,19":[{3:[5,6,7,8,9,10,11]},e],"20,21,22,23,24":[n={2:[5,6,7,8,9,10,11]},e],"25,26,27,28,29":[t,E={4:[1,2,3]},r={5:[1,2,3,4]}],"30,31,32,33,34":r,"35,36,37,38,39":[t,e,r],"40,41,42,43,44":[n,E],"45,46,47,48,49":{3:[1,2,3,4,5,6,7,8,9,10,11]},"50,51,52,53,54":[I,E],"55,56,57,58,59":[t,E]},hours:{"0,12":{9:[7,8,9,10,11]},"1,13":{6:[1,2,3,4]},"2,14":{6:[8,9,10,11]},"3,15":{7:[1,2,3,4]},"4,16":{7:[8,9,10,11]},"5,17":{5:[8,9,10,11]},"6,18":{8:[1,2,3,4,5]},"7,19":{9:[1,2,3,4,5,6]},"8,20":{8:[8,9,10,11]},"9,21":{10:[4,5,6,7]},"10,22":{10:[1,2,3,4]},"11,23":{5:[6,7,8]}}},jQuery.fritteli.uhr.register("de",u),function(e){var E={4:[1,2]},r={3:[9,10,11]},t={4:[4,5,6,7,8]},I={1:[9,10,11]},n={2:[9,10,11]},u={2:[1,2,3,4,5,6]},i={3:[1,2,3,4,5,6]},N={version:2,language:"Bärndütsch",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGSIVOR","ABOHAUBIEGE","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:{1:[1,2,4,5,6,7]},minutes:{"5,6,7,8,9":[I,E],"10,11,12,13,14":[n,E],"15,16,17,18,19":[u,E],"20,21,22,23,24":[i,E],"25,26,27,28,29":[I,r,t],"30,31,32,33,34":t,"35,36,37,38,39":[I,E,t],"40,41,42,43,44":[i,r],"45,46,47,48,49":[u,r],"50,51,52,53,54":[n,r],"55,56,57,58,59":[I,r]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}};jQuery.fritteli.uhr.register("de_CH",N)}(),function(e){var E={4:[4,5]},r={4:[1,2,3]},t={4:[7,8,9,10,11]},I={1:[9,10,11]},n={2:[9,10,11]},u={2:[1,2,3,4,5,6]},i={3:[1,2,3,4,5,6]},N={version:2,language:"Bärndütsch (genau)",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGGENAU","VORABOHAUBI","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:{1:[1,2,4,5,6,7]},minutes:{0:{3:[7,8,9,10,11]},"5,6,7,8,9":[I,E],"10,11,12,13,14":[n,E],"15,16,17,18,19":[u,E],"20,21,22,23,24":[i,E],"25,26,27,28,29":[I,r,t],"30,31,32,33,34":t,"35,36,37,38,39":[I,E,t],"40,41,42,43,44":[i,r],"45,46,47,48,49":[u,r],"50,51,52,53,54":[n,r],"55,56,57,58,59":[I,r]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}};jQuery.fritteli.uhr.register("de_CH_genau",N)}(),function(e){var E={4:[4,5,6,7,8,9,10,11]},r={5:[8]},t={5:[4,5,6,7]},I={2:[1,2,3]},n={4:[1,2]},u={3:[4,5,6,7,8]},i={2:[4,5,6,7]},N={6:[8,9,10,11]},s={version:2,language:"Dansk",letters:["KLOKKENVERO","FEMTYVESKLA","OJEKVARTVAT","TIAMINUTTER","VEMOVERILMF","MONALISHALV","ETTOTREFIRE","FEMSEKSRSYV","OTTERNIMETI","ELLEVEATOLV"],permanent:{1:[1,2,3,4,5,6,7,9,10]},minutes:{"5,6,7,8,9":[I,E,t],"10,11,12,13,14":[n,E,t],"15,16,17,18,19":[u,t],"20,21,22,23,24":[i,E,t],"25,26,27,28,29":[I,E,r,N],"30,31,32,33,34":[N],"35,36,37,38,39":[I,E,t,N],"40,41,42,43,44":[i,E,r],"45,46,47,48,49":[u,r],"50,51,52,53,54":[n,E,r],"55,56,57,58,59":[I,E,r]},hours:{"0,12":{10:[8,9,10,11]},"1,13":{7:[1,2]},"2,14":{7:[3,4]},"3,15":{7:[5,6,7]},"4,16":{7:[8,9,10,11]},"5,17":{8:[1,2,3]},"6,18":{8:[4,5,6,7]},"7,19":{8:[9,10,11]},"8,20":{9:[1,2,3,4]},"9,21":{9:[6,7]},"10,22":{9:[10,11]},"11,23":{10:[1,2,3,4,5,6]}},getHour:function(e){var E=e.getHours();return e.getMinutes()>=25?(E+1)%24:E}};jQuery.fritteli.uhr.register("dk",s)}(),function(e){var E={4:[10,11]},r={5:[1,2,3,4]},t={3:[7,8,9,10]},I={4:[6,7,8]},n={2:[1,3,4,5,6,7,8,9]},u={3:[1,2,3,4,5,6]},i={3:[1,2,3,4,5,6,7,8,9,10]},N={version:2,language:"English",letters:["ITLISBFAMPM","ACQUARTERDC","TWENTYFIVEX","HALFBTENFTO","PASTERUNINE","ONESIXTHREE","FOURFIVETWO","EIGHTELEVEN","SEVENTWELVE","TENSO'CLOCK"],permanent:{1:[1,2,4,5]},minutes:{"0,1,2,3,4":{10:[5,6,7,8,9,10,11]},"5,6,7,8,9":[t,r],"10,11,12,13,14":[I,r],"15,16,17,18,19":[n,r],"20,21,22,23,24":[u,r],"25,26,27,28,29":[i,r],"30,31,32,33,34":[{4:[1,2,3,4]},r],"35,36,37,38,39":[i,E],"40,41,42,43,44":[u,E],"45,46,47,48,49":[n,E],"50,51,52,53,54":[I,E],"55,56,57,58,59":[t,E]},hours:{"0,12":{9:[6,7,8,9,10,11]},"1,13":{6:[1,2,3]},"2,14":{7:[9,10,11]},"3,15":{6:[7,8,9,10,11]},"4,16":{7:[1,2,3,4]},"5,17":{7:[5,6,7,8]},"6,18":{6:[4,5,6]},"7,19":{9:[1,2,3,4,5]},"8,20":{8:[1,2,3,4,5]},"9,21":{5:[8,9,10,11]},"10,22":{10:[1,2,3]},"11,23":{8:[6,7,8,9,10,11]}},getHour:function(e){var E=e.getHours();return e.getMinutes()>=35?(E+1)%24:E}};jQuery.fritteli.uhr.register("en",N)}(),function(e){var E={1:[2,3,4,6,7,8]},r={7:[6]},t={7:[7,8,9,10,11]},I={9:[7,8,9,10,11]},n={8:[8,9,10,11]},u={10:[6,7,8,9,10,11]},i={8:[2,3,4,5,6,7]},N={9:[1,2,3,4,5,6,7,8,9,10,11]},s={version:2,language:"Español",letters:["ESONELASUNA","DOSITRESORE","CUATROCINCO","SEISASIETEN","OCHONUEVEYO","LADIEZSONCE","DOCELYMENOS","OVEINTEDIEZ","VEINTICINCO","MEDIACUARTO"],permanent:[],minutes:{"5,6,7,8,9":[r,I],"10,11,12,13,14":[r,n],"15,16,17,18,19":[r,u],"20,21,22,23,24":[r,i],"25,26,27,28,29":[r,N],"30,31,32,33,34":[r,{10:[1,2,3,4,5]}],"35,36,37,38,39":[t,N],"40,41,42,43,44":[t,i],"45,46,47,48,49":[t,u],"50,51,52,53,54":[t,n],"55,56,57,58,59":[t,I]},hours:{"0,12":[E,{7:[1,2,3,4]}],"1,13":[{1:[1,2,6,7]},{1:[9,10,11]}],"2,14":[E,{2:[1,2,3]}],"3,15":[E,{2:[5,6,7,8]}],"4,16":[E,{3:[1,2,3,4,5,6]}],"5,17":[E,{3:[7,8,9,10,11]}],"6,18":[E,{4:[1,2,3,4]}],"7,19":[E,{4:[6,7,8,9,10]}],"8,20":[E,{5:[1,2,3,4]}],"9,21":[E,{5:[5,6,7,8,9]}],"10,22":[E,{6:[3,4,5,6]}],"11,23":[E,{6:[8,9,10,11]}]},getHour:function(e){var E=e.getHours();return e.getMinutes()>=35?(E+1)%24:E}};jQuery.fritteli.uhr.register("es",s)}(),function(e){var E={8:[1,2]},r={7:[1,2,3,4,5]},t={6:[6,7,8,9,10,11]},I={9:[7,8,9,10]},n={7:[9,10,11]},u={8:[4,5,6,7,8]},i={9:[1,2,3,4,5]},N={9:[1,2,3,4,5,6,7,8,9,10]},s={version:2,language:"Français",letters:["ILNESTODEUX","QUATRETROIS","NEUFUNESEPT","HUITSIXCINQ","MIDIXMINUIT","ONZERHEURES","MOINSOLEDIX","ETRQUARTPMD","VINGT-CINQU","ETSDEMIEPAM"],permanent:{1:[1,2,4,5,6]},minutes:{"5,6,7,8,9":I,"10,11,12,13,14":n,"15,16,17,18,19":[E,u],"20,21,22,23,24":i,"25,26,27,28,29":N,"30,31,32,33,34":[E,{10:[4,5,6,7,8]}],"35,36,37,38,39":[r,N],"40,41,42,43,44":[r,i],"45,46,47,48,49":[r,{7:[7,8]},u],"50,51,52,53,54":[r,n],"55,56,57,58,59":[r,I]},hours:{0:{5:[6,7,8,9,10,11]},"1,13":[{3:[5,6,7]},t],"2,14":[{1:[8,9,10,11]},t],"3,15":[{2:[7,8,9,10,11]},t],"4,16":[{2:[1,2,3,4,5,6]},t],"5,17":[{4:[8,9,10,11]},t],"6,18":[{4:[5,6,7]},t],"7,19":[{3:[8,9,10,11]},t],"8,20":[{4:[1,2,3,4]},t],"9,21":[{3:[1,2,3,4]},t],"10,22":[{5:[3,4,5]},t],"11,23":[{6:[1,2,3,4]},t],12:{5:[1,2,3,4]}},getHour:function(e){var E=e.getHours();return e.getMinutes()>=35?(E+1)%24:E}};jQuery.fritteli.uhr.register("fr",s)}(),function(e){var E={1:[1,2,3,4,6,7]},r={8:[1]},t={7:[8,9,10,11]},I={9:[6,7,8,9,10,11]},n={10:[1,2,3,4,5]},u={8:[3,4,6,7,8,9,10,11]},i={9:[1,2,3,4,5]},N={9:[1,2,3,4,5,6,7,8,9,10,11]},s={version:2,language:"Italiano",letters:["SONORLEBORE","ÈRL'UNASDUE","TREOTTONOVE","DIECIUNDICI","DODICISETTE","QUATTROCSEI","CINQUEAMENO","ECUNOQUARTO","VENTICINQUE","DIECIPMEZZA"],permanent:[],minutes:{"5,6,7,8,9":[r,I],"10,11,12,13,14":[r,n],"15,16,17,18,19":[r,u],"20,21,22,23,24":[r,i],"25,26,27,28,29":[r,N],"30,31,32,33,34":[r,{10:[7,8,9,10,11]}],"35,36,37,38,39":[t,N],"40,41,42,43,44":[t,i],"45,46,47,48,49":[t,u],"50,51,52,53,54":[t,n],"55,56,57,58,59":[t,I]},hours:{"0,12":[E,{5:[1,2,3,4,5,6]}],"1,13":[{2:[1,3,4]},{2:[5,6,7]}],"2,14":[E,{2:[9,10,11]}],"3,15":[E,{3:[1,2,3]}],"4,16":[E,{6:[1,2,3,4,5,6,7]}],"5,17":[E,{7:[1,2,3,4,5,6]}],"6,18":[E,{6:[9,10,11]}],"7,19":[E,{5:[7,8,9,10,11]}],"8,20":[E,{3:[4,5,6,7]}],"9,21":[E,{3:[8,9,10,11]}],"10,22":[E,{4:[1,2,3,4,5]}],"11,23":[E,{4:[6,7,8,9,10,11]}]},getHour:function(e){var E=e.getHours();return e.getMinutes()>=35?(E+1)%24:E}};jQuery.fritteli.uhr.register("it",s)}(),function(e){var E={3:[1,2,3,4]},r={2:[8,9,10,11]},t={4:[1,2,3,4]},I={1:[8,9,10,11]},n={2:[1,2,3,4]},u={3:[7,8,9,10,11]},i={version:2,language:"Nederlands",letters:["HETKISAVIJF","TIENBTZVOOR","OVERMEKWART","HALFSPWOVER","VOORTHGEENS","TWEEPVCDRIE","VIERVIJFZES","ZEVENONEGEN","ACHTTIENELF","TWAALFBFUUR"],permanent:{1:[1,2,3,5,6]},minutes:{"0,1,2,3,4":{10:[9,10,11]},"5,6,7,8,9":[I,E],"10,11,12,13,14":[n,E],"15,16,17,18,19":[u,{4:[8,9,10,11]}],"20,21,22,23,24":[n,r,t],"25,26,27,28,29":[I,r,t],"30,31,32,33,34":t,"35,36,37,38,39":[I,E,t],"40,41,42,43,44":[n,E,t],"45,46,47,48,49":[u,{5:[1,2,3,4]}],"50,51,52,53,54":[n,r],"55,56,57,58,59":[I,r]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[8,9,10]},"2,14":{6:[1,2,3,4]},"3,15":{6:[8,9,10,11]},"4,16":{7:[1,2,3,4]},"5,17":{7:[5,6,7,8]},"6,18":{7:[9,10,11]},"7,19":{8:[1,2,3,4,5]},"8,20":{9:[1,2,3,4]},"9,21":{8:[7,8,9,10,11]},"10,22":{9:[5,6,7,8]},"11,23":{9:[9,10,11]}},getHour:function(e){var E=e.getHours();return e.getMinutes()>=20?(E+1)%24:E}};jQuery.fritteli.uhr.register("nl",i)}(),function(e){var E={1:[1]},r={1:[2,3,4]},t={7:[8]},I={10:[5]},n={7:[7,8,9,10,11]},u={10:[7,8,9,10,11]},i={10:[1,2,3]},N={9:[1,2,4,5,6,7,8,9]},s={8:[1,2,3,4,5]},T={version:2,language:"Português",letters:["ÉSÃOUMATRÊS","MEIOLDIADEZ","DUASEISETEY","QUATROHNOVE","CINCOITONZE","ZMEIALNOITE","HORASYMENOS","VINTECAMEIA","UMVQUARTOPM","DEZOEYCINCO"],minutes:{"5,6,7,8,9":[t,u],"10,11,12,13,14":[t,i],"15,16,17,18,19":[t,N],"20,21,22,23,24":[t,s],"25,26,27,28,29":[t,s,I,u],"30,31,32,33,34":[t,{8:[8,9,10,11]}],"35,36,37,38,39":[n,s,I,u],"40,41,42,43,44":[n,s],"45,46,47,48,49":[n,N],"50,51,52,53,54":[n,i],"55,56,57,58,59":[n,u]},hours:{0:[E,{6:[2,3,4,5,7,8,9,10,11]}],12:[E,{2:[1,2,3,4,6,7,8]}],"1,13":[E,{1:[5,6,7]}],"2,14":[r,{3:[1,2,3,4]}],"3,15":[r,{1:[8,9,10,11]}],"4,16":[r,{4:[1,2,3,4,5,6]}],"5,17":[r,{5:[1,2,3,4,5]}],"6,18":[r,{3:[4,5,6,7]}],"7,19":[r,{3:[7,8,9,10]}],"8,20":[r,{5:[5,6,7,8]}],"9,21":[r,{4:[8,9,10,11]}],"10,22":[r,{2:[9,10,11]}],"11,23":[r,{5:[8,9,10,11]}]},getHour:function(e){var E=e.getHours();return e.getMinutes()>=35?(E+1)%24:E}};jQuery.fritteli.uhr.register("pt",T)}();
+/*! uhr - v8.0.4-dev.0 - 2016-06-27
+* http://bärneruhr.ch/
+* Copyright (c) 2016 Manuel Friedli; Licensed GPL-3.0 */
+!function(a){"use strict";var b={1:[1,2,4,5,6]},c={10:[9,10,11]},d={4:[8,9,10,11]},e={4:[1,2,3]},f={5:[1,2,3,4]},g={1:[8,9,10,11]},h={2:[1,2,3,4]},i={3:[5,6,7,8,9,10,11]},j={2:[5,6,7,8,9,10,11]},k={3:[1,2,3,4,5,6,7,8,9,10,11]},l={version:2,language:"Deutsch",letters:["ESKISTAFÜNF","ZEHNZWANZIG","DREIVIERTEL","VORFUNKNACH","HALBAELFÜNF","EINSXAMZWEI","DREIPMJVIER","SECHSNLACHT","SIEBENZWÖLF","ZEHNEUNKUHR"],permanent:b,minutes:{"0,1,2,3,4":c,"5,6,7,8,9":[g,d],"10,11,12,13,14":[h,d],"15,16,17,18,19":[i,d],"20,21,22,23,24":[j,d],"25,26,27,28,29":[g,e,f],"30,31,32,33,34":f,"35,36,37,38,39":[g,d,f],"40,41,42,43,44":[j,e],"45,46,47,48,49":k,"50,51,52,53,54":[h,e],"55,56,57,58,59":[g,e]},hours:{"0,12":{9:[7,8,9,10,11]},"1,13":{6:[1,2,3,4]},"2,14":{6:[8,9,10,11]},"3,15":{7:[1,2,3,4]},"4,16":{7:[8,9,10,11]},"5,17":{5:[8,9,10,11]},"6,18":{8:[1,2,3,4,5]},"7,19":{9:[1,2,3,4,5,6]},"8,20":{8:[8,9,10,11]},"9,21":{10:[4,5,6,7]},"10,22":{10:[1,2,3,4]},"11,23":{5:[6,7,8]}}};a.fritteli.uhr.register("de",l)}(jQuery),function(a){"use strict";var b={1:[1,2,4,5,6,7]},c={4:[1,2]},d={3:[9,10,11]},e={4:[4,5,6,7,8]},f={1:[9,10,11]},g={2:[9,10,11]},h={2:[1,2,3,4,5,6]},i={3:[1,2,3,4,5,6]},j={version:2,language:"Bärndütsch",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGSIVOR","ABOHAUBIEGE","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:b,minutes:{"5,6,7,8,9":[f,c],"10,11,12,13,14":[g,c],"15,16,17,18,19":[h,c],"20,21,22,23,24":[i,c],"25,26,27,28,29":[f,d,e],"30,31,32,33,34":e,"35,36,37,38,39":[f,c,e],"40,41,42,43,44":[i,d],"45,46,47,48,49":[h,d],"50,51,52,53,54":[g,d],"55,56,57,58,59":[f,d]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}};a.fritteli.uhr.register("de_CH",j)}(jQuery),function(a){"use strict";var b={1:[1,2,4,5,6,7]},c={3:[7,8,9,10,11]},d={4:[4,5]},e={4:[1,2,3]},f={4:[7,8,9,10,11]},g={1:[9,10,11]},h={2:[9,10,11]},i={2:[1,2,3,4,5,6]},j={3:[1,2,3,4,5,6]},k={version:2,language:"Bärndütsch (genau)",letters:["ESKISCHAFÜF","VIERTUBFZÄÄ","ZWÄNZGGENAU","VORABOHAUBI","EISZWÖISDRÜ","VIERIFÜFIQT","SÄCHSISIBNI","ACHTINÜNIEL","ZÄNIERBEUFI","ZWÖUFINAUHR"],permanent:b,minutes:{0:c,"5,6,7,8,9":[g,d],"10,11,12,13,14":[h,d],"15,16,17,18,19":[i,d],"20,21,22,23,24":[j,d],"25,26,27,28,29":[g,e,f],"30,31,32,33,34":f,"35,36,37,38,39":[g,d,f],"40,41,42,43,44":[j,e],"45,46,47,48,49":[i,e],"50,51,52,53,54":[h,e],"55,56,57,58,59":[g,e]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[1,2,3]},"2,14":{5:[4,5,6,7]},"3,15":{5:[9,10,11]},"4,16":{6:[1,2,3,4,5]},"5,17":{6:[6,7,8,9]},"6,18":{7:[1,2,3,4,5,6]},"7,19":{7:[7,8,9,10,11]},"8,20":{8:[1,2,3,4,5]},"9,21":{8:[6,7,8,9]},"10,22":{9:[1,2,3,4]},"11,23":{9:[8,9,10,11]}}};a.fritteli.uhr.register("de_CH_genau",k)}(jQuery),function(a){"use strict";var b={1:[1,2,3,4,5,6,7,9,10]},c={4:[4,5,6,7,8,9,10,11]},d={5:[8]},e={5:[4,5,6,7]},f={2:[1,2,3]},g={4:[1,2]},h={3:[4,5,6,7,8]},i={2:[4,5,6,7]},j={6:[8,9,10,11]},k={version:2,language:"Dansk",letters:["KLOKKENVERO","FEMTYVESKLA","OJEKVARTVAT","TIAMINUTTER","VEMOVERILMF","MONALISHALV","ETTOTREFIRE","FEMSEKSRSYV","OTTERNIMETI","ELLEVEATOLV"],permanent:b,minutes:{"5,6,7,8,9":[f,c,e],"10,11,12,13,14":[g,c,e],"15,16,17,18,19":[h,e],"20,21,22,23,24":[i,c,e],"25,26,27,28,29":[f,c,d,j],"30,31,32,33,34":[j],"35,36,37,38,39":[f,c,e,j],"40,41,42,43,44":[i,c,d],"45,46,47,48,49":[h,d],"50,51,52,53,54":[g,c,d],"55,56,57,58,59":[f,c,d]},hours:{"0,12":{10:[8,9,10,11]},"1,13":{7:[1,2]},"2,14":{7:[3,4]},"3,15":{7:[5,6,7]},"4,16":{7:[8,9,10,11]},"5,17":{8:[1,2,3]},"6,18":{8:[4,5,6,7]},"7,19":{8:[9,10,11]},"8,20":{9:[1,2,3,4]},"9,21":{9:[6,7]},"10,22":{9:[10,11]},"11,23":{10:[1,2,3,4,5,6]}},getHour:function(a){var b=a.getHours();return a.getMinutes()>=25?(b+1)%24:b}};a.fritteli.uhr.register("dk",k)}(jQuery),function(a){"use strict";var b={1:[1,2,4,5]},c={4:[1,2,3,4]},d={4:[10,11]},e={5:[1,2,3,4]},f={10:[5,6,7,8,9,10,11]},g={3:[7,8,9,10]},h={4:[6,7,8]},i={2:[1,3,4,5,6,7,8,9]},j={3:[1,2,3,4,5,6]},k={3:[1,2,3,4,5,6,7,8,9,10]},l={version:2,language:"English",letters:["ITLISBFAMPM","ACQUARTERDC","TWENTYFIVEX","HALFBTENFTO","PASTERUNINE","ONESIXTHREE","FOURFIVETWO","EIGHTELEVEN","SEVENTWELVE","TENSO'CLOCK"],permanent:b,minutes:{"0,1,2,3,4":f,"5,6,7,8,9":[g,e],"10,11,12,13,14":[h,e],"15,16,17,18,19":[i,e],"20,21,22,23,24":[j,e],"25,26,27,28,29":[k,e],"30,31,32,33,34":[c,e],"35,36,37,38,39":[k,d],"40,41,42,43,44":[j,d],"45,46,47,48,49":[i,d],"50,51,52,53,54":[h,d],"55,56,57,58,59":[g,d]},hours:{"0,12":{9:[6,7,8,9,10,11]},"1,13":{6:[1,2,3]},"2,14":{7:[9,10,11]},"3,15":{6:[7,8,9,10,11]},"4,16":{7:[1,2,3,4]},"5,17":{7:[5,6,7,8]},"6,18":{6:[4,5,6]},"7,19":{9:[1,2,3,4,5]},"8,20":{8:[1,2,3,4,5]},"9,21":{5:[8,9,10,11]},"10,22":{10:[1,2,3]},"11,23":{8:[6,7,8,9,10,11]}},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("en",l)}(jQuery),function(a){"use strict";var b={1:[1,2,6,7]},c={1:[2,3,4,6,7,8]},d={7:[6]},e={7:[7,8,9,10,11]},f={10:[1,2,3,4,5]},g={9:[7,8,9,10,11]},h={8:[8,9,10,11]},i={10:[6,7,8,9,10,11]},j={8:[2,3,4,5,6,7]},k={9:[1,2,3,4,5,6,7,8,9,10,11]},l={version:2,language:"Español",letters:["ESONELASUNA","DOSITRESORE","CUATROCINCO","SEISASIETEN","OCHONUEVEYO","LADIEZSONCE","DOCELYMENOS","OVEINTEDIEZ","VEINTICINCO","MEDIACUARTO"],permanent:[],minutes:{"5,6,7,8,9":[d,g],"10,11,12,13,14":[d,h],"15,16,17,18,19":[d,i],"20,21,22,23,24":[d,j],"25,26,27,28,29":[d,k],"30,31,32,33,34":[d,f],"35,36,37,38,39":[e,k],"40,41,42,43,44":[e,j],"45,46,47,48,49":[e,i],"50,51,52,53,54":[e,h],"55,56,57,58,59":[e,g]},hours:{"0,12":[c,{7:[1,2,3,4]}],"1,13":[b,{1:[9,10,11]}],"2,14":[c,{2:[1,2,3]}],"3,15":[c,{2:[5,6,7,8]}],"4,16":[c,{3:[1,2,3,4,5,6]}],"5,17":[c,{3:[7,8,9,10,11]}],"6,18":[c,{4:[1,2,3,4]}],"7,19":[c,{4:[6,7,8,9,10]}],"8,20":[c,{5:[1,2,3,4]}],"9,21":[c,{5:[5,6,7,8,9]}],"10,22":[c,{6:[3,4,5,6]}],"11,23":[c,{6:[8,9,10,11]}]},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("es",l)}(jQuery),function(a){"use strict";var b={1:[1,2,4,5,6]},c={8:[1,2]},d={7:[1,2,3,4,5]},e={10:[4,5,6,7,8]},f={6:[6,7,8,9,10,11]},g={7:[7,8]},h={9:[7,8,9,10]},i={7:[9,10,11]},j={8:[4,5,6,7,8]},k={9:[1,2,3,4,5]},l={9:[1,2,3,4,5,6,7,8,9,10]},m={version:2,language:"Français",letters:["ILNESTODEUX","QUATRETROIS","NEUFUNESEPT","HUITSIXCINQ","MIDIXMINUIT","ONZERHEURES","MOINSOLEDIX","ETRQUARTPMD","VINGT-CINQU","ETSDEMIEPAM"],permanent:b,minutes:{"5,6,7,8,9":h,"10,11,12,13,14":i,"15,16,17,18,19":[c,j],"20,21,22,23,24":k,"25,26,27,28,29":l,"30,31,32,33,34":[c,e],"35,36,37,38,39":[d,l],"40,41,42,43,44":[d,k],"45,46,47,48,49":[d,g,j],"50,51,52,53,54":[d,i],"55,56,57,58,59":[d,h]},hours:{0:{5:[6,7,8,9,10,11]},"1,13":[{3:[5,6,7]},f],"2,14":[{1:[8,9,10,11]},f],"3,15":[{2:[7,8,9,10,11]},f],"4,16":[{2:[1,2,3,4,5,6]},f],"5,17":[{4:[8,9,10,11]},f],"6,18":[{4:[5,6,7]},f],"7,19":[{3:[8,9,10,11]},f],"8,20":[{4:[1,2,3,4]},f],"9,21":[{3:[1,2,3,4]},f],"10,22":[{5:[3,4,5]},f],"11,23":[{6:[1,2,3,4]},f],12:{5:[1,2,3,4]}},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("fr",m)}(jQuery),function(a){"use strict";var b={1:[1,2,3,4,6,7]},c={2:[1,3,4]},d={8:[1]},e={7:[8,9,10,11]},f={10:[7,8,9,10,11]},g={9:[6,7,8,9,10,11]},h={10:[1,2,3,4,5]},i={8:[3,4,6,7,8,9,10,11]},j={9:[1,2,3,4,5]},k={9:[1,2,3,4,5,6,7,8,9,10,11]},l={version:2,language:"Italiano",letters:["SONORLEBORE","ÈRL'UNASDUE","TREOTTONOVE","DIECIUNDICI","DODICISETTE","QUATTROCSEI","CINQUEAMENO","ECUNOQUARTO","VENTICINQUE","DIECIPMEZZA"],permanent:[],minutes:{"5,6,7,8,9":[d,g],"10,11,12,13,14":[d,h],"15,16,17,18,19":[d,i],"20,21,22,23,24":[d,j],"25,26,27,28,29":[d,k],"30,31,32,33,34":[d,f],"35,36,37,38,39":[e,k],"40,41,42,43,44":[e,j],"45,46,47,48,49":[e,i],"50,51,52,53,54":[e,h],"55,56,57,58,59":[e,g]},hours:{"0,12":[b,{5:[1,2,3,4,5,6]}],"1,13":[c,{2:[5,6,7]}],"2,14":[b,{2:[9,10,11]}],"3,15":[b,{3:[1,2,3]}],"4,16":[b,{6:[1,2,3,4,5,6,7]}],"5,17":[b,{7:[1,2,3,4,5,6]}],"6,18":[b,{6:[9,10,11]}],"7,19":[b,{5:[7,8,9,10,11]}],"8,20":[b,{3:[4,5,6,7]}],"9,21":[b,{3:[8,9,10,11]}],"10,22":[b,{4:[1,2,3,4,5]}],"11,23":[b,{4:[6,7,8,9,10,11]}]},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("it",l)}(jQuery),function(a){"use strict";var b={1:[1,2,3,5,6]},c={3:[1,2,3,4]},d={2:[8,9,10,11]},e={4:[8,9,10,11]},f={5:[1,2,3,4]},g={4:[1,2,3,4]},h={1:[8,9,10,11]},i={2:[1,2,3,4]},j={3:[7,8,9,10,11]},k={10:[9,10,11]},l={version:2,language:"Nederlands",letters:["HETKISAVIJF","TIENBTZVOOR","OVERMEKWART","HALFSPWOVER","VOORTHGEENS","TWEEPVCDRIE","VIERVIJFZES","ZEVENONEGEN","ACHTTIENELF","TWAALFBFUUR"],permanent:b,minutes:{"0,1,2,3,4":k,"5,6,7,8,9":[h,c],"10,11,12,13,14":[i,c],"15,16,17,18,19":[j,e],"20,21,22,23,24":[i,d,g],"25,26,27,28,29":[h,d,g],"30,31,32,33,34":g,"35,36,37,38,39":[h,c,g],"40,41,42,43,44":[i,c,g],"45,46,47,48,49":[j,f],"50,51,52,53,54":[i,d],"55,56,57,58,59":[h,d]},hours:{"0,12":{10:[1,2,3,4,5,6]},"1,13":{5:[8,9,10]},"2,14":{6:[1,2,3,4]},"3,15":{6:[8,9,10,11]},"4,16":{7:[1,2,3,4]},"5,17":{7:[5,6,7,8]},"6,18":{7:[9,10,11]},"7,19":{8:[1,2,3,4,5]},"8,20":{9:[1,2,3,4]},"9,21":{8:[7,8,9,10,11]},"10,22":{9:[5,6,7,8]},"11,23":{9:[9,10,11]}},getHour:function(a){var b=a.getHours();return a.getMinutes()>=20?(b+1)%24:b}};a.fritteli.uhr.register("nl",l)}(jQuery),function(a){"use strict";var b={1:[1]},c={1:[2,3,4]},d={7:[8]},e={10:[5]},f={7:[7,8,9,10,11]},g={8:[8,9,10,11]},h={10:[7,8,9,10,11]},i={10:[1,2,3]},j={9:[1,2,4,5,6,7,8,9]},k={8:[1,2,3,4,5]},l={version:2,language:"Português",letters:["ÉSÃOUMATRÊS","MEIOLDIADEZ","DUASEISETEY","QUATROHNOVE","CINCOITONZE","ZMEIALNOITE","HORASYMENOS","VINTECAMEIA","UMVQUARTOPM","DEZOEYCINCO"],minutes:{"5,6,7,8,9":[d,h],"10,11,12,13,14":[d,i],"15,16,17,18,19":[d,j],"20,21,22,23,24":[d,k],"25,26,27,28,29":[d,k,e,h],"30,31,32,33,34":[d,g],"35,36,37,38,39":[f,k,e,h],"40,41,42,43,44":[f,k],"45,46,47,48,49":[f,j],"50,51,52,53,54":[f,i],"55,56,57,58,59":[f,h]},hours:{0:[b,{6:[2,3,4,5,7,8,9,10,11]}],12:[b,{2:[1,2,3,4,6,7,8]}],"1,13":[b,{1:[5,6,7]}],"2,14":[c,{3:[1,2,3,4]}],"3,15":[c,{1:[8,9,10,11]}],"4,16":[c,{4:[1,2,3,4,5,6]}],"5,17":[c,{5:[1,2,3,4,5]}],"6,18":[c,{3:[4,5,6,7]}],"7,19":[c,{3:[7,8,9,10]}],"8,20":[c,{5:[5,6,7,8]}],"9,21":[c,{4:[8,9,10,11]}],"10,22":[c,{2:[9,10,11]}],"11,23":[c,{5:[8,9,10,11]}]},getHour:function(a){var b=a.getHours();return a.getMinutes()>=35?(b+1)%24:b}};a.fritteli.uhr.register("pt",l)}(jQuery);
\ No newline at end of file
diff --git a/dist/jquery.uhr.main.js b/dist/jquery.uhr.main.js
index 1d4d75f..5b3bb5a 100644
--- a/dist/jquery.uhr.main.js
+++ b/dist/jquery.uhr.main.js
@@ -1,29 +1,17 @@
-'use strict';
-
-/*
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
- */
-(function ($) {
+/*! uhr - v8.0.4-dev.0 - 2016-06-27
+* http://bärneruhr.ch/
+* Copyright (c) 2016 Manuel Friedli; Licensed GPL-3.0 */
+(function($) {
+ 'use strict';
var uhrGlobals = {
"id": 0,
"languages": [],
"themes": [],
registerLanguage: function registerLanguage(code, language) {
- var alreadyExists = uhrGlobals.languages.some(function (element) {
+ var alreadyExists = uhrGlobals.languages.some(function(element) {
if (code === element.code) {
console.error("Error: Language code '" + code + "' cannot be registered for language '" + language.language +
- "' because it is already registered for language '" + element.language + "'!");
+ "' because it is already registered for language '" + element.language + "'!");
return true;
}
return false;
@@ -36,7 +24,7 @@
};
// auto-detect themes
- $('link[rel=stylesheet]').each(function (index, item) {
+ $('link[rel=stylesheet]').each(function(index, item) {
var styleSheet = $(item);
var styleClass = styleSheet.attr('data-class');
if (styleClass !== undefined) {
@@ -53,12 +41,9 @@
}
// public interface methods (exported later)
- var setCookie;
- var isOn;
- var update;
var start = function start() {
if (!isOn.bind(this)()) {
- this.timer = window.setInterval(function () {
+ this.timer = window.setInterval(function() {
this.options.time = new Date();
update.bind(this)();
}.bind(this), 1000);
@@ -81,25 +66,436 @@
this.start();
}
};
- var language;
-
- /**
- * Ein Buchstabe. Hilfsklasse für den Renderer und Inhalt der Layout-Arrays.
- * @param value Der Buchstabe, der Dargestellt werden soll.
- * @param style Die CSS-Styleklassen des Buchstabens.
- */
- function Letter(value, style) {
- var myValue = value;
- var myStyle = style || '';
- this.addStyle = function (style) {
- if (myStyle === '') {
- myStyle = style;
- } else {
- myStyle += ' ' + style;
+ var setLanguage = function setLanguage(languageKey) {
+ if (languageKey !== this.options.language) {
+ this.options.language = languageKey;
+ var renderer = new UhrRenderer(language.bind(this)(), this.element.find('.letterarea'));
+ renderer.render.bind(this)(function() {
+ this.currentMinute = -1;
+ update.bind(this)();
+ }.bind(this));
+ setCookie.bind(this)('uhr-language', languageKey);
+ update.bind(this)();
+ }
+ };
+ var setTheme = function setTheme(theme) {
+ if (theme !== this.options.theme) {
+ this.element.removeClass(this.options.theme).addClass(theme);
+ $('#uhr-onoffswitch' + this.id).removeClass(this.options.theme).addClass(theme);
+ this.options.theme = theme;
+ setCookie.bind(this)('uhr-theme', theme);
+ }
+ };
+ var setTime = function setTime(time) {
+ this.currentMinute = -1;
+ if (time === null) {
+ this.options.time = new Date();
+ } else {
+ if (this.timer !== null) {
+ window.clearInterval(this.timer);
}
- };
- this.toString = function () {
- return '' + myValue + ' ';
+ this.options.time = time;
+ }
+ update.bind(this)();
+ };
+ var setMode = function(mode) {
+ this.options.mode = mode;
+ this.currentMinute = -1;
+ update.bind(this)();
+ setCookie.bind(this)('uhr-mode', mode);
+ };
+ var setWidth = function setWidth(width) {
+ var e = this.element;
+ e.css('width', width);
+ var realWidth = e.width();
+ e.width(realWidth);
+ e.height(realWidth);
+ e.css('font-size', (realWidth / 40) + 'px');
+ };
+
+ // private interface methods
+ var create = function create() {
+ this.id = uhrGlobals.id++;
+ this.timer = null;
+ this.currentMinute = -1;
+ var userTime = this.options.time;
+ var hash, params;
+ if (this.options.time === undefined) {
+ this.options.time = new Date();
+ }
+ // parse the URL params
+ hash = window.location.hash;
+ if (hash !== undefined && typeof hash === 'string' && hash.charAt(0) === '#') {
+ hash = hash.substring(1);
+ hash = decodeURIComponent(hash);
+ params = hash.split('&');
+ params.forEach(function (element) {
+ var pair = element.split('=');
+ var key = pair[0];
+ var value = pair[1];
+ switch (key) {
+ case 'l':
+ case 'language':
+ this.options.language = value;
+ this.options.force = true;
+ break;
+ case 't':
+ case 'theme':
+ this.options.theme = value;
+ this.options.force = true;
+ break;
+ case 'm':
+ case 'mode':
+ this.options.mode = value;
+ this.options.force = true;
+ break;
+ case 's':
+ case 'status':
+ this.options.status = value;
+ this.options.force = true;
+ break;
+ }
+ }.bind(this));
+ }
+ // end parse the URL params
+ setupHTML.bind(this)();
+ wireFunctionality.bind(this)();
+ if (userTime !== undefined) {
+ this.time(userTime);
+ }
+ };
+ // private helper methods (not exported)
+ var toggleConfigScreen = function toggleConfigScreen() {
+ $('#uhr-controlpanel' + this.id).toggle('fast');
+ };
+ // set up
+ var setupHTML = function setupHTML() {
+ var e = this.element;
+ // Base clock area
+ e.addClass('uhr');
+ e.empty();
+ e.append(' ');
+ e.append(' ');
+ e.append(' ');
+ e.append(' ');
+ e.append('
');
+ e.append('
');
+ setWidth.bind(this)(this.options.width);
+
+ if (this.options.controls) {
+ var controlpanel = $('
');
+ var content = $('
');
+ controlpanel.append(content);
+ // on/off switch
+ var toggleSwitch = $('
');
+ toggleSwitch.append(' ');
+ toggleSwitch.append('' +
+ '
' + '
' + ' ');
+ content.append(toggleSwitch);
+
+ // time mode switch
+ var modeSwitch = $('
');
+ modeSwitch.append(' ');
+ modeSwitch.append('' +
+ '
' + '
' +
+ ' ');
+ content.append(modeSwitch);
+ // language chooser
+ if (uhrGlobals.languages.length > 1) {
+ var languageChooser = $(' ');
+ uhrGlobals.languages.forEach(function(item) {
+ languageChooser.append('' + item.language + ' ');
+ });
+ content.append(languageChooser);
+ }
+
+ // theme chooser
+ if (uhrGlobals.themes.length > 1) {
+ var themeChooser = $(' ');
+ uhrGlobals.themes.forEach(function(item) {
+ themeChooser.append('' + item.name + ' ');
+ });
+ content.append(themeChooser);
+ }
+ var closebutton = $(' ');
+ closebutton.on('click', function() {
+ $('#uhr-controlpanel' + this.id).hide('fast');
+ }.bind(this));
+ content.append(closebutton);
+ e.after(controlpanel);
+ controlpanel.hide();
+ var configlink = $(' ');
+ configlink.on('click', function() {
+ toggleConfigScreen.bind(this)();
+ }.bind(this));
+ e.after(configlink);
+ }
+ };
+ var wireFunctionality = function wireFunctionality() {
+ // on/off switch
+ var toggleSwitch = $('#uhr-onoffswitch-checkbox' + this.id);
+ toggleSwitch.on('click', function() {
+ this.toggle();
+ }.bind(this));
+ var status = $.cookie('uhr-status' + this.id);
+ if (status === undefined || this.options.force) {
+ status = this.options.status;
+ }
+ toggleSwitch.prop('checked', status === 'on');
+ if (status === 'on') {
+ this.start();
+ } else {
+ this.stop();
+ }
+
+ // time mode switch
+ var modeSwitch = $('#uhr-modeswitch-checkbox' + this.id);
+ modeSwitch.on('click', function() {
+ if (this.options.mode === 'seconds') {
+ setMode.bind(this)('normal');
+ } else {
+ setMode.bind(this)('seconds');
+ }
+ }.bind(this));
+
+ var mode = $.cookie('uhr-mode' + this.id);
+ if (mode === undefined || this.options.force) {
+ mode = this.options.mode;
+ }
+ modeSwitch.prop('checked', mode !== 'seconds');
+ if (mode === 'seconds') {
+ setMode.bind(this)('seconds');
+ } else {
+ setMode.bind(this)('normal');
+ }
+
+ // language chooser
+ var languageChooser = $('#uhr-languagechooser' + this.id);
+ languageChooser.on('change', function() {
+ var languageKey = $('#uhr-languagechooser' + this.id).val();
+ this.language(languageKey);
+ }.bind(this));
+ var selectedLanguage = $.cookie('uhr-language' + this.id);
+ if (selectedLanguage === undefined || this.options.force) {
+ selectedLanguage = this.options.language;
+ }
+ var found = uhrGlobals.languages.some(function(item) {
+ return selectedLanguage === item.code;
+ });
+ if (!found) {
+ var fallbackLanguage;
+ if (uhrGlobals.languages.length > 0) {
+ fallbackLanguage = uhrGlobals.languages[0].code;
+ } else {
+ fallbackLanguage = '';
+ }
+ console.warn("Language '" + selectedLanguage + "' not found! Using fallback '" + fallbackLanguage + "'");
+ selectedLanguage = fallbackLanguage;
+ }
+ languageChooser.val(selectedLanguage);
+ this.options.language = "";
+ this.language(selectedLanguage);
+
+ // theme chooser
+ var themeChooser = $('#uhr-themechooser' + this.id);
+ themeChooser.on('change', function() {
+ var themeKey = $('#uhr-themechooser' + this.id).val();
+ this.theme(themeKey);
+ }.bind(this));
+ var selectedTheme = $.cookie('uhr-theme' + this.id);
+ if (selectedTheme === undefined || this.options.force) {
+ selectedTheme = this.options.theme;
+ }
+ found = uhrGlobals.themes.some(function(item) {
+ return selectedTheme === item.styleClass;
+ });
+ if (!found) {
+ var fallbackTheme = uhrGlobals.themes[0].styleClass;
+ console.warn("Theme '" + selectedTheme + "' not found! Using fallback '" + fallbackTheme + "'");
+ selectedTheme = fallbackTheme;
+ }
+ themeChooser.val(selectedTheme);
+ this.options.theme = "";
+ this.theme(selectedTheme);
+ if (this.options.autoresize) {
+ $(window).on('resize', function() {
+ var $e = this.element;
+ var $parent = $e.parent();
+ var $window = $(window);
+ var parentWidth = $parent.width();
+ var parentHeight = $parent.height();
+ var windowWidth = $window.width();
+ var windowHeight = $window.height();
+ var size = Math.min(parentWidth, parentHeight, windowWidth, windowHeight) + 'px';
+ setWidth.bind(this)(size);
+ }.bind(this));
+ }
+ };
+ var destroy = function destroy() {
+ this.timer = null;
+ $(this.element)
+ .removeAttr('style')
+ .removeAttr('class')
+ .empty();
+ $('#uhr-configlink' + this.id).remove();
+ $('#uhr-controlpanel' + this.id).remove();
+
+ };
+ var setCookie = function setCookie(cookieName, cookieValue) {
+ var options = {};
+ if (this.options.cookiePath !== undefined) {
+ options = {expires: 365, path: this.options.cookiePath};
+ } else {
+ options = {expires: 365};
+ }
+ $.cookie(cookieName + this.id, cookieValue, options);
+ };
+
+ // business logic
+ var isOn = function isOn() {
+ return this.timer !== null;
+ };
+ var update = function update() {
+ if (isOn.bind(this)()) {
+ var time = this.options.time;
+ if (!language.bind(this)().hasOwnProperty('seconds') && this.options.mode !== 'seconds') {
+ if (time.getMinutes() === this.currentMinute) {
+ return;
+ }
+ this.currentMinute = time.getMinutes();
+ }
+ show.bind(this)(time);
+ } else {
+ clear.bind(this)();
+ this.currentMinute = -1;
+ }
+ };
+ var show = function show(time) {
+ var second = getSecond.bind(this)(time);
+ var dotMinute = getDotMinute.bind(this)(time);
+ var hour = getHour.bind(this)(time);
+ var coarseMinute = getCoarseMinute.bind(this)(time);
+ clear.bind(this)();
+ if (this.options.mode === 'seconds') {
+ highlight.bind(this)('second' + second);
+ } else {
+ highlight.bind(this)('on');
+ for (var i = 1; i <= dotMinute; i++) {
+ highlight.bind(this)('dot' + i);
+ }
+ highlight.bind(this)('minute' + coarseMinute);
+ highlight.bind(this)('hour' + hour);
+ }
+ };
+ var highlight = function highlight(itemClass) {
+ this.element.find('.item.' + itemClass).addClass('active');
+ };
+ var clear = function clear() {
+ this.element.find('.item').removeClass('active');
+ };
+ var getSecond = function getSecond(date) {
+ if (typeof language.bind(this)().getSeconds === 'function') {
+ return language.bind(this)().getSeconds(date);
+ }
+ return date.getSeconds();
+ };
+ var getDotMinute = function getDotMinute(date) {
+ if (typeof language.bind(this)().getDotMinute === 'function') {
+ return language.bind(this)().getDotMinute(date);
+ }
+ var minutes = date.getMinutes();
+ return minutes % 5;
+ };
+ var getCoarseMinute = function getCoarseMinute(date) {
+ if (typeof language.bind(this)().getCoarseMinute === 'function') {
+ return language.bind(this)().getCoarseMinute(date);
+ }
+ return date.getMinutes();
+ };
+ var getHour = function getHour(date) {
+ if (typeof language.bind(this)().getHour === 'function') {
+ return language.bind(this)().getHour(date);
+ }
+ var hour = date.getHours();
+ if (date.getMinutes() >= 25) {
+ return (hour + 1) % 24;
+ }
+ return hour;
+ };
+ var language = function language() {
+ var matchingLanguages = uhrGlobals.languages.filter(function(element) {
+ return (element.code === this.options.language);
+ }, this);
+ if (matchingLanguages.length > 0) {
+ return matchingLanguages[0];
+ }
+ // fallback: return empty object
+ return {};
+ };
+
+ $.widget("fritteli.uhr", {
+ "options": {
+ width: '100%',
+ status: 'on',
+ language: 'de_CH',
+ theme: uhrGlobals.themes[0].styleClass,
+ force: false,
+ controls: true,
+ cookiePath: undefined,
+ autoresize: true,
+ mode: 'normal'
+ },
+ "start": start,
+ "stop": stop,
+ "toggle": toggle,
+ "language": setLanguage,
+ "theme": setTheme,
+ "time": setTime,
+ "mode": setMode,
+ "width": setWidth,
+ // constructor method
+ "_create": create,
+ // destructor method
+ "_destroy": destroy
+ });
+ $.fritteli.uhr.register = uhrGlobals.registerLanguage;
+ /**
+ * Hilfsklasse zum Rendern der Uhr.
+ * @param layout Layout-Objekt, das gerendert werden soll.
+ * @param renderarea Das jQuery-gewrappte HTML-Element, auf dem gerendert werden soll.
+ */
+ function UhrRenderer(layout, renderarea) {
+ this.render = function render(beforeshow) {
+ if (layout.parsed === undefined) {
+ switch (layout.version) {
+ case 2:
+ var delegate = new UhrRendererV2Delegate(layout);
+ var parsedLayout = delegate.parse();
+ Object.defineProperty(layout, "parsed", {"value": parsedLayout, "writable": false, "configurable": false});
+ break;
+ default:
+ console.warn("Unknown layout version: '" + layout.version + "'");
+ return;
+ }
+ }
+ var letters = layout.parsed;
+ renderarea.fadeOut('fast', function() {
+ renderarea.empty();
+ letters.forEach(function(line, index, array) {
+ line.forEach(function(letter) {
+ renderarea.append(letter.toString());
+ });
+ if (index < array.length - 1) {
+ renderarea.append(' ');
+ }
+ });
+ if (typeof beforeshow === 'function') {
+ beforeshow();
+ }
+ renderarea.fadeIn('fast');
+ });
};
}
@@ -248,7 +644,7 @@
8: [10],
9: [8, 9]
};
- var seconds = {
+ var seconds= {
"0": [vorne0, hinten0],
"1": [vorne0, hinten1],
"2": [vorne0, hinten2],
@@ -311,21 +707,10 @@
"59": [vorne5, hinten9]
};
- function parseObject(letters, styleClass, object) {
- if (typeof object !== 'undefined' && object !== null) {
- Object.keys(object).forEach(function (y) {
- var highlightLetters = object[y];
- highlightLetters.forEach(function (x) {
- letters[y - 1][x - 1].addStyle(styleClass);
- });
- });
- }
- }
-
function parseArrayOrObject(letters, styleClass, input) {
if (typeof input !== 'undefined' && input !== null) {
if (Array.isArray(input)) {
- input.forEach(function (item) {
+ input.forEach(function(item) {
parseObject(letters, styleClass, item);
});
} else {
@@ -334,12 +719,23 @@
}
}
+ function parseObject(letters, styleClass, object) {
+ if (typeof object !== 'undefined' && object !== null) {
+ Object.keys(object).forEach(function(y) {
+ var highlightLetters = object[y];
+ highlightLetters.forEach(function(x) {
+ letters[y - 1][x - 1].addStyle(styleClass);
+ });
+ });
+ }
+ }
+
function parseTimeDefinition(letters, styleClass, definition) {
if (typeof definition !== 'undefined' && definition !== null) {
- Object.keys(definition).forEach(function (listString) {
+ Object.keys(definition).forEach(function(listString) {
var array = listString.split(',');
var highlightLetters = definition[listString];
- array.forEach(function (item) {
+ array.forEach(function(item) {
parseArrayOrObject(letters, styleClass + item, highlightLetters);
});
});
@@ -348,7 +744,7 @@
this.parse = function parse() {
var letters = [];
- layout.letters.forEach(function (string) {
+ layout.letters.forEach(function(string) {
var line = [];
for (var c = 0; c < string.length; c++) {
var character = new Letter(string[c]);
@@ -369,449 +765,22 @@
}
/**
- * Hilfsklasse zum Rendern der Uhr.
- * @param layout Layout-Objekt, das gerendert werden soll.
- * @param renderarea Das jQuery-gewrappte HTML-Element, auf dem gerendert werden soll.
+ * Ein Buchstabe. Hilfsklasse für den Renderer und Inhalt der Layout-Arrays.
+ * @param value Der Buchstabe, der Dargestellt werden soll.
+ * @param style Die CSS-Styleklassen des Buchstabens.
*/
- function UhrRenderer(layout, renderarea) {
- this.render = function render(beforeshow) {
- if (layout.parsed === undefined) {
- switch (layout.version) {
- case 2:
- var delegate = new UhrRendererV2Delegate(layout);
- var parsedLayout = delegate.parse();
- Object.defineProperty(layout, "parsed", {
- "value": parsedLayout,
- "writable": false,
- "configurable": false
- });
- break;
- default:
- console.warn("Unknown layout version: '" + layout.version + "'");
- return;
- }
+ function Letter(value, style) {
+ var myValue = value;
+ var myStyle = style || '';
+ this.addStyle = function(style) {
+ if (myStyle === '') {
+ myStyle = style;
+ } else {
+ myStyle += ' ' + style;
}
- var letters = layout.parsed;
- renderarea.fadeOut('fast', function () {
- renderarea.empty();
- letters.forEach(function (line, index, array) {
- line.forEach(function (letter) {
- renderarea.append(letter.toString());
- });
- if (index < array.length - 1) {
- renderarea.append(' ');
- }
- });
- if (typeof beforeshow === 'function') {
- beforeshow();
- }
- renderarea.fadeIn('fast');
- });
+ };
+ this.toString = function() {
+ return '' + myValue + ' ';
};
}
-
- var setLanguage = function setLanguage(languageKey) {
- if (languageKey !== this.options.language) {
- this.options.language = languageKey;
- var renderer = new UhrRenderer(language.bind(this)(), this.element.find('.letterarea'));
- renderer.render.bind(this)(function () {
- this.currentMinute = -1;
- update.bind(this)();
- }.bind(this));
- setCookie.bind(this)('uhr-language', languageKey);
- update.bind(this)();
- }
- };
- var setTheme = function setTheme(theme) {
- if (theme !== this.options.theme) {
- this.element.removeClass(this.options.theme).addClass(theme);
- $('#uhr-onoffswitch' + this.id).removeClass(this.options.theme).addClass(theme);
- this.options.theme = theme;
- setCookie.bind(this)('uhr-theme', theme);
- }
- };
- var setTime = function setTime(time) {
- this.currentMinute = -1;
- if (time === null) {
- this.options.time = new Date();
- } else {
- if (this.timer !== null) {
- window.clearInterval(this.timer);
- }
- this.options.time = time;
- }
- update.bind(this)();
- };
- var setMode = function (mode) {
- this.options.mode = mode;
- this.currentMinute = -1;
- update.bind(this)();
- setCookie.bind(this)('uhr-mode', mode);
- };
- var setWidth = function setWidth(width) {
- var e = this.element;
- e.css('width', width);
- var realWidth = e.width();
- e.width(realWidth);
- e.height(realWidth);
- e.css('font-size', (realWidth / 40) + 'px');
- };
-
- // private interface methods
- var setupHTML;
- var wireFunctionality;
- var create = function create() {
- this.id = uhrGlobals.id++;
- this.timer = null;
- this.currentMinute = -1;
- var userTime = this.options.time;
- var hash, params;
- if (this.options.time === undefined) {
- this.options.time = new Date();
- }
- // parse the URL params
- hash = window.location.hash;
- if (hash !== undefined && typeof hash === 'string' && hash.charAt(0) === '#') {
- hash = hash.substring(1);
- hash = decodeURIComponent(hash);
- params = hash.split('&');
- params.forEach(function (element) {
- var pair = element.split('=');
- var key = pair[0];
- var value = pair[1];
- switch (key) {
- case 'l':
- case 'language':
- this.options.language = value;
- this.options.force = true;
- break;
- case 't':
- case 'theme':
- this.options.theme = value;
- this.options.force = true;
- break;
- case 'm':
- case 'mode':
- this.options.mode = value;
- this.options.force = true;
- break;
- case 's':
- case 'status':
- this.options.status = value;
- this.options.force = true;
- break;
- }
- }.bind(this));
- }
- // end parse the URL params
- setupHTML.bind(this)();
- wireFunctionality.bind(this)();
- if (userTime !== undefined) {
- this.time(userTime);
- }
- };
- // private helper methods (not exported)
- var toggleConfigScreen = function toggleConfigScreen() {
- $('#uhr-controlpanel' + this.id).toggle('fast');
- };
- // set up
- setupHTML = function setupHTML() {
- var e = this.element;
- // Base clock area
- e.addClass('uhr');
- e.empty();
- e.append(' ');
- e.append(' ');
- e.append(' ');
- e.append(' ');
- e.append('
');
- e.append('
');
- setWidth.bind(this)(this.options.width);
-
- if (this.options.controls) {
- var controlpanel = $('
');
- var content = $('
');
- controlpanel.append(content);
- // on/off switch
- var toggleSwitch = $('
');
- toggleSwitch.append(' ');
- toggleSwitch.append('' +
- '
' + '
' + ' ');
- content.append(toggleSwitch);
-
- // time mode switch
- var modeSwitch = $('
');
- modeSwitch.append(' ');
- modeSwitch.append('' +
- '
' + '
' +
- ' ');
- content.append(modeSwitch);
- // language chooser
- if (uhrGlobals.languages.length > 1) {
- var languageChooser = $(' ');
- uhrGlobals.languages.forEach(function (item) {
- languageChooser.append('' + item.language + ' ');
- });
- content.append(languageChooser);
- }
-
- // theme chooser
- if (uhrGlobals.themes.length > 1) {
- var themeChooser = $(' ');
- uhrGlobals.themes.forEach(function (item) {
- themeChooser.append('' + item.name + ' ');
- });
- content.append(themeChooser);
- }
- var closebutton = $(' ');
- closebutton.on('click', function () {
- $('#uhr-controlpanel' + this.id).hide('fast');
- }.bind(this));
- content.append(closebutton);
- e.after(controlpanel);
- controlpanel.hide();
- var configlink = $(' ');
- configlink.on('click', function () {
- toggleConfigScreen.bind(this)();
- }.bind(this));
- e.after(configlink);
- }
- };
- wireFunctionality = function wireFunctionality() {
- // on/off switch
- var toggleSwitch = $('#uhr-onoffswitch-checkbox' + this.id);
- toggleSwitch.on('click', function () {
- this.toggle();
- }.bind(this));
- var status = $.cookie('uhr-status' + this.id);
- if (status === undefined || this.options.force) {
- status = this.options.status;
- }
- toggleSwitch.prop('checked', status === 'on');
- if (status === 'on') {
- this.start();
- } else {
- this.stop();
- }
-
- // time mode switch
- var modeSwitch = $('#uhr-modeswitch-checkbox' + this.id);
- modeSwitch.on('click', function () {
- if (this.options.mode === 'seconds') {
- setMode.bind(this)('normal');
- } else {
- setMode.bind(this)('seconds');
- }
- }.bind(this));
-
- var mode = $.cookie('uhr-mode' + this.id);
- if (mode === undefined || this.options.force) {
- mode = this.options.mode;
- }
- modeSwitch.prop('checked', mode !== 'seconds');
- if (mode === 'seconds') {
- setMode.bind(this)('seconds');
- } else {
- setMode.bind(this)('normal');
- }
-
- // language chooser
- var languageChooser = $('#uhr-languagechooser' + this.id);
- languageChooser.on('change', function () {
- var languageKey = $('#uhr-languagechooser' + this.id).val();
- this.language(languageKey);
- }.bind(this));
- var selectedLanguage = $.cookie('uhr-language' + this.id);
- if (selectedLanguage === undefined || this.options.force) {
- selectedLanguage = this.options.language;
- }
- var found = uhrGlobals.languages.some(function (item) {
- return selectedLanguage === item.code;
- });
- if (!found) {
- var fallbackLanguage;
- if (uhrGlobals.languages.length > 0) {
- fallbackLanguage = uhrGlobals.languages[0].code;
- } else {
- fallbackLanguage = '';
- }
- console.warn("Language '" + selectedLanguage + "' not found! Using fallback '" + fallbackLanguage + "'");
- selectedLanguage = fallbackLanguage;
- }
- languageChooser.val(selectedLanguage);
- this.options.language = "";
- this.language(selectedLanguage);
-
- // theme chooser
- var themeChooser = $('#uhr-themechooser' + this.id);
- themeChooser.on('change', function () {
- var themeKey = $('#uhr-themechooser' + this.id).val();
- this.theme(themeKey);
- }.bind(this));
- var selectedTheme = $.cookie('uhr-theme' + this.id);
- if (selectedTheme === undefined || this.options.force) {
- selectedTheme = this.options.theme;
- }
- found = uhrGlobals.themes.some(function (item) {
- return selectedTheme === item.styleClass;
- });
- if (!found) {
- var fallbackTheme = uhrGlobals.themes[0].styleClass;
- console.warn("Theme '" + selectedTheme + "' not found! Using fallback '" + fallbackTheme + "'");
- selectedTheme = fallbackTheme;
- }
- themeChooser.val(selectedTheme);
- this.options.theme = "";
- this.theme(selectedTheme);
- if (this.options.autoresize) {
- $(window).on('resize', function () {
- var $e = this.element;
- var $parent = $e.parent();
- var $window = $(window);
- var parentWidth = $parent.width();
- var parentHeight = $parent.height();
- var windowWidth = $window.width();
- var windowHeight = $window.height();
- var size = Math.min(parentWidth, parentHeight, windowWidth, windowHeight) + 'px';
- setWidth.bind(this)(size);
- }.bind(this));
- }
- };
- var destroy = function destroy() {
- this.timer = null;
- $(this.element)
- .removeAttr('style')
- .removeAttr('class')
- .empty();
- $('#uhr-configlink' + this.id).remove();
- $('#uhr-controlpanel' + this.id).remove();
-
- };
- setCookie = function setCookie(cookieName, cookieValue) {
- var options = {};
- if (this.options.cookiePath !== undefined) {
- options = {expires: 365, path: this.options.cookiePath};
- } else {
- options = {expires: 365};
- }
- $.cookie(cookieName + this.id, cookieValue, options);
- };
-
- // business logic
- isOn = function isOn() {
- return this.timer !== null;
- };
- var show;
- var clear;
- update = function update() {
- if (isOn.bind(this)()) {
- var time = this.options.time;
- if (!language.bind(this)().hasOwnProperty('seconds') && this.options.mode !== 'seconds') {
- if (time.getMinutes() === this.currentMinute) {
- return;
- }
- this.currentMinute = time.getMinutes();
- }
- show.bind(this)(time);
- } else {
- clear.bind(this)();
- this.currentMinute = -1;
- }
- };
- var highlight;
- var getSecond;
- var getDotMinute;
- var getCoarseMinute;
- var getHour;
- show = function show(time) {
- var second = getSecond.bind(this)(time);
- var dotMinute = getDotMinute.bind(this)(time);
- var hour = getHour.bind(this)(time);
- var coarseMinute = getCoarseMinute.bind(this)(time);
- clear.bind(this)();
- if (this.options.mode === 'seconds') {
- highlight.bind(this)('second' + second);
- } else {
- highlight.bind(this)('on');
- for (var i = 1; i <= dotMinute; i++) {
- highlight.bind(this)('dot' + i);
- }
- highlight.bind(this)('minute' + coarseMinute);
- highlight.bind(this)('hour' + hour);
- }
- };
- highlight = function highlight(itemClass) {
- this.element.find('.item.' + itemClass).addClass('active');
- };
- clear = function clear() {
- this.element.find('.item').removeClass('active');
- };
- getSecond = function getSecond(date) {
- if (typeof language.bind(this)().getSeconds === 'function') {
- return language.bind(this)().getSeconds(date);
- }
- return date.getSeconds();
- };
- getDotMinute = function getDotMinute(date) {
- if (typeof language.bind(this)().getDotMinute === 'function') {
- return language.bind(this)().getDotMinute(date);
- }
- var minutes = date.getMinutes();
- return minutes % 5;
- };
- getCoarseMinute = function getCoarseMinute(date) {
- if (typeof language.bind(this)().getCoarseMinute === 'function') {
- return language.bind(this)().getCoarseMinute(date);
- }
- return date.getMinutes();
- };
- getHour = function getHour(date) {
- if (typeof language.bind(this)().getHour === 'function') {
- return language.bind(this)().getHour(date);
- }
- var hour = date.getHours();
- if (date.getMinutes() >= 25) {
- return (hour + 1) % 24;
- }
- return hour;
- };
- language = function language() {
- var matchingLanguages = uhrGlobals.languages.filter(function (element) {
- return (element.code === this.options.language);
- }, this);
- if (matchingLanguages.length > 0) {
- return matchingLanguages[0];
- }
- // fallback: return empty object
- return {};
- };
-
- $.widget("fritteli.uhr", {
- "options": {
- width: '100%',
- status: 'on',
- language: 'de_CH',
- theme: uhrGlobals.themes[0].styleClass,
- force: false,
- controls: true,
- cookiePath: undefined,
- autoresize: true,
- mode: 'normal'
- },
- "start": start,
- "stop": stop,
- "toggle": toggle,
- "language": setLanguage,
- "theme": setTheme,
- "time": setTime,
- "mode": setMode,
- "width": setWidth,
- // constructor method
- "_create": create,
- // destructor method
- "_destroy": destroy
- });
- $.fritteli.uhr.register = uhrGlobals.registerLanguage;
})(jQuery);
diff --git a/dist/jquery.uhr.main.min.js b/dist/jquery.uhr.main.min.js
index 7d985f6..0ac22a6 100644
--- a/dist/jquery.uhr.main.min.js
+++ b/dist/jquery.uhr.main.min.js
@@ -1 +1,4 @@
-"use strict";!function(t){var i,e,n,s={id:0,languages:[],themes:[],registerLanguage:function(t,i){s.languages.some((function(e){return t===e.code&&(console.error("Error: Language code '"+t+"' cannot be registered for language '"+i.language+"' because it is already registered for language '"+e.language+"'!"),!0)}))||(i.code=t,s.languages.push(i))}};t("link[rel=stylesheet]").each((function(i,e){var n=t(e),o=n.attr("data-class");if(void 0!==o){var h=n.attr("data-name");void 0===h&&(h=o),s.themes.push({styleClass:o,name:h})}})),0===s.themes.length&&s.themes.push({});var o;function h(t,i){var e=t,n=i||"";this.addStyle=function(t){""===n?n=t:n+=" "+t},this.toString=function(){return''+e+" "}}function a(t){var i={3:[2,3,4],4:[1,5],5:[1,4,5],6:[1,3,5],7:[1,2,5],8:[1,5],9:[2,3,4]},e={3:[8,9,10],4:[7,11],5:[7,10,11],6:[7,9,11],7:[7,8,11],8:[7,11],9:[8,9,10]},n={3:[3],4:[2,3],5:[3],6:[3],7:[3],8:[3],9:[2,3,4]},s={3:[9],4:[8,9],5:[9],6:[9],7:[9],8:[9],9:[8,9,10]},o={3:[2,3,4],4:[1,5],5:[5],6:[4],7:[3],8:[2],9:[1,2,3,4,5]},a={3:[8,9,10],4:[7,11],5:[11],6:[10],7:[9],8:[8],9:[7,8,9,10,11]},r={3:[1,2,3,4,5],4:[4],5:[3],6:[4],7:[5],8:[1,5],9:[2,3,4]},c={3:[7,8,9,10,11],4:[10],5:[9],6:[10],7:[11],8:[7,11],9:[8,9,10]},d={3:[4],4:[3,4],5:[2,4],6:[1,4],7:[1,2,3,4,5],8:[4],9:[4]},u={3:[10],4:[9,10],5:[8,10],6:[7,10],7:[7,8,9,10,11],8:[10],9:[10]},l={3:[1,2,3,4,5],4:[1],5:[1,2,3,4],6:[5],7:[5],8:[1,5],9:[2,3,4]},f={3:[7,8,9,10,11],4:[7],5:[7,8,9,10],6:[11],7:[11],8:[7,11],9:[8,9,10]},p={3:[9,10],4:[8],5:[7],6:[7,8,9,10],7:[7,11],8:[7,11],9:[8,9,10]},g={3:[7,8,9,10,11],4:[11],5:[10],6:[9],7:[8],8:[8],9:[8]},m={3:[8,9,10],4:[7,11],5:[7,11],6:[8,9,10],7:[7,11],8:[7,11],9:[8,9,10]},v={3:[8,9,10],4:[7,11],5:[7,11],6:[8,9,10,11],7:[11],8:[10],9:[8,9]},b={0:[i,e],1:[i,s],2:[i,a],3:[i,c],4:[i,u],5:[i,f],6:[i,p],7:[i,g],8:[i,m],9:[i,v],10:[n,e],11:[n,s],12:[n,a],13:[n,c],14:[n,u],15:[n,f],16:[n,p],17:[n,g],18:[n,m],19:[n,v],20:[o,e],21:[o,s],22:[o,a],23:[o,c],24:[o,u],25:[o,f],26:[o,p],27:[o,g],28:[o,m],29:[o,v],30:[r,e],31:[r,s],32:[r,a],33:[r,c],34:[r,u],35:[r,f],36:[r,p],37:[r,g],38:[r,m],39:[r,v],40:[d,e],41:[d,s],42:[d,a],43:[d,c],44:[d,u],45:[d,f],46:[d,p],47:[d,g],48:[d,m],49:[d,v],50:[l,e],51:[l,s],52:[l,a],53:[l,c],54:[l,u],55:[l,f],56:[l,p],57:[l,g],58:[l,m],59:[l,v]};function w(t,i,e){null!=e&&Object.keys(e).forEach((function(n){e[n].forEach((function(e){t[n-1][e-1].addStyle(i)}))}))}function k(t,i,e){null!=e&&(Array.isArray(e)?e.forEach((function(e){w(t,i,e)})):w(t,i,e))}function y(t,i,e){null!=e&&Object.keys(e).forEach((function(n){var s=n.split(","),o=e[n];s.forEach((function(e){k(t,i+e,o)}))}))}this.parse=function(){var i=[];return t.letters.forEach((function(t){for(var e=[],n=0;n")})),"function"==typeof e&&e(),i.fadeIn("fast")}))}}var c,d,u=function(t){this.options.mode=t,this.currentMinute=-1,n.bind(this)(),i.bind(this)("uhr-mode",t)},l=function(t){var i=this.element;i.css("width",t);var e=i.width();i.width(e),i.height(e),i.css("font-size",e/40+"px")},f=function(){t("#uhr-controlpanel"+this.id).toggle("fast")};c=function(){var i=this.element;if(i.addClass("uhr"),i.empty(),i.append(' '),i.append(' '),i.append(' '),i.append(' '),i.append('
'),i.append('
'),l.bind(this)(this.options.width),this.options.controls){var e=t('
'),n=t('
');e.append(n);var o=t('
');o.append(' '),o.append('
'),n.append(o);var h=t('
');if(h.append(' '),h.append('
'),n.append(h),s.languages.length>1){var a=t(' ');s.languages.forEach((function(t){a.append(''+t.language+" ")})),n.append(a)}if(s.themes.length>1){var r=t(' ');s.themes.forEach((function(t){r.append(''+t.name+" ")})),n.append(r)}var c=t(' ');c.on("click",function(){t("#uhr-controlpanel"+this.id).hide("fast")}.bind(this)),n.append(c),i.after(e),e.hide();var d=t(' ');d.on("click",function(){f.bind(this)()}.bind(this)),i.after(d)}},d=function(){var i=t("#uhr-onoffswitch-checkbox"+this.id);i.on("click",function(){this.toggle()}.bind(this));var e=t.cookie("uhr-status"+this.id);(void 0===e||this.options.force)&&(e=this.options.status),i.prop("checked","on"===e),"on"===e?this.start():this.stop();var n=t("#uhr-modeswitch-checkbox"+this.id);n.on("click",function(){"seconds"===this.options.mode?u.bind(this)("normal"):u.bind(this)("seconds")}.bind(this));var o=t.cookie("uhr-mode"+this.id);(void 0===o||this.options.force)&&(o=this.options.mode),n.prop("checked","seconds"!==o),"seconds"===o?u.bind(this)("seconds"):u.bind(this)("normal");var h=t("#uhr-languagechooser"+this.id);h.on("change",function(){var i=t("#uhr-languagechooser"+this.id).val();this.language(i)}.bind(this));var a=t.cookie("uhr-language"+this.id);(void 0===a||this.options.force)&&(a=this.options.language);var r,c=s.languages.some((function(t){return a===t.code}));c||(r=s.languages.length>0?s.languages[0].code:"",console.warn("Language '"+a+"' not found! Using fallback '"+r+"'"),a=r);h.val(a),this.options.language="",this.language(a);var d=t("#uhr-themechooser"+this.id);d.on("change",function(){var i=t("#uhr-themechooser"+this.id).val();this.theme(i)}.bind(this));var f=t.cookie("uhr-theme"+this.id);if((void 0===f||this.options.force)&&(f=this.options.theme),!(c=s.themes.some((function(t){return f===t.styleClass})))){var p=s.themes[0].styleClass;console.warn("Theme '"+f+"' not found! Using fallback '"+p+"'"),f=p}d.val(f),this.options.theme="",this.theme(f),this.options.autoresize&&t(window).on("resize",function(){var i=this.element.parent(),e=t(window),n=i.width(),s=i.height(),o=e.width(),h=e.height(),a=Math.min(n,s,o,h)+"px";l.bind(this)(a)}.bind(this))};var p,g,m,v,b,w,k;i=function(i,e){var n={};n=void 0!==this.options.cookiePath?{expires:365,path:this.options.cookiePath}:{expires:365},t.cookie(i+this.id,e,n)},e=function(){return null!==this.timer},n=function(){if(e.bind(this)()){var t=this.options.time;if(!o.bind(this)().hasOwnProperty("seconds")&&"seconds"!==this.options.mode){if(t.getMinutes()===this.currentMinute)return;this.currentMinute=t.getMinutes()}p.bind(this)(t)}else g.bind(this)(),this.currentMinute=-1},p=function(t){var i=v.bind(this)(t),e=b.bind(this)(t),n=k.bind(this)(t),s=w.bind(this)(t);if(g.bind(this)(),"seconds"===this.options.mode)m.bind(this)("second"+i);else{m.bind(this)("on");for(var o=1;o<=e;o++)m.bind(this)("dot"+o);m.bind(this)("minute"+s),m.bind(this)("hour"+n)}},m=function(t){this.element.find(".item."+t).addClass("active")},g=function(){this.element.find(".item").removeClass("active")},v=function(t){return"function"==typeof o.bind(this)().getSeconds?o.bind(this)().getSeconds(t):t.getSeconds()},b=function(t){return"function"==typeof o.bind(this)().getDotMinute?o.bind(this)().getDotMinute(t):t.getMinutes()%5},w=function(t){return"function"==typeof o.bind(this)().getCoarseMinute?o.bind(this)().getCoarseMinute(t):t.getMinutes()},k=function(t){if("function"==typeof o.bind(this)().getHour)return o.bind(this)().getHour(t);var i=t.getHours();return t.getMinutes()>=25?(i+1)%24:i},o=function(){var t=s.languages.filter((function(t){return t.code===this.options.language}),this);return t.length>0?t[0]:{}},t.widget("fritteli.uhr",{options:{width:"100%",status:"on",language:"de_CH",theme:s.themes[0].styleClass,force:!1,controls:!0,cookiePath:void 0,autoresize:!0,mode:"normal"},start:function(){e.bind(this)()||(this.timer=window.setInterval(function(){this.options.time=new Date,n.bind(this)()}.bind(this),1e3),n.bind(this)(),i.bind(this)("uhr-status","on"))},stop:function(){e.bind(this)()&&(window.clearInterval(this.timer),this.timer=null,n.bind(this)(),i.bind(this)("uhr-status","off"))},toggle:function(){e.bind(this)()?this.stop():this.start()},language:function(t){t!==this.options.language&&(this.options.language=t,new r(o.bind(this)(),this.element.find(".letterarea")).render.bind(this)(function(){this.currentMinute=-1,n.bind(this)()}.bind(this)),i.bind(this)("uhr-language",t),n.bind(this)())},theme:function(e){e!==this.options.theme&&(this.element.removeClass(this.options.theme).addClass(e),t("#uhr-onoffswitch"+this.id).removeClass(this.options.theme).addClass(e),this.options.theme=e,i.bind(this)("uhr-theme",e))},time:function(t){this.currentMinute=-1,null===t?this.options.time=new Date:(null!==this.timer&&window.clearInterval(this.timer),this.options.time=t),n.bind(this)()},mode:u,width:l,_create:function(){this.id=s.id++,this.timer=null,this.currentMinute=-1;var t,i=this.options.time;void 0===this.options.time&&(this.options.time=new Date),void 0!==(t=window.location.hash)&&"string"==typeof t&&"#"===t.charAt(0)&&(t=t.substring(1),(t=decodeURIComponent(t)).split("&").forEach(function(t){var i=t.split("="),e=i[0],n=i[1];switch(e){case"l":case"language":this.options.language=n,this.options.force=!0;break;case"t":case"theme":this.options.theme=n,this.options.force=!0;break;case"m":case"mode":this.options.mode=n,this.options.force=!0;break;case"s":case"status":this.options.status=n,this.options.force=!0}}.bind(this))),c.bind(this)(),d.bind(this)(),void 0!==i&&this.time(i)},_destroy:function(){this.timer=null,t(this.element).removeAttr("style").removeAttr("class").empty(),t("#uhr-configlink"+this.id).remove(),t("#uhr-controlpanel"+this.id).remove()}}),t.fritteli.uhr.register=s.registerLanguage}(jQuery);
+/*! uhr - v8.0.4-dev.0 - 2016-06-27
+* http://bärneruhr.ch/
+* Copyright (c) 2016 Manuel Friedli; Licensed GPL-3.0 */
+!function(a){"use strict";function b(a,b){this.render=function(d){if(void 0===a.parsed)switch(a.version){case 2:var e=new c(a),f=e.parse();Object.defineProperty(a,"parsed",{value:f,writable:!1,configurable:!1});break;default:return void console.warn("Unknown layout version: '"+a.version+"'")}var g=a.parsed;b.fadeOut("fast",function(){b.empty(),g.forEach(function(a,c,d){a.forEach(function(a){b.append(a.toString())}),c ")}),"function"==typeof d&&d(),b.fadeIn("fast")})}}function c(a){function b(a,b,d){"undefined"!=typeof d&&null!==d&&(Array.isArray(d)?d.forEach(function(d){c(a,b,d)}):c(a,b,d))}function c(a,b,c){"undefined"!=typeof c&&null!==c&&Object.keys(c).forEach(function(d){var e=c[d];e.forEach(function(c){a[d-1][c-1].addStyle(b)})})}function e(a,c,d){"undefined"!=typeof d&&null!==d&&Object.keys(d).forEach(function(e){var f=e.split(","),g=d[e];f.forEach(function(d){b(a,c+d,g)})})}var f={3:[2,3,4],4:[1,5],5:[1,4,5],6:[1,3,5],7:[1,2,5],8:[1,5],9:[2,3,4]},g={3:[8,9,10],4:[7,11],5:[7,10,11],6:[7,9,11],7:[7,8,11],8:[7,11],9:[8,9,10]},h={3:[3],4:[2,3],5:[3],6:[3],7:[3],8:[3],9:[2,3,4]},i={3:[9],4:[8,9],5:[9],6:[9],7:[9],8:[9],9:[8,9,10]},j={3:[2,3,4],4:[1,5],5:[5],6:[4],7:[3],8:[2],9:[1,2,3,4,5]},k={3:[8,9,10],4:[7,11],5:[11],6:[10],7:[9],8:[8],9:[7,8,9,10,11]},l={3:[1,2,3,4,5],4:[4],5:[3],6:[4],7:[5],8:[1,5],9:[2,3,4]},m={3:[7,8,9,10,11],4:[10],5:[9],6:[10],7:[11],8:[7,11],9:[8,9,10]},n={3:[4],4:[3,4],5:[2,4],6:[1,4],7:[1,2,3,4,5],8:[4],9:[4]},o={3:[10],4:[9,10],5:[8,10],6:[7,10],7:[7,8,9,10,11],8:[10],9:[10]},p={3:[1,2,3,4,5],4:[1],5:[1,2,3,4],6:[5],7:[5],8:[1,5],9:[2,3,4]},q={3:[7,8,9,10,11],4:[7],5:[7,8,9,10],6:[11],7:[11],8:[7,11],9:[8,9,10]},r={3:[9,10],4:[8],5:[7],6:[7,8,9,10],7:[7,11],8:[7,11],9:[8,9,10]},s={3:[7,8,9,10,11],4:[11],5:[10],6:[9],7:[8],8:[8],9:[8]},t={3:[8,9,10],4:[7,11],5:[7,11],6:[8,9,10],7:[7,11],8:[7,11],9:[8,9,10]},u={3:[8,9,10],4:[7,11],5:[7,11],6:[8,9,10,11],7:[11],8:[10],9:[8,9]},v={0:[f,g],1:[f,i],2:[f,k],3:[f,m],4:[f,o],5:[f,q],6:[f,r],7:[f,s],8:[f,t],9:[f,u],10:[h,g],11:[h,i],12:[h,k],13:[h,m],14:[h,o],15:[h,q],16:[h,r],17:[h,s],18:[h,t],19:[h,u],20:[j,g],21:[j,i],22:[j,k],23:[j,m],24:[j,o],25:[j,q],26:[j,r],27:[j,s],28:[j,t],29:[j,u],30:[l,g],31:[l,i],32:[l,k],33:[l,m],34:[l,o],35:[l,q],36:[l,r],37:[l,s],38:[l,t],39:[l,u],40:[n,g],41:[n,i],42:[n,k],43:[n,m],44:[n,o],45:[n,q],46:[n,r],47:[n,s],48:[n,t],49:[n,u],50:[p,g],51:[p,i],52:[p,k],53:[p,m],54:[p,o],55:[p,q],56:[p,r],57:[p,s],58:[p,t],59:[p,u]};this.parse=function(){var c=[];return a.letters.forEach(function(a){for(var b=[],e=0;e'+c+""}}var e={id:0,languages:[],themes:[],registerLanguage:function(a,b){var c=e.languages.some(function(c){return a===c.code&&(console.error("Error: Language code '"+a+"' cannot be registered for language '"+b.language+"' because it is already registered for language '"+c.language+"'!"),!0)});c||(b.code=a,e.languages.push(b))}};a("link[rel=stylesheet]").each(function(b,c){var d=a(c),f=d.attr("data-class");if(void 0!==f){var g=d.attr("data-name");void 0===g&&(g=f),e.themes.push({styleClass:f,name:g})}}),0===e.themes.length&&e.themes.push({});var f=function(){t.bind(this)()||(this.timer=window.setInterval(function(){this.options.time=new Date,u.bind(this)()}.bind(this),1e3),u.bind(this)(),s.bind(this)("uhr-status","on"))},g=function(){t.bind(this)()&&(window.clearInterval(this.timer),this.timer=null,u.bind(this)(),s.bind(this)("uhr-status","off"))},h=function(){t.bind(this)()?this.stop():this.start()},i=function(a){if(a!==this.options.language){this.options.language=a;var c=new b(C.bind(this)(),this.element.find(".letterarea"));c.render.bind(this)(function(){this.currentMinute=-1,u.bind(this)()}.bind(this)),s.bind(this)("uhr-language",a),u.bind(this)()}},j=function(b){b!==this.options.theme&&(this.element.removeClass(this.options.theme).addClass(b),a("#uhr-onoffswitch"+this.id).removeClass(this.options.theme).addClass(b),this.options.theme=b,s.bind(this)("uhr-theme",b))},k=function(a){this.currentMinute=-1,null===a?this.options.time=new Date:(null!==this.timer&&window.clearInterval(this.timer),this.options.time=a),u.bind(this)()},l=function(a){this.options.mode=a,this.currentMinute=-1,u.bind(this)(),s.bind(this)("uhr-mode",a)},m=function(a){var b=this.element;b.css("width",a);var c=b.width();b.width(c),b.height(c),b.css("font-size",c/40+"px")},n=function(){this.id=e.id++,this.timer=null,this.currentMinute=-1;var a,b,c=this.options.time;void 0===this.options.time&&(this.options.time=new Date),a=window.location.hash,void 0!==a&&"string"==typeof a&&"#"===a.charAt(0)&&(a=a.substring(1),a=decodeURIComponent(a),b=a.split("&"),b.forEach(function(a){var b=a.split("="),c=b[0],d=b[1];switch(c){case"l":case"language":this.options.language=d,this.options.force=!0;break;case"t":case"theme":this.options.theme=d,this.options.force=!0;break;case"m":case"mode":this.options.mode=d,this.options.force=!0;break;case"s":case"status":this.options.status=d,this.options.force=!0}}.bind(this))),p.bind(this)(),q.bind(this)(),void 0!==c&&this.time(c)},o=function(){a("#uhr-controlpanel"+this.id).toggle("fast")},p=function(){var b=this.element;if(b.addClass("uhr"),b.empty(),b.append(' '),b.append(' '),b.append(' '),b.append(' '),b.append('
'),b.append('
'),m.bind(this)(this.options.width),this.options.controls){var c=a('
'),d=a('
');c.append(d);var f=a('
');f.append(' '),f.append('
'),d.append(f);var g=a('
');if(g.append(' '),g.append('
'),d.append(g),e.languages.length>1){var h=a(' ');e.languages.forEach(function(a){h.append(''+a.language+" ")}),d.append(h)}if(e.themes.length>1){var i=a(' ');e.themes.forEach(function(a){i.append(''+a.name+" ")}),d.append(i)}var j=a(' ');j.on("click",function(){a("#uhr-controlpanel"+this.id).hide("fast")}.bind(this)),d.append(j),b.after(c),c.hide();var k=a(' ');k.on("click",function(){o.bind(this)()}.bind(this)),b.after(k)}},q=function(){var b=a("#uhr-onoffswitch-checkbox"+this.id);b.on("click",function(){this.toggle()}.bind(this));var c=a.cookie("uhr-status"+this.id);(void 0===c||this.options.force)&&(c=this.options.status),b.prop("checked","on"===c),"on"===c?this.start():this.stop();var d=a("#uhr-modeswitch-checkbox"+this.id);d.on("click",function(){"seconds"===this.options.mode?l.bind(this)("normal"):l.bind(this)("seconds")}.bind(this));var f=a.cookie("uhr-mode"+this.id);(void 0===f||this.options.force)&&(f=this.options.mode),d.prop("checked","seconds"!==f),"seconds"===f?l.bind(this)("seconds"):l.bind(this)("normal");var g=a("#uhr-languagechooser"+this.id);g.on("change",function(){var b=a("#uhr-languagechooser"+this.id).val();this.language(b)}.bind(this));var h=a.cookie("uhr-language"+this.id);(void 0===h||this.options.force)&&(h=this.options.language);var i=e.languages.some(function(a){return h===a.code});if(!i){var j;j=e.languages.length>0?e.languages[0].code:"",console.warn("Language '"+h+"' not found! Using fallback '"+j+"'"),h=j}g.val(h),this.options.language="",this.language(h);var k=a("#uhr-themechooser"+this.id);k.on("change",function(){var b=a("#uhr-themechooser"+this.id).val();this.theme(b)}.bind(this));var n=a.cookie("uhr-theme"+this.id);if((void 0===n||this.options.force)&&(n=this.options.theme),i=e.themes.some(function(a){return n===a.styleClass}),!i){var o=e.themes[0].styleClass;console.warn("Theme '"+n+"' not found! Using fallback '"+o+"'"),n=o}k.val(n),this.options.theme="",this.theme(n),this.options.autoresize&&a(window).on("resize",function(){var b=this.element,c=b.parent(),d=a(window),e=c.width(),f=c.height(),g=d.width(),h=d.height(),i=Math.min(e,f,g,h)+"px";m.bind(this)(i)}.bind(this))},r=function(){this.timer=null,a(this.element).removeAttr("style").removeAttr("class").empty(),a("#uhr-configlink"+this.id).remove(),a("#uhr-controlpanel"+this.id).remove()},s=function(b,c){var d={};d=void 0!==this.options.cookiePath?{expires:365,path:this.options.cookiePath}:{expires:365},a.cookie(b+this.id,c,d)},t=function(){return null!==this.timer},u=function(){if(t.bind(this)()){var a=this.options.time;if(!C.bind(this)().hasOwnProperty("seconds")&&"seconds"!==this.options.mode){if(a.getMinutes()===this.currentMinute)return;this.currentMinute=a.getMinutes()}v.bind(this)(a)}else x.bind(this)(),this.currentMinute=-1},v=function(a){var b=y.bind(this)(a),c=z.bind(this)(a),d=B.bind(this)(a),e=A.bind(this)(a);if(x.bind(this)(),"seconds"===this.options.mode)w.bind(this)("second"+b);else{w.bind(this)("on");for(var f=1;f<=c;f++)w.bind(this)("dot"+f);w.bind(this)("minute"+e),w.bind(this)("hour"+d)}},w=function(a){this.element.find(".item."+a).addClass("active")},x=function(){this.element.find(".item").removeClass("active")},y=function(a){return"function"==typeof C.bind(this)().getSeconds?C.bind(this)().getSeconds(a):a.getSeconds()},z=function(a){if("function"==typeof C.bind(this)().getDotMinute)return C.bind(this)().getDotMinute(a);var b=a.getMinutes();return b%5},A=function(a){return"function"==typeof C.bind(this)().getCoarseMinute?C.bind(this)().getCoarseMinute(a):a.getMinutes()},B=function(a){if("function"==typeof C.bind(this)().getHour)return C.bind(this)().getHour(a);var b=a.getHours();return a.getMinutes()>=25?(b+1)%24:b},C=function(){var a=e.languages.filter(function(a){return a.code===this.options.language},this);return a.length>0?a[0]:{}};a.widget("fritteli.uhr",{options:{width:"100%",status:"on",language:"de_CH",theme:e.themes[0].styleClass,force:!1,controls:!0,cookiePath:void 0,autoresize:!0,mode:"normal"},start:f,stop:g,toggle:h,language:i,theme:j,time:k,mode:l,width:m,_create:n,_destroy:r}),a.fritteli.uhr.register=e.registerLanguage}(jQuery);
\ No newline at end of file
diff --git a/dist/libs.js b/dist/libs.js
index a0f9f5a..eb28d8c 100644
--- a/dist/libs.js
+++ b/dist/libs.js
@@ -1,22 +1,23 @@
-'use strict';
-
+/*! uhr - v8.0.4-dev.0 - 2016-06-27
+* http://bärneruhr.ch/
+* Copyright (c) 2016 Manuel Friedli; Licensed GPL-3.0 */
/*!
- * jQuery JavaScript Library v3.5.1
- * https://jquery.com/
+ * jQuery JavaScript Library v2.1.4
+ * http://jquery.com/
*
* Includes Sizzle.js
- * https://sizzlejs.com/
+ * http://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
* Released under the MIT license
- * https://jquery.org/license
+ * http://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2015-04-28T16:01Z
*/
-( function( global, factory ) {
+
+(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`
@@ -37,20 +38,19 @@
}
// Pass this if window is not defined yet
-} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+}(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)
+//
var arr = [];
-var getProto = Object.getPrototypeOf;
-
var slice = arr.slice;
-var flat = arr.flat ? function( array ) {
- return arr.flat.call( array );
-} : function( array ) {
- return arr.concat.apply( [], array );
-};
-
+var concat = arr.concat;
var push = arr.push;
@@ -62,102 +62,45 @@ var toString = class2type.toString;
var hasOwn = class2type.hasOwnProperty;
-var fnToString = hasOwn.toString;
-
-var ObjectFunctionString = fnToString.call( Object );
-
var support = {};
-var isFunction = function isFunction( obj ) {
-
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
-
-
-var isWindow = function isWindow( obj ) {
- return obj != null && obj === obj.window;
- };
-
-
-var document = window.document;
-
-
-
- var preservedScriptAttributes = {
- type: true,
- src: true,
- nonce: true,
- noModule: true
- };
-
- function DOMEval( code, node, doc ) {
- doc = doc || document;
-
- var i, val,
- script = doc.createElement( "script" );
-
- script.text = code;
- if ( node ) {
- for ( i in preservedScriptAttributes ) {
-
- // Support: Firefox 64+, Edge 18+
- // Some browsers don't support the "nonce" property on scripts.
- // On the other hand, just using `getAttribute` is not enough as
- // the `nonce` attribute is reset to an empty string whenever it
- // becomes browsing-context connected.
- // See https://github.com/whatwg/html/issues/2369
- // See https://html.spec.whatwg.org/#nonce-attributes
- // The `node.getAttribute` check was added for the sake of
- // `jQuery.globalEval` so that it can fake a nonce-containing node
- // via an object.
- val = node[ i ] || node.getAttribute && node.getAttribute( i );
- if ( val ) {
- script.setAttribute( i, val );
- }
- }
- }
- doc.head.appendChild( script ).parentNode.removeChild( script );
- }
-
-
-function toType( obj ) {
- if ( obj == null ) {
- return obj + "";
- }
-
- // Support: Android <=2.3 only (functionish RegExp)
- return typeof obj === "object" || typeof obj === "function" ?
- class2type[ toString.call( obj ) ] || "object" :
- typeof obj;
-}
-/* global Symbol */
-// Defining this global in .eslintrc.json would create a danger of using the global
-// unguarded in another place, it seems safer to define global only for this module
-
var
- version = "3.5.1",
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ version = "2.1.4",
// 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,
@@ -168,14 +111,13 @@ jQuery.fn = jQuery.prototype = {
// 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 all the elements in a clean array
- if ( num == null ) {
- return slice.call( this );
- }
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
- // Return just the one element from the set
- return 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
@@ -187,20 +129,23 @@ jQuery.fn = jQuery.prototype = {
// 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 );
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
},
map: function( callback ) {
- return this.pushStack( jQuery.map( this, function( elem, i ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
return callback.call( elem, i, elem );
- } ) );
+ }));
},
slice: function() {
@@ -215,26 +160,14 @@ jQuery.fn = jQuery.prototype = {
return this.eq( -1 );
},
- even: function() {
- return this.pushStack( jQuery.grep( this, function( _elem, i ) {
- return ( i + 1 ) % 2;
- } ) );
- },
-
- odd: function() {
- return this.pushStack( jQuery.grep( this, function( _elem, i ) {
- return i % 2;
- } ) );
- },
-
eq: function( i ) {
var len = this.length,
j = +i + ( i < 0 ? len : 0 );
- return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
},
end: function() {
- return this.prevObject || this.constructor();
+ return this.prevObject || this.constructor(null);
},
// For internal use only.
@@ -246,7 +179,7 @@ jQuery.fn = jQuery.prototype = {
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone,
- target = arguments[ 0 ] || {},
+ target = arguments[0] || {},
i = 1,
length = arguments.length,
deep = false;
@@ -261,7 +194,7 @@ jQuery.extend = jQuery.fn.extend = function() {
}
// Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !isFunction( target ) ) {
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
target = {};
}
@@ -272,34 +205,27 @@ jQuery.extend = jQuery.fn.extend = function() {
}
for ( ; i < length; i++ ) {
-
// Only deal with non-null/undefined values
- if ( ( options = arguments[ i ] ) != null ) {
-
+ if ( (options = arguments[ i ]) != null ) {
// Extend the base object
for ( name in options ) {
+ src = target[ name ];
copy = options[ name ];
- // Prevent Object.prototype pollution
// Prevent never-ending loop
- if ( name === "__proto__" || target === copy ) {
+ if ( target === copy ) {
continue;
}
// Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
- ( copyIsArray = Array.isArray( copy ) ) ) ) {
- src = target[ name ];
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
- // Ensure proper type for the source value
- if ( copyIsArray && !Array.isArray( src ) ) {
- clone = [];
- } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
- clone = {};
} else {
- clone = src;
+ clone = src && jQuery.isPlainObject(src) ? src : {};
}
- copyIsArray = false;
// Never move original objects, clone them
target[ name ] = jQuery.extend( deep, clone, copy );
@@ -316,8 +242,7 @@ jQuery.extend = jQuery.fn.extend = function() {
return target;
};
-jQuery.extend( {
-
+jQuery.extend({
// Unique for each copy of jQuery on the page
expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
@@ -330,56 +255,138 @@ jQuery.extend( {
noop: function() {},
- isPlainObject: function( obj ) {
- var proto, Ctor;
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
- // Detect obvious negatives
- // Use toString instead of jQuery.type to catch host objects
- if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+ 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)
+ return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ // 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;
}
- proto = getProto( obj );
-
- // Objects with no prototype (e.g., `Object.create( null )`) are plain
- if ( !proto ) {
- return true;
+ if ( obj.constructor &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
}
- // Objects with prototype are plain iff they were constructed by a global Object function
- Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
- return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
},
isEmptyObject: function( obj ) {
var name;
-
for ( name in obj ) {
return false;
}
return true;
},
- // Evaluates a script in a provided context; falls back to the global one
- // if not specified.
- globalEval: function( code, options, doc ) {
- DOMEval( code, { nonce: options && options.nonce }, doc );
+ 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;
},
- each: function( obj, callback ) {
- var length, i = 0;
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
- if ( isArrayLike( obj ) ) {
- length = obj.length;
- for ( ; i < length; i++ ) {
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
- break;
+ 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();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
}
}
+
+ // A special, fast, case for the most common use of each
} else {
- for ( i in obj ) {
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
- break;
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
}
}
}
@@ -387,12 +394,19 @@ jQuery.extend( {
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 ) ) ) {
+ if ( isArraylike( Object(arr) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
[ arr ] : arr
@@ -409,8 +423,6 @@ jQuery.extend( {
return arr == null ? -1 : indexOf.call( arr, elem, i );
},
- // Support: Android <=4.0 only, PhantomJS 1 only
- // push.apply(_, arraylike) throws on ancient WebKit
merge: function( first, second ) {
var len = +second.length,
j = 0,
@@ -446,13 +458,14 @@ jQuery.extend( {
// arg is for internal usage only
map: function( elems, callback, arg ) {
- var length, value,
+ var value,
i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
ret = [];
// Go through the array, translating each of the items to their new values
- if ( isArrayLike( elems ) ) {
- length = elems.length;
+ if ( isArray ) {
for ( ; i < length; i++ ) {
value = callback( elems[ i ], i, arg );
@@ -473,55 +486,86 @@ jQuery.extend( {
}
// Flatten any nested arrays
- return flat( ret );
+ 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
-} );
-
-if ( typeof Symbol === "function" ) {
- jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
-}
+});
// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+});
-function isArrayLike( obj ) {
+function isArraylike( obj ) {
- // Support: real iOS 8.2 only (not reproducible in simulator)
+ // 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 = toType( obj );
+ var length = "length" in obj && obj.length,
+ type = jQuery.type( obj );
- if ( isFunction( obj ) || isWindow( obj ) ) {
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
return false;
}
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
return type === "array" || length === 0 ||
typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
- * https://sizzlejs.com/
+ * Sizzle CSS Selector Engine v2.2.0-pre
+ * http://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
* Released under the MIT license
- * https://js.foundation/
+ * http://jquery.org/license
*
- * Date: 2020-03-14
+ * Date: 2014-12-16
*/
-( function( window ) {
+(function( window ) {
+
var i,
support,
Expr,
@@ -552,7 +596,6 @@ var i,
classCache = createCache(),
tokenCache = createCache(),
compilerCache = createCache(),
- nonnativeSelectorCache = createCache(),
sortOrder = function( a, b ) {
if ( a === b ) {
hasDuplicate = true;
@@ -560,95 +603,89 @@ var i,
return 0;
},
+ // General-purpose constants
+ MAX_NEGATIVE = 1 << 31,
+
// Instance methods
- hasOwn = ( {} ).hasOwnProperty,
+ hasOwn = ({}).hasOwnProperty,
arr = [],
pop = arr.pop,
- pushNative = arr.push,
+ push_native = arr.push,
push = arr.push,
slice = arr.slice,
-
// Use a stripped-down indexOf as it's faster than native
- // https://jsperf.com/thor-indexof-vs-for/5
+ // 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 ) {
+ 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",
+ 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 characters http://www.w3.org/TR/css3-selectors/#whitespace
whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
- // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
- identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
- "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
- attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
-
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
// Operator (capture 2)
"*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
- // "Attribute values must be CSS identifiers [capture 5]
- // or strings [capture 3 or capture 4]"
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
- whitespace + "*\\]",
-
- pseudos = ":(" + identifier + ")(?:\\((" +
-
+ pseudos = ":(" + characterEncoding + ")(?:\\((" +
// 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" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
- "*" ),
- rdescend = new RegExp( 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 + "|[*])" ),
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
"ATTR": new RegExp( "^" + attributes ),
"PSEUDO": new RegExp( "^" + pseudos ),
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
- whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
- whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "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" )
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
},
- rhtml = /HTML$/i,
rinputs = /^(?:input|select|textarea|button)$/i,
rheader = /^h\d$/i,
@@ -658,79 +695,47 @@ var i,
rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
rsibling = /[+~]/,
+ rescape = /'|\\/g,
- // CSS escapes
- // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
- runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
- funescape = function( escape, nonHex ) {
- var high = "0x" + escape.slice( 1 ) - 0x10000;
-
- return nonHex ?
-
- // Strip the backslash prefix from a non-hex escape sequence
- nonHex :
-
- // Replace a hexadecimal escape sequence with the encoded Unicode code point
- // Support: IE <=11+
- // For values outside the Basic Multilingual Plane (BMP), manually construct a
- // surrogate pair
+ // 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 );
},
- // CSS string/identifier serialization
- // https://drafts.csswg.org/cssom/#common-serializing-idioms
- rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
- fcssescape = function( ch, asCodePoint ) {
- if ( asCodePoint ) {
-
- // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
- if ( ch === "\0" ) {
- return "\uFFFD";
- }
-
- // Control characters and (dependent upon position) numbers get escaped as code points
- return ch.slice( 0, -1 ) + "\\" +
- ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
- }
-
- // Other potentially-special ASCII characters get backslash-escaped
- return "\\" + ch;
- },
-
// Used for iframes
// See setDocument()
// Removing the function wrapper causes a "Permission Denied"
// error in IE
unloadHandler = function() {
setDocument();
- },
-
- inDisabledFieldset = addCombinator(
- function( elem ) {
- return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
- },
- { dir: "parentNode", next: "legend" }
- );
+ };
// Optimize for push.apply( _, NodeList )
try {
push.apply(
- ( arr = slice.call( preferredDoc.childNodes ) ),
+ (arr = slice.call( preferredDoc.childNodes )),
preferredDoc.childNodes
);
-
// Support: Android<4.0
// Detect silently failing push.apply
- // eslint-disable-next-line no-unused-expressions
arr[ preferredDoc.childNodes.length ].nodeType;
} catch ( e ) {
push = { apply: arr.length ?
// Leverage slice if possible
function( target, els ) {
- pushNative.apply( target, slice.call( els ) );
+ push_native.apply( target, slice.call(els) );
} :
// Support: IE<9
@@ -738,146 +743,111 @@ try {
function( target, els ) {
var j = target.length,
i = 0;
-
// Can't trust NodeList.length
- while ( ( target[ j++ ] = els[ i++ ] ) ) {}
+ while ( (target[j++] = els[i++]) ) {}
target.length = j - 1;
}
};
}
function Sizzle( selector, context, results, seed ) {
- var m, i, elem, nid, match, groups, newSelector,
- newContext = context && context.ownerDocument,
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
- // nodeType defaults to 9, since context defaults to document
- nodeType = context ? context.nodeType : 9;
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+ context = context || document;
results = results || [];
+ nodeType = context.nodeType;
- // 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 ) {
- 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 ) {
+ if ( !seed && documentIsHTML ) {
+ // Try to shortcut find operations when possible (e.g., not under DocumentFragment)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document (jQuery #6963)
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
results.push( elem );
return results;
}
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
}
-
- // 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;
}
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType !== 1 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+ newSelector = groups.join(",");
}
- // Take advantage of querySelectorAll
- if ( support.qsa &&
- !nonnativeSelectorCache[ selector + " " ] &&
- ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
-
- // Support: IE 8 only
- // Exclude object elements
- ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
-
- newSelector = selector;
- newContext = context;
-
- // qSA considers elements outside a scoping root when evaluating child or
- // descendant combinators, which is not what we want.
- // In such cases, we work around the behavior by prefixing every selector in the
- // list with an ID selector referencing the scope context.
- // The technique has to be used as well when a leading combinator is used
- // as such selectors are not recognized by querySelectorAll.
- // Thanks to Andrew Dupont for this technique.
- if ( nodeType === 1 &&
- ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
-
- // Expand context for sibling selectors
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
- context;
-
- // We can use :scope instead of the ID hack if the browser
- // supports it & if we're not changing the context.
- if ( newContext !== context || !support.scope ) {
-
- // Capture the context ID, setting it first if necessary
- if ( ( nid = context.getAttribute( "id" ) ) ) {
- nid = nid.replace( rcssescape, fcssescape );
- } else {
- context.setAttribute( "id", ( nid = expando ) );
- }
- }
-
- // Prefix every selector in the list
- groups = tokenize( selector );
- i = groups.length;
- while ( i-- ) {
- groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
- toSelector( groups[ i ] );
- }
- newSelector = groups.join( "," );
- }
-
+ if ( newSelector ) {
try {
push.apply( results,
newContext.querySelectorAll( newSelector )
);
return results;
- } catch ( qsaError ) {
- nonnativeSelectorCache( selector, true );
+ } catch(qsaError) {
} finally {
- if ( nid === expando ) {
- context.removeAttribute( "id" );
+ if ( !old ) {
+ context.removeAttribute("id");
}
}
}
@@ -890,7 +860,7 @@ function Sizzle( selector, context, results, seed ) {
/**
* Create key-value caches of limited size
- * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * @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
*/
@@ -898,14 +868,12 @@ 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[ key + " " ] = value);
}
return cache;
}
@@ -921,24 +889,22 @@ function markFunction( fn ) {
/**
* Support testing using an element
- * @param {Function} fn Passed the created element and returns a boolean result
+ * @param {Function} fn Passed the created div and expects a boolean result
*/
function assert( fn ) {
- var el = document.createElement( "fieldset" );
+ var div = document.createElement("div");
try {
- return !!fn( el );
- } catch ( e ) {
+ return !!fn( div );
+ } catch (e) {
return false;
} finally {
-
// Remove from its parent by default
- if ( el.parentNode ) {
- el.parentNode.removeChild( el );
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
}
-
// release memory in IE
- el = null;
+ div = null;
}
}
@@ -948,11 +914,11 @@ function assert( fn ) {
* @param {Function} handler The method that will be applied
*/
function addHandle( attrs, handler ) {
- var arr = attrs.split( "|" ),
- i = arr.length;
+ var arr = attrs.split("|"),
+ i = attrs.length;
while ( i-- ) {
- Expr.attrHandle[ arr[ i ] ] = handler;
+ Expr.attrHandle[ arr[i] ] = handler;
}
}
@@ -965,7 +931,8 @@ function addHandle( attrs, handler ) {
function siblingCheck( a, b ) {
var cur = b && a,
diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
- a.sourceIndex - b.sourceIndex;
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
// Use IE sourceIndex if available on both nodes
if ( diff ) {
@@ -974,7 +941,7 @@ function siblingCheck( a, b ) {
// Check if b follows a
if ( cur ) {
- while ( ( cur = cur.nextSibling ) ) {
+ while ( (cur = cur.nextSibling) ) {
if ( cur === b ) {
return -1;
}
@@ -1002,63 +969,7 @@ function createInputPseudo( 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 :enabled/:disabled
- * @param {Boolean} disabled true for :disabled; false for :enabled
- */
-function createDisabledPseudo( disabled ) {
-
- // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
- return function( elem ) {
-
- // Only certain elements can match :enabled or :disabled
- // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
- // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
- if ( "form" in elem ) {
-
- // Check for inherited disabledness on relevant non-disabled elements:
- // * listed form-associated elements in a disabled fieldset
- // https://html.spec.whatwg.org/multipage/forms.html#category-listed
- // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
- // * option elements in a disabled optgroup
- // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
- // All such elements have a "form" property.
- if ( elem.parentNode && elem.disabled === false ) {
-
- // Option elements defer to a parent optgroup if present
- if ( "label" in elem ) {
- if ( "label" in elem.parentNode ) {
- return elem.parentNode.disabled === disabled;
- } else {
- return elem.disabled === disabled;
- }
- }
-
- // Support: IE 6 - 11
- // Use the isDisabled shortcut property to check for disabled fieldset ancestors
- return elem.isDisabled === disabled ||
-
- // Where there is no isDisabled, check manually
- /* jshint -W018 */
- elem.isDisabled !== !disabled &&
- inDisabledFieldset( elem ) === disabled;
- }
-
- return elem.disabled === disabled;
-
- // Try to winnow out elements that can't be disabled before trusting the disabled property.
- // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
- // even exist on them, let alone have a boolean value.
- } else if ( "label" in elem ) {
- return elem.disabled === disabled;
- }
-
- // Remaining elements are neither :enabled nor :disabled
- return false;
+ return (name === "input" || name === "button") && elem.type === type;
};
}
@@ -1067,21 +978,21 @@ function createDisabledPseudo( disabled ) {
* @param {Function} fn
*/
function createPositionalPseudo( fn ) {
- return markFunction( function( argument ) {
+ return markFunction(function( argument ) {
argument = +argument;
- return markFunction( function( seed, matches ) {
+ 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 ] );
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
}
}
- } );
- } );
+ });
+ });
}
/**
@@ -1102,13 +1013,10 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
-
- // Support: IE <=8
- // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
- // https://bugs.jquery.com/ticket/4833
- return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
+ // 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;
};
/**
@@ -1117,52 +1025,35 @@ isXML = Sizzle.isXML = function( elem ) {
* @returns {Object} Returns the current document
*/
setDocument = Sizzle.setDocument = function( node ) {
- var hasCompare, subWindow,
+ var hasCompare, parent,
doc = node ? node.ownerDocument || node : preferredDoc;
- // Return early if doc is invalid or already selected
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
return document;
}
- // Update global variables
+ // Set our document
document = doc;
- docElem = document.documentElement;
- documentIsHTML = !isXML( document );
+ docElem = doc.documentElement;
+ parent = doc.defaultView;
- // Support: IE 9 - 11+, Edge 12 - 18+
- // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( preferredDoc != document &&
- ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
-
- // Support: IE 11, Edge
- if ( subWindow.addEventListener ) {
- subWindow.addEventListener( "unload", unloadHandler, false );
-
- // Support: IE 9 - 10 only
- } else if ( subWindow.attachEvent ) {
- subWindow.attachEvent( "onunload", unloadHandler );
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent !== parent.top ) {
+ // IE11 does not have attachEvent, so all must suffer
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", unloadHandler, false );
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", unloadHandler );
}
}
- // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
- // Safari 4 - 5 only, Opera <=11.6 - 12.x only
- // IE/Edge & older browsers don't support the :scope pseudo-class.
- // Support: Safari 6.0 only
- // Safari 6.0 supports :scope but it's an alias of :root there.
- support.scope = assert( function( el ) {
- docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
- return typeof el.querySelectorAll !== "undefined" &&
- !el.querySelectorAll( ":scope fieldset div" ).length;
- } );
+ /* Support tests
+ ---------------------------------------------------------------------- */
+ documentIsHTML = !isXML( doc );
/* Attributes
---------------------------------------------------------------------- */
@@ -1170,89 +1061,64 @@ setDocument = Sizzle.setDocument = function( node ) {
// Support: IE<8
// Verify that getAttribute really returns attributes and not properties
// (excepting IE8 booleans)
- support.attributes = assert( function( el ) {
- el.className = "i";
- return !el.getAttribute( "className" );
- } );
+ 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( el ) {
- el.appendChild( document.createComment( "" ) );
- return !el.getElementsByTagName( "*" ).length;
- } );
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
// Support: IE<9
- support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName );
// Support: IE<10
// Check if getElementById returns elements by name
- // The broken getElementById methods don't pick up programmatically-set names,
+ // The broken getElementById methods don't pick up programatically-set names,
// so use a roundabout getElementsByName test
- support.getById = assert( function( el ) {
- docElem.appendChild( el ).id = expando;
- return !document.getElementsByName || !document.getElementsByName( expando ).length;
- } );
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
- // ID filter and find
+ // ID find and filter
if ( support.getById ) {
- Expr.filter[ "ID" ] = function( id ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
var attrId = id.replace( runescape, funescape );
return function( elem ) {
- return elem.getAttribute( "id" ) === attrId;
+ return elem.getAttribute("id") === attrId;
};
};
- Expr.find[ "ID" ] = function( id, context ) {
- if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
- var elem = context.getElementById( id );
- return elem ? [ elem ] : [];
- }
- };
} else {
- Expr.filter[ "ID" ] = function( id ) {
+ // 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" );
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
return node && node.value === attrId;
};
};
-
- // Support: IE 6 - 7 only
- // getElementById is not reliable as a find shortcut
- Expr.find[ "ID" ] = function( id, context ) {
- if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
- var node, i, elems,
- elem = context.getElementById( id );
-
- if ( elem ) {
-
- // Verify the id attribute
- node = elem.getAttributeNode( "id" );
- if ( node && node.value === id ) {
- return [ elem ];
- }
-
- // Fall back on getElementsByName
- elems = context.getElementsByName( id );
- i = 0;
- while ( ( elem = elems[ i++ ] ) ) {
- node = elem.getAttributeNode( "id" );
- if ( node && node.value === id ) {
- return [ elem ];
- }
- }
- }
-
- return [];
- }
- };
}
// Tag
- Expr.find[ "TAG" ] = support.getElementsByTagName ?
+ Expr.find["TAG"] = support.getElementsByTagName ?
function( tag, context ) {
if ( typeof context.getElementsByTagName !== "undefined" ) {
return context.getElementsByTagName( tag );
@@ -1267,13 +1133,12 @@ setDocument = Sizzle.setDocument = function( node ) {
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++ ] ) ) {
+ while ( (elem = results[i++]) ) {
if ( elem.nodeType === 1 ) {
tmp.push( elem );
}
@@ -1285,8 +1150,8 @@ setDocument = Sizzle.setDocument = function( node ) {
};
// Class
- Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
- if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( documentIsHTML ) {
return context.getElementsByClassName( className );
}
};
@@ -1303,142 +1168,108 @@ setDocument = Sizzle.setDocument = function( node ) {
// 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 https://bugs.jquery.com/ticket/13378
+ // See http://bugs.jquery.com/ticket/13378
rbuggyQSA = [];
- if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
-
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
// Build QSA regex
// Regex strategy adopted from Diego Perini
- assert( function( el ) {
-
- var input;
-
+ 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
- // https://bugs.jquery.com/ticket/12359
- docElem.appendChild( el ).innerHTML = " " +
- "" +
+ // http://bugs.jquery.com/ticket/12359
+ docElem.appendChild( div ).innerHTML = " " +
+ "" +
" ";
// 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
- // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
- if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
+ // 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 ( !el.querySelectorAll( "[selected]" ).length ) {
+ 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 ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
- rbuggyQSA.push( "~=" );
- }
-
- // Support: IE 11+, Edge 15 - 18+
- // IE 11/Edge don't find elements on a `[name='']` query in some cases.
- // Adding a temporary attribute to the document before the selection works
- // around the issue.
- // Interestingly, IE 10 & older don't seem to have the issue.
- input = document.createElement( "input" );
- input.setAttribute( "name", "" );
- el.appendChild( input );
- if ( !el.querySelectorAll( "[name='']" ).length ) {
- rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
- whitespace + "*(?:''|\"\")" );
+ // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+
+ 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 ( !el.querySelectorAll( ":checked" ).length ) {
- rbuggyQSA.push( ":checked" );
+ 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 sibling-combinator selector` fails
- if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
- rbuggyQSA.push( ".#.+[+~]" );
+ // In-page `selector#id sibing-combinator selector` fails
+ if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
}
+ });
- // Support: Firefox <=3.6 - 5 only
- // Old Firefox doesn't throw on a badly-escaped identifier.
- el.querySelectorAll( "\\\f" );
- rbuggyQSA.push( "[\\r\\n\\f]" );
- } );
-
- assert( function( el ) {
- el.innerHTML = " " +
- " ";
-
+ assert(function( div ) {
// Support: Windows 8 Native Apps
// The type and name attributes are restricted during .innerHTML assignment
- var input = document.createElement( "input" );
+ var input = doc.createElement("input");
input.setAttribute( "type", "hidden" );
- el.appendChild( input ).setAttribute( "name", "D" );
+ div.appendChild( input ).setAttribute( "name", "D" );
// Support: IE8
// Enforce case-sensitivity of name attribute
- if ( el.querySelectorAll( "[name=d]" ).length ) {
+ 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 ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
+ if ( !div.querySelectorAll(":enabled").length ) {
rbuggyQSA.push( ":enabled", ":disabled" );
}
- // Support: IE9-11+
- // IE's :disabled selector does not pick up the children of disabled fieldsets
- docElem.appendChild( el ).disabled = true;
- if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
- rbuggyQSA.push( ":enabled", ":disabled" );
- }
-
- // Support: Opera 10 - 11 only
// Opera 10-11 does not throw on post-comma invalid pseudos
- el.querySelectorAll( "*,:x" );
- rbuggyQSA.push( ",.*:" );
- } );
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
}
- if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
docElem.webkitMatchesSelector ||
docElem.mozMatchesSelector ||
docElem.oMatchesSelector ||
- docElem.msMatchesSelector ) ) ) ) {
-
- assert( function( el ) {
+ 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( el, "*" );
+ support.disconnectedMatch = matches.call( div, "div" );
// This should fail with an exception
// Gecko does not error, returns false instead
- matches.call( el, "[s!='']:x" );
+ matches.call( div, "[s!='']:x" );
rbuggyMatches.push( "!=", pseudos );
- } );
+ });
}
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
+ 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
+ // Purposefully does not implement inclusive descendent
// As in, an element does not contain itself
contains = hasCompare || rnative.test( docElem.contains ) ?
function( a, b ) {
@@ -1448,11 +1279,11 @@ setDocument = Sizzle.setDocument = function( node ) {
adown.contains ?
adown.contains( bup ) :
a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
- ) );
+ ));
} :
function( a, b ) {
if ( b ) {
- while ( ( b = b.parentNode ) ) {
+ while ( (b = b.parentNode) ) {
if ( b === a ) {
return true;
}
@@ -1481,11 +1312,7 @@ setDocument = Sizzle.setDocument = function( node ) {
}
// Calculate position if both inputs belong to the same document
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
a.compareDocumentPosition( b ) :
// Otherwise we know they are disconnected
@@ -1493,24 +1320,13 @@ setDocument = Sizzle.setDocument = function( node ) {
// Disconnected nodes
if ( compare & 1 ||
- ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
// Choose the first element that is related to our preferred document
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( a == document || a.ownerDocument == preferredDoc &&
- contains( preferredDoc, a ) ) {
+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
return -1;
}
-
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( b == document || b.ownerDocument == preferredDoc &&
- contains( preferredDoc, b ) ) {
+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
return 1;
}
@@ -1523,7 +1339,6 @@ setDocument = Sizzle.setDocument = function( node ) {
return compare & 4 ? -1 : 1;
} :
function( a, b ) {
-
// Exit early if the nodes are identical
if ( a === b ) {
hasDuplicate = true;
@@ -1539,14 +1354,8 @@ setDocument = Sizzle.setDocument = function( node ) {
// Parentless nodes are either documents or disconnected
if ( !aup || !bup ) {
-
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- /* eslint-disable eqeqeq */
- return a == document ? -1 :
- b == document ? 1 :
- /* eslint-enable eqeqeq */
+ return a === doc ? -1 :
+ b === doc ? 1 :
aup ? -1 :
bup ? 1 :
sortInput ?
@@ -1560,36 +1369,30 @@ setDocument = Sizzle.setDocument = function( node ) {
// Otherwise we need full lists of their ancestors for comparison
cur = a;
- while ( ( cur = cur.parentNode ) ) {
+ while ( (cur = cur.parentNode) ) {
ap.unshift( cur );
}
cur = b;
- while ( ( cur = cur.parentNode ) ) {
+ while ( (cur = cur.parentNode) ) {
bp.unshift( cur );
}
// Walk down the tree looking for a discrepancy
- while ( ap[ i ] === bp[ i ] ) {
+ while ( ap[i] === bp[i] ) {
i++;
}
return i ?
-
// Do a sibling check if the nodes have a common ancestor
- siblingCheck( ap[ i ], bp[ i ] ) :
+ siblingCheck( ap[i], bp[i] ) :
// Otherwise nodes in our document sort first
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- /* eslint-disable eqeqeq */
- ap[ i ] == preferredDoc ? -1 :
- bp[ i ] == preferredDoc ? 1 :
- /* eslint-enable eqeqeq */
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
0;
};
- return document;
+ return doc;
};
Sizzle.matches = function( expr, elements ) {
@@ -1597,10 +1400,15 @@ Sizzle.matches = function( expr, elements ) {
};
Sizzle.matchesSelector = function( elem, expr ) {
- setDocument( elem );
+ // 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 &&
- !nonnativeSelectorCache[ expr + " " ] &&
( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
@@ -1609,46 +1417,32 @@ Sizzle.matchesSelector = function( 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 ) {
+ // 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 ) {
- nonnativeSelectorCache( expr, true );
- }
+ } catch (e) {}
}
return Sizzle( expr, document, null, [ elem ] ).length > 0;
};
Sizzle.contains = function( context, elem ) {
-
// Set document vars if needed
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( ( context.ownerDocument || context ) != document ) {
+ if ( ( context.ownerDocument || context ) !== document ) {
setDocument( context );
}
return contains( context, elem );
};
Sizzle.attr = function( elem, name ) {
-
// Set document vars if needed
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( ( elem.ownerDocument || elem ) != document ) {
+ 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 ) :
@@ -1658,15 +1452,11 @@ Sizzle.attr = function( elem, name ) {
val :
support.attributes || !documentIsHTML ?
elem.getAttribute( name ) :
- ( val = elem.getAttributeNode( name ) ) && val.specified ?
+ (val = elem.getAttributeNode(name)) && val.specified ?
val.value :
null;
};
-Sizzle.escape = function( sel ) {
- return ( sel + "" ).replace( rcssescape, fcssescape );
-};
-
Sizzle.error = function( msg ) {
throw new Error( "Syntax error, unrecognized expression: " + msg );
};
@@ -1687,7 +1477,7 @@ Sizzle.uniqueSort = function( results ) {
results.sort( sortOrder );
if ( hasDuplicate ) {
- while ( ( elem = results[ i++ ] ) ) {
+ while ( (elem = results[i++]) ) {
if ( elem === results[ i ] ) {
j = duplicates.push( i );
}
@@ -1715,21 +1505,17 @@ getText = Sizzle.getText = function( elem ) {
nodeType = elem.nodeType;
if ( !nodeType ) {
-
// If no nodeType, this is expected to be an array
- while ( ( node = elem[ i++ ] ) ) {
-
+ 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 );
@@ -1738,7 +1524,6 @@ getText = Sizzle.getText = function( elem ) {
} else if ( nodeType === 3 || nodeType === 4 ) {
return elem.nodeValue;
}
-
// Do not include comment or processing instruction nodes
return ret;
@@ -1766,21 +1551,19 @@ Expr = Sizzle.selectors = {
preFilter: {
"ATTR": function( match ) {
- match[ 1 ] = match[ 1 ].replace( runescape, funescape );
+ 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 );
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
- if ( match[ 2 ] === "~=" ) {
- match[ 3 ] = " " + match[ 3 ] + " ";
+ 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)
@@ -1791,25 +1574,22 @@ Expr = Sizzle.selectors = {
7 sign of y-component
8 y of y-component
*/
- match[ 1 ] = match[ 1 ].toLowerCase();
-
- if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
+ match[1] = match[1].toLowerCase();
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
// nth-* requires argument
- if ( !match[ 3 ] ) {
- Sizzle.error( match[ 0 ] );
+ 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" );
+ 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 ] );
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
}
return match;
@@ -1817,28 +1597,26 @@ Expr = Sizzle.selectors = {
"PSEUDO": function( match ) {
var excess,
- unquoted = !match[ 6 ] && match[ 2 ];
+ unquoted = !match[6] && match[2];
- if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
return null;
}
// Accept quoted arguments as-is
- if ( match[ 3 ] ) {
- match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
+ 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 ) ) &&
-
+ (excess = tokenize( unquoted, true )) &&
// advance to the next closing parenthesis
- ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
+ (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 );
+ 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)
@@ -1851,9 +1629,7 @@ Expr = Sizzle.selectors = {
"TAG": function( nodeNameSelector ) {
var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
return nodeNameSelector === "*" ?
- function() {
- return true;
- } :
+ function() { return true; } :
function( elem ) {
return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
};
@@ -1863,16 +1639,10 @@ Expr = Sizzle.selectors = {
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" ) ||
- ""
- );
- } );
+ (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 ) {
@@ -1888,8 +1658,6 @@ Expr = Sizzle.selectors = {
result += "";
- /* eslint-disable max-len */
-
return operator === "=" ? result === check :
operator === "!=" ? result !== check :
operator === "^=" ? check && result.indexOf( check ) === 0 :
@@ -1898,12 +1666,10 @@ Expr = Sizzle.selectors = {
operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
false;
- /* eslint-enable max-len */
-
};
},
- "CHILD": function( type, what, _argument, first, last ) {
+ "CHILD": function( type, what, argument, first, last ) {
var simple = type.slice( 0, 3 ) !== "nth",
forward = type.slice( -4 ) !== "last",
ofType = what === "of-type";
@@ -1915,13 +1681,12 @@ Expr = Sizzle.selectors = {
return !!elem.parentNode;
} :
- function( elem, _context, xml ) {
- var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
dir = simple !== forward ? "nextSibling" : "previousSibling",
parent = elem.parentNode,
name = ofType && elem.nodeName.toLowerCase(),
- useCache = !xml && !ofType,
- diff = false;
+ useCache = !xml && !ofType;
if ( parent ) {
@@ -1929,15 +1694,11 @@ Expr = Sizzle.selectors = {
if ( simple ) {
while ( dir ) {
node = elem;
- while ( ( node = node[ dir ] ) ) {
- if ( ofType ?
- node.nodeName.toLowerCase() === name :
- node.nodeType === 1 ) {
-
+ 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";
}
@@ -1948,83 +1709,43 @@ Expr = Sizzle.selectors = {
// 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 ];
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
node = nodeIndex && parent.childNodes[ nodeIndex ];
- while ( ( node = ++nodeIndex && node && node[ dir ] ||
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
// Fallback to seeking `elem` from the start
- ( diff = nodeIndex = 0 ) || start.pop() ) ) {
+ (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 ];
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
break;
}
}
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
} else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
- // Use previously-cached element index if available
- if ( useCache ) {
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
- // ...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;
- }
+ if ( node === elem ) {
+ break;
}
}
}
@@ -2038,7 +1759,6 @@ Expr = Sizzle.selectors = {
},
"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
@@ -2058,15 +1778,15 @@ Expr = Sizzle.selectors = {
if ( fn.length > 1 ) {
args = [ pseudo, pseudo, "", argument ];
return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
- markFunction( function( seed, matches ) {
+ 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 ] );
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
}
- } ) :
+ }) :
function( elem ) {
return fn( elem, 0, args );
};
@@ -2077,10 +1797,8 @@ Expr = Sizzle.selectors = {
},
pseudos: {
-
// Potentially complex pseudos
- "not": markFunction( function( selector ) {
-
+ "not": markFunction(function( selector ) {
// Trim the selector passed to compile
// to avoid treating leading and trailing
// spaces as combinators
@@ -2089,40 +1807,39 @@ Expr = Sizzle.selectors = {
matcher = compile( selector.replace( rtrim, "$1" ) );
return matcher[ expando ] ?
- markFunction( function( seed, matches, _context, xml ) {
+ 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 );
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
}
}
- } ) :
- function( elem, _context, xml ) {
- input[ 0 ] = elem;
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
matcher( input, null, xml, results );
-
// Don't keep the element (issue #299)
- input[ 0 ] = null;
+ input[0] = null;
return !results.pop();
};
- } ),
+ }),
- "has": markFunction( function( selector ) {
+ "has": markFunction(function( selector ) {
return function( elem ) {
return Sizzle( selector, elem ).length > 0;
};
- } ),
+ }),
- "contains": markFunction( function( text ) {
+ "contains": markFunction(function( text ) {
text = text.replace( runescape, funescape );
return function( elem ) {
- return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
+ 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
@@ -2132,26 +1849,25 @@ Expr = Sizzle.selectors = {
// 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 || "" ) ) {
+ if ( !ridentifier.test(lang || "") ) {
Sizzle.error( "unsupported lang: " + lang );
}
lang = lang.replace( runescape, funescape ).toLowerCase();
return function( elem ) {
var elemLang;
do {
- if ( ( elemLang = documentIsHTML ?
+ if ( (elemLang = documentIsHTML ?
elem.lang :
- elem.getAttribute( "xml:lang" ) || elem.getAttribute( "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 );
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
return false;
};
- } ),
+ }),
// Miscellaneous
"target": function( elem ) {
@@ -2164,30 +1880,29 @@ Expr = Sizzle.selectors = {
},
"focus": function( elem ) {
- return elem === document.activeElement &&
- ( !document.hasFocus || document.hasFocus() ) &&
- !!( elem.type || elem.href || ~elem.tabIndex );
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
},
// Boolean properties
- "enabled": createDisabledPseudo( false ),
- "disabled": createDisabledPseudo( true ),
+ "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 );
+ 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 ) {
- // eslint-disable-next-line no-unused-expressions
elem.parentNode.selectedIndex;
}
@@ -2196,7 +1911,6 @@ Expr = Sizzle.selectors = {
// 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.)
@@ -2210,7 +1924,7 @@ Expr = Sizzle.selectors = {
},
"parent": function( elem ) {
- return !Expr.pseudos[ "empty" ]( elem );
+ return !Expr.pseudos["empty"]( elem );
},
// Element/input types
@@ -2234,62 +1948,57 @@ Expr = Sizzle.selectors = {
// Support: IE<8
// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
- ( ( attr = elem.getAttribute( "type" ) ) == null ||
- attr.toLowerCase() === "text" );
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
},
// Position-in-collection
- "first": createPositionalPseudo( function() {
+ "first": createPositionalPseudo(function() {
return [ 0 ];
- } ),
+ }),
- "last": createPositionalPseudo( function( _matchIndexes, length ) {
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
return [ length - 1 ];
- } ),
+ }),
- "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
return [ argument < 0 ? argument + length : argument ];
- } ),
+ }),
- "even": createPositionalPseudo( function( matchIndexes, length ) {
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
var i = 0;
for ( ; i < length; i += 2 ) {
matchIndexes.push( i );
}
return matchIndexes;
- } ),
+ }),
- "odd": createPositionalPseudo( function( matchIndexes, length ) {
+ "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 > length ?
- length :
- argument;
+ "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 ) {
+ "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" ];
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
// Add button/input type pseudos
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
@@ -2320,39 +2029,37 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
while ( soFar ) {
// Comma and first run
- if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
if ( match ) {
-
// Don't consume trailing commas as valid
- soFar = soFar.slice( match[ 0 ].length ) || soFar;
+ soFar = soFar.slice( match[0].length ) || soFar;
}
- groups.push( ( tokens = [] ) );
+ groups.push( (tokens = []) );
}
matched = false;
// Combinators
- if ( ( match = rcombinators.exec( soFar ) ) ) {
+ if ( (match = rcombinators.exec( soFar )) ) {
matched = match.shift();
- tokens.push( {
+ tokens.push({
value: matched,
-
// Cast descendant combinators to space
- type: match[ 0 ].replace( rtrim, " " )
- } );
+ 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 ) ) ) ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
matched = match.shift();
- tokens.push( {
+ tokens.push({
value: matched,
type: type,
matches: match
- } );
+ });
soFar = soFar.slice( matched.length );
}
}
@@ -2369,7 +2076,6 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
soFar.length :
soFar ?
Sizzle.error( selector ) :
-
// Cache the tokens
tokenCache( selector, groups ).slice( 0 );
};
@@ -2379,38 +2085,34 @@ function toSelector( tokens ) {
len = tokens.length,
selector = "";
for ( ; i < len; i++ ) {
- selector += tokens[ i ].value;
+ selector += tokens[i].value;
}
return selector;
}
function addCombinator( matcher, combinator, base ) {
var dir = combinator.dir,
- skip = combinator.next,
- key = skip || dir,
- checkNonElements = base && key === "parentNode",
+ checkNonElements = base && dir === "parentNode",
doneName = done++;
return combinator.first ?
-
// Check against closest ancestor/preceding element
function( elem, context, xml ) {
- while ( ( elem = elem[ dir ] ) ) {
+ while ( (elem = elem[ dir ]) ) {
if ( elem.nodeType === 1 || checkNonElements ) {
return matcher( elem, context, xml );
}
}
- return false;
} :
// Check against all ancestor/preceding elements
function( elem, context, xml ) {
- var oldCache, uniqueCache, outerCache,
+ var oldCache, outerCache,
newCache = [ dirruns, doneName ];
- // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
if ( xml ) {
- while ( ( elem = elem[ dir ] ) ) {
+ while ( (elem = elem[ dir ]) ) {
if ( elem.nodeType === 1 || checkNonElements ) {
if ( matcher( elem, context, xml ) ) {
return true;
@@ -2418,36 +2120,26 @@ function addCombinator( matcher, combinator, base ) {
}
}
} else {
- while ( ( elem = elem[ dir ] ) ) {
+ 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 ( skip && skip === elem.nodeName.toLowerCase() ) {
- elem = elem[ dir ] || elem;
- } else if ( ( oldCache = uniqueCache[ key ] ) &&
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (oldCache = outerCache[ dir ]) &&
oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
// Assign to newCache so results back-propagate to previous elements
- return ( newCache[ 2 ] = oldCache[ 2 ] );
+ return (newCache[ 2 ] = oldCache[ 2 ]);
} else {
-
// Reuse newcache so results back-propagate to previous elements
- uniqueCache[ key ] = newCache;
+ outerCache[ dir ] = newCache;
// A match means we're done; a fail means we have to keep checking
- if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
return true;
}
}
}
}
}
- return false;
};
}
@@ -2456,20 +2148,20 @@ function elementMatcher( matchers ) {
function( elem, context, xml ) {
var i = matchers.length;
while ( i-- ) {
- if ( !matchers[ i ]( elem, context, xml ) ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
return false;
}
}
return true;
} :
- matchers[ 0 ];
+ matchers[0];
}
function multipleContexts( selector, contexts, results ) {
var i = 0,
len = contexts.length;
for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[ i ], results );
+ Sizzle( selector, contexts[i], results );
}
return results;
}
@@ -2482,7 +2174,7 @@ function condense( unmatched, map, filter, context, xml ) {
mapped = map != null;
for ( ; i < len; i++ ) {
- if ( ( elem = unmatched[ i ] ) ) {
+ if ( (elem = unmatched[i]) ) {
if ( !filter || filter( elem, context, xml ) ) {
newUnmatched.push( elem );
if ( mapped ) {
@@ -2502,18 +2194,14 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
if ( postFinder && !postFinder[ expando ] ) {
postFinder = setMatcher( postFinder, postSelector );
}
- return markFunction( function( seed, results, context, xml ) {
+ 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,
- []
- ),
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
// Prefilter to get matcher input, preserving a map for seed-results synchronization
matcherIn = preFilter && ( seed || !selector ) ?
@@ -2521,7 +2209,6 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
elems,
matcherOut = matcher ?
-
// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
@@ -2545,8 +2232,8 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
// 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 ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
}
}
}
@@ -2554,27 +2241,25 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
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 ] ) ) {
-
+ if ( (elem = matcherOut[i]) ) {
// Restore matcherIn since elem is not yet a final match
- temp.push( ( matcherIn[ i ] = elem ) );
+ temp.push( (matcherIn[i] = elem) );
}
}
- postFinder( null, ( matcherOut = [] ), temp, xml );
+ 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 ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
- seed[ temp ] = !( results[ temp ] = elem );
+ seed[temp] = !(results[temp] = elem);
}
}
}
@@ -2592,14 +2277,14 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
push.apply( results, matcherOut );
}
}
- } );
+ });
}
function matcherFromTokens( tokens ) {
var checkContext, matcher, j,
len = tokens.length,
- leadingRelative = Expr.relative[ tokens[ 0 ].type ],
- implicitRelative = leadingRelative || Expr.relative[ " " ],
+ 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)
@@ -2611,43 +2296,38 @@ function matcherFromTokens( tokens ) {
}, implicitRelative, true ),
matchers = [ function( elem, context, xml ) {
var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
- ( checkContext = context ).nodeType ?
+ (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 ) ];
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
} else {
- matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
+ 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 ] ) {
+ 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 === " " ? "*" : "" } )
+ // 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 && matcherFromTokens( (tokens = tokens.slice( j )) ),
j < len && toSelector( tokens )
);
}
@@ -2668,40 +2348,25 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
unmatched = seed && [],
setMatched = [],
contextBackup = outermostContext,
-
// We must always have either seed elements or outermost context
- elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
-
+ 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 ),
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
len = elems.length;
if ( outermost ) {
-
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- outermostContext = context == document || context || outermost;
+ outermostContext = context !== document && context;
}
// Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
// Support: IE<9, Safari
// Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id
- for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
if ( byElement && elem ) {
j = 0;
-
- // Support: IE 11+, Edge 17 - 18+
- // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
- // two documents; shallow comparisons work.
- // eslint-disable-next-line eqeqeq
- if ( !context && elem.ownerDocument != document ) {
- setDocument( elem );
- xml = !documentIsHTML;
- }
- while ( ( matcher = elementMatchers[ j++ ] ) ) {
- if ( matcher( elem, context || document, xml ) ) {
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
results.push( elem );
break;
}
@@ -2713,9 +2378,8 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
// Track unmatched elements for set filters
if ( bySet ) {
-
// They will have gone through all possible matchers
- if ( ( elem = !matcher && elem ) ) {
+ if ( (elem = !matcher && elem) ) {
matchedCount--;
}
@@ -2726,30 +2390,20 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
}
}
- // `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.
+ matchedCount += i;
if ( bySet && i !== matchedCount ) {
j = 0;
- while ( ( matcher = setMatchers[ j++ ] ) ) {
+ 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 );
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
}
}
}
@@ -2790,14 +2444,13 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
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 ] );
+ cached = matcherFromTokens( match[i] );
if ( cached[ expando ] ) {
setMatchers.push( cached );
} else {
@@ -2806,10 +2459,7 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
}
// Cache the compiled function
- cached = compilerCache(
- selector,
- matcherFromGroupMatchers( elementMatchers, setMatchers )
- );
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
// Save selector and tokenization
cached.selector = selector;
@@ -2829,21 +2479,20 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
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 ) );
+ 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)
+ // Try to minimize operations if there is no seed and only one group
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" &&
- context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
- context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
- .replace( runescape, funescape ), context ) || [] )[ 0 ];
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
if ( !context ) {
return results;
@@ -2856,22 +2505,20 @@ select = Sizzle.select = function( selector, context, results, seed ) {
}
// Fetch a seed set for right-to-left matching
- i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
while ( i-- ) {
- token = tokens[ i ];
+ token = tokens[i];
// Abort if we hit a combinator
- if ( Expr.relative[ ( type = token.type ) ] ) {
+ if ( Expr.relative[ (type = token.type) ] ) {
break;
}
- if ( ( find = Expr.find[ type ] ) ) {
-
+ 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 = 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 );
@@ -2894,7 +2541,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
context,
!documentIsHTML,
results,
- !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+ rsibling.test( selector ) && testContext( context.parentNode ) || context
);
return results;
};
@@ -2902,7 +2549,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
// One-time assignments
// Sort stability
-support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
// Support: Chrome 14-35+
// Always assume duplicates if they aren't passed to the comparison function
@@ -2913,141 +2560,107 @@ 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( el ) {
-
+support.sortDetached = assert(function( div1 ) {
// Should return 1, but returns 4 (following)
- return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
-} );
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
// Support: IE<8
// Prevent attribute/property "interpolation"
-// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert( function( el ) {
- el.innerHTML = " ";
- return el.firstChild.getAttribute( "href" ) === "#";
-} ) ) {
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = " ";
+ 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( el ) {
- el.innerHTML = " ";
- el.firstChild.setAttribute( "value", "" );
- return el.firstChild.getAttribute( "value" ) === "";
-} ) ) {
- addHandle( "value", function( elem, _name, isXML ) {
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = " ";
+ 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( el ) {
- return el.getAttribute( "disabled" ) == null;
-} ) ) {
+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 = elem.getAttributeNode( name )) && val.specified ?
val.value :
- null;
+ null;
}
- } );
+ });
}
return Sizzle;
-} )( window );
+})( window );
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
-
-// Deprecated
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;
-jQuery.escapeSelector = Sizzle.escape;
-
-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>|)$/);
-function nodeName( elem, name ) {
-
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-
-}var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
-
+var risSimple = /^.[^:#\[\.,]*$/;
// Implement the identical functionality for filter and not
function winnow( elements, qualifier, not ) {
- if ( isFunction( qualifier ) ) {
+ if ( jQuery.isFunction( qualifier ) ) {
return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
return !!qualifier.call( elem, i, elem ) !== not;
- } );
+ });
+
}
- // Single element
if ( qualifier.nodeType ) {
return jQuery.grep( elements, function( elem ) {
return ( elem === qualifier ) !== not;
- } );
+ });
+
}
- // Arraylike of elements (jQuery, arguments, Array)
- if ( typeof qualifier !== "string" ) {
- return jQuery.grep( elements, function( elem ) {
- return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
- } );
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
}
- // Filtered directly for both simple and complex selectors
- return jQuery.filter( qualifier, elements, not );
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
+ });
}
jQuery.filter = function( expr, elems, not ) {
@@ -3057,44 +2670,44 @@ jQuery.filter = function( expr, elems, not ) {
expr = ":not(" + expr + ")";
}
- if ( elems.length === 1 && elem.nodeType === 1 ) {
- return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
- }
-
- return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
- return elem.nodeType === 1;
- } ) );
+ 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( {
+jQuery.fn.extend({
find: function( selector ) {
- var i, ret,
+ var i,
len = this.length,
+ ret = [],
self = this;
if ( typeof selector !== "string" ) {
- return this.pushStack( jQuery( selector ).filter( function() {
+ return this.pushStack( jQuery( selector ).filter(function() {
for ( i = 0; i < len; i++ ) {
if ( jQuery.contains( self[ i ], this ) ) {
return true;
}
}
- } ) );
+ }) );
}
- ret = this.pushStack( [] );
-
for ( i = 0; i < len; i++ ) {
jQuery.find( selector, self[ i ], ret );
}
- return len > 1 ? jQuery.uniqueSort( ret ) : 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 ) );
+ return this.pushStack( winnow(this, selector || [], false) );
},
not: function( selector ) {
- return this.pushStack( winnow( this, selector || [], true ) );
+ return this.pushStack( winnow(this, selector || [], true) );
},
is: function( selector ) {
return !!winnow(
@@ -3108,7 +2721,7 @@ jQuery.fn.extend( {
false
).length;
}
-} );
+});
// Initialize a jQuery object
@@ -3120,10 +2733,9 @@ var rootjQuery,
// A simple way to check for HTML strings
// Prioritize #id over to avoid XSS via location.hash (#9521)
// Strict HTML recognition (#11290: must start with <)
- // Shortcut simple #id case for speed
- rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
- init = jQuery.fn.init = function( selector, context, root ) {
+ init = jQuery.fn.init = function( selector, context ) {
var match, elem;
// HANDLE: $(""), $(null), $(undefined), $(false)
@@ -3131,16 +2743,9 @@ var rootjQuery,
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 ) {
-
+ 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 ];
@@ -3149,26 +2754,25 @@ var rootjQuery,
}
// Match html or make sure no context is specified for #id
- if ( match && ( match[ 1 ] || !context ) ) {
+ if ( match && (match[1] || !context) ) {
// HANDLE: $(html) -> $(array)
- if ( match[ 1 ] ) {
- context = context instanceof jQuery ? context[ 0 ] : context;
+ 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 ],
+ match[1],
context && context.nodeType ? context.ownerDocument || context : document,
true
) );
// HANDLE: $(html, props)
- if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
for ( match in context ) {
-
// Properties of context are called as methods if possible
- if ( isFunction( this[ match ] ) ) {
+ if ( jQuery.isFunction( this[ match ] ) ) {
this[ match ]( context[ match ] );
// ...and otherwise set as attributes
@@ -3182,20 +2786,24 @@ var rootjQuery,
// HANDLE: $(#id)
} else {
- elem = document.getElementById( match[ 2 ] );
-
- if ( elem ) {
+ 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[ 0 ] = elem;
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 );
+ return ( context || rootjQuery ).find( selector );
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
@@ -3205,20 +2813,24 @@ var rootjQuery,
// HANDLE: $(DOMElement)
} else if ( selector.nodeType ) {
- this[ 0 ] = selector;
+ this.context = this[0] = selector;
this.length = 1;
return this;
// HANDLE: $(function)
// Shortcut for document ready
- } else if ( isFunction( selector ) ) {
- return root.ready !== undefined ?
- root.ready( selector ) :
-
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof rootjQuery.ready !== "undefined" ?
+ rootjQuery.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 );
};
@@ -3230,7 +2842,6 @@ 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,
@@ -3239,19 +2850,48 @@ var rparentsprev = /^(?:parents|prev(?:Until|All))/,
prev: true
};
-jQuery.fn.extend( {
+jQuery.extend({
+ 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;
+ },
+
+ sibling: function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+ }
+});
+
+jQuery.fn.extend({
has: function( target ) {
var targets = jQuery( target, this ),
l = targets.length;
- return this.filter( function() {
+ return this.filter(function() {
var i = 0;
for ( ; i < l; i++ ) {
- if ( jQuery.contains( this, targets[ i ] ) ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
return true;
}
}
- } );
+ });
},
closest: function( selectors, context ) {
@@ -3259,29 +2899,27 @@ jQuery.fn.extend( {
i = 0,
l = this.length,
matched = [],
- targets = typeof selectors !== "string" && jQuery( selectors );
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
- // Positional selectors never match, since there's no _selection_ context
- if ( !rneedsContext.test( selectors ) ) {
- for ( ; i < l; i++ ) {
- for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+ 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 :
- // Always skip document fragments
- if ( cur.nodeType < 11 && ( targets ?
- targets.index( cur ) > -1 :
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
- // Don't pass non-elements to Sizzle
- cur.nodeType === 1 &&
- jQuery.find.matchesSelector( cur, selectors ) ) ) {
-
- matched.push( cur );
- break;
- }
+ matched.push( cur );
+ break;
}
}
}
- return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
},
// Determine the position of an element within the set
@@ -3307,7 +2945,7 @@ jQuery.fn.extend( {
add: function( selector, context ) {
return this.pushStack(
- jQuery.uniqueSort(
+ jQuery.unique(
jQuery.merge( this.get(), jQuery( selector, context ) )
)
);
@@ -3315,26 +2953,26 @@ jQuery.fn.extend( {
addBack: function( selector ) {
return this.add( selector == null ?
- this.prevObject : this.prevObject.filter( selector )
+ this.prevObject : this.prevObject.filter(selector)
);
}
-} );
+});
function sibling( cur, dir ) {
- while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
return cur;
}
-jQuery.each( {
+jQuery.each({
parent: function( elem ) {
var parent = elem.parentNode;
return parent && parent.nodeType !== 11 ? parent : null;
},
parents: function( elem ) {
- return dir( elem, "parentNode" );
+ return jQuery.dir( elem, "parentNode" );
},
- parentsUntil: function( elem, _i, until ) {
- return dir( elem, "parentNode", until );
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
},
next: function( elem ) {
return sibling( elem, "nextSibling" );
@@ -3343,42 +2981,25 @@ jQuery.each( {
return sibling( elem, "previousSibling" );
},
nextAll: function( elem ) {
- return dir( elem, "nextSibling" );
+ return jQuery.dir( elem, "nextSibling" );
},
prevAll: function( elem ) {
- return dir( elem, "previousSibling" );
+ return jQuery.dir( elem, "previousSibling" );
},
- nextUntil: function( elem, _i, until ) {
- return dir( elem, "nextSibling", until );
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
},
- prevUntil: function( elem, _i, until ) {
- return dir( elem, "previousSibling", until );
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
},
siblings: function( elem ) {
- return siblings( ( elem.parentNode || {} ).firstChild, elem );
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
},
children: function( elem ) {
- return siblings( elem.firstChild );
+ return jQuery.sibling( elem.firstChild );
},
contents: function( elem ) {
- if ( elem.contentDocument != null &&
-
- // Support: IE 11+
- // elements with no `data` attribute has an object
- // `contentDocument` with a `null` prototype.
- getProto( elem.contentDocument ) ) {
-
- return elem.contentDocument;
- }
-
- // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
- // Treat the template element as a regular one in browsers that
- // don't support it.
- if ( nodeName( elem, "template" ) ) {
- elem = elem.content || elem;
- }
-
- return jQuery.merge( [], elem.childNodes );
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
}
}, function( name, fn ) {
jQuery.fn[ name ] = function( until, selector ) {
@@ -3393,10 +3014,9 @@ jQuery.each( {
}
if ( this.length > 1 ) {
-
// Remove duplicates
if ( !guaranteedUnique[ name ] ) {
- jQuery.uniqueSort( matched );
+ jQuery.unique( matched );
}
// Reverse order for parents* and prev-derivatives
@@ -3407,17 +3027,20 @@ jQuery.each( {
return this.pushStack( matched );
};
-} );
-var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+});
+var rnotwhite = (/\S+/g);
-// Convert String-formatted options into Object-formatted ones
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
function createOptions( options ) {
- var object = {};
- jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
object[ flag ] = true;
- } );
+ });
return object;
}
@@ -3448,186 +3071,156 @@ 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 ) :
+ ( optionsCache[ options ] || createOptions( options ) ) :
jQuery.extend( {}, options );
- var // Flag to know if list is currently firing
- firing,
-
- // Last fire value for non-forgettable lists
+ var // Last fire value (for non-forgettable lists)
memory,
-
// Flag to know if list was already fired
fired,
-
- // Flag to prevent firing
- locked,
-
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
// 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,
-
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
// Fire callbacks
- fire = function() {
-
- // Enforce single-firing
- locked = 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;
- }
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
}
}
-
- // 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 ) {
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
list = [];
-
- // Otherwise, this object is spent
} else {
- list = "";
+ self.disable();
}
}
},
-
// 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 ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
jQuery.each( args, function( _, arg ) {
- if ( isFunction( arg ) ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
if ( !options.unique || !self.has( arg ) ) {
list.push( arg );
}
- } else if ( arg && arg.length && toType( arg ) !== "string" ) {
-
+ } else if ( arg && arg.length && type !== "string" ) {
// Inspect recursively
add( arg );
}
- } );
- } )( arguments );
-
- if ( memory && !firing ) {
- fire();
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
}
}
return this;
},
-
// Remove a callback from the list
remove: function() {
- 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--;
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
}
- }
- } );
+ });
+ }
return this;
},
-
// Check if a given callback is in the list.
// If no argument is given, return whether or not list has callbacks attached.
has: function( fn ) {
- return fn ?
- jQuery.inArray( fn, list ) > -1 :
- list.length > 0;
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
},
-
// Remove all callbacks from the list
empty: function() {
- if ( list ) {
- list = [];
- }
+ list = [];
+ firingLength = 0;
return this;
},
-
- // Disable .fire and .add
- // Abort any current/pending executions
- // Clear all callbacks and values
+ // Have the list do nothing anymore
disable: function() {
- locked = queue = [];
- list = memory = "";
+ list = stack = memory = undefined;
return this;
},
+ // Is it disabled?
disabled: function() {
return !list;
},
-
- // Disable .fire
- // Also disable .add unless we have memory (since it would have no effect)
- // Abort any pending executions
+ // Lock the list in its current state
lock: function() {
- locked = queue = [];
- if ( !memory && !firing ) {
- list = memory = "";
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
}
return this;
},
+ // Is it locked?
locked: function() {
- return !!locked;
+ return !stack;
},
-
// Call all callbacks with the given context and arguments
fireWith: function( context, args ) {
- if ( !locked ) {
+ if ( list && ( !fired || stack ) ) {
args = args || [];
args = [ context, args.slice ? args.slice() : args ];
- queue.push( args );
- if ( !firing ) {
- fire();
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
}
}
return this;
},
-
// Call all the callbacks with the given arguments
fire: function() {
self.fireWith( this, arguments );
return this;
},
-
// To know if the callbacks have already been called at least once
fired: function() {
return !!fired;
@@ -3638,59 +3231,14 @@ jQuery.Callbacks = function( options ) {
};
-function Identity( v ) {
- return v;
-}
-function Thrower( ex ) {
- throw ex;
-}
-
-function adoptValue( value, resolve, reject, noValue ) {
- var method;
-
- try {
-
- // Check for promise aspect first to privilege synchronous behavior
- if ( value && isFunction( ( method = value.promise ) ) ) {
- method.call( value ).done( resolve ).fail( reject );
-
- // Other thenables
- } else if ( value && isFunction( ( method = value.then ) ) ) {
- method.call( value, resolve, reject );
-
- // Other non-thenables
- } else {
-
- // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
- // * false: [ value ].slice( 0 ) => resolve( value )
- // * true: [ value ].slice( 1 ) => resolve()
- resolve.apply( undefined, [ value ].slice( noValue ) );
- }
-
- // For Promises/A+, convert exceptions into rejections
- // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
- // Deferred#then to conditionally suppress rejection.
- } catch ( value ) {
-
- // Support: Android 4.0 only
- // Strict mode functions invoked without .call/.apply get global-object context
- reject.apply( undefined, [ value ] );
- }
-}
-
-jQuery.extend( {
+jQuery.extend({
Deferred: function( func ) {
var tuples = [
-
- // action, add listener, callbacks,
- // ... .then handlers, argument index, [final state]
- [ "notify", "progress", jQuery.Callbacks( "memory" ),
- jQuery.Callbacks( "memory" ), 2 ],
- [ "resolve", "done", jQuery.Callbacks( "once memory" ),
- jQuery.Callbacks( "once memory" ), 0, "resolved" ],
- [ "reject", "fail", jQuery.Callbacks( "once memory" ),
- jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+ // 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 = {
@@ -3701,206 +3249,27 @@ jQuery.extend( {
deferred.done( arguments ).fail( arguments );
return this;
},
- "catch": function( fn ) {
- return promise.then( null, fn );
- },
-
- // Keep pipe for back-compat
- pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
var fns = arguments;
-
- return jQuery.Deferred( function( newDefer ) {
- jQuery.each( tuples, function( _i, tuple ) {
-
- // Map tuples (progress, done, fail) to arguments (done, fail, progress)
- var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
-
- // deferred.progress(function() { bind to newDefer or newDefer.notify })
- // deferred.done(function() { bind to newDefer or newDefer.resolve })
- // deferred.fail(function() { bind to newDefer or newDefer.reject })
- deferred[ tuple[ 1 ] ]( function() {
+ 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 && isFunction( returned.promise ) ) {
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
returned.promise()
- .progress( newDefer.notify )
.done( newDefer.resolve )
- .fail( newDefer.reject );
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
} else {
- newDefer[ tuple[ 0 ] + "With" ](
- this,
- fn ? [ returned ] : arguments
- );
+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
}
- } );
- } );
+ });
+ });
fns = null;
- } ).promise();
+ }).promise();
},
- then: function( onFulfilled, onRejected, onProgress ) {
- var maxDepth = 0;
- function resolve( depth, deferred, handler, special ) {
- return function() {
- var that = this,
- args = arguments,
- mightThrow = function() {
- var returned, then;
-
- // Support: Promises/A+ section 2.3.3.3.3
- // https://promisesaplus.com/#point-59
- // Ignore double-resolution attempts
- if ( depth < maxDepth ) {
- return;
- }
-
- returned = handler.apply( that, args );
-
- // Support: Promises/A+ section 2.3.1
- // https://promisesaplus.com/#point-48
- if ( returned === deferred.promise() ) {
- throw new TypeError( "Thenable self-resolution" );
- }
-
- // Support: Promises/A+ sections 2.3.3.1, 3.5
- // https://promisesaplus.com/#point-54
- // https://promisesaplus.com/#point-75
- // Retrieve `then` only once
- then = returned &&
-
- // Support: Promises/A+ section 2.3.4
- // https://promisesaplus.com/#point-64
- // Only check objects and functions for thenability
- ( typeof returned === "object" ||
- typeof returned === "function" ) &&
- returned.then;
-
- // Handle a returned thenable
- if ( isFunction( then ) ) {
-
- // Special processors (notify) just wait for resolution
- if ( special ) {
- then.call(
- returned,
- resolve( maxDepth, deferred, Identity, special ),
- resolve( maxDepth, deferred, Thrower, special )
- );
-
- // Normal processors (resolve) also hook into progress
- } else {
-
- // ...and disregard older resolution values
- maxDepth++;
-
- then.call(
- returned,
- resolve( maxDepth, deferred, Identity, special ),
- resolve( maxDepth, deferred, Thrower, special ),
- resolve( maxDepth, deferred, Identity,
- deferred.notifyWith )
- );
- }
-
- // Handle all other returned values
- } else {
-
- // Only substitute handlers pass on context
- // and multiple values (non-spec behavior)
- if ( handler !== Identity ) {
- that = undefined;
- args = [ returned ];
- }
-
- // Process the value(s)
- // Default process is resolve
- ( special || deferred.resolveWith )( that, args );
- }
- },
-
- // Only normal processors (resolve) catch and reject exceptions
- process = special ?
- mightThrow :
- function() {
- try {
- mightThrow();
- } catch ( e ) {
-
- if ( jQuery.Deferred.exceptionHook ) {
- jQuery.Deferred.exceptionHook( e,
- process.stackTrace );
- }
-
- // Support: Promises/A+ section 2.3.3.3.4.1
- // https://promisesaplus.com/#point-61
- // Ignore post-resolution exceptions
- if ( depth + 1 >= maxDepth ) {
-
- // Only substitute handlers pass on context
- // and multiple values (non-spec behavior)
- if ( handler !== Thrower ) {
- that = undefined;
- args = [ e ];
- }
-
- deferred.rejectWith( that, args );
- }
- }
- };
-
- // Support: Promises/A+ section 2.3.3.3.1
- // https://promisesaplus.com/#point-57
- // Re-resolve promises immediately to dodge false rejection from
- // subsequent errors
- if ( depth ) {
- process();
- } else {
-
- // Call an optional hook to record the stack, in case of exception
- // since it's otherwise lost when execution goes async
- if ( jQuery.Deferred.getStackHook ) {
- process.stackTrace = jQuery.Deferred.getStackHook();
- }
- window.setTimeout( process );
- }
- };
- }
-
- return jQuery.Deferred( function( newDefer ) {
-
- // progress_handlers.add( ... )
- tuples[ 0 ][ 3 ].add(
- resolve(
- 0,
- newDefer,
- isFunction( onProgress ) ?
- onProgress :
- Identity,
- newDefer.notifyWith
- )
- );
-
- // fulfilled_handlers.add( ... )
- tuples[ 1 ][ 3 ].add(
- resolve(
- 0,
- newDefer,
- isFunction( onFulfilled ) ?
- onFulfilled :
- Identity
- )
- );
-
- // rejected_handlers.add( ... )
- tuples[ 2 ][ 3 ].add(
- resolve(
- 0,
- newDefer,
- isFunction( onRejected ) ?
- onRejected :
- Thrower
- )
- );
- } ).promise();
- },
-
// Get a promise for this deferred
// If obj is provided, the promise aspect is added to the object
promise: function( obj ) {
@@ -3909,60 +3278,34 @@ jQuery.extend( {
},
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[ 5 ];
+ stateString = tuple[ 3 ];
- // promise.progress = list.add
- // promise.done = list.add
- // promise.fail = list.add
- promise[ tuple[ 1 ] ] = list.add;
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
// Handle state
if ( stateString ) {
- list.add(
- function() {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
- // state = "resolved" (i.e., fulfilled)
- // state = "rejected"
- state = stateString;
- },
-
- // rejected_callbacks.disable
- // fulfilled_callbacks.disable
- tuples[ 3 - i ][ 2 ].disable,
-
- // rejected_handlers.disable
- // fulfilled_handlers.disable
- tuples[ 3 - i ][ 3 ].disable,
-
- // progress_callbacks.lock
- tuples[ 0 ][ 2 ].lock,
-
- // progress_handlers.lock
- tuples[ 0 ][ 3 ].lock
- );
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
}
- // progress_handlers.fire
- // fulfilled_handlers.fire
- // rejected_handlers.fire
- list.add( tuple[ 3 ].fire );
-
- // deferred.notify = function() { deferred.notifyWith(...) }
- // deferred.resolve = function() { deferred.resolveWith(...) }
- // deferred.reject = function() { deferred.rejectWith(...) }
- deferred[ tuple[ 0 ] ] = function() {
- deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
return this;
};
-
- // deferred.notifyWith = list.fireWith
- // deferred.resolveWith = list.fireWith
- // deferred.rejectWith = list.fireWith
- deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
- } );
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
// Make the deferred a promise
promise.promise( deferred );
@@ -3977,101 +3320,70 @@ jQuery.extend( {
},
// Deferred helper
- when: function( singleValue ) {
- var
-
- // count of uncompleted subordinates
- remaining = arguments.length,
-
- // count of unprocessed arguments
- i = remaining,
-
- // subordinate fulfillment data
- resolveContexts = Array( i ),
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
- // the master Deferred
- master = jQuery.Deferred(),
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
- // subordinate callback factory
- updateFunc = function( i ) {
+ // 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 ) {
- resolveContexts[ i ] = this;
- resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
- if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ 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 );
}
};
- };
+ },
- // Single- and empty arguments are adopted like Promise.resolve
- if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
- !remaining );
+ progressValues, progressContexts, resolveContexts;
- // Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
- isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
-
- return master.then();
+ // Add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
}
}
- // Multiple arguments are aggregated like Promise.all array elements
- while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ // If we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
}
- return master.promise();
+ return deferred.promise();
}
-} );
-
-
-// These usually indicate a programmer mistake during development,
-// warn about them ASAP rather than swallowing them by default.
-var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
-
-jQuery.Deferred.exceptionHook = function( error, stack ) {
-
- // Support: IE 8 - 9 only
- // Console exists when dev tools are open, which can happen at any time
- if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
- window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
- }
-};
-
-
-
-
-jQuery.readyException = function( error ) {
- window.setTimeout( function() {
- throw error;
- } );
-};
-
-
+});
// The deferred used on DOM ready
-var readyList = jQuery.Deferred();
+var readyList;
jQuery.fn.ready = function( fn ) {
-
- readyList
- .then( fn )
-
- // Wrap jQuery.readyException in a function so that the lookup
- // happens at the time of error handling instead of callback
- // registration.
- .catch( function( error ) {
- jQuery.readyException( error );
- } );
+ // Add the callback
+ jQuery.ready.promise().done( fn );
return this;
};
-jQuery.extend( {
-
+jQuery.extend({
// Is the DOM ready to be used? Set to true once it occurs.
isReady: false,
@@ -4079,6 +3391,15 @@ jQuery.extend( {
// 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 ) {
@@ -4097,64 +3418,77 @@ jQuery.extend( {
// 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" );
+ }
}
-} );
+});
-jQuery.ready.then = readyList.then;
-
-// The ready event handler and self cleanup method
+/**
+ * The ready event handler and self cleanup method
+ */
function completed() {
- document.removeEventListener( "DOMContentLoaded", completed );
- window.removeEventListener( "load", completed );
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
jQuery.ready();
}
-// Catch cases where $(document).ready() is called
-// after the browser event has already occurred.
-// Support: IE <=9 - 10 only
-// Older IE sometimes signals "interactive" too soon
-if ( document.readyState === "complete" ||
- ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- window.setTimeout( jQuery.ready );
+ readyList = jQuery.Deferred();
-} else {
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // We once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", completed );
+ } else {
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", completed );
-}
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+ }
+ }
+ 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 access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
var i = 0,
len = elems.length,
bulk = key == null;
// Sets many values
- if ( toType( key ) === "object" ) {
+ if ( jQuery.type( key ) === "object" ) {
chainable = true;
for ( i in key ) {
- access( elems, fn, i, key[ i ], true, emptyGet, raw );
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
}
// Sets one value
} else if ( value !== undefined ) {
chainable = true;
- if ( !isFunction( value ) ) {
+ if ( !jQuery.isFunction( value ) ) {
raw = true;
}
if ( bulk ) {
-
// Bulk operations run against the entire set
if ( raw ) {
fn.call( elems, value );
@@ -4163,7 +3497,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
// ...except when executing function values
} else {
bulk = fn;
- fn = function( elem, _key, value ) {
+ fn = function( elem, key, value ) {
return bulk.call( jQuery( elem ), value );
};
}
@@ -4171,126 +3505,127 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
if ( fn ) {
for ( ; i < len; i++ ) {
- fn(
- elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
- );
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
}
}
}
- if ( chainable ) {
- return elems;
- }
+ return chainable ?
+ elems :
- // Gets
- if ( bulk ) {
- return fn.call( elems );
- }
-
- return len ? fn( elems[ 0 ], key ) : emptyGet;
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[0], key ) : emptyGet;
};
-// Matches dashed string for camelizing
-var rmsPrefix = /^-ms-/,
- rdashAlpha = /-([a-z])/g;
-
-// Used by camelCase as callback to replace()
-function fcamelCase( _all, letter ) {
- return letter.toUpperCase();
-}
-
-// Convert dashed to camelCase; used by the css and data modules
-// Support: IE <=9 - 11, Edge 12 - 15
-// Microsoft forgot to hump their vendor prefix (#9572)
-function camelCase( string ) {
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-}
-var acceptData = function( owner ) {
-
+/**
+ * Determines whether an object can have data
+ */
+jQuery.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() {
+ // Support: Android<4,
+ // Old WebKit does not have Object.preventExtensions/freeze method,
+ // return new empty object instead with no [[set]] accessor
+ Object.defineProperty( this.cache = {}, 0, {
+ get: function() {
+ return {};
+ }
+ });
+
this.expando = jQuery.expando + Data.uid++;
}
Data.uid = 1;
+Data.accepts = jQuery.acceptData;
Data.prototype = {
+ key: function( owner ) {
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return the key for a frozen object.
+ if ( !Data.accepts( owner ) ) {
+ return 0;
+ }
- cache: function( owner ) {
-
- // Check if the owner object already has a cache
- var value = owner[ this.expando ];
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[ this.expando ];
// If not, create one
- if ( !value ) {
- value = {};
+ if ( !unlock ) {
+ unlock = Data.uid++;
- // 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 ) ) {
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ descriptor[ this.expando ] = { value: unlock };
+ Object.defineProperties( owner, descriptor );
- // 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
- } );
- }
+ // Support: Android<4
+ // Fallback to a less secure definition
+ } catch ( e ) {
+ descriptor[ this.expando ] = unlock;
+ jQuery.extend( owner, descriptor );
}
}
- return value;
+ // Ensure the cache object
+ if ( !this.cache[ unlock ] ) {
+ this.cache[ unlock ] = {};
+ }
+
+ return unlock;
},
set: function( owner, data, value ) {
var prop,
- cache = this.cache( owner );
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
// Handle: [ owner, key, value ] args
- // Always use camelCase key (gh-2257)
if ( typeof data === "string" ) {
- cache[ camelCase( data ) ] = value;
+ cache[ data ] = value;
// Handle: [ owner, { properties } ] args
} else {
-
- // Copy the properties one-by-one to the cache object
- for ( prop in data ) {
- cache[ camelCase( prop ) ] = data[ prop ];
+ // Fresh assignments by object are shallow copied
+ if ( jQuery.isEmptyObject( cache ) ) {
+ jQuery.extend( this.cache[ unlock ], data );
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
}
}
return cache;
},
get: function( owner, key ) {
- return key === undefined ?
- this.cache( owner ) :
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object. A valid owner object must be provided.
+ var cache = this.cache[ this.key( owner ) ];
- // Always use camelCase key (gh-2257)
- owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
+ return key === undefined ?
+ cache : cache[ key ];
},
access: function( owner, key, value ) {
-
+ var stored;
// In cases where either:
//
// 1. No key was specified
@@ -4303,12 +3638,15 @@ Data.prototype = {
// 2. The data stored at the key
//
if ( key === undefined ||
- ( ( key && typeof key === "string" ) && value === undefined ) ) {
+ ((key && typeof key === "string") && value === undefined) ) {
- return this.get( owner, key );
+ 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
+ // [*]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
@@ -4321,60 +3659,57 @@ Data.prototype = {
return value !== undefined ? value : key;
},
remove: function( owner, key ) {
- var i,
- cache = owner[ this.expando ];
+ var i, name, camel,
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
- if ( cache === undefined ) {
- return;
- }
-
- if ( key !== undefined ) {
+ if ( key === undefined ) {
+ this.cache[ unlock ] = {};
+ } else {
// Support array or space separated string of keys
- if ( Array.isArray( key ) ) {
-
- // If key is an array of keys...
- // We always set camelCase keys, so remove that.
- key = key.map( camelCase );
+ 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 {
- key = camelCase( key );
-
- // If a key with the spaces exists, use it.
- // Otherwise, create an array by matching non-whitespace
- key = key in cache ?
- [ key ] :
- ( key.match( rnothtmlwhite ) || [] );
+ 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 = key.length;
-
+ i = name.length;
while ( i-- ) {
- delete cache[ key[ 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://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
- if ( owner.nodeType ) {
- owner[ this.expando ] = undefined;
- } else {
- delete owner[ this.expando ];
+ delete cache[ name[ i ] ];
}
}
},
hasData: function( owner ) {
- var cache = owner[ this.expando ];
- return cache !== undefined && !jQuery.isEmptyObject( cache );
+ return !jQuery.isEmptyObject(
+ this.cache[ owner[ this.expando ] ] || {}
+ );
+ },
+ discard: function( owner ) {
+ if ( owner[ this.expando ] ) {
+ delete this.cache[ owner[ this.expando ] ];
+ }
}
};
-var dataPriv = new Data();
+var data_priv = new Data();
-var dataUser = new Data();
+var data_user = new Data();
@@ -4389,32 +3724,7 @@ var dataUser = new Data();
// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
- rmultiDash = /[A-Z]/g;
-
-function getData( data ) {
- if ( data === "true" ) {
- return true;
- }
-
- if ( data === "false" ) {
- return false;
- }
-
- if ( data === "null" ) {
- return null;
- }
-
- // Only convert to a number if it doesn't change the string
- if ( data === +data + "" ) {
- return +data;
- }
-
- if ( rbrace.test( data ) ) {
- return JSON.parse( data );
- }
-
- return data;
-}
+ rmultiDash = /([A-Z])/g;
function dataAttr( elem, key, data ) {
var name;
@@ -4422,16 +3732,22 @@ function dataAttr( elem, key, data ) {
// If nothing was found internally, try to fetch any
// data from the HTML5 data-* attribute
if ( data === undefined && elem.nodeType === 1 ) {
- name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
data = elem.getAttribute( name );
if ( typeof data === "string" ) {
try {
- data = getData( data );
- } catch ( e ) {}
+ 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 );
+ data_user.set( elem, key, data );
} else {
data = undefined;
}
@@ -4439,31 +3755,31 @@ function dataAttr( elem, key, data ) {
return data;
}
-jQuery.extend( {
+jQuery.extend({
hasData: function( elem ) {
- return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+ return data_user.hasData( elem ) || data_priv.hasData( elem );
},
data: function( elem, name, data ) {
- return dataUser.access( elem, name, data );
+ return data_user.access( elem, name, data );
},
removeData: function( elem, name ) {
- dataUser.remove( elem, name );
+ data_user.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.
+ // with direct calls to data_priv methods, these can be deprecated.
_data: function( elem, name, data ) {
- return dataPriv.access( elem, name, data );
+ return data_priv.access( elem, name, data );
},
_removeData: function( elem, name ) {
- dataPriv.remove( elem, name );
+ data_priv.remove( elem, name );
}
-} );
+});
-jQuery.fn.extend( {
+jQuery.fn.extend({
data: function( key, value ) {
var i, name, data,
elem = this[ 0 ],
@@ -4472,23 +3788,23 @@ jQuery.fn.extend( {
// Gets all values
if ( key === undefined ) {
if ( this.length ) {
- data = dataUser.get( elem );
+ data = data_user.get( elem );
- if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
i = attrs.length;
while ( i-- ) {
- // Support: IE 11 only
+ // Support: IE11+
// The attrs elements can be null (#14894)
if ( attrs[ i ] ) {
name = attrs[ i ].name;
if ( name.indexOf( "data-" ) === 0 ) {
- name = camelCase( name.slice( 5 ) );
+ name = jQuery.camelCase( name.slice(5) );
dataAttr( elem, name, data[ name ] );
}
}
}
- dataPriv.set( elem, "hasDataAttrs", true );
+ data_priv.set( elem, "hasDataAttrs", true );
}
}
@@ -4497,13 +3813,14 @@ jQuery.fn.extend( {
// Sets multiple values
if ( typeof key === "object" ) {
- return this.each( function() {
- dataUser.set( this, key );
- } );
+ return this.each(function() {
+ data_user.set( this, key );
+ });
}
return access( this, function( value ) {
- var data;
+ var data,
+ camelKey = jQuery.camelCase( key );
// The calling jQuery object (element matches) is not empty
// (and therefore has an element appears at this[ 0 ]) and the
@@ -4511,17 +3828,23 @@ jQuery.fn.extend( {
// 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 = data_user.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
// Attempt to get data from the cache
- // The key will always be camelCased in Data
- data = dataUser.get( elem, key );
+ // with the key camelized
+ data = data_user.get( elem, camelKey );
if ( data !== undefined ) {
return data;
}
// Attempt to "discover" the data in
// HTML5 custom data-* attrs
- data = dataAttr( elem, key );
+ data = dataAttr( elem, camelKey, undefined );
if ( data !== undefined ) {
return data;
}
@@ -4531,34 +3854,46 @@ jQuery.fn.extend( {
}
// Set the data...
- this.each( function() {
+ 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 = data_user.get( this, camelKey );
- // We always store the camelCased key
- dataUser.set( this, key, value );
- } );
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.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 ) {
+ data_user.set( this, key, value );
+ }
+ });
}, null, value, arguments.length > 1, null, true );
},
removeData: function( key ) {
- return this.each( function() {
- dataUser.remove( this, key );
- } );
+ return this.each(function() {
+ data_user.remove( this, key );
+ });
}
-} );
+});
-jQuery.extend( {
+jQuery.extend({
queue: function( elem, type, data ) {
var queue;
if ( elem ) {
type = ( type || "fx" ) + "queue";
- queue = dataPriv.get( elem, type );
+ queue = data_priv.get( elem, type );
// Speed up dequeue by getting out quickly if this is just a lookup
if ( data ) {
- if ( !queue || Array.isArray( data ) ) {
- queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );
} else {
queue.push( data );
}
@@ -4605,15 +3940,15 @@ jQuery.extend( {
// 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 ] );
- } )
- } );
+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ data_priv.remove( elem, [ type + "queue", key ] );
+ })
+ });
}
-} );
+});
-jQuery.fn.extend( {
+jQuery.fn.extend({
queue: function( type, data ) {
var setter = 2;
@@ -4624,31 +3959,30 @@ jQuery.fn.extend( {
}
if ( arguments.length < setter ) {
- return jQuery.queue( this[ 0 ], type );
+ return jQuery.queue( this[0], type );
}
return data === undefined ?
this :
- this.each( function() {
+ 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" ) {
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
jQuery.dequeue( this, type );
}
- } );
+ });
},
dequeue: function( type ) {
- return this.each( function() {
+ 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 ) {
@@ -4670,7 +4004,7 @@ jQuery.fn.extend( {
type = type || "fx";
while ( i-- ) {
- tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );
if ( tmp && tmp.empty ) {
count++;
tmp.empty.add( resolve );
@@ -4679,229 +4013,28 @@ jQuery.fn.extend( {
resolve();
return defer.promise( obj );
}
-} );
-var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-
-var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
-var documentElement = document.documentElement;
-
-
-
- var isAttached = function( elem ) {
- return jQuery.contains( elem.ownerDocument, elem );
- },
- composed = { composed: true };
-
- // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
- // Check attachment across shadow DOM boundaries when possible (gh-3504)
- // Support: iOS 10.0-10.2 only
- // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
- // leading to errors. We need to check for `getRootNode`.
- if ( documentElement.getRootNode ) {
- isAttached = function( elem ) {
- return jQuery.contains( elem.ownerDocument, elem ) ||
- elem.getRootNode( composed ) === elem.ownerDocument;
- };
- }
-var isHiddenWithinTree = function( elem, el ) {
-
- // isHiddenWithinTree might be called from jQuery#filter function;
+var isHidden = function( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
// in that case, element will be second argument
elem = el || elem;
-
- // Inline style trumps all
- return elem.style.display === "none" ||
- elem.style.display === "" &&
-
- // Otherwise, check computed style
- // Support: Firefox <=43 - 45
- // Disconnected elements can have computed display: none, so first confirm that elem is
- // in the document.
- isAttached( elem ) &&
-
- jQuery.css( elem, "display" ) === "none";
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
};
-
-
-function adjustCSS( elem, prop, valueParts, tween ) {
- var adjusted, scale,
- 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 = elem.nodeType &&
- ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
- rcssNum.exec( jQuery.css( elem, prop ) );
-
- if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
- // Support: Firefox <=54
- // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
- initial = initial / 2;
-
- // Trust units reported by jQuery.css
- unit = unit || initialInUnit[ 3 ];
-
- // Iteratively approximate from a nonzero starting point
- initialInUnit = +initial || 1;
-
- while ( maxIterations-- ) {
-
- // Evaluate and update our best guess (doubling guesses that zero out).
- // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
- jQuery.style( elem, prop, initialInUnit + unit );
- if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
- maxIterations = 0;
- }
- initialInUnit = initialInUnit / scale;
-
- }
-
- initialInUnit = initialInUnit * 2;
- jQuery.style( elem, prop, initialInUnit + unit );
-
- // Make sure we update the tween properties later on
- valueParts = valueParts || [];
- }
-
- 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 defaultDisplayMap = {};
-
-function getDefaultDisplay( elem ) {
- var temp,
- doc = elem.ownerDocument,
- nodeName = elem.nodeName,
- display = defaultDisplayMap[ nodeName ];
-
- if ( display ) {
- return display;
- }
-
- temp = doc.body.appendChild( doc.createElement( nodeName ) );
- display = jQuery.css( temp, "display" );
-
- temp.parentNode.removeChild( temp );
-
- if ( display === "none" ) {
- display = "block";
- }
- defaultDisplayMap[ nodeName ] = display;
-
- return display;
-}
-
-function showHide( elements, show ) {
- var display, elem,
- values = [],
- index = 0,
- length = elements.length;
-
- // Determine new display value for elements that need to change
- for ( ; index < length; index++ ) {
- elem = elements[ index ];
- if ( !elem.style ) {
- continue;
- }
-
- display = elem.style.display;
- if ( show ) {
-
- // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
- // check is required in this first loop unless we have a nonempty display value (either
- // inline or about-to-be-restored)
- if ( display === "none" ) {
- values[ index ] = dataPriv.get( elem, "display" ) || null;
- if ( !values[ index ] ) {
- elem.style.display = "";
- }
- }
- if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
- values[ index ] = getDefaultDisplay( elem );
- }
- } else {
- if ( display !== "none" ) {
- values[ index ] = "none";
-
- // Remember what we're overwriting
- dataPriv.set( elem, "display", display );
- }
- }
- }
-
- // Set the display of the elements in a second loop to avoid constant reflow
- for ( index = 0; index < length; index++ ) {
- if ( values[ index ] != null ) {
- elements[ index ].style.display = values[ index ];
- }
- }
-
- return elements;
-}
-
-jQuery.fn.extend( {
- 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 ( isHiddenWithinTree( this ) ) {
- jQuery( this ).show();
- } else {
- jQuery( this ).hide();
- }
- } );
- }
-} );
-var rcheckableType = ( /^(?:checkbox|radio)$/i );
-
-var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
-
-var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
+var rcheckableType = (/^(?:checkbox|radio)$/i);
-( function() {
+(function() {
var fragment = document.createDocumentFragment(),
div = fragment.appendChild( document.createElement( "div" ) ),
input = document.createElement( "input" );
- // Support: Android 4.0 - 4.3 only
+ // Support: 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)
@@ -4911,181 +4044,27 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
div.appendChild( input );
- // Support: Android <=4.1 only
+ // 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 only
+ // Support: IE<=11+
// Make sure textarea (and checkbox) defaultValue is properly cloned
div.innerHTML = "";
support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-
- // Support: IE <=9 only
- // IE <=9 replaces tags with their contents when inserted outside of
- // the select element.
- div.innerHTML = " ";
- support.option = !!div.lastChild;
-} )();
+})();
+var strundefined = typeof undefined;
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
- // XHTML parsers do not magically insert elements in the
- // same way that tag soup parsers do. So we cannot shorten
- // this by omitting or other required elements.
- thead: [ 1, "" ],
- col: [ 2, "" ],
- tr: [ 2, "" ],
- td: [ 3, "" ],
-
- _default: [ 0, "", "" ]
-};
-
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// Support: IE <=9 only
-if ( !support.option ) {
- wrapMap.optgroup = wrapMap.option = [ 1, "", " " ];
-}
-
-
-function getAll( context, tag ) {
-
- // Support: IE <=9 - 11 only
- // Use typeof to avoid zero-argument method invocation on host objects (#15151)
- var ret;
-
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- ret = context.getElementsByTagName( tag || "*" );
-
- } else if ( typeof context.querySelectorAll !== "undefined" ) {
- ret = context.querySelectorAll( tag || "*" );
-
- } else {
- ret = [];
- }
-
- if ( tag === undefined || tag && nodeName( context, tag ) ) {
- return jQuery.merge( [ context ], ret );
- }
-
- return 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, attached, 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 ( toType( elem ) === "object" ) {
-
- // Support: Android <=4.0 only, PhantomJS 1 only
- // 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.0 only, PhantomJS 1 only
- // 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;
- }
-
- attached = isAttached( elem );
-
- // Append to fragment
- tmp = getAll( fragment.appendChild( elem ), "script" );
-
- // Preserve script evaluation history
- if ( attached ) {
- setGlobalEval( tmp );
- }
-
- // Capture executables
- if ( scripts ) {
- j = 0;
- while ( ( elem = tmp[ j++ ] ) ) {
- if ( rscriptType.test( elem.type || "" ) ) {
- scripts.push( elem );
- }
- }
- }
- }
-
- return fragment;
-}
+support.focusinBubbles = "onfocusin" in window;
var
rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+ rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
function returnTrue() {
return true;
@@ -5095,86 +4074,12 @@ function returnFalse() {
return false;
}
-// Support: IE <=9 - 11+
-// focus() and blur() are asynchronous, except when they are no-op.
-// So expect focus to be synchronous when the element is already active,
-// and blur to be synchronous when the element is not already active.
-// (focus and blur are always synchronous in other supported browsers,
-// this just defines when we can count on it).
-function expectSync( elem, type ) {
- return ( elem === safeActiveElement() ) === ( type === "focus" );
-}
-
-// Support: IE <=9 only
-// Accessing document.activeElement can throw unexpectedly
-// https://bugs.jquery.com/ticket/13393
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.
@@ -5188,10 +4093,10 @@ jQuery.event = {
var handleObjIn, eventHandle, tmp,
events, t, handleObj,
special, handlers, type, namespaces, origType,
- elemData = dataPriv.get( elem );
+ elemData = data_priv.get( elem );
- // Only attach events to objects that accept data
- if ( !acceptData( elem ) ) {
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
return;
}
@@ -5202,38 +4107,31 @@ jQuery.event = {
selector = handleObjIn.selector;
}
- // Ensure that invalid selectors throw exceptions at attach time
- // Evaluate against documentElement in case elem is a non-element node (e.g., document)
- if ( selector ) {
- jQuery.find.matchesSelector( documentElement, 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 = Object.create( null );
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
}
- if ( !( eventHandle = elemData.handle ) ) {
+ 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 ?
+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
jQuery.event.dispatch.apply( elem, arguments ) : undefined;
};
}
// Handle multiple events separated by a space
- types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
t = types.length;
while ( t-- ) {
- tmp = rtypenamespace.exec( types[ t ] ) || [];
- type = origType = tmp[ 1 ];
- namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+ 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 ) {
@@ -5250,7 +4148,7 @@ jQuery.event = {
special = jQuery.event.special[ type ] || {};
// handleObj is passed to all event handlers
- handleObj = jQuery.extend( {
+ handleObj = jQuery.extend({
type: type,
origType: origType,
data: data,
@@ -5258,20 +4156,18 @@ jQuery.event = {
guid: handler.guid,
selector: selector,
needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
- namespace: namespaces.join( "." )
+ namespace: namespaces.join(".")
}, handleObjIn );
// Init the event handler queue if we're the first
- if ( !( handlers = events[ type ] ) ) {
+ 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 ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle );
+ elem.addEventListener( type, eventHandle, false );
}
}
}
@@ -5303,19 +4199,19 @@ jQuery.event = {
var j, origCount, tmp,
events, t, handleObj,
special, handlers, type, namespaces, origType,
- elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );
- if ( !elemData || !( events = elemData.events ) ) {
+ if ( !elemData || !(events = elemData.events) ) {
return;
}
// Once for each type.namespace in types; type may be omitted
- types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
t = types.length;
while ( t-- ) {
- tmp = rtypenamespace.exec( types[ t ] ) || [];
- type = origType = tmp[ 1 ];
- namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+ 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 ) {
@@ -5328,8 +4224,7 @@ jQuery.event = {
special = jQuery.event.special[ type ] || {};
type = ( selector ? special.delegateType : special.bindType ) || type;
handlers = events[ type ] || [];
- tmp = tmp[ 2 ] &&
- new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
// Remove matching events
origCount = j = handlers.length;
@@ -5339,8 +4234,7 @@ jQuery.event = {
if ( ( mappedTypes || origType === handleObj.origType ) &&
( !handler || handler.guid === handleObj.guid ) &&
( !tmp || tmp.test( handleObj.namespace ) ) &&
- ( !selector || selector === handleObj.selector ||
- selector === "**" && handleObj.selector ) ) {
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
handlers.splice( j, 1 );
if ( handleObj.selector ) {
@@ -5355,9 +4249,7 @@ jQuery.event = {
// 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 ) {
-
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
jQuery.removeEvent( elem, type, elemData.handle );
}
@@ -5365,32 +4257,158 @@ jQuery.event = {
}
}
- // Remove data and the expando if it's no longer used
+ // Remove the expando if it's no longer used
if ( jQuery.isEmptyObject( events ) ) {
- dataPriv.remove( elem, "handle events" );
+ delete elemData.handle;
+ data_priv.remove( elem, "events" );
}
},
- dispatch: function( nativeEvent ) {
+ trigger: function( event, data, elem, onlyHandlers ) {
- var i, j, ret, matched, handleObj, handlerQueue,
- args = new Array( arguments.length ),
+ 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(".") : [];
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( nativeEvent ),
+ cur = tmp = elem = elem || document;
- handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && jQuery.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) &&
+ jQuery.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;
+ },
+
+ 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 = ( data_priv.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;
-
- for ( i = 1; i < arguments.length; i++ ) {
- args[ i ] = arguments[ i ];
- }
-
+ args[0] = event;
event.delegateTarget = this;
// Call the preDispatch hook for the mapped type, and let it bail if desired
@@ -5403,26 +4421,24 @@ jQuery.event = {
// Run delegates first; they may want to stop propagation beneath us
i = 0;
- while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
event.currentTarget = matched.elem;
j = 0;
- while ( ( handleObj = matched.handlers[ j++ ] ) &&
- !event.isImmediatePropagationStopped() ) {
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
- // If the event is namespaced, then each handler is only invoked if it is
- // specially universal or its namespaces are a superset of the event's.
- if ( !event.rnamespace || handleObj.namespace === false ||
- event.rnamespace.test( handleObj.namespace ) ) {
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
event.handleObj = handleObj;
event.data = handleObj.data;
- ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
- handleObj.handler ).apply( matched.elem, args );
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
if ( ret !== undefined ) {
- if ( ( event.result = ret ) === false ) {
+ if ( (event.result = ret) === false ) {
event.preventDefault();
event.stopPropagation();
}
@@ -5440,148 +4456,173 @@ jQuery.event = {
},
handlers: function( event, handlers ) {
- var i, handleObj, sel, matchedHandlers, matchedSelectors,
+ var i, matches, sel, handleObj,
handlerQueue = [],
delegateCount = handlers.delegateCount,
cur = event.target;
// Find delegate handlers
- if ( delegateCount &&
-
- // Support: IE <=9
- // Black-hole SVG instance trees (trac-13180)
- cur.nodeType &&
-
- // Support: Firefox <=42
- // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
- // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
- // Support: IE 11 only
- // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
- !( event.type === "click" && event.button >= 1 ) ) {
+ // Black-hole SVG instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
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 && !( event.type === "click" && cur.disabled === true ) ) {
- matchedHandlers = [];
- matchedSelectors = {};
+ if ( 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 ( matchedSelectors[ sel ] === undefined ) {
- matchedSelectors[ sel ] = handleObj.needsContext ?
- jQuery( sel, this ).index( cur ) > -1 :
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
jQuery.find( sel, this, null, [ cur ] ).length;
}
- if ( matchedSelectors[ sel ] ) {
- matchedHandlers.push( handleObj );
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
}
}
- if ( matchedHandlers.length ) {
- handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
}
}
}
}
// Add the remaining (directly-bound) handlers
- cur = this;
if ( delegateCount < handlers.length ) {
- handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
}
return handlerQueue;
},
- addProp: function( name, hook ) {
- Object.defineProperty( jQuery.Event.prototype, name, {
- enumerable: true,
- configurable: true,
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
- get: isFunction( hook ) ?
- function() {
- if ( this.originalEvent ) {
- return hook( this.originalEvent );
- }
- } :
- function() {
- if ( this.originalEvent ) {
- return this.originalEvent[ name ];
- }
- },
+ fixHooks: {},
- set: function( value ) {
- Object.defineProperty( this, name, {
- enumerable: true,
- configurable: true,
- writable: true,
- value: value
- } );
+ 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;
+ }
},
- fix: function( originalEvent ) {
- return originalEvent[ jQuery.expando ] ?
- originalEvent :
- new jQuery.Event( originalEvent );
+ 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: {
-
- // Utilize native event to ensure correct state for checkable inputs
- setup: function( data ) {
-
- // For mutual compressibility with _default, replace `this` access with a local var.
- // `|| data` is dead code meant only to preserve the variable through minification.
- var el = this || data;
-
- // Claim the first handler
- if ( rcheckableType.test( el.type ) &&
- el.click && nodeName( el, "input" ) ) {
-
- // dataPriv.set( el, "click", ... )
- leverageNative( el, "click", returnTrue );
+ // 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;
}
-
- // Return false to allow normal processing in the caller
- return false;
- },
- trigger: function( data ) {
-
- // For mutual compressibility with _default, replace `this` access with a local var.
- // `|| data` is dead code meant only to preserve the variable through minification.
- var el = this || data;
-
- // Force setup before triggering a click
- if ( rcheckableType.test( el.type ) &&
- el.click && nodeName( el, "input" ) ) {
-
- leverageNative( el, "click" );
- }
-
- // Return non-false to allow normal event-path propagation
- return true;
},
- // For cross-browser consistency, suppress native .click() on links
- // Also prevent it if we're currently inside a leveraged native-event stack
+ // For cross-browser consistency, don't fire native .click() on links
_default: function( event ) {
- var target = event.target;
- return rcheckableType.test( target.type ) &&
- target.click && nodeName( target, "input" ) &&
- dataPriv.get( target, "click" ) ||
- nodeName( target, "a" );
+ return jQuery.nodeName( event.target, "a" );
}
},
@@ -5595,108 +4636,41 @@ jQuery.event = {
}
}
}
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
}
};
-// Ensure the presence of an event listener that handles manually-triggered
-// synthetic events by interrupting progress until reinvoked in response to
-// *native* events that it fires directly, ensuring that state changes have
-// already occurred before other listeners are invoked.
-function leverageNative( el, type, expectSync ) {
-
- // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
- if ( !expectSync ) {
- if ( dataPriv.get( el, type ) === undefined ) {
- jQuery.event.add( el, type, returnTrue );
- }
- return;
- }
-
- // Register the controller as a special universal handler for all event namespaces
- dataPriv.set( el, type, false );
- jQuery.event.add( el, type, {
- namespace: false,
- handler: function( event ) {
- var notAsync, result,
- saved = dataPriv.get( this, type );
-
- if ( ( event.isTrigger & 1 ) && this[ type ] ) {
-
- // Interrupt processing of the outer synthetic .trigger()ed event
- // Saved data should be false in such cases, but might be a leftover capture object
- // from an async native handler (gh-4350)
- if ( !saved.length ) {
-
- // Store arguments for use when handling the inner native event
- // There will always be at least one argument (an event object), so this array
- // will not be confused with a leftover capture object.
- saved = slice.call( arguments );
- dataPriv.set( this, type, saved );
-
- // Trigger the native event and capture its result
- // Support: IE <=9 - 11+
- // focus() and blur() are asynchronous
- notAsync = expectSync( this, type );
- this[ type ]();
- result = dataPriv.get( this, type );
- if ( saved !== result || notAsync ) {
- dataPriv.set( this, type, false );
- } else {
- result = {};
- }
- if ( saved !== result ) {
-
- // Cancel the outer synthetic event
- event.stopImmediatePropagation();
- event.preventDefault();
- return result.value;
- }
-
- // If this is an inner synthetic event for an event with a bubbling surrogate
- // (focus or blur), assume that the surrogate already propagated from triggering the
- // native event and prevent that from happening again here.
- // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
- // bubbling surrogate propagates *after* the non-bubbling base), but that seems
- // less bad than duplication.
- } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
- event.stopPropagation();
- }
-
- // If this is a native event triggered above, everything is now in order
- // Fire an inner synthetic event with the original arguments
- } else if ( saved.length ) {
-
- // ...and capture the result
- dataPriv.set( this, type, {
- value: jQuery.event.trigger(
-
- // Support: IE <=9 - 11+
- // Extend with the prototype to reset the above stopImmediatePropagation()
- jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
- saved.slice( 1 ),
- this
- )
- } );
-
- // Abort handling of the native event
- event.stopImmediatePropagation();
- }
- }
- } );
-}
-
jQuery.removeEvent = function( elem, type, handle ) {
-
- // This "if" is needed for plain objects
if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle );
+ elem.removeEventListener( type, handle, false );
}
};
jQuery.Event = function( src, props ) {
-
// Allow instantiation without the 'new' keyword
- if ( !( this instanceof jQuery.Event ) ) {
+ if ( !(this instanceof jQuery.Event) ) {
return new jQuery.Event( src, props );
}
@@ -5709,22 +4683,11 @@ jQuery.Event = function( src, props ) {
// by a handler lower down the tree; reflect the correct value.
this.isDefaultPrevented = src.defaultPrevented ||
src.defaultPrevented === undefined &&
-
- // Support: Android <=2.3 only
+ // Support: Android<4.0
src.returnValue === false ?
returnTrue :
returnFalse;
- // Create target properties
- // Support: Safari <=6 - 7 only
- // Target should not be a text node (#504, #13143)
- this.target = ( src.target && src.target.nodeType === 3 ) ?
- src.target.parentNode :
- src.target;
-
- this.currentTarget = src.currentTarget;
- this.relatedTarget = src.relatedTarget;
-
// Event type
} else {
this.type = src;
@@ -5736,27 +4699,25 @@ jQuery.Event = function( src, props ) {
}
// Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || Date.now();
+ 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
-// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+// 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,
- isSimulated: false,
preventDefault: function() {
var e = this.originalEvent;
this.isDefaultPrevented = returnTrue;
- if ( e && !this.isSimulated ) {
+ if ( e && e.preventDefault ) {
e.preventDefault();
}
},
@@ -5765,7 +4726,7 @@ jQuery.Event.prototype = {
this.isPropagationStopped = returnTrue;
- if ( e && !this.isSimulated ) {
+ if ( e && e.stopPropagation ) {
e.stopPropagation();
}
},
@@ -5774,7 +4735,7 @@ jQuery.Event.prototype = {
this.isImmediatePropagationStopped = returnTrue;
- if ( e && !this.isSimulated ) {
+ if ( e && e.stopImmediatePropagation ) {
e.stopImmediatePropagation();
}
@@ -5782,104 +4743,9 @@ jQuery.Event.prototype = {
}
};
-// Includes all common event props including KeyEvent and MouseEvent specific props
-jQuery.each( {
- altKey: true,
- bubbles: true,
- cancelable: true,
- changedTouches: true,
- ctrlKey: true,
- detail: true,
- eventPhase: true,
- metaKey: true,
- pageX: true,
- pageY: true,
- shiftKey: true,
- view: true,
- "char": true,
- code: true,
- charCode: true,
- key: true,
- keyCode: true,
- button: true,
- buttons: true,
- clientX: true,
- clientY: true,
- offsetX: true,
- offsetY: true,
- pointerId: true,
- pointerType: true,
- screenX: true,
- screenY: true,
- targetTouches: true,
- toElement: true,
- touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
-}, jQuery.event.addProp );
-
-jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
- jQuery.event.special[ type ] = {
-
- // Utilize native event if possible so blur/focus sequence is correct
- setup: function() {
-
- // Claim the first handler
- // dataPriv.set( this, "focus", ... )
- // dataPriv.set( this, "blur", ... )
- leverageNative( this, type, expectSync );
-
- // Return false to allow normal processing in the caller
- return false;
- },
- trigger: function() {
-
- // Force setup before trigger
- leverageNative( this, type );
-
- // Return non-false to allow normal event-path propagation
- return true;
- },
-
- delegateType: delegateType
- };
-} );
-
// 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://bugs.chromium.org/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-jQuery.each( {
+// Support: Chrome 15+
+jQuery.each({
mouseenter: "mouseover",
mouseleave: "mouseout",
pointerenter: "pointerover",
@@ -5895,9 +4761,9 @@ jQuery.each( {
related = event.relatedTarget,
handleObj = event.handleObj;
- // For mouseenter/leave call the handler if related is outside the target.
+ // For mousenter/leave call the handler if related is outside the target.
// NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
event.type = handleObj.origType;
ret = handleObj.handler.apply( this, arguments );
event.type = fix;
@@ -5905,33 +4771,115 @@ jQuery.each( {
return ret;
}
};
-} );
+});
-jQuery.fn.extend( {
+// Support: Firefox, Chrome, Safari
+// Create "bubbling" focus and blur events
+if ( !support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
- on: function( types, selector, data, fn ) {
- return on( this, types, selector, data, fn );
+ // 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 ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ data_priv.remove( doc, fix );
+
+ } else {
+ data_priv.access( doc, fix, attaches );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ 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 ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
},
one: function( types, selector, data, fn ) {
- return on( this, types, selector, data, fn, 1 );
+ return this.on( types, selector, data, fn, 1 );
},
off: function( types, selector, fn ) {
var handleObj, type;
if ( types && types.preventDefault && types.handleObj ) {
-
// ( event ) dispatched jQuery.Event
handleObj = types.handleObj;
jQuery( types.delegateTarget ).off(
- handleObj.namespace ?
- handleObj.origType + "." + handleObj.namespace :
- handleObj.origType,
+ handleObj.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 ] );
@@ -5939,7 +4887,6 @@ jQuery.fn.extend( {
return this;
}
if ( selector === false || typeof selector === "function" ) {
-
// ( types [, fn] )
fn = selector;
selector = undefined;
@@ -5947,64 +4894,112 @@ jQuery.fn.extend( {
if ( fn === false ) {
fn = returnFalse;
}
- return this.each( function() {
+ return this.each(function() {
jQuery.event.remove( this, types, fn, selector );
- } );
+ });
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
}
-} );
+});
var
-
- // Support: IE <=10 - 11, Edge 12 - 13 only
- // In IE/Edge using regex groups here causes severe slowdowns.
- // See https://connect.microsoft.com/IE/feedback/details/1736512/
- rnoInnerhtml = /