diff --git a/.gitignore b/.gitignore
index b25c15b..07be4ff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,5 @@
*~
+.idea
+*.iml
+atlassian-ide-plugin.xml
+
diff --git a/.jshintrc b/.jshintrc
new file mode 100644
index 0000000..21f287e
--- /dev/null
+++ b/.jshintrc
@@ -0,0 +1,72 @@
+{
+ // Settings
+ "passfail" : false, // Stop on first error.
+ "maxerr" : 100, // Maximum error before stopping.
+
+
+ // Predefined globals whom JSHint will ignore.
+ "browser" : true, // Standard browser globals e.g. `window`, `document`.
+
+ "node" : false,
+ "rhino" : false,
+ "couch" : false,
+ "wsh" : true, // Windows Scripting Host.
+
+ "jquery" : true,
+ "ender" : true,
+ "prototypejs" : false,
+ "mootools" : false,
+ "dojo" : false,
+
+ "predef" : [
+ "suite",
+ "test"
+ ],
+
+
+ // Development.
+ "debug" : false, // Allow debugger statements e.g. browser breakpoints.
+ "devel" : true, // Allow developments statements e.g. `console.log();`.
+
+
+ // ECMAScript 5.
+ "es5" : true, // Allow ECMAScript 5 syntax.
+ "strict" : true, // Require `use strict` pragma in every file.
+ "globalstrict" : false, // Allow global "use strict" (also enables 'strict').
+
+
+ // The Good Parts.
+ "asi" : false, // Tolerate Automatic Semicolon Insertion (no semicolons).
+ "laxbreak" : true, // Tolerate unsafe line breaks e.g. `return [\n] x` without semicolons.
+ "bitwise" : true, // Prohibit bitwise operators (&, |, ^, etc.).
+ "boss" : false, // Tolerate assignments inside if, for & while. Usually conditions & loops are for comparison, not assignments.
+ "curly" : true, // Require {} for every new block or scope.
+ "eqeqeq" : true, // Require triple equals i.e. `===`.
+ "eqnull" : false, // Tolerate use of `== null`.
+ "evil" : false, // Tolerate use of `eval`.
+ "expr" : false, // Tolerate `ExpressionStatement` as Programs.
+ "forin" : false, // Tolerate `for in` loops without `hasOwnPrototype`.
+ "immed" : true, // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );`
+ "latedef" : true, // Prohipit variable use before definition.
+ "loopfunc" : false, // Allow functions to be defined within loops.
+ "noarg" : true, // Prohibit use of `arguments.caller` and `arguments.callee`.
+ "regexp" : true, // Prohibit `.` and `[^...]` in regular expressions.
+ "regexdash" : false, // Tolerate unescaped last dash i.e. `[-...]`.
+ "scripturl" : true, // Tolerate script-targeted URLs.
+ "shadow" : false, // Allows re-define variables later in code e.g. `var x=1; x=2;`.
+ "supernew" : false, // Tolerate `new function () { ... };` and `new Object;`.
+ "undef" : true, // Require all non-global variables be declared before they are used.
+
+
+ // Personal styling preferences.
+ "newcap" : true, // Require capitalization of all constructor functions e.g. `new F()`.
+ "noempty" : true, // Prohibit use of empty blocks.
+ "nonew" : true, // Prohibit use of constructors for side-effects.
+ "nomen" : true, // Prohibit use of initial or trailing underbars in names.
+ "onevar" : false, // Allow only one `var` statement per function.
+ "plusplus" : false, // Prohibit use of `++` & `--`.
+ "sub" : false, // Tolerate all forms of subscript notation besides dot notation e.g. `dict['key']` instead of `dict.key`.
+ "trailing" : true, // Prohibit trailing whitespaces.
+ "white" : true, // Check against strict whitespace and indentation rules.
+ "indent" : 0 // Specify indentation spacing
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index af017ec..507df0e 100644
--- a/README.md
+++ b/README.md
@@ -9,10 +9,11 @@ Du willst Bärneruhr auf deiner Website verwenden? Dank des jQuery-Plugins geht
* uhr.css
* Binde zusätzlich mindestens eine der folgenden CSS-Dateien im HTML ein, je nach dem, welche Farben deine Uhr unterstützen soll:
* uhr-black.css
- * uhr-blue.css
- * uhr-green.css
- * uhr-red.css
* uhr-white.css
+ * uhr-red.css
+ * uhr-yellow.css
+ * uhr-green.css
+ * uhr-blue.css
* uhr-pink.css
Beim Einbinden muss das attribut `data-class` angegeben werden, welches die CSS-Klasse des Themes definiert. Optional kann mit `data-name` ein im Dropdown anzuzeigender Name angegeben werden. Beispiel:
@@ -25,7 +26,7 @@ Beim Einbinden muss das attribut `data-class` angegeben werden, welches die CSS-
* Von jquery-ui werden die Komponenten 'core' und 'widget' benötigt.
* jquery-cookie-1.4.0.js (Falls nicht bereits vorhanden)
* uhr.js
-* Binde mindestens eine der folgenden Javascript-Dateien im HTML ein, je nach dem, welche Sprachen deine Uhr unterstützen soll:
+* Binde mindestens eine der folgenden Javascript-Dateien im HTML nach uhr.js ein, je nach dem, welche Sprachen deine Uhr unterstützen soll:
* uhr-de_CH.js
* uhr-de_CH_genau.js
* uhr-de.js
@@ -33,7 +34,7 @@ Beim Einbinden muss das attribut `data-class` angegeben werden, welches die CSS-
* uhr-fr.js
* uhr-it.js
-`uhr-de_CH_genau.js` ist eine Variante von Berndeutsch, bei der zur vollen Stunde zusätlich das Wort "genau" angezeigt wird (also z.B. "ES ISCH GENAU DRÜ").
+`uhr-de_CH_genau.js` ist eine Variante von Berndeutsch, bei der zur vollen Stunde zusätlich das Wort "genau" angezeigt wird (also z.B. um 15:00 Uhr "ES ISCH GENAU DRÜ").
2. Uhr-Element im HTML-Dokument einfügen
----------------------------------------
@@ -54,6 +55,9 @@ Damit wird eine Uhr in der Standardkonfiguration erzeugt. Das heisst:
* Sprache ist Bärndütsch
* Die Uhr ist eingeschaltet
* Die Bedienelemente werden angezeigt
+* Die Uhr passt sich in der Grösse an, wenn das Elternelement seine Grösse ändert
+
+Mit den Bedienelementen kannst du die Uhr ein- und ausschalten sowie Sprache und Farbe wechseln.
Wie du diese Optionen ändern kannst, verrät der nächte Abschnitt.
@@ -69,18 +73,20 @@ Der uhr()-Methode kann ein Options-Objekt mitgegeben werden:
jQuery('#uhrcontainer').uhr({
status: 'on', // 'on' (default) oder 'off'
- theme: 'black', // 'black' (default), 'red', 'blue', 'green' oder 'white'
- language: 'de_CH', // 'de_CH' (default), 'de' oder 'en' (je nach eingebundenen Sprachdateien)
+ theme: 'black', // 'black' (default), 'white', 'red', 'yellow', 'green', 'blue' oder 'pink' (je nach eingebundenen Theme-Stylesheets)
+ language: 'de_CH', // 'de_CH' (default), 'de_CH_genau', 'de', 'en', 'fr' oder 'it' (je nach eingebundenen Sprachdateien)
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- und Sprachwähler) werden angezeigt
+ controls: true, // true (default): Die Bedienelemente (Ein-/Ausschalter, Theme- und Sprachwähler) werden angezeigt
// false: Die Bedienelemente werden nicht angezeigt
+ autoresize: true // true (default): Die Uhr passt ihre Grösse dynamisch an
+ // false: Die Uhr behält ihre anfängliche Grösse
});
5. Sonderfunktionen
-------------------
-Es gibt noch einen zusätzlichen Konfigurationsparameter. Mit
+Es gibt noch einen zusätzlichen Konfigurationsparameter. Mittels
{
time: new Date()
@@ -95,15 +101,15 @@ Viel Spass!
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
+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
+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
+You should have received a copy of the GNU General Public License
along with this program. If not, see .
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..0faee7d
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+6.3
diff --git a/uhr-black.css b/css/uhr-black.css
similarity index 100%
rename from uhr-black.css
rename to css/uhr-black.css
diff --git a/uhr-blue.css b/css/uhr-blue.css
similarity index 100%
rename from uhr-blue.css
rename to css/uhr-blue.css
diff --git a/uhr-green.css b/css/uhr-green.css
similarity index 100%
rename from uhr-green.css
rename to css/uhr-green.css
diff --git a/uhr-pink.css b/css/uhr-pink.css
similarity index 100%
rename from uhr-pink.css
rename to css/uhr-pink.css
diff --git a/uhr-red.css b/css/uhr-red.css
similarity index 100%
rename from uhr-red.css
rename to css/uhr-red.css
diff --git a/uhr-white.css b/css/uhr-white.css
similarity index 100%
rename from uhr-white.css
rename to css/uhr-white.css
diff --git a/uhr-yellow.css b/css/uhr-yellow.css
similarity index 100%
rename from uhr-yellow.css
rename to css/uhr-yellow.css
diff --git a/uhr.css b/css/uhr.css
similarity index 77%
rename from uhr.css
rename to css/uhr.css
index 45c84e4..f2e60ed 100644
--- a/uhr.css
+++ b/css/uhr.css
@@ -14,7 +14,7 @@ along with this program. If not, see .
*/
@font-face {
font-family: 'Uhrenfont';
- src: url('uhr.woff') format('woff');
+ src: url('../resources/uhr.woff') format('woff');
}
body {
font-family: 'Uhrenfont', sans-serif;
@@ -164,7 +164,54 @@ body {
}
.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
- right: 0px;
+ right: 0;
+}
+
+a.uhr-configlink {
+ cursor: pointer;
+ background: url("../resources/settings.png") no-repeat;
+ width: 24px;
+ height: 24px;
+ display: inline-block;
+ margin: 2px;
+}
+.uhr-controlpanel {
+ background-color: rgba(0,0,0,0.5);
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+}
+@media (max-width: 400px) {
+ .uhr-controlpanel .content {
+ height: 100%;
+ }
+}
+@media (min-width: 401px) {
+ .uhr-controlpanel .content {
+ margin-left: auto;
+ margin-right: auto;
+ width: 10em;
+ top : 1em;
+ border-radius: 0.5em;
+ box-shadow: 0 0 1em black;
+ }
+}
+.uhr-controlpanel .content {
+ background-color: #fff;
+ padding: 2em;
+ position: relative;
+}
+a.uhr-closecontrolpanel {
+ cursor: pointer;
+ display: inline-block;
+ position: absolute;
+ right: 3px;
+ top: 3px;
+ width: 24px;
+ height: 24px;
+ background: url("../resources/close.png") no-repeat;
}
#disclaimer {
font-size: 0.5em;
diff --git a/index.html b/index.html
index 0496334..90da5e9 100644
--- a/index.html
+++ b/index.html
@@ -25,30 +25,41 @@ along with this program. If not, see .
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Inhalt:
+ Inhalt:
Was soll das?
Die Uhr
@@ -50,7 +50,7 @@ along with this program. If not, see .
Lizenzbestimmungen
- Was soll das?
+
Hallo, Besucher!
Hier gibt's vertiefte Informationen über diese Uhr, die dir sagt,
wie spät es ist. Hier erfährt du, wie du sie selber auf deiner
@@ -58,11 +58,11 @@ along with this program. If not, see .
dich dabei an die Regeln der Lizenz hältst.
Das interessiert mich nicht, ich will zurück zur grossen Uhr!
- Die Uhr
+
- Benötigte Bibliotheken
+ Benötigte BibliothekenZum Inhalt
jQuery (getestet mit Version 2.1.0)
jQuery-UI (getestet mit Version 1.10.4) mit folgenden Komponenten:
@@ -73,15 +73,16 @@ along with this program. If not, see .
jQuery-cookie (getestet mit Version 1.4.0)
- Einbinden in HTML
- Javascript- und CSS-Dateien im <head>
+
+ Javascript- und CSS-Dateien im <head>
Zum Inhalt
Füge folgende Zeilen im <head>
-Tag deines HTML-Dokumentes ein. Beachte dabei, dass die CSS-Dateien vor den Javascript eingebunden werden .
<link rel="stylesheet" type="text/css" href="uhr.css" />
<link rel="stylesheet" type="text/css" href="uhr-black.css" data-class="black" data-name="Schwarz" />
-<link rel="stylesheet" type="text/css" href="uhr-blue.css" data-class="blue" data-name="Blau" />
-<link rel="stylesheet" type="text/css" href="uhr-green.css" data-class="green" data-name="Grün" />
-<link rel="stylesheet" type="text/css" href="uhr-red.css" data-class="red" data-name="Rot" />
<link rel="stylesheet" type="text/css" href="uhr-white.css" data-class="white" data-name="Weiss" />
+<link rel="stylesheet" type="text/css" href="uhr-red.css" data-class="red" data-name="Rot" />
+<link rel="stylesheet" type="text/css" href="uhr-yellow.css" data-class="yellow" data-name="Gelb" />
+<link rel="stylesheet" type="text/css" href="uhr-green.css" data-class="green" data-name="Grün" />
+<link rel="stylesheet" type="text/css" href="uhr-blue.css" data-class="blue" data-name="Blau" />
<link rel="stylesheet" type="text/css" href="uhr-pink.css" data-class="pink" data-name="Pink" />
<script type="text/javascript" src="jquery-2.1.0.min.js"></script>
<script type="text/javascript" src="jquery-ui-1.10.4.custom.min.js"></script>
@@ -95,12 +96,12 @@ along with this program. If not, see .
<script type="text/javascript" src="uhr-it.js"></script>
Von den Stylesheets zwingend ist uhr.css
und mindestens eines der Farbschema-Stylesheets. Die Attribute data-class
bzw. data-name
definieren dabei die im Stylesheet deklarierte Klasse bzw. den im Auswahlmenu anzuzeigenden Namen. Der Name kann frei gewählt werden, die Style-Klasse muss mit der im Stylesheet definierten übereinstimmen.
- uhr-de_CH_genau.js
ist eine Variante von Berndeutsch, bei der zur vollen Stunde zusätlich das Wort genau angezeigt wird (also z.B. ES ISCH GENAU DRÜ ).
- Uhr-Element auf der Seite
+ uhr-de_CH_genau.js
ist eine Variante von Berndeutsch, bei der zur vollen Stunde zusätlich das Wort genau angezeigt wird (also z.B. um 15:00 Uhr ES ISCH GENAU DRÜ ).
+ Uhr-Element auf der SeiteZum Inhalt
Definiere an der Stelle, wo die Uhr angezeigt werden soll, ein leeres <div>
-Element:
<div id="meine-uhr"></div>
- Uhr initialisieren
+
Definiere im HTML-Dokument (<head>
oder <body>
) ein Javascript-Snippet, um die Uhr zu initialisieren:
<script type="text/javascript">
jQuery(document).ready(function() {
@@ -114,7 +115,7 @@ along with this program. If not, see .
theme: 'red'
});
- Konfiguration
+
Es existieren die folgenden Konfigurationsoptionen:
width
@@ -141,6 +142,10 @@ along with this program. If not, see .
Gibt an, ob die Steuerelemente zur Auswahl von Farbe und Sprache und der Ein-/Ausschalter angezeigt werden sollen. Mögliche Werte sind true
oder false
.
Typ: boolean
Default: true
+ autoresize
+ Gibt an, ob die Uhr ihre Grösse dynamisch anpassen soll, wenn das Elternelement seine Grösse ändert, oder ob sie immer die anfängliche Grösse behält. Mögliche Werte sind true
oder false
.
+ Typ: boolean
+ Default: true
-
+
Programmiert von Manuel Friedli mit Inspiration von QLOCKTWO .
Diese Uhr ist aus Freude am Programmieren und am Konzept einer die Zeit in Worten ausdrückenden Uhr entstanden. Sollte daraus jemandem Schaden oder ein gravierender Nachteil erwachsen, so soll sich diese Person bei mir melden und wir werden bestimmt eine Lösung finden, die für alle beteiligten angemessen ist. Allen anderen Personen wünsche ich viel Freude mit der Zeit im Wort.
Der Quellcode ist frei zugänglich unter https://git.friedli.info/manuel/uhr .
- Lizenzbestimmungen
+
Der komplette Sourcecode ist unter der GNU GPL 3.0 lizenziert und darf nach deren Vorgaben verwendet, kopiert, weitergegeben und verändert werden. Die GNU GPL 3.0 findest Du unter folgendem Link: GNU GPL 3.0 . Und direkt hier:
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
@@ -238,7 +244,7 @@ modification follow.
“Copyright” also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
-
+
“The Program” refers to any copyrightable work licensed under this
License. Each licensee is addressed as “you”. “Licensees” and
“recipients” may be individuals or organizations.
@@ -677,7 +683,7 @@ actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
-
+
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
diff --git a/info/info.css b/info/info.css
index a8cca17..8aa7f4a 100644
--- a/info/info.css
+++ b/info/info.css
@@ -2,7 +2,8 @@ body {
font-size: 120%;
}
code {
- white-space: pre;
+ white-space: pre-line;
+ display: inline-block;
}
ol {
counter-reset: item;
@@ -15,3 +16,9 @@ ol li:before {
content: counters(item, ".") ". ";
counter-increment: item;
}
+a.toclink {
+ font-size: 25%;
+}
+a.toclink:before {
+ content: "▲ ";
+}
\ No newline at end of file
diff --git a/js/uhr-de.js b/js/uhr-de.js
new file mode 100644
index 0000000..93331b1
--- /dev/null
+++ b/js/uhr-de.js
@@ -0,0 +1,74 @@
+/*
+ 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]};
+ var vor = {4: [1, 2, 3]};
+ var halb = {5: [1, 2, 3, 4]};
+ var fuenf = {1: [8, 9, 10, 11]};
+ var zehn = {2: [1, 2, 3, 4]};
+ var viertel = {3: [5, 6, 7, 8, 9, 10, 11]};
+ var zwanzig = {2: [5, 6, 7, 8, 9, 10, 11]};
+ var dreiviertel = {3: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]};
+
+ var layout = {
+ "version": 2,
+ "language": 'Deutsch',
+ "letters": [
+ 'ESKISTAFÜNF',
+ 'ZEHNZWANZIG',
+ 'DREIVIERTEL',
+ 'VORFUNKNACH',
+ 'HALBAELFÜNF',
+ 'EINSXAMZWEI',
+ 'DREIPMJVIER',
+ 'SECHSNLACHT',
+ 'SIEBENZWÖLF',
+ 'ZEHNEUNKUHR'
+ ],
+ "permanent": es_ist,
+ "minutes": {
+ "0,1,2,3,4": uhr,
+ "5,6,7,8,9": [fuenf, nach],
+ "10,11,12,13,14": [zehn, nach],
+ "15,16,17,18,19": [viertel, nach],
+ "20,21,22,23,24": [zwanzig, nach],
+ "25,26,27,28,29": [fuenf, vor, halb],
+ "30,31,32,33,34": halb,
+ "35,36,37,38,39": [fuenf, nach, halb],
+ "40,41,42,43,44": [zwanzig, vor],
+ "45,46,47,48,49": dreiviertel,
+ "50,51,52,53,54": [zehn, vor],
+ "55,56,57,58,59": [fuenf, vor]
+ },
+ "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]}
+ }
+ };
+ $.fritteli.uhr.register('de', layout);
+}());
\ No newline at end of file
diff --git a/js/uhr-de_CH-seconds.js b/js/uhr-de_CH-seconds.js
new file mode 100644
index 0000000..8732d2f
--- /dev/null
+++ b/js/uhr-de_CH-seconds.js
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) Schweizerische Bundesbahnen SBB, 2014.
+ */
+
+/*
+ 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 vorne0 = {
+ 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]
+ };
+ var hinten0 = {
+ 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]
+ };
+ var vorne1 = {
+ 3: [3],
+ 4: [2, 3],
+ 5: [3],
+ 6: [3],
+ 7: [3],
+ 8: [3],
+ 9: [2, 3, 4]
+ };
+ var hinten1 = {
+ 3: [9],
+ 4: [8, 9],
+ 5: [9],
+ 6: [9],
+ 7: [9],
+ 8: [9],
+ 9: [8, 9, 10]
+ };
+ var vorne2 = {
+ 3: [2, 3, 4],
+ 4: [1, 5],
+ 5: [5],
+ 6: [4],
+ 7: [3],
+ 8: [2],
+ 9: [1, 2, 3, 4, 5]
+ };
+ var hinten2 = {
+ 3: [8, 9, 10],
+ 4: [7, 11],
+ 5: [11],
+ 6: [10],
+ 7: [9],
+ 8: [8],
+ 9: [7, 8, 9, 10, 11]
+ };
+ var vorne3 = {
+ 3: [1, 2, 3, 4, 5],
+ 4: [4],
+ 5: [3],
+ 6: [4],
+ 7: [5],
+ 8: [1, 5],
+ 9: [2, 3, 4]
+ };
+ var hinten3 = {
+ 3: [7, 8, 9, 10, 11],
+ 4: [10],
+ 5: [9],
+ 6: [10],
+ 7: [11],
+ 8: [7, 11],
+ 9: [8, 9, 10]
+ };
+ var vorne4 = {
+ 3: [4],
+ 4: [3, 4],
+ 5: [2, 4],
+ 6: [1, 4],
+ 7: [1, 2, 3, 4, 5],
+ 8: [4],
+ 9: [4]
+ };
+ var hinten4 = {
+ 3: [10],
+ 4: [9, 10],
+ 5: [8, 10],
+ 6: [7, 10],
+ 7: [7, 8, 9, 10, 11],
+ 8: [10],
+ 9: [10]
+ };
+ var vorne5 = {
+ 3: [1, 2, 3, 4, 5],
+ 4: [1],
+ 5: [1, 2, 3, 4],
+ 6: [5],
+ 7: [5],
+ 8: [1, 5],
+ 9: [2, 3, 4]
+ };
+ var hinten5 = {
+ 3: [7, 8, 9, 10, 11],
+ 4: [7],
+ 5: [7, 8, 9, 10],
+ 6: [11],
+ 7: [11],
+ 8: [7, 11],
+ 9: [8, 9, 10]
+ };
+ var hinten6 = {
+ 3: [9, 10],
+ 4: [8],
+ 5: [7],
+ 6: [7, 8, 9, 10],
+ 7: [7, 11],
+ 8: [7, 11],
+ 9: [8, 9, 10]
+ };
+ var hinten7 = {
+ 3: [7, 8, 9, 10, 11],
+ 4: [11],
+ 5: [10],
+ 6: [9],
+ 7: [8],
+ 8: [8],
+ 9: [8]
+ };
+ var hinten8 = {
+ 3: [8, 9, 10],
+ 4: [7, 11],
+ 5: [7, 11],
+ 6: [8, 9, 10],
+ 7: [7, 11],
+ 8: [7, 11],
+ 9: [8, 9, 10]
+ };
+ var hinten9 = {
+ 3: [8, 9, 10],
+ 4: [7, 11],
+ 5: [7, 11],
+ 6: [8, 9, 10, 11],
+ 7: [11],
+ 8: [10],
+ 9: [8, 9]
+ };
+ var layout = {
+ "version": 2,
+ "language": 'Bärndütschi Sekunde',
+ "letters": [
+ 'ESKISCHAFÜF',
+ 'VIERTUBFZÄÄ',
+ 'ZWÄNZGSIVOR',
+ 'ABOHAUBIEGE',
+ 'EISZWÖISDRÜ',
+ 'VIERIFÜFIQT',
+ 'SÄCHSISIBNI',
+ 'ACHTINÜNIEL',
+ 'ZÄNIERBEUFI',
+ 'ZWÖUFINAUHR'
+ ],
+ "seconds": {
+ "0": [vorne0, hinten0],
+ "1": [vorne0, hinten1],
+ "2": [vorne0, hinten2],
+ "3": [vorne0, hinten3],
+ "4": [vorne0, hinten4],
+ "5": [vorne0, hinten5],
+ "6": [vorne0, hinten6],
+ "7": [vorne0, hinten7],
+ "8": [vorne0, hinten8],
+ "9": [vorne0, hinten9],
+ "10": [vorne1, hinten0],
+ "11": [vorne1, hinten1],
+ "12": [vorne1, hinten2],
+ "13": [vorne1, hinten3],
+ "14": [vorne1, hinten4],
+ "15": [vorne1, hinten5],
+ "16": [vorne1, hinten6],
+ "17": [vorne1, hinten7],
+ "18": [vorne1, hinten8],
+ "19": [vorne1, hinten9],
+ "20": [vorne2, hinten0],
+ "21": [vorne2, hinten1],
+ "22": [vorne2, hinten2],
+ "23": [vorne2, hinten3],
+ "24": [vorne2, hinten4],
+ "25": [vorne2, hinten5],
+ "26": [vorne2, hinten6],
+ "27": [vorne2, hinten7],
+ "28": [vorne2, hinten8],
+ "29": [vorne2, hinten9],
+ "30": [vorne3, hinten0],
+ "31": [vorne3, hinten1],
+ "32": [vorne3, hinten2],
+ "33": [vorne3, hinten3],
+ "34": [vorne3, hinten4],
+ "35": [vorne3, hinten5],
+ "36": [vorne3, hinten6],
+ "37": [vorne3, hinten7],
+ "38": [vorne3, hinten8],
+ "39": [vorne3, hinten9],
+ "40": [vorne4, hinten0],
+ "41": [vorne4, hinten1],
+ "42": [vorne4, hinten2],
+ "43": [vorne4, hinten3],
+ "44": [vorne4, hinten4],
+ "45": [vorne4, hinten5],
+ "46": [vorne4, hinten6],
+ "47": [vorne4, hinten7],
+ "48": [vorne4, hinten8],
+ "49": [vorne4, hinten9],
+ "50": [vorne5, hinten0],
+ "51": [vorne5, hinten1],
+ "52": [vorne5, hinten2],
+ "53": [vorne5, hinten3],
+ "54": [vorne5, hinten4],
+ "55": [vorne5, hinten5],
+ "56": [vorne5, hinten6],
+ "57": [vorne5, hinten7],
+ "58": [vorne5, hinten8],
+ "59": [vorne5, hinten9]
+ },
+ "getDotMinute": function (time) {
+ return 0;
+ }
+ };
+ $.fritteli.uhr.register('de_CH_seconds', layout);
+}());
diff --git a/js/uhr-de_CH.js b/js/uhr-de_CH.js
new file mode 100644
index 0000000..e87e173
--- /dev/null
+++ b/js/uhr-de_CH.js
@@ -0,0 +1,97 @@
+/*
+ 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);
+}());
\ No newline at end of file
diff --git a/js/uhr-de_CH_genau.js b/js/uhr-de_CH_genau.js
new file mode 100644
index 0000000..301852c
--- /dev/null
+++ b/js/uhr-de_CH_genau.js
@@ -0,0 +1,72 @@
+/*
+ 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]};
+ var vor = {4: [1, 2, 3]};
+ var haubi = {4: [7, 8, 9, 10, 11]};
+ 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": 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": es_isch,
+ "minutes": {
+ "0": genau,
+ "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]
+ },
+ "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]}
+ }
+ };
+ $.fritteli.uhr.register('de_CH_genau', layout);
+}());
\ No newline at end of file
diff --git a/js/uhr-en.js b/js/uhr-en.js
new file mode 100644
index 0000000..863c40f
--- /dev/null
+++ b/js/uhr-en.js
@@ -0,0 +1,81 @@
+/*
+ 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]};
+ var past = {5: [1, 2, 3, 4]};
+ var o_clock = {10: [5, 6, 7, 8, 9, 10, 11]};
+ var five = {3: [7, 8, 9, 10]};
+ var ten = {4: [6, 7, 8]};
+ var a_quarter = {2: [1, 3, 4, 5, 6, 7, 8, 9]};
+ var twenty = {3: [1, 2, 3, 4, 5, 6]};
+ var twentyfive = {3: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]};
+
+ var layout = {
+ "version": 2,
+ "language": 'English',
+ "letters": [
+ 'ITLISBFAMPM',
+ 'ACQUARTERDC',
+ 'TWENTYFIVEX',
+ 'HALFBTENFTO',
+ 'PASTERUNINE',
+ 'ONESIXTHREE',
+ 'FOURFIVETWO',
+ 'EIGHTELEVEN',
+ 'SEVENTWELVE',
+ 'TENSO\'CLOCK'
+ ],
+ "permanent": it_is,
+ "minutes": {
+ "0,1,2,3,4": o_clock,
+ "5,6,7,8,9": [five, past],
+ "10,11,12,13,14": [ten, past],
+ "15,16,17,18,19": [a_quarter, past],
+ "20,21,22,23,24": [twenty, past],
+ "25,26,27,28,29": [twentyfive, past],
+ "30,31,32,33,34": [half, past],
+ "35,36,37,38,39": [twentyfive, to],
+ "40,41,42,43,44": [twenty, to],
+ "45,46,47,48,49": [a_quarter, to],
+ "50,51,52,53,54": [ten, to],
+ "55,56,57,58,59": [five, to]
+ },
+ "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 (date) {
+ var hour = date.getHours();
+ if (date.getMinutes() >= 35) {
+ return (hour + 1) % 24;
+ }
+ return hour;
+ }
+ };
+ $.fritteli.uhr.register('en', layout);
+}());
\ No newline at end of file
diff --git a/js/uhr-fr.js b/js/uhr-fr.js
new file mode 100644
index 0000000..c4fed2c
--- /dev/null
+++ b/js/uhr-fr.js
@@ -0,0 +1,82 @@
+/*
+ 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]};
+ var demie = {10: [4, 5, 6, 7, 8]};
+ var heures = {6: [6, 7, 8, 9, 10, 11]};
+ var le = {7: [7, 8]};
+ var cinq = {9: [7, 8, 9, 10]};
+ var dix = {7: [9, 10, 11]};
+ var quart = {8: [4, 5, 6, 7, 8]};
+ var vingt = {9: [1, 2, 3, 4, 5]};
+ var vingtcinq = {9: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]};
+
+ var layout = {
+ "version": 2,
+ "language": 'Français',
+ "letters": [
+ 'ILNESTODEUX',
+ 'QUATRETROIS',
+ 'NEUFUNESEPT',
+ 'HUITSIXCINQ',
+ 'MIDIXMINUIT',
+ 'ONZERHEURES',
+ 'MOINSOLEDIX',
+ 'ETRQUARTPMD',
+ 'VINGT-CINQU',
+ 'ETSDEMIEPAM'
+ ],
+ "permanent": il_est,
+ "minutes": {
+ "5,6,7,8,9": cinq,
+ "10,11,12,13,14": dix,
+ "15,16,17,18,19": [et, quart],
+ "20,21,22,23,24": vingt,
+ "25,26,27,28,29": vingtcinq,
+ "30,31,32,33,34": [et, demie],
+ "35,36,37,38,39": [moins, vingtcinq],
+ "40,41,42,43,44": [moins, vingt],
+ "45,46,47,48,49": [moins, le, quart],
+ "50,51,52,53,54": [moins, dix],
+ "55,56,57,58,59": [moins, cinq]
+ },
+ "hours": {
+ "0": {5: [6, 7, 8, 9, 10, 11]},
+ "1,13": [{3: [5, 6, 7]}, heures],
+ "2,14": [{1: [8, 9, 10, 11]}, heures],
+ "3,15": [{2: [7, 8, 9, 10, 11]}, heures],
+ "4,16": [{2: [1, 2, 3, 4, 5, 6]}, heures],
+ "5,17": [{4: [8, 9, 10, 11]}, heures],
+ "6,18": [{4: [5, 6, 7]}, heures],
+ "7,19": [{3: [8, 9, 10, 11]}, heures],
+ "8,20": [{4: [1, 2, 3, 4]}, heures],
+ "9,21": [{3: [1, 2, 3, 4]}, heures],
+ "10,22": [{5: [3, 4, 5]}, heures],
+ "11,23": [{6: [1, 2, 3, 4]}, heures],
+ "12": {5: [1, 2, 3, 4]}
+ },
+ "getHour": function (date) {
+ var hour = date.getHours();
+ if (date.getMinutes() >= 35) {
+ return (hour + 1) % 24;
+ }
+ return hour;
+ }
+ };
+ $.fritteli.uhr.register('fr', layout);
+}());
\ No newline at end of file
diff --git a/js/uhr-it.js b/js/uhr-it.js
new file mode 100644
index 0000000..65e33af
--- /dev/null
+++ b/js/uhr-it.js
@@ -0,0 +1,80 @@
+/*
+ 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]};
+ var meno = {7: [8, 9, 10, 11]};
+ var mezza = {10: [7, 8, 9, 10, 11]};
+ var cinque = {9: [6, 7, 8, 9, 10, 11]};
+ var dieci = {10: [1, 2, 3, 4, 5]};
+ var un_quarto = {8: [3, 4, 6, 7, 8, 9, 10, 11]};
+ var venti = {9: [1, 2, 3, 4, 5]};
+ var venticinque = {9: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]};
+
+ var layout = {
+ "version": 2,
+ "language": 'Italiano',
+ "letters": [
+ 'SONORLEBORE',
+ 'ÈRL\'UNASDUE',
+ 'TREOTTONOVE',
+ 'DIECIUNDICI',
+ 'DODICISETTE',
+ 'QUATTROCSEI',
+ 'CINQUEAMENO',
+ 'ECUNOQUARTO',
+ 'VENTICINQUE',
+ 'DIECIPMEZZA'
+ ],
+ "permanent": [],
+ "minutes": {
+ "5,6,7,8,9": [e, cinque],
+ "10,11,12,13,14": [e, dieci],
+ "15,16,17,18,19": [e, un_quarto],
+ "20,21,22,23,24": [e, venti],
+ "25,26,27,28,29": [e, venticinque],
+ "30,31,32,33,34": [e, mezza],
+ "35,36,37,38,39": [meno, venticinque],
+ "40,41,42,43,44": [meno, venti],
+ "45,46,47,48,49": [meno, un_quarto],
+ "50,51,52,53,54": [meno, dieci],
+ "55,56,57,58,59": [meno, cinque]
+ },
+ "hours": {
+ "0,12": [sono_le, {5: [1, 2, 3, 4, 5, 6]}],
+ "1,13": [e_l, {2: [5, 6, 7]}],
+ "2,14": [sono_le, {2: [9, 10, 11]}],
+ "3,15": [sono_le, {3: [1, 2, 3]}],
+ "4,16": [sono_le, {6: [1, 2, 3, 4, 5, 6, 7]}],
+ "5,17": [sono_le, {7: [1, 2, 3, 4, 5, 6]}],
+ "6,18": [sono_le, {6: [9, 10, 11]}],
+ "7,19": [sono_le, {5: [7, 8, 9, 10, 11]}],
+ "8,20": [sono_le, {3: [4, 5, 6, 7]}],
+ "9,21": [sono_le, {3: [8, 9, 10, 11]}],
+ "10,22": [sono_le, {4: [1, 2, 3, 4, 5]}],
+ "11,23": [sono_le, {4: [6, 7, 8, 9, 10, 11]}]
+ },
+ "getHour": function (date) {
+ var hour = date.getHours();
+ if (date.getMinutes() >= 35) {
+ return (hour + 1) % 24;
+ }
+ return hour;
+ }
+ };
+ $.fritteli.uhr.register('it', layout);
+}());
\ No newline at end of file
diff --git a/js/uhr.js b/js/uhr.js
new file mode 100644
index 0000000..b2d2ea3
--- /dev/null
+++ b/js/uhr.js
@@ -0,0 +1,499 @@
+/*
+ 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 uhrGlobals = {
+ "id": 0,
+ "languages": [],
+ "themes": [],
+ registerLanguage: function registerLanguage(code, language) {
+ 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 + "'!");
+ return true;
+ }
+ return false;
+ });
+ if (!alreadyExists) {
+ language.code = code;
+ uhrGlobals.languages.push(language);
+ }
+ }
+ };
+
+ // auto-detect themes
+ $('link[rel=stylesheet]').each(function (index, item) {
+ var styleSheet = $(item);
+ var styleClass = styleSheet.attr('data-class');
+ if (styleClass !== undefined) {
+ var name = styleSheet.attr('data-name');
+ if (name === undefined) {
+ name = styleClass;
+ }
+ uhrGlobals.themes.push({'styleClass': styleClass, 'name': name});
+ }
+ });
+ // fall-back if no theme was included
+ if (uhrGlobals.themes.length === 0) {
+ uhrGlobals.themes.push({});
+ }
+
+ // public interface methods (exported later)
+ var start = function start() {
+ if (!isOn.bind(this)()) {
+ this.timer = window.setInterval(function () {
+ this.options.time = new Date();
+ update.bind(this)();
+ }.bind(this), 1000);
+ update.bind(this)();
+ setCookie.bind(this)('uhr-status', 'on');
+ }
+ };
+ var stop = function stop() {
+ if (isOn.bind(this)()) {
+ window.clearInterval(this.timer);
+ this.timer = null;
+ update.bind(this)();
+ setCookie.bind(this)('uhr-status', 'off');
+ }
+ };
+ var toggle = function toggle() {
+ if (isOn.bind(this)()) {
+ this.stop();
+ } else {
+ this.start();
+ }
+ };
+ var setLanguage = function setLanugage(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 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;
+ if (this.options.time === undefined) {
+ this.options.time = new Date();
+ }
+ setupHTML.bind(this)();
+ wireFunctionality.bind(this)();
+ if (userTime !== undefined) {
+ this.time(userTime);
+ }
+ };
+ // private helper methods (not exported)
+ var showConfigScreen = function showConfigScreen() {
+ $('#uhr-controlpanel' + this.id).fadeIn('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 configlink = $(' ');
+ configlink.on('click', function () {
+ showConfigScreen.bind(this)();
+ }.bind(this));
+ e.after(configlink);
+ var controlpanel = $('
');
+ var content = $('
');
+ controlpanel.append(content);
+ // on/off switch
+ var toggleSwitch = $('
');
+ toggleSwitch.append(' ');
+ toggleSwitch.append(''
+ + '
'
+ + '
'
+ + ' ');
+ content.append(toggleSwitch);
+
+ // 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).fadeOut('fast');
+ }.bind(this));
+ content.append(closebutton);
+ e.after(controlpanel);
+ controlpanel.hide();
+ }
+ };
+ 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();
+ }
+
+ // 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 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')) {
+ 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)();
+ highlight.bind(this)('on');
+ for (var i = 1; i <= dotMinute; i++) {
+ highlight.bind(this)('dot' + i);
+ }
+ highlight.bind(this)('second' + second);
+ 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
+ },
+ "start": start,
+ "stop": stop,
+ "toggle": toggle,
+ "language": setLanguage,
+ "theme": setTheme,
+ "time": setTime,
+ "width": setWidth,
+ // constructor method
+ "_create": create
+ });
+ $.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');
+ });
+ };
+ }
+
+ function UhrRendererV2Delegate(layout) {
+ function parseArrayOrObject(letters, styleClass, input) {
+ if (typeof input !== 'undefined' && input !== null) {
+ if (Array.isArray(input)) {
+ input.forEach(function (item) {
+ parseObject(letters, styleClass, item);
+ });
+ } else {
+ parseObject(letters, styleClass, input);
+ }
+ }
+ }
+
+ 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) {
+ var array = listString.split(',');
+ var highlightLetters = definition[listString];
+ array.forEach(function (item) {
+ parseArrayOrObject(letters, styleClass + item, highlightLetters);
+ });
+ });
+ }
+ }
+
+ this.parse = function parse() {
+ var letters = [];
+ layout.letters.forEach(function (string) {
+ var line = [];
+ for (var c = 0; c < string.length; c++) {
+ var character = new Letter(string[c]);
+ line.push(character);
+ }
+ letters.push(line);
+ });
+ parseArrayOrObject(letters, 'on', layout.permanent);
+ parseTimeDefinition(letters, 'second', layout.seconds);
+ parseTimeDefinition(letters, 'minute', layout.minutes);
+ parseTimeDefinition(letters, 'hour', layout.hours);
+ return letters;
+ };
+ }
+
+ /**
+ * 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;
+ }
+ };
+ this.toString = function () {
+ return '' + myValue + ' ';
+ };
+ }
+})(jQuery);
diff --git a/jquery-2.1.0.min.js b/lib/jquery-2.1.0.min.js
similarity index 100%
rename from jquery-2.1.0.min.js
rename to lib/jquery-2.1.0.min.js
diff --git a/jquery-cookie-1.4.0.js b/lib/jquery-cookie-1.4.0.js
similarity index 100%
rename from jquery-cookie-1.4.0.js
rename to lib/jquery-cookie-1.4.0.js
diff --git a/jquery-ui-1.10.4.custom.min.js b/lib/jquery-ui-1.10.4.custom.min.js
similarity index 100%
rename from jquery-ui-1.10.4.custom.min.js
rename to lib/jquery-ui-1.10.4.custom.min.js
diff --git a/manifest.appcache b/manifest.appcache
index 07a0d3e..5c28822 100644
--- a/manifest.appcache
+++ b/manifest.appcache
@@ -1,33 +1,39 @@
CACHE MANIFEST
-# 6.2.1
+# 6.3
+css/uhr.css
+css/uhr-black.css
+css/uhr-blue.css
+css/uhr-green.css
+css/uhr-pink.css
+css/uhr-red.css
+css/uhr-white.css
+css/uhr-yellow.css
+info/index.html
+info/info.css
+js/uhr.js
+js/uhr-de.js
+js/uhr-de_CH.js
+js/uhr-de_CH_genau.js
+js/uhr-de_CH-seconds.js
+js/uhr-en.js
+js/uhr-fr.js
+js/uhr-it.js
+lib/jquery-2.1.0.min.js
+lib/jquery-cookie-1.4.0.js
+lib/jquery-ui-1.10.4.custom.min.js
+resources/apple-touch-icon-precomposed.png
+resources/close.png
+resources/favicon.png
+resources/settings.png
+resources/uhr.woff
+showcase/index.html
COPYING
README.md
+VERSION
apple-touch-icon-precomposed.png
apple-touch-startup-image-320x460.png
apple-touch-startup-image-640x1096.png
apple-touch-startup-image-640x920.png
favicon.png
index.html
-jquery-2.1.0.min.js
-jquery-cookie-1.4.0.js
-jquery-ui-1.10.4.custom.min.js
-uhr-black.css
-uhr-blue.css
-uhr-de.js
-uhr-de_CH.js
-uhr-de_CH_genau.js
-uhr-en.js
-uhr-fr.js
-uhr-green.css
-uhr-it.js
-uhr-pink.css
-uhr-red.css
-uhr-white.css
-uhr-yellow.css
-uhr.css
-uhr.js
-uhr.woff
-info/index.html
-info/info.css
-showcase/index.html
diff --git a/apple-touch-icon-precomposed.png b/resources/apple-touch-icon-precomposed.png
similarity index 100%
rename from apple-touch-icon-precomposed.png
rename to resources/apple-touch-icon-precomposed.png
diff --git a/resources/close.png b/resources/close.png
new file mode 100644
index 0000000..5b0301d
Binary files /dev/null and b/resources/close.png differ
diff --git a/favicon.png b/resources/favicon.png
similarity index 100%
rename from favicon.png
rename to resources/favicon.png
diff --git a/resources/settings.png b/resources/settings.png
new file mode 100644
index 0000000..b6c8a5f
Binary files /dev/null and b/resources/settings.png differ
diff --git a/uhr.woff b/resources/uhr.woff
similarity index 100%
rename from uhr.woff
rename to resources/uhr.woff
diff --git a/showcase/index.html b/showcase/index.html
index c18666e..b995e98 100644
--- a/showcase/index.html
+++ b/showcase/index.html
@@ -21,35 +21,36 @@ along with this program. If not, see .
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Go back to the main page
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+