diff --git a/package-lock.json b/package-lock.json index 4ce40ac..f03b838 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6682,6 +6682,12 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typescript": { + "version": "3.4.5", + "resolved": "https://bin.sbb.ch/artifactory/api/npm/npm/typescript/-/typescript-3.4.5.tgz", + "integrity": "sha1-LSYY0Qu1ZlcrjXqtUYDYQlfXCpk=", + "dev": true + }, "uglify-js": { "version": "3.5.10", "resolved": "https://bin.sbb.ch/artifactory/api/npm/npm/uglify-js/-/uglify-js-3.5.10.tgz", diff --git a/package.json b/package.json index 0fad4f5..1a0be6e 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "mocha": "6.1.4", "phantomjs-prebuilt": "2.1.16", "time-grunt": "2.0.0", + "typescript": "3.4.5", "webpack": "4.30.0", "webpack-cli": "3.3.1" } diff --git a/src/index.d.ts b/src/index.d.ts deleted file mode 100644 index 3330ed4..0000000 --- a/src/index.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -declare namespace Fritteli { - interface Fritteli { - uhr: { - register: (options?: { checkboxSelector: JQuery | string }) => JQuery; - } - } -} - -interface JQueryStatic { - fritteli: Fritteli.Fritteli; -} diff --git a/src/index.ts b/src/index.ts index 854c1d6..92cd47c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,8 +15,9 @@ import {Globals} from "./domain/globals"; import {autodetectThemes} from "./theme-autodetector"; -import {Uehrli} from "./uehrli"; +import {Uhr} from "./uhr"; import {WidgetPrototype} from "./widget/widget-prototype"; +import {Layout} from "./domain/layout"; // First things first: discover included themes and register them autodetectThemes(); @@ -59,7 +60,7 @@ $.widget("fritteli.uhr", { }, // constructor method "_create": function () { - this.__fritteli_uhr_instance = new Uehrli(this); + this.__fritteli_uhr_instance = new Uhr(this); }, // destructor method "_destroy": function () { @@ -69,3 +70,16 @@ $.widget("fritteli.uhr", { } as WidgetPrototype); $.fritteli.uhr.register = Globals.registerLayout; + +declare namespace $ { + const fritteli: Fritteli; + const widget: JQueryUI.Widget; + + interface Fritteli { + uhr: Uhr; + } + + interface Uhr { + register: (langCode: string, layout: Layout) => void; + } +} diff --git a/src/uhr-de.js b/src/uhr-de.js index cb8aef7..ebb3b5c 100644 --- a/src/uhr-de.js +++ b/src/uhr-de.js @@ -12,7 +12,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -(function($) { +(function ($) { 'use strict'; var es_ist = {1: [1, 2, 4, 5, 6]}; var uhr = {10: [9, 10, 11]}; @@ -71,4 +71,4 @@ } }; $.fritteli.uhr.register('de', layout); -}(jQuery)); \ No newline at end of file +}(jQuery)); diff --git a/src/uhr-de_CH.js b/src/uhr-de_CH.js index 5cb8899..ba8e498 100644 --- a/src/uhr-de_CH.js +++ b/src/uhr-de_CH.js @@ -12,7 +12,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -(function($) { +(function ($) { 'use strict'; // hilfsvariablen var es_isch = {1: [1, 2, 4, 5, 6, 7]}; @@ -94,4 +94,4 @@ }; // Das Layout bei der Uhr unter dem Code "de_CH" registrieren. $.fritteli.uhr.register('de_CH', layout); -}(jQuery)); \ No newline at end of file +}(jQuery)); diff --git a/src/uhr-de_CH_genau.js b/src/uhr-de_CH_genau.js index b130fa3..be300fc 100644 --- a/src/uhr-de_CH_genau.js +++ b/src/uhr-de_CH_genau.js @@ -12,7 +12,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -(function($) { +(function ($) { 'use strict'; var es_isch = {1: [1, 2, 4, 5, 6, 7]}; var genau = {3: [7, 8, 9, 10, 11]}; @@ -69,4 +69,4 @@ } }; $.fritteli.uhr.register('de_CH_genau', layout); -}(jQuery)); \ No newline at end of file +}(jQuery)); diff --git a/src/uhr-dk.js b/src/uhr-dk.js index 12c700e..d7b0b8e 100644 --- a/src/uhr-dk.js +++ b/src/uhr-dk.js @@ -1,7 +1,3 @@ -/* - * 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 @@ -16,7 +12,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -(function($) { +(function ($) { 'use strict'; var klokken_er = {1: [1, 2, 3, 4, 5, 6, 7, 9, 10]}; @@ -81,4 +77,4 @@ } }; $.fritteli.uhr.register('dk', layout); -}(jQuery)); \ No newline at end of file +}(jQuery)); diff --git a/src/uhr-en.js b/src/uhr-en.js index a660266..3cd4173 100644 --- a/src/uhr-en.js +++ b/src/uhr-en.js @@ -12,7 +12,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -(function($) { +(function ($) { 'use strict'; var it_is = {1: [1, 2, 4, 5]}; var half = {4: [1, 2, 3, 4]}; @@ -69,7 +69,7 @@ "10,22": {10: [1, 2, 3]}, "11,23": {8: [6, 7, 8, 9, 10, 11]} }, - "getHour": function(date) { + "getHour": function (date) { var hour = date.getHours(); if (date.getMinutes() >= 35) { return (hour + 1) % 24; @@ -78,4 +78,4 @@ } }; $.fritteli.uhr.register('en', layout); -}(jQuery)); \ No newline at end of file +}(jQuery)); diff --git a/src/uhr-es.js b/src/uhr-es.js index 8e5c834..3a16d1e 100644 --- a/src/uhr-es.js +++ b/src/uhr-es.js @@ -12,7 +12,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -(function($) { +(function ($) { 'use strict'; var es_la = {1: [1, 2, 6, 7]}; var son_las = {1: [2, 3, 4, 6, 7, 8]}; @@ -68,7 +68,7 @@ "10,22": [son_las, {6: [3, 4, 5, 6]}], "11,23": [son_las, {6: [8, 9, 10, 11]}] }, - "getHour": function(date) { + "getHour": function (date) { var hour = date.getHours(); if (date.getMinutes() >= 35) { return (hour + 1) % 24; diff --git a/src/uhr-fr.js b/src/uhr-fr.js index 4a8d3d2..d01f2f8 100644 --- a/src/uhr-fr.js +++ b/src/uhr-fr.js @@ -12,7 +12,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -(function($) { +(function ($) { 'use strict'; var il_est = {1: [1, 2, 4, 5, 6]}; var et = {8: [1, 2]}; @@ -103,7 +103,7 @@ ], "12": {5: [1, 2, 3, 4]} }, - "getHour": function(date) { + "getHour": function (date) { var hour = date.getHours(); if (date.getMinutes() >= 35) { return (hour + 1) % 24; @@ -112,4 +112,4 @@ } }; $.fritteli.uhr.register('fr', layout); -}(jQuery)); \ No newline at end of file +}(jQuery)); diff --git a/src/uhr-it.js b/src/uhr-it.js index 0375529..9d79c8a 100644 --- a/src/uhr-it.js +++ b/src/uhr-it.js @@ -12,7 +12,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -(function($) { +(function ($) { 'use strict'; var sono_le = {1: [1, 2, 3, 4, 6, 7]}; var e_l = {2: [1, 3, 4]}; @@ -68,7 +68,7 @@ "10,22": [sono_le, {4: [1, 2, 3, 4, 5]}], "11,23": [sono_le, {4: [6, 7, 8, 9, 10, 11]}] }, - "getHour": function(date) { + "getHour": function (date) { var hour = date.getHours(); if (date.getMinutes() >= 35) { return (hour + 1) % 24; @@ -77,4 +77,4 @@ } }; $.fritteli.uhr.register('it', layout); -}(jQuery)); \ No newline at end of file +}(jQuery)); diff --git a/src/uhr-nl.js b/src/uhr-nl.js index 5ca6082..565d399 100644 --- a/src/uhr-nl.js +++ b/src/uhr-nl.js @@ -12,7 +12,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -(function($) { +(function ($) { 'use strict'; var het_is = {1: [1, 2, 3, 5, 6]}; var over1 = {3: [1, 2, 3, 4]}; @@ -69,7 +69,7 @@ "10,22": {9: [5, 6, 7, 8]}, "11,23": {9: [9, 10, 11]} }, - "getHour": function(date) { + "getHour": function (date) { var hour = date.getHours(); if (date.getMinutes() >= 20) { return (hour + 1) % 24; @@ -78,4 +78,4 @@ } }; $.fritteli.uhr.register('nl', layout); -}(jQuery)); \ No newline at end of file +}(jQuery)); diff --git a/src/uhr.js b/src/uhr.js deleted file mode 100644 index 0e5ce65..0000000 --- a/src/uhr.js +++ /dev/null @@ -1,816 +0,0 @@ -/* - 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 setCookie; - var isOn; - var update; - 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 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; - } - }; - this.toString = function () { - return '' + myValue + ''; - }; - } - - function UhrRendererV2Delegate(layout) { - 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 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] - }; - - 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) { - parseObject(letters, styleClass, item); - }); - } else { - parseObject(letters, styleClass, input); - } - } - } - - 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); - if (typeof layout.seconds !== 'undefined' && layout.seconds !== null) { - parseTimeDefinition(letters, 'second', layout.seconds); - } else { - parseTimeDefinition(letters, 'second', seconds); - } - parseTimeDefinition(letters, 'minute', layout.minutes); - parseTimeDefinition(letters, 'hour', layout.hours); - return letters; - }; - } - - /** - * 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'); - }); - }; - } - - 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(''); - }); - content.append(languageChooser); - } - - // theme chooser - if (uhrGlobals.themes.length > 1) { - var themeChooser = $(''); - uhrGlobals.themes.forEach(function (item) { - themeChooser.append(''); - }); - 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/src/uehrli.ts b/src/uhr.ts similarity index 97% rename from src/uehrli.ts rename to src/uhr.ts index 58169cd..4a154e3 100644 --- a/src/uehrli.ts +++ b/src/uhr.ts @@ -18,7 +18,7 @@ import {Globals} from "./domain/globals"; import {UhrRenderer} from "./renderer"; import {EMPTY_LAYOUT, Layout} from "./domain/layout"; -export class Uehrli { +export class Uhr { private timer: number = null; private currentMinute: number = null; @@ -428,3 +428,20 @@ export class Uehrli { return EMPTY_LAYOUT; }; } + +declare function $(selector: any): JQuery; + +declare namespace $ { + const cookie: Cookie; + + interface Cookie { + // read all cookies + (): { [name: string]: string } + + // read named cookie + (cookieName: string): string; + + // set cookie with optional options + (cookieName: string, cookieValue: string, cookieOptions?: any): string; + } +} diff --git a/src/widget/widget-prototype.ts b/src/widget/widget-prototype.ts index c72a2a2..8c9785f 100644 --- a/src/widget/widget-prototype.ts +++ b/src/widget/widget-prototype.ts @@ -14,7 +14,7 @@ */ import WidgetCommonProperties = JQueryUI.WidgetCommonProperties; -import {Uehrli} from "../uehrli"; +import {Uhr} from "../uhr"; import {Options} from "./options"; export interface WidgetPrototype extends WidgetCommonProperties { @@ -29,5 +29,5 @@ export interface WidgetPrototype extends WidgetCommonProperties { width: (width: string) => void; _create: () => void; _destroy: () => void; - __fritteli_uhr_instance: Uehrli; + __fritteli_uhr_instance: Uhr; }