NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Grepolis Zeitrechner
// @namespace Menidan/Grepolis
// @description Rechnet die Summe bzw. Differenz von zwei Uhrzeiten aus.
// @include http://*.grepolis.com/game*
// @version 1.1
// @grant none
// ==/UserScript==
var w = window, $ = w.$;
//Function.prototype.curry
new function () {
Function.prototype.curry = function () {
if (arguments.length < 1)
return this;
var Funktion = this;
var Argumente = Array.prototype.slice.call (arguments);
return function () {
return Funktion.apply (this, Argumente.concat (Array.prototype.slice.call (arguments)));
};
};
} ();
function Analysieren (Objekt, Text, Erbe, auch_versteckte, kein_alert, kein_log, Stapel_ausgeben) {
if (typeof Text != "string")
Text = "<unbekannt>";
Text = "Analysiere " + Text + " (Typ: ";
var Typ;
Text += Typ = typeof Objekt;
Text += ")\n";
if (Typ == "string" || Typ == "number" || Typ == "boolean" || Typ == "date")
Text += "Wert: " + Objekt + "\n";
else if (Typ == "function")
Text += "Definition:\n" + Objekt.toString () + "\n";
var str = "";
var str2;
var Elemente;
if (auch_versteckte) {
Elemente = {};
var Namen = Object.getOwnPropertyNames (Objekt);
for (var i = 0; i < Namen.length; ++i)
Elemente [Namen [i]] = Objekt [Namen [i]];
} else
Elemente = Objekt;
for (var E in Elemente) {
if (Erbe || typeof Objekt.hasOwnProperty != "function" || Objekt.hasOwnProperty (E)) {
str2 = "";
if (typeof Objekt [E] == "string")
str2 = ": \"" + Objekt [E] + "\"";
else if (typeof Objekt [E] == "number" || typeof Objekt [E] == "boolean" || Typ == "date")
str2 = ": " + Objekt [E];
str += " - " + E + " (" + typeof Objekt [E] + ")" + str2 + "\n";
}
}
Text += str;
if (Stapel_ausgeben) {
str = "\naktueller Stapel:\n";
var aktuell = Analysieren;
while (aktuell.caller) {
str += " - " + aktuell.name + " (Argumente: " + aktuell.arguments.length + ")\n";
aktuell = aktuell.caller;
}
Text += str += " - " + aktuell.name + " (Argumente: " + aktuell.arguments.length + ")\n\n";
}
if (! kein_log)
console.log (Text);
if (! kein_alert)
alert (Text);
return Text;
}
function Fehler_analysieren (Fehler, Text) {
if (typeof Text != "string")
Text = "";
Analysieren (Fehler, Text + " - " + Fehler.name + " - " + Fehler.message, true);
}
function Fehlerblock (This, Funktion, Argumente) {
var Ergebnis;
try {
Ergebnis = Funktion.apply (This, Argumente);
} catch (ex) {
Fehler_analysieren (ex);
}
return Ergebnis;
}
function Fehlerfunktion (Funktion, This) {
return function () {
Fehlerblock (This || this, Funktion, arguments);
};
}
function formatieren (Text) {
Text = Text.split ("%%");
for (var E in Text) {
var i = arguments.length;
while (i--)
Text [E] = Text [E].replace ("%" + i + "%", arguments [i]).replace ("%" + i, arguments [i]);
}
return Text.join ("%");
}
function formatieren2 (Text, Ersetzungen) {
Text = Text.split ("%%");
for (var E in Text) {
var i = arguments.length;
for (var Ziel in Ersetzungen)
Text [E] = Text [E].replace ("%" + Ziel + "%", Ersetzungen [Ziel]).replace ("%" + Ziel, Ersetzungen [Ziel]);
}
return Text.join ("%");
}
function Button_erstellen (Text) {
return $ ('<a href="#" class="button"><span class="left"><span class="right"><span class="middle"><small>' + Text + "</small></span></span></span></a>");
}
function Link_erstellen (Text) {
return $ ('<a href="#">' + Text + "</a>");
}
function kleinen_Link_erstellen (Text) {
return $ ('<a href="#"><small>' + Text + "</small></a>");
}
function hellen_Link_erstellen (Text) {
return $ ('<a href="#" class="Link_hell">' + Text + "</a>");
}
function hellen_kleinen_Link_erstellen (Text) {
return $ ('<a href="#" class="Link_hell"><small>' + Text + "</small></a>");
}
var Zeitrechner = w.Zeitrechner = {
//Container: null,
//Element: null,
//Button: null,
//Stilelement: null,
//Eingabe1: null,
//Eingabe1_Stunden: null,
//Eingabe1_Minuten: null,
//Eingabe1_Sekunden: null,
//Eingabe2: null,
//Eingabe2_Stunden: null,
//Eingabe2_Minuten: null,
//Eingabe2_Sekunden: null,
//Button_Plus: null,
//Button_Minus: null,
//Ergebnis: null,
Starten: Fehlerfunktion (function () {
Zeitrechner.Beenden ();
if (! Zeitrechner.Stilelement)
Zeitrechner.Stilelement = $ ('<style type="text/css">a.Link_hell:not(:hover):not(:active){color:rgb(255,204,102)}</style>').appendTo (document.head);
Zeitrechner.Container = $ ('<div class="sidebar_unit_wrapper" style="display: none;"></div>').insertAfter (".bottom_ornament");
Zeitrechner.Button = Button_erstellen ("Zeitrechner").css ({margin: "0px", display: "block"}).click (Zeitrechner.anzeigen).insertAfter (".bottom_ornament");
Zeitrechner.Element = $ ('<div class="sidebar_unit_container clearfix" style="color: #FFCC66; font-size: x-small; background-position: right; background-image: url(http://de.cdn.grepolis.com/images/game/layout/layout_units_nav_bg.png);"></div>').appendTo (Zeitrechner.Container);
$ (".bottom_ornament").css ("bottom", "-27px");
}),
Beenden: function () {
if (Zeitrechner.Eingabe1_Stunden) {
Zeitrechner.Eingabe1_Stunden.remove ();
delete Zeitrechner.Eingabe1_Stunden;
}
if (Zeitrechner.Eingabe1_Minuten) {
Zeitrechner.Eingabe1_Minuten.remove ();
delete Zeitrechner.Eingabe1_Minuten;
}
if (Zeitrechner.Eingabe1_Sekunden) {
Zeitrechner.Eingabe1_Sekunden.remove ();
delete Zeitrechner.Eingabe1_Sekunden;
}
if (Zeitrechner.Eingabe1) {
Zeitrechner.Eingabe1.remove ();
delete Zeitrechner.Eingabe1;
}
if (Zeitrechner.Eingabe2_Stunden) {
Zeitrechner.Eingabe2_Stunden.remove ();
delete Zeitrechner.Eingabe2_Stunden;
}
if (Zeitrechner.Eingabe2_Minuten) {
Zeitrechner.Eingabe2_Minuten.remove ();
delete Zeitrechner.Eingabe2_Minuten;
}
if (Zeitrechner.Eingabe2_Sekunden) {
Zeitrechner.Eingabe2_Sekunden.remove ();
delete Zeitrechner.Eingabe2_Sekunden;
}
if (Zeitrechner.Eingabe2) {
Zeitrechner.Eingabe2.remove ();
delete Zeitrechner.Eingabe2;
}
if (Zeitrechner.Button_Plus) {
Zeitrechner.Button_Plus.remove ();
delete Zeitrechner.Button_Plus;
}
if (Zeitrechner.Button_Minus) {
Zeitrechner.Button_Minus.remove ();
delete Zeitrechner.Button_Minus;
}
if (Zeitrechner.Ergebnis) {
Zeitrechner.Ergebnis.remove ();
delete Zeitrechner.Ergebnis;
}
if (Zeitrechner.Element) {
Zeitrechner.Element.remove ();
delete Zeitrechner.Element;
}
if (Zeitrechner.Container) {
Zeitrechner.Container.remove ();
delete Zeitrechner.Container;
}
if (Zeitrechner.Button) {
Zeitrechner.Button.remove ();
delete Zeitrechner.Button;
}
},
anzeigen: Fehlerfunktion (function () {
if (! Zeitrechner.Container)
return;
Zeitrechner.Container.toggle ();
if (Zeitrechner.Container.is (":visible")) {
var Eingabe = Fehlerfunktion (function Eingabe (Nummer, Index, Ereignis) {
var Ziel = Ereignis.target;
//Doppelpunkt streichen, wie in ":56" aus "12:34:56"
if (Ziel.value [0] == ":")
Ziel.value = Ziel.value.substring (1);
var Text = Ziel.value;
var weiter = Zeitrechner ["Eingabe" + Nummer + "_" + (Index + 1)];
var Cursor = Ziel.selectionStart == Ziel.selectionEnd ? Ziel.selectionStart : Ziel.selectionDirection == "forward" ? Ziel.selectionEnd : Ziel.selectionStart;
//Google Chrome macht nur Probleme, etwa dieses hier...
if (Text.length == 1) {
Ziel.blur ();
Ziel.focus ();
//Text zu lang, kürzen
} else if (Text.length > 2 && weiter) {
Ziel.value = Text.substring (0, 2);
weiter.val (Text.substring (2));
if (Cursor > 2) {
weiter.get (0).selectionStart = weiter.get (0).selectionEnd = Cursor - 2;
weiter.focus ();
}
Eingabe (Nummer, Index + 1, {target: weiter.get (0)});
//nur den Cursor weiterbewegen
} else if (Cursor >= 2 && Ziel.selectionStart == Ziel.selectionEnd) {
if (weiter) {
weiter.get (0).selectionStart = Cursor - 2;
weiter.get (0).selectionEnd = weiter.val ().length;
weiter.focus ();
} else if (Zeitrechner ["Eingabe" + (Nummer + 1)]) {
weiter = Zeitrechner ["Eingabe" + (Nummer + 1) + "_1"];
weiter.get (0).selectionStart = 0;
weiter.get (0).selectionEnd = weiter.val ().length;
weiter.focus ();
} else {
Zeitrechner.Eingabe1_1.get (0).selectionStart = 0;
Zeitrechner.Eingabe1_1.get (0).selectionEnd = Zeitrechner.Eingabe1_1.val ().length;
Zeitrechner.Eingabe1_1.focus ();
}
}
});
Zeitrechner.Element.empty ();
Zeitrechner.Eingabe1 = $ ('<span style="width: 114px; height: 12px; display: dock; margin-top: 2px;"></span>').appendTo (Zeitrechner.Element);
Zeitrechner.Eingabe1_1 = $ ('<input type="text" value="00" style="width: 16px;" />').on ("input", Eingabe.curry (1, 1)).appendTo (Zeitrechner.Eingabe1);
Zeitrechner.Eingabe1.append (":");
Zeitrechner.Eingabe1_2 = $ ('<input type="text" value="00" style="width: 16px;" />').on ("input", Eingabe.curry (1, 2)).appendTo (Zeitrechner.Eingabe1);
Zeitrechner.Eingabe1.append (":");
Zeitrechner.Eingabe1_3 = $ ('<input type="text" value="00" style="width: 16px;" />').on ("input", Eingabe.curry (1, 3)).appendTo (Zeitrechner.Eingabe1);
Zeitrechner.Element.append ("<br />");
Zeitrechner.Eingabe2 = $ ('<span style="width: 114px; height: 12px; display: dock; margin-top: 3px; margin-bottom: 3px;"></span>').appendTo (Zeitrechner.Element);
Zeitrechner.Eingabe2_1 = $ ('<input type="text" value="00" style="width: 16px;" />').on ("input", Eingabe.curry (2, 1)).appendTo (Zeitrechner.Eingabe2);
Zeitrechner.Eingabe2.append (":");
Zeitrechner.Eingabe2_2 = $ ('<input type="text" value="00" style="width: 16px;" />').on ("input", Eingabe.curry (2, 2)).appendTo (Zeitrechner.Eingabe2);
Zeitrechner.Eingabe2.append (":");
Zeitrechner.Eingabe2_3 = $ ('<input type="text" value="00" style="width: 16px;" />').on ("input", Eingabe.curry (2, 3)).appendTo (Zeitrechner.Eingabe2);
//Zeitrechner.Eingabe1 = $ ('<input type="text" value="00:00:00" style="width: 114px; margin-top: 2px;" />').appendTo (Zeitrechner.Element);
//Zeitrechner.Element.append ("<br />");
//Zeitrechner.Eingabe2 = $ ('<input type="text" value="00:00:00" style="width: 114px; margin-top: 3px; margin-bottom: 3px;" />').appendTo (Zeitrechner.Element);
//Zeitrechner.Element.append ("<br />");
Zeitrechner.Plus_Button = Button_erstellen ("Plus").click (Fehlerfunktion (function () {
Zeitrechner.Ergebnis_berechnen (function (a, b) {
return a + b;
});
})).appendTo (Zeitrechner.Element);
Zeitrechner.Element.append ("<br />");
Zeitrechner.Minus_Button = Button_erstellen ("Minus").click (Fehlerfunktion (function () {
Zeitrechner.Ergebnis_berechnen (function (a, b) {
return a - b;
});
})).appendTo (Zeitrechner.Element);
Zeitrechner.Element.append ("<br />");
Zeitrechner.Ergebnis = $ ('<b style="margin-left: auto; margin-right: auto;">Ergebnis</b>').appendTo (Zeitrechner.Element);
}
}),
Ergebnis_berechnen: function (Funktion) {
if (Zeitrechner.Eingabe1 && Zeitrechner.Eingabe2 && Zeitrechner.Ergebnis) {
try {
Zeitrechner.Ergebnis.html (Zeitrechner.als_Zeit (Funktion (Zeitrechner.Eingabe (1), Zeitrechner.Eingabe (2))));
} catch (Fehler) {
Zeitrechner.Ergebnis.html ('<span style="color: red;">' + Fehler.message + "</span>");
}
}
},
Eingabe: function (Nummer) {
var Eingabe = Zeitrechner ["Eingabe" + Nummer];
Eingabe = Eingabe.find ("input");
if (Eingabe) {
var Ergebnis = 0;
Eingabe.each (function () {
Ergebnis *= 60;
Ergebnis += parseInt (this.value);
});
return Ergebnis;
}
},
als_Zeit: function (Sekunden) {
var minus = Sekunden < 0;
if (minus)
Sekunden = -Sekunden;
var Minuten = Sekunden / 60 >> 0;
Sekunden %= 60;
var Stunden = Minuten / 60 >> 0;
Minuten %= 60;
var Tage = Stunden / 24 >> 0;
Stunden %= 24;
if (Sekunden < 10)
Sekunden = "0" + Sekunden;
if (Minuten < 10)
Minuten = "0" + Minuten;
if (Stunden < 10)
Stunden = "0" + Stunden;
return (minus ? "- (" : "") + Tage + " Tag" + (Tage == 1 || Tage == -1 ? "" : "e") + " + " + Stunden + ":" + Minuten + ":" + Sekunden + (minus ? ")" : "");
}
};
Zeitrechner.Starten ();