Bearbeiten von „OS2.jugend

Zur Navigation springen Zur Suche springen
Warnung: Du bist nicht angemeldet. Deine IP-Adresse wird bei Bearbeitungen öffentlich sichtbar. Melde dich an oder erstelle ein Benutzerkonto, damit Bearbeitungen deinem Benutzernamen zugeordnet werden. Ein eigenes Benutzerkonto hat eine ganze Reihe von Vorteilen.

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 8: Zeile 8:
|- bgcolor="#FFCC00"
|- bgcolor="#FFCC00"
| '''Version'''
| '''Version'''
| '''0.73 (WebExtensions)'''
| '''0.54 (WebExtensions)'''
|- bgcolor="#FFCC00"
|- bgcolor="#FFCC00"
| '''Autor'''
| '''Autor'''
Zeile 27: Zeile 27:
| '''ju.php?page=2'''
| '''ju.php?page=2'''
| '''Jugendteam-Spielereinzelwerte'''
| '''Jugendteam-Spielereinzelwerte'''
|-
| '''ju.php?page=3'''
| '''Jugendteam-Opt. Skill'''
|-
| '''ju.php?page=4'''
| '''Jugendteam-Optionen'''
|}
|}
|- 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 letzter Periode und mehr am letzten ZAT'''<br> '''Reguläre Ausdrücke im @include'''<br> '''Neues Design und Seite "Opt. Skill"'''<br> '''Gruppierung nach Jahrgängen U13 bis U18 (per Option)'''<br> '''Warnung vor Ende 18 auch im Managerbüro (per Option)'''<br> '''Warnung vor Sperre des Ziehens im Falle eines Aufstiegs'''<br> '''Neuer Jahrgang U19'''
| '''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 42:
// @name        OS2.jugend
// @name        OS2.jugend
// @namespace    http://os.ongapo.com/
// @namespace    http://os.ongapo.com/
// @version      0.73
// @version      0.54+WE+
// @copyright    2013+
// @copyright    2013+
// @author      Sven Loges (SLC) / Andreas Eckes (Strindheim BK)
// @author      Sven Loges (SLC) / Andreas Eckes (Strindheim BK)
Zeile 124: Zeile 118:
                   'AltHotkey' : 'k',
                   'AltHotkey' : 'k',
                   'FormLabel' : "Prognose Einzelwerte"
                   'FormLabel' : "Prognose Einzelwerte"
              },
    'zeigeJahrgang' : {  // Auswahl, ob ueber jedem Jahrgang die Ueberschriften gezeigt werden sollen oder alles in einem Block (true = Jahrgaenge, false = ein Block)
                  'Name'      : "showGroupTitle",
                  'Type'      : __OPTTYPES.SW,
                  'Default'  : true,
                  'Action'    : __OPTACTION.NXT,
                  'Label'    : "Jahrgangs\xFCberschriften",
                  'Hotkey'    : 'J',
                  'AltLabel'  : "Nur Trennlinie benutzen",
                  'AltHotkey' : 'j',
                  'FormLabel' : "Jahrg\xE4nge gruppieren"
              },
    'zeigeUxx' : {        // Auswahl, ob in der Ueberschrift ueber jedem Jahrgang zusaetzlich zur Saison noch der Jahrgang in der Form 'Uxx' angegeben wird
                  'Name'      : "showUxx",
                  'Type'      : __OPTTYPES.SW,
                  'Default'  : true,
                  'Action'    : __OPTACTION.NXT,
                  'Label'    : "Jahrg\xE4nge anzeigen",
                  'Hotkey'    : 'U',
                  'AltLabel'  : "Nur Saisons anzeigen",
                  'AltHotkey' : 'u',
                  'FormLabel' : "Jahrg\xE4nge U13 bis U19"
              },
    'zeigeWarnung' : {    // Auswahl, ob eine Warnung erscheint, wenn Talente gezogen werden sollten
                  'Name'      : "showWarning",
                  'Type'      : __OPTTYPES.SW,
                  'Default'  : true,
                  'Action'    : __OPTACTION.NXT,
                  'Label'    : "Ziehwarnung ein",
                  'Hotkey'    : 'Z',
                  'AltLabel'  : "Ziehwarnung aus",
                  'AltHotkey' : 'Z',
                  'FormLabel' : "Ziehwarnung"
              },
    'zeigeWarnungMonat' : {  // Auswahl, ob eine Warnung erscheint, wenn zum naechsten Abrechnungs-ZAT Talente gezogen werden sollten
                  'Name'      : "showWarningMonth",
                  'Type'      : __OPTTYPES.SW,
                  'Default'  : true,
                  'Action'    : __OPTACTION.NXT,
                  'Label'    : "Ziehwarnung Monat ein",
                  'Hotkey'    : 'Z',
                  'AltLabel'  : "Ziehwarnung Monat aus",
                  'AltHotkey' : 'Z',
                  'FormLabel' : "Ziehwarnung Monat"
              },
    'zeigeWarnungHome' : {  // Auswahl, ob eine Meldung im Managerbuero erscheint, wenn Talente gezogen werden sollten
                  'Name'      : "showWarningHome",
                  'Type'      : __OPTTYPES.SW,
                  'Default'  : true,
                  'Action'    : __OPTACTION.NXT,
                  'Label'    : "Ziehwarnung B\xFCro ein",
                  'Hotkey'    : 'z',
                  'AltLabel'  : "Ziehwarnung B\xFCro aus",
                  'AltHotkey' : 'z',
                  'FormLabel' : "Ziehwarnung B\xFCro"
              },
    'zeigeWarnungDialog' : {  // Auswahl, ob die Meldung im Managerbuero als Dialog erscheinen soll
                  'Name'      : "showWarningDialog",
                  'Type'      : __OPTTYPES.SW,
                  'Default'  : false,
                  'Action'    : __OPTACTION.NXT,
                  'Label'    : "Ziehwarnung B\xFCro als Dialog",
                  'Hotkey'    : 'z',
                  'AltLabel'  : "Ziehwarnung B\xFCro als Textmeldung",
                  'AltHotkey' : 'z',
                  'FormLabel' : "Ziehwarnung B\xFCro Dialog"
              },
    'zeigeWarnungAufstieg' : {  // Auswahl, ob eine Warnung in der Uebersicht erscheint, wenn Talente nach Aufstieg nicht mehr gezogen werden koennen
                  'Name'      : "showWarningAufstieg",
                  'Type'      : __OPTTYPES.SW,
                  'Default'  : true,
                  'Action'    : __OPTACTION.NXT,
                  'Label'    : "Ziehwarnung Aufstieg ein",
                  'Hotkey'    : 'ä',
                  'AltLabel'  : "Ziehwarnung Aufstieg aus",
                  'AltHotkey' : 'ä',
                  'FormLabel' : "Ziehwarnung Aufstieg"
              },
    'zeigeWarnungLegende' : {  // Auswahl, ob eine extra Meldung in Teamuebersicht erscheint, die dort als Legende dient
                  'Name'      : "showWarningLegende",
                  'Type'      : __OPTTYPES.SW,
                  'Default'  : true,
                  'Action'    : __OPTACTION.NXT,
                  'Label'    : "Ziehwarnung Legende ein",
                  'Hotkey'    : 'L',
                  'AltLabel'  : "Ziehwarnung Legende aus",
                  'AltHotkey' : 'L',
                  'FormLabel' : "Ziehwarnung Legende"
               },
               },
     '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 130:
                   'FormLabel' : "Balken Qualit\xE4t"
                   'FormLabel' : "Balken Qualit\xE4t"
               },
               },
     'absBalken' : {       // Spaltenauswahl fuer den Guetebalken des Talents absolut statt nach Foerderung (true = absolut, false = relativ nach Foerderung)
     '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 585: Zeile 491:
                   '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, 20, 21, 22, 23, 24, 25 ],
                   'Choice'    : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 ],
                   'Default'  : 16,
                   'Default'  : 12,
                   'Action'    : __OPTACTION.NXT,
                   'Action'    : __OPTACTION.NXT,
                   'Label'    : "Saison: $",
                   'Label'    : "Saison: $",
Zeile 732: Zeile 638:
                   'Label'    : "Aufwertungen:"
                   'Label'    : "Aufwertungen:"
               },
               },
     'ziehAnz' : {        // Datenspeicher fuer Anzahl zu ziehender Jugendspieler bis zur naechsten Abrechnung
     'zatAges' : {        // Datenspeicher fuer (gebrochene) Alter der Jugendspieler
                   'Name'      : "drawCounts",
                   'Name'      : "zatAges",
                   'Type'      : __OPTTYPES.SD,
                   'Type'      : __OPTTYPES.SD,
                   'Hidden'    : true,
                   'Hidden'    : true,
                   'Serial'    : true,
                   'Serial'    : true,
                   'AutoReset' : false,
                   'AutoReset' : true,
                   'Permanent' : true,
                   'Permanent' : true,
                   'Default'  : [],
                   'Default'  : [],
                   'Submit'    : undefined,
                   'Submit'    : undefined,
                   'Cols'      : 25,
                   'Cols'      : 36,
                   'Rows'      : 1,
                   'Rows'      : 2,
                   'Replace'  : null,
                   'Replace'  : null,
                   'Space'    : 0,
                   'Space'    : 0,
                   'Label'    : "Zu ziehen:"
                   'Label'    : "ZAT-Alter:"
               },
               },
    'ziehAnzAufstieg' : { // Datenspeicher fuer Anzahl zu ziehender Jugendspieler bis zur naechsten Abrechnung im Falle eines Aufstiegs
     'trainiert' : {      // Datenspeicher fuer Trainingsquoten der Jugendspieler
                  'Name'      : "drawCountsAufstieg",
                   'Name'      : "numProgresses",
                  'Type'      : __OPTTYPES.MC,
                  'ValType'  : 'Number',
                  'Hidden'    : true,
                  'AutoReset' : false,
                  'Permanent' : true,
                  'FreeValue' : true,
                  'SelValue'  : false,
                  'Choice'    : [ 0, 1, 2, 3, 4, 5 ],
                  'Default'  : 0,
                  'Action'    : __OPTACTION.NXT,
                  'Label'    : "Zu ziehen bei Aufstieg: $",
                  'Hotkey'    : 'z',
                  'FormLabel' : "Zu ziehen bei Aufstieg:|$"
              },
    'zatAges' : {        // Datenspeicher fuer (gebrochene) Alter der Jugendspieler
                  'Name'      : "zatAges",
                  'Type'      : __OPTTYPES.SD,
                  'Hidden'    : true,
                  'Serial'    : true,
                  'AutoReset' : true,
                  'Permanent' : true,
                  'Default'  : [],
                  'Submit'    : undefined,
                  'Cols'      : 36,
                  'Rows'      : 2,
                  'Replace'  : null,
                  'Space'    : 0,
                  'Label'    : "ZAT-Alter:"
              },
     'trainiert' : {      // Datenspeicher fuer Trainingsquoten der Jugendspieler
                   'Name'      : "numProgresses",
                   'Type'      : __OPTTYPES.SD,
                   'Type'      : __OPTTYPES.SD,
                   'Hidden'    : true,
                   'Hidden'    : true,
Zeile 915: Zeile 790:
                                     console.log,    // [5] Log: Verbose
                                     console.log,    // [5] Log: Verbose
                                     console.log,    // [6] Log: Very verbose
                                     console.log,    // [6] Log: Very verbose
                                     console.warn    // [7] Log: Testing
                                     console.log    // [7] Log: Testing
                                 ],
                                 ],
                   'init'      : function(win, logLevel = 1) {
                   'init'      : function(win, logLevel = 1) {
Zeile 3.952: Zeile 3.827:
// 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,
                             'datenZat'     : true,
                             'oldDatenZat'     : true,
                             'oldDatenZat' : true,
                             'fingerprints'   : true,
                             'fingerprints' : true,
                             'birthdays'       : true,
                             'birthdays'   : true,
                             'tClasses'       : true,
                             'tClasses'     : true,
                             'progresses'     : true,
                             'progresses'   : true,
                            'ziehAnz'        : true,
                             'zatAges'     : true,
                            'ziehAnzAufstieg' : true,
                             'trainiert'   : true,
                             'zatAges'         : true,
                             'positions'   : true,
                             'trainiert'       : true,
                             'skills'       : true,
                             'positions'       : true,
                             'foerderung'   : true
                             'skills'         : true,
                             'foerderung'     : true
                         };
                         };


Zeile 4.034: Zeile 3.907:


// Erschafft die Spieler-Objekte und fuellt sie mit Werten
// Erschafft die Spieler-Objekte und fuellt sie mit Werten
// playerRows: Array von Zeilen mit Array cells (Spielertabelle)
// reloadData: true = Teamuebersicht, false = Spielereinzelwerte
// optSet: Gesetzte Optionen (und Config)
function init(playerRows, optSet, colIdx, offsetUpper = 1, offsetLower = 0, reloadData = false) {
// colIdx: Liste von Spaltenindices der gesuchten Werte
     storePlayerDataFromHTML(playerRows, optSet, colIdx, offsetUpper, offsetLower, reloadData);
// offsetUpper: Ignorierte Zeilen oberhalb der Daten
// offsetLower: Ignorierte Zeilen unterhalb der Daten
// page: 1: Teamuebersicht, 2: Spielereinzelwerte, 3: Opt. Skill, 4: Optionen, Default: 0
function init(playerRows, optSet, colIdx, offsetUpper = 1, offsetLower = 0, page = 0) {
     storePlayerDataFromHTML(playerRows, optSet, colIdx, offsetUpper, offsetLower, page);


     const __SAISON = getOptValue(optSet.saison);
     const __SAISON = getOptValue(optSet.saison);
Zeile 4.047: Zeile 3.915:
     const __GEALTERT = ((__AKTZAT >= 72) ? (getIntFromHTML(playerRows[playerRows.length - offsetLower - 1].cells, colIdx.Age) < 13) : false);
     const __GEALTERT = ((__AKTZAT >= 72) ? (getIntFromHTML(playerRows[playerRows.length - offsetLower - 1].cells, colIdx.Age) < 13) : false);
     const __CURRZAT = (__GEALTERT ? 0 : __AKTZAT);
     const __CURRZAT = (__GEALTERT ? 0 : __AKTZAT);
    const __LGNR = __TEAMCLASS.team.LgNr;
    const __KLASSE = (__LGNR > 1) ? (__LGNR > 3) ? 3 : 2 : 1;
     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.923:
     const __POSITIONS = getOptValue(optSet.positions, []);
     const __POSITIONS = getOptValue(optSet.positions, []);
     const __SKILLS = getOptValue(optSet.skills, []);
     const __SKILLS = getOptValue(optSet.skills, []);
    const __ISSKILLPAGE = (page === 2);
     const __BASEDATA = [ __BIRTHDAYS, __TCLASSES, __PROGRESSES ];  // fuer initPlayer
     const __BASEDATA = [ __BIRTHDAYS, __TCLASSES, __PROGRESSES ];  // fuer initPlayer
     const __DATA = (__ISSKILLPAGE ? [ __SKILLS, __BASEDATA ] : [ __BASEDATA, __SKILLS ]);  // fuer initPlayer: [0] = von HTML-Seite, [1] = aus gespeicherten Daten
     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.931:
     __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);


         if (__CELLS.length > 1) {
         __NEWPLAYER.initPlayer(__DATA[0], j, ! reloadData);
            const __LAND = getStringFromHTML(__CELLS, colIdx.Land);
            const __AGE = getIntFromHTML(__CELLS, colIdx.Age);
            const __ISGOALIE = isGoalieFromHTML(__CELLS, colIdx.Age);
            const __AKTION = getElementFromHTML(__CELLS, colIdx.Akt);


            const __NEWPLAYER = new PlayerRecord(__LAND, __AGE, __ISGOALIE, __SAISON, __CURRZAT, __DONATION);
        const __IDX = selectPlayerIndex(__NEWPLAYER, j, __CATIDS);


            __NEWPLAYER.initPlayer(__DATA[0], j, __ISSKILLPAGE);
        __NEWPLAYER.initPlayer(__DATA[1], __IDX, reloadData);


            const __IDX = selectPlayerIndex(__NEWPLAYER, j, __CATIDS);
        __NEWPLAYER.prognoseSkills();


            __NEWPLAYER.initPlayer(__DATA[1], __IDX, ! __ISSKILLPAGE);
        if (reloadData) {
 
            __NEWPLAYER.setZusatz(__ZATAGES[__IDX], __TRAINIERT[__IDX], __POSITIONS[__IDX]);
            __NEWPLAYER.prognoseSkills();
        }
 
            if (! __ISSKILLPAGE) {
                __NEWPLAYER.setZusatz(__ZATAGES[__IDX], __TRAINIERT[__IDX], __POSITIONS[__IDX]);
            }


            __NEWPLAYER.createWarnDraw(__AKTION, __KLASSE);
        __PLAYERS[j] = __NEWPLAYER;
 
            __PLAYERS[j++] = __NEWPLAYER;
        }
     }
     }


     if (__ISSKILLPAGE) {
     if (reloadData) {
        setPlayerData(__PLAYERS, optSet);
    } else {
         calcPlayerData(__PLAYERS, optSet);
         calcPlayerData(__PLAYERS, optSet);
    } else {
        setPlayerData(__PLAYERS, optSet);
     }
     }


Zeile 4.136: Zeile 3.994:


// Berechnet die Identifikations-IDs (Fingerprints) der Spieler neu und speichert diese
// Berechnet die Identifikations-IDs (Fingerprints) der Spieler neu und speichert diese
// players: Array von PlayerRecord mit den Spielerdaten
// optSet: Gesetzte Optionen (und Config)
function storePlayerIds(players, optSet) {
function storePlayerIds(players, optSet) {
     const __FINGERPRINTS = [];
     const __FINGERPRINTS = [];
Zeile 4.153: Zeile 4.009:


// 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
// player: PlayerRecord mit den Daten eines Spielers
// index: Position des Spielers im neuen Array von Spielerdaten
// catIds: PlayerIdMap zum Finden des Spielers ueber die Spielerdaten
// return Original-Index der Daten dieses Spielers im Array von Spielerdaten
function selectPlayerIndex(player, index, catIds) {
function selectPlayerIndex(player, index, catIds) {
     const __MYCAT = player.getCat();
     const __MYCAT = player.getCat();
Zeile 4.172: Zeile 4.024:


// Speichtert die abgeleiteten Werte in den Spieler-Objekten
// Speichtert die abgeleiteten Werte in den Spieler-Objekten
// players: Array von PlayerRecord mit den Spielerdaten
// optSet: Gesetzte Optionen (und Config)
function setPlayerData(players, optSet) {
function setPlayerData(players, optSet) {
    const __ZIEHANZAHL = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
    let ziehAnzAufstieg = 0;
     const __ZATAGES = [];
     const __ZATAGES = [];
     const __TRAINIERT = [];
     const __TRAINIERT = [];
Zeile 4.185: Zeile 4.033:


         if (__ZUSATZ.zatAge !== undefined) {  // braucht Geburtstag fuer gueltige Werte!
         if (__ZUSATZ.zatAge !== undefined) {  // braucht Geburtstag fuer gueltige Werte!
            const __INDEX = players[i].calcZiehIndex();  // Lfd. Nummer des Abrechnungsmonats (0-basiert)
             __ZATAGES[i]   = __ZUSATZ.zatAge;
 
            if ((__INDEX >= 0) && (__INDEX < __ZIEHANZAHL.length)) {
                __ZIEHANZAHL[__INDEX]++;
            }
 
             __ZATAGES[i] = __ZUSATZ.zatAge;
        }
        if (players[i].isZiehAufstieg()) {
            ziehAnzAufstieg++;
         }
         }
         __TRAINIERT[i] = __ZUSATZ.trainiert;
         __TRAINIERT[i] = __ZUSATZ.trainiert;
         __POSITIONS[i] = __ZUSATZ.bestPos;
         __POSITIONS[i] = __ZUSATZ.bestPos;
     }
     }


    setOpt(optSet.ziehAnz, __ZIEHANZAHL, false);
    setOpt(optSet.ziehAnzAufstieg, ziehAnzAufstieg, false);
     setOpt(optSet.zatAges, __ZATAGES, false);
     setOpt(optSet.zatAges, __ZATAGES, false);
     setOpt(optSet.trainiert, __TRAINIERT, false);
     setOpt(optSet.trainiert, __TRAINIERT, false);
Zeile 4.208: Zeile 4.045:


// Berechnet die abgeleiteten Werte in den Spieler-Objekten neu und speichert diese
// Berechnet die abgeleiteten Werte in den Spieler-Objekten neu und speichert diese
// players: Array von PlayerRecord mit den Spielerdaten
// optSet: Gesetzte Optionen (und Config)
function calcPlayerData(players, optSet) {
function calcPlayerData(players, optSet) {
     const __ZATAGES = [];
     const __ZATAGES = [];
Zeile 4.219: Zeile 4.054:


         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 4.065:
}
}


// Ermittelt die fuer diese Seite relevanten Werte in den Spieler-Objekten aus den Daten der Seite und speichert diese
// Ermittelt die Werte in den Spieler-Objekten aus den Daten der Seite und speichert diese
// playerRows: Array von Zeilen mit Array cells (Spielertabelle)
// reloadData: true = Teamuebersicht, false = Spielereinzelwerte
// optSet: Gesetzte Optionen (und Config)
function storePlayerDataFromHTML(playerRows, optSet, colIdx, offsetUpper = 1, offsetLower = 0, reloadData = false) {
// colIdx: Liste von Spaltenindices der gesuchten Werte
     if (reloadData) {
// offsetUpper: Ignorierte Zeilen oberhalb der Daten
        const __BIRTHDAYS = [];
// offsetLower: Ignorierte Zeilen unterhalb der Daten
        const __TCLASSES = [];
// page: 1: Teamuebersicht, 2: Spielereinzelwerte, 3: Opt. Skill, 4: Optionen, Default: 0
        const __PROGRESSES = [];
function storePlayerDataFromHTML(playerRows, optSet, colIdx, offsetUpper = 1, offsetLower = 0, page = 0) {
     const __COLDEFS = [ { }, {
                                'birthdays'  : { 'name' : 'birthdays', 'getFun' : getIntFromHTML, 'params' : [ colIdx.Geb ] },
                                'tClasses'  : { 'name' : 'tClasses', 'getFun' : getTalentFromHTML, 'params' : [ colIdx.Tal ] },
                                'progresses' : { 'name' : 'progresses', 'getFun' : getAufwertFromHTML, 'params' : [ colIdx.Auf, getOptValue(optSet.shortAufw, true) ] }
                            }, {
                                'skills'    : { 'name' : 'skills', 'getFun' : getSkillsFromHTML, 'params' : [ colIdx ]}
                            } ][getValueIn(page, 1, 2, 0)];


    return storePlayerDataColsFromHTML(playerRows, optSet, __COLDEFS, offsetUpper, offsetLower);
        for (let i = offsetUpper, j = 0; i < playerRows.length - offsetLower; i++, j++) {
}
            const __CELLS = playerRows[i].cells;


// Ermittelt bestimmte Werte in den Spieler-Objekten aus den Daten der Seite und speichert diese
            __BIRTHDAYS[j] = getIntFromHTML(__CELLS, colIdx.Geb);
// playerRows: Array von Zeilen mit Array cells (Spielertabelle)
            __TCLASSES[j] = getTalentFromHTML(__CELLS, colIdx.Tal);
// optSet: Gesetzte Optionen (und Config)
            __PROGRESSES[j] = getAufwertFromHTML(__CELLS, colIdx.Auf, getOptValue(optSet.shortAufw, true));
// colDefs: Informationen zu ausgewaehlten Datenspalten
        }
// offsetUpper: Ignorierte Zeilen oberhalb der Daten
        setOpt(optSet.birthdays, __BIRTHDAYS, false);
// offsetLower: Ignorierte Zeilen unterhalb der Daten
        setOpt(optSet.tClasses, __TCLASSES, false);
function storePlayerDataColsFromHTML(playerRows, optSet, colDefs, offsetUpper = 1, offsetLower = 0) {
        setOpt(optSet.progresses, __PROGRESSES, false);
    const __DATA = { };
    } else {
        const __SKILLS = [];


    for (let key in colDefs) {
        for (let i = offsetUpper, j = 0; i < playerRows.length - offsetLower; i++, j++) {
        __DATA[key] = [];
            const __CELLS = playerRows[i].cells;
    }


    for (let i = offsetUpper, j = 0; i < playerRows.length - offsetLower; i++) {
             __SKILLS[j] = getSkillsFromHTML(__CELLS, colIdx);
        const __CELLS = playerRows[i].cells;
         }
 
         setOpt(optSet.skills, __SKILLS, false);
        if (__CELLS.length > 1) {
             for (let key in colDefs) {
                const __COLDEF = colDefs[key];
 
                __DATA[key][j] = __COLDEF.getFun(__CELLS, ...__COLDEF.params);
            }
            j++;
         }
    }
 
    for (let key in colDefs) {
        const __COLDEF = colDefs[key];
 
        __LOG[7]('Schreibe ' + __COLDEF.name + ': ' + __DATA[key]);
 
         setOpt(optSet[__COLDEF.name], __DATA[key], false);
     }
     }
}
}
Zeile 4.290: Zeile 4.101:
     }
     }


     for (let i = offsetUpper, newVal, oldVal = formatFun((rows[i].cells[colIdxSort] || { }).textContent); i < rows.length - offsetLower - 1; i++, oldVal = newVal) {
     for (let i = offsetUpper, newVal, oldVal = formatFun(rows[i].cells[colIdxSort].textContent); i < rows.length - offsetLower - 1; i++, oldVal = newVal) {
         newVal = formatFun((rows[i + 1].cells[colIdxSort] || { }).textContent);
         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 4.133:


     this.colIdx = colIdx;
     this.colIdx = colIdx;
    this.saison = getOptValue(optSet.saison);
    this.gt = getOptValue(optSet.zeigeJahrgang);
    this.gtUxx = getOptValue(optSet.zeigeUxx);


     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.warn = (__ZATAGES && getValue(__SHOWCOL.zeigeWarnung, __SHOWALL) && getOptValue(optSet.zeigeWarnung));
    this.warnMonth = (__ZATAGES && getValue(__SHOWCOL.zeigeWarnungMonat, __SHOWALL) && getOptValue(optSet.zeigeWarnungMonat));
    this.warnHome = (__ZATAGES && getValue(__SHOWCOL.zeigeWarnungHome, __SHOWALL) && getOptValue(optSet.zeigeWarnungHome));
    this.warnDialog = (__ZATAGES && getValue(__SHOWCOL.zeigeWarnungDialog, __SHOWALL) && getOptValue(optSet.zeigeWarnungDialog));
    this.warnAufstieg = (__ZATAGES && getValue(__SHOWCOL.zeigeWarnungAufstieg, __SHOWALL) && getOptValue(optSet.zeigeWarnungAufstieg));
    this.warnLegende = (__ZATAGES && getValue(__SHOWCOL.zeigeWarnungLegende, __SHOWALL) && getOptValue(optSet.zeigeWarnungLegende));
     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.316:
                           },  // Ende addTitles()
                           },  // Ende addTitles()
         'addValues'      : function(player, playerRow, color = "#FFFFFF") {
         'addValues'      : function(player, playerRow, color = "#FFFFFF") {
                              // Warnlevel des Spielers anpassen...
                              const __WARNDRAW = player.warnDraw || player.warnDrawAufstieg || __NOWARNDRAW;
                              __WARNDRAW.setWarn(this.warn, this.warnMonth, this.warnAufstieg);
                               const __IDXPRI = getIdxPriSkills(player.getPos());
                               const __IDXPRI = getIdxPriSkills(player.getPos());
                               const __COLOR = __WARNDRAW.getColor(player.isGoalie ? getColor('TOR') : color); // Angepasst an Ziehwarnung
                              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.358:
                                   this.addAndFillCell(playerRow, player.getAge(), __COLOR, null, 2);
                                   this.addAndFillCell(playerRow, player.getAge(), __COLOR, null, 2);
                               }
                               }
                               if (__WARNDRAW.monthDraw()) {  // Abrechnungszeitraum vor dem letztmoeglichen Ziehen...
                               if (player.zatLeft < 6) {  // Abrechnungszeitraum vor dem letztmoeglichen Ziehen...
                                   formatCell(playerRow.cells[this.colIdx.Age], true, __WARNDRAW.colAlert, null, 1.0);
                                   formatCell(playerRow.cells[this.colIdx.Age], true, __COLALERT, null);
                               }
                               }
                               if (this.fix) {
                               if (this.fix) {
Zeile 4.611: Zeile 4.409:
                               }
                               }


                               // Einzelwerte mit Ende 18
                               // Werte mit Ende 18
                               if (this.colIdx.Einz) {
                               if (this.substSkills) {
                                  if (this.substSkills) {
                                  convertArrayFromHTML(playerRow.cells, this.colIdx.Einz, player.skillsEnd, function(value, cell, unused, index) {
                                      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, __OSBLAU, __POS1COLOR, 1.0);
                                                                                                                         formatCell(cell, true);
                                                                                                                     }
                                                                                                                     }
                                                                                                                     return value;
                                                                                                                     return value;
                                                                                                                 });
                                                                                                                 });
                                  } else {
                                      convertArrayFromHTML(playerRow.cells, this.colIdx.Einz, player.skills.length, function(value, cell, unused, index) {
                                                                                                                        if (~ __IDXPRI.indexOf(index)) {
                                                                                                                            formatCell(cell, true, __POS1COLOR, null, 1.0);
                                                                                                                        }
                                                                                                                        return value;
                                                                                                                    });
                                  }
                               }
                               }
                               if (this.trE) {
                               if (this.trE) {
Zeile 4.670: Zeile 4.466:
                                   }
                                   }
                               }
                               }
                           }, // Ende addValues(player, playerRow)
                           }  // Ende addValues(player, playerRow)
        'setGroupTitle'  : function(tableRow) {
                              if (this.gtUxx) {
                                  const __CELL = tableRow.cells[0];
                                  const __SAI = __CELL.innerHTML.match(/Saison (\d+)/)[1];
                                  const __JG = 13 + this.saison - __SAI;
 
                                  __CELL.innerHTML = __CELL.innerHTML.replace('Jahrgang', 'U' + __JG + ' - $&');
                              }
 
                              tableRow.style.display = (this.gt ? '' : 'none');
                          }  // Ende setGroupTitle(tableRow)
     });
     });


Zeile 4.723: Zeile 4.508:
     // 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.createWarnDraw() definiert:
    // this.warnDraw: Behandlung von Warnungen Ende 18
    // this.warnDrawAufstieg: Behandlung von Warnungen bei Aufstieg


     // in this.getPos() definiert:
     // in this.getPos() definiert:
Zeile 4.768: Zeile 4.549:
                                       return result;
                                       return result;
                                   },  // Ende this.toString()
                                   },  // Ende this.toString()
         'initPlayer'            : function(data, index, isSkillData = false) {  // isSkillData: true = Skilldaten, false = Basiswerte (Geb., Talent, Aufwertungen) oder keine
         'initPlayer'            : function(data, index, skillData = false) {  // skillData: true = Skilldaten, false = Basiswerte (Geb., Talent, Aufwertungen)
                                       if (data !== undefined) {
                                       if (data !== undefined) {
                                           if (isSkillData) {
                                           if (skillData) {
                                               this.setSkills(data[index]);
                                               this.setSkills(data[index]);
                                           } else if (data.length >= 2){
                                           } 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];
                                          } else {
                                              // keine Daten
                                           }
                                           }
                                       }
                                       }
                                   },  // Ende this.initPlayer()
                                   },  // Ende this.initPlayer()
        'createWarnDraw'        : function(ziehmich = null, klasse = 1) {  // ziehmich: input Element zum Ziehen; klasse: Spielklasse 1, 2, 3
                                      // Objekte fuer die Verwaltung der Ziehwarnungen...
                                      this.warnDraw = undefined;
                                      this.warnDrawAufstieg = undefined;
                                      if (ziehmich) {
                                          const __LASTZAT = this.currZAT + this.getZatLeft();
                                          if (__LASTZAT < 72) {  // U19
                                              this.warnDraw = new WarnDrawPlayer(this, getColor('STU'));  // rot
                                              __LOG[4](this.getAge().toFixed(2), "rot");
                                          } else if (__LASTZAT < Math.max(2, klasse) * 72) {  // Rest bis inkl. U18 (Liga 1 und 2) bzw. U17 (Liga 3)
                                              // do nothing
                                          } else if (__LASTZAT < (klasse + 1) * 72) {  // U17/U16 je nach Liga 2/3
                                              this.warnDrawAufstieg = new WarnDrawPlayer(this, getColor('OMI'));  // magenta
                                              this.warnDrawAufstieg.setAufstieg();
                                              __LOG[4](this.getAge().toFixed(2), "magenta");
                                          }
                                      }
                                  },  // Ende this.createWarnDraw()
         '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.647:
                                       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 if (this.zatAge !== undefined) {
                                       } else {
                                           return this.zatAge;
                                           return this.zatAge;
                                      } else {
                                          __LOG[4]("Empty getZatAge()");
                                          return NaN;
                                       }
                                       }
                                   },
                                   },
Zeile 4.904: Zeile 4.660:


                                       return this.zatLeft;
                                       return this.zatLeft;
                                  },
        'calcZiehIndex'        : function() {
                                      //const __RESTZAT = this.getZatAge(this.__TIME.end) - this.getZatAge() + this.currZAT;
                                      //const __INDEX = parseInt(__RESTZAT / 6 + 1) - 1;  // Lfd. Nummer des Abrechnungsmonats (0-basiert)
                                      return (this.warnDraw && this.warnDraw.calcZiehIndex(this.currZAT));
                                  },
        'isZiehAufstieg'        : function() {
                                      return (this.warnDrawAufstieg && this.warnDrawAufstieg.isZiehAufstieg());
                                   },
                                   },
         'getAge'                : function(when = this.__TIME.now) {
         'getAge'                : function(when = this.__TIME.now) {
Zeile 5.130: Zeile 4.877:
     });
     });


// Klasse WarnDrawPlayer *****************************************************************
// Funktionen fuer die HTML-Seite *******************************************************
 
// 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;


function WarnDrawPlayer(player, alertColor) {
    if (__TEXT !== undefined) {
    'use strict';
        try {
            const __VALUE = parseInt(__TEXT, 10);


    this.player = player;
            if (! isNaN(__VALUE)) {
                return __VALUE;
            }
        } catch (ex) { }


    if (this.player !== undefined) {
         return -1;
         // Default Warnlevel...
        this.setZatLeft(player.getZatLeft());
        this.currZAT = player.currZAT;
        this.setWarn(true, true, true);
        this.colAlert = alertColor || this.alertColor();
    } else {
        // Kein Warnlevel...
        this.setZatLeft(undefined);
        this.currZAT = undefined;
        this.setWarn(false, false, false);
        this.colAlert = undefined;
     }
     }
    return undefined;
}
}


Class.define(WarnDrawPlayer, Object, {
// Liest eine Dezimalzahl aus der Spalte einer Zeile der Tabelle aus
        '__MONATEBISABR'    : 1,
// cells: Die Zellen einer Zeile
        '__ZATWARNVORLAUF'  : 1,
// colIdxInt: Spaltenindex der gesuchten Werte
        '__ZATMONATVORLAUF' : 6,
// return Spalteneintrag als Dezimalzahl (undefined fuer "keine Zahl" oder "nicht gefunden")
        'setZatLeft'        : function(zatLeft) {
function getFloatFromHTML(cells, colIdxFloat) {
                                  this.zatLeft = zatLeft;
    const __CELL = getValue(cells[colIdxFloat], { });
                              },
     const __TEXT = __CELL.textContent;
        'setWarn'          : function(warn, warnMonth, warnAufstieg) {
                                  this.warn = (this.aufstieg ? warnAufstieg : warn);
                                  this.warnMonth = warnMonth;
                              },
        'alertColor'        : function() {
                                  return getColor('STU');  // rot
                              },
        'getColor'          : function(color) {
                                  return ((this.mustDraw() && this.colAlert) ? this.colAlert : color);
                              },
        'calcZiehIndex'     : function(currZAT) {
                                  const __RESTZAT = this.zatLeft + currZAT;
                                  const __INDEX = parseInt(__RESTZAT / 6 + 1) - this.__MONATEBISABR; // Lfd. Nummer des Abrechnungsmonats (0-basiert)


                                  return __INDEX;
    if (__TEXT !== undefined) {
                              },
         try {
         'isZiehAufstieg'    : function() {
            return parseFloat(__TEXT);
                                  return this.aufstieg;
        } catch (ex) { }
                              },
    }
        'setAufstieg'      : function() {
                                  this.aufstieg = true;


                                  if (this.isZiehAufstieg()) {
    return undefined;
                                      this.setZatLeft(72 - this.currZAT - this.__ZATWARNVORLAUF);
}
                                  }


                                  return this.zatLeft;
// Liest einen String aus der Spalte einer Zeile der Tabelle aus
                              },
// cells: Die Zellen einer Zeile
        'mustDraw'          : function() {
// colIdxStr: Spaltenindex der gesuchten Werte
                                  return ((this.warn || this.warnMonth) && (this.zatLeft < this.__ZATWARNVORLAUF));
// return Spalteneintrag als String ("" fuer "nicht gefunden")
                              },
function getStringFromHTML(cells, colIdxStr) {
        'monthDraw'        : function() {
    const __CELL = getValue(cells[colIdxStr], { });
                                  return (this.mustDraw() || (this.warn && (this.aufstieg || this.warnMonth) && (this.zatLeft < this.__ZATMONATVORLAUF))); // Abrechnungszeitraum vor dem letztmoeglichen Ziehen...
     const __TEXT = __CELL.textContent;
                              }
     });


const __NOWARNDRAW = new WarnDrawPlayer(undefined, undefined); // inaktives Objekt
    return getValue(__TEXT.toString(), "");
}


// Klasse WarnDrawMessage *****************************************************************
// 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);


function WarnDrawMessage(optSet, currZAT) {
    return parseInt((__TEXT === 'wenig') ? -1 : (__TEXT === 'hoch') ? +1 : 0, 10);
    'use strict';
 
    this.optSet = optSet;
 
    this.warn = getOptValue(this.optSet.zeigeWarnung, true);
    this.warnMonth = getOptValue(this.optSet.zeigeWarnungMonat, true);
    this.warnHome = getOptValue(this.optSet.zeigeWarnungHome, true);
    this.warnDialog = getOptValue(this.optSet.zeigeWarnungDialog, false);
    this.warnAufstieg = getOptValue(this.optSet.zeigeWarnungAufstieg, true);
    this.warnLegende = getOptValue(this.optSet.zeigeWarnungLegende, true);
 
    this.out = {
                  'supertag' : true,
                  'top'      : true,
                  'link'    : true,
                  'label'    : true,
                  'bottom'  : true
              };
 
    this.setOptionHome();
 
    this.startMessage(currZAT);
}
}


Class.define(WarnDrawMessage, Object, {
// Liest die Einzelskills aus der Spalte einer Zeile der Tabelle aus
        '__ZATWARNVORLAUF'  : 1,
// cells: Die Zellen einer Zeile
        '__ZATMONATVORLAUF' : 6,
// colIdx: Liste von Spaltenindices der gesuchten Werte mit den Eintraegen
        'startMessage'     : function(currZAT) {
// 'Einz' (erste Spalte) und 'Zus' (Spalte hinter dem letzten Eintrag)
                                  this.setZat(currZAT);
// return Skills als Array von Zahlen
                                  this.createMessage();
function getSkillsFromHTML(cells, colIdx) {
                              },
    const __RESULT = [];
        'setZat'            : function(currZAT) {
                                  this.currZAT = currZAT;


                                  if (currZAT === undefined) {
    for (let i = colIdx.Einz; i < colIdx.Zus; i++) {
                                      this.abrZAT = undefined;
         __RESULT[i - colIdx.Einz] = getIntFromHTML(cells, i);
                                      this.rest  = undefined;
    }
                                      this.anzahl = undefined;
                                  } else {
                                      this.configureZat();
                                  }
                              },
         'setOptionHome'    : function() {
                                  this.warnOption = this.hasHome();
                              },
        'setOptionLegende'  : function() {
                                  this.warnOption = this.hasLegende();
                              },
        'configureZat'      : function() {
                                  const __ZIEHANZAHL = getOptValue(this.optSet.ziehAnz, []);
                                  const __INDEX = parseInt(this.currZAT / 6);


                                  this.abrZAT = (__INDEX + 1) * 6;
    return __RESULT;
                                  this.rest  = 5 - (this.currZAT % 6);
}
                                  this.anzahl = __ZIEHANZAHL[__INDEX];
                              },
        'getTextMessage'    : function() {
                                  return "ZAT " + this.abrZAT + ' ' + ((this.anzahl > 1) ? "m\xFCssen " + this.anzahl : "muss einer") +
                                        " deiner Jugendspieler in das Profiteam \xFCbernommen werden, ansonsten verschwinde" + ((this.anzahl > 1) ? "n sie" : "t er") + '!';
                              },
        'createMessage'    : function() {
                                  this.label = undefined;
                                  this.when = undefined;
                                  this.text = undefined;


                                  if (this.hasHome() || this.hasLegende() || this.hasDialog()) {
// Liest aus, ob der Spieler Torwart oder Feldspieler ist
                                      if (this.anzahl > 0) {
// cells: Die Zellen einer Zeile
                                          this.text = this.getTextMessage();
// colIdxClass: Spaltenindex einer fuer TOR eingefaerbten Zelle
// return Angabe, der Spieler Torwart oder Feldspieler ist
function isGoalieFromHTML(cells, colIdxClass) {
    return (cells[colIdxClass].className === 'TOR');
}


                                          if (this.warnMonth && (this.rest > 0)) {
// Liest einen String aus der Spalte einer Zeile der Tabelle aus, nachdem dieser konvertiert wurde
                                              this.label = "Warnung";
// cells: Die Zellen einer Zeile
                                              this.when = "Bis zur n\xE4chsten Abrechnung am ";
// colIdxStr: Spaltenindex der gesuchten Werte
                                          } else if ((this.warn || this.warnMonth) && (this.rest === 0)) {
// convertFun: Funktion, die den Wert konvertiert
                                              this.label = "LETZTE WARNUNG VOR DER ABRECHNUNG";
// return Spalteneintrag als String ("" fuer "nicht gefunden")
                                              this.when = "Bis zum n\xE4chsten ";
function convertStringFromHTML(cells, colIdxStr, convertFun = sameValue) {
                                          }
    const __CELL = getValue(cells[colIdxStr], { });
                                      }
    const __TEXT = convertFun(__CELL.textContent, __CELL, colIdxStr, 0);
                                  }
                              },
        'hasMessage'        : function() {
                                  return !! this.when;
                              },
        'hasHome'          : function() {
                                  return this.warnHome;
                              },
        'hasLegende'        : function() {
                                  return this.warnLegende;
                              },
        'hasOption'        : function() {
                                  return this.warnOption;
                              },
        'hasDialog'        : function() {
                                  return this.warnDialog;
                              },
        'showMessage'      : function(anchor, tag, appendFind = true) {  // appendFind: true = append, false = insertBefore, "..." search string = insert at find position
                                  let ret = (anchor || { }).innerHTML;


                                  if (this.hasMessage()) {
    if (__TEXT !== undefined) {
                                      if (this.hasOption()) {
        __CELL.innerHTML = __TEXT;
                                          const __OLDHTML = ret;
    }
                                          const __HTML = this.getHTML(tag);


                                          if ((typeof appendFind) === 'string') {
    return getValue(__TEXT.toString(), "");
                                              const __INDEX = __OLDHTML.indexOf(appendFind);
}
                                              const __POS = (~ __INDEX) ? __INDEX : __OLDHTML.length;


                                              ret = __OLDHTML.substring(0, __POS) + __HTML + __OLDHTML.substring(__POS);
// Liest ein Array von String-Werten aus den Spalten ab einer Zeile der Tabelle aus, nachdem diese konvertiert wurden
                                          } else if (appendFind) {
// cells: Die Zellen einer Zeile
                                              ret = __OLDHTML + __HTML;
// colIdxArr: Erster Spaltenindex der gesuchten Werte
                                          } else {
// arrOrLength: Entweder ein Datenarray zum Fuellen oder die Anzahl der zu lesenden Werte
                                              ret = __HTML + __OLDHTML;
// 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 = [];


                                          anchor.innerHTML = 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);


                                  return ret;
         if (__TEXT !== undefined) {
                              },
            __CELL.innerHTML = __TEXT;
         'showDialog'        : function(dlgFun) {
         }
                                  if (this.hasMessage()) {
                                      if (this.hasDialog() && (this.rest === 0)) {
                                          dlgFun(this.label, this.when + this.text);
                                      }
                                  }
                              },
        'tagText'          : function(tag, text) {
                                  return ((tag !== undefined) ? this.getOpeningTag(tag) + text + this.getClosingTag(tag) : text);
                              },
        'tagParagraph'      : function(tag, text) {
                                  return this.tagText(tag, this.tagText(this.getSubTag(tag), text));
                              },
        'getSubTag'        : function(tag) {
                                  return ((tag === 'tr') ? 'td' + this.getColorTD() : ((tag === 'p') ? this.getColorTag() : undefined));
                              },
         'getSuperTag'      : function(tag) {
                                  return ((tag === 'p') ? 'div' : undefined);
                              },
        'getOpeningTag'    : function(tag) {
                                  return '<' + tag + '>';
                              },
        'getClosingTag'    : function(tag) {
                                  const __INDEX1 = (tag ? tag.indexOf(' ') : -1);
                                  const __INDEX2 = (tag ? tag.indexOf('=') : -1);
                                  const __INDEX = ((~ __INDEX1) && (~ __INDEX2)) ? Math.min(__INDEX1, __INDEX2) : Math.max(__INDEX1, __INDEX2);
                                  const __TAGNAME = ((~ __INDEX) ? tag.substring(0, __INDEX) : tag);


                                  return "</" + __TAGNAME + '>';
         __RET.push(getValue(__TEXT, "").toString());
                              },
     }
        'getLink'          : function() {
                                  return './ju.php';
                              },
        'getTopHTML'        : function(tag) {
                                  return this.tagParagraph(tag, "&nbsp;");
                              },
        'getBottomHTML'    : function(tag) {
                                  return this.tagParagraph(tag, "&nbsp;");
                              },
        'getColorTag'      : function() {
                                  return "color='red'";  // rot
                              },
        'getColorTD'        : function() {
                                  return " class='STU'";  // rot
                              },
         'getHTML'          : function(tag = 'p') {
                                  return this.tagParagraph((this.out.supertag ? this.getSuperTag(tag) : undefined), (this.out.top ? this.getTopHTML(tag) : "") +
                                        this.tagParagraph(tag, this.tagText('b', this.tagText((this.out.link ? "a href='" + this.getLink() + "'" : undefined),
                                        (this.out.label ? this.label + ": " : "") + this.when + this.text))) + (this.out.bottom ? this.getBottomHTML(tag) : ""));
                              }
     });


Object.defineProperty(WarnDrawMessage.prototype, 'innerHTML', {
    return __RET;
        get : function() {
                  return this.getHTML('p');
              }
    });
 
// Klasse WarnDrawMessageAufstieg *****************************************************************
 
function WarnDrawMessageAufstieg(optSet, currZAT) {
    'use strict';
 
    WarnDrawMessage.call(this, optSet, currZAT);
 
    this.out.top = false;  // kein Vorschub vor der Zeile
 
    this.warn = (this.warn && this.warnAufstieg);  // kann man ausschalten
    this.startMessage(currZAT); // 2. Aufruf (zur Korrektur)
}
}


Class.define(WarnDrawMessageAufstieg, WarnDrawMessage, {
// Konvertiert den Aufwertungstext einer Zelle auf der Jugend-Teamuebersicht
        'configureZat'      : function() {
// value: Der Inhalt dieser Zeile ("+1 SKI +1 OPT" bzw. "+2 SKI)
                                  const __ZIEHANZAUFSTIEG = getOptValue(this.optSet.ziehAnzAufstieg, 0);
// cell: Zelle, in der der Text stand (optional)
                                  const __INDEX = parseInt(this.currZAT / 6);
// 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, "");


                                  this.abrZAT = (__INDEX + 1) * 6;
         if (cell) {
                                  this.rest  = 5 - (this.currZAT % 6);
            if (cell.className === 'TOR') {
                                  this.anzahl = ((this.currZAT + this.__ZATMONATVORLAUF > 72 - this.__ZATWARNVORLAUF) ? __ZIEHANZAUFSTIEG : 0);
                value = convertGoalieSkill(value);
 
                                  this.warnDialog = false;    // kein Dialog fuer Aufstiegswarnung
                                  this.warnMonth = this.warn;  // nur im letzten Monat der Saison!
                              },
         'getTextMessage'    : function() {
                                  return "ZAT " + this.abrZAT + " ist im Falle eines Aufstiegs f\xFCr " + ((this.anzahl > 1) ? "" + this.anzahl : "einen") +
                                        " deiner Jugendspieler m\xF6glicherweise die letzte Chance, " + ((this.anzahl > 1) ? " diese noch vor ihrem" : "ihn noch vor seinem") +
                                        " Geburtstag in der n\xE4chsten Saison in das Profiteam zu \xFCbernehmen!";
                              },
        'getColorTag'      : function() {
                                  return "color='magenta'";  // magenta
                              },
        'getColorTD'        : function() {
                                  return " class='OMI'";  // magenta
                              }
    });
 
// Ende Hilfs-Klassen *****************************************************************
 
// Funktionen fuer die HTML-Seite *******************************************************
 
// 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 (__TEXT !== undefined) {
        try {
            const __VALUE = parseInt(__TEXT, 10);
 
            if (! isNaN(__VALUE)) {
                return __VALUE;
             }
             }
        } catch (ex) { }


         return -1;
            cell.align = 'left';
         }
     }
     }


     return undefined;
     return value;
}
}


// Liest eine Dezimalzahl aus der Spalte einer Zeile der Tabelle aus
// Formatiert eine Zelle um (mit einfachen Parametern)
// cells: Die Zellen einer Zeile
// cell: Zu formatierende Zelle
// colIdxInt: Spaltenindex der gesuchten Werte
// bold: Inhalt fett darstellen (true = ja, false = nein)
// return Spalteneintrag als Dezimalzahl (undefined fuer "keine Zahl" oder "nicht gefunden")
// color: Falls angegeben, die Schriftfarbe
function getFloatFromHTML(cells, colIdxFloat) {
// bgColor: Falls angegeben, die Hintergrundfarbe
     const __CELL = getValue(cells[colIdxFloat], { });
// return Die formatierte Zelle
    const __TEXT = __CELL.textContent;
function formatCell(cell, bold = true, color = undefined, bgColor = undefined) {
 
     if (cell) {
    if (__TEXT !== undefined) {
        if (bold) {
        try {
            cell.style.fontWeight = 'bold';
             return parseFloat(__TEXT);
        }
         } catch (ex) { }
        if (color) {
             cell.style.color = color;
         }
        if (bgColor) {
            cell.style.backgroundColor = bgColor;
        }
     }
     }


     return undefined;
     return cell;
}
}


// Liest einen String aus der Spalte einer Zeile der Tabelle aus
// Konvertiert die allgemeinen Skills in die eines Torwarts
// cells: Die Zellen einer Zeile
// value: Ein Text, der die Skillnamen enthaelt
// colIdxStr: Spaltenindex der gesuchten Werte
// return Der konvertierte String mit Aenderungen (z.B. "FAN" statt "KOB") oder unveraendert
// return Spalteneintrag als String ("" fuer "nicht gefunden")
function convertGoalieSkill(value) {
function getStringFromHTML(cells, colIdxStr) {
     if (value !== undefined) {
     const __CELL = getValue(cells[colIdxStr], { });
        value = value.replace(/\w+/g, getGoalieSkill);
     const __TEXT = __CELL.textContent;
     }


     return getValue(__TEXT.toString(), "");
     return value;
}
}


// Liest ein erstes Element aus der Spalte einer Zeile der Tabelle aus
// Konvertiert einen Aufwertungstext fuer einen Skillnamen in den fuer einen Torwart
// cells: Die Zellen einer Zeile
// name: Allgemeiner Skillname (abgeleitet von den Feldspielern)
// colIdxStr: Spaltenindex der gesuchten Werte
// return Der konvertierte String (z.B. "FAN" statt "KOB") oder unveraendert
// return Spalteneintrag als Element (null fuer "nicht gefunden")
function getGoalieSkill(name) {
function getElementFromHTML(cells, colIdxStr) {
     const __GOALIESKILLS = {
     const __CELL = getValue(cells[colIdxStr], { });
                              'SCH' : 'ABS',
                              'BAK' : 'STS',
                              'KOB' : 'FAN',
                              'ZWK' : 'STB',
                              'DEC' : 'SPL',
                              'GES' : 'REF'
                          };


     return __CELL.firstElementChild;
     return getValue(__GOALIESKILLS[name], name);
}
}


// Liest die Talentklasse ("wenig", "normal", "hoch") aus der Spalte einer Zeile der Tabelle aus
// 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
// colIdxStr: Spaltenindex der gesuchten Werte
// colIdxAuf: Spaltenindex der gesuchten Aufwertungen
// return Talent als Zahl (-1=wenig, 0=normal, +1=hoch)
// shortForm: true = abgekuerzt, false = Originalform
function getTalentFromHTML(cells, colIdxTal) {
// return Konvertierte Aufwertungen (kurze oder lange Form, aber in jedem Fall fuer Torwart konvertiert)
     const __TEXT = getStringFromHTML(cells, colIdxTal);
function getAufwertFromHTML(cells, colIdxAuf, shortForm = true) {
     const __ISGOALIE = isGoalieFromHTML(cells, colIdxAuf);
 
    return convertStringFromHTML(cells, colIdxAuf, (shortForm ? convertAufwertung : __ISGOALIE ? convertGoalieSkill : undefined));
}


    return parseInt((__TEXT === 'wenig') ? -1 : (__TEXT === 'hoch') ? +1 : 0, 10);
// Identitaetsfunktion. Konvertiert nichts, sondern liefert einfach den Wert zurueck
// value: Der uebergebene Wert
// return Derselbe Wert
function sameValue(value) {
    return value;
}
}


// Liest die Einzelskills aus der Spalte einer Zeile der Tabelle aus
// Liefert den ganzzeiligen Anteil einer Zahl zurueck, indem alles hinter einem Punkt abgeschnitten wird
// cells: Die Zellen einer Zeile
// value: Eine uebergebene Dezimalzahl
// colIdx: Liste von Spaltenindices der gesuchten Werte mit den Eintraegen
// return Der ganzzeilige Anteil dieser Zahl
// 'Einz' (erste Spalte) und 'Zus' (Spalte hinter dem letzten Eintrag)
function floorValue(value, dot = '.') {
// return Skills als Array von Zahlen
    if ((value === 0) || (value && isFinite(value))) {
function getSkillsFromHTML(cells, colIdx) {
        const __VALUE = value.toString();
    const __RESULT = [];
        const __INDEXDOT = (__VALUE ? __VALUE.indexOf(dot) : -1);


    for (let i = colIdx.Einz; i < colIdx.Zus; i++) {
        return Number((~ __INDEXDOT) ? __VALUE.substring(0, __INDEXDOT) : __VALUE);
         __RESULT[i - colIdx.Einz] = getIntFromHTML(cells, i);
    } else {
         return value;
     }
     }
    return __RESULT;
}
}


// Liest aus, ob der Spieler Torwart oder Feldspieler ist
// Liefert einen rechtsbuendigen Text zurueck, der links aufgefuellt wird
// cells: Die Zellen einer Zeile
// value: Ein uebergebener Wert
// colIdxClass: Spaltenindex einer fuer TOR eingefaerbten Zelle
// size: Zielbreite (clipping fuer < 0: Abschneiden, falls zu lang)
// return Angabe, der Spieler Torwart oder Feldspieler ist
// char: Zeichen zum Auffuellen
function isGoalieFromHTML(cells, colIdxClass) {
// return Ein String, der mindestens |size| lang ist (oder genau, falls size < 0, also clipping)
     return (cells[colIdxClass].className === 'TOR');
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 = "";


// Liest einen String aus der Spalte einer Zeile der Tabelle aus, nachdem dieser konvertiert wurde
    while (i < __SIZE) {
// cells: Die Zellen einer Zeile
        str += char;
// colIdxStr: Spaltenindex der gesuchten Werte
        i += char.length;
// 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;
     }
     }
    str = ((i > __SIZE) ? str.slice(0, __SIZE - __VALUE.length - 1) : str) + __VALUE;


     return getValue(__TEXT.toString(), "");
     return (__CLIP ? str.slice(size) : str);
}
}


// Liest ein Array von String-Werten aus den Spalten ab einer Zeile der Tabelle aus, nachdem diese konvertiert wurden
// Liefert eine rechtsbuendigen Zahl zurueck, der links (mit Nullen) aufgefuellt wird
// cells: Die Zellen einer Zeile
// value: Eine uebergebene Zahl
// colIdxArr: Erster Spaltenindex der gesuchten Werte
// size: Zielbreite (Default: 2)
// arrOrLength: Entweder ein Datenarray zum Fuellen oder die Anzahl der zu lesenden Werte
// char: Zeichen zum Auffuellen (Default: '0')
// convertFun: Funktion, die die Werte konvertiert
// forceClip: Abschneiden erzwingen, falls zu lang?
// return Array mit Spalteneintraegen als String ("" fuer "nicht gefunden")
// return Eine Zahl als String, der mindestens 'size' lang ist (oder genau, falls size < 0, also clipping)
function convertArrayFromHTML(cells, colIdxArr, arrOrLength = 1, convertFun = sameValue) {
function padNumber(value, size = 2, char = '0') {
     const __ARR = ((typeof arrOrLength === 'number') ? { } : arrOrLength);
     if ((value === 0) || (value && isFinite(value))) {
    const __LENGTH = getValue(__ARR.length, arrOrLength);
        return padLeft(value, size, char);
     const __RET = [];
     } else {
        return value;
    }
}


    for (let index = 0, colIdx = colIdxArr; index < __LENGTH; index++, colIdx++) {
// Hilfsfunktionen **********************************************************************
        const __CELL = getValue(cells[colIdx], { });
        const __TEXT = convertFun(getValue(__ARR[index], __CELL.textContent), __CELL, colIdx, index);


        if (__TEXT !== undefined) {
// Sortiert das Positionsfeld per BubbleSort
            __CELL.innerHTML = __TEXT;
function sortPositionArray(array) {
        }
    const __TEMP = [];
    let transposed = true;
    // TOR soll immer die letzte Position im Feld sein, deshalb - 1
    let length = array.length - 1;


        __RET.push(getValue(__TEXT, "").toString());
    while (transposed && (length > 1)) {
    }
        transposed = false;
 
        for (let i = 0; i < length - 1; i++) {
    return __RET;
            // Vergleich Opti-Werte:
}
            if (array[i][1] < array[i + 1][1]) {
 
                // vertauschen
// Konvertiert den Aufwertungstext einer Zelle auf der Jugend-Teamuebersicht
                __TEMP[0] = array[i][0];
// value: Der Inhalt dieser Zeile ("+1 SKI +1 OPT" bzw. "+2 SKI)
                __TEMP[1] = array[i][1];
// cell: Zelle, in der der Text stand (optional)
                array[i][0] = array[i + 1][0];
// return Der konvertierte String ("SKI OPT" bzw. "SKI SKI")
                array[i][1] = array[i + 1][1];
function convertAufwertung(value, cell = undefined) {
                array[i + 1][0] = __TEMP[0];
    if (value !== undefined) {
                array[i + 1][1] = __TEMP[1];
        value = value.replace(/\+2 (\w+)/, "$1 $1").replace(/\+1 /g, "");
                 transposed = true;
 
        if (cell) {
            if (cell.className === 'TOR') {
                 value = convertGoalieSkill(value);
             }
             }
            cell.align = 'left';
         }
         }
        length--;
     }
     }
    return value;
}
}


// Konvertiert die allgemeinen Skills in die eines Torwarts
// Fuegt in die uebergebene Zahl Tausender-Trennpunkte ein
// value: Ein Text, der die Skillnamen enthaelt
// Wandelt einen etwaig vorhandenen Dezimalpunkt in ein Komma um
// return Der konvertierte String mit Aenderungen (z.B. "FAN" statt "KOB") oder unveraendert
function getNumberString(numberString) {
function convertGoalieSkill(value) {
     if (numberString.lastIndexOf('.') !== -1) {
     if (value !== undefined) {
         // Zahl enthaelt Dezimalpunkt
         value = value.replace(/\w+/g, getGoalieSkill);
        const __VORKOMMA = numberString.substring(0, numberString.lastIndexOf('.'));
    }
        const __NACHKOMMA = numberString.substring(numberString.lastIndexOf('.') + 1, numberString.length);


    return value;
        return getNumberString(__VORKOMMA) + ',' + __NACHKOMMA;
}
    } else {
        // Kein Dezimalpunkt, fuege Tausender-Trennpunkte ein:
        // String umdrehen, nach jedem dritten Zeichen Punkt einfuegen, dann wieder umdrehen:
        const __TEMP = reverseString(numberString);
        let result = "";


// Konvertiert einen Aufwertungstext fuer einen Skillnamen in den fuer einen Torwart
        for (let i = 0; i < __TEMP.length; i++) {
// name: Allgemeiner Skillname (abgeleitet von den Feldspielern)
            if ((i > 0) && (i % 3 === 0)) {
// return Der konvertierte String (z.B. "FAN" statt "KOB") oder unveraendert
                result += '.';
function getGoalieSkill(name) {
            }
    const __GOALIESKILLS = {
            result += __TEMP.substr(i, 1);
                              'SCH' : 'ABS',
        }
                              'BAK' : 'STS',
                              'KOB' : 'FAN',
                              'ZWK' : 'STB',
                              'DEC' : 'SPL',
                              'GES' : 'REF'
                          };


    return getValue(__GOALIESKILLS[name], name);
        return reverseString(result);
    }
}
}


// Liest die Aufwertungen eines Spielers aus und konvertiert je nachdem, ob der Spieler Torwart oder Feldspieler ist
// Dreht den uebergebenen String um
// cells: Die Zellen einer Zeile
function reverseString(string) {
// colIdxAuf: Spaltenindex der gesuchten Aufwertungen
    let result = "";
// shortForm: true = abgekuerzt, false = Originalform
 
// return Konvertierte Aufwertungen (kurze oder lange Form, aber in jedem Fall fuer Torwart konvertiert)
    for (let i = string.length - 1; i >= 0; i--) {
function getAufwertFromHTML(cells, colIdxAuf, shortForm = true) {
        result += string.substr(i, 1);
    const __ISGOALIE = isGoalieFromHTML(cells, colIdxAuf);
    }


     return convertStringFromHTML(cells, colIdxAuf, (shortForm ? convertAufwertung : __ISGOALIE ? convertGoalieSkill : undefined));
     return result;
}
}


// Identitaetsfunktion. Konvertiert nichts, sondern liefert einfach den Wert zurueck
// Schaut nach, ob der uebergebene Index zu einem trainierbaren Skill gehoert
// value: Der uebergebene Wert
// Die Indizes gehen von 0 (SCH) bis 16 (EIN)
// return Derselbe Wert
function isTrainableSkill(idx) {
function sameValue(value) {
     const __TRAINABLESKILLS = getIdxTrainableSkills();
     return value;
    const __IDX = parseInt(idx, 10);
}
    let result = false;
 
    for (let idxTrainable of __TRAINABLESKILLS) {
        if (__IDX === idxTrainable) {
            result = true;
            break;
        }
    }


// Existenzfunktion. Liefert zurueck, ob ein Wert belegt ist
     return result;
// value: Der uebergebene Wert
// return Angabe ob Wert belegt ist
function existValue(value) {
     return !! value;
}
}


// Liefert den ganzzeiligen Anteil einer Zahl zurueck, indem alles hinter einem Punkt abgeschnitten wird
// Gibt alle Skill-Namen zurueck
// value: Eine uebergebene Dezimalzahl
function getAllSkillNames(isGoalie = false) {
// return Der ganzzeilige Anteil dieser Zahl
     if (isGoalie) {
function floorValue(value, dot = '.') {
         return [ 'ABS', 'STS', 'FAN', 'STB', 'SPL', 'REF', 'FUQ', 'ERF', 'AGG', 'PAS', 'AUS', 'UEB', 'WID', 'SEL', 'DIS', 'ZUV', 'EIN' ];
     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 {
     } else {
         return value;
         return [ 'SCH', 'BAK', 'KOB', 'ZWK', 'DEC', 'GES', 'FUQ', 'ERF', 'AGG', 'PAS', 'AUS', 'UEB', 'WID', 'SEL', 'DIS', 'ZUV', 'EIN' ];
     }
     }
}
}


// Liefert einen rechtsbuendigen Text zurueck, der links aufgefuellt wird
// Gibt den Skill-Namen zu einem Index zurueck
// value: Ein uebergebener Wert
function getSkillName(idx, isGoalie = false) {
// size: Zielbreite (clipping fuer < 0: Abschneiden, falls zu lang)
     const __ALLNAMES = getAllSkillNames(isGoalie);
// char: Zeichen zum Auffuellen
// 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) {
     return __ALLNAMES[idx];
        str += char;
}
        i += char.length;
    }
    str = ((i > __SIZE) ? str.slice(0, __SIZE - __VALUE.length - 1) : str) + __VALUE;


     return (__CLIP ? str.slice(size) : str);
// Gibt den Skill-Namen zu einem Index-Array zurueck
function getSkillNameArray(idxArr, isGoalie = false) {
     return (idxArr ? idxArr.map(function(item) {
                                    return getSkillName(item, isGoalie);
                                }) : idxArr);
}
}


// Liefert eine rechtsbuendigen Zahl zurueck, der links (mit Nullen) aufgefuellt wird
// Gibt die Indizes aller Skills zurueck
// value: Eine uebergebene Zahl
function getIdxAllSkills() {
// size: Zielbreite (Default: 2)
    return [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 ];
// 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 **********************************************************************
// Gibt die Indizes der trainierbaren Skills zurueck
function getIdxTrainableSkills() {
    return [ 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 15 ];
}


// Sortiert das Positionsfeld per BubbleSort
// Gibt die Indizes der Fixskills zurueck
function sortPositionArray(array) {
function getIdxFixSkills() {
    const __TEMP = [];
     return [ 6, 7, 12, 13, 14, 16 ];
    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--;
    }
}
 
// Schaut nach, ob der uebergebene Index zu einem trainierbaren Skill gehoert
// Die Indizes gehen von 0 (SCH) bis 16 (EIN)
function isTrainableSkill(idx) {
    const __TRAINABLESKILLS = getIdxTrainableSkills();
    const __IDX = parseInt(idx, 10);
    let result = false;
 
    for (let idxTrainable of __TRAINABLESKILLS) {
        if (__IDX === idxTrainable) {
            result = true;
            break;
        }
    }
 
    return result;
}
 
// Gibt alle Skill-Namen zurueck
function getAllSkillNames(isGoalie = false) {
    if (isGoalie) {
        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);
 
    return __ALLNAMES[idx];
}
 
// Gibt den Skill-Namen zu einem Index-Array zurueck
function getSkillNameArray(idxArr, isGoalie = false) {
    return (idxArr ? idxArr.map(function(item) {
                                    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 ];
}
 
// Gibt die Indizes der trainierbaren Skills zurueck
function getIdxTrainableSkills() {
    return [ 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 15 ];
}
 
// Gibt die Indizes der Fixskills zurueck
function getIdxFixSkills() {
     return [ 6, 7, 12, 13, 14, 16 ];
}


// Gibt die Indizes der Primaerskills zurueck
// Gibt die Indizes der Primaerskills zurueck
Zeile 6.036: Zeile 5.538:
// color: Falls angegeben, die Schriftfarbe
// color: Falls angegeben, die Schriftfarbe
// bgColor: Falls angegeben, die Hintergrundfarbe
// bgColor: Falls angegeben, die Hintergrundfarbe
// opacity: Falls angegeben, die Opazitaet
// return Die formatierte Zelle
// return Die formatierte Zelle
function formatCell(cell, bold = true, color = undefined, bgColor = undefined, opacity = undefined) {
function formatCell(cell, bold = true, color = undefined, bgColor = undefined) {
     if (cell) {
     if (cell) {
         if (bold) {
         if (bold) {
Zeile 6.048: Zeile 5.549:
         if (bgColor) {
         if (bgColor) {
             cell.style.backgroundColor = bgColor;
             cell.style.backgroundColor = bgColor;
        }
        if (opacity) {
        cell.style.opacity = opacity;
         }
         }
     }
     }
Zeile 6.237: Zeile 5.735:
     return buildOptions(__OPTCONFIG, __OPTSET, {
     return buildOptions(__OPTCONFIG, __OPTSET, {
                             'teamParams' : __TEAMPARAMS,
                             'teamParams' : __TEAMPARAMS,
//                            'menuAnchor' : getTable(0, 'div'),
                             'hideMenu'  : true
                             'hideMenu'  : true,
                            'showForm'  : {
                                              'zeigeWarnung'        : true,
                                              'zeigeWarnungMonat'    : true,
                                              'zeigeWarnungHome'    : true,
                                              'zeigeWarnungDialog'  : true,
                                              'zeigeWarnungAufstieg' : true,
                                              'zeigeWarnungLegende'  : true,
                                              'ziehAnz'              : true,
                                              'showForm'            : true
                                          }
                         }).then(async optSet => {
                         }).then(async optSet => {
             const __ZATCELL = getProp(getProp(getRows(0), 2), 'cells', { })[0];
             const __ZATCELL = getProp(getProp(getRows(0), 2), 'cells', { })[0];
Zeile 6.267: Zeile 5.754:
                     __LOG[2](__LOG.changed(__DATAZAT, __CURRZAT));
                     __LOG[2](__LOG.changed(__DATAZAT, __CURRZAT));


                     // ... und ZAT-bezogene Daten als veraltet markieren (ausser 'skills', 'positions' und 'ziehAnz')
                     // ... und ZAT-bezogene Daten als veraltet markieren (ausser 'skills' und 'positions')
                     await __TEAMCLASS.deleteOptions({
                     await __TEAMCLASS.deleteOptions({
                                                     'skills'      : true,
                                                     'skills'      : true,
                                                     'positions'  : true,
                                                     'positions'  : true,
                                                     'datenZat'    : true,
                                                     'datenZat'    : true,
                                                     'oldDatenZat' : true,
                                                     'oldDatenZat' : true
                                                    'ziehAnz'    : (__CURRZAT > __DATAZAT)  // nur loeschen, wenn < __DATAZAT
                                                 }).catch(defaultCatch);
                                                 }).catch(defaultCatch);


Zeile 6.280: Zeile 5.766:
                 }
                 }
             }
             }
            const __MSG = new WarnDrawMessage(optSet, __CURRZAT);
            const __MSGAUFSTIEG = new WarnDrawMessageAufstieg(optSet, __CURRZAT);
            const __ANCHOR = getTable(0, 'tbody');
            __MSG.showMessage(__ANCHOR, 'tr', true);
            __MSG.showDialog(showAlert);
            __MSGAUFSTIEG.showMessage(__ANCHOR, 'tr', true);
         });
         });
}
}
Zeile 6.298: Zeile 5.776:
                             'getDonation' : true,
                             'getDonation' : true,
                             'showForm'    : {
                             'showForm'    : {
                                                 'foerderung'          : true,
                                                 'foerderung'    : true,
                                                'zeigeWarnung'        : true,
                                                 'showForm'     : true
                                                'zeigeWarnungMonat'    : true,
                                                'zeigeWarnungHome'    : true,
                                                'zeigeWarnungDialog'  : true,
                                                'zeigeWarnungAufstieg' : true,
                                                'zeigeWarnungLegende'  : true,
                                                'ziehAnz'              : true,
                                                 'showForm'             : true
                                             }
                                             }
         });
         });
Zeile 6.337: Zeile 5.808:
                                 'menuAnchor' : getTable(0, 'div'),
                                 'menuAnchor' : getTable(0, 'div'),
                                 'showForm'  : {
                                 'showForm'  : {
                                                   'kennzeichenEnde'     : true,
                                                   'kennzeichenEnde'   : true,
                                                   'shortAufw'           : true,
                                                   'shortAufw'         : true,
                                                   'sepStyle'             : true,
                                                   'sepStyle'           : true,
                                                   'sepColor'             : true,
                                                   'sepColor'           : true,
                                                   'sepWidth'             : true,
                                                   'sepWidth'           : true,
                                                   'saison'               : true,
                                                   'saison'             : true,
                                                   'aktuellerZat'         : true,
                                                   'aktuellerZat'       : true,
                                                   'foerderung'           : true,
                                                   'foerderung'         : true,
                                                   'team'                 : true,
                                                   'team'               : true,
                                                   'zeigeJahrgang'        : true,
                                                   'zeigeBalken'        : true,
                                                   'zeigeUxx'            : true,
                                                   'absBalken'          : true,
                                                  'zeigeWarnung'        : true,
                                                   'zeigeId'            : true,
                                                  'zeigeWarnungMonat'    : true,
                                                   'ersetzeAlter'       : true,
                                                  'zeigeWarnungHome'    : true,
                                                   'zeigeAlter'         : true,
                                                  'zeigeWarnungDialog'  : true,
                                                   'zeigeQuote'         : true,
                                                  'zeigeWarnungAufstieg' : true,
                                                   'zeigePosition'     : true,
                                                  'zeigeWarnungLegende'  : true,
                                                   'zeigeZatDone'       : true,
                                                  'zeigeBalken'          : true,
                                                   'zeigeZatLeft'       : true,
                                                   'absBalken'            : true,
                                                   'zeigeFixSkills'     : true,
                                                  'zeigeId'              : true,
                                                   'zeigeTrainiert'     : true,
                                                   'ersetzeAlter'         : true,
                                                   'zeigeAnteilPri'     : true,
                                                   'zeigeAlter'           : true,
                                                   'zeigeAnteilSec'     : true,
                                                   'zeigeQuote'           : true,
                                                   'zeigePrios'         : true,
                                                   'zeigePosition'       : true,
                                                  'zeigeSkill'        : true,
                                                   'zeigeZatDone'         : true,
                                                   'anzahlOpti'         : true,
                                                   'zeigeZatLeft'         : true,
                                                   'anzahlMW'           : true,
                                                   'zeigeFixSkills'       : true,
                                                   'zeigeTrainiertEnde' : true,
                                                   'zeigeTrainiert'       : true,
                                                   'zeigeAnteilPriEnde' : true,
                                                   'zeigeAnteilPri'       : true,
                                                   'zeigeAnteilSecEnde' : true,
                                                   'zeigeAnteilSec'       : true,
                                                   'zeigePriosEnde'     : true,
                                                   'zeigePrios'           : true,
                                                   'zeigeSkillEnde'     : true,
                                                   'anzahlOpti'           : true,
                                                   'anzahlOptiEnde'     : true,
                                                   'anzahlMW'             : true,
                                                   'anzahlMWEnde'       : true,
                                                   'zeigeTrainiertEnde'   : true,
                                                   'zatAges'           : true,
                                                   'zeigeAnteilPriEnde'   : true,
                                                   'trainiert'         : true,
                                                   'zeigeAnteilSecEnde'   : true,
                                                   'positions'         : true,
                                                   'zeigePriosEnde'       : true,
                                                   'skills'             : true,
                                                   'zeigeSkillEnde'       : true,
                                                   'reset'             : true,
                                                   'anzahlOptiEnde'       : true,
                                                   'showForm'           : true
                                                   'anzahlMWEnde'         : true,
                                                  'ziehAnz'              : true,
                                                   'zatAges'             : true,
                                                   'trainiert'           : true,
                                                   'positions'           : true,
                                                   'skills'               : true,
                                                   'reset'               : true,
                                                   'showForm'             : true
                                               },
                                               },
                                 'formWidth'  : 1
                                 'formWidth'  : 1
Zeile 6.391: Zeile 5.854:
                 const __TITLECOLOR = getColor('LEI');  // "#FFFFFF"
                 const __TITLECOLOR = getColor('LEI');  // "#FFFFFF"


                 const __PLAYERS = init(__ROWS, __OPTSET, __COLUMNINDEX, __ROWOFFSETUPPER, __ROWOFFSETLOWER, 1);
                 const __PLAYERS = init(__ROWS, __OPTSET, __COLUMNINDEX, __ROWOFFSETUPPER, __ROWOFFSETLOWER, true);
                 const __COLMAN = new ColumnManager(__OPTSET, __COLUMNINDEX, {
                 const __COLMAN = new ColumnManager(__OPTSET, __COLUMNINDEX, {
                                                     'Default'            : true,
                                                     'Default'            : true,
Zeile 6.403: Zeile 5.866:
                 __COLMAN.addTitles(__HEADERS, __TITLECOLOR);
                 __COLMAN.addTitles(__HEADERS, __TITLECOLOR);


                 for (let i = __ROWOFFSETUPPER, j = 0; i < __ROWS.length - __ROWOFFSETLOWER; i++) {
                 for (let i = 0; i < __PLAYERS.length; i++) {
                     if (__ROWS[i].cells.length > 1) {
                     __COLMAN.addValues(__PLAYERS[i], __ROWS[i + __ROWOFFSETUPPER], __TITLECOLOR);
                        __COLMAN.addValues(__PLAYERS[j++], __ROWS[i], __TITLECOLOR);
                    } else {
                        __COLMAN.setGroupTitle(__ROWS[i]);
                    }
                 }
                 }


                 // Format der Trennlinie zwischen den Jahrgaengen...
                 // Format der Trennlinie zwischen den Monaten...
                 if (! __COLMAN.gt) {
                 const __BORDERSTRING = getOptValue(__OPTSET.sepStyle) + ' ' + getOptValue(__OPTSET.sepColor) + ' ' + getOptValue(__OPTSET.sepWidth);
                    const __BORDERSTRING = getOptValue(__OPTSET.sepStyle) + ' ' + getOptValue(__OPTSET.sepColor) + ' ' + getOptValue(__OPTSET.sepWidth);


                    separateGroups(__ROWS, __BORDERSTRING, __COLUMNINDEX.Land, __ROWOFFSETUPPER, __ROWOFFSETLOWER, 0, 0, existValue);
                separateGroups(__ROWS, __BORDERSTRING, __COLUMNINDEX.Age, __ROWOFFSETUPPER, __ROWOFFSETLOWER, -1, 0, floorValue);
                }
 
                const __CURRZAT = getOptValue(__OPTSET.datenZat);
                const __MSG = new WarnDrawMessage(__OPTSET, __CURRZAT);
                const __MSGAUFSTIEG = new WarnDrawMessageAufstieg(__OPTSET, __CURRZAT);
                const __ANCHOR = getTable(0, 'div');
                const __SEARCH = '<form method="POST">';
 
                // Kompaktere Darstellung und ohne Links...
                __MSG.out.top = false;
                __MSG.out.label = false;
                __MSG.out.link = false;
                __MSG.out.bottom = false;
                __MSGAUFSTIEG.out.label = false;
                __MSGAUFSTIEG.out.link = false;
                __MSGAUFSTIEG.out.bottom = false;
 
                __MSG.setOptionLegende();
                __MSGAUFSTIEG.setOptionLegende();
 
                __MSG.showMessage(__ANCHOR, 'p', __SEARCH);
                __MSGAUFSTIEG.showMessage(__ANCHOR, 'p', __SEARCH);
             });
             });
     }
     }
    // Promise fuer alle Faelle ohne Rueckgabewert...
    return Promise.resolve();
}
}


Zeile 6.450: Zeile 5.883:
     const __ROWOFFSETLOWER = 0;
     const __ROWOFFSETLOWER = 0;


     const __COLUMNINDEX = {
     const __COLUMNINDEX = {
             'Flg'  : 0,
             'Flg'  : 0,
             'Land'  : 1,
             'Land'  : 1,
             'U'    : 2,
             'U'    : 2,
            'X'    : 3,
             'Age'  : 3,
             'Age'  : 4,
             'Einz'  : 4,    // ab hier die Einzelskills
             'Einz'  : 5,    // ab hier die Einzelskills
             'SCH'  : 4,
             'SCH'  : 5,
             'ABS'  : 4,    // TOR
             'ABS'  : 5,    // TOR
             'BAK'  : 5,
             'BAK'  : 6,
             'STS'  : 5,    // TOR
             'STS'  : 6,    // TOR
             'KOB'  : 6,
             'KOB'  : 7,
             'FAN'  : 6,    // TOR
             'FAN'  : 7,    // TOR
             'ZWK'  : 7,
             'ZWK'  : 8,
             'STB'  : 7,    // TOR
             'STB'  : 8,    // TOR
             'DEC'  : 8,
             'DEC'  : 9,
             'SPL'  : 8,    // TOR
             'SPL'  : 9,    // TOR
             'GES'  : 9,
             'GES'  : 10,
             'REF'  : 9,   // TOR
             'REF'  : 10,   // TOR
             'FUQ'  : 10,
             'FUQ'  : 11,
             'ERF'  : 11,
             'ERF'  : 12,
             'AGG'  : 12,
             'AGG'  : 13,
             'PAS'  : 13,
             'PAS'  : 14,
             'AUS'  : 14,
             'AUS'  : 15,
             'UEB'  : 15,
             'UEB'  : 16,
             'WID'  : 16,
             'WID'  : 17,
             'SEL'  : 17,
             'SEL'  : 18,
             'DIS'  : 18,
             'DIS'  : 19,
             'ZUV'  : 19,
             'ZUV'  : 20,
             'EIN'  : 20,
             'EIN'  : 21,
             'Zus'  : 21     // Zusaetze hinter den Einzelskills
             'Zus'  : 22     // Zusaetze hinter den Einzelskills
         };
         };


Zeile 6.489: Zeile 5.921:
                                 'menuAnchor' : getTable(0, 'div'),
                                 'menuAnchor' : getTable(0, 'div'),
                                 'hideForm'  : {
                                 'hideForm'  : {
                                                  'zeigeWarnung'        : false,
                                                   'zatAges'       : true,
                                                  'zeigeWarnungMonat'    : false,
                                                   'trainiert'     : true,
                                                  'zeigeWarnungHome'    : false,
                                                   'positions'     : true,
                                                  'zeigeWarnungDialog'  : false,
                                                   'skills'       : true,
                                                  'zeigeWarnungAufstieg' : false,
                                                   'shortAufw'     : true
                                                  'zeigeWarnungLegende'  : false,
                                                  'ziehAnz'              : true,
                                                   'zatAges'             : true,
                                                   'trainiert'           : true,
                                                   'positions'           : true,
                                                   'skills'               : true,
                                                   'shortAufw'           : true
                                               },
                                               },
                                 'formWidth'  : 1
                                 'formWidth'  : 1
Zeile 6.508: Zeile 5.933:
                 const __TITLECOLOR = getColor('LEI');  // "#FFFFFF"
                 const __TITLECOLOR = getColor('LEI');  // "#FFFFFF"


                 const __PLAYERS = init(__ROWS, __OPTSET, __COLUMNINDEX, __ROWOFFSETUPPER, __ROWOFFSETLOWER, 2);
                 const __PLAYERS = init(__ROWS, __OPTSET, __COLUMNINDEX, __ROWOFFSETUPPER, __ROWOFFSETLOWER, false);
                 const __COLMAN = new ColumnManager(__OPTSET, __COLUMNINDEX, true);
                 const __COLMAN = new ColumnManager(__OPTSET, __COLUMNINDEX, true);


                 __COLMAN.addTitles(__HEADERS, __TITLECOLOR);
                 __COLMAN.addTitles(__HEADERS, __TITLECOLOR);


                 for (let i = __ROWOFFSETUPPER, j = 0; i < __ROWS.length - __ROWOFFSETLOWER; i++) {
                 for (let i = 0; i < __PLAYERS.length; i++) {
                     if (__ROWS[i].cells.length > 1) {
                     __COLMAN.addValues(__PLAYERS[i], __ROWS[i + __ROWOFFSETUPPER], __TITLECOLOR);
                        __COLMAN.addValues(__PLAYERS[j++], __ROWS[i], __TITLECOLOR);
                    } else {
                        __COLMAN.setGroupTitle(__ROWS[i]);
                    }
                 }
                 }


                 // Format der Trennlinie zwischen den Jahrgaengen...
                 // Format der Trennlinie zwischen den Monaten...
                 if (! __COLMAN.gt) {
                 const __BORDERSTRING = getOptValue(__OPTSET.sepStyle) + ' ' + getOptValue(__OPTSET.sepColor) + ' ' + getOptValue(__OPTSET.sepWidth);
                    const __BORDERSTRING = getOptValue(__OPTSET.sepStyle) + ' ' + getOptValue(__OPTSET.sepColor) + ' ' + getOptValue(__OPTSET.sepWidth);


                    separateGroups(__ROWS, __BORDERSTRING, __COLUMNINDEX.Land, __ROWOFFSETUPPER, __ROWOFFSETLOWER, 0, 0, existValue);
                separateGroups(__ROWS, __BORDERSTRING, __COLUMNINDEX.Age, __ROWOFFSETUPPER, __ROWOFFSETLOWER, -1, 0, floorValue);
                }
             });
             });
     }
     }
    // Promise fuer alle Faelle ohne Rueckgabewert...
    return Promise.resolve();
}
// Verarbeitet Ansicht "Opt. Skill"
function procOptSkill() {
    const __ROWOFFSETUPPER = 1;    // Header-Zeile
    const __ROWOFFSETLOWER = 0;
    const __COLUMNINDEX = {
            'Flg'  : 0,
            'Land'  : 1,
            'U'    : 2,
            'Age'  : 3,
            'Skill' : 4,
            'TOR'  : 5,
            'ABW'  : 6,
            'DMI'  : 7,
            'MIT'  : 8,
            'OMI'  : 9,
            'STU'  : 10,
            'Zus'  : 11    // Zusaetze hinter den OptSkills
        };
    if (getRows(1) === undefined) {
        __LOG[2]("Diese Seite ist ohne Team nicht verf\xFCgbar!");
    } else {
        return buildOptions(__OPTCONFIG, __OPTSET, {
                                'menuAnchor' : getTable(0, 'div'),
                                'showForm'  : {
                                                  'kennzeichenEnde'      : true,
                                                  'sepStyle'            : true,
                                                  'sepColor'            : true,
                                                  'sepWidth'            : true,
                                                  'saison'              : true,
                                                  'aktuellerZat'        : true,
                                                  'foerderung'          : true,
                                                  'team'                : true,
                                                  'zeigeJahrgang'        : true,
                                                  'zeigeUxx'            : true,
                                                  'zeigeWarnung'        : false,
                                                  'zeigeWarnungMonat'    : false,
                                                  'zeigeWarnungHome'    : false,
                                                  'zeigeWarnungDialog'  : false,
                                                  'zeigeWarnungAufstieg' : false,
                                                  'zeigeWarnungLegende'  : false,
                                                  '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,
                                                  'zeigeAufw'            : true,
                                                  'zeigeGeb'            : true,
                                                  'zeigeTal'            : 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
                            }).then(optSet => {
                const __ROWS = getRows(1);
                const __HEADERS = __ROWS[0];
                const __TITLECOLOR = getColor('LEI');  // "#FFFFFF"
                const __PLAYERS = init(__ROWS, __OPTSET, __COLUMNINDEX, __ROWOFFSETUPPER, __ROWOFFSETLOWER, 3);
                const __COLMAN = new ColumnManager(__OPTSET, __COLUMNINDEX, {
                                                    'Default'            : true,
                                                    'ersetzeSkills'      : false,
                                                    'zeigeSkill'        : false
                                                });
                __COLMAN.addTitles(__HEADERS, __TITLECOLOR);
                for (let i = __ROWOFFSETUPPER, j = 0; i < __ROWS.length - __ROWOFFSETLOWER; i++) {
                    if (__ROWS[i].cells.length > 1) {
                        __COLMAN.addValues(__PLAYERS[j++], __ROWS[i], __TITLECOLOR);
                    } else {
                        __COLMAN.setGroupTitle(__ROWS[i]);
                    }
                }
                // Format der Trennlinie zwischen den Jahrgaengen...
                if (! __COLMAN.gt) {
                    const __BORDERSTRING = getOptValue(__OPTSET.sepStyle) + ' ' + getOptValue(__OPTSET.sepColor) + ' ' + getOptValue(__OPTSET.sepWidth);
                    separateGroups(__ROWS, __BORDERSTRING, __COLUMNINDEX.Land, __ROWOFFSETUPPER, __ROWOFFSETLOWER, 0, 0, existValue);
                }
            });
    }
    // Promise fuer alle Faelle ohne Rueckgabewert...
    return Promise.resolve();
}
}


Zeile 6.652: Zeile 5.957:
             // page=1: Teamuebersicht
             // page=1: Teamuebersicht
             // page=2: Spielereinzelwerte
             // page=2: Spielereinzelwerte
             // page=3: Opt. Skill
             // page=3: Optionen
            // page=4: Optionen


             // Verzweige in unterschiedliche Verarbeitungen je nach Wert von page:
             // Verzweige in unterschiedliche Verarbeitungen je nach Wert von page:
Zeile 6.663: Zeile 5.967:
                 case 1  : await procTeamuebersicht().catch(defaultCatch); break;
                 case 1  : await procTeamuebersicht().catch(defaultCatch); break;
                 case 2  : await procSpielereinzelwerte().catch(defaultCatch); break;
                 case 2  : await procSpielereinzelwerte().catch(defaultCatch); break;
                 case 3 : await procOptSkill().catch(defaultCatch); break;
                 case 3  : await procOptionen().catch(defaultCatch); break;
                case 4 : await procOptionen().catch(defaultCatch); break;
                 default : break;
                 default : break;
             }
             }

Bitte beachte, dass alle Beiträge zu Online-Soccer-Wiki von anderen Mitwirkenden bearbeitet, geändert oder gelöscht werden können. Reiche hier keine Texte ein, falls du nicht willst, dass diese ohne Einschränkung geändert werden können.

Du bestätigst hiermit auch, dass du diese Texte selbst geschrieben hast oder diese von einer gemeinfreien Quelle kopiert hast (weitere Einzelheiten unter Online-Soccer-Wiki:Urheberrechte). ÜBERTRAGE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!

Abbrechen Bearbeitungshilfe (wird in einem neuen Fenster geöffnet)