/** * Die Uhr. * @param renderarea Das jQuery-gewrappte HTML-Element, auf dem die Uhr angezeigt werden soll. * @param themeElement Das HTML-Stylesheet-Tag, das das Theme-CSS referenziert. */ function Uhr(renderarea, themeElement) { this.renderarea = renderarea; this.themeElement = themeElement; this.timer = null; this.currentTheme = null; this.currentLayout = null; this.layouts = new Array(); this.currentMinute = -1; this.register('undefined', { language: 'Undefined', values: [] }); } Uhr.prototype.toggle = function() { if (this.isOn()) { this.stop(); } else { this.start(); } } Uhr.prototype.start = function() { if (!this.isOn()) { var uhr = this; this.timer = window.setInterval(function() {uhr.update();}, 1000); this.update(); $.cookie('status', 'on'); } } Uhr.prototype.stop = function() { if (this.isOn()) { window.clearInterval(this.timer); this.timer = null; this.update(); $.cookie('status', 'off'); } } Uhr.prototype.isOn = function() { return this.timer != null; } Uhr.prototype.register = function(key, layout) { this.layouts[key] = layout; } Uhr.prototype.setLayout = function(locale) { var newLayout = this.layouts[locale]; if (newLayout !== undefined && newLayout != this.currentLayout) { this.currentLayout = newLayout; var renderer = new UhrRenderer(this.currentLayout, this.renderarea); renderer.render(this); $.cookie('layout', locale); } } Uhr.prototype.setTheme = function(theme) { if (theme != this.currentTheme) { this.currentTheme = theme; this.themeElement.attr('href', 'uhr-' + theme + '.css'); $.cookie('theme', theme); } } Uhr.prototype.update = function() { if (this.isOn()) { var now = new Date(); var dotMinute = this.getDotMinute(now); if (dotMinute == this.currentMinute) { return; } this.currentMinute = dotMinute; var hour = this.getHour(now); var coarseMinute = this.getCoarseMinute(now); this.clear(); this.highlight('on'); for (var i = 1; i <= dotMinute; i++) { this.highlight('dot' + i); } this.highlight('minute' + coarseMinute); hour = this.normalizeHour(hour); this.highlight('hour' + hour); if (coarseMinute == 0) { this.highlight('sharphour'); } } else { this.clear(); this.currentMinute = -1; } } Uhr.prototype.clear = function() { this.renderarea.parent().find('.item').removeClass('active'); } Uhr.prototype.highlight = function(itemClass) { this.renderarea.parent().find('.item.' + itemClass).addClass('active'); } Uhr.prototype.getHour = function(date) { if (typeof this.currentLayout.getHour === 'function') { return this.currentLayout.getHour(date); } var hour = date.getHours(); if (date.getMinutes() >= 25) { return hour + 1; } return hour; } Uhr.prototype.getCoarseMinute = function(date) { if (typeof this.currentLayout.getCoarseMinute === 'function') { return this.currentLayout.getCoarseMinute(date); } var minutes = date.getMinutes(); return minutes - this.getDotMinute(date); } Uhr.prototype.getDotMinute = function(date) { if (typeof this.currentLayout.getDotMinute === 'function') { return this.currentLayout.getDotMinute(date); } var minutes = date.getMinutes(); return minutes % 5; } Uhr.prototype.normalizeHour = function(hour) { if (hour > 12) { hour %= 12; } if (hour == 0) { return 12; } return hour; } /** * 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.layout = layout; this.renderarea = renderarea; } UhrRenderer.prototype.render = function(uhr) { var renderer = this; this.renderarea.fadeOut('fast', function() { renderer.renderarea.empty(); for (var y = 0; y < renderer.layout.values.length; y++) { for (var x = 0; x < renderer.layout.values[y].length; x++) { var letter = renderer.layout.values[y][x]; renderer.renderarea.append(letter.toString()); } if (y < renderer.layout.values.length - 1) { renderer.renderarea.append('
'); } } uhr.currentMinute = -1; uhr.update(); renderer.renderarea.fadeIn('fast'); }); } /** * 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) { this.value = value; this.style = style || ''; this.getStyle = function() { return 'item letter ' + style; } this.getValue = function() { return value; } } Letter.prototype.toString = function letterToString() { return '' + this.getValue() + ''; } /** * Hilfsfunktion, um einen Buchstaben zu erzeugen. * * @param letter string: Der Buchstabe, der angezeigt werden soll * @example l('I', 'is') erzeugt den Buchstaben 'I' mit der CSS-Styleklasse 'is' */ function l(letter, style) { return new Letter(letter, style); } /** * Hilfsfunktion, um einen Buchstaben zu erzeugen, der zu einem Stunden-Wort gehört. * * @param letter string: Der Buchstabe, der angezeigt werden soll * @param hours... integer: Eine Aufzählung von Stundenwerten, zu welchen der Buchstabe als aktiv angezeigt werden soll * @example h('Z', 2), 11 erzeugt den Buchstaben 'Z', der um 2:xx, 11:xx, 14:xx und 23:xx aktiv angezeigt wird */ function h(letter) { var style = ''; for (var i = 1; i < arguments.length; i++) { style += ' hour' + arguments[i]; } return l(letter, style); } /** * Hilfsfunktion, um einen Buchstaben zu erzeugen, der zu einem Minuten-Wort gehört. * * @param letter string: Der Buchstabe, der angezeigt werden soll * @param minutes... integer: Eine Aufzählung von Minutenwerten, zu welchen der Buchstabe als aktiv angezeigt werden soll * @example m('A', 5, 10, 15, 20, 35) erzeugt den Buchstaben 'A' der um :05, :10, :15, :20 und :35 aktiv angezeigt wird */ function m(letter) { var style = ''; for (var i = 1; i < arguments.length; i++) { style += ' minute' + arguments[i]; } return l(letter, style); }