Bearbeiten von „OS2.jugend“
Zur Navigation springen
Zur Suche springen
Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und veröffentliche dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.
Aktuelle Version | Dein Text | ||
Zeile 1: | Zeile 1: | ||
[[Kategorie:Greasemonkey]] | [[Kategorie:Greasemonkey]] | ||
{| style="background-color:white; font-size:11px; float: right; margin:3px 3px 3px 10px; border:1px solid #999; border-color: #9C1818; border-collapse:collapse;" width=500 cellpadding=3 cellspacing=0 | {| style="background-color:white; font-size:11px; float: right; margin:3px 3px 3px 10px; border:1px solid #999; border-color: #9C1818; border-collapse:collapse;" width=500 cellpadding=3 cellspacing=0 | ||
| colspan="2" style="padding:0.3em; background-color:#9C1818; font-size: 18px; color:#FFFFFF" align=center| '''OS2.jugend''' | | colspan="2" style="padding:0.3em; background-color:#9C1818; font-size: 18px; color:#FFFFFF" align=center| '''OS2.jugend''' | ||
Zeile 8: | Zeile 7: | ||
|- bgcolor="#FFCC00" | |- bgcolor="#FFCC00" | ||
| '''Version''' | | '''Version''' | ||
| '''0. | | '''0.53''' | ||
|- bgcolor="#FFCC00" | |- bgcolor="#FFCC00" | ||
| '''Autor''' | | '''Autor''' | ||
Zeile 27: | Zeile 26: | ||
| '''ju.php?page=2''' | | '''ju.php?page=2''' | ||
| '''Jugendteam-Spielereinzelwerte''' | | '''Jugendteam-Spielereinzelwerte''' | ||
|} | |} | ||
|- bgcolor="#FFCC00" | |- bgcolor="#FFCC00" | ||
| '''Funktionalität''' | | '''Funktionalität''' | ||
| '''Trennstriche zwischen den Jahrgängen'''<br> '''Aktueller Skill, Opti und MW'''<br> '''Prognose von Opti und MW für Ende Jahrgang 18'''<br> '''Optionen und Menu'''<br> '''Neue Marktwertformel'''<br> '''Automatische Ermittlung des ZATs'''<br> '''Hidden-Optionen und Datenspeicher'''<br> '''Geburtstage und dezimales Alter'''<br> '''Erweiterte Optionen auch auf der Seite'''<br> '''Zusatzspalten Talent/Quote/Aufw./Geb./Alter'''<br> '''Zusatzspalten Quote/Alter/Pos in der Übersicht'''<br> '''Zusatzspalten Alter ersetzen/Aufwertungen kurz+TOR'''<br> '''Zusatzspalten fix/tr./%H/%N/Prios jetzt und Ende'''<br> '''Interaktive Menü-Optionen'''<br> '''Gemeinsame Code- und Datenbasis'''<br> '''Qualitätsbalken'''<br> '''Markierung der Primärskills bei Einzelwerten und Aufwertungen'''<br> '''Beachtung von Jugendförderung und Doppelpositionen'''<br> '''Warnung vor Ende 18 in | | '''Trennstriche zwischen den Jahrgängen'''<br> '''Aktueller Skill, Opti und MW'''<br> '''Prognose von Opti und MW für Ende Jahrgang 18'''<br> '''Optionen und Menu'''<br> '''Neue Marktwertformel'''<br> '''Automatische Ermittlung des ZATs'''<br> '''Hidden-Optionen und Datenspeicher'''<br> '''Geburtstage und dezimales Alter'''<br> '''Erweiterte Optionen auch auf der Seite'''<br> '''Zusatzspalten Talent/Quote/Aufw./Geb./Alter'''<br> '''Zusatzspalten Quote/Alter/Pos in der Übersicht'''<br> '''Zusatzspalten Alter ersetzen/Aufwertungen kurz+TOR'''<br> '''Zusatzspalten fix/tr./%H/%N/Prios jetzt und Ende'''<br> '''Interaktive Menü-Optionen'''<br> '''Gemeinsame Code- und Datenbasis'''<br> '''Qualitätsbalken'''<br> '''Markierung der Primärskills bei Einzelwerten und Aufwertungen'''<br> '''Beachtung von Jugendförderung und Doppelpositionen'''<br> '''Warnung vor Ende 18 in letzer Periode und mehr am letzten ZAT'''<br> '''Reguläre Ausdrücke im @include''' | ||
|- bgcolor="#FFCC00" | |- bgcolor="#FFCC00" | ||
Zeile 48: | Zeile 41: | ||
// @name OS2.jugend | // @name OS2.jugend | ||
// @namespace http://os.ongapo.com/ | // @namespace http://os.ongapo.com/ | ||
// @version 0. | // @version 0.53 | ||
// @copyright 2013+ | // @copyright 2013+ | ||
// @author | // @author Andreas Eckes (Strindheim BK) / Sven Loges (SLC) | ||
// @description Jugendteam-Script fuer Online Soccer 2.0 | // @description Jugendteam-Script fuer Online Soccer 2.0 | ||
// @include /^https?://(www\.)?(os\.ongapo\.com|online-soccer\.eu|os-zeitungen\.com)/haupt\.php(\?changetosecond=\w+(&\S+)*)?$/ | // @include /^https?://(www\.)?(os\.ongapo\.com|online-soccer\.eu|os-zeitungen\.com)/haupt\.php(\?changetosecond=\w+(&\S+)*)?$/ | ||
// @include /^https?://(www\.)?(os\.ongapo\.com|online-soccer\.eu|os-zeitungen\.com)/ju\.php(\?page=\d+(&\S+)*)?$/ | // @include /^https?://(www\.)?(os\.ongapo\.com|online-soccer\.eu|os-zeitungen\.com)/ju\.php(\?page=\d+(&\S+)*)?$/ | ||
// @grant GM_getValue | // @grant GM_getValue | ||
// @grant GM_setValue | // @grant GM_setValue | ||
Zeile 67: | Zeile 54: | ||
// ==/UserScript== | // ==/UserScript== | ||
// ECMAScript 6: | // ECMAScript 6: Erlaubt 'const', 'let', ... | ||
/* jshint esnext: true */ | /* jshint esnext: true */ | ||
/* jshint moz: true */ | /* jshint moz: true */ | ||
Zeile 73: | Zeile 60: | ||
// ==================== Konfigurations-Abschnitt fuer Optionen ==================== | // ==================== Konfigurations-Abschnitt fuer Optionen ==================== | ||
const __LOGLEVEL = | const __LOGLEVEL = 6; | ||
// Options-Typen | // Options-Typen | ||
Zeile 124: | Zeile 111: | ||
'AltHotkey' : 'k', | 'AltHotkey' : 'k', | ||
'FormLabel' : "Prognose Einzelwerte" | 'FormLabel' : "Prognose Einzelwerte" | ||
}, | }, | ||
'zeigeBalken' : { // Spaltenauswahl fuer den Qualitaetsbalken des Talents (true = anzeigen, false = nicht anzeigen) | 'zeigeBalken' : { // Spaltenauswahl fuer den Qualitaetsbalken des Talents (true = anzeigen, false = nicht anzeigen) | ||
Zeile 224: | Zeile 123: | ||
'FormLabel' : "Balken Qualit\xE4t" | 'FormLabel' : "Balken Qualit\xE4t" | ||
}, | }, | ||
'absBalken' : { | 'absBalken' : { // Spaltenauswahl fuer den Guetebalken des Talents absolut statt nach Foerderung (true = absolut, false = relativ nach Foerderung) | ||
'Name' : "absBar", | 'Name' : "absBar", | ||
'Type' : __OPTTYPES.SW, | 'Type' : __OPTTYPES.SW, | ||
Zeile 427: | Zeile 326: | ||
'Name' : "anzOpti", | 'Name' : "anzOpti", | ||
'Type' : __OPTTYPES.MC, | 'Type' : __OPTTYPES.MC, | ||
'ValType' : | 'ValType' : "Number", | ||
'SelValue' : false, | 'SelValue' : false, | ||
'Choice' : [ 0, 1, 2, 3, 4, 5, 6 ], | 'Choice' : [ 0, 1, 2, 3, 4, 5, 6 ], | ||
Zeile 440: | Zeile 339: | ||
'Name' : "anzMW", | 'Name' : "anzMW", | ||
'Type' : __OPTTYPES.MC, | 'Type' : __OPTTYPES.MC, | ||
'ValType' : | 'ValType' : "Number", | ||
'SelValue' : false, | 'SelValue' : false, | ||
'Choice' : [ 0, 1, 2, 3, 4, 5, 6 ], | 'Choice' : [ 0, 1, 2, 3, 4, 5, 6 ], | ||
Zeile 509: | Zeile 408: | ||
'Name' : "anzOptiEnde", | 'Name' : "anzOptiEnde", | ||
'Type' : __OPTTYPES.MC, | 'Type' : __OPTTYPES.MC, | ||
'ValType' : | 'ValType' : "Number", | ||
'SelValue' : false, | 'SelValue' : false, | ||
'Choice' : [ 0, 1, 2, 3, 4, 5, 6 ], | 'Choice' : [ 0, 1, 2, 3, 4, 5, 6 ], | ||
Zeile 523: | Zeile 422: | ||
'Name' : "anzMWEnde", | 'Name' : "anzMWEnde", | ||
'Type' : __OPTTYPES.MC, | 'Type' : __OPTTYPES.MC, | ||
'ValType' : | 'ValType' : "Number", | ||
'SelValue' : false, | 'SelValue' : false, | ||
'Choice' : [ 0, 1, 2, 3, 4, 5, 6 ], | 'Choice' : [ 0, 1, 2, 3, 4, 5, 6 ], | ||
Zeile 535: | Zeile 434: | ||
'Name' : "charEnde", | 'Name' : "charEnde", | ||
'Type' : __OPTTYPES.MC, | 'Type' : __OPTTYPES.MC, | ||
'ValType' : | 'ValType' : "String", | ||
'FreeValue' : true, | 'FreeValue' : true, | ||
'MinChoice' : 0, | 'MinChoice' : 0, | ||
Zeile 547: | Zeile 446: | ||
'Name' : "sepStyle", | 'Name' : "sepStyle", | ||
'Type' : __OPTTYPES.MC, | 'Type' : __OPTTYPES.MC, | ||
'ValType' : | 'ValType' : "String", | ||
'Choice' : [ | 'Choice' : [ "solid", "hidden", "dotted", "dashed", "double", "groove", "ridge", | ||
"inset", "outset", "none" ], | |||
'Action' : __OPTACTION.NXT, | 'Action' : __OPTACTION.NXT, | ||
'Label' : "Stil: $", | 'Label' : "Stil: $", | ||
Zeile 558: | Zeile 457: | ||
'Name' : "sepColor", | 'Name' : "sepColor", | ||
'Type' : __OPTTYPES.MC, | 'Type' : __OPTTYPES.MC, | ||
'ValType' : | 'ValType' : "String", | ||
'FreeValue' : true, | 'FreeValue' : true, | ||
'Choice' : [ | 'Choice' : [ "white", "yellow", "black", "blue", "cyan", "gold", "grey", "green", | ||
"lime", "magenta", "maroon", "navy", "olive", "orange", "purple", | |||
"red", "teal", "transparent" ], | |||
'Action' : __OPTACTION.NXT, | 'Action' : __OPTACTION.NXT, | ||
'Label' : "Farbe: $", | 'Label' : "Farbe: $", | ||
Zeile 571: | Zeile 470: | ||
'Name' : "sepWidth", | 'Name' : "sepWidth", | ||
'Type' : __OPTTYPES.MC, | 'Type' : __OPTTYPES.MC, | ||
'ValType' : | 'ValType' : "String", | ||
'FreeValue' : true, | 'FreeValue' : true, | ||
'Choice' : [ | 'Choice' : [ "thin", "medium", "thick" ], | ||
'Action' : __OPTACTION.NXT, | 'Action' : __OPTACTION.NXT, | ||
'Label' : "Dicke: $", | 'Label' : "Dicke: $", | ||
Zeile 582: | Zeile 481: | ||
'Name' : "saison", | 'Name' : "saison", | ||
'Type' : __OPTTYPES.MC, | 'Type' : __OPTTYPES.MC, | ||
'ValType' : | 'ValType' : "Number", | ||
'FreeValue' : true, | 'FreeValue' : true, | ||
'SelValue' : false, | 'SelValue' : false, | ||
'Choice' : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 | 'Choice' : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ], | ||
'Default' : | 'Default' : 11, | ||
'Action' : __OPTACTION.NXT, | 'Action' : __OPTACTION.NXT, | ||
'Label' : "Saison: $", | 'Label' : "Saison: $", | ||
Zeile 595: | Zeile 494: | ||
'Name' : "currZAT", | 'Name' : "currZAT", | ||
'Type' : __OPTTYPES.MC, | 'Type' : __OPTTYPES.MC, | ||
'ValType' : | 'ValType' : "Number", | ||
'Permanent' : true, | 'Permanent' : true, | ||
'SelValue' : false, | 'SelValue' : false, | ||
Zeile 613: | Zeile 512: | ||
'Name' : "dataZAT", | 'Name' : "dataZAT", | ||
'Type' : __OPTTYPES.SD, | 'Type' : __OPTTYPES.SD, | ||
'ValType' : | 'ValType' : "Number", | ||
'Hidden' : true, | 'Hidden' : true, | ||
'Serial' : true, | 'Serial' : true, | ||
Zeile 630: | Zeile 529: | ||
'Name' : "oldDataZAT", | 'Name' : "oldDataZAT", | ||
'Type' : __OPTTYPES.SD, | 'Type' : __OPTTYPES.SD, | ||
'ValType' : | 'ValType' : "Number", | ||
'Hidden' : true, | 'Hidden' : true, | ||
'Serial' : true, | 'Serial' : true, | ||
Zeile 647: | Zeile 546: | ||
'Name' : "donation", | 'Name' : "donation", | ||
'Type' : __OPTTYPES.MC, | 'Type' : __OPTTYPES.MC, | ||
'ValType' : | 'ValType' : "Number", | ||
'Permanent' : true, | 'Permanent' : true, | ||
'SelValue' : false, | 'SelValue' : false, | ||
Zeile 732: | Zeile 631: | ||
'Label' : "Aufwertungen:" | 'Label' : "Aufwertungen:" | ||
}, | }, | ||
' | 'zatAges' : { // Datenspeicher fuer (gebrochene) Alter der Jugendspieler | ||
'Name' : " | 'Name' : "zatAges", | ||
'Type' : __OPTTYPES.SD, | 'Type' : __OPTTYPES.SD, | ||
'Hidden' : true, | 'Hidden' : true, | ||
'Serial' : true, | 'Serial' : true, | ||
'AutoReset' : | 'AutoReset' : true, | ||
'Permanent' : true, | 'Permanent' : true, | ||
'Default' : [], | 'Default' : [], | ||
'Submit' : undefined, | 'Submit' : undefined, | ||
'Cols' : | 'Cols' : 36, | ||
'Rows' : | 'Rows' : 2, | ||
'Replace' : null, | 'Replace' : null, | ||
'Space' : 0, | 'Space' : 0, | ||
'Label' : "ZAT-Alter:" | |||
'Label' : "ZAT-Alter:" | |||
}, | }, | ||
'trainiert' : { // Datenspeicher fuer Trainingsquoten der Jugendspieler | 'trainiert' : { // Datenspeicher fuer Trainingsquoten der Jugendspieler | ||
Zeile 858: | Zeile 726: | ||
}, | }, | ||
'reset' : { // Optionen auf die "Werkseinstellungen" zuruecksetzen | 'reset' : { // Optionen auf die "Werkseinstellungen" zuruecksetzen | ||
'Name' : "reset", | 'Name' : "reset", | ||
'Type' : __OPTTYPES.SI, | 'Type' : __OPTTYPES.SI, | ||
Zeile 867: | Zeile 734: | ||
}, | }, | ||
'storage' : { // Browserspeicher fuer die Klicks auf Optionen | 'storage' : { // Browserspeicher fuer die Klicks auf Optionen | ||
'Name' : "storage", | 'Name' : "storage", | ||
'Type' : __OPTTYPES.MC, | 'Type' : __OPTTYPES.MC, | ||
'ValType' : | 'ValType' : "String", | ||
'Choice' : Object.keys(__OPTMEM), | 'Choice' : Object.keys(__OPTMEM), | ||
'Action' : __OPTACTION.NXT, | 'Action' : __OPTACTION.NXT, | ||
Zeile 878: | Zeile 744: | ||
}, | }, | ||
'oldStorage' : { // Vorheriger Browserspeicher fuer die Klicks auf Optionen | 'oldStorage' : { // Vorheriger Browserspeicher fuer die Klicks auf Optionen | ||
'Name' : "oldStorage", | 'Name' : "oldStorage", | ||
'Type' : __OPTTYPES.SD, | 'Type' : __OPTTYPES.SD, | ||
Zeile 886: | Zeile 751: | ||
}, | }, | ||
'showForm' : { // Optionen auf der Webseite (true = anzeigen, false = nicht anzeigen) | 'showForm' : { // Optionen auf der Webseite (true = anzeigen, false = nicht anzeigen) | ||
'Name' : "showForm", | 'Name' : "showForm", | ||
'Type' : __OPTTYPES.SW, | 'Type' : __OPTTYPES.SW, | ||
Zeile 892: | Zeile 756: | ||
'Permanent' : true, | 'Permanent' : true, | ||
'Default' : false, | 'Default' : false, | ||
'Action' : __OPTACTION.NXT, | 'Action' : __OPTACTION.NXT, | ||
'Label' : "Optionen anzeigen", | 'Label' : "Optionen anzeigen", | ||
'Hotkey' : 'O', | 'Hotkey' : 'O', | ||
'AltLabel' : "Optionen verbergen", | 'AltLabel' : "Optionen verbergen", | ||
'AltHotkey' : 'O', | 'AltHotkey' : 'O', | ||
Zeile 907: | Zeile 769: | ||
// Ein Satz von Logfunktionen, die je nach Loglevel zur Verfuegung stehen. Aufruf: __LOG[level](text) | // Ein Satz von Logfunktionen, die je nach Loglevel zur Verfuegung stehen. Aufruf: __LOG[level](text) | ||
const __LOG = { | const __LOG = { | ||
'logFun' | 'logFun' : [ | ||
console.error, // [0] Alert | |||
console.error, // [1] Error | |||
console.log, // [2] Log: Release | |||
console.log, // [3] Log: Info | |||
console.log, // [4] Log: Debug | |||
console.log, // [5] Log: Verbose | |||
console.log // [6] Log: Very verbose | |||
], | |||
'init' : function(win, logLevel = 1) { | |||
'init' | for (level = 0; level < this.logFun.length; level++) { | ||
this[level] = ((level > logLevel) ? function() { } : this.logFun[level]); | |||
} | |||
}, | |||
'changed' : function(oldVal, newVal) { | |||
const __OLDVAL = safeStringify(oldVal); | |||
'changed' | const __NEWVAL = safeStringify(newVal); | ||
return ((__OLDVAL !== __NEWVAL) ? __OLDVAL + " => " : "") + __NEWVAL; | |||
} | |||
}; | }; | ||
Zeile 968: | Zeile 828: | ||
// message: Der Meldungs-Text | // message: Der Meldungs-Text | ||
// data: Ein Wert. Ist er angegeben, wird er in der Console ausgegeben | // data: Ein Wert. Ist er angegeben, wird er in der Console ausgegeben | ||
function showAlert(label, message, data = undefined) { | function showAlert(label, message, data = undefined) { | ||
__LOG[ | __LOG[1](label + ": " + message); | ||
if (data !== undefined) { | if (data !== undefined) { | ||
Zeile 977: | Zeile 836: | ||
alert(label + "\n\n" + message); | alert(label + "\n\n" + message); | ||
} | } | ||
Zeile 1.115: | Zeile 941: | ||
return this.className; | return this.className; | ||
} | } | ||
}); | } ); | ||
// ==================== Ende Abschnitt fuer Klasse Class ==================== | // ==================== Ende Abschnitt fuer Klasse Class ==================== | ||
Zeile 1.162: | Zeile 988: | ||
this.home = home; | this.home = home; | ||
} | } | ||
}); | } ); | ||
// ==================== Ende Abschnitt fuer Klasse Delims ==================== | // ==================== Ende Abschnitt fuer Klasse Delims ==================== | ||
Zeile 1.241: | Zeile 1.067: | ||
this.node = node; | this.node = node; | ||
} | } | ||
}); | } ); | ||
// ==================== Ende Abschnitt fuer Klasse UriDelims ==================== | // ==================== Ende Abschnitt fuer Klasse UriDelims ==================== | ||
Zeile 1.340: | Zeile 1.166: | ||
return __DIRS.slice(1); | return __DIRS.slice(1); | ||
} | } | ||
}); | } ); | ||
// ==================== Ende Abschnitt fuer Klasse Path ==================== | // ==================== Ende Abschnitt fuer Klasse Path ==================== | ||
Zeile 1.498: | Zeile 1.324: | ||
const __LOWER = (value ? value.toLowerCase() : undefined); | const __LOWER = (value ? value.toLowerCase() : undefined); | ||
if ((__LOWER === | if ((__LOWER === "true") || (__LOWER === "false")) { | ||
return (value === | return (value === "true"); | ||
} | } | ||
} | } | ||
Zeile 1.551: | Zeile 1.377: | ||
return Path.prototype.getDirs.call(this, __PATH); | return Path.prototype.getDirs.call(this, __PATH); | ||
} | } | ||
}); | } ); | ||
// ==================== Ende Abschnitt fuer Klasse URI ==================== | // ==================== Ende Abschnitt fuer Klasse URI ==================== | ||
Zeile 1.591: | Zeile 1.417: | ||
return this.getPath(); | return this.getPath(); | ||
} | } | ||
}); | } ); | ||
// ==================== Ende Abschnitt fuer Klasse Directory ==================== | // ==================== Ende Abschnitt fuer Klasse Directory ==================== | ||
Zeile 1.619: | Zeile 1.445: | ||
return ret; | return ret; | ||
} | } | ||
}); | } ); | ||
// ==================== Ende Abschnitt fuer Klasse ObjRef ==================== | // ==================== Ende Abschnitt fuer Klasse ObjRef ==================== | ||
Zeile 1.664: | Zeile 1.490: | ||
// Gibt ein Produkt zurueck. Ist einer der Multiplikanten nicht definiert, wird ein Alternativwert geliefert | // Gibt ein Produkt zurueck. Ist einer der Multiplikanten nicht definiert, wird ein Alternativwert geliefert | ||
// valueA: Ein | // valueA: Ein Multipliksnt. Ist dieser undefined, wird als Produkt defValue zurueckgeliefert | ||
// valueB: Ein | // valueB: Ein Multipliksnt. Ist dieser undefined, wird als Produkt defValue zurueckgeliefert | ||
// digits: Anzahl der Stellen nach dem Komma fuer das Produkt (Default: 0) | // digits: Anzahl der Stellen nach dem Komma fuer das Produkt (Default: 0) | ||
// defValue: Default-Wert fuer den Fall, dass ein Multiplikant nicht gesetzt ist (Default: NaN) | // defValue: Default-Wert fuer den Fall, dass ein Multiplikant nicht gesetzt ist (Default: NaN) | ||
Zeile 1.681: | Zeile 1.507: | ||
return parseFloat(product.toFixed(digits)); | return parseFloat(product.toFixed(digits)); | ||
} | } | ||
Zeile 1.705: | Zeile 1.523: | ||
function instanceOf(obj, base) { | function instanceOf(obj, base) { | ||
while (obj !== null) { | while (obj !== null) { | ||
if (obj === base.prototype) | if (obj === base.prototype) | ||
return true; | return true; | ||
if ((typeof obj) === 'xml') { // Sonderfall mit Selbstbezug | if ((typeof obj) === 'xml') { // Sonderfall mit Selbstbezug | ||
return (base.prototype === XML.prototype); | return (base.prototype === XML.prototype); | ||
Zeile 1.785: | Zeile 1.602: | ||
} | } | ||
// Entfernt Properties in einem Objekt | // Entfernt Properties in einem Objekt. | ||
// data: Objekt, deren Properties bearbeitet werden | // data: Objekt, deren Properties bearbeitet werden | ||
// delList: Checkliste der zu loeschenden Items (true fuer loeschen), falls angegeben | // delList: Checkliste der zu loeschenden Items (true fuer loeschen), falls angegeben | ||
Zeile 1.875: | Zeile 1.692: | ||
} | } | ||
// Replacer fuer JSON.stringify() oder safeStringify(), der Arrays kompakter darstellt | // Replacer fuer JSON.stringify() oder safeStringify(), der Arrays kompakter darstellt. | ||
// key: Der uebergebene Schluessel | // key: Der uebergebene Schluessel | ||
// value: Der uebergebene Wert | // value: Der uebergebene Wert | ||
Zeile 1.887: | Zeile 1.704: | ||
} | } | ||
// Replacer fuer JSON.stringify() oder safeStringify(), der Arrays kompakter darstellt | // Replacer fuer JSON.stringify() oder safeStringify(), der Arrays kompakter darstellt. | ||
// key: Der uebergebene Schluessel | // key: Der uebergebene Schluessel | ||
// value: Der uebergebene Wert | // value: Der uebergebene Wert | ||
Zeile 1.901: | Zeile 1.718: | ||
return value; | return value; | ||
} | } | ||
// Fuegt in die uebergebene Zahl Tausender-Trennpunkte ein | // Fuegt in die uebergebene Zahl Tausender-Trennpunkte ein | ||
// Wandelt einen etwaig vorhandenen Dezimalpunkt in ein Komma um | // Wandelt einen etwaig vorhandenen Dezimalpunkt in ein Komma um | ||
function getNumberString(numberString) { | function getNumberString(numberString) { | ||
if (numberString.lastIndexOf( | if (numberString.lastIndexOf(".") !== -1) { | ||
// Zahl enthaelt Dezimalpunkt | // Zahl enthaelt Dezimalpunkt | ||
const __VORKOMMA = numberString.substring(0, numberString.lastIndexOf( | const __VORKOMMA = numberString.substring(0, numberString.lastIndexOf(".")); | ||
const __NACHKOMMA = numberString.substring(numberString.lastIndexOf( | const __NACHKOMMA = numberString.substring(numberString.lastIndexOf(".") + 1, numberString.length); | ||
return getNumberString(__VORKOMMA) + | return getNumberString(__VORKOMMA) + "," + __NACHKOMMA; | ||
} else { | } else { | ||
// Kein Dezimalpunkt, fuege Tausender-Trennpunkte ein: | // Kein Dezimalpunkt, fuege Tausender-Trennpunkte ein: | ||
Zeile 1.949: | Zeile 1.737: | ||
for (let i = 0; i < __TEMP.length; i++) { | for (let i = 0; i < __TEMP.length; i++) { | ||
if ((i > 0) && (i % 3 === 0)) { | if ((i > 0) && (i % 3 === 0)) { | ||
result += | result += "."; | ||
} | } | ||
result += __TEMP.substr(i, 1); | result += __TEMP.substr(i, 1); | ||
Zeile 1.959: | Zeile 1.747: | ||
// Dreht den uebergebenen String um | // Dreht den uebergebenen String um | ||
function reverseString(string) { | function reverseString(string) { | ||
let result = ""; | let result = ""; | ||
Zeile 1.969: | Zeile 1.755: | ||
return result; | return result; | ||
} | } | ||
// Speichert einen beliebiegen (strukturierten) Wert unter einem Namen ab | // Speichert einen beliebiegen (strukturierten) Wert unter einem Namen ab | ||
// name: | // name: GM_setValue-Name, unter dem die Daten gespeichert werden | ||
// value: Beliebiger (strukturierter) Wert | // value: Beliebiger (strukturierter) Wert | ||
// return | // return String-Darstellung des Wertes | ||
function serialize(name, value) { | function serialize(name, value) { | ||
const __STREAM = ((value !== undefined) ? safeStringify(value) : value); | const __STREAM = ((value !== undefined) ? safeStringify(value) : value); | ||
__LOG[4](name + " >> " + __STREAM); | |||
GM_setValue(name, __STREAM); | |||
return __STREAM; | |||
} | } | ||
// Holt einen beliebiegen (strukturierter) Wert unter einem Namen zurueck | // Holt einen beliebiegen (strukturierter) Wert unter einem Namen zurueck | ||
// name: | // name: GM_setValue-Name, unter dem die Daten gespeichert werden | ||
// defValue: Default-Wert fuer den Fall, dass nichts gespeichert ist | // defValue: Default-Wert fuer den Fall, dass nichts gespeichert ist | ||
// return | // return Objekt, das unter dem Namen gespeichert war | ||
function deserialize(name, defValue = undefined) { | function deserialize(name, defValue = undefined) { | ||
const __STREAM = GM_getValue(name); | |||
__LOG[4](name + " << " + __STREAM); | |||
if ((__STREAM !== undefined) && __STREAM.length) { | |||
try { | |||
return JSON.parse(__STREAM); | |||
} catch (ex) { | |||
__LOG[1](name + ": " + ex.message); | |||
} | |||
} | } | ||
return defValue; | |||
} | } | ||
Zeile 2.041: | Zeile 1.795: | ||
// value: Zu setzender Wert | // value: Zu setzender Wert | ||
// reload: Seite mit neuem Wert neu laden | // reload: Seite mit neuem Wert neu laden | ||
// return Gespeicherter Wert fuer setOptValue() | // return Gespeicherter Wert fuer setOptValue() | ||
function setStored(name, value, reload = false, serial = false | function setStored(name, value, reload = false, serial = false) { | ||
(serial | if (serial) { | ||
serialize(name, value); | |||
} else { | |||
GM_setValue(name, value); | |||
} | |||
if (reload) { | |||
window.location.reload(); | |||
} | |||
return value; | return value; | ||
Zeile 2.059: | Zeile 1.815: | ||
// value: Vorher gesetzter Wert | // value: Vorher gesetzter Wert | ||
// reload: Seite mit neuem Wert neu laden | // reload: Seite mit neuem Wert neu laden | ||
// return Gespeicherter Wert fuer setOptValue() | // return Gespeicherter Wert fuer setOptValue() | ||
function setNextStored(arr, name, value, reload = false, serial = false | function setNextStored(arr, name, value, reload = false, serial = false) { | ||
return setStored(name, getNextValue(arr, value), reload, serial | return setStored(name, getNextValue(arr, value), reload, serial); | ||
} | } | ||
Zeile 2.092: | Zeile 1.845: | ||
value = JSON.parse(value); | value = JSON.parse(value); | ||
} catch (ex) { | } catch (ex) { | ||
__LOG[ | __LOG[1]("getStoredCmds(): " + __CMD + " '" + __KEY + "' hat illegalen Wert '" + value + "'"); | ||
// ... meist kann man den String selber aber speichern, daher kein "return"... | // ... meist kann man den String selber aber speichern, daher kein "return"... | ||
} | } | ||
Zeile 2.113: | Zeile 1.866: | ||
// Fuehrt die in einem Storage gespeicherte Operation aus | // Fuehrt die in einem Storage gespeicherte Operation aus | ||
// storedCmds: Array von Objekten mit 'cmd' / 'key' / 'val' (siehe getStoredCmds()) | // storedCmds: Array von Objekten mit 'cmd' / 'key' / 'val' (siehe getStoredCmds()) | ||
// optSet: | // optSet: Set mit den Optionen | ||
// beforeLoad: Angabe, ob nach der Speicherung noch loadOptions() aufgerufen wird | // beforeLoad: Angabe, ob nach der Speicherung noch loadOptions() aufgerufen wird | ||
// | // memory: __OPTMEM.normal = unbegrenzt gespeichert (localStorage), __OPTMEM.begrenzt = bis Browserende gespeichert (sessionStorage), __OPTMEM.inaktiv | ||
// return Array von Operationen (wie storedCmds), die fuer die naechste Phase uebrig bleiben | |||
// return | function runStoredCmds(storedCmds, optSet = undefined, beforeLoad = undefined) { | ||
const __BEFORELOAD = getValue(beforeLoad, true); | const __BEFORELOAD = getValue(beforeLoad, true); | ||
const __STOREDCMDS = getValue(storedCmds, []); | const __STOREDCMDS = getValue(storedCmds, []); | ||
Zeile 2.132: | Zeile 1.884: | ||
if (__BEFORELOAD) { | if (__BEFORELOAD) { | ||
if (__STOREDCMDS.length) { | if (__STOREDCMDS.length) { | ||
invalidateOpts(optSet); // alle Optionen invalidieren | |||
invalidated = true; | invalidated = true; | ||
} | } | ||
switch (__OPTACTION[__CMD]) { | switch (__OPTACTION[__CMD]) { | ||
case __OPTACTION.SET : __LOG[4]("SET '" + __KEY + "' " + __VAL); | case __OPTACTION.SET : __LOG[4]("SET '" + __KEY + "' " + __VAL); | ||
setStored(__KEY, __VAL, false, false | setStored(__KEY, __VAL, false, false); | ||
break; | break; | ||
case __OPTACTION.NXT : __LOG[4]("SETNEXT '" + __KEY + "' " + __VAL); | case __OPTACTION.NXT : __LOG[4]("SETNEXT '" + __KEY + "' " + __VAL); | ||
//setNextStored(__CONFIG.Choice, __KEY, __VAL, false, false | //setNextStored(__CONFIG.Choice, __KEY, __VAL, false, false); | ||
setStored(__KEY, __VAL, false, false | setStored(__KEY, __VAL, false, false); | ||
break; | break; | ||
case __OPTACTION.RST : __LOG[4]("RESET (delayed)"); | case __OPTACTION.RST : __LOG[4]("RESET (delayed)"); | ||
Zeile 2.154: | Zeile 1.906: | ||
break; | break; | ||
case __OPTACTION.RST : __LOG[4]("RESET"); | case __OPTACTION.RST : __LOG[4]("RESET"); | ||
resetOptions(optSet, false); | |||
loadOptions(optSet); // Reset auf umbenannte Optionen anwenden! | |||
break; | break; | ||
default : break; | default : break; | ||
Zeile 2.257: | Zeile 2.009: | ||
// force: Laedt auch Optionen mit 'AutoReset'-Attribut | // force: Laedt auch Optionen mit 'AutoReset'-Attribut | ||
// return Gesetzter Wert | // return Gesetzter Wert | ||
function getOptValue(opt, defValue = undefined, load = true | function getOptValue(opt, defValue = undefined, load = true, force = false) { | ||
let value; | let value; | ||
if (opt !== undefined) { | if (opt !== undefined) { | ||
if (load && ! opt.Loaded) { | if (load && ! opt.Loaded) { | ||
value = loadOption(opt, force); | |||
} else { | } else { | ||
value = opt.Value; | value = opt.Value; | ||
Zeile 2.388: | Zeile 2.135: | ||
// Restauriert den vorherigen Speicher (der in einer Option definiert ist) | // Restauriert den vorherigen Speicher (der in einer Option definiert ist) | ||
// opt: Option zur Wahl des Speichers | // opt: Option zur Wahl des Speichers | ||
// return | // return Gesuchter Speicher oder Null-Speicher ('inaktiv') | ||
function restoreMemoryByOpt(opt) { | |||
// Memory Storage fuer vorherige Speicherung... | // Memory Storage fuer vorherige Speicherung... | ||
const __STORAGE = | const __STORAGE = getOptValue(opt, __MEMNORMAL, true, true); | ||
return __OPTMEM[__STORAGE]; | return __OPTMEM[__STORAGE]; | ||
Zeile 2.399: | Zeile 2.146: | ||
// opt: Option zur Wahl des Speichers | // opt: Option zur Wahl des Speichers | ||
// saveOpt: Option zur Speicherung der Wahl des Speichers (fuer restoreMemoryByOpt) | // saveOpt: Option zur Speicherung der Wahl des Speichers (fuer restoreMemoryByOpt) | ||
// return Gesuchter Speicher oder Null-Speicher ('inaktiv'), falls speichern nicht moeglich ist | // return Gesuchter Speicher oder Null-Speicher ('inaktiv'), falls speichern nicht moeglich ist | ||
function startMemoryByOpt(opt, saveOpt | function startMemoryByOpt(opt, saveOpt = undefined) { | ||
// Memory Storage fuer naechste Speicherung... | // Memory Storage fuer naechste Speicherung... | ||
let storage = getOptValue(opt, __MEMNORMAL); | let storage = getOptValue(opt, __MEMNORMAL); | ||
Zeile 2.415: | Zeile 2.160: | ||
if (saveOpt !== undefined) { | if (saveOpt !== undefined) { | ||
setOpt(saveOpt, storage, false | setOpt(saveOpt, storage, false); | ||
} | } | ||
Zeile 2.426: | Zeile 2.171: | ||
// Initialisiert das Script-Modul und ermittelt die beschreibenden Daten | // Initialisiert das Script-Modul und ermittelt die beschreibenden Daten | ||
// meta: Metadaten des Scripts (Default: | // meta: Metadaten des Scripts (Default: GM_info.script) | ||
// return Beschreibende Daten fuer __DBMOD | // return Beschreibende Daten fuer __DBMOD | ||
function ScriptModule(meta) { | function ScriptModule(meta) { | ||
'use strict'; | 'use strict'; | ||
const __META = getValue(meta, | const __META = getValue(meta, GM_info.script); | ||
const __PROPS = { | const __PROPS = { | ||
'name' : true, | 'name' : true, | ||
Zeile 2.537: | Zeile 2.282: | ||
// funOff: Funktion zum Ausschalten | // funOff: Funktion zum Ausschalten | ||
// keyOff: Hotkey zum Ausschalten im Menu | // keyOff: Hotkey zum Ausschalten im Menu | ||
function registerMenuOption(val, menuOn, funOn, keyOn, menuOff, funOff, keyOff) { | function registerMenuOption(val, menuOn, funOn, keyOn, menuOff, funOff, keyOff) { | ||
const __ON = (val ? '*' : ""); | const __ON = (val ? '*' : ""); | ||
Zeile 2.545: | Zeile 2.289: | ||
if (val) { | if (val) { | ||
GM_registerMenuCommand(menuOff, funOff, keyOff); | |||
} else { | } else { | ||
GM_registerMenuCommand(menuOn, funOn, keyOn); | |||
} | } | ||
} | } | ||
Zeile 2.557: | Zeile 2.301: | ||
// fun: Funktion zum Setzen des naechsten Wertes | // fun: Funktion zum Setzen des naechsten Wertes | ||
// key: Hotkey zum Setzen des naechsten Wertes im Menu | // key: Hotkey zum Setzen des naechsten Wertes im Menu | ||
function registerNextMenuOption(val, arr, menu, fun, key) { | function registerNextMenuOption(val, arr, menu, fun, key) { | ||
const __MENU = | const __MENU = menu.replace('$', val); | ||
let options = "OPTION " + __MENU; | let options = "OPTION " + __MENU; | ||
Zeile 2.571: | Zeile 2.314: | ||
__LOG[3](options); | __LOG[3](options); | ||
GM_registerMenuCommand(__MENU, fun, key); | |||
} | } | ||
Zeile 2.581: | Zeile 2.324: | ||
// hidden: Angabe, ob Menupunkt nicht sichtbar sein soll (Default: sichtbar) | // hidden: Angabe, ob Menupunkt nicht sichtbar sein soll (Default: sichtbar) | ||
// serial: Serialization fuer komplexe Daten | // serial: Serialization fuer komplexe Daten | ||
function registerDataOption(val, menu, fun, key, hidden = false, serial = true) { | function registerDataOption(val, menu, fun, key, hidden = false, serial = true) { | ||
const __VALUE = ((serial && (val !== undefined)) ? safeStringify(val) : val); | const __VALUE = ((serial && (val !== undefined)) ? safeStringify(val) : val); | ||
const __MENU = | const __MENU = getValue(menu, "").replace('$', __VALUE); | ||
const __OPTIONS = (hidden ? "HIDDEN " : "") + "OPTION " + __MENU + | const __OPTIONS = (hidden ? "HIDDEN " : "") + "OPTION " + __MENU + | ||
getValue(__VALUE, "", " = " + __VALUE); | getValue(__VALUE, "", " = " + __VALUE); | ||
Zeile 2.590: | Zeile 2.332: | ||
__LOG[hidden ? 4 : 3](__OPTIONS); | __LOG[hidden ? 4 : 3](__OPTIONS); | ||
if (hidden) { | if (! hidden) { | ||
GM_registerMenuCommand(__MENU, fun, key); | |||
} | } | ||
} | } | ||
Zeile 2.599: | Zeile 2.339: | ||
// Zeigt den Eintrag im Menu einer Option | // Zeigt den Eintrag im Menu einer Option | ||
// opt: Config und Value der Option | // opt: Config und Value der Option | ||
function registerOption(opt) { | function registerOption(opt) { | ||
const __CONFIG = getOptConfig(opt); | const __CONFIG = getOptConfig(opt); | ||
Zeile 2.611: | Zeile 2.350: | ||
if (! __CONFIG.HiddenMenu) { | if (! __CONFIG.HiddenMenu) { | ||
switch (__CONFIG.Type) { | switch (__CONFIG.Type) { | ||
case __OPTTYPES.MC : | case __OPTTYPES.MC : registerNextMenuOption(__VALUE, __CONFIG.Choice, __LABEL, __ACTION, __HOTKEY); | ||
case __OPTTYPES.SW : | break; | ||
case __OPTTYPES.SW : registerMenuOption(__VALUE, __LABEL, __ACTION, __HOTKEY, | |||
case __OPTTYPES.TF : | __CONFIG.AltLabel, __ACTION, __CONFIG.AltHotkey); | ||
break; | |||
case __OPTTYPES.SD : | case __OPTTYPES.TF : registerMenuOption(__VALUE, __LABEL, __ACTION, __HOTKEY, | ||
case __OPTTYPES.SI : | __CONFIG.AltLabel, opt.AltAction, __CONFIG.AltHotkey); | ||
default : | break; | ||
case __OPTTYPES.SD : registerDataOption(__VALUE, __LABEL, __ACTION, __HOTKEY, __HIDDEN, __SERIAL); | |||
break; | |||
case __OPTTYPES.SI : registerDataOption(__VALUE, __LABEL, __ACTION, __HOTKEY, __HIDDEN, __SERIAL); | |||
break; | |||
default : break; | |||
} | } | ||
} else { | } else { | ||
// Nur Anzeige im Log... | // Nur Anzeige im Log... | ||
registerDataOption(__VALUE, __LABEL, __ACTION, __HOTKEY, __HIDDEN, __SERIAL); | |||
} | } | ||
} | } | ||
Zeile 2.674: | Zeile 2.418: | ||
switch (optAction) { | switch (optAction) { | ||
case __OPTACTION.SET : fun = function() { | case __OPTACTION.SET : fun = function() { | ||
return setOptByName(optSet, item, __CONFIG.SetValue, __RELOAD | return setOptByName(optSet, item, __CONFIG.SetValue, __RELOAD); | ||
}; | }; | ||
break; | break; | ||
case __OPTACTION.NXT : fun = function() { | case __OPTACTION.NXT : fun = function() { | ||
return promptNextOptByName(optSet, item, __CONFIG.SetValue, __RELOAD, | return promptNextOptByName(optSet, item, __CONFIG.SetValue, __RELOAD, | ||
__CONFIG.FreeValue, __CONFIG.SelValue, __CONFIG.MinChoice | __CONFIG.FreeValue, __CONFIG.SelValue, __CONFIG.MinChoice); | ||
}; | }; | ||
break; | break; | ||
case __OPTACTION.RST : fun = function() { | case __OPTACTION.RST : fun = function() { | ||
return resetOptions(optSet, __RELOAD | return resetOptions(optSet, __RELOAD); | ||
}; | }; | ||
break; | break; | ||
Zeile 2.740: | Zeile 2.482: | ||
addProps(config, getOptConfig(__REF)); | addProps(config, getOptConfig(__REF)); | ||
addProps(config, optConfig); | addProps(config, optConfig); | ||
config.setConst('SharedData', getOptValue(__REF) | config.setConst('SharedData', getOptValue(__REF)); | ||
} else { // __OBJREF enthaelt die Daten selbst | } else { // __OBJREF enthaelt die Daten selbst | ||
if (! config.Name) { | if (! config.Name) { | ||
Zeile 2.774: | Zeile 2.516: | ||
// Gab es vorher einen Aufruf, der einen Stub-Eintrag erzeugt hat, und wurden Daten geladen? | // Gab es vorher einen Aufruf, der einen Stub-Eintrag erzeugt hat, und wurden Daten geladen? | ||
const __LOADED = ((preInit === false) && optSet[opt].Loaded); | const __LOADED = ((preInit === false) && optSet[opt].Loaded); | ||
const __VALUE = (__LOADED ? optSet[opt].Value : undefined); | const __VALUE = (__LOADED ? optSet[opt].Value : undefined); | ||
Zeile 2.781: | Zeile 2.522: | ||
'Config' : __CONFIG, | 'Config' : __CONFIG, | ||
'Loaded' : (__ISSHARED || __LOADED), | 'Loaded' : (__ISSHARED || __LOADED), | ||
'Value' : initOptValue(__CONFIG, __VALUE), | 'Value' : initOptValue(__CONFIG, __VALUE), | ||
'SetValue' : __CONFIG.SetValue, | 'SetValue' : __CONFIG.SetValue, | ||
Zeile 2.793: | Zeile 2.533: | ||
'Config' : __OPTCONFIG, | 'Config' : __OPTCONFIG, | ||
'Loaded' : false, | 'Loaded' : false, | ||
'Value' : initOptValue(__OPTCONFIG), | 'Value' : initOptValue(__OPTCONFIG), | ||
'ReadOnly' : (__ISSHARED || __OPTCONFIG.ReadOnly) | 'ReadOnly' : (__ISSHARED || __OPTCONFIG.ReadOnly) | ||
Zeile 2.826: | Zeile 2.565: | ||
// optConfig: Konfiguration der Optionen | // optConfig: Konfiguration der Optionen | ||
// optSet: Platz fuer die gesetzten Optionen | // optSet: Platz fuer die gesetzten Optionen | ||
// return | // return Gefuelltes Objekt mit den gesetzten Optionen | ||
function startOptions(optConfig, optSet = undefined, classification = undefined) { | |||
optSet = initOptions(optConfig, optSet, true); // PreInit | optSet = initOptions(optConfig, optSet, true); // PreInit | ||
// Memory Storage fuer vorherige Speicherung... | // Memory Storage fuer vorherige Speicherung... | ||
myOptMemSize = getMemSize(myOptMem = | myOptMemSize = getMemSize(myOptMem = restoreMemoryByOpt(optSet.oldStorage)); | ||
// Zwischengespeicherte Befehle auslesen... | // Zwischengespeicherte Befehle auslesen... | ||
Zeile 2.837: | Zeile 2.576: | ||
// ... ermittelte Befehle ausfuehren... | // ... ermittelte Befehle ausfuehren... | ||
const __LOADEDCMDS = | const __LOADEDCMDS = runStoredCmds(__STOREDCMDS, optSet, true); // BeforeLoad | ||
// Bisher noch nicht geladenene Optionen laden... | // Bisher noch nicht geladenene Optionen laden... | ||
loadOptions(optSet); | |||
// Memory Storage fuer naechste Speicherung... | // Memory Storage fuer naechste Speicherung... | ||
Zeile 2.852: | Zeile 2.591: | ||
if (classification !== undefined) { | if (classification !== undefined) { | ||
// Umbenennungen durchfuehren... | // Umbenennungen durchfuehren... | ||
classification.renameOptions(); | |||
} | } | ||
// ... ermittelte Befehle ausfuehren... | // ... ermittelte Befehle ausfuehren... | ||
runStoredCmds(__LOADEDCMDS, optSet, false); // Rest | |||
// Als globale Daten speichern... | // Als globale Daten speichern... | ||
Zeile 2.873: | Zeile 2.612: | ||
// 'formWidth': Anzahl der Elemente pro Zeile | // 'formWidth': Anzahl der Elemente pro Zeile | ||
// 'formBreak': Elementnummer des ersten Zeilenumbruchs | // 'formBreak': Elementnummer des ersten Zeilenumbruchs | ||
function showOptions(optSet = undefined, optParams = { 'hideMenu' : false }) { | function showOptions(optSet = undefined, optParams = { 'hideMenu' : false }) { | ||
if (! optParams.hideMenu) { | if (! optParams.hideMenu) { | ||
buildMenu(optSet | buildMenu(optSet); | ||
} | } | ||
Zeile 2.882: | Zeile 2.620: | ||
buildForm(optParams.menuAnchor, optSet, optParams); | buildForm(optParams.menuAnchor, optSet, optParams); | ||
} | } | ||
} | } | ||
Zeile 2.891: | Zeile 2.627: | ||
// value: (Bei allen Typen) Zu setzender Wert | // value: (Bei allen Typen) Zu setzender Wert | ||
// reload: Seite mit neuem Wert neu laden | // reload: Seite mit neuem Wert neu laden | ||
// return Gesetzter Wert | // return Gesetzter Wert | ||
function setOpt(opt, value, reload = false | function setOpt(opt, value, reload = false) { | ||
return setOptValue(opt, setStored(getOptName(opt), value, reload, getOptConfig(opt).Serial | return setOptValue(opt, setStored(getOptName(opt), value, reload, getOptConfig(opt).Serial)); | ||
} | } | ||
Zeile 2.922: | Zeile 2.656: | ||
// value: Default fuer ggfs. zu setzenden Wert | // value: Default fuer ggfs. zu setzenden Wert | ||
// reload: Seite mit neuem Wert neu laden | // reload: Seite mit neuem Wert neu laden | ||
// return Gesetzter Wert | // return Gesetzter Wert | ||
function setNextOpt(opt, value = undefined, reload = false | function setNextOpt(opt, value = undefined, reload = false) { | ||
return setOpt(opt, getNextOpt(opt, value), reload | return setOpt(opt, getNextOpt(opt, value), reload); | ||
} | } | ||
Zeile 2.935: | Zeile 2.667: | ||
// freeValue: Angabe, ob Freitext zugelassen ist (Default: false) | // freeValue: Angabe, ob Freitext zugelassen ist (Default: false) | ||
// minChoice: Ab wievielen Auswahlmoeglichkeiten soll abgefragt werden? (Default: 3) | // minChoice: Ab wievielen Auswahlmoeglichkeiten soll abgefragt werden? (Default: 3) | ||
// return Gesetzter Wert | // return Gesetzter Wert | ||
function promptNextOpt(opt, value = undefined, reload = false, freeValue = false, selValue = true, minChoice = 3 | function promptNextOpt(opt, value = undefined, reload = false, freeValue = false, selValue = true, minChoice = 3) { | ||
const __CONFIG = getOptConfig(opt); | const __CONFIG = getOptConfig(opt); | ||
const __CHOICE = __CONFIG.Choice; | const __CHOICE = __CONFIG.Choice; | ||
if (value || (! __CHOICE) || (__CHOICE.length < minChoice)) { | if (value || (! __CHOICE) || (__CHOICE.length < minChoice)) { | ||
return setNextOpt(opt, value, reload | return setNextOpt(opt, value, reload); | ||
} | } | ||
Zeile 2.978: | Zeile 2.708: | ||
if (nextVal !== __VALUE) { | if (nextVal !== __VALUE) { | ||
if (nextVal) { | if (nextVal) { | ||
return setOpt(opt, nextVal, reload | return setOpt(opt, nextVal, reload); | ||
} | } | ||
const __LABEL = | const __LABEL = __CONFIG.Label.replace('$', __VALUE); | ||
showAlert(__LABEL, "Ung\xFCltige Eingabe: " + __ANSWER); | showAlert(__LABEL, "Ung\xFCltige Eingabe: " + __ANSWER); | ||
Zeile 2.987: | Zeile 2.717: | ||
} | } | ||
} catch (ex) { | } catch (ex) { | ||
__LOG[ | __LOG[1]("promptNextOpt: " + ex.message); | ||
} | } | ||
Zeile 2.999: | Zeile 2.729: | ||
// value: (Bei allen Typen) Zu setzender Wert | // value: (Bei allen Typen) Zu setzender Wert | ||
// reload: Seite mit neuem Wert neu laden | // reload: Seite mit neuem Wert neu laden | ||
// return Gesetzter Wert | // return Gesetzter Wert | ||
function setOptByName(optSet, item, value, reload = false | function setOptByName(optSet, item, value, reload = false) { | ||
const __OPT = getOptByName(optSet, item); | const __OPT = getOptByName(optSet, item); | ||
return setOpt(__OPT, value, reload | return setOpt(__OPT, value, reload); | ||
} | } | ||
Zeile 3.024: | Zeile 2.752: | ||
// value: Default fuer ggfs. zu setzenden Wert | // value: Default fuer ggfs. zu setzenden Wert | ||
// reload: Seite mit neuem Wert neu laden | // reload: Seite mit neuem Wert neu laden | ||
// return Gesetzter Wert | // return Gesetzter Wert | ||
function setNextOptByName(optSet, item, value = undefined, reload = false | function setNextOptByName(optSet, item, value = undefined, reload = false) { | ||
const __OPT = getOptByName(optSet, item); | const __OPT = getOptByName(optSet, item); | ||
return setNextOpt(__OPT, value, reload | return setNextOpt(__OPT, value, reload); | ||
} | } | ||
Zeile 3.040: | Zeile 2.766: | ||
// freeValue: Angabe, ob Freitext zugelassen ist (Default: false) | // freeValue: Angabe, ob Freitext zugelassen ist (Default: false) | ||
// minChoice: Ab wievielen Auswahlmoeglichkeiten soll abgefragt werden? (Default: 3) | // minChoice: Ab wievielen Auswahlmoeglichkeiten soll abgefragt werden? (Default: 3) | ||
// return Gesetzter Wert | // return Gesetzter Wert | ||
function promptNextOptByName(optSet, item, value = undefined, reload = false, freeValue = false, selValue = true, minChoice = 3 | function promptNextOptByName(optSet, item, value = undefined, reload = false, freeValue = false, selValue = true, minChoice = 3) { | ||
const __OPT = getOptByName(optSet, item); | const __OPT = getOptByName(optSet, item); | ||
return promptNextOpt(__OPT, value, reload, freeValue, selValue, minChoice | return promptNextOpt(__OPT, value, reload, freeValue, selValue, minChoice); | ||
} | } | ||
// Baut das Benutzermenu auf | // Baut das Benutzermenu auf | ||
// optSet: Gesetzte Optionen | // optSet: Gesetzte Optionen | ||
function buildMenu(optSet) { | |||
__LOG[3]("buildMenu()"); | __LOG[3]("buildMenu()"); | ||
for (let opt in optSet) { | for (let opt in optSet) { | ||
registerOption(optSet[opt]); | |||
} | } | ||
} | } | ||
Zeile 3.065: | Zeile 2.786: | ||
// opt: Zu invalidierende Option | // opt: Zu invalidierende Option | ||
// force: Invalidiert auch Optionen mit 'AutoReset'-Attribut | // force: Invalidiert auch Optionen mit 'AutoReset'-Attribut | ||
function invalidateOpt(opt, force = false) { | function invalidateOpt(opt, force = false) { | ||
if (opt.Loaded && ! opt.ReadOnly) { | |||
const __CONFIG = getOptConfig(opt); | |||
// Wert "ungeladen"... | |||
opt.Loaded = (force || ! __CONFIG.AutoReset); | |||
if (opt.Loaded && __CONFIG.AutoReset) { | |||
// Nur zuruecksetzen, gilt als geladen... | |||
setOptValue(opt, initOptValue(__CONFIG)); | |||
} | |||
} | |||
} | } | ||
// Invalidiert die (ueber Menu) gesetzten Optionen | // Invalidiert die (ueber Menu) gesetzten Optionen | ||
// optSet: | // optSet: Set mit den Optionen | ||
// force: Invalidiert auch Optionen mit 'AutoReset'-Attribut | // force: Invalidiert auch Optionen mit 'AutoReset'-Attribut | ||
// return | // return Set mit den geladenen Optionen | ||
function invalidateOpts(optSet, force = false) { | |||
for (let opt in optSet) { | for (let opt in optSet) { | ||
const __OPT = optSet[opt]; | const __OPT = optSet[opt]; | ||
invalidateOpt(__OPT, force); | |||
} | } | ||
Zeile 3.101: | Zeile 2.817: | ||
// opt: Zu ladende Option | // opt: Zu ladende Option | ||
// force: Laedt auch Optionen mit 'AutoReset'-Attribut | // force: Laedt auch Optionen mit 'AutoReset'-Attribut | ||
// return | // return Gesetzter Wert der gelandenen Option | ||
function loadOption(opt, force = false) { | function loadOption(opt, force = false) { | ||
const __CONFIG = getOptConfig(opt); | |||
const __ISSHARED = getValue(__CONFIG.Shared, false, true); | |||
const __NAME = getOptName(opt); | |||
const __DEFAULT = getOptValue(opt, undefined, false, false); | |||
let value; | |||
if (opt.Loaded && ! __ISSHARED) { | |||
__LOG[1]("Error: Oprion '" + __NAME + "' bereits geladen!"); | |||
} | |||
if (opt.ReadOnly || __ISSHARED) { | |||
value = __DEFAULT; | |||
} else if (! force && __CONFIG.AutoReset) { | |||
value = initOptValue(__CONFIG); | |||
} else { | |||
value = (__CONFIG.Serial ? | |||
deserialize(__NAME, __DEFAULT) : | |||
GM_getValue(__NAME, __DEFAULT)); | |||
} | |||
__LOG[5]("LOAD " + __NAME + ": " + __LOG.changed(__DEFAULT, value)); | |||
// Wert als geladen markieren... | |||
opt.Loaded = true; | |||
return opt | // Wert intern setzen... | ||
return setOptValue(opt, value); | |||
} | } | ||
// Laedt die (ueber Menu) gesetzten Optionen | // Laedt die (ueber Menu) gesetzten Optionen | ||
// optSet: | // optSet: Set mit den Optionen | ||
// force: Laedt auch Optionen mit 'AutoReset'-Attribut | // force: Laedt auch Optionen mit 'AutoReset'-Attribut | ||
// return | // return Set mit den geladenen Optionen | ||
function loadOptions(optSet, force = false) { | function loadOptions(optSet, force = false) { | ||
for (let opt in optSet) { | for (let opt in optSet) { | ||
const __OPT = optSet[opt]; | const __OPT = optSet[opt]; | ||
if (! __OPT.Loaded) { | if (! __OPT.Loaded) { | ||
loadOption(__OPT, force); | |||
} | } | ||
} | } | ||
return | return optSet; | ||
} | } | ||
Zeile 3.180: | Zeile 2.868: | ||
// force: Entfernt auch Optionen mit 'Permanent'-Attribut | // force: Entfernt auch Optionen mit 'Permanent'-Attribut | ||
// reset: Setzt bei Erfolg auf Initialwert der Option (auch fuer nicht 'AutoReset') | // reset: Setzt bei Erfolg auf Initialwert der Option (auch fuer nicht 'AutoReset') | ||
function deleteOption(opt, force = false, reset = true) { | function deleteOption(opt, force = false, reset = true) { | ||
const __CONFIG = getOptConfig(opt); | const __CONFIG = getOptConfig(opt); | ||
Zeile 3.189: | Zeile 2.876: | ||
__LOG[4]("DELETE " + __NAME); | __LOG[4]("DELETE " + __NAME); | ||
GM_deleteValue(__NAME); | |||
if (reset || __CONFIG.AutoReset) { | |||
setOptValue(opt, initOptValue(__CONFIG)); | |||
} | |||
} | } | ||
} | } | ||
Zeile 3.204: | Zeile 2.889: | ||
// force: Entfernt auch Optionen mit 'Permanent'-Attribut | // force: Entfernt auch Optionen mit 'Permanent'-Attribut | ||
// reset: Setzt bei Erfolg auf Initialwert der Option | // reset: Setzt bei Erfolg auf Initialwert der Option | ||
function deleteOptions(optSet, optSelect = undefined, force = false, reset = true) { | |||
const __DELETEALL = ((optSelect === undefined) || (optSelect === true)); | const __DELETEALL = ((optSelect === undefined) || (optSelect === true)); | ||
const __OPTSELECT = getValue(optSelect, { }); | const __OPTSELECT = getValue(optSelect, { }); | ||
Zeile 3.211: | Zeile 2.895: | ||
for (let opt in optSet) { | for (let opt in optSet) { | ||
if (getValue(__OPTSELECT[opt], __DELETEALL)) { | if (getValue(__OPTSELECT[opt], __DELETEALL)) { | ||
deleteOption(optSet[opt], force, reset); | |||
} | } | ||
} | } | ||
} | } | ||
Zeile 3.223: | Zeile 2.905: | ||
// reload: Wert nachladen statt beizubehalten | // reload: Wert nachladen statt beizubehalten | ||
// force: Laedt auch Optionen mit 'AutoReset'-Attribut | // force: Laedt auch Optionen mit 'AutoReset'-Attribut | ||
// return | // return Umbenannte Option | ||
function renameOption(opt, name, reload = false, force = false) { | |||
const __NAME = getOptName(opt); | const __NAME = getOptName(opt); | ||
if (__NAME !== name) { | if (__NAME !== name) { | ||
deleteOption(opt, true, ! reload); | |||
setOptName(opt, name); | setOptName(opt, name); | ||
invalidateOpt(opt, opt.Loaded); | |||
if (reload) { | if (reload) { | ||
opt.Loaded = false; | opt.Loaded = false; | ||
loadOption(opt, force); | |||
} | } | ||
} | } | ||
return | return opt; | ||
} | } | ||
Zeile 3.269: | Zeile 2.951: | ||
// - name: Neu zu setzender Name (Speicheradresse) | // - name: Neu zu setzender Name (Speicheradresse) | ||
// - param: Parameter "renameParam" von oben, z.B. Prefix oder Postfix | // - param: Parameter "renameParam" von oben, z.B. Prefix oder Postfix | ||
function renameOptions(optSet, optSelect, renameParam = undefined, renameFun = prefixName) { | |||
if (renameFun === undefined) { | if (renameFun === undefined) { | ||
__LOG[ | __LOG[1]("RENAME: Illegale Funktion!"); | ||
} | } | ||
for (let opt in optSelect) { | for (let opt in optSelect) { | ||
Zeile 3.279: | Zeile 2.960: | ||
if (__OPT === undefined) { | if (__OPT === undefined) { | ||
__LOG[ | __LOG[1]("RENAME: Option '" + opt + "' nicht gefunden!"); | ||
} else { | } else { | ||
const __NAME = getOptName(__OPT); | const __NAME = getOptName(__OPT); | ||
Zeile 3.289: | Zeile 2.970: | ||
const __FORCE = (__ISSCALAR ? true : __OPTPARAMS.force); | const __FORCE = (__ISSCALAR ? true : __OPTPARAMS.force); | ||
renameOption(__OPT, __NEWNAME, __RELOAD, __FORCE); | |||
} | } | ||
} | } | ||
Zeile 3.297: | Zeile 2.978: | ||
// optSet: Gesetzte Optionen | // optSet: Gesetzte Optionen | ||
// reload: Seite mit "Werkseinstellungen" neu laden | // reload: Seite mit "Werkseinstellungen" neu laden | ||
function resetOptions(optSet, reload = true) { | |||
// Alle (nicht 'Permanent') gesetzten Optionen entfernen... | // Alle (nicht 'Permanent') gesetzten Optionen entfernen... | ||
deleteOptions(optSet, true, false, ! reload); | |||
// ... und | if (reload) { | ||
// ... und Seite neu laden (mit "Werkseinstellungen")... | |||
window.location.reload(); | |||
} | |||
} | } | ||
Zeile 3.313: | Zeile 2.995: | ||
// type: Typ der Input-Felder (Default: unsichtbare Daten) | // type: Typ der Input-Felder (Default: unsichtbare Daten) | ||
// return Ergaenztes Form-Konstrukt | // return Ergaenztes Form-Konstrukt | ||
function addInputField(form, props, type = | function addInputField(form, props, type = "hidden") { | ||
for (let fieldName in props) { | for (let fieldName in props) { | ||
let field = form[fieldName]; | let field = form[fieldName]; | ||
if (! field) { | if (! field) { | ||
field = document.createElement( | field = document.createElement("input"); | ||
field.type = type; | field.type = type; | ||
field.name = fieldName; | field.name = fieldName; | ||
Zeile 3.333: | Zeile 3.015: | ||
// return Ergaenztes Form-Konstrukt | // return Ergaenztes Form-Konstrukt | ||
function addHiddenField(form, props) { | function addHiddenField(form, props) { | ||
return addInputField(form, props, | return addInputField(form, props, "hidden"); | ||
} | } | ||
Zeile 3.346: | Zeile 3.028: | ||
return obj.addEventListener(type, callback, capture); | return obj.addEventListener(type, callback, capture); | ||
} else if (obj.attachEvent) { | } else if (obj.attachEvent) { | ||
return obj.attachEvent( | return obj.attachEvent("on" + type, callback); | ||
} else { | } else { | ||
__LOG[ | __LOG[1]("Could not add " + type + " event:"); | ||
__LOG[2](callback); | __LOG[2](callback); | ||
Zeile 3.365: | Zeile 3.047: | ||
return obj.removeEventListener(type, callback, capture); | return obj.removeEventListener(type, callback, capture); | ||
} else if (obj.detachEvent) { | } else if (obj.detachEvent) { | ||
return obj.detachEvent( | return obj.detachEvent("on" + type, callback); | ||
} else { | } else { | ||
__LOG[ | __LOG[1]("Could not remove " + type + " event:"); | ||
__LOG[2](callback); | __LOG[2](callback); | ||
Zeile 3.415: | Zeile 3.097: | ||
// doc: Dokument (document) | // doc: Dokument (document) | ||
// return Gesuchtes Element oder undefined (falls nicht gefunden) | // return Gesuchtes Element oder undefined (falls nicht gefunden) | ||
function getTable(index, tag = | function getTable(index, tag = "table", doc = document) { | ||
const __TAGS = doc.getElementsByTagName(tag); | const __TAGS = doc.getElementsByTagName(tag); | ||
const __TABLE = (__TAGS ? __TAGS[index] : undefined); | const __TABLE = (__TAGS ? __TAGS[index] : undefined); | ||
Zeile 3.439: | Zeile 3.121: | ||
// return Gesuchte Zeilen oder undefined (falls nicht gefunden) | // return Gesuchte Zeilen oder undefined (falls nicht gefunden) | ||
function getRows(index, doc = document) { | function getRows(index, doc = document) { | ||
const __TABLE = getTable(index, | const __TABLE = getTable(index, "table", doc); | ||
const __ROWS = (__TABLE ? __TABLE.rows : undefined); | const __ROWS = (__TABLE ? __TABLE.rows : undefined); | ||
Zeile 3.482: | Zeile 3.164: | ||
const __CONFIG = getOptConfig(opt); | const __CONFIG = getOptConfig(opt); | ||
const __SERIAL = getValue(serial, getValue(__CONFIG.Serial, false)); | const __SERIAL = getValue(serial, getValue(__CONFIG.Serial, false)); | ||
const __THISVAL = ((__CONFIG.ValType === | const __THISVAL = ((__CONFIG.ValType === "String") ? "'\\x22' + this.value + '\\x22'" : "this.value"); | ||
const __TVALUE = getValue(__CONFIG.ValType, __THISVAL, "new " + __CONFIG.ValType + '(' + __THISVAL + ')'); | const __TVALUE = getValue(__CONFIG.ValType, __THISVAL, "new " + __CONFIG.ValType + '(' + __THISVAL + ')'); | ||
const __VALSTR = ((value !== undefined) ? safeStringify(value) : __SERIAL ? "JSON.stringify(" + __TVALUE + ')' : __TVALUE); | const __VALSTR = ((value !== undefined) ? safeStringify(value) : __SERIAL ? "JSON.stringify(" + __TVALUE + ')' : __TVALUE); | ||
Zeile 3.511: | Zeile 3.193: | ||
// memory: __OPTMEM.normal = unbegrenzt gespeichert (localStorage), __OPTMEM.begrenzt = bis Browserende gespeichert (sessionStorage), __OPTMEM.inaktiv | // memory: __OPTMEM.normal = unbegrenzt gespeichert (localStorage), __OPTMEM.begrenzt = bis Browserende gespeichert (sessionStorage), __OPTMEM.inaktiv | ||
// return String mit dem (reinen) Funktionsaufruf | // return String mit dem (reinen) Funktionsaufruf | ||
function getFormActionEvent(opt, isAlt = false, value = undefined, type = | function getFormActionEvent(opt, isAlt = false, value = undefined, type = "click", serial = undefined, memory = undefined) { | ||
const __ACTION = getFormAction(opt, isAlt, value, serial, memory); | const __ACTION = getFormAction(opt, isAlt, value, serial, memory); | ||
Zeile 3.517: | Zeile 3.199: | ||
} | } | ||
// Zeigt eine Option auf der Seite als Auswahlbox an | |||
// Zeigt eine Option auf der Seite als Auswahlbox an | |||
// opt: Anzuzeigende Option | // opt: Anzuzeigende Option | ||
// return String mit dem HTML-Code | // return String mit dem HTML-Code | ||
Zeile 3.568: | Zeile 3.206: | ||
const __NAME = getOptName(opt); | const __NAME = getOptName(opt); | ||
const __VALUE = getOptValue(opt); | const __VALUE = getOptValue(opt); | ||
const __ACTION = getFormActionEvent(opt, false, undefined, | const __ACTION = getFormActionEvent(opt, false, undefined, "change", undefined); | ||
const __FORMLABEL = | const __FORMLABEL = getValue(__CONFIG.FormLabel, __CONFIG.Label); | ||
const __LABEL = '<label for="' + __NAME + '">' + __FORMLABEL + '</label>'; | const __LABEL = '<label for="' + __NAME + '">' + __FORMLABEL + '</label>'; | ||
let element = '<select name="' + __NAME + '" id="' + __NAME + '"' + __ACTION + '>'; | let element = '<select name="' + __NAME + '" id="' + __NAME + '"' + __ACTION + '>'; | ||
Zeile 3.584: | Zeile 3.221: | ||
element += '\n</select>'; | element += '\n</select>'; | ||
return | return __LABEL.replace('$', element); | ||
} | } | ||
Zeile 3.594: | Zeile 3.231: | ||
const __NAME = getOptName(opt); | const __NAME = getOptName(opt); | ||
const __VALUE = getOptValue(opt, false); | const __VALUE = getOptValue(opt, false); | ||
const __ACTION = getFormActionEvent(opt, false, true, | const __ACTION = getFormActionEvent(opt, false, true, "click", false); | ||
const __ALTACTION = getFormActionEvent(opt, true, false, | const __ALTACTION = getFormActionEvent(opt, true, false, "click", false); | ||
const __ELEMENTON = '<input type="radio" name="' + __NAME + | const __ELEMENTON = '<input type="radio" name="' + __NAME + | ||
'" id="' + __NAME + 'ON" value="1"' + | '" id="' + __NAME + 'ON" value="1"' + | ||
Zeile 3.610: | Zeile 3.243: | ||
' /><label for="' + __NAME + 'OFF">' + | ' /><label for="' + __NAME + 'OFF">' + | ||
__CONFIG.AltLabel + '</label>'; | __CONFIG.AltLabel + '</label>'; | ||
return | return [ __ELEMENTON, __ELEMENTOFF ]; | ||
} | } | ||
Zeile 3.626: | Zeile 3.254: | ||
const __NAME = getOptName(opt); | const __NAME = getOptName(opt); | ||
const __VALUE = getOptValue(opt, false); | const __VALUE = getOptValue(opt, false); | ||
const __ACTION = getFormActionEvent(opt, __VALUE, ! __VALUE, | const __ACTION = getFormActionEvent(opt, __VALUE, ! __VALUE, "click", false); | ||
const | const __FORMLABEL = getValue(__CONFIG.FormLabel, __CONFIG.Label); | ||
return | return '<input type="checkbox" name="' + __NAME + | ||
'" id="' + __NAME + '" value="' + __VALUE + '"' + | |||
(__VALUE ? ' CHECKED' : "") + __ACTION + ' /><label for="' + | |||
__NAME + '">' + __FORMLABEL + '</label>'; | |||
} | } | ||
Zeile 3.644: | Zeile 3.270: | ||
const __NAME = getOptName(opt); | const __NAME = getOptName(opt); | ||
const __VALUE = getOptValue(opt); | const __VALUE = getOptValue(opt); | ||
const __ACTION = getFormActionEvent(opt, false, undefined, | const __ACTION = getFormActionEvent(opt, false, undefined, "submit", undefined); | ||
const __SUBMIT = getValue(__CONFIG.Submit, ""); | const __SUBMIT = getValue(__CONFIG.Submit, ""); | ||
//const __ONSUBMIT = (__SUBMIT.length ? ' onKeyDown="' + __SUBMIT + '"': ""); | //const __ONSUBMIT = (__SUBMIT.length ? ' onKeyDown="' + __SUBMIT + '"': ""); | ||
const __ONSUBMIT = (__SUBMIT ? ' onKeyDown="' + __SUBMIT + '"': ""); | const __ONSUBMIT = (__SUBMIT ? ' onKeyDown="' + __SUBMIT + '"': ""); | ||
const __FORMLABEL = | const __FORMLABEL = getValue(__CONFIG.FormLabel, __CONFIG.Label); | ||
const __ELEMENTLABEL = '<label for="' + __NAME + '">' + __FORMLABEL + '</label>'; | const __ELEMENTLABEL = '<label for="' + __NAME + '">' + __FORMLABEL + '</label>'; | ||
const __ELEMENTTEXT = '<textarea name="' + __NAME + '" id="' + __NAME + '" cols="' + __CONFIG.Cols + | const __ELEMENTTEXT = '<textarea name="' + __NAME + '" id="' + __NAME + '" cols="' + __CONFIG.Cols + | ||
Zeile 3.655: | Zeile 3.280: | ||
safeStringify(__VALUE, __CONFIG.Replace, __CONFIG.Space) + '</textarea>'; | safeStringify(__VALUE, __CONFIG.Replace, __CONFIG.Space) + '</textarea>'; | ||
return [ | return [ __ELEMENTLABEL, __ELEMENTTEXT ]; | ||
} | } | ||
Zeile 3.665: | Zeile 3.290: | ||
const __NAME = getOptName(opt); | const __NAME = getOptName(opt); | ||
const __VALUE = getOptValue(opt, false); | const __VALUE = getOptValue(opt, false); | ||
const __ACTION = getFormActionEvent(opt, __VALUE, ! __VALUE, | const __ACTION = getFormActionEvent(opt, __VALUE, ! __VALUE, "click", false); | ||
const __BUTTONLABEL = (__VALUE ? | const __BUTTONLABEL = (__VALUE ? __CONFIG.AltLabel : __CONFIG.Label); | ||
const __FORMLABEL = | const __FORMLABEL = getValue(__CONFIG.FormLabel, __CONFIG.Label); | ||
return '<label for="' + __NAME + '">' + __FORMLABEL + '</label> | return '<label for="' + __NAME + '">' + __FORMLABEL + | ||
'</label><input type="button" name="' + __NAME + | |||
'" id="' + __NAME + '" value="' + __BUTTONLABEL + '"' + | |||
__ACTION + '/>'; | |||
} | } | ||
Zeile 3.703: | Zeile 3.327: | ||
} | } | ||
if ( | if (element.length === 2) { | ||
element = '<div>' + | element = '<div>' + element[0] + '<br />' + element[1] + '</div>'; | ||
} | } | ||
} | } | ||
return element; | return element; | ||
} | } | ||
Zeile 3.746: | Zeile 3.349: | ||
const __FORMBREAK = getValue(optParams.formBreak, __FORMWIDTH); | const __FORMBREAK = getValue(optParams.formBreak, __FORMWIDTH); | ||
const __SHOWFORM = getOptValue(optSet.showForm, true) ? optParams.showForm : { 'showForm' : true }; | const __SHOWFORM = getOptValue(optSet.showForm, true) ? optParams.showForm : { 'showForm' : true }; | ||
let form = __FORM; | let form = __FORM; | ||
let count = 0; // Bisher angezeigte Optionen | let count = 0; // Bisher angezeigte Optionen | ||
let column = 0; // Spalte der letzten Option (1-basierend) | let column = 0; // Spalte der letzten Option (1-basierend) | ||
for (let | for (let opt in optSet) { | ||
if (checkItem(opt, __SHOWFORM, optParams.hideForm)) { | |||
const __ELEMENT = getOptionElement(optSet[opt]); | |||
const __TDOPT = ((~ __ELEMENT.indexOf('|')) ? "" : ' colspan="2"'); | |||
if (__ELEMENT) { | |||
if (++count > __FORMBREAK) { | |||
if (++column > __FORMWIDTH) { | |||
column = 1; | |||
} | } | ||
} | } | ||
if (column === 1) { | |||
form += '</tr><tr>'; | |||
} | |||
form += '\n<td' + __TDOPT + '>' + __ELEMENT.replace('|', '</td><td>') + '</td>'; | |||
} | } | ||
} | } | ||
Zeile 3.848: | Zeile 3.448: | ||
if (__PARAM !== undefined) { | if (__PARAM !== undefined) { | ||
// Klassifizierte Optionen umbenennen... | // Klassifizierte Optionen umbenennen... | ||
renameOptions(this.optSet, this.optSelect, __PARAM, this.renameFun); | |||
} | } | ||
}, | }, | ||
Zeile 3.858: | Zeile 3.456: | ||
return deleteOptions(this.optSet, __OPTSELECT, true, true); | return deleteOptions(this.optSet, __OPTSELECT, true, true); | ||
} | } | ||
}); | } ); | ||
// ==================== Ende Abschnitt fuer Klasse Classification ==================== | // ==================== Ende Abschnitt fuer Klasse Classification ==================== | ||
Zeile 3.885: | Zeile 3.483: | ||
} | } | ||
} | } | ||
}); | } ); | ||
// ==================== Ende Abschnitt fuer Klasse TeamClassification ==================== | // ==================== Ende Abschnitt fuer Klasse TeamClassification ==================== | ||
Zeile 3.910: | Zeile 3.508: | ||
'LgNr' : true | 'LgNr' : true | ||
} | } | ||
}); | } ); | ||
// ==================== Ende Abschnitt fuer Klasse Team ==================== | // ==================== Ende Abschnitt fuer Klasse Team ==================== | ||
Zeile 3.938: | Zeile 3.536: | ||
'Flags' : true | 'Flags' : true | ||
} | } | ||
}); | } ); | ||
// ==================== Ende Abschnitt fuer Klasse Verein ==================== | // ==================== Ende Abschnitt fuer Klasse Verein ==================== | ||
Zeile 3.952: | Zeile 3.550: | ||
// Optionen mit Daten, die ZAT- und Team-bezogen gemerkt werden... | // Optionen mit Daten, die ZAT- und Team-bezogen gemerkt werden... | ||
__TEAMCLASS.optSelect = { | __TEAMCLASS.optSelect = { | ||
'datenZat' : true, | |||
'oldDatenZat' : true, | |||
'fingerprints' : true, | |||
'birthdays' : true, | |||
'tClasses' : true, | |||
'progresses' : true, | |||
'zatAges' : true, | |||
'trainiert' : true, | |||
'positions' : true, | |||
'skills' : true, | |||
'foerderung' : true | |||
}; | |||
// Gibt die Teamdaten zurueck und aktualisiert sie ggfs. in der Option | // Gibt die Teamdaten zurueck und aktualisiert sie ggfs. in der Option | ||
Zeile 3.976: | Zeile 3.572: | ||
addProps(myTeam, teamParams, myTeam.__TEAMITEMS); | addProps(myTeam, teamParams, myTeam.__TEAMITEMS); | ||
__LOG[2]("Ermittelt: " + safeStringify(myTeam)); | __LOG[2]("Ermittelt: " + safeStringify(myTeam)); | ||
// ... und abspeichern | // ... und abspeichern... | ||
setOpt(optSet.team, myTeam, false); | |||
} else { | } else { | ||
const __TEAM = | const __TEAM = getOptValue(optSet.team); // Gespeicherte Parameter | ||
if ((__TEAM !== undefined) && (__TEAM.Land !== undefined)) { | if ((__TEAM !== undefined) && (__TEAM.Land !== undefined)) { | ||
Zeile 3.987: | Zeile 3.581: | ||
__LOG[2]("Gespeichert: " + safeStringify(myTeam)); | __LOG[2]("Gespeichert: " + safeStringify(myTeam)); | ||
} else { | } else { | ||
__LOG[ | __LOG[1]("Unbekannt: " + safeStringify(__TEAM)); | ||
} | } | ||
} | } | ||
Zeile 4.005: | Zeile 3.599: | ||
// 'formWidth': Anzahl der Elemente pro Zeile | // 'formWidth': Anzahl der Elemente pro Zeile | ||
// 'formBreak': Elementnummer des ersten Zeilenumbruchs | // 'formBreak': Elementnummer des ersten Zeilenumbruchs | ||
// return | // return Gefuelltes Objekt mit den gesetzten Optionen | ||
function buildOptions(optConfig, optSet = undefined, optParams = { 'hideMenu' : false }) { | function buildOptions(optConfig, optSet = undefined, optParams = { 'hideMenu' : false }) { | ||
// Klassifikation ueber Land und Liga des Teams... | // Klassifikation ueber Land und Liga des Teams... | ||
Zeile 4.011: | Zeile 3.605: | ||
__TEAMCLASS.teamParams = optParams.teamParams; // Ermittelte Parameter | __TEAMCLASS.teamParams = optParams.teamParams; // Ermittelte Parameter | ||
optSet = startOptions(optConfig, optSet, __TEAMCLASS); | |||
if (optParams.getDonation) { | |||
// Jugendfoerderung aus der Options-HTML-Seite ermitteln... | |||
const __BOXDONATION = document.getElementsByTagName('option'); | |||
const __DONATION = getSelectionFromComboBox(__BOXDONATION, 10000, 'Number'); | |||
__LOG[3]("Jugendf\xF6rderung: " + __DONATION + " Euro"); | |||
// ... und abspeichern... | |||
setOpt(optSet.foerderung, __DONATION, false); | |||
} | |||
showOptions(optSet, optParams); | |||
return optSet; | |||
} | } | ||
Zeile 4.034: | Zeile 3.630: | ||
// Erschafft die Spieler-Objekte und fuellt sie mit Werten | // Erschafft die Spieler-Objekte und fuellt sie mit Werten | ||
// | // reloadData: true = Teamuebersicht, false = Spielereinzelwerte | ||
function init(playerRows, optSet, colIdx, offsetUpper = 1, offsetLower = 0, reloadData = false) { | |||
storePlayerDataFromHTML(playerRows, optSet, colIdx, offsetUpper, offsetLower, reloadData); | |||
function init(playerRows, optSet, colIdx, offsetUpper = 1, offsetLower = 0, | |||
storePlayerDataFromHTML(playerRows, optSet, colIdx, offsetUpper, offsetLower, | |||
const __SAISON = getOptValue(optSet.saison); | const __SAISON = getOptValue(optSet.saison); | ||
const | const __CURRZAT = getOptValue(optSet.aktuellerZat); | ||
const __DONATION = getOptValue(optSet.foerderung); | const __DONATION = getOptValue(optSet.foerderung); | ||
const __BIRTHDAYS = getOptValue(optSet.birthdays, []); | const __BIRTHDAYS = getOptValue(optSet.birthdays, []); | ||
Zeile 4.057: | Zeile 3.644: | ||
const __POSITIONS = getOptValue(optSet.positions, []); | const __POSITIONS = getOptValue(optSet.positions, []); | ||
const __SKILLS = getOptValue(optSet.skills, []); | const __SKILLS = getOptValue(optSet.skills, []); | ||
const __BASEDATA = [ __BIRTHDAYS, __TCLASSES, __PROGRESSES ]; // fuer initPlayer | const __BASEDATA = [ __BIRTHDAYS, __TCLASSES, __PROGRESSES ]; // fuer initPlayer | ||
const __DATA = ( | const __DATA = (reloadData ? [ __BASEDATA, __SKILLS ] : [ __SKILLS, __BASEDATA ]); // fuer initPlayer: [0] = von HTML-Seite, [1] = aus gespeicherten Daten | ||
const __IDMAP = getPlayerIdMap(optSet); | const __IDMAP = getPlayerIdMap(optSet); | ||
const __CATIDS = __IDMAP.catIds; | const __CATIDS = __IDMAP.catIds; | ||
Zeile 4.066: | Zeile 3.652: | ||
__LOG[5](__IDMAP); | __LOG[5](__IDMAP); | ||
for (let i = offsetUpper, j = 0; i < playerRows.length - offsetLower; i++) { | for (let i = offsetUpper, j = 0; i < playerRows.length - offsetLower; i++, j++) { | ||
const __CELLS = playerRows[i].cells; | const __CELLS = playerRows[i].cells; | ||
const __LAND = getStringFromHTML(__CELLS, colIdx.Land); | |||
const __AGE = getIntFromHTML(__CELLS, colIdx.Age); | |||
const __ISGOALIE = isGoalieFromHTML(__CELLS, colIdx.Age); | |||
const __NEWPLAYER = new PlayerRecord(__LAND, __AGE, __ISGOALIE, __SAISON, __CURRZAT, __DONATION); | |||
__NEWPLAYER.initPlayer(__DATA[0], j, ! reloadData); | |||
const __IDX = selectPlayerIndex(__NEWPLAYER, j, __CATIDS); | |||
__NEWPLAYER.initPlayer(__DATA[1], __IDX, reloadData); | |||
__NEWPLAYER.prognoseSkills(); | |||
__NEWPLAYER. | if (reloadData) { | ||
__NEWPLAYER.setZusatz(__ZATAGES[__IDX], __TRAINIERT[__IDX], __POSITIONS[__IDX]); | |||
} | |||
__PLAYERS[j] = __NEWPLAYER; | |||
} | } | ||
if ( | if (reloadData) { | ||
setPlayerData(__PLAYERS, optSet); | |||
} else { | |||
calcPlayerData(__PLAYERS, optSet); | calcPlayerData(__PLAYERS, optSet); | ||
} | } | ||
Zeile 4.136: | Zeile 3.715: | ||
// Berechnet die Identifikations-IDs (Fingerprints) der Spieler neu und speichert diese | // Berechnet die Identifikations-IDs (Fingerprints) der Spieler neu und speichert diese | ||
function storePlayerIds(players, optSet) { | function storePlayerIds(players, optSet) { | ||
const __FINGERPRINTS = []; | const __FINGERPRINTS = []; | ||
Zeile 4.153: | Zeile 3.730: | ||
// Sucht fuer den Spieler den Eintrag aus catIds heraus und gibt den (geloeschten) Index zurueck | // Sucht fuer den Spieler den Eintrag aus catIds heraus und gibt den (geloeschten) Index zurueck | ||
function selectPlayerIndex(player, index, catIds) { | function selectPlayerIndex(player, index, catIds) { | ||
const __MYCAT = player.getCat(); | const __MYCAT = player.getCat(); | ||
Zeile 4.172: | Zeile 3.745: | ||
// Speichtert die abgeleiteten Werte in den Spieler-Objekten | // Speichtert die abgeleiteten Werte in den Spieler-Objekten | ||
function setPlayerData(players, optSet) { | function setPlayerData(players, optSet) { | ||
const __ZATAGES = []; | const __ZATAGES = []; | ||
const __TRAINIERT = []; | const __TRAINIERT = []; | ||
Zeile 4.185: | Zeile 3.754: | ||
if (__ZUSATZ.zatAge !== undefined) { // braucht Geburtstag fuer gueltige Werte! | if (__ZUSATZ.zatAge !== undefined) { // braucht Geburtstag fuer gueltige Werte! | ||
__ZATAGES[i] = __ZUSATZ.zatAge; | |||
} | |||
__TRAINIERT[i] = __ZUSATZ.trainiert; | |||
__POSITIONS[i] = __ZUSATZ.bestPos; | |||
} | |||
setOpt(optSet.zatAges, __ZATAGES, false); | setOpt(optSet.zatAges, __ZATAGES, false); | ||
setOpt(optSet.trainiert, __TRAINIERT, false); | setOpt(optSet.trainiert, __TRAINIERT, false); | ||
Zeile 4.208: | Zeile 3.766: | ||
// Berechnet die abgeleiteten Werte in den Spieler-Objekten neu und speichert diese | // Berechnet die abgeleiteten Werte in den Spieler-Objekten neu und speichert diese | ||
function calcPlayerData(players, optSet) { | function calcPlayerData(players, optSet) { | ||
const __ZATAGES = []; | const __ZATAGES = []; | ||
Zeile 4.219: | Zeile 3.775: | ||
if (__ZUSATZ.zatAge !== undefined) { // braucht Geburtstag fuer gueltige Werte! | if (__ZUSATZ.zatAge !== undefined) { // braucht Geburtstag fuer gueltige Werte! | ||
__ZATAGES[i] = __ZUSATZ.zatAge; | __ZATAGES[i] = __ZUSATZ.zatAge; | ||
} | } | ||
__TRAINIERT[i] = __ZUSATZ.trainiert; | __TRAINIERT[i] = __ZUSATZ.trainiert; | ||
__POSITIONS[i] = __ZUSATZ.bestPos; | __POSITIONS[i] = __ZUSATZ.bestPos; | ||
} | } | ||
Zeile 4.230: | Zeile 3.786: | ||
} | } | ||
// Ermittelt die | // Ermittelt die Werte in den Spieler-Objekten aus den Daten der Seite und speichert diese | ||
// | // reloadData: true = Teamuebersicht, false = Spielereinzelwerte | ||
function storePlayerDataFromHTML(playerRows, optSet, colIdx, offsetUpper = 1, offsetLower = 0, reloadData = false) { | |||
if (reloadData) { | |||
const __BIRTHDAYS = []; | |||
const __TCLASSES = []; | |||
const __PROGRESSES = []; | |||
function storePlayerDataFromHTML(playerRows, optSet, colIdx, offsetUpper = 1, offsetLower = 0, | |||
const | |||
for (let i = offsetUpper, j = 0; i < playerRows.length - offsetLower; i++, j++) { | |||
const __CELLS = playerRows[i].cells; | |||
__BIRTHDAYS[j] = getIntFromHTML(__CELLS, colIdx.Geb); | |||
__TCLASSES[j] = getTalentFromHTML(__CELLS, colIdx.Tal); | |||
__PROGRESSES[j] = getAufwertFromHTML(__CELLS, colIdx.Auf, getOptValue(optSet.shortAufw, true)); | |||
} | |||
setOpt(optSet.birthdays, __BIRTHDAYS, false); | |||
setOpt(optSet.tClasses, __TCLASSES, false); | |||
setOpt(optSet.progresses, __PROGRESSES, false); | |||
} else { | |||
const __SKILLS = []; | |||
for (let i = offsetUpper, j = 0; i < playerRows.length - offsetLower; i++, j++) { | |||
const __CELLS = playerRows[i].cells; | |||
__SKILLS[j] = getSkillsFromHTML(__CELLS, colIdx); | |||
} | } | ||
setOpt(optSet.skills, __SKILLS, false); | |||
setOpt(optSet | |||
} | } | ||
} | } | ||
Zeile 4.290: | Zeile 3.822: | ||
} | } | ||
for (let i = offsetUpper, newVal, oldVal = formatFun | for (let i = offsetUpper, newVal, oldVal = formatFun(rows[i].cells[colIdxSort].textContent); i < rows.length - offsetLower - 1; i++, oldVal = newVal) { | ||
newVal = formatFun | newVal = formatFun(rows[i + 1].cells[colIdxSort].textContent); | ||
if (newVal !== oldVal) { | if (newVal !== oldVal) { | ||
for (let j = offsetLeft; j < rows[i].cells.length - offsetRight; j++) { | for (let j = offsetLeft; j < rows[i].cells.length - offsetRight; j++) { | ||
Zeile 4.322: | Zeile 3.854: | ||
this.colIdx = colIdx; | this.colIdx = colIdx; | ||
this.fpId = (__BIRTHDAYS && __TCLASSES && __POSITIONS && getValue(__SHOWCOL.zeigeId, __SHOWALL) && getOptValue(optSet.zeigeId)); | this.fpId = (__BIRTHDAYS && __TCLASSES && __POSITIONS && getValue(__SHOWCOL.zeigeId, __SHOWALL) && getOptValue(optSet.zeigeId)); | ||
this.bar = (__PROJECTION && getValue(__SHOWCOL.zeigeBalken, __SHOWALL) && getOptValue(optSet.zeigeBalken)); | this.bar = (__PROJECTION && getValue(__SHOWCOL.zeigeBalken, __SHOWALL) && getOptValue(optSet.zeigeBalken)); | ||
this.barAbs = getOptValue(optSet.absBalken); | this.barAbs = getOptValue(optSet.absBalken); | ||
Zeile 4.515: | Zeile 4.037: | ||
}, // Ende addTitles() | }, // Ende addTitles() | ||
'addValues' : function(player, playerRow, color = "#FFFFFF") { | 'addValues' : function(player, playerRow, color = "#FFFFFF") { | ||
const __IDXPRI = getIdxPriSkills(player.getPos()); | const __IDXPRI = getIdxPriSkills(player.getPos()); | ||
const __COLOR = | const __COLALERT = getColor('STU'); // rot | ||
const __COLOR = ((player.zatLeft < 1) ? __COLALERT : player.isGoalie ? getColor('TOR') : color); | |||
const __POS1COLOR = getColor((player.getPosPercent() > 99.99) ? 'LEI' : player.getPos()); | const __POS1COLOR = getColor((player.getPosPercent() > 99.99) ? 'LEI' : player.getPos()); | ||
const __OSBLAU = getColor(""); | const __OSBLAU = getColor(""); | ||
Zeile 4.560: | Zeile 4.079: | ||
this.addAndFillCell(playerRow, player.getAge(), __COLOR, null, 2); | this.addAndFillCell(playerRow, player.getAge(), __COLOR, null, 2); | ||
} | } | ||
if ( | if (player.zatLeft < 6) { // Abrechnungszeitraum vor dem letztmoeglichen Ziehen... | ||
formatCell(playerRow.cells[this.colIdx.Age], true, | formatCell(playerRow.cells[this.colIdx.Age], true, __COLALERT, null); | ||
} | } | ||
if (this.fix) { | if (this.fix) { | ||
Zeile 4.611: | Zeile 4.130: | ||
} | } | ||
// | // Werte mit Ende 18 | ||
if (this.colIdx.Einz) { | if (this.substSkills) { | ||
convertArrayFromHTML(playerRow.cells, this.colIdx.Einz, player.skillsEnd, function(value, cell, unused, index) { | |||
if (~ __IDXPRI.indexOf(index)) { | |||
formatCell(cell, true, __OSBLAU, __POS1COLOR); | |||
} | |||
return value; | |||
}); | |||
} else if (this.colIdx.Einz) { | |||
convertArrayFromHTML(playerRow.cells, this.colIdx.Einz, player.skills.length, function(value, cell, unused, index) { | |||
if (~ __IDXPRI.indexOf(index)) { | if (~ __IDXPRI.indexOf(index)) { | ||
formatCell(cell, true | formatCell(cell, true); | ||
} | } | ||
return value; | return value; | ||
}); | }); | ||
} | } | ||
if (this.trE) { | if (this.trE) { | ||
Zeile 4.670: | Zeile 4.187: | ||
} | } | ||
} | } | ||
} | } // Ende addValues(player, playerRow) | ||
} ); | |||
}); | |||
// Klasse PlayerRecord ****************************************************************** | // Klasse PlayerRecord ****************************************************************** | ||
Zeile 4.723: | Zeile 4.229: | ||
// this.trainiert: Anzahl der erfolgreichen Trainingspunkte | // this.trainiert: Anzahl der erfolgreichen Trainingspunkte | ||
// indirekt this.zatAge und this.bestPos | // indirekt this.zatAge und this.bestPos | ||
// in this.getPos() definiert: | // in this.getPos() definiert: | ||
Zeile 4.768: | Zeile 4.270: | ||
return result; | return result; | ||
}, // Ende this.toString() | }, // Ende this.toString() | ||
'initPlayer' : function(data, index, | 'initPlayer' : function(data, index, skillData = false) { // skillData: true = Skilldaten, false = Basiswerte (Geb., Talent, Aufwertungen) | ||
if (data !== undefined) { | if (data !== undefined) { | ||
if ( | if (skillData) { | ||
this.setSkills(data[index]); | this.setSkills(data[index]); | ||
} else | } else { | ||
this.setGeb(data[0][index]); | this.setGeb(data[0][index]); | ||
this.talent = data[1][index]; | this.talent = data[1][index]; | ||
this.aufwert = data[2][index]; | this.aufwert = data[2][index]; | ||
} | } | ||
} | } | ||
}, // Ende this.initPlayer() | }, // Ende this.initPlayer() | ||
'setSkills' : function(skills) { | 'setSkills' : function(skills) { | ||
// Berechnet die Opti-Werte, sortiert das Positionsfeld und berechnet die Einzelskills mit Ende 18 | // Berechnet die Opti-Werte, sortiert das Positionsfeld und berechnet die Einzelskills mit Ende 18 | ||
Zeile 4.887: | Zeile 4.368: | ||
if (when === this.__TIME.end) { | if (when === this.__TIME.end) { | ||
return (18 - 12) * 72 - 1; // (max.) Trainings-ZATs bis Ende 18 | return (18 - 12) * 72 - 1; // (max.) Trainings-ZATs bis Ende 18 | ||
} else | } else { | ||
return this.zatAge; | return this.zatAge; | ||
} | } | ||
}, | }, | ||
Zeile 4.904: | Zeile 4.381: | ||
return this.zatLeft; | return this.zatLeft; | ||
}, | }, | ||
'getAge' : function(when = this.__TIME.now) { | 'getAge' : function(when = this.__TIME.now) { | ||
Zeile 4.963: | Zeile 4.431: | ||
}, | }, | ||
'getTalent' : function() { | 'getTalent' : function() { | ||
return (this.talent < 0) ? | return (this.talent < 0) ? "wenig" : (this.talent > 0) ? "hoch" : "normal"; | ||
}, | }, | ||
'getAufwert' : function() { | 'getAufwert' : function() { | ||
Zeile 5.015: | Zeile 4.483: | ||
const __SUMPRISKILLS = this.getSkillSum(when, getIdxPriSkills(pos), 2 * 4); | const __SUMPRISKILLS = this.getSkillSum(when, getIdxPriSkills(pos), 2 * 4); | ||
const __OVERFLOW = Math.max(0, __SUMPRISKILLS - this.__MAXPRISKILLS); | const __OVERFLOW = Math.max(0, __SUMPRISKILLS - this.__MAXPRISKILLS); | ||
return (4 * (__SUMPRISKILLS - __OVERFLOW) + __SUMALLSKILLS) / 27; | return (4 * (__SUMPRISKILLS - __OVERFLOW) + __SUMALLSKILLS) / 27; | ||
}, | }, | ||
Zeile 5.128: | Zeile 4.591: | ||
return ((__RET.length === 1) ? __RET[0] : undefined); | return ((__RET.length === 1) ? __RET[0] : undefined); | ||
} | } | ||
}); | } ); | ||
// | // Funktionen fuer die HTML-Seite ******************************************************* | ||
function | // Liest eine Zahl aus der Spalte einer Zeile der Tabelle aus (z.B. Alter, Geburtsdatum) | ||
// cells: Die Zellen einer Zeile | |||
// colIdxInt: Spaltenindex der gesuchten Werte | |||
// return Spalteneintrag als Zahl (-1 fuer "keine Zahl", undefined fuer "nicht gefunden") | |||
function getIntFromHTML(cells, colIdxInt) { | |||
const __CELL = getValue(cells[colIdxInt], { }); | |||
const __TEXT = __CELL.textContent; | |||
if ( | if (__TEXT !== undefined) { | ||
try { | |||
const __VALUE = parseInt(__TEXT, 10); | |||
if (! isNaN(__VALUE)) { | |||
return __VALUE; | |||
} | |||
} catch (ex) { } | |||
return -1; | |||
} | |||
return undefined; | |||
} | |||
// Liest eine Dezimalzahl aus der Spalte einer Zeile der Tabelle aus | |||
// cells: Die Zellen einer Zeile | |||
// colIdxInt: Spaltenindex der gesuchten Werte | |||
// return Spalteneintrag als Dezimalzahl (undefined fuer "keine Zahl" oder "nicht gefunden") | |||
function getFloatFromHTML(cells, colIdxFloat) { | |||
const __CELL = getValue(cells[colIdxFloat], { }); | |||
const __TEXT = __CELL.textContent; | |||
if (__TEXT !== undefined) { | |||
try { | |||
return parseFloat(__TEXT); | |||
} catch (ex) { } | |||
} | |||
return undefined; | |||
} | |||
function | // Liest einen String aus der Spalte einer Zeile der Tabelle aus | ||
// cells: Die Zellen einer Zeile | |||
// colIdxStr: Spaltenindex der gesuchten Werte | |||
// return Spalteneintrag als String ("" fuer "nicht gefunden") | |||
function getStringFromHTML(cells, colIdxStr) { | |||
const __CELL = getValue(cells[colIdxStr], { }); | |||
const __TEXT = __CELL.textContent; | |||
return getValue(__TEXT.toString(), ""); | |||
} | |||
// Ermittelt den ausgewaehlten Wert eines Selects (Combo-Box) und gibt diesen zurueck | |||
// element: "select"-Element oder dessen Name auf der HTML-Seite mit 'option'-Eintraegen der Combo-Box | |||
// defValue: Default-Wert, falls nichts selektiert ist | |||
// return Ausgewaehlter Wert | |||
function getSelection(element, defValue = undefined, valType = 'String') { | |||
const __ELEMENT = ((typeof element) === 'string' ? document.getElementsByName(element) : element); | |||
const __ENTRY = (__ELEMENT ? __ELEMENT.selectedOptions[0] : undefined); | |||
this. | return this[valType](getValue(__ENTRY, defValue, __ENTRY.textContent)); | ||
} | |||
// Ermittelt den ausgewaehlten Wert einer Combo-Box und gibt diesen zurueck | |||
// comboBox: Alle 'option'-Eintraege der Combo-Box | |||
// defValue: Default-Wert, falls nichts selektiert ist | |||
// return Ausgewaehlter Wert | |||
function getSelectionFromComboBox(comboBox, defValue = undefined, valType = 'String') { | |||
let selection; | |||
for (let i = 0; i < comboBox.length; i++) { | |||
const __ENTRY = comboBox[i]; | |||
if (__ENTRY.outerHTML.match(/selected/)) { | |||
selection = __ENTRY.textContent; | |||
} | |||
} | |||
return this[valType](getValue(selection, defValue)); | |||
} | |||
// Liest die Talentklasse ("wenig", "normal", "hoch") aus der Spalte einer Zeile der Tabelle aus | |||
// cells: Die Zellen einer Zeile | |||
// colIdxStr: Spaltenindex der gesuchten Werte | |||
// return Talent als Zahl (-1=wenig, 0=normal, +1=hoch) | |||
function getTalentFromHTML(cells, colIdxTal) { | |||
const __TEXT = getStringFromHTML(cells, colIdxTal); | |||
return parseInt((__TEXT === "wenig") ? -1 : (__TEXT === "hoch") ? +1 : 0, 10); | |||
} | |||
// Liest die Einzelskills aus der Spalte einer Zeile der Tabelle aus | |||
// cells: Die Zellen einer Zeile | |||
// colIdx: Liste von Spaltenindices der gesuchten Werte mit den Eintraegen | |||
// 'Einz' (erste Spalte) und 'Zus' (Spalte hinter dem letzten Eintrag) | |||
// return Skills als Array von Zahlen | |||
function getSkillsFromHTML(cells, colIdx) { | |||
const __RESULT = []; | |||
for (let i = colIdx.Einz; i < colIdx.Zus; i++) { | |||
__RESULT[i - colIdx.Einz] = getIntFromHTML(cells, i); | |||
} | |||
return __RESULT; | |||
} | |||
// Liest aus, ob der Spieler Torwart oder Feldspieler ist | |||
// cells: Die Zellen einer Zeile | |||
// colIdxClass: Spaltenindex einer fuer TOR eingefaerbten Zelle | |||
// return Angabe, der Spieler Torwart oder Feldspieler ist | |||
function isGoalieFromHTML(cells, colIdxClass) { | |||
return (cells[colIdxClass].className === 'TOR'); | |||
} | |||
// Liest einen String aus der Spalte einer Zeile der Tabelle aus, nachdem dieser konvertiert wurde | |||
// cells: Die Zellen einer Zeile | |||
// colIdxStr: Spaltenindex der gesuchten Werte | |||
// convertFun: Funktion, die den Wert konvertiert | |||
// return Spalteneintrag als String ("" fuer "nicht gefunden") | |||
function convertStringFromHTML(cells, colIdxStr, convertFun = sameValue) { | |||
const __CELL = getValue(cells[colIdxStr], { }); | |||
const __TEXT = convertFun(__CELL.textContent, __CELL, colIdxStr, 0); | |||
if (__TEXT !== undefined) { | |||
__CELL.innerHTML = __TEXT; | |||
} | |||
} | |||
return getValue(__TEXT.toString(), ""); | |||
} | |||
// | // Liest ein Array von String-Werten aus den Spalten ab einer Zeile der Tabelle aus, nachdem diese konvertiert wurden | ||
// cells: Die Zellen einer Zeile | |||
// colIdxArr: Erster Spaltenindex der gesuchten Werte | |||
// arrOrLength: Entweder ein Datenarray zum Fuellen oder die Anzahl der zu lesenden Werte | |||
// convertFun: Funktion, die die Werte konvertiert | |||
// return Array mit Spalteneintraegen als String ("" fuer "nicht gefunden") | |||
function convertArrayFromHTML(cells, colIdxArr, arrOrLength = 1, convertFun = sameValue) { | |||
const __ARR = ((typeof arrOrSize === 'number') ? { } : arrOrLength); | |||
const __LENGTH = getValue(__ARR.length, arrOrLength); | |||
const __RET = []; | |||
for (let index = 0, colIdx = colIdxArr; index < __LENGTH; index++, colIdx++) { | |||
const __CELL = getValue(cells[colIdx], { }); | |||
const __TEXT = convertFun(getValue(__ARR[index], __CELL.textContent), __CELL, colIdx, index); | |||
if (__TEXT !== undefined) { | |||
__CELL.innerHTML = __TEXT; | |||
} | |||
__RET.push(getValue(__TEXT, "").toString()); | |||
} | |||
return __RET; | |||
} | } | ||
// Konvertiert den Aufwertungstext einer Zelle auf der Jugend-Teamuebersicht | |||
// value: Der Inhalt dieser Zeile ("+1 SKI +1 OPT" bzw. "+2 SKI) | |||
// cell: Zelle, in der der Text stand (optional) | |||
// return Der konvertierte String ("SKI OPT" bzw. "SKI SKI") | |||
function convertAufwertung(value, cell = undefined) { | |||
if (value !== undefined) { | |||
value = value.replace(/\+2 (\w+)/, "$1 $1").replace(/\+1 /g, ""); | |||
if (cell) { | |||
if (cell.className === 'TOR') { | |||
value = convertGoalieSkill(value); | |||
} | |||
cell.align = 'left'; | |||
} | |||
} | |||
} | |||
return value; | |||
} | |||
// | // Formatiert eine Zelle um (mit einfachen Parametern) | ||
// cell: Zu formatierende Zelle | |||
// | // bold: Inhalt fett darstellen (true = ja, false = nein) | ||
// | // color: Falls angegeben, die Schriftfarbe | ||
// | // bgColor: Falls angegeben, die Hintergrundfarbe | ||
// return | // return Die formatierte Zelle | ||
function | function formatCell(cell, bold = true, color = undefined, bgColor = undefined) { | ||
if (cell) { | |||
if (bold) { | |||
cell.style.fontWeight = 'bold'; | |||
if ( | } | ||
if (color) { | |||
cell.style.color = color; | |||
} | |||
if (bgColor) { | |||
cell.style.backgroundColor = bgColor; | |||
} | |||
} | } | ||
return | return cell; | ||
} | } | ||
// | // Konvertiert die allgemeinen Skills in die eines Torwarts | ||
// | // value: Ein Text, der die Skillnamen enthaelt | ||
// return Der konvertierte String mit Aenderungen (z.B. "FAN" statt "KOB") oder unveraendert | |||
// return | function convertGoalieSkill(value) { | ||
function | if (value !== undefined) { | ||
value = value.replace(/\w+/g, getGoalieSkill); | |||
if ( | |||
} | } | ||
return | return value; | ||
} | } | ||
// | // Konvertiert einen Aufwertungstext fuer einen Skillnamen in den fuer einen Torwart | ||
// | // name: Allgemeiner Skillname (abgeleitet von den Feldspielern) | ||
// return Der konvertierte String (z.B. "FAN" statt "KOB") oder unveraendert | |||
// return | function getGoalieSkill(name) { | ||
function | const __GOALIESKILLS = { | ||
const | 'SCH' : 'ABS', | ||
'BAK' : 'STS', | |||
'KOB' : 'FAN', | |||
'ZWK' : 'STB', | |||
'DEC' : 'SPL', | |||
'GES' : 'REF' | |||
}; | |||
return getValue( | return getValue(__GOALIESKILLS[name], name); | ||
} | } | ||
// Liest | // Liest die Aufwertungen eines Spielers aus und konvertiert je nachdem, ob der Spieler Torwart oder Feldspieler ist | ||
// cells: Die Zellen einer Zeile | // cells: Die Zellen einer Zeile | ||
// | // colIdxAuf: Spaltenindex der gesuchten Aufwertungen | ||
// return | // shortForm: true = abgekuerzt, false = Originalform | ||
function | // return Konvertierte Aufwertungen (kurze oder lange Form, aber in jedem Fall fuer Torwart konvertiert) | ||
const | function getAufwertFromHTML(cells, colIdxAuf, shortForm = true) { | ||
const __ISGOALIE = isGoalieFromHTML(cells, colIdxAuf); | |||
return | return convertStringFromHTML(cells, colIdxAuf, (shortForm ? convertAufwertung : __ISGOALIE ? convertGoalieSkill : undefined)); | ||
} | } | ||
// | // Identitaetsfunktion. Konvertiert nichts, sondern liefert einfach den Wert zurueck | ||
// value: Der uebergebene Wert | |||
// | // return Derselbe Wert | ||
// return | function sameValue(value) { | ||
function | return value; | ||
return | |||
} | } | ||
// | // Liefert den ganzzeiligen Anteil einer Zahl zurueck, indem alles hinter einem Punkt abgeschnitten wird | ||
// | // value: Eine uebergebene Dezimalzahl | ||
// | // return Der ganzzeilige Anteil dieser Zahl | ||
function floorValue(value, dot = '.') { | |||
if ((value === 0) || (value && isFinite(value))) { | |||
const __VALUE = value.toString(); | |||
const __INDEXDOT = (__VALUE ? __VALUE.indexOf(dot) : -1); | |||
return Number((~ __INDEXDOT) ? __VALUE.substring(0, __INDEXDOT) : __VALUE); | |||
} else { | |||
return value; | |||
} | } | ||
} | } | ||
// | // Liefert einen rechtsbuendigen Text zurueck, der links aufgefuellt wird | ||
// | // value: Ein uebergebener Wert | ||
// | // size: Zielbreite (clipping fuer < 0: Abschneiden, falls zu lang) | ||
// return | // char: Zeichen zum Auffuellen | ||
function | // return Ein String, der mindestens |size| lang ist (oder genau, falls size < 0, also clipping) | ||
function padLeft(value, size = 4, char = ' ') { | |||
} | const __SIZE = Math.abs(size); | ||
const __CLIP = (size < 0); | |||
const __VALUE = (value ? value.toString() : ""); | |||
let i = __VALUE.length; | |||
let str = ""; | |||
while (i < __SIZE) { | |||
str += char; | |||
i += char.length; | |||
} | |||
str = ((i > __SIZE) ? str.slice(0, __SIZE - __VALUE.length - 1) : str) + __VALUE; | |||
return (__CLIP ? str.slice(size) : str); | |||
} | |||
if ( | // Liefert eine rechtsbuendigen Zahl zurueck, der links (mit Nullen) aufgefuellt wird | ||
// value: Eine uebergebene Zahl | |||
// size: Zielbreite (Default: 2) | |||
// char: Zeichen zum Auffuellen (Default: '0') | |||
// forceClip: Abschneiden erzwingen, falls zu lang? | |||
// return Eine Zahl als String, der mindestens 'size' lang ist (oder genau, falls size < 0, also clipping) | |||
function padNumber(value, size = 2, char = '0') { | |||
if ((value === 0) || (value && isFinite(value))) { | |||
return padLeft(value, size, char); | |||
} else { | |||
return value; | |||
} | } | ||
} | } | ||
// | // Hilfsfunktionen ********************************************************************** | ||
// Sortiert das Positionsfeld per BubbleSort | |||
function sortPositionArray(array) { | |||
const __TEMP = []; | |||
let transposed = true; | |||
// TOR soll immer die letzte Position im Feld sein, deshalb - 1 | |||
let length = array.length - 1; | |||
while (transposed && (length > 1)) { | |||
transposed = false; | |||
for (let i = 0; i < length - 1; i++) { | |||
// Vergleich Opti-Werte: | |||
if (array[i][1] < array[i + 1][1]) { | |||
// vertauschen | |||
__TEMP[0] = array[i][0]; | |||
__TEMP[1] = array[i][1]; | |||
array[i][0] = array[i + 1][0]; | |||
array[i][1] = array[i + 1][1]; | |||
array[i + 1][0] = __TEMP[0]; | |||
array[i + 1][1] = __TEMP[1]; | |||
transposed = true; | |||
} | |||
} | } | ||
length--; | |||
} | } | ||
} | } | ||
// | // Fuegt in die uebergebene Zahl Tausender-Trennpunkte ein | ||
// | // Wandelt einen etwaig vorhandenen Dezimalpunkt in ein Komma um | ||
function getNumberString(numberString) { | |||
if (numberString.lastIndexOf(".") !== -1) { | |||
function | // Zahl enthaelt Dezimalpunkt | ||
if ( | const __VORKOMMA = numberString.substring(0, numberString.lastIndexOf(".")); | ||
const __NACHKOMMA = numberString.substring(numberString.lastIndexOf(".") + 1, numberString.length); | |||
return getNumberString(__VORKOMMA) + "," + __NACHKOMMA; | |||
if ( | } else { | ||
// Kein Dezimalpunkt, fuege Tausender-Trennpunkte ein: | |||
// String umdrehen, nach jedem dritten Zeichen Punkt einfuegen, dann wieder umdrehen: | |||
const __TEMP = reverseString(numberString); | |||
let result = ""; | |||
for (let i = 0; i < __TEMP.length; i++) { | |||
if ((i > 0) && (i % 3 === 0)) { | |||
result += "."; | |||
} | } | ||
result += __TEMP.substr(i, 1); | |||
} | |||
return reverseString(result); | |||
} | |||
} | |||
// Dreht den uebergebenen String um | |||
function reverseString(string) { | |||
let result = ""; | |||
for (let i = string.length - 1; i >= 0; i--) { | |||
result += string.substr(i, 1); | |||
} | } | ||
return | return result; | ||
} | } | ||
// | // Schaut nach, ob der uebergebene Index zu einem trainierbaren Skill gehoert | ||
// Die Indizes gehen von 0 (SCH) bis 16 (EIN) | |||
// | function isTrainableSkill(idx) { | ||
function | const __TRAINABLESKILLS = getIdxTrainableSkills(); | ||
const __IDX = parseInt(idx, 10); | |||
let result = false; | |||
for (let idxTrainable of __TRAINABLESKILLS) { | |||
if (__IDX === idxTrainable) { | |||
result = true; | |||
break; | |||
} | |||
} | } | ||
return | return result; | ||
} | } | ||
// | // Gibt alle Skill-Namen zurueck | ||
function getAllSkillNames(isGoalie = false) { | |||
if (isGoalie) { | |||
function | return [ 'ABS', 'STS', 'FAN', 'STB', 'SPL', 'REF', 'FUQ', 'ERF', 'AGG', 'PAS', 'AUS', 'UEB', 'WID', 'SEL', 'DIS', 'ZUV', 'EIN' ]; | ||
} else { | |||
return [ 'SCH', 'BAK', 'KOB', 'ZWK', 'DEC', 'GES', 'FUQ', 'ERF', 'AGG', 'PAS', 'AUS', 'UEB', 'WID', 'SEL', 'DIS', 'ZUV', 'EIN' ]; | |||
} | |||
} | } | ||
// | // Gibt den Skill-Namen zu einem Index zurueck | ||
function getSkillName(idx, isGoalie = false) { | |||
const __ALLNAMES = getAllSkillNames(isGoalie); | |||
function | |||
const | |||
return | return __ALLNAMES[idx]; | ||
} | } | ||
// | // Gibt den Skill-Namen zu einem Index-Array zurueck | ||
function getSkillNameArray(idxArr, isGoalie = false) { | |||
return (idxArr ? idxArr.map(function(item) { | |||
function | return getSkillName(item, isGoalie); | ||
}) : idxArr); | |||
} | } | ||
// | // Gibt die Indizes aller Skills zurueck | ||
function getIdxAllSkills() { | |||
return [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ]; | |||
function | |||
return | |||
} | } | ||
// | // Gibt die Indizes der trainierbaren Skills zurueck | ||
function getIdxTrainableSkills() { | |||
return [ 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 15 ]; | |||
function | } | ||
// Gibt die Indizes der Fixskills zurueck | |||
function getIdxFixSkills() { | |||
return [ 6, 7, 12, 13, 14, 16 ]; | |||
} | } | ||
// | // Gibt die Indizes der Primaerskills zurueck | ||
function getIdxPriSkills(pos) { | |||
switch (pos) { | |||
case 'TOR' : return [ 2, 3, 4, 5 ]; | |||
case 'ABW' : return [ 2, 3, 4, 15 ]; | |||
case 'DMI' : return [ 1, 4, 9, 11 ]; | |||
case 'MIT' : return [ 1, 3, 9, 11 ]; | |||
case 'OMI' : return [ 1, 5, 9, 11 ]; | |||
case 'STU' : return [ 0, 2, 3, 5 ]; | |||
default : return []; | |||
} | } | ||
} | } | ||
// | // Gibt die Indizes der (trainierbaren) Sekundaerskills zurueck | ||
function getIdxSecSkills(pos) { | |||
switch (pos) { | |||
case 'TOR' : return [ 0, 1, 8, 9, 10, 11, 15 ]; | |||
case 'ABW' : return [ 0, 1, 5, 8, 9, 10, 11 ]; | |||
case 'DMI' : return [ 0, 2, 3, 5, 8, 10, 15 ]; | |||
case 'MIT' : return [ 0, 2, 4, 5, 8, 10, 15 ]; | |||
case 'OMI' : return [ 0, 2, 3, 4, 8, 10, 15 ]; | |||
return | case 'STU' : return [ 1, 4, 8, 9, 10, 11, 15 ]; | ||
default : return []; | |||
return | } | ||
} | |||
// Gibt die zur Position gehoerige Farbe zurueck | |||
function getColor(pos) { | |||
switch (pos) { | |||
case 'TOR' : return "#FFFF00"; | |||
case 'ABW' : return "#00FF00"; | |||
case 'DMI' : return "#3366FF"; | |||
case 'MIT' : return "#66FFFF"; | |||
case 'OMI' : return "#FF66FF"; | |||
case 'STU' : return "#FF0000"; | |||
case 'LEI' : return "#FFFFFF"; | |||
case "" : return "#111166"; // osBlau | |||
default : return ""; | |||
} | } | ||
} | } | ||
// | // ==================== Ende Abschnitt genereller Code zur Anzeige der Jugend ==================== | ||
// | // ==================== Abschnitt fuer interne IDs auf den Seiten ==================== | ||
const __GAMETYPES = { // "Blind FSS gesucht!" | |||
'unbekannt' : -1, | |||
'reserviert' : 0, | |||
'Frei' : 0, | |||
'spielfrei' : 0, | |||
'Friendly' : 1, | |||
'Liga' : 2, | |||
'LP' : 3, | |||
'OSEQ' : 4, | |||
'OSE' : 5, | |||
'OSCQ' : 6, | |||
'OSC' : 7 | |||
}; | |||
} | |||
const __LIGANRN = { | |||
'unbekannt' : 0, | |||
'1. Liga' : 1, | |||
'2. Liga A' : 2, | |||
'2. Liga B' : 3, | |||
'3. Liga A' : 4, | |||
'3. Liga B' : 5, | |||
'3. Liga C' : 6, | |||
'3. Liga D' : 7 | |||
}; | |||
const __LANDNRN = { | |||
'unbekannt' : 0, | |||
'Albanien' : 45, | |||
'Andorra' : 95, | |||
'Armenien' : 83, | |||
'Aserbaidschan' : 104, | |||
'Belgien' : 12, | |||
'Bosnien-Herzegowina' : 66, | |||
'Bulgarien' : 42, | |||
'D\xE4nemark' : 8, | |||
'Deutschland' : 6, | |||
'England' : 1, | |||
'Estland' : 57, | |||
'Far\xF6er' : 68, | |||
'Finnland' : 40, | |||
'Frankreich' : 32, | |||
'Georgien' : 49, | |||
'Griechenland' : 30, | |||
'Irland' : 5, | |||
'Island' : 29, | |||
'Israel' : 23, | |||
'Italien' : 10, | |||
'Kasachstan' : 105, | |||
'Kroatien' : 24, | |||
'Lettland' : 97, | |||
'Liechtenstein' : 92, | |||
// Gibt den | 'Litauen' : 72, | ||
'Luxemburg' : 93, | |||
'Malta' : 69, | |||
'Mazedonien' : 86, | |||
'Moldawien' : 87, | |||
'Niederlande' : 11, | |||
'Nordirland' : 4, | |||
'Norwegen' : 9, | |||
'\xD6sterreich' : 14, | |||
'Polen' : 25, | |||
'Portugal' : 17, | |||
'Rum\xE4nien' : 28, | |||
'Russland' : 19, | |||
'San Marino' : 98, | |||
'Schottland' : 2, | |||
'Schweden' : 27, | |||
'Schweiz' : 37, | |||
'Serbien und Montenegro' : 41, | |||
'Slowakei' : 70, | |||
'Slowenien' : 21, | |||
'Spanien' : 13, | |||
'Tschechien' : 18, | |||
'T\xFCrkei' : 39, | |||
'Ukraine' : 20, | |||
'Ungarn' : 26, | |||
'Wales' : 3, | |||
'Weissrussland' : 71, | |||
'Zypern' : 38 | |||
}; | |||
// ==================== Abschnitt fuer Daten des Spielplans ==================== | |||
// Gibt die ID fuer den Namen eines Wettbewerbs zurueck | |||
// gameType: Name des Wettbewerbs eines Spiels | |||
// return OS2-ID fuer den Spieltyp (1 bis 7), 0 fuer spielfrei/Frei/reserviert, -1 fuer ungueltig | |||
function getGameTypeID(gameType) { | |||
return getValue(__GAMETYPES[gameType], __GAMETYPES.unbekannt); | |||
} | } | ||
// Gibt die | // Gibt die ID des Landes mit dem uebergebenen Namen zurueck. | ||
function | // land: Name des Landes | ||
return [ | // return OS2-ID des Landes, 0 fuer ungueltig | ||
function getLandNr(land) { | |||
return getValue(__LANDNRN[land], __LANDNRN.unbekannt); | |||
} | } | ||
// Gibt die | // Gibt die ID der Liga mit dem uebergebenen Namen zurueck. | ||
function | // land: Name der Liga | ||
return [ | // return OS2-ID der Liga, 0 fuer ungueltig | ||
function getLigaNr(liga) { | |||
return getValue(__LIGANRN[liga], __LIGANRN.unbekannt); | |||
} | } | ||
// | // ==================== Abschnitt fuer sonstige Parameter ==================== | ||
// | const __TEAMSEARCHHAUPT = { // Parameter zum Team "<b>Willkommen im Managerbüro von TEAM</b><br>LIGA LAND<a href=..." | ||
'Zeile' : 0, | |||
'Spalte' : 1, | |||
'start' : " von ", | |||
'middle' : "</b><br>", | |||
'liga' : ". Liga", | |||
'land' : ' ', | |||
'end' : "<a href=" | |||
}; | |||
} | |||
// | const __TEAMSEARCHTEAM = { // Parameter zum Team "<b>TEAM - LIGA <a href=...>LAND</a></b>" | ||
'Zeile' : 0, | |||
'Spalte' : 0, | |||
'start' : "<b>", | |||
'middle' : " - ", | |||
'liga' : ". Liga", | |||
'land' : 'target="_blank">', | |||
'end' : "</a></b>" | |||
}; | |||
} | |||
// | // Ermittelt, wie das eigene Team heisst und aus welchem Land bzw. Liga es kommt (zur Unterscheidung von Erst- und Zweitteam) | ||
// cell: Tabellenzelle mit den Parametern zum Team "startTEAMmiddleLIGA...landLANDend", LIGA = "#liga[ (A|B|C|D)]" | |||
// teamSeach: Muster fuer die Suche, die Eintraege fuer 'start', 'middle', 'liga', 'land' und 'end' enthaelt | |||
// return Im Beispiel { 'Team' : "TEAM", 'Liga' : "LIGA", 'Land' : "LAND", 'LdNr' : LAND-NUMMER, 'LgNr' : LIGA-NUMMER }, | |||
// z.B. { 'Team' : "Choromonets Odessa", 'Liga' : "1. Liga", 'Land' : "Ukraine", 'LdNr' : 20, 'LgNr' : 1 } | |||
function getTeamParamsFromTable(table, teamSearch = undefined) { | |||
const __TEAMSEARCH = getValue(teamSearch, __TEAMSEARCHHAUPT); | |||
const __TEAMCELLROW = getValue(__TEAMSEARCH.Zeile, 0); | |||
const __TEAMCELLCOL = getValue(__TEAMSEARCH.Spalte, 0); | |||
const __TEAMCELLSTR = (table === undefined) ? "" : table.rows[__TEAMCELLROW].cells[__TEAMCELLCOL].innerHTML; | |||
const __SEARCHSTART = __TEAMSEARCH.start; | |||
const __SEARCHMIDDLE = __TEAMSEARCH.middle; | |||
const __SEARCHLIGA = __TEAMSEARCH.liga; | |||
const __SEARCHLAND = __TEAMSEARCH.land; | |||
const __SEARCHEND = __TEAMSEARCH.end; | |||
const __INDEXSTART = __TEAMCELLSTR.indexOf(__SEARCHSTART); | |||
const __INDEXEND = __TEAMCELLSTR.indexOf(__SEARCHEND); | |||
let teamParams = __TEAMCELLSTR.substring(__INDEXSTART + __SEARCHSTART.length, __INDEXEND); | |||
const __INDEXLIGA = teamParams.indexOf(__SEARCHLIGA); | |||
const __INDEXMIDDLE = teamParams.indexOf(__SEARCHMIDDLE); | |||
let land = ((~ __INDEXLIGA) ? teamParams.substring(__INDEXLIGA + __SEARCHLIGA.length) : undefined); | |||
const __TEAMNAME = ((~ __INDEXMIDDLE) ? teamParams.substring(0, __INDEXMIDDLE) : undefined); | |||
let liga = (((~ __INDEXLIGA) && (~ __INDEXMIDDLE)) ? teamParams.substring(__INDEXMIDDLE + __SEARCHMIDDLE.length) : undefined); | |||
if (land !== undefined) { | |||
if (land.charAt(2) === ' ') { // Land z.B. hinter "2. Liga A " statt "1. Liga " | |||
land = land.substr(2); | |||
} | |||
if (liga !== undefined) { | |||
liga = liga.substring(0, liga.length - land.length); | |||
} | |||
const __INDEXLAND = land.indexOf(__SEARCHLAND); | |||
if (~ __INDEXLAND) { | |||
land = land.substr(__INDEXLAND + __SEARCHLAND.length); | |||
} | |||
} | |||
} | |||
const | const __TEAM = new Team(__TEAMNAME, land, liga); | ||
return __TEAM; | |||
} | |||
// Verarbeitet die URL der Seite und ermittelt die Nummer der gewuenschten Unterseite | |||
// url: Adresse der Seite | |||
// leafs: Liste von Filenamen mit der Default-Seitennummer (falls Query-Parameter nicht gefunden) | |||
// item: Query-Parameter, der die Nummer der Unterseite angibt | |||
// return Parameter aus der URL der Seite als Nummer | |||
function getPageIdFromURL(url, leafs, item = "page") { | |||
const __URI = new URI(url); | |||
const __LEAF = __URI.getLeaf(); | |||
for (let leaf in leafs) { | |||
if (__LEAF === leaf) { | |||
const __DEFAULT = leafs[leaf]; | |||
return getValue(__URI.getQueryPar(item), __DEFAULT); | |||
} | |||
} | |||
return -1; | |||
} | |||
// Gibt die laufende Nummer des ZATs im Text einer Zelle zurueck | |||
// cell: Tabellenzelle mit der ZAT-Nummer im Text | |||
// return ZAT-Nummer im Text | |||
function getZATNrFromCell(cell) { | |||
const __TEXT = ((cell === undefined) ? [] : cell.textContent.split(' ')); | |||
let ZATNr = 0; | |||
for (let i = 1; (ZATNr === 0) && (i < __TEXT.length); i++) { | |||
if (__TEXT[i - 1] === "ZAT") { | |||
if (__TEXT[i] !== "ist") { | |||
ZATNr = parseInt(__TEXT[i], 10); | |||
} | |||
} | |||
} | |||
} | |||
return ZATNr; | |||
return | |||
} | } | ||
// | // ==================== Ende Abschnitt fuer sonstige Parameter ==================== | ||
// | // ==================== Hauptprogramm ==================== | ||
// | // Verarbeitet Ansicht "Haupt" (Managerbuero) zur Ermittlung des aktuellen ZATs | ||
function procHaupt() { | |||
const __TEAMPARAMS = getTeamParamsFromTable(getTable(1), __TEAMSEARCHHAUPT); // Link mit Team, Liga, Land... | |||
function | |||
buildOptions(__OPTCONFIG, __OPTSET, { | |||
'teamParams' : __TEAMPARAMS, | |||
'hideMenu' : true | |||
}); | |||
// | const __ZATCELL = getProp(getProp(getRows(0), 2), 'cells', { })[0]; | ||
const __NEXTZAT = getZATNrFromCell(__ZATCELL); // "Der naechste ZAT ist ZAT xx und ..." | |||
const __CURRZAT = __NEXTZAT - 1; | |||
const __DATAZAT = getOptValue(__OPTSET.datenZat); | |||
// | // Stand der alten Daten merken... | ||
setOpt(__OPTSET.oldDatenZat, __DATAZAT, false); | |||
if (__CURRZAT >= 0) { | |||
__LOG[2]("Aktueller ZAT: " + __CURRZAT); | |||
// Neuen aktuellen ZAT speichern... | |||
setOpt(__OPTSET.aktuellerZat, __CURRZAT, false); | |||
if (__CURRZAT !== __DATAZAT) { | |||
__LOG[2](__LOG.changed(__DATAZAT, __CURRZAT)); | |||
// ... und ZAT-bezogene Daten als veraltet markieren (ausser 'skills' und 'positions') | |||
__TEAMCLASS.deleteOptions({ | |||
'skills' : true, | |||
'positions' : true, | |||
'datenZat' : true, | |||
'oldDatenZat' : true | |||
}); | |||
// | // Neuen Daten-ZAT speichern... | ||
setOpt(__OPTSET.datenZat, __CURRZAT, false); | |||
} | } | ||
} | } | ||
} | } | ||
// | // Verarbeitet Ansicht "Optionen" zur Ermittlung der Jugendfoerderung | ||
function procOptionen() { | |||
buildOptions(__OPTCONFIG, __OPTSET, { | |||
'menuAnchor' : getTable(0, "div"), | |||
'hideMenu' : true, | |||
'getDonation' : true, | |||
'showForm' : { | |||
'foerderung' : true, | |||
'showForm' : true | |||
} | |||
}); | |||
} | } | ||
// | // Verarbeitet Ansicht "Teamuebersicht" | ||
function procTeamuebersicht() { | |||
const __ROWOFFSETUPPER = 1; // Header-Zeile | |||
const __ROWOFFSETLOWER = 1; // Ziehen-Button | |||
// | |||
const | |||
const __COLUMNINDEX = { | |||
} | 'Age' : 0, | ||
'Geb' : 1, | |||
'Flg' : 2, | |||
'Land' : 3, | |||
'U' : 4, | |||
'Skill' : 5, | |||
'Tal' : 6, | |||
'Akt' : 7, | |||
'Auf' : 8, | |||
'Zus' : 9 | |||
}; | |||
if (getElement('transfer') !== undefined) { | |||
__LOG[2]("Ziehen-Seite"); | |||
} else if (getRows(1) === undefined) { | |||
__LOG[2]("Diese Seite ist ohne Team nicht verf\xFCgbar!"); | |||
} else { | |||
buildOptions(__OPTCONFIG, __OPTSET, { | |||
'menuAnchor' : getTable(0, "div"), | |||
'showForm' : { | |||
'kennzeichenEnde' : true, | |||
'shortAufw' : true, | |||
'sepStyle' : true, | |||
'sepColor' : true, | |||
'sepWidth' : true, | |||
'saison' : true, | |||
'aktuellerZat' : true, | |||
'foerderung' : true, | |||
'team' : true, | |||
'zeigeBalken' : true, | |||
'absBalken' : true, | |||
'zeigeId' : true, | |||
'ersetzeAlter' : true, | |||
'zeigeAlter' : true, | |||
'zeigeQuote' : true, | |||
'zeigePosition' : true, | |||
'zeigeZatDone' : true, | |||
'zeigeZatLeft' : true, | |||
'zeigeFixSkills' : true, | |||
'zeigeTrainiert' : true, | |||
'zeigeAnteilPri' : true, | |||
'zeigeAnteilSec' : true, | |||
'zeigePrios' : true, | |||
'zeigeSkill' : true, | |||
'anzahlOpti' : true, | |||
'anzahlMW' : true, | |||
'zeigeTrainiertEnde' : true, | |||
'zeigeAnteilPriEnde' : true, | |||
'zeigeAnteilSecEnde' : true, | |||
'zeigePriosEnde' : true, | |||
'zeigeSkillEnde' : true, | |||
'anzahlOptiEnde' : true, | |||
'anzahlMWEnde' : true, | |||
'zatAges' : true, | |||
'trainiert' : true, | |||
'positions' : true, | |||
'skills' : true, | |||
'reset' : true, | |||
'showForm' : true | |||
}, | |||
'formWidth' : 1 | |||
}); | |||
const __ROWS = getRows(1); | |||
const | const __HEADERS = __ROWS[0]; | ||
const __TITLECOLOR = getColor('LEI'); // "#FFFFFF" | |||
const __PLAYERS = init(__ROWS, __OPTSET, __COLUMNINDEX, __ROWOFFSETUPPER, __ROWOFFSETLOWER, true); | |||
const __COLMAN = new ColumnManager(__OPTSET, __COLUMNINDEX, { | |||
'Default' : true, | |||
'ersetzeSkills' : false, | |||
'zeigeGeb' : false, | |||
'zeigeSkill' : false, | |||
'zeigeTal' : false, | |||
'zeigeAufw' : false | |||
}); | |||
__COLMAN.addTitles(__HEADERS, __TITLECOLOR); | |||
for (let i = 0; i < __PLAYERS.length; i++) { | |||
__COLMAN.addValues(__PLAYERS[i], __ROWS[i + __ROWOFFSETUPPER], __TITLECOLOR); | |||
} | |||
// Format der Trennlinie zwischen den Monaten... | |||
const __BORDERSTRING = getOptValue(__OPTSET.sepStyle) + ' ' + getOptValue(__OPTSET.sepColor) + ' ' + getOptValue(__OPTSET.sepWidth); | |||
separateGroups(__ROWS, __BORDERSTRING, __COLUMNINDEX.Age, __ROWOFFSETUPPER, __ROWOFFSETLOWER, -1, 0, floorValue); | |||
} | |||
} | } | ||
// == | // Verarbeitet Ansicht "Spielereinzelwerte" | ||
function procSpielereinzelwerte() { | |||
const __ROWOFFSETUPPER = 1; // Header-Zeile | |||
const __ROWOFFSETLOWER = 0; | |||
// | const __COLUMNINDEX = { | ||
'Flg' : 0, | |||
'Land' : 1, | |||
'U' : 2, | |||
'Age' : 3, | |||
'Einz' : 4, // ab hier die Einzelskills | |||
'SCH' : 4, | |||
'ABS' : 4, // TOR | |||
'BAK' : 5, | |||
'STS' : 5, // TOR | |||
'KOB' : 6, | |||
'FAN' : 6, // TOR | |||
'ZWK' : 7, | |||
'STB' : 7, // TOR | |||
'DEC' : 8, | |||
'SPL' : 8, // TOR | |||
'GES' : 9, | |||
'REF' : 9, // TOR | |||
'FUQ' : 10, | |||
'ERF' : 11, | |||
'AGG' : 12, | |||
'PAS' : 13, | |||
'AUS' : 14, | |||
'UEB' : 15, | |||
'WID' : 16, | |||
'SEL' : 17, | |||
'DIS' : 18, | |||
'ZUV' : 19, | |||
'EIN' : 20, | |||
'Zus' : 21 // Zusaetze hinter den Einzelskills | |||
}; | |||
if (getRows(1) === undefined) { | |||
__LOG[2]("Diese Seite ist ohne Team nicht verf\xFCgbar!"); | __LOG[2]("Diese Seite ist ohne Team nicht verf\xFCgbar!"); | ||
} else { | } else { | ||
buildOptions(__OPTCONFIG, __OPTSET, { | |||
'menuAnchor' : getTable(0, "div"), | |||
'hideForm' : { | |||
'zatAges' : true, | |||
'trainiert' : true, | |||
'positions' : true, | |||
'skills' : true, | |||
'shortAufw' : true | |||
}, | |||
'formWidth' : 1 | |||
}); | |||
const __ROWS = getRows(1); | |||
const __HEADERS = __ROWS[0]; | |||
const __TITLECOLOR = getColor('LEI'); // "#FFFFFF" | |||
const __PLAYERS = init(__ROWS, __OPTSET, __COLUMNINDEX, __ROWOFFSETUPPER, __ROWOFFSETLOWER, false); | |||
const __COLMAN = new ColumnManager(__OPTSET, __COLUMNINDEX, true); | |||
__COLMAN.addTitles(__HEADERS, __TITLECOLOR); | |||
for (let i = 0; i < __PLAYERS.length; i++) { | |||
__COLMAN.addValues(__PLAYERS[i], __ROWS[i + __ROWOFFSETUPPER], __TITLECOLOR); | |||
} | |||
// Format der Trennlinie zwischen den Monaten... | |||
const __BORDERSTRING = getOptValue(__OPTSET.sepStyle) + ' ' + getOptValue(__OPTSET.sepColor) + ' ' + getOptValue(__OPTSET.sepWidth); | |||
separateGroups(__ROWS, __BORDERSTRING, __COLUMNINDEX.Age, __ROWOFFSETUPPER, __ROWOFFSETLOWER, -1, 0, floorValue); | |||
} | } | ||
} | } | ||
try { | |||
// URL-Legende: | |||
// page=0: Managerbuero | |||
// page=1: Teamuebersicht | |||
// page=2: Spielereinzelwerte | |||
// page=3: Optionen | |||
// Verzweige in unterschiedliche Verarbeitungen je nach Wert von page: | |||
switch (getPageIdFromURL(window.location.href, { | |||
'haupt.php' : 0, // Ansicht "Haupt" (Managerbuero) | |||
'ju.php' : 1 // Ansicht "Jugendteam" | |||
}, 'page')) { | |||
case 0 : procHaupt(); break; | |||
case 1 : procTeamuebersicht(); break; | |||
case 2 : procSpielereinzelwerte(); break; | |||
case 3 : procOptionen(); break; | |||
default : break; | |||
} | } | ||
} catch (ex) { | |||
showAlert('[' + ex.lineNumber + "] " + __DBMOD.Name, ex.message, ex); | |||
} finally { | |||
__LOG[2]("SCRIPT END"); | |||
} | } | ||
// *** EOF *** | // *** EOF *** | ||
</pre> | </pre> |