From 033d7d1a0b24ac05d4b7c70fce5f7f6a2affa9a2 Mon Sep 17 00:00:00 2001
From: TonyFord <tonyford@strategy-investor.de>
Date: Tue, 9 Nov 2021 12:01:45 +0100
Subject: [PATCH] add saison 27

---
 html/26.html                |   4 +-
 html/27.html                |  60 ++++++++
 html/_data/teams/CO.yml     |   6 +
 html/_data/teams/CZ.yml     |   6 +
 html/_data/teams/FR.yml     |   6 +
 html/_data/teams/HU.yml     |   6 +
 html/_data/teams/IT.yml     |   6 +
 html/_data/teams/PL.yml     |   6 +
 html/assets/css/custom.scss |   2 +-
 html/assets/js/script26.js  | 289 +++++++++++++++++++++++++++++++++++
 html/assets/js/script27.js  | 291 ++++++++++++++++++++++++++++++++++++
 11 files changed, 680 insertions(+), 2 deletions(-)
 create mode 100644 html/27.html
 create mode 100644 html/_data/teams/CO.yml
 create mode 100644 html/_data/teams/CZ.yml
 create mode 100644 html/_data/teams/FR.yml
 create mode 100644 html/_data/teams/HU.yml
 create mode 100644 html/_data/teams/IT.yml
 create mode 100644 html/_data/teams/PL.yml
 create mode 100644 html/assets/js/script26.js
 create mode 100644 html/assets/js/script27.js

diff --git a/html/26.html b/html/26.html
index fd6055c..050c353 100644
--- a/html/26.html
+++ b/html/26.html
@@ -1,6 +1,7 @@
 ---
 saison: '26'
 date: '2021-10-11'
+ligaspieltag: 17
 step: 1
 finals_step: 2
 ---
@@ -11,7 +12,7 @@ finals_step: 2
 <head>
   <link rel="stylesheet" href="assets/css/custom.css">
   <script src="assets/js/jquery.min.js"></script>
-  <script src="assets/js/script.js"></script>
+  <script src="assets/js/script26.js"></script>
 </head>
 
 <body>
@@ -21,6 +22,7 @@ finals_step: 2
     var DATA={{ site.data | jsonify }};
     const STEP={{ page.step | default: '1' }};
     const FINALS_STEP={{ page.finals_step | default: '0' }};
+    const LIGASPIELTAG={{ page.ligaspieltag : default: '1' }};
     $(document).ready( function(){
         calculatePartien('{{ page.saison }}', '{{ page.date }}');
         calculateTabelle('{{ page.saison }}', '7');
diff --git a/html/27.html b/html/27.html
new file mode 100644
index 0000000..5e95483
--- /dev/null
+++ b/html/27.html
@@ -0,0 +1,60 @@
+---
+saison: '27'
+date: '2021-11-16T10:00Z'
+ligaspieltag: 18
+step: 1
+finals_step: 2
+---
+
+<!DOCTYPE html>
+<html>
+
+<head>
+  <link rel="stylesheet" href="assets/css/custom.css">
+  <script src="assets/js/jquery.min.js"></script>
+  <script src="assets/js/script27.js"></script>
+</head>
+
+<body>
+
+  <script>
+
+    var DATA={{ site.data | jsonify }};
+    delete DATA.teams.XX;
+    const STEP={{ page.step | default: '1' }};
+    const FINALS_STEP={{ page.finals_step | default: '0' }};
+    const LIGASPIELTAG={{ page.ligaspieltag : default: '1' }};
+    $(document).ready( function(){
+        calculatePartien('{{ page.saison }}', '{{ page.date }}');
+        calculateTabelle('{{ page.saison }}', '7');
+      }
+    );
+
+  </script>
+
+  <div id="partien" class="div_left">
+  </div>
+
+  <div class="div_right">
+    <h2 class="tabelle">Tabelle</h2>
+    <table id="tabelle" class="tabelle">
+      <thead>
+        <tr>
+          <th>Pl.</th>
+          <th>Sp.</th>
+          <th>Team</th>
+          <th>S/U/N</th>
+          <th>Hist.</th>
+          <th>Tore</th>
+          <th>Dif</th>
+          <th>Pkt.</th>
+        </tr>
+      </thead>
+      <tbody>
+      </tbody>
+    </table>
+  </div>
+
+</body>
+
+</html>
diff --git a/html/_data/teams/CO.yml b/html/_data/teams/CO.yml
new file mode 100644
index 0000000..927f003
--- /dev/null
+++ b/html/_data/teams/CO.yml
@@ -0,0 +1,6 @@
+kontinent: Südamerika
+id: CO
+name: Kolumbien (NL)
+link: 'https://ultrasoccer.de/players/?id=1374'
+manager: J..
+start: 27
diff --git a/html/_data/teams/CZ.yml b/html/_data/teams/CZ.yml
new file mode 100644
index 0000000..f809b05
--- /dev/null
+++ b/html/_data/teams/CZ.yml
@@ -0,0 +1,6 @@
+kontinent: Europa
+id: CZ
+name: Tschechien (NL)
+link: 'https://ultrasoccer.de/players/?id=1538'
+manager: Skiller09
+start: 27
diff --git a/html/_data/teams/FR.yml b/html/_data/teams/FR.yml
new file mode 100644
index 0000000..393772d
--- /dev/null
+++ b/html/_data/teams/FR.yml
@@ -0,0 +1,6 @@
+kontinent: Europa
+id: FR
+name: Frankreich (NL)
+link: 'https://ultrasoccer.de/players/?id=2685'
+manager: Schmetterling
+start: 27
diff --git a/html/_data/teams/HU.yml b/html/_data/teams/HU.yml
new file mode 100644
index 0000000..3ac8db6
--- /dev/null
+++ b/html/_data/teams/HU.yml
@@ -0,0 +1,6 @@
+kontinent: Europa
+id: HU
+name: Ungarn (NL)
+link: 'https://ultrasoccer.de/players/?id=2663'
+manager: 'Michel:-)'
+start: 27
diff --git a/html/_data/teams/IT.yml b/html/_data/teams/IT.yml
new file mode 100644
index 0000000..947ff37
--- /dev/null
+++ b/html/_data/teams/IT.yml
@@ -0,0 +1,6 @@
+kontinent: Europa
+id: IT
+name: Italien (NL)
+link: ''
+manager: Hans Eckenpower
+start: 27
diff --git a/html/_data/teams/PL.yml b/html/_data/teams/PL.yml
new file mode 100644
index 0000000..5bd41bf
--- /dev/null
+++ b/html/_data/teams/PL.yml
@@ -0,0 +1,6 @@
+kontinent: Europa
+id: PL
+name: Polen (NL)
+link: 'https://ultrasoccer.de/players/?id=1019'
+manager: M. de Biel
+start: 27
diff --git a/html/assets/css/custom.scss b/html/assets/css/custom.scss
index cd5000c..bec2813 100644
--- a/html/assets/css/custom.scss
+++ b/html/assets/css/custom.scss
@@ -122,7 +122,7 @@ n {
 }
 
 tr.begegnungen {
-  &:nth-child(4n+1), &:nth-child(4n+2){
+  &:nth-child(4n+1), &:nth-child(4n+3){
     background: ghostwhite;
   }
   td a {
diff --git a/html/assets/js/script26.js b/html/assets/js/script26.js
new file mode 100644
index 0000000..75fdab2
--- /dev/null
+++ b/html/assets/js/script26.js
@@ -0,0 +1,289 @@
+const DAY=24*3600*1000;
+
+function calculateTabelle(saison,runde,show=true){
+
+  $.each( DATA.teams,
+    function( i,v ){
+      //if( v[saison] == undefined )
+      DATA.teams[i][saison] = { P: 0, Tp: 0, Tn: 0, Td: 0, Tr: ['X'], active: (( DATA.teams[i].start <= saison )) }
+    }
+  );
+
+  $.each( ( ( DATA.ergebnisse[saison] != undefined ) ? DATA.ergebnisse[saison] : {} ),
+    function(k,z){
+      $.each(z,
+        function(j,w){
+          w.forEach(
+            function( v,i ){
+              if( runde < k || !$.isNumeric(k) ) return;
+              var H=DATA.teams[v.H][saison];
+              var A=DATA.teams[v.A][saison];
+              if( parseInt(v.TH) > parseInt(v.TA) ){
+                H.P+=3;
+                H.Tr.push('S');
+                A.Tr.push('N');
+              } else if( parseInt(v.TH) < parseInt(v.TA) ){
+                A.P+=3;
+                H.Tr.push('N');
+                A.Tr.push('S');
+              } else {
+                H.P+=1;
+                A.P+=1;
+                H.Tr.push('U');
+                A.Tr.push('U');
+              }
+              H.Tp+=parseInt(v.TH); H.Tn+=parseInt(v.TA); H.Td=H.Tp-H.Tn;
+              A.Tp+=parseInt(v.TA); A.Tn+=parseInt(v.TH); A.Td=A.Tp-A.Tn;
+            }
+          );
+        }
+      );
+    }
+  );
+
+  var Tabelle=Object.values(DATA.teams).filter( (a) => ( a.start <= saison ) )
+  .sort(
+    function(a,b){
+      return a[saison].P < b[saison].P ||
+      ( a[saison].P == b[saison].P && a[saison].Td < b[saison].Td ) ||
+      ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp < b[saison].Tp ) ||
+      ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp == b[saison].Tp && a.id > b.id ) ? 1 : -1;
+    }
+  );
+
+  if( !show ){
+    return Tabelle;
+  }
+
+  $('#tabelle tbody').html('');
+
+  Tabelle.forEach(
+    function(v,i){
+      if( ! v[saison].active ) return;
+      var tmp='<td>'+(i+1)+'</td>';
+      var t=v[saison].Tr.map( (a) => ( a != 'X' ) ? 1 : 0 );
+      if( t.length == 0 ) t.push(0);
+      tmp+='<td>'+t.reduce( (a,b) => a+b )+'</td>';
+      tmp+='<td><img class="flags" src="./images/flags/'+v.id.toLowerCase()+'.svg"> <a href="'+v.link+'" target="ultrasoccer">'+v.name.replace(/\(NL\)/g,'<sup>'+v.id+'</sup>')+'</a></td>';
+      tmp+='<td>'+
+      v[saison].Tr.map( (a) => ( ( a == 'S') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+
+      v[saison].Tr.map( (a) => ( ( a == 'U') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+
+      v[saison].Tr.map( (a) => ( ( a == 'N') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'</td>';
+      var hist=v[saison].Tr.map( (a) => '<'+a+'></'+a+'>' ).slice(-6).join('');
+      tmp+='<td>'+hist+'</td>';
+      tmp+='<td>'+v[saison].Tp+'/'+v[saison].Tn+'</td>';
+      tmp+='<td>'+v[saison].Td+'</td>';
+      tmp+='<td>'+v[saison].P+'</td>';
+      $('#tabelle tbody').append('<tr>'+tmp+'</tr>')
+    }
+  );
+
+}
+
+
+var Grps=[];
+
+function calculatePartien(saison,date){
+
+  $('#partien').append('<h2 class="saison s_'+saison+'">Saison '+saison+'</h2>');
+
+
+  // prüfe ob alle Rundenpartien gespielt und generiere neue Rundenpartien
+  var runde=0;
+
+  date=new Date(date).getTime();
+  var steps=0;
+
+  do {
+    var done=[];
+    runde++;
+    // kalkuliere Tabelle der vergangenen Saison
+    var Tabelle=calculateTabelle( ( parseInt(saison)-(( runde == 1 ) ? 0 : 0 ) ).toString(), ((runde == 1) ? 7 : runde-1 ) , false);
+    // stelle die 4er Gruppen zusammen
+
+    Grps=[]
+    if( runde == 1 ){
+      Grps.push( Object.values( DATA.teams ).filter( (c) => c.start<=saison ).sort( (a,b) => ( b.id < a.id ) ? 1 : -1 ) );
+    } else {
+      while( Tabelle.length > 3 ){
+        Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.pop(), Tabelle.pop() ] );
+      }
+    }
+
+    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Runde '+runde+(( Grps.length == 1 ) ? ' (Endrunde)' : '')+'</h3>';
+    $('#partien').append(tmp);
+
+
+    if( runde == 1 ){
+
+      done.push( grpPartien(date,steps,saison,runde,1,[ 1,2, 4,3 ]) ); steps++;
+      done.push( grpPartien(date,steps,saison,runde,2,[ 1,4, 2,3 ]) ); steps++;
+      done.push( grpPartien(date,steps,saison,runde,3,[ 1,3, 2,4 ]) ); steps++;
+      done.push( grpPartien(date,steps,saison,runde,4,[ 2,1, 3,4 ]) ); steps++;
+      done.push( grpPartien(date,steps,saison,runde,5,[ 4,1, 3,2 ]) ); steps++;
+      done.push( grpPartien(date,steps,saison,runde,6,[ 3,1, 4,2 ]) ); steps++;
+
+    }
+
+  } while( done.reduce( (a,b) => a && b ) == true && Grps.length > 1 );
+
+
+  if( done.reduce( (a,b) => a && b ) == true ){
+
+    var Tabelle = calculateTabelle( saison, runde, false );
+
+  } else {
+
+    var Tabelle = [
+      {
+        'kontinent' : 'dummy',
+        'id': 'XX',
+        'name': '<i>Platz 1</i>',
+        'link': '',
+        'manager': 'dummy',
+        'start': 27
+      },
+      {
+        'kontinent' : 'dummy',
+        'id': 'XX',
+        'name': '<i>Platz 2</i>',
+        'link': '',
+        'manager': 'dummy',
+        'start': 27
+      },
+      {
+        'kontinent' : 'dummy',
+        'id': 'XX',
+        'name': '<i>Platz 3</i>',
+        'link': '',
+        'manager': 'dummy',
+        'start': 27
+      },
+      {
+        'kontinent' : 'dummy',
+        'id': 'XX',
+        'name': '<i>Platz 4</i>',
+        'link': '',
+        'manager': 'dummy',
+        'start': 27
+      }
+    ]
+
+  }
+
+  Grps.shift();
+  Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.shift(), Tabelle.shift() ] );
+
+  runde='HF';
+  var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Halbfinale</h3>';
+  $('#partien').append(tmp);
+
+  steps+=FINALS_STEP;
+  done.push( grpPartien( date,steps,saison,runde, 1, [ 1,4, 2,3 ] ) );
+  steps+=FINALS_STEP;
+
+  if( done.reduce( (a,b) => a && b ) == true ){
+    Grps.shift(); Grps.push([]);
+
+    var p1=DATA.ergebnisse[saison][runde][1][0];
+    if( p1.TH >= p1.TA ){ Grps[0].push( DATA.teams[p1.H] ); } else { Grps[0].push( DATA.teams[p1.A] ); }
+
+    var p2=DATA.ergebnisse[saison][runde][1][1];
+    if( p2.TH >= p2.TA ){ Grps[0].push( DATA.teams[p2.H] ); } else { Grps[0].push( DATA.teams[p2.A] ); }
+
+
+    runde='F'
+    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Finale</h3>';
+    $('#partien').append(tmp);
+
+    done.push( grpPartien(date,steps++,saison,runde,1,[ 1,2 ]) );
+
+  } else {
+
+    runde='F'
+    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Finale</h3>';
+    $('#partien').append(tmp);
+
+    var Tabelle = [
+      {
+        'kontinent' : 'dummy',
+        'id': 'XX',
+        'name': '<i>Sieger 1/4</i>',
+        'link': '',
+        'manager': 'dummy',
+        'start': 27
+      },
+      {
+        'kontinent' : 'dummy',
+        'id': 'XX',
+        'name': '<i>Sieger 2/3</i>',
+        'link': '',
+        'manager': 'dummy',
+        'start': 27
+      }
+    ];
+
+    Grps.shift();
+
+    Grps.push( [ Tabelle.shift(), Tabelle.shift() ] );
+
+    done.push( grpPartien(date,steps++,saison,runde,1,[ 1,2 ]) );
+
+  }
+
+
+}
+
+
+function grpPartien( date,steps,saison,runde,spieltag,Bg ){
+
+  var done=true;
+
+  var tmp='';
+  tmp+='<h4 class="spieltag s_'+saison+' r_'+runde+' t_'+spieltag+'">Spieltag '+spieltag+'</h4>';
+  tmp+='<table class="partien s_'+saison+' r_'+runde+' t_'+spieltag+'">';
+
+  do {
+    var h1 = Bg.shift()-1;
+    var a1 = Bg.shift()-1;
+    Grps.forEach(
+      function(v,i){
+
+        if( h1 == -1 || a1 == -1 ) return;
+
+        if( DATA.ergebnisse[saison] == undefined ){
+          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match='';
+        } else if( DATA.ergebnisse[saison][runde] == undefined ){
+          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match='';
+        } else if( DATA.ergebnisse[saison][runde][spieltag] == undefined ){
+          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match='';
+        } else {
+          var result=DATA.ergebnisse[saison][runde][spieltag].filter( (a) => ( a.H == v[h1].id && a.A == v[a1].id ) )[0];
+
+          var th=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TH+'</a>' : result.TH ) : '-' );
+          var ta=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TA+'</a>' : result.TA ) : '-' );
+          var dt=(( result != undefined ) ? new Date(result.T).toJSON().slice(0,10) : '<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i>' );
+          if( result == undefined ) done=false;
+        }
+
+        tmp+='<tr class="begegnungen h_'+v[h1].id+' a_'+v[a1].id+'">';
+        tmp+='<td>'+dt+'</td>';
+        tmp+='<td><sup>'+v[h1].id+'</sup> '+v[h1].name.replace(/\(NL\)/g,'')+' <img class="flags" src="./images/flags/'+v[h1].id.toLowerCase()+'.svg"></td>';
+        tmp+='<td> - </td>';
+        tmp+='<td><img class="flags" src="./images/flags/'+v[a1].id.toLowerCase()+'.svg"> '+v[a1].name.replace(/\(NL\)/g,'')+' <sup>'+v[a1].id+'</sup></td>';
+
+        tmp+='<td>'+th+'</td>';
+        tmp+='<td>:</td>';
+        tmp+='<td>'+ta+'</td>';
+        tmp+='</tr>';
+
+      }
+    );
+  } while( Bg.length > 0 );
+
+
+  tmp+='</table>';
+  $('#partien').append(tmp);
+
+  return done;
+}
diff --git a/html/assets/js/script27.js b/html/assets/js/script27.js
new file mode 100644
index 0000000..9130dbb
--- /dev/null
+++ b/html/assets/js/script27.js
@@ -0,0 +1,291 @@
+const DAY=24*3600*1000;
+
+function calculateTabelle(saison,runde,show=true){
+
+  $.each( DATA.teams,
+    function( i,v ){
+      //if( v[saison] == undefined )
+      DATA.teams[i][saison] = { P: 0, Tp: 0, Tn: 0, Td: 0, Tr: ['X'], active: (( DATA.teams[i].start <= saison )) }
+    }
+  );
+
+  $.each( ( ( DATA.ergebnisse[saison] != undefined ) ? DATA.ergebnisse[saison] : {} ),
+    function(k,z){
+      $.each(z,
+        function(j,w){
+          w.forEach(
+            function( v,i ){
+              if( runde < k || !$.isNumeric(k) ) return;
+              var H=DATA.teams[v.H][saison];
+              var A=DATA.teams[v.A][saison];
+              if( parseInt(v.TH) > parseInt(v.TA) ){
+                H.P+=3;
+                H.Tr.push('S');
+                A.Tr.push('N');
+              } else if( parseInt(v.TH) < parseInt(v.TA) ){
+                A.P+=3;
+                H.Tr.push('N');
+                A.Tr.push('S');
+              } else {
+                H.P+=1;
+                A.P+=1;
+                H.Tr.push('U');
+                A.Tr.push('U');
+              }
+              H.Tp+=parseInt(v.TH); H.Tn+=parseInt(v.TA); H.Td=H.Tp-H.Tn;
+              A.Tp+=parseInt(v.TA); A.Tn+=parseInt(v.TH); A.Td=A.Tp-A.Tn;
+            }
+          );
+        }
+      );
+    }
+  );
+
+  var Tabelle=Object.values(DATA.teams).filter( (a) => ( a.start <= saison+1 ) )
+  .sort(
+    function(a,b){
+      return a[saison].P < b[saison].P ||
+      ( a[saison].P == b[saison].P && a[saison].Td < b[saison].Td ) ||
+      ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp < b[saison].Tp ) ||
+      ( a[saison].P == b[saison].P && a[saison].Td == b[saison].Td && a[saison].Tp == b[saison].Tp && a.id > b.id ) ? 1 : -1;
+    }
+  );
+
+  if( !show ){
+    return Tabelle;
+  }
+
+  $('#tabelle tbody').html('');
+
+  Tabelle.forEach(
+    function(v,i){
+      if( ! v[saison].active ) return;
+      var tmp='<td>'+(i+1)+'</td>';
+      var t=v[saison].Tr.map( (a) => ( a != 'X' ) ? 1 : 0 );
+      if( t.length == 0 ) t.push(0);
+      tmp+='<td>'+t.reduce( (a,b) => a+b )+'</td>';
+      tmp+='<td><img class="flags" src="./images/flags/'+v.id.toLowerCase()+'.svg"> <a href="'+v.link+'" target="ultrasoccer">'+v.name.replace(/\(NL\)/g,'<sup>'+v.id+'</sup>')+'</a></td>';
+      tmp+='<td>'+
+      v[saison].Tr.map( (a) => ( ( a == 'S') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+
+      v[saison].Tr.map( (a) => ( ( a == 'U') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'/'+
+      v[saison].Tr.map( (a) => ( ( a == 'N') ? 1 : 0 ) ).reduce( (a,b) => a+b )+'</td>';
+      var hist=v[saison].Tr.map( (a) => '<'+a+'></'+a+'>' ).slice(-6).join('');
+      tmp+='<td>'+hist+'</td>';
+      tmp+='<td>'+v[saison].Tp+'/'+v[saison].Tn+'</td>';
+      tmp+='<td>'+v[saison].Td+'</td>';
+      tmp+='<td>'+v[saison].P+'</td>';
+      $('#tabelle tbody').append('<tr>'+tmp+'</tr>')
+    }
+  );
+
+}
+
+
+var Grps=[];
+
+function calculatePartien(saison,date){
+
+  $('#partien').append('<h2 class="saison s_'+saison+'">Saison '+saison+'</h2>');
+
+
+  // prüfe ob alle Rundenpartien gespielt und generiere neue Rundenpartien
+  var runde=0;
+
+  date=new Date(date).getTime();
+  var steps=0;
+
+  do {
+    var done=[];
+    runde++;
+    // kalkuliere Tabelle der vergangenen Saison
+    var Tabelle=calculateTabelle( ( parseInt(saison)-(( runde == 1 ) ? 0 : 0 ) ).toString(), ((runde == 1) ? 7 : runde-1 ) , false);
+    // stelle die 4er Gruppen zusammen
+
+    Grps=[]
+    if( runde == 1 ){
+      Grps.push( Object.values( DATA.teams ).sort( (a,b) => ( b.id < a.id ) ? 1 : -1 ) );
+    } else {
+      while( Tabelle.length > 3 ){
+        Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.pop(), Tabelle.pop() ] );
+      }
+    }
+
+    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Runde '+runde+(( Grps.length == 1 ) ? ' (Endrunde)' : '')+'</h3>';
+    $('#partien').append(tmp);
+
+
+    if( runde == 1 ){
+
+      done.push( grpPartien(date,steps,saison,runde,1,[ 2,9, 3,8, 4,7, 5,6 ]) ); steps++;
+      done.push( grpPartien(date,steps,saison,runde,2,[ 1,2, 9,3, 8,4, 7,5 ]) ); steps+=2;
+      done.push( grpPartien(date,steps,saison,runde,3,[ 1,3, 4,9, 5,8, 6,7 ]) ); steps++;
+      done.push( grpPartien(date,steps,saison,runde,4,[ 1,4, 2,3, 9,5, 6,8 ]) ); steps+=2;
+      done.push( grpPartien(date,steps,saison,runde,5,[ 5,1, 2,4, 6,9, 7,8 ]) ); steps++;
+      done.push( grpPartien(date,steps,saison,runde,6,[ 1,6, 2,5, 3,4, 7,9 ]) ); steps+=2;
+      done.push( grpPartien(date,steps,saison,runde,7,[ 7,1, 6,2, 3,5, 8,9 ]) ); steps++;
+      done.push( grpPartien(date,steps,saison,runde,8,[ 8,1, 2,7, 3,6, 4,5 ]) ); steps+=2;
+      done.push( grpPartien(date,steps,saison,runde,9,[ 9,1, 8,2, 3,7, 4,6 ]) );
+
+    }
+
+  } while( done.reduce( (a,b) => a && b ) == true && Grps.length > 1 );
+
+  if( done.reduce( (a,b) => a && b ) == true ){
+
+    var Tabelle = calculateTabelle( saison, runde, false );
+
+  } else {
+
+    var Tabelle = [
+      {
+        'kontinent' : 'dummy',
+        'id': 'XX',
+        'name': '<i>Platz 1</i>',
+        'link': '',
+        'manager': 'dummy',
+        'start': 27
+      },
+      {
+        'kontinent' : 'dummy',
+        'id': 'XX',
+        'name': '<i>Platz 2</i>',
+        'link': '',
+        'manager': 'dummy',
+        'start': 27
+      },
+      {
+        'kontinent' : 'dummy',
+        'id': 'XX',
+        'name': '<i>Platz 3</i>',
+        'link': '',
+        'manager': 'dummy',
+        'start': 27
+      },
+      {
+        'kontinent' : 'dummy',
+        'id': 'XX',
+        'name': '<i>Platz 4</i>',
+        'link': '',
+        'manager': 'dummy',
+        'start': 27
+      }
+    ]
+
+  }
+
+  Grps.shift();
+  Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.shift(), Tabelle.shift() ] );
+
+  runde='HF';
+  var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Halbfinale</h3>';
+  $('#partien').append(tmp);
+
+  steps+=FINALS_STEP;
+  done.push( grpPartien( date,steps,saison,runde, 1, [ 1,4, 2,3 ] ) );
+  steps+=FINALS_STEP;
+
+  if( done.reduce( (a,b) => a && b ) == true ){
+    Grps.shift(); Grps.push([]);
+
+    var p1=DATA.ergebnisse[saison][runde][1][0];
+    if( p1.TH >= p1.TA ){ Grps[0].push( DATA.teams[p1.H] ); } else { Grps[0].push( DATA.teams[p1.A] ); }
+
+    var p2=DATA.ergebnisse[saison][runde][1][1];
+    if( p2.TH >= p2.TA ){ Grps[0].push( DATA.teams[p2.H] ); } else { Grps[0].push( DATA.teams[p2.A] ); }
+
+
+    runde='F'
+    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Finale</h3>';
+    $('#partien').append(tmp);
+
+    done.push( grpPartien(date,steps++,saison,runde,1,[ 1,2 ]) );
+
+  } else {
+
+    runde='F'
+    var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Finale</h3>';
+    $('#partien').append(tmp);
+
+    var Tabelle = [
+      {
+        'kontinent' : 'dummy',
+        'id': 'XX',
+        'name': '<i>Sieger 1/4</i>',
+        'link': '',
+        'manager': 'dummy',
+        'start': 27
+      },
+      {
+        'kontinent' : 'dummy',
+        'id': 'XX',
+        'name': '<i>Sieger 2/3</i>',
+        'link': '',
+        'manager': 'dummy',
+        'start': 27
+      }
+    ];
+
+    Grps.shift();
+
+    Grps.push( [ Tabelle.shift(), Tabelle.shift() ] );
+
+    done.push( grpPartien(date,steps++,saison,runde,1,[ 1,2 ]) );
+
+  }
+
+
+}
+
+
+function grpPartien( date,steps,saison,runde,spieltag,Bg ){
+
+  var done=true;
+
+  var tmp='';
+  tmp+='<h4 class="spieltag s_'+saison+' r_'+runde+' t_'+spieltag+'">Spieltag '+spieltag+'</h4>';
+  tmp+='<table class="partien s_'+saison+' r_'+runde+' t_'+spieltag+'">';
+
+  do {
+    var h1 = Bg.shift()-1;
+    var a1 = Bg.shift()-1;
+    Grps.forEach(
+      function(v,i){
+
+        if( h1 == -1 || a1 == -1 ) return;
+
+        if( DATA.ergebnisse[saison] == undefined ){
+          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match='';
+        } else if( DATA.ergebnisse[saison][runde] == undefined ){
+          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match='';
+        } else if( DATA.ergebnisse[saison][runde][spieltag] == undefined ){
+          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; done=false; var match='';
+        } else {
+          var result=DATA.ergebnisse[saison][runde][spieltag].filter( (a) => ( a.H == v[h1].id && a.A == v[a1].id ) )[0];
+
+          var th=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TH+'</a>' : result.TH ) : '-' );
+          var ta=(( result != undefined ) ? (( result.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+result.MID+'" target="ultrasoccer">'+result.TA+'</a>' : result.TA ) : '-' );
+          var dt=(( result != undefined ) ? new Date(result.T).toJSON().slice(0,10) : '<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i>' );
+          if( result == undefined ) done=false;
+        }
+
+        tmp+='<tr class="begegnungen h_'+v[h1].id+' a_'+v[a1].id+'">';
+        tmp+='<td>'+dt+'</td>';
+        tmp+='<td><sup>'+v[h1].id+'</sup> '+v[h1].name.replace(/\(NL\)/g,'')+' <img class="flags" src="./images/flags/'+v[h1].id.toLowerCase()+'.svg"></td>';
+        tmp+='<td> - </td>';
+        tmp+='<td><img class="flags" src="./images/flags/'+v[a1].id.toLowerCase()+'.svg"> '+v[a1].name.replace(/\(NL\)/g,'')+' <sup>'+v[a1].id+'</sup></td>';
+
+        tmp+='<td>'+th+'</td>';
+        tmp+='<td>:</td>';
+        tmp+='<td>'+ta+'</td>';
+        tmp+='</tr>';
+
+      }
+    );
+  } while( Bg.length > 0 );
+
+
+  tmp+='</table>';
+  $('#partien').append(tmp);
+
+  return done;
+}
-- 
GitLab