Merge branch 'feature/jqueryplugin' of /var/lib/git/repositories/manuel/uhr into develop

This commit is contained in:
Manuel Friedli 2014-01-11 23:45:49 +01:00
commit 22deff86f7
10 changed files with 329 additions and 279 deletions

View file

@ -1,13 +1,15 @@
Bärneruhr
=========
Du willst Bärneruhr auf deiner Website verwenden? Das geht ganz einfach.
Du willst Bärneruhr auf deiner Website verwenden? Dank des jQuery-Plugins geht das so einfach, dass es sogar deine Grossmutter tun könnte!
1. Benötigte Dateien einbinden
------------------------------
* Binde folgende Javascript-Dateien im HTML-Dokument ein:
* jquery-2.0.3.min.js (Falls nicht bereits vorhanden)
* jquery.cookie.js (Falls nicht bereits vorhanden)
* jquery-ui-1.10.3.custom.min.js (Falls nicht bereits vorhanden)
* 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:
* uhr-de_CH.js
@ -26,14 +28,14 @@ Du willst Bärneruhr auf deiner Website verwenden? Das geht ganz einfach.
----------------------------------------
Erstelle ein leeres `<div>` mit einer ID:
<div id="meineuhr"></div>
<div id="uhrcontainer"></div>
3. Uhr per Javascript konfigurieren
-----------------------------------
Initialisiere die Uhr mit einer einzigen Zeile Javascript:
new Uhr(jQuery('#meineuhr'));
jQuery('#uhrcontainer').uhr();
Als Parameter wird ein jQuery-gewrapptes HTML-Element erwartet. Dies erzeugt eine Uhr in der Standardkonfiguration. Das heisst:
Damit wird eine Uhr in der Standardkonfiguration erzeugt. Das heisst:
* Breite ist 100% des Eltenelements
* Farbe ist Schwarz
@ -42,17 +44,38 @@ Als Parameter wird ein jQuery-gewrapptes HTML-Element erwartet. Dies erzeugt ein
Wie du diese Optionen ändern kannst, verrät der nächte Abschnitt.
Es kann natürlich auch eine Collection von Elementen übergeben werden. Mit
jQuery('div').uhr();
würde also jedes `<div>`-Element der Seite in eine Uhr umgewandelt
4. Weitere Optionen
-------------------
Der Uhr()-Methode kann ein Options-Objekt mitgegeben werden:
Der uhr()-Methode kann ein Options-Objekt mitgegeben werden:
new Uhr(jQuery('#uhrcontainer'), {
status: 'on', // 'on' oder 'off'
theme: 'red', // 'black', 'red', 'blue', 'green' oder 'white'
layout: 'en', // 'de_DE', 'de' oder 'en' (je nach eingebundenen Sprachdateien)
width: '20em' // eine CSS-Grössenangabe
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)
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
});
5. Sonderfunktionen
-------------------
Es gibt noch einen zusätzlichen Konfigurationsparameter. Mit
{
time: new Date()
}
kann die Uhr auf eine fixe Zeit eingestellt werden. Sie bleibt dann statisch und aktualisiert sich nicht, sondern zeigt immer diese Zeit an. Beim Klick auf den On/Off-Schalter oder beim Wechsel der Sprache wird dies allerdings rückgängig gemacht und die Uhr nimmt das Standardverhalten mit der aktuellen Systemzeit an.
Die Zeit kann auch über einen Methodenaufruf dynamisch eingestellt werden:
jQuery('#uhrcontainer').uhr("time", new Date());
Viel Spass!
A. Lizenzbestimmungen

BIN
favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -17,7 +17,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<head>
<title>Die Zeit als Wort - in HTML, CSS und JS</title>
<script type="text/javascript" src="jquery-2.0.3.min.js"></script>
<script type="text/javascript" src="jquery.cookie.js"></script>
<script type="text/javascript" src="jquery-ui-1.10.3.custom.min.js"></script>
<script type="text/javascript" src="jquery-cookie-1.4.0.js"></script>
<script type="text/javascript" src="uhr.js"></script>
<link rel="stylesheet" type="text/css" href="uhr.css" />
<link rel="stylesheet" type="text/css" href="uhr-black.css" />
@ -25,6 +26,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<link rel="stylesheet" type="text/css" href="uhr-green.css" />
<link rel="stylesheet" type="text/css" href="uhr-red.css" />
<link rel="stylesheet" type="text/css" href="uhr-white.css" />
<link rel="shortcut icon" type="image/png" href="favicon.png" />
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
<body style="padding:0;margin:0;">
@ -34,15 +36,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<script type="text/javascript" src="uhr-de.js"></script>
<script type="text/javascript" src="uhr-en.js"></script>
<script type="text/javascript">
var height = jQuery(window).height();
var width = jQuery(window).width();
var size = height < width ? height : width;
new Uhr(jQuery('#uhr'), {
layout: 'de_CH',
theme: 'black',
status: 'on',
width: size + 'px'
});
(function($) {
var width = $(window).width();
var height = $(window).height();
var size = (width < height ? width : height) + 'px';
$('#uhr').uhr({
width: size
});
})(jQuery);
</script>
</body>
</html>

6
jquery-ui-1.10.3.custom.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -1,18 +1,20 @@
CACHE MANIFEST
# 3.0.8
# 4.0.0
COPYING
favicon.png
index.html
jquery-2.0.3.min.js
jquery.cookie.js
uhr.js
uhr-de_CH.js
uhr-de.js
uhr-en.js
uhr.css
jquery-cookie-1.4.0.js
jquery-ui-1.10.3.custom.min.js
uhr-black.css
uhr-red.css
uhr-blue.css
uhr-de.js
uhr-de_CH.js
uhr-en.js
uhr-green.css
uhr-red.css
uhr-white.css
uhr.css
uhr.js
uhr.woff

View file

@ -27,4 +27,4 @@ var layout = {
[h('Z', 10), h('E', 10),h('H', 10),h('N', 9, 10),h('E', 9),h('U', 9),h('N', 9),l('K'),l('U'),l('H'),l('R')]
]
};
Uhr.register('de', layout);
window._uhr.languages['de'] = layout;

View file

@ -27,4 +27,4 @@ var layout = {
[h('Z', 12), h('W', 12),h('Ö', 12),h('U', 12),h('F', 12),h('I', 12),l('N'),l('A'),l('U'),l('H'),l('R')]
]
};
Uhr.register('de_CH', layout);
window._uhr.languages['de_CH'] = layout;

View file

@ -34,4 +34,4 @@ var layout = {
return hour;
}
};
Uhr.register('en', layout);
window._uhr.languages['en'] = layout;

512
uhr.js
View file

@ -12,250 +12,269 @@ 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 <http://www.gnu.org/licenses/>.
*/
/**
* Die Uhr.
* @param clockarea Das jQuery-gewrappte HTML-Element, auf dem die Uhr angezeigt werden soll.
* @param themeElement Das HTML-Stylesheet-Tag, das das Theme-CSS referenziert.
*/
//if (typeof Uhr === 'undefined') {
function Uhr(clockarea, settings) {
this.id = Uhr.id++;
this.timer = null;
this.currentTheme = null;
this.currentLayout = {};
this.currentMinute = -1;
this.initHTMLElements(clockarea, settings || {});
}
Uhr.id = 0;
Uhr.layouts = new Array();
Uhr.register = function (locale, layout) {
Uhr.layouts[locale] = layout;
}
Uhr.prototype.toggle = function() {
if (this.isOn()) {
this.stop();
} else {
this.start();
(function($) {
"use strict";
if (window._uhr !== undefined) {
return;
}
}
Uhr.prototype.start = function() {
if (!this.isOn()) {
var uhr = this;
this.timer = window.setInterval(function() {uhr.update();}, 1000);
this.update();
jQuery.cookie('status' + this.id, 'on', {expires: 365, path: '/'});
}
}
Uhr.prototype.stop = function() {
if (this.isOn()) {
window.clearInterval(this.timer);
this.timer = null;
this.update();
jQuery.cookie('status' + this.id, 'off', {expires: 365, path: '/'});
}
}
Uhr.prototype.isOn = function() {
return this.timer != null;
}
Uhr.prototype.setLayout = function(locale) {
var newLayout = Uhr.layouts[locale];
if (newLayout !== undefined && newLayout != this.currentLayout) {
this.currentLayout = newLayout;
var renderer = new UhrRenderer(this.currentLayout, this.letterarea);
renderer.render(this);
jQuery.cookie('layout' + this.id, locale, {expires: 365, path: '/'});
}
}
Uhr.prototype.setTheme = function(theme) {
if (theme != this.currentTheme) {
this.clockarea.removeClass(this.currentTheme);
this.toggleSwitch.removeClass(this.currentTheme);
this.clockarea.addClass(theme);
this.toggleSwitch.addClass(theme);
this.currentTheme = theme;
jQuery.cookie('theme' + this.id, theme, {expires: 365, path: '/'});
}
}
Uhr.prototype.update = function() {
if (this.isOn()) {
var now = new Date();
if (now.getMinutes() == this.currentMinute) {
return;
window._uhr = {
id: 0,
languages: new Array()
};
$.widget("fritteli.uhr", {
options: {
width: '100%',
status: 'on',
language: 'de_CH',
theme: 'black',
force: false
},
start: function() {
if (!this._isOn()) {
var uhr = this;
this._timer = window.setInterval(function() {
uhr._update();
}, 1000);
this._update();
$.cookie('uhr-status' + this._id, 'on', {expires: 365, path: '/'});
} else {
}
},
stop: function() {
if(this._isOn()) {
window.clearInterval(this._timer);
this._timer = null;
this._update();
$.cookie('uhr-status' + this._id, 'off', {expires: 365, path: '/'});
}
},
toggle: function() {
if(this._isOn()) {
this.stop();
} else {
this.start();
}
},
language: function(languageKey) {
if (languageKey !== this.options.language) {
this.options.language = languageKey;
var renderer = new UhrRenderer(this._language(), this.element.find('.letterarea'));
var uhr = this;
renderer.render(this, function() {
uhr._currentMinute = -1;
uhr._update();
});
$.cookie('uhr-language' + this._id, languageKey, {expires: 365, path: '/'});
this._update();
}
},
theme: function(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;
$.cookie('uhr-theme' + this._id, theme, {expires: 365, path: '/'});
}
},
time: function(time) {
this.options.time = time;
if (time == null) {
this._currentMinute = -1;
this._update();
} else {
if (this._timer != null) {
window.clearInterval(this._timer);
}
var renderer = new UhrRenderer(this._language(), this.element.find('.letterarea'));
var uhr = this;
renderer.render(this, function() {
uhr._show(time);
});
}
},
// private variables
_id: -1,
_timer: null,
_currentMinute: -1,
// private methods
_isOn: function() {
return this._timer !== null;
},
_update: function() {
if (this._isOn()) {
var time = new Date();
if (time.getMinutes() == this._currentMinute) {
return;
}
this._currentMinute = time.getMinutes();
this._show(time);
} else {
this._clear();
this._currentMinute = -1;
}
},
_show: function(time) {
var dotMinute = this._getDotMinute(time);
var hour = this._getHour(time);
var coarseMinute = this._getCoarseMinute(time);
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');
}
},
_language: function() {
return window._uhr.languages[this.options.language];
},
_highlight: function(itemClass) {
this.element.find('.item.' + itemClass).addClass('active');
},
_clear: function() {
this.element.find('.item').removeClass('active');
},
_getHour: function(date) {
if (typeof this._language().getHour === 'function') {
return this._language().getHour(date);
}
var hour = date.getHours();
if (date.getMinutes() >= 25) {
return hour + 1;
}
return hour;
},
_getCoarseMinute: function(date) {
if (typeof this._language().getCoarseMinute === 'function') {
return this._language().getCoarseMinute(date);
}
var minutes = date.getMinutes();
return minutes - this._getDotMinute(date);
},
_getDotMinute: function(date) {
if (typeof this._language().getDotMinute === 'function') {
return this._language().getDotMinute(date);
}
var minutes = date.getMinutes();
return minutes % 5;
},
_normalizeHour: function(hour) {
if (hour > 12) {
hour %= 12;
}
if (hour == 0) {
return 12;
}
return hour;
},
_create: function() {
this._id = window._uhr.id++;
this._setupHTML();
this._wireFunctionality();
if (this.options.time !== undefined) {
this.time(this.options.time);
}
},
_setupHTML: function() {
var e = this.element;
// Base clock area
e.addClass('uhr');
e.empty();
e.append('<span class="item dot dot1"></span>');
e.append('<span class="item dot dot2"></span>');
e.append('<span class="item dot dot3"></span>');
e.append('<span class="item dot dot4"></span>');
e.append('<div class="letterarea"></div>');
e.append('<div class="reflection"></div>');
e.css('width', this.options.width);
var realWidth = e.width()
e.width(realWidth);
e.height(realWidth);
e.css('font-size', (realWidth / 40) + 'px');
// on/off switch
var toggleSwitch = $('<div class="onoffswitch" id="uhr-onoffswitch' + this._id + '"></div>');
toggleSwitch.append('<input type="checkbox" class="onoffswitch-checkbox" id="uhr-onoffswitch-checkbox' + this._id + '" checked="checked" />');
toggleSwitch.append('<label class="onoffswitch-label" for="uhr-onoffswitch-checkbox' + this._id + '">'
+ '<div class="onoffswitch-inner"></div>'
+ '<div class="onoffswitch-switch"></div>'
+ '</label>');
e.after(toggleSwitch);
// language chooser
var languageChooser = $('<select id="uhr-languagechooser' + this._id + '"></select>')
for (var code in window._uhr.languages) {
if (window._uhr.languages.hasOwnProperty(code)) {
var language = window._uhr.languages[code];
languageChooser.append('<option value="' + code + '">' + language.language + '</option>');
}
}
e.after(languageChooser);
// theme chooser
var themeChooser = $('<select id="uhr-themechooser' + this._id + '"></select>');
themeChooser.append('<option value="black">Schwarz</option>');
themeChooser.append('<option value="red">Rot</option>');
themeChooser.append('<option value="blue">Blau</option>');
themeChooser.append('<option value="green">Grün</option>');
themeChooser.append('<option value="white">Weiss</option>');
e.after(themeChooser);
},
_wireFunctionality: function() {
var e = this.element;
var uhr = this;
// on/off switch
var toggleSwitch = $('#uhr-onoffswitch-checkbox' + this._id);
toggleSwitch.on('click', function() {
uhr.toggle();
});
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() {
uhr.language(this.value);
});
var selectedLanguage = $.cookie('uhr-language' + this._id);
if (selectedLanguage == undefined || this.options.force) {
selectedLanguage = this.options.language;
}
languageChooser.val(selectedLanguage);
this.options.language = "";
this.language(selectedLanguage);
// theme chooser
var themeChooser = $('#uhr-themechooser' + this._id);
themeChooser.on('change', function() {
uhr.theme(this.value);
});
var selectedTheme = $.cookie('uhr-theme' + this._id);
if (selectedTheme == undefined || this.options.force) {
selectedTheme = this.options.theme;
}
themeChooser.val(selectedTheme);
this.options.theme = "";
this.theme(selectedTheme);
}
this.currentMinute = now.getMinutes();
var dotMinute = this.getDotMinute(now);
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.clockarea.find('.item').removeClass('active');
}
Uhr.prototype.highlight = function(itemClass) {
this.clockarea.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;
}
Uhr.prototype.initHTMLElements = function(clockarea, presets) {
this.createHTMLElements(clockarea, presets.width);
var force = presets.force || false;
this.initToggleSwitch(presets.status, force);
this.initLayoutSwitch(presets.layout, force);
this.initThemeSwitch(presets.theme, force);
}
Uhr.prototype.createHTMLElements = function(clockarea, width) {
this.createClockarea(clockarea, width)
this.letterarea = this.clockarea.find('.letterarea');
this.createToggleSwitch();
this.createLayoutSwitch();
this.createThemeSwitch();
}
Uhr.prototype.createClockarea = function(clockarea, width) {
clockarea.addClass('uhr');
clockarea.empty();
clockarea.append('<span class="item dot dot1"></span>');
clockarea.append('<span class="item dot dot2"></span>');
clockarea.append('<span class="item dot dot3"></span>');
clockarea.append('<span class="item dot dot4"></span>');
clockarea.append('<div class="letterarea"></div>');
clockarea.append('<div class="reflection"></div>');
if(width == undefined) {
width = '100%';
}
clockarea.css('width', width);
var realWidth = clockarea.width()
clockarea.width(realWidth);
clockarea.height(realWidth);
clockarea.css('font-size', (realWidth / 40) + 'px');
this.clockarea = clockarea
}
Uhr.prototype.createToggleSwitch = function() {
this.toggleSwitch = jQuery('<div class="onoffswitch"></div>');
var input = jQuery('<input type="checkbox" name="onoffswitch' + this.id + '" class="onoffswitch-checkbox" id="onoffswitch' + this.id + '" checked="checked" />');
this.toggleSwitch.append(input);
this.toggleSwitch.append('<label class="onoffswitch-label" for="onoffswitch' + this.id + '">'
+ '<div class="onoffswitch-inner"></div>'
+ '<div class="onoffswitch-switch"></div>'
+ '</label>');
this.clockarea.after(this.toggleSwitch);
}
Uhr.prototype.createLayoutSwitch = function () {
this.layoutSwitch = jQuery('<select></select>')
for (var code in Uhr.layouts) {
if (Uhr.layouts.hasOwnProperty(code)) {
var layout = Uhr.layouts[code];
var option = jQuery('<option value="' + code + '">' + layout.language + '</option>')
this.layoutSwitch.append(option);
}
}
this.clockarea.after(this.layoutSwitch);
}
Uhr.prototype.createThemeSwitch = function () {
this.themeSwitch = jQuery('<select></select>');
this.themeSwitch.append('<option value="black">Schwarz</option>');
this.themeSwitch.append('<option value="red">Rot</option>');
this.themeSwitch.append('<option value="blue">Blau</option>');
this.themeSwitch.append('<option value="green">Grün</option>');
this.themeSwitch.append('<option value="white">Weiss</option>');
this.clockarea.after(this.themeSwitch);
}
Uhr.prototype.initToggleSwitch = function(defaultValue, overrideCookie) {
var input = jQuery('#onoffswitch' + this.id);
var uhr = this;
input.on('click', function() {
uhr.toggle();
});
var status = jQuery.cookie('status' + this.id);
if (status == undefined || (overrideCookie && (defaultValue != undefined))) {
status = defaultValue;
}
if (status == undefined || status == 'undefined') {
status = 'on';
}
if (status == 'on') {
this.start();
input.prop('checked', true);
} else {
this.stop();
input.prop('checked', false);
}
}
Uhr.prototype.initLayoutSwitch = function(defaultValue, overrideCookie) {
var uhr = this;
this.layoutSwitch.on('change', function() {
uhr.setLayout(this.value);
});
var selectedLayout = jQuery.cookie('layout' + this.id);
if (selectedLayout == undefined || (overrideCookie && (defaultValue != undefined))) {
selectedLayout = defaultValue;
}
if (selectedLayout == undefined) {
// FIXME not nice, hardcoded default-value
selectedLayout = 'de_CH';
}
this.layoutSwitch.val(selectedLayout);
this.setLayout(selectedLayout);
}
Uhr.prototype.initThemeSwitch = function(defaultValue, overrideCookie) {
var uhr = this;
this.themeSwitch.on('change', function() {
uhr.setTheme(this.value);
});
var selectedTheme = jQuery.cookie('theme' + this.id);
if (selectedTheme == undefined || (overrideCookie && (defaultValue != undefined))) {
selectedTheme = defaultValue;
}
if (selectedTheme == undefined || selectedTheme == 'undefined') {
selectedTheme = 'black';
}
this.themeSwitch.val(selectedTheme);
this.setTheme(selectedTheme);
}
})(jQuery);
/**
* Hilfsklasse zum Rendern der Uhr.
@ -266,7 +285,7 @@ function UhrRenderer(layout, renderarea) {
this.layout = layout;
this.renderarea = renderarea;
}
UhrRenderer.prototype.render = function(uhr) {
UhrRenderer.prototype.render = function(uhr, beforeshow) {
var renderer = this;
this.renderarea.fadeOut('fast', function() {
renderer.renderarea.empty();
@ -279,12 +298,12 @@ UhrRenderer.prototype.render = function(uhr) {
renderer.renderarea.append('<br/>');
}
}
uhr.currentMinute = -1;
uhr.update();
if (typeof beforeshow === 'function') {
beforeshow();
}
renderer.renderarea.fadeIn('fast');
});
}
/**
* Ein Buchstabe. Hilfsklasse für den Renderer und Inhalt der Layout-Arrays.
* @param value Der Buchstabe, der Dargestellt werden soll.
@ -317,7 +336,7 @@ function l(letter, style) {
*
* @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
* @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 = '';
@ -340,4 +359,3 @@ function m(letter) {
}
return l(letter, style);
}
//}