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.61 (WebExtensions)'''
|- bgcolor="#FFCC00"
|- bgcolor="#FFCC00"
| '''Autor'''
| '''Autor'''
Zeile 36: Zeile 36:
|- 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'''<br> '''Neues Design und Seite "Opt. Skill"'''<br> '''Gruppierung nach Jahrgängen U13 bis U18 (per Option)'''


|- bgcolor="#FFCC00"
|- bgcolor="#FFCC00"
Zeile 48: Zeile 48:
// @name        OS2.jugend
// @name        OS2.jugend
// @namespace    http://os.ongapo.com/
// @namespace    http://os.ongapo.com/
// @version      0.73
// @version      0.61
// @copyright    2013+
// @copyright    2013+
// @author      Sven Loges (SLC) / Andreas Eckes (Strindheim BK)
// @author      Sven Loges (SLC) / Andreas Eckes (Strindheim BK)
Zeile 145: Zeile 145:
                   'AltLabel'  : "Nur Saisons anzeigen",
                   'AltLabel'  : "Nur Saisons anzeigen",
                   'AltHotkey' : 'u',
                   'AltHotkey' : 'u',
                   'FormLabel' : "Jahrg\xE4nge U13 bis U19"
                   'FormLabel' : "Jahrg\xE4nge U13 bis U18"
              },
    '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 585: Zeile 519:
                   '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 731: Zeile 665:
                   'Space'    : 0,
                   'Space'    : 0,
                   'Label'    : "Aufwertungen:"
                   'Label'    : "Aufwertungen:"
              },
    'ziehAnz' : {        // Datenspeicher fuer Anzahl zu ziehender Jugendspieler bis zur naechsten Abrechnung
                  'Name'      : "drawCounts",
                  'Type'      : __OPTTYPES.SD,
                  'Hidden'    : true,
                  'Serial'    : true,
                  'AutoReset' : false,
                  'Permanent' : true,
                  'Default'  : [],
                  'Submit'    : undefined,
                  'Cols'      : 25,
                  'Rows'      : 1,
                  'Replace'  : null,
                  'Space'    : 0,
                  'Label'    : "Zu ziehen:"
              },
    'ziehAnzAufstieg' : { // Datenspeicher fuer Anzahl zu ziehender Jugendspieler bis zur naechsten Abrechnung im Falle eines Aufstiegs
                  'Name'      : "drawCountsAufstieg",
                  '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
     'zatAges' : {        // Datenspeicher fuer (gebrochene) Alter der Jugendspieler
Zeile 3.952: Zeile 3.855:
// 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.047: Zeile 3.948:
     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.073: Zeile 3.972:
             const __AGE = getIntFromHTML(__CELLS, colIdx.Age);
             const __AGE = getIntFromHTML(__CELLS, colIdx.Age);
             const __ISGOALIE = isGoalieFromHTML(__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 __NEWPLAYER = new PlayerRecord(__LAND, __AGE, __ISGOALIE, __SAISON, __CURRZAT, __DONATION);


Zeile 4.088: Zeile 3.985:
                 __NEWPLAYER.setZusatz(__ZATAGES[__IDX], __TRAINIERT[__IDX], __POSITIONS[__IDX]);
                 __NEWPLAYER.setZusatz(__ZATAGES[__IDX], __TRAINIERT[__IDX], __POSITIONS[__IDX]);
             }
             }
            __NEWPLAYER.createWarnDraw(__AKTION, __KLASSE);


             __PLAYERS[j++] = __NEWPLAYER;
             __PLAYERS[j++] = __NEWPLAYER;
Zeile 4.156: Zeile 4.051:
// index: Position des Spielers im neuen Array von Spielerdaten
// index: Position des Spielers im neuen Array von Spielerdaten
// catIds: PlayerIdMap zum Finden des Spielers ueber die Spielerdaten
// catIds: PlayerIdMap zum Finden des Spielers ueber die Spielerdaten
// return Original-Index der Daten dieses Spielers im Array von 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.175: Zeile 4.070:
// optSet: Gesetzte Optionen (und Config)
// 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.078:


         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;
        }
        __TRAINIERT[i] = __ZUSATZ.trainiert;
        __POSITIONS[i] = __ZUSATZ.bestPos;
    }


            if ((__INDEX >= 0) && (__INDEX < __ZIEHANZAHL.length)) {
                __ZIEHANZAHL[__INDEX]++;
            }
            __ZATAGES[i] = __ZUSATZ.zatAge;
        }
        if (players[i].isZiehAufstieg()) {
            ziehAnzAufstieg++;
        }
        __TRAINIERT[i] = __ZUSATZ.trainiert;
        __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.219: Zeile 4.101:


         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.328: Zeile 4.210:


     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.391:
                           },  // 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.433:
                                   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, 1.0);
                               }
                               }
                               if (this.fix) {
                               if (this.fix) {
Zeile 4.723: Zeile 4.596:
     // 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.781: Zeile 4.650:
                                       }
                                       }
                                   },  // 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.737:
                                       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.750:


                                       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.967:
     });
     });


// 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;
// Liest die Einzelskills aus der Spalte einer Zeile der Tabelle aus
// cells: Die Zellen einer Zeile
// colIdx: Liste von Spaltenindices der gesuchten Werte mit den Eintraegen
// 'Einz' (erste Spalte) und 'Zus' (Spalte hinter dem letzten Eintrag)
// return Skills als Array von Zahlen
function getSkillsFromHTML(cells, colIdx) {
     const __RESULT = [];


     this.warn = getOptValue(this.optSet.zeigeWarnung, true);
     for (let i = colIdx.Einz; i < colIdx.Zus; i++) {
    this.warnMonth = getOptValue(this.optSet.zeigeWarnungMonat, true);
        __RESULT[i - colIdx.Einz] = getIntFromHTML(cells, i);
    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 = {
     return __RESULT;
                  'supertag' : true,
}
                  'top'      : true,
                  'link'    : true,
                  'label'    : true,
                  'bottom'  : true
              };


    this.setOptionHome();
// Liest aus, ob der Spieler Torwart oder Feldspieler ist
 
// cells: Die Zellen einer Zeile
     this.startMessage(currZAT);
// colIdxClass: Spaltenindex einer fuer TOR eingefaerbten Zelle
// return Angabe, der Spieler Torwart oder Feldspieler ist
function isGoalieFromHTML(cells, colIdxClass) {
     return (cells[colIdxClass].className === 'TOR');
}
}


Class.define(WarnDrawMessage, Object, {
// Liest einen String aus der Spalte einer Zeile der Tabelle aus, nachdem dieser konvertiert wurde
        '__ZATWARNVORLAUF'  : 1,
// cells: Die Zellen einer Zeile
        '__ZATMONATVORLAUF' : 6,
// colIdxStr: Spaltenindex der gesuchten Werte
        'startMessage'      : function(currZAT) {
// convertFun: Funktion, die den Wert konvertiert
                                  this.setZat(currZAT);
// return Spalteneintrag als String ("" fuer "nicht gefunden")
                                  this.createMessage();
function convertStringFromHTML(cells, colIdxStr, convertFun = sameValue) {
                              },
    const __CELL = getValue(cells[colIdxStr], { });
        'setZat'            : function(currZAT) {
    const __TEXT = convertFun(__CELL.textContent, __CELL, colIdxStr, 0);
                                  this.currZAT = currZAT;


                                  if (currZAT === undefined) {
    if (__TEXT !== undefined) {
                                      this.abrZAT = undefined;
        __CELL.innerHTML = __TEXT;
                                      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 getValue(__TEXT.toString(), "");
                                  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 ein Array von String-Werten aus den Spalten ab einer Zeile der Tabelle aus, nachdem diese konvertiert wurden
                                      if (this.anzahl > 0) {
// cells: Die Zellen einer Zeile
                                          this.text = this.getTextMessage();
// colIdxArr: Erster Spaltenindex der gesuchten Werte
// arrOrLength: Entweder ein Datenarray zum Fuellen oder die Anzahl der zu lesenden Werte
// convertFun: Funktion, die die Werte konvertiert
// return Array mit Spalteneintraegen als String ("" fuer "nicht gefunden")
function convertArrayFromHTML(cells, colIdxArr, arrOrLength = 1, convertFun = sameValue) {
    const __ARR = ((typeof arrOrSize === 'number') ? { } : arrOrLength);
    const __LENGTH = getValue(__ARR.length, arrOrLength);
    const __RET = [];


                                          if (this.warnMonth && (this.rest > 0)) {
    for (let index = 0, colIdx = colIdxArr; index < __LENGTH; index++, colIdx++) {
                                              this.label = "Warnung";
         const __CELL = getValue(cells[colIdx], { });
                                              this.when = "Bis zur n\xE4chsten Abrechnung am ";
         const __TEXT = convertFun(getValue(__ARR[index], __CELL.textContent), __CELL, colIdx, index);
                                          } else if ((this.warn || this.warnMonth) && (this.rest === 0)) {
                                              this.label = "LETZTE WARNUNG VOR DER ABRECHNUNG";
                                              this.when = "Bis zum n\xE4chsten ";
                                          }
                                      }
                                  }
                              },
        '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') {
        __RET.push(getValue(__TEXT, "").toString());
                                              const __INDEX = __OLDHTML.indexOf(appendFind);
    }
                                              const __POS = (~ __INDEX) ? __INDEX : __OLDHTML.length;


                                              ret = __OLDHTML.substring(0, __POS) + __HTML + __OLDHTML.substring(__POS);
    return __RET;
                                          } else if (appendFind) {
}
                                              ret = __OLDHTML + __HTML;
                                          } else {
                                              ret = __HTML + __OLDHTML;
                                          }


                                          anchor.innerHTML = ret;
// Konvertiert den Aufwertungstext einer Zelle auf der Jugend-Teamuebersicht
                                      }
// value: Der Inhalt dieser Zeile ("+1 SKI +1 OPT" bzw. "+2 SKI)
                                  }
// cell: Zelle, in der der Text stand (optional)
// return Der konvertierte String ("SKI OPT" bzw. "SKI SKI")
function convertAufwertung(value, cell = undefined) {
    if (value !== undefined) {
        value = value.replace(/\+2 (\w+)/, "$1 $1").replace(/\+1 /g, "");


                                  return ret;
         if (cell) {
                              },
            if (cell.className === 'TOR') {
         'showDialog'        : function(dlgFun) {
                value = convertGoalieSkill(value);
                                  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 + '>';
            cell.align = 'left';
                              },
         }
        '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 value;
        get : function() {
}
                  return this.getHTML('p');
              }
    });


// Klasse WarnDrawMessageAufstieg *****************************************************************
// Konvertiert die allgemeinen Skills in die eines Torwarts
// value: Ein Text, der die Skillnamen enthaelt
// return Der konvertierte String mit Aenderungen (z.B. "FAN" statt "KOB") oder unveraendert
function convertGoalieSkill(value) {
    if (value !== undefined) {
        value = value.replace(/\w+/g, getGoalieSkill);
    }


function WarnDrawMessageAufstieg(optSet, currZAT) {
     return value;
     '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 einen Aufwertungstext fuer einen Skillnamen in den fuer einen Torwart
        'configureZat'      : function() {
// name: Allgemeiner Skillname (abgeleitet von den Feldspielern)
                                  const __ZIEHANZAUFSTIEG = getOptValue(this.optSet.ziehAnzAufstieg, 0);
// return Der konvertierte String (z.B. "FAN" statt "KOB") oder unveraendert
                                  const __INDEX = parseInt(this.currZAT / 6);
function getGoalieSkill(name) {
    const __GOALIESKILLS = {
                              'SCH' : 'ABS',
                              'BAK' : 'STS',
                              'KOB' : 'FAN',
                              'ZWK' : 'STB',
                              'DEC' : 'SPL',
                              'GES' : 'REF'
                          };


                                  this.abrZAT = (__INDEX + 1) * 6;
    return getValue(__GOALIESKILLS[name], name);
                                  this.rest  = 5 - (this.currZAT % 6);
}
                                  this.anzahl = ((this.currZAT + this.__ZATMONATVORLAUF > 72 - this.__ZATWARNVORLAUF) ? __ZIEHANZAUFSTIEG : 0);


                                  this.warnDialog = false;    // kein Dialog fuer Aufstiegswarnung
// Liest die Aufwertungen eines Spielers aus und konvertiert je nachdem, ob der Spieler Torwart oder Feldspieler ist
                                  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
// cells: Die Zellen einer Zeile
// colIdxInt: Spaltenindex der gesuchten Werte
// colIdxAuf: Spaltenindex der gesuchten Aufwertungen
// return Spalteneintrag als Zahl (-1 fuer "keine Zahl", undefined fuer "nicht gefunden")
// shortForm: true = abgekuerzt, false = Originalform
function getIntFromHTML(cells, colIdxInt) {
// return Konvertierte Aufwertungen (kurze oder lange Form, aber in jedem Fall fuer Torwart konvertiert)
     const __CELL = getValue(cells[colIdxInt], { });
function getAufwertFromHTML(cells, colIdxAuf, shortForm = true) {
    const __TEXT = __CELL.textContent;
     const __ISGOALIE = isGoalieFromHTML(cells, colIdxAuf);


     if (__TEXT !== undefined) {
     return convertStringFromHTML(cells, colIdxAuf, (shortForm ? convertAufwertung : __ISGOALIE ? convertGoalieSkill : undefined));
        try {
}
            const __VALUE = parseInt(__TEXT, 10);


            if (! isNaN(__VALUE)) {
// Identitaetsfunktion. Konvertiert nichts, sondern liefert einfach den Wert zurueck
                return __VALUE;
// value: Der uebergebene Wert
            }
// return Derselbe Wert
        } catch (ex) { }
function sameValue(value) {
    return value;
}


         return -1;
// Existenzfunktion. Liefert zurueck, ob ein Wert belegt ist
// 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
// value: Eine uebergebene Dezimalzahl
// return Der ganzzeilige Anteil dieser Zahl
function floorValue(value, dot = '.') {
    if ((value === 0) || (value && isFinite(value))) {
         const __VALUE = value.toString();
        const __INDEXDOT = (__VALUE ? __VALUE.indexOf(dot) : -1);
 
        return Number((~ __INDEXDOT) ? __VALUE.substring(0, __INDEXDOT) : __VALUE);
    } else {
        return value;
     }
     }
    return undefined;
}
}


// Liest eine Dezimalzahl aus der Spalte einer Zeile der Tabelle aus
// Liefert einen rechtsbuendigen Text zurueck, der links aufgefuellt wird
// cells: Die Zellen einer Zeile
// value: Ein uebergebener Wert
// colIdxInt: Spaltenindex der gesuchten Werte
// size: Zielbreite (clipping fuer < 0: Abschneiden, falls zu lang)
// return Spalteneintrag als Dezimalzahl (undefined fuer "keine Zahl" oder "nicht gefunden")
// char: Zeichen zum Auffuellen
function getFloatFromHTML(cells, colIdxFloat) {
// return Ein String, der mindestens |size| lang ist (oder genau, falls size < 0, also clipping)
     const __CELL = getValue(cells[colIdxFloat], { });
function padLeft(value, size = 4, char = ' ') {
     const __TEXT = __CELL.textContent;
     const __SIZE = Math.abs(size);
    const __CLIP = (size < 0);
     const __VALUE = (value ? value.toString() : "");
    let i = __VALUE.length;
    let str = "";


     if (__TEXT !== undefined) {
     while (i < __SIZE) {
         try {
         str += char;
            return parseFloat(__TEXT);
         i += char.length;
         } catch (ex) { }
     }
     }
    str = ((i > __SIZE) ? str.slice(0, __SIZE - __VALUE.length - 1) : str) + __VALUE;


     return undefined;
     return (__CLIP ? str.slice(size) : str);
}
}


// Liest einen String aus der Spalte einer Zeile der Tabelle aus
// Liefert eine rechtsbuendigen Zahl zurueck, der links (mit Nullen) aufgefuellt wird
// cells: Die Zellen einer Zeile
// value: Eine uebergebene Zahl
// colIdxStr: Spaltenindex der gesuchten Werte
// size: Zielbreite (Default: 2)
// return Spalteneintrag als String ("" fuer "nicht gefunden")
// char: Zeichen zum Auffuellen (Default: '0')
function getStringFromHTML(cells, colIdxStr) {
// forceClip: Abschneiden erzwingen, falls zu lang?
     const __CELL = getValue(cells[colIdxStr], { });
// return Eine Zahl als String, der mindestens 'size' lang ist (oder genau, falls size < 0, also clipping)
     const __TEXT = __CELL.textContent;
function padNumber(value, size = 2, char = '0') {
     if ((value === 0) || (value && isFinite(value))) {
        return padLeft(value, size, char);
     } else {
        return value;
    }
}


    return getValue(__TEXT.toString(), "");
// Hilfsfunktionen **********************************************************************
}


// Liest ein erstes Element aus der Spalte einer Zeile der Tabelle aus
// Sortiert das Positionsfeld per BubbleSort
// cells: Die Zellen einer Zeile
function sortPositionArray(array) {
// colIdxStr: Spaltenindex der gesuchten Werte
     const __TEMP = [];
// return Spalteneintrag als Element (null fuer "nicht gefunden")
    let transposed = true;
function getElementFromHTML(cells, colIdxStr) {
    // TOR soll immer die letzte Position im Feld sein, deshalb - 1
     const __CELL = getValue(cells[colIdxStr], { });
    let length = array.length - 1;


     return __CELL.firstElementChild;
     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--;
    }
}
}


// Liest die Talentklasse ("wenig", "normal", "hoch") aus der Spalte einer Zeile der Tabelle aus
// Fuegt in die uebergebene Zahl Tausender-Trennpunkte ein
// cells: Die Zellen einer Zeile
// Wandelt einen etwaig vorhandenen Dezimalpunkt in ein Komma um
// colIdxStr: Spaltenindex der gesuchten Werte
function getNumberString(numberString) {
// return Talent als Zahl (-1=wenig, 0=normal, +1=hoch)
    if (numberString.lastIndexOf('.') !== -1) {
function getTalentFromHTML(cells, colIdxTal) {
        // Zahl enthaelt Dezimalpunkt
    const __TEXT = getStringFromHTML(cells, colIdxTal);
        const __VORKOMMA = numberString.substring(0, numberString.lastIndexOf('.'));
        const __NACHKOMMA = numberString.substring(numberString.lastIndexOf('.') + 1, numberString.length);


    return parseInt((__TEXT === 'wenig') ? -1 : (__TEXT === 'hoch') ? +1 : 0, 10);
        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 = "";


// Liest die Einzelskills aus der Spalte einer Zeile der Tabelle aus
        for (let i = 0; i < __TEMP.length; i++) {
// cells: Die Zellen einer Zeile
            if ((i > 0) && (i % 3 === 0)) {
// colIdx: Liste von Spaltenindices der gesuchten Werte mit den Eintraegen
                result += '.';
// 'Einz' (erste Spalte) und 'Zus' (Spalte hinter dem letzten Eintrag)
            }
// return Skills als Array von Zahlen
            result += __TEMP.substr(i, 1);
function getSkillsFromHTML(cells, colIdx) {
        }
    const __RESULT = [];


    for (let i = colIdx.Einz; i < colIdx.Zus; i++) {
         return reverseString(result);
         __RESULT[i - colIdx.Einz] = getIntFromHTML(cells, i);
     }
     }
    return __RESULT;
}
}


// Liest aus, ob der Spieler Torwart oder Feldspieler ist
// Dreht den uebergebenen String um
// cells: Die Zellen einer Zeile
function reverseString(string) {
// colIdxClass: Spaltenindex einer fuer TOR eingefaerbten Zelle
     let result = "";
// return Angabe, der Spieler Torwart oder Feldspieler ist
function isGoalieFromHTML(cells, colIdxClass) {
     return (cells[colIdxClass].className === 'TOR');
}


// Liest einen String aus der Spalte einer Zeile der Tabelle aus, nachdem dieser konvertiert wurde
    for (let i = string.length - 1; i >= 0; i--) {
// cells: Die Zellen einer Zeile
         result += string.substr(i, 1);
// colIdxStr: Spaltenindex der gesuchten Werte
// convertFun: Funktion, die den Wert konvertiert
// return Spalteneintrag als String ("" fuer "nicht gefunden")
function convertStringFromHTML(cells, colIdxStr, convertFun = sameValue) {
    const __CELL = getValue(cells[colIdxStr], { });
    const __TEXT = convertFun(__CELL.textContent, __CELL, colIdxStr, 0);
 
    if (__TEXT !== undefined) {
         __CELL.innerHTML = __TEXT;
     }
     }


     return getValue(__TEXT.toString(), "");
     return result;
}
 
// Liest ein Array von String-Werten aus den Spalten ab einer Zeile der Tabelle aus, nachdem diese konvertiert wurden
// cells: Die Zellen einer Zeile
// colIdxArr: Erster Spaltenindex der gesuchten Werte
// arrOrLength: Entweder ein Datenarray zum Fuellen oder die Anzahl der zu lesenden Werte
// convertFun: Funktion, die die Werte konvertiert
// return Array mit Spalteneintraegen als String ("" fuer "nicht gefunden")
function convertArrayFromHTML(cells, colIdxArr, arrOrLength = 1, convertFun = sameValue) {
    const __ARR = ((typeof arrOrLength === 'number') ? { } : arrOrLength);
    const __LENGTH = getValue(__ARR.length, arrOrLength);
    const __RET = [];
 
    for (let index = 0, colIdx = colIdxArr; index < __LENGTH; index++, colIdx++) {
        const __CELL = getValue(cells[colIdx], { });
        const __TEXT = convertFun(getValue(__ARR[index], __CELL.textContent), __CELL, colIdx, index);
 
        if (__TEXT !== undefined) {
            __CELL.innerHTML = __TEXT;
        }
 
        __RET.push(getValue(__TEXT, "").toString());
    }
 
    return __RET;
}
 
// Konvertiert den Aufwertungstext einer Zelle auf der Jugend-Teamuebersicht
// value: Der Inhalt dieser Zeile ("+1 SKI +1 OPT" bzw. "+2 SKI)
// cell: Zelle, in der der Text stand (optional)
// return Der konvertierte String ("SKI OPT" bzw. "SKI SKI")
function convertAufwertung(value, cell = undefined) {
    if (value !== undefined) {
        value = value.replace(/\+2 (\w+)/, "$1 $1").replace(/\+1 /g, "");
 
        if (cell) {
            if (cell.className === 'TOR') {
                value = convertGoalieSkill(value);
            }
 
            cell.align = 'left';
        }
    }
 
    return value;
}
 
// Konvertiert die allgemeinen Skills in die eines Torwarts
// value: Ein Text, der die Skillnamen enthaelt
// return Der konvertierte String mit Aenderungen (z.B. "FAN" statt "KOB") oder unveraendert
function convertGoalieSkill(value) {
    if (value !== undefined) {
        value = value.replace(/\w+/g, getGoalieSkill);
    }
 
    return value;
}
 
// Konvertiert einen Aufwertungstext fuer einen Skillnamen in den fuer einen Torwart
// name: Allgemeiner Skillname (abgeleitet von den Feldspielern)
// return Der konvertierte String (z.B. "FAN" statt "KOB") oder unveraendert
function getGoalieSkill(name) {
    const __GOALIESKILLS = {
                              'SCH' : 'ABS',
                              'BAK' : 'STS',
                              'KOB' : 'FAN',
                              'ZWK' : 'STB',
                              'DEC' : 'SPL',
                              'GES' : 'REF'
                          };
 
    return getValue(__GOALIESKILLS[name], name);
}
 
// Liest die Aufwertungen eines Spielers aus und konvertiert je nachdem, ob der Spieler Torwart oder Feldspieler ist
// cells: Die Zellen einer Zeile
// colIdxAuf: Spaltenindex der gesuchten Aufwertungen
// shortForm: true = abgekuerzt, false = Originalform
// return Konvertierte Aufwertungen (kurze oder lange Form, aber in jedem Fall fuer Torwart konvertiert)
function getAufwertFromHTML(cells, colIdxAuf, shortForm = true) {
    const __ISGOALIE = isGoalieFromHTML(cells, colIdxAuf);
 
    return convertStringFromHTML(cells, colIdxAuf, (shortForm ? convertAufwertung : __ISGOALIE ? convertGoalieSkill : undefined));
}
 
// Identitaetsfunktion. Konvertiert nichts, sondern liefert einfach den Wert zurueck
// value: Der uebergebene Wert
// return Derselbe Wert
function sameValue(value) {
    return value;
}
 
// Existenzfunktion. Liefert zurueck, ob ein Wert belegt ist
// 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
// value: Eine uebergebene Dezimalzahl
// return Der ganzzeilige Anteil dieser Zahl
function floorValue(value, dot = '.') {
    if ((value === 0) || (value && isFinite(value))) {
        const __VALUE = value.toString();
        const __INDEXDOT = (__VALUE ? __VALUE.indexOf(dot) : -1);
 
        return Number((~ __INDEXDOT) ? __VALUE.substring(0, __INDEXDOT) : __VALUE);
    } else {
        return value;
    }
}
 
// Liefert einen rechtsbuendigen Text zurueck, der links aufgefuellt wird
// value: Ein uebergebener Wert
// size: Zielbreite (clipping fuer < 0: Abschneiden, falls zu lang)
// 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) {
        str += char;
        i += char.length;
    }
    str = ((i > __SIZE) ? str.slice(0, __SIZE - __VALUE.length - 1) : str) + __VALUE;
 
    return (__CLIP ? str.slice(size) : str);
}
 
// Liefert eine rechtsbuendigen Zahl zurueck, der links (mit Nullen) aufgefuellt wird
// value: Eine uebergebene Zahl
// size: Zielbreite (Default: 2)
// char: Zeichen zum Auffuellen (Default: '0')
// forceClip: Abschneiden erzwingen, falls zu lang?
// return Eine Zahl als String, der mindestens 'size' lang ist (oder genau, falls size < 0, also clipping)
function padNumber(value, size = 2, char = '0') {
    if ((value === 0) || (value && isFinite(value))) {
        return padLeft(value, size, char);
    } else {
        return value;
    }
}
 
// Hilfsfunktionen **********************************************************************
 
// Sortiert das Positionsfeld per BubbleSort
function sortPositionArray(array) {
    const __TEMP = [];
    let transposed = true;
    // TOR soll immer die letzte Position im Feld sein, deshalb - 1
    let length = array.length - 1;
 
    while (transposed && (length > 1)) {
        transposed = false;
        for (let i = 0; i < length - 1; i++) {
            // Vergleich Opti-Werte:
            if (array[i][1] < array[i + 1][1]) {
                // vertauschen
                __TEMP[0] = array[i][0];
                __TEMP[1] = array[i][1];
                array[i][0] = array[i + 1][0];
                array[i][1] = array[i + 1][1];
                array[i + 1][0] = __TEMP[0];
                array[i + 1][1] = __TEMP[1];
                transposed = true;
            }
        }
        length--;
    }
}
}


Zeile 6.237: Zeile 5.814:
     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.833:
                     __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.845:
                 }
                 }
             }
             }
            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.855:
                             '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.887:
                                 '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,
                                                   'zeigeJahrgang'     : true,
                                                   'zeigeUxx'             : true,
                                                   'zeigeUxx'           : true,
                                                  'zeigeWarnung'        : true,
                                                   'zeigeBalken'       : true,
                                                  'zeigeWarnungMonat'    : true,
                                                   'absBalken'         : true,
                                                  'zeigeWarnungHome'    : true,
                                                   'zeigeId'           : true,
                                                  'zeigeWarnungDialog'  : true,
                                                   'ersetzeAlter'       : true,
                                                  'zeigeWarnungAufstieg' : true,
                                                   'zeigeAlter'         : true,
                                                  'zeigeWarnungLegende'  : true,
                                                   'zeigeQuote'         : true,
                                                   'zeigeBalken'         : true,
                                                   'zeigePosition'     : true,
                                                   'absBalken'           : true,
                                                   'zeigeZatDone'       : true,
                                                   'zeigeId'             : true,
                                                   'zeigeZatLeft'       : true,
                                                   'ersetzeAlter'         : true,
                                                   'zeigeFixSkills'     : true,
                                                   'zeigeAlter'           : true,
                                                   'zeigeTrainiert'     : true,
                                                   'zeigeQuote'           : true,
                                                   'zeigeAnteilPri'     : true,
                                                   'zeigePosition'       : true,
                                                   'zeigeAnteilSec'     : true,
                                                   'zeigeZatDone'         : true,
                                                   'zeigePrios'         : true,
                                                   'zeigeZatLeft'         : true,
                                                   'anzahlOpti'         : true,
                                                   'zeigeFixSkills'       : true,
                                                   'anzahlMW'           : true,
                                                   'zeigeTrainiert'       : true,
                                                   'zeigeTrainiertEnde' : true,
                                                   'zeigeAnteilPri'       : true,
                                                   'zeigeAnteilPriEnde' : true,
                                                   'zeigeAnteilSec'       : true,
                                                   'zeigeAnteilSecEnde' : true,
                                                   'zeigePrios'           : true,
                                                   'zeigePriosEnde'     : true,
                                                   'anzahlOpti'           : true,
                                                   'zeigeSkillEnde'     : true,
                                                   'anzahlMW'             : true,
                                                   'anzahlOptiEnde'     : true,
                                                   'zeigeTrainiertEnde'   : true,
                                                   'anzahlMWEnde'       : true,
                                                   'zeigeAnteilPriEnde'   : true,
                                                   'zatAges'           : true,
                                                   'zeigeAnteilSecEnde'   : true,
                                                   'trainiert'         : true,
                                                   'zeigePriosEnde'       : true,
                                                   'positions'         : true,
                                                   'zeigeSkillEnde'       : true,
                                                   'skills'             : true,
                                                   'anzahlOptiEnde'       : true,
                                                   'reset'             : true,
                                                   'anzahlMWEnde'         : true,
                                                   'showForm'           : true
                                                  'ziehAnz'              : true,
                                                   'zatAges'             : true,
                                                   'trainiert'           : true,
                                                   'positions'           : true,
                                                   'skills'               : true,
                                                   'reset'               : true,
                                                   'showForm'             : true
                                               },
                                               },
                                 'formWidth'  : 1
                                 'formWidth'  : 1
Zeile 6.417: Zeile 5.960:
                     separateGroups(__ROWS, __BORDERSTRING, __COLUMNINDEX.Land, __ROWOFFSETUPPER, __ROWOFFSETLOWER, 0, 0, existValue);
                     separateGroups(__ROWS, __BORDERSTRING, __COLUMNINDEX.Land, __ROWOFFSETUPPER, __ROWOFFSETLOWER, 0, 0, existValue);
                 }
                 }
                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);
             });
             });
     }
     }
Zeile 6.489: Zeile 6.011:
                                 '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.560: Zeile 6.075:
                                 'menuAnchor' : getTable(0, 'div'),
                                 'menuAnchor' : getTable(0, 'div'),
                                 'showForm'  : {
                                 'showForm'  : {
                                                   'kennzeichenEnde'     : true,
                                                   'kennzeichenEnde'   : 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,
                                                   'zeigeJahrgang'     : true,
                                                   'zeigeUxx'             : true,
                                                   'zeigeUxx'           : true,
                                                  'zeigeWarnung'        : false,
                                                   'zeigeBalken'       : true,
                                                  'zeigeWarnungMonat'    : false,
                                                   'absBalken'         : true,
                                                  'zeigeWarnungHome'    : false,
                                                   'zeigeId'           : true,
                                                  'zeigeWarnungDialog'  : false,
                                                   'ersetzeAlter'       : true,
                                                  'zeigeWarnungAufstieg' : false,
                                                   'zeigeAlter'         : true,
                                                  'zeigeWarnungLegende'  : false,
                                                   'zeigeQuote'         : true,
                                                   'zeigeBalken'         : true,
                                                   'zeigePosition'     : true,
                                                   'absBalken'           : true,
                                                   'zeigeZatDone'       : true,
                                                   'zeigeId'             : true,
                                                   'zeigeZatLeft'       : true,
                                                   'ersetzeAlter'         : true,
                                                   'zeigeFixSkills'     : true,
                                                   'zeigeAlter'           : true,
                                                   'zeigeTrainiert'     : true,
                                                   'zeigeQuote'           : true,
                                                   'zeigeAnteilPri'     : true,
                                                   'zeigePosition'       : true,
                                                   'zeigeAnteilSec'     : true,
                                                   'zeigeZatDone'         : true,
                                                   'zeigePrios'         : true,
                                                   'zeigeZatLeft'         : true,
                                                   'zeigeAufw'         : true,
                                                   'zeigeFixSkills'       : true,
                                                   'zeigeGeb'           : true,
                                                   'zeigeTrainiert'       : true,
                                                   'zeigeTal'           : true,
                                                   'zeigeAnteilPri'       : true,
                                                   'anzahlOpti'         : true,
                                                   'zeigeAnteilSec'       : true,
                                                   'anzahlMW'           : true,
                                                   'zeigePrios'           : true,
                                                   'zeigeTrainiertEnde' : true,
                                                   'zeigeAufw'           : true,
                                                   'zeigeAnteilPriEnde' : true,
                                                   'zeigeGeb'             : true,
                                                   'zeigeAnteilSecEnde' : true,
                                                   'zeigeTal'             : true,
                                                   'zeigePriosEnde'     : true,
                                                   'anzahlOpti'           : true,
                                                   'zeigeSkillEnde'     : true,
                                                   'anzahlMW'             : true,
                                                   'anzahlOptiEnde'     : true,
                                                   'zeigeTrainiertEnde'   : true,
                                                   'anzahlMWEnde'       : true,
                                                   'zeigeAnteilPriEnde'   : true,
                                                   'zatAges'           : true,
                                                   'zeigeAnteilSecEnde'   : true,
                                                   'trainiert'         : true,
                                                   'zeigePriosEnde'       : true,
                                                   'positions'         : true,
                                                   'zeigeSkillEnde'       : true,
                                                   'skills'             : true,
                                                   'anzahlOptiEnde'       : true,
                                                   'reset'             : true,
                                                   'anzahlMWEnde'         : true,
                                                   'showForm'           : true
                                                   'zatAges'             : true,
                                                   'trainiert'           : true,
                                                   'positions'           : true,
                                                   'skills'               : true,
                                                   'reset'               : true,
                                                   'showForm'             : true
                                               },
                                               },
                                 'formWidth'  : 1
                                 'formWidth'  : 1

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)