diff --git a/html/26.html b/html/26.html
deleted file mode 100644
index b9c1922ac2946aedcd891e1c3aae8918bb669829..0000000000000000000000000000000000000000
--- a/html/26.html
+++ /dev/null
@@ -1,59 +0,0 @@
----
-saison: '26'
-date: '2021-10-11'
-ligaspieltag: 17
-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/script26.js"></script>
-</head>
-
-<body>
-
-  <script>
-
-    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');
-      }
-    );
-
-  </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/26.php b/html/26.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab25f4eb0bf99deb4465f4e99a7c9a32615d4ee5
--- /dev/null
+++ b/html/26.php
@@ -0,0 +1,184 @@
+---
+saison: '26'
+date: '2021-10-11'
+ligaspieltag: 17
+step: 1
+finals_step: 2
+---
+<?php
+
+include_once('functions/db_connect.php');
+include_once('functions/db_methods.php');
+
+$csv=$_POST['csv'];
+$saison='{{ page.saison }}';
+$secret='';
+
+if( !empty($csv) ){
+
+  $secret=$_POST['secret'];
+  $user=db_checkSecret($secret);
+  if( $user ){
+    $C=preg_split('/
+/',$csv);
+    if( trim($C[0]) == 'runde,spieltag,T,H,A,TH,TA,MID' ){
+      foreach( $C as $i=>$v ){
+        if( $i > 0 ) db_addErgebnisse($saison.','.$v,$secret);
+      }
+    } else if( trim($C[0]) == 'MatchID,L,Pos,SpielerID,Spieler,Z+,Z-,T,A,Bk' ) {
+      foreach( $C as $i=>$v ){
+        if( $i > 0 ) db_addStatistik($v,$secret);
+      }
+    } else if( trim($C[0]) == 'TeamID,N,SpielerID,Attr,Spieler,Alter,Pos,S,T,A,Z+,Z-,Zd,Mw' ){
+      foreach( $C as $i=>$v ){
+        if( $i > 0 ) db_addSpieler($v,$secret);
+      }
+    }
+  }
+
+}
+
+?>
+<!DOCTYPE html>
+<html>
+
+<head>
+  <link rel="stylesheet" href="assets/css/custom.css">
+  <script src="assets/js/jquery.min.js"></script>
+  <script src="assets/js/script26.js"></script>
+</head>
+
+<body>
+
+  <script>
+
+    var DATA={{ site.data | jsonify }};
+    var TEAMS=<?=json_encode( db_getFromTeams() )?>;
+    var T2ID={};
+    TEAMS.forEach(
+      function(v){
+        T2ID[v.nt] = v.id;
+      }
+    );
+    var SPIELER=<?=json_encode( db_getFromSpieler() )?>;
+    var ERGEBNISSE=<?=json_encode( db_getFromErgebnisse() )?>;
+    var STAT=<?=json_encode( db_getFromStatistikBySaison($saison))?>;
+    STATISTIK={};
+    STAT.forEach(
+      function(v,i){
+        if( STATISTIK[v.SpielerID] == undefined ) STATISTIK[v.SpielerID]={ 'S' :0, 'T' : 0, 'A' : 0, 'Z' : 0, 'MID' : [] };
+        STATISTIK[v.SpielerID].S++;
+        STATISTIK[v.SpielerID].T+=v.Tore*1;
+        STATISTIK[v.SpielerID].A+=v.Assists*1;
+        STATISTIK[v.SpielerID].Z+=v.Zwk*1;
+        STATISTIK[v.SpielerID].MID.push(v.MID);
+        STATISTIK[v.SpielerID].name=v.name;
+        STATISTIK[v.SpielerID].age=v.age;
+        STATISTIK[v.SpielerID].nt=v.nt;
+      }
+    );
+
+    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');
+        calculateTore('{{ page.saison }}');
+        calculateAssists('{{ page.saison }}');
+        calculateZwk('{{ page.saison }}');
+
+        $('h2.tabelle button').on('click',
+          function(){
+            $('h2.tabelle button').toggleClass('active',false);
+            $(this).toggleClass('active',true);
+            $('table.tabelle').toggleClass('d-none',true);
+            $('#tabelle_'+$(this).text().toLowerCase()).toggleClass('d-none',false);
+          }
+        );
+
+      }
+    );
+
+  </script>
+
+  <form method="POST">
+  <div id="copypaste" class="d-none" ondblclick="$(this).toggleClass('d-none')">
+    <button type="submit">update</button>
+    <input type="text" name="secret" placeholder="secret" value="<?=$secret?>">
+    <textarea name="csv"></textarea>
+  </div>
+  </form>
+
+
+  <div id="partien" class="div_left">
+  </div>
+
+  <div class="div_right">
+    <h2 class="tabelle">Tabelle <button>Zweikampf</button><button>Assists</button><button>Tore</button><button class="active">Punktestand</button></h2>
+
+    <table id="tabelle_punktestand" 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>
+
+    <table id="tabelle_tore" class="tabelle d-none">
+      <thead>
+        <tr>
+          <th>Pl.</th>
+          <th>Sp.</th>
+          <th>Name</th>
+          <th>Team</th>
+          <th>T</th>
+        </tr>
+      </thead>
+      <tbody>
+      </tbody>
+    </table>
+
+    <table id="tabelle_assists" class="tabelle d-none">
+      <thead>
+        <tr>
+          <th>Pl.</th>
+          <th>Sp.</th>
+          <th>Name</th>
+          <th>Team</th>
+          <th>A</th>
+        </tr>
+      </thead>
+      <tbody>
+      </tbody>
+    </table>
+
+    <table id="tabelle_zweikampf" class="tabelle d-none">
+      <thead>
+        <tr>
+          <th>Pl.</th>
+          <th>Sp.</th>
+          <th>Name</th>
+          <th>Team</th>
+          <th>A</th>
+        </tr>
+      </thead>
+      <tbody>
+      </tbody>
+    </table>
+
+  </div>
+
+
+</body>
+
+</html>
diff --git a/html/assets/css/custom.scss b/html/assets/css/custom.scss
index bec28137c11c24eb7e384a6868e67d5c737057ad..95c10eb4906b4ac512967975f043228a9f0e54a8 100644
--- a/html/assets/css/custom.scss
+++ b/html/assets/css/custom.scss
@@ -1,11 +1,16 @@
 ---
 ---
+@import url("fonts/stylesheet.css");
 
 body {
-  font-family: "Helvetica", Helvetica, Arial;
+  font-family: "open_sans";
   font-size: 0.9em;
 }
 
+.d-none {
+  display: none;
+}
+
 .saison {
   background: darkcyan;
   padding: 5px;
@@ -53,6 +58,17 @@ body {
 
 h2.tabelle {
   background: cornflowerblue;
+  button {
+    float: right;
+    border-radius: 0px;
+    border: 1px solid grey;
+    cursor: pointer;
+    border-top-left-radius: 10px;
+    background: darkgrey;
+    &.active {
+      background: white;
+    }
+  }
 }
 
 
@@ -141,3 +157,63 @@ img.flags {
   width: 20px;
   border: 1px solid darkgrey;
 }
+
+#copypaste {
+  position: fixed;
+  z-index:200;
+  width: 100%;
+  height: 100%;
+  top: 0px;
+  left: 0px;
+  padding: 10%;
+  background: rgba(255,255,255,0.8);
+  textarea {
+    width: 80%;
+    height: 70%;
+  }
+  button {
+    vertical-align: top;
+  }
+}
+
+
+tr.stats {
+  td {
+    &:nth-child(5),
+    &:nth-child(7) {
+      text-decoration: underline;
+      text-decoration-color: grey;
+    }
+  }
+}
+
+#tabelle_punktestand {
+  tr {
+    td,th {
+      &:last-child {
+        text-align: right;
+        font-weight: bold;
+      }
+      &:nth-child(1) { width: 30px; text-align: right; }
+      &:nth-child(2) { width: 30px; text-align: right; }
+      &:nth-child(3) { width: 220px; }
+      &:nth-child(4) { width: 50px; }
+      &:nth-child(5) { width: 50px; }
+    }
+  }
+}
+
+#tabelle_tore, #tabelle_assists, #tabelle_zweikampf {
+  tr {
+    td,th {
+      &:last-child {
+        text-align: right;
+        font-weight: bold;
+      }
+      &:nth-child(1) { width: 30px; text-align: right; }
+      &:nth-child(2) { width: 30px; text-align: right; }
+      &:nth-child(3) { width: 280px; }
+      &:nth-child(4) { width: 200px; }
+    }
+  }
+}
diff --git a/html/assets/css/fonts/OpenSans-Regular.ttf b/html/assets/css/fonts/OpenSans-Regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..db433349b7047f72f40072630c1bc110620bf09e
Binary files /dev/null and b/html/assets/css/fonts/OpenSans-Regular.ttf differ
diff --git a/html/assets/css/fonts/stylesheet.css b/html/assets/css/fonts/stylesheet.css
new file mode 100644
index 0000000000000000000000000000000000000000..d06dff9518aad28bbc295e251c87c7bdfcd44565
--- /dev/null
+++ b/html/assets/css/fonts/stylesheet.css
@@ -0,0 +1,3 @@
+---
+---
+/* @font-face kit by Fonts2u (http://www.fonts2u.com) */ @font-face {font-family:"open_sans";src:url("OpenSans-Regular.ttf") format("truetype"); font-weight:normal;font-style:normal;}
diff --git a/html/assets/js/script26.js b/html/assets/js/script26.js
index 75fdab2c093e851153fe5c2ca6db39c85c22fae4..8d668ae351ff61219c8ace72c2d830b89f96d982 100644
--- a/html/assets/js/script26.js
+++ b/html/assets/js/script26.js
@@ -1,86 +1,5 @@
 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){
@@ -103,7 +22,7 @@ function calculatePartien(saison,date){
 
     Grps=[]
     if( runde == 1 ){
-      Grps.push( Object.values( DATA.teams ).filter( (c) => c.start<=saison ).sort( (a,b) => ( b.id < a.id ) ? 1 : -1 ) );
+      Grps.push( Object.values( TEAMS ).filter( (c) => c.start<=saison ).sort( (a,b) => ( b.nt < a.nt ) ? 1 : -1 ) );
     } else {
       while( Tabelle.length > 3 ){
         Grps.push( [ Tabelle.shift(), Tabelle.shift(), Tabelle.pop(), Tabelle.pop() ] );
@@ -137,7 +56,7 @@ function calculatePartien(saison,date){
     var Tabelle = [
       {
         'kontinent' : 'dummy',
-        'id': 'XX',
+        'nt': 'xx',
         'name': '<i>Platz 1</i>',
         'link': '',
         'manager': 'dummy',
@@ -145,7 +64,7 @@ function calculatePartien(saison,date){
       },
       {
         'kontinent' : 'dummy',
-        'id': 'XX',
+        'nt': 'xx',
         'name': '<i>Platz 2</i>',
         'link': '',
         'manager': 'dummy',
@@ -153,7 +72,7 @@ function calculatePartien(saison,date){
       },
       {
         'kontinent' : 'dummy',
-        'id': 'XX',
+        'nt': 'xx',
         'name': '<i>Platz 3</i>',
         'link': '',
         'manager': 'dummy',
@@ -161,7 +80,7 @@ function calculatePartien(saison,date){
       },
       {
         'kontinent' : 'dummy',
-        'id': 'XX',
+        'nt': 'xx',
         'name': '<i>Platz 4</i>',
         'link': '',
         'manager': 'dummy',
@@ -183,14 +102,13 @@ function calculatePartien(saison,date){
   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] ); }
+    Grps.shift(); Grps.push([]);
 
+    var p=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == 1 && a.partie == 1 ) )[0];
+    if( p.TH*1 >= p.TA*1 ){ Grps[0].push( TEAMS.filter( (a) => (a.nt == p.H.toLowerCase() ) )[0] ); } else { Grps[0].push( TEAMS.filter( (a) => (a.nt == p.A.toLowerCase() ) )[0] ); }
+    var p=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == 1 && a.partie == 2 ) )[0];
+    if( p.TH*1 >= p.TA*1 ){ Grps[0].push( TEAMS.filter( (a) => (a.nt == p.H.toLowerCase() ) )[0] ); } else { Grps[0].push( TEAMS.filter( (a) => (a.nt == p.A.toLowerCase() ) )[0] ); }
 
     runde='F'
     var tmp='<h3 class="runde s_'+saison+' r_'+runde+'">Finale</h3>';
@@ -207,16 +125,16 @@ function calculatePartien(saison,date){
     var Tabelle = [
       {
         'kontinent' : 'dummy',
-        'id': 'XX',
-        'name': '<i>Sieger 1/4</i>',
+        'nt': 'xx',
+        'name': '<i>Sieger HF1</i>',
         'link': '',
         'manager': 'dummy',
         'start': 27
       },
       {
         'kontinent' : 'dummy',
-        'id': 'XX',
-        'name': '<i>Sieger 2/3</i>',
+        'nt': 'xx',
+        'name': '<i>Sieger HF2</i>',
         'link': '',
         'manager': 'dummy',
         'start': 27
@@ -227,6 +145,8 @@ function calculatePartien(saison,date){
 
     Grps.push( [ Tabelle.shift(), Tabelle.shift() ] );
 
+
+
     done.push( grpPartien(date,steps++,saison,runde,1,[ 1,2 ]) );
 
   }
@@ -240,17 +160,36 @@ 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+='<h4 class="spieltag s_'+saison+' r_'+runde+' t_'+spieltag+'" ondblclick="getCsv('+saison+',\''+runde+'\','+spieltag+')">Spieltag '+spieltag+'</h4>';
   tmp+='<table class="partien s_'+saison+' r_'+runde+' t_'+spieltag+'">';
+  var partie=0;
 
   do {
     var h1 = Bg.shift()-1;
     var a1 = Bg.shift()-1;
+    partie++;
+
     Grps.forEach(
       function(v,i){
 
         if( h1 == -1 || a1 == -1 ) return;
 
+        var ergebnis=ERGEBNISSE.filter( (a) => ( a.saison == saison && a.runde == runde && a.spieltag == spieltag && a.H.toLowerCase() == v[h1].nt.toLowerCase() && a.A.toLowerCase() == v[a1].nt.toLowerCase() ) );
+
+        if( ergebnis.length == 1 ){
+          ergebnis=ergebnis[0];
+          var th=(( ergebnis.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+ergebnis.MID+'" target="ultrasoccer">'+ergebnis.TH+'</a>' : ergebnis.TH );
+          var ta=(( ergebnis.MID > 0 ) ? '<a href="https://ultrasoccer.de/match/?id='+ergebnis.MID+'" target="ultrasoccer">'+ergebnis.TA+'</a>' : ergebnis.TA );
+          var dt=new Date(ergebnis.T).toJSON().slice(0,10);
+          var st=STAT.filter( (a) => ( a.MID == ergebnis.MID )).length == 12;
+          ergebnis['partie']=partie;
+        } else {
+          var th='-'; var ta='-'; var dt='<i>'+new Date(date+DAY*steps).toJSON().slice(0,10)+'</i> <sup>'+(steps+LIGASPIELTAG)+'</sup>'; var st=false; done=false; var match='';
+        }
+
+
+        /*
+
         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 ){
@@ -263,16 +202,23 @@ function grpPartien( date,steps,saison,runde,spieltag,Bg ){
           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;
+          if( result == undefined ){
+            done=false;
+          } else if( result.TA == '-' || result.TH == '-' ){
+            done=false;
+          }
         }
 
-        tmp+='<tr class="begegnungen h_'+v[h1].id+' a_'+v[a1].id+'">';
+        */
+
+
+        tmp+='<tr class="begegnungen h_'+v[h1].nt+' a_'+v[a1].nt+' '+(( st ) ? 'stats' : '')+'">';
         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 data-id="'+v[h1].nt+'"><sup>'+v[h1].nt.toUpperCase()+'</sup> '+v[h1].name.replace(/\(NL\)/g,'')+' <img class="flags" src="./images/flags/'+v[h1].nt.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 data-id="'+v[a1].nt+'"><img class="flags" src="./images/flags/'+v[a1].nt.toLowerCase()+'.svg"> '+v[a1].name.replace(/\(NL\)/g,'')+' <sup>'+v[a1].nt.toUpperCase()+'</sup></td>';
 
-        tmp+='<td>'+th+'</td>';
+        tmp+='<td data-mid="'+(( ergebnis.MID != undefined ) ? ergebnis.MID : '0' )+'">'+th+'</td>';
         tmp+='<td>:</td>';
         tmp+='<td>'+ta+'</td>';
         tmp+='</tr>';
@@ -281,9 +227,227 @@ function grpPartien( date,steps,saison,runde,spieltag,Bg ){
     );
   } while( Bg.length > 0 );
 
-
   tmp+='</table>';
   $('#partien').append(tmp);
 
   return done;
 }
+
+
+function getCsv(saison, runde, spieltag){
+  var tbl=$('.partien.s_'+saison+'.r_'+runde+'.t_'+spieltag)[0];
+  var csv=
+  Object.values(tbl.rows).map(
+    function(v,i){
+      var T=[];
+      T.push( runde );
+      T.push( spieltag );
+      T.push( v.cells[0].innerText.slice(0,10) );
+      T.push( v.cells[1].dataset.id );
+      T.push( v.cells[3].dataset.id );
+      T.push( v.cells[4].innerText );
+      T.push( v.cells[6].innerText );
+      T.push( v.cells[4].dataset.mid );
+      return T;
+    }
+  ).join('\n');
+  $('#copypaste').toggleClass('d-none');
+  $('#copypaste textarea').text('runde,spieltag,T,H,A,TH,TA,MID\n'+csv);
+}
+
+function calculateTabelle(saison,runde,show=true){
+
+  $.each( TEAMS,
+    function( i,v ){
+      //if( v[saison] == undefined )
+      TEAMS[i][saison] = { P: 0, Tp: 0, Tn: 0, Td: 0, Tr: ['X'], active: (( TEAMS[i].start <= saison )) }
+    }
+  );
+
+  ERGEBNISSE.filter( (a) => ( a.saison == saison && $.isNumeric(a.runde) && a.runde <= runde  ) ).forEach(
+    function( v,i ){
+      var H=TEAMS.filter( (a) => (a.nt == v.H.toLowerCase()) );
+      var A=TEAMS.filter( (a) => (a.nt == v.A.toLowerCase()) );
+      if( H.length == 0 ){
+        alert('Error: Team mit Code '+v.H+' fehlt!!' );
+        return;
+      }
+      if( A.length == 0 ){
+        alert('Error: Team mit Code '+v.A+' fehlt!!' );
+        return;
+      }
+      H=H[0][saison];
+      A=A[0][saison];
+      //var H=DATA.teams[v.H][saison];
+      //var A=DATA.teams[v.A][saison];
+      if( v.TH == '-' || v.TA == '-' ) return;
+      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;
+    }
+  );
+
+
+  /*
+
+  $.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( v.TH == '-' || v.TA == '-' ) return;
+              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(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_punktestand 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.nt.toLowerCase()+'.svg"> <a href="'+v.link+'" target="ultrasoccer">'+v.name.replace(/\(NL\)/g,'<sup>'+v.nt.toUpperCase()+'</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_punktestand tbody').append('<tr>'+tmp+'</tr>')
+    }
+  );
+
+}
+
+function calculateTore(saison){
+  var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].T < b[1].T || ( a[1].T == b[1].T && a[1].S > b[1].S ) ) ).slice(0,10).map(
+    function(v,i){
+      var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) );
+      if( team.length == 0 ){
+        var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
+        var team_name='';
+      } else {
+        var team_flag='<img class="flags" src="./images/flags/'+team[0].nt+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
+        var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>';
+      }
+
+      return '<td>'+
+      [
+        i+1,
+        (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0),
+        team_flag+' '+(( v[1].name != null ) ? v[1].name+' ('+v[1].age+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ),
+        team_name,
+        v[1].T
+      ].join('</td><td>')+'</td>';
+    }
+  );
+  $('#tabelle_tore tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
+}
+
+function calculateAssists(saison){
+  var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].A < b[1].A || ( a[1].A == b[1].A && a[1].S > b[1].S ) ) ).slice(0,10).map(
+    function(v,i){
+      var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) );
+      if( team.length == 0 ){
+        var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
+        var team_name='';
+      } else {
+        var team_flag='<img class="flags" src="./images/flags/'+team[0].nt+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
+        var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>';
+      }
+
+      return '<td>'+
+      [
+        i+1,
+        (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0),
+        team_flag+' '+(( v[1].name != null ) ? v[1].name+' ('+v[1].age+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ),
+        team_name,
+        v[1].A
+      ].join('</td><td>')+'</td>';
+    }
+  );
+  $('#tabelle_assists tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
+}
+
+function calculateZwk(saison){
+  var n=Object.entries( STATISTIK ).sort( (a,b) => ( a[1].Z < b[1].Z || ( a[1].Z == b[1].Z && a[1].S > b[1].S ) ) ).slice(0,10).map(
+    function(v,i){
+      var team=TEAMS.filter( (a) => ( a.nt == v[1].nt ) );
+      if( team.length == 0 ){
+        var team_flag='<img class="flags" src="./images/flags/xx.svg" title="n/a">';
+        var team_name='';
+      } else {
+        var team_flag='<img class="flags" src="./images/flags/'+team[0].nt+'.svg" title="'+team[0].name.split('(NL)')[0].trim()+'">';
+        var team_name='<a href="'+team[0].link+'" target="ultrasoccer">'+team[0].name+'</a>';
+      }
+
+      return '<td>'+
+      [
+        i+1,
+        (( STATISTIK[v[0]] != undefined ) ? STATISTIK[v[0]].S : 0),
+        team_flag+' '+(( v[1].name != null ) ? v[1].name+' ('+v[1].age+')' : '<a href="https://ultrasoccer.de/playerprofile/?id='+v[0]+'" target="ultrasoccer">'+v[0]+'</a>' ),
+        team_name,
+        v[1].Z
+      ].join('</td><td>')+'</td>';
+    }
+  );
+
+  $('#tabelle_zweikampf tbody').html( '<tr>'+n.join('</tr><tr>') + '</tr>' );
+}
diff --git a/html/functions/db_connect.php b/html/functions/db_connect.php
new file mode 100644
index 0000000000000000000000000000000000000000..4bdc470988058bd64cc2ae5286b0b78ee7b05ea6
--- /dev/null
+++ b/html/functions/db_connect.php
@@ -0,0 +1,45 @@
+<?php
+
+class db
+{
+  private $servername = '';
+  private $username = '';
+  private $password = '';
+  private $aes_key = '';
+  private $dbname = '';
+  public $conn;
+
+  function __construct() {
+    // Create connection
+    $this->servername = getenv('MYSQL_HOST').':'.getenv('MYSQL_PORT');
+    $this->username = getenv('MYSQL_USER');
+    $this->password = getenv('MYSQL_PASSWORD');
+    $this->aes_key = getenv('AES_KEY');
+    $this->dbname = getenv('MYSQL_DATABASE');
+
+    $this->conn = new mysqli($this->servername, $this->username, $this->password, $this->dbname);
+    // Check connection
+    if ($this->conn->connect_error) {
+       die('Connection failed: ' . $this->conn->connect_error);
+    }
+  }
+
+  function __destruct() {
+    $this->conn->close();
+  }
+
+  public function query($sql){
+    $sql=preg_replace('/KEY/','"'.$this->aes_key.'"',$sql);
+    return $this->conn->query($sql);
+  }
+
+  public function commit(){
+    return $this->conn->commit();
+  }
+
+  public function autocommit($bool){
+    return $this->conn->autocommit($bool);
+  }
+}
+
+?>
diff --git a/html/functions/db_methods.php b/html/functions/db_methods.php
new file mode 100644
index 0000000000000000000000000000000000000000..11bbedcd6db3450e1bfe84975cb44624b7d09d41
--- /dev/null
+++ b/html/functions/db_methods.php
@@ -0,0 +1,432 @@
+<?php
+
+function db_addPartie( $csv ){
+
+  echo $csv;
+  return;
+
+  $data=array(
+    'member:'.get_0($member),
+    'location:'.$location,
+    'tags:'.$tags,
+    'url:'.$url,
+    'orderlist:'.preg_replace('/\r\n/',PHP_EOL,$orderlist),
+    'price:'.number_format( $price,8,'.','' ),
+    'shipping:'.number_format( $shipping,8,'.','' ),
+    'currency:'.$currency
+  );
+  $datastring=implode(PHP_EOL,$data);
+  $m=db_getFromMembersById( $member );
+
+  $F=new FaircoinAddress($m['fair_address'],false);
+  if( !$F->verifymessage($datastring , $signature ) ){
+    // signature invalid
+    return array( 'success' => false, 'message' => 'signature could not be verified!', 'd' => [ $m['fair_address'], $datastring, $signature ] );
+  }
+
+  $db=new db;
+
+  $signature_hex=bin2hex( base64_decode($signature) );
+  $sql = "INSERT INTO stargate_list ( member, location, tags, url, orderlist, price, shipping, currency, signature ) VALUES ( ".$member.",'".$location."','".$tags."','".$url."','".$orderlist."',".$price.", ".$shipping.",'".$currency."', 0x".$signature_hex.")";
+
+  if ( $db->query($sql) === TRUE) {
+      // success
+      $result=array( 'success' => true, 'message' => 'order verified and added successfully!', 'data' => db_getFromListBySignature($signature));
+  } else {
+      // check if already exists
+      $row=db_getFromListBySignature($signature);
+      if($row){
+        $result=array( 'success' => true, 'message' => 'order already exists and successfully verified!', 'data' => $row );
+      } else {
+        $result=array( 'success' => false, 'message' => 'sql error!' );
+      }
+  }
+
+  unset($db);
+  return $result;
+}
+function db_addErgebnisse( $csv, $secret ){
+
+  $C=preg_split('/,/',$csv);
+  $C[1]='"'.$C[1].'"';
+  $C[3]='"'.$C[3].'"';
+  $C[4]='"'.$C[4].'"';
+  $C[5]='"'.$C[5].'"';
+
+  $user=db_checkSecret($secret);
+  if( empty( $user ) ) return false;
+
+  $C[]=$user['id'];
+
+  $csv=implode($C,',');
+
+
+
+  $db=new db;
+
+  $sql = "REPLACE INTO Ergebnisse VALUES ( ".$csv." )";
+
+  if ( $db->query( $sql ) === TRUE) {
+      // success
+      $result=array( 'success' => true, 'message' => 'Spieltag erfolgreich hinzugefügt!', 'data' => [] );
+  } else {
+      echo 'SQL-Error: '.$sql.'<br>';
+  }
+
+  unset($db);
+  return $result;
+}
+function db_addSpieler( $csv, $secret ){
+
+  $C=preg_split('/,/',$csv);
+  $C[1]='"'.$C[1].'"';
+  $C[2]='0x'.$C[2];
+  $C[4]='"'.$C[4].'"';
+  unset($C[3]);
+  unset($C[6]);
+  unset($C[7]);
+  unset($C[8]);
+  unset($C[9]);
+  unset($C[10]);
+  unset($C[11]);
+  unset($C[12]);
+  unset($C[13]);
+
+  $user=db_checkSecret($secret);
+  if( empty( $user ) ) return false;
+
+  $C[]=$user['id'];
+
+  $csv=implode($C,',');
+
+  $db=new db;
+
+  $sql = "REPLACE INTO Spieler VALUES ( ".$csv." )";
+
+  if ( $db->query( $sql ) === TRUE) {
+      // success
+      $result=array( 'success' => true, 'message' => 'Spieltag erfolgreich hinzugefügt!', 'data' => [] );
+  } else {
+      echo 'SQL-Error: '.$sql.'<br>';
+  }
+
+  unset($db);
+  return $result;
+}
+function db_addStatistik( $csv, $secret ){
+
+  $C=preg_split('/,/',$csv);
+  if( $C[2] == '0' ) return;
+  $C[1]='"'.$C[1].'"';
+  $C[3]='0x'.$C[3];
+  unset($C[4]);
+
+  $user=db_checkSecret($secret);
+  if( empty( $user ) ) return false;
+
+  $ergebnis=db_getFromErgebnisseByMID($C[0]);
+  if( empty( $ergebnis ) || $C[0] == '0' ) return;
+
+  $C[]=$user['id'];
+
+  $csv=implode($C,',');
+
+  $db=new db;
+
+  $sql = "REPLACE INTO Statistik VALUES ( ".$csv." )";
+
+  if ( $db->query( $sql ) === TRUE) {
+      // success
+      $result=array( 'success' => true, 'message' => 'Statistik erfolgreich hinzugefügt!', 'data' => [] );
+  } else {
+      echo 'SQL-Error: '.$sql.'<br>';
+  }
+
+  unset($db);
+  return $result;
+}
+
+
+function db_checkSecret($secret){
+
+  $db=new db;
+
+  $sql = 'SELECT * FROM User WHERE secret="'.$secret.'"';
+
+  $result = $db->query($sql);
+
+  $row = $result->fetch_assoc();
+
+  unset($db);
+  return $row;
+
+}
+function db_getFromTeams(){
+
+  $db=new db;
+
+  $sql = 'SELECT * FROM Teams';
+  $result = $db->query($sql);
+
+  $ROW=Array();
+
+  while( $row = $result->fetch_assoc() ){
+    $ROW[]=$row;
+  }
+
+  unset($db);
+  return $ROW;
+
+}
+function db_getFromSpieler(){
+
+  $db=new db;
+
+  $sql = 'SELECT * FROM Spieler';
+  $result = $db->query($sql);
+
+  $ROW=Array();
+
+  while( $row = $result->fetch_assoc() ){
+    $row['id']=bin2hex($row['id']);
+    $ROW[]=$row;
+  }
+
+  unset($db);
+  return $ROW;
+
+}
+function db_getFromErgebnisse(){
+
+  $db=new db;
+
+  $sql = 'SELECT * FROM Ergebnisse';
+  $result = $db->query($sql);
+
+  $ROW=Array();
+
+  while( $row = $result->fetch_assoc() ){
+    $ROW[]=$row;
+  }
+
+  unset($db);
+  return $ROW;
+
+}
+function db_getFromErgebnisseByMID($mid){
+
+  $db=new db;
+
+  $sql = 'SELECT * FROM Ergebnisse WHERE MID='.$mid;
+  $result = $db->query($sql);
+
+  $ROW=Array();
+
+  while( $row = $result->fetch_assoc() ){
+    $ROW[]=$row;
+  }
+
+  unset($db);
+  return $ROW;
+
+}
+function db_getFromStatistikBySaison($saison){
+
+  $db=new db;
+
+  /*
+  $sql = 'SELECT Statistik.MID, Statistik.SpielerID, Spieler.name, Spieler.nt, Spieler.age, Teams.id, SUM(Statistik.Tore) AS "Tore", SUM(Statistik.Assists) AS "Assists", SUM(Statistik.Zpos - Statistik.Zneg) AS "Zwkbilanz" FROM Statistik
+          INNER JOIN Ergebnisse ON Ergebnisse.MID = Statistik.MID
+          LEFT JOIN Spieler     ON Spieler.id = Statistik.SpielerID
+          LEFT JOIN Teams       ON Teams.id = Spieler.teamID
+          WHERE Ergebnisse.saison = '.$saison.'
+          GROUP BY SpielerID, MID';
+  */
+  $sql='SELECT Statistik.MID, Statistik.SpielerID, Spieler.name, Spieler.nt, Spieler.age, Teams.id, Statistik.Tore, Statistik.Assists, Statistik.Zpos - Statistik.Zneg AS "Zwk" FROM Statistik
+          INNER JOIN Ergebnisse ON Ergebnisse.MID = Statistik.MID
+          LEFT JOIN Spieler     ON Spieler.id = Statistik.SpielerID
+          LEFT JOIN Teams       ON Teams.id = Spieler.teamID
+          WHERE Ergebnisse.saison = '.$saison.'
+          GROUP BY SpielerID, MID';
+
+  $result = $db->query($sql);
+
+  $ROW=Array();
+
+  while( $row = $result->fetch_assoc() ){
+    $row['SpielerID']=bin2hex($row['SpielerID']);
+    $ROW[]=$row;
+  }
+
+  unset($db);
+  return $ROW;
+
+}
+
+function db_updateListSetStatus( $n, $status ){
+  $db=new db;
+
+  $sql = "UPDATE stargate_list SET status='".$status."' WHERE n=".$n;
+
+  if ( $db->query($sql) === TRUE && $db->conn->affected_rows == 1 ) {
+      // success
+      $result=array('success' => true, 'message' => 'orderlist status successfully set!', 'n' => $n, 'status' => $status );
+  } else {
+      // check if already exists
+      $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql );
+  }
+
+  unset($db);
+  return $result;
+}
+function db_updateListSetSupporterTxhash( $n, $supporter, $txhash ){
+  $db=new db;
+
+  $sql = "UPDATE stargate_list SET supporter=".$supporter.", txhash=0x".$txhash." WHERE n=".$n;
+
+  if ( $db->query($sql) === TRUE && $db->conn->affected_rows == 1 ) {
+      // success
+      $result=array('success' => true, 'message' => 'orderlist supporter successfully set!', 'n' => $n, 'supporter' => $supporter );
+  } else {
+      // check if already exists
+      $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql );
+  }
+
+  unset($db);
+  return $result;
+}
+function db_updateMembersSetLatitudeLongitudeByMemberSignature($member, $latitude, $longitude, $location, $default_currency, $signature ){
+
+  $db=new db;
+
+  $sql = "UPDATE stargate_members SET latitude=".$latitude.", longitude=".$longitude.", location='".$location."', default_currency='".$default_currency."', signature=0x".bin2hex(base64_decode($signature)).", status='active' WHERE ( status='active' OR status='init' ) AND id=".$member;
+
+  if ($db->query($sql) === TRUE) {
+      // success
+      $result=array('success' => true, 'message' => 'member profile updated successfully!');
+  } else {
+      // error return false
+      $result=array('success' => false, 'message' => 'member profile could not be updated!', 'info' => $sql );
+  }
+
+  unset($db);
+  return $result;
+
+}
+function db_updateMembersSetSessionkey($member, $sessionkey ){
+
+  $db=new db;
+
+  $sql = "UPDATE stargate_members SET sessionkey=0x".$sessionkey." WHERE ( status='active' OR status='init' ) AND id=".$member;
+
+  if ($db->query($sql) === TRUE) {
+      // success
+      $result=array('success' => true, 'message' => 'member sessionkey updated successfully!');
+  } else {
+      // error return false
+      $result=array('success' => false, 'message' => 'member sessionkey could not be updated!', 'info' => $sql );
+  }
+
+  unset($db);
+  return $result;
+
+}
+function db_updateMembersSetToken( $member, $token ){
+
+  $db=new db;
+  $m=db_getFromMembersById($member);
+  if( regex( $m['status'], 'init|active') ){
+    if( $m['session_expiration'] > time() ){
+      $result=array('success' => true, 'message' => 'member token updated successfully!', 'token' => $m['token'] );
+    } else {
+      $sql = "UPDATE stargate_members SET token='".$token."', session_expiration=UNIX_TIMESTAMP()+".SESSION_EXPIRATION." WHERE ( status='active' OR status='init' ) AND id=".$member;
+      if ($db->query($sql) === TRUE) {
+          // success
+          $result=array('success' => true, 'message' => 'member token updated successfully!', 'token' => $token );
+      } else {
+          // error return false
+          $result=array('success' => false, 'message' => 'member token could not be updated!', 'info' => $sql );
+      }
+    }
+  } else {
+    $result=array('success' => false, 'message' => 'member not active', 'status' => $m['status'] );
+  }
+
+  unset($db);
+  return $result;
+
+}
+
+function db_updateMessagesSetReceipientStatus( $m, $receipient, $receipient_status ){
+
+  $db=new db;
+
+  $sql = "UPDATE stargate_messages SET receipient_status='".$receipient_status."' WHERE receipient=".$receipient." AND m=".$m;
+
+  if ( $db->query($sql) === TRUE && $db->conn->affected_rows == 1 ) {
+      // success
+      $result=array('success' => true, 'message' => 'message successfully marked as read!', 'm' => $m, 'status' => $receipient_status );
+  } else {
+      // check if already exists
+      $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql );
+  }
+
+  unset($db);
+  return $result;
+}
+function db_updateMessagesSetTxhash( $sender_address, $amount, $txhash ){
+
+  $db=new db;
+
+  $sender=db_getFromMembersByFairAddress($sender_address);
+  $msg=db_getFromMessagesBySenderAmount($sender['id'], $amount);
+  if( count( $msg ) != 1 ){
+    return array('success' => false, 'message' => 'message tx on blockchain does not match with database!', 'info' => '' );
+  }
+
+  $sql = "UPDATE stargate_messages SET txhash=0x".$txhash." WHERE m=".$msg['m']." AND fee=".$amount." AND txhash IS NULL";
+
+  if ( $db->query($sql) === TRUE && $db->conn->affected_rows == 1 ) {
+      // success
+      $result=array('success' => true, 'message' => 'message successfully marked as read!', 'm' => $m, 'status' => $receipient_status );
+  } else {
+      // check if already exists
+      $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql );
+  }
+
+  unset($db);
+  return $result;
+}
+function db_updateMessages( $n, $sender, $receipient, $message, $signature, $fee, $txhash ){
+
+  $db=new db;
+
+  $signature_hex=bin2hex( base64_decode($signature) );
+  $sql = "UPDATE stargate_messages SET n".(empty( $n ) ? "=NULL" : "='".$n."'").", message='".$message."', signature=0x".$signature_hex.", txhash=0x".$txhash." WHERE sender=".$sender." AND receipient=".$receipient." AND message IS NULL AND fee=".$fee;
+
+  if ( $db->query($sql) === TRUE) {
+      // success
+      $result=array('success' => true, 'message' => 'message successfully saved!', 'data' => db_getFromMessagesByTxhash($txhash) );
+  } else {
+      // check if already exists
+      $result=array('success' => false, 'message' => 'sql conflict!', 'info' => $sql );
+  }
+
+  unset($db);
+  return $result;
+}
+
+
+function db_removeFromFairauth(){
+  $db=new db;
+
+  $sql = 'DELETE FROM stargate_fairauth WHERE CAST(tstamp as date) < CAST( NOW() as date)';
+  $result = $db->query($sql);
+
+  if( ! $result ) return 0;
+
+  return true;
+}
+
+
+?>