function clm_api_db_tournament_delDWZ($id, $group = true)
{
    $id = clm_core::$load->make_valid($id, 0, -1);
    if ($group) {
        $table_list = "#__clm_meldeliste_spieler";
        $table_list_id = "lid";
    } else {
        $table_list = "#__clm_turniere_tlnr";
        $table_list_id = "turnier";
    }
    // Löschen der DWZ-Auswertung zur LigaSaison
    $query = "UPDATE " . $table_list . " SET DWZ = 0" . " , I0 = 0" . " , Punkte = 0" . " , Partien = 0" . " , WE = 0" . " , Leistung = 0" . " , EFaktor = 0" . " , Niveau = 0" . " WHERE " . $table_list_id . "= " . $id;
    clm_core::$db->query($query);
    if ($group) {
        $table = clm_core::$db->liga->get($id);
    } else {
        $table = clm_core::$db->turniere->get($id);
    }
    if (!$table->isNew()) {
        $params = new clm_class_params($table->params);
        $params->set("inofDWZ", "");
        $table->params = $params->params();
    }
    return array(true, "m_delDWZ");
}
function clm_api_db_tournament_copy($id, $group = true)
{
    $id = clm_core::$load->make_valid($id, 0, -1);
    if ($group) {
        $table_list = "#__clm_liga";
    } else {
        $table_list = "#__clm_turniere";
    }
    $sql = "SELECT * FROM " . $table_list . " WHERE id=" . $id;
    $table = clm_core::$db->loadAssocList($sql);
    $lang = clm_core::$lang->tournament;
    $table[0]["name"] = $lang->copy2 . " " . $table[0]["name"];
    $table[0]["rnd"] = 0;
    $table[0]["published"] = 0;
    $out = new clm_class_params($table[0]["params"]);
    $out->set("dwz_date", "");
    $out->set("inofDWZ", "");
    $table[0]["params"] = $out->params();
    $keyS = "";
    $valueS = "";
    foreach ($table[0] as $key => $value) {
        if (is_numeric($key) || $key == "id") {
            continue;
        }
        if ($keyS != "") {
            $keyS .= ", ";
        }
        $keyS .= "`" . $key . "`";
        if ($valueS != "") {
            $valueS .= ", ";
        }
        $valueS .= "'" . clm_core::$db->escape($value) . "'";
    }
    $new = "INSERT INTO " . $table_list . " (" . $keyS . ") VALUES (" . $valueS . ")";
    clm_core::$db->query($new);
    return array(true, "");
}
function clm_api_db_tournament_updateDWZ($id, $group = true)
{
    $id = clm_core::$load->make_valid($id, 0, -1);
    if ($group) {
        $table_main = "#__clm_liga";
        $table_list = "#__clm_meldeliste_spieler";
        $table_list_id = "lid";
        $elo = ", FIDEelo=?";
    } else {
        $table_main = "#__clm_turniere";
        $table_list = "#__clm_turniere_tlnr";
        $table_list_id = "turnier";
        $elo = ", FIDEcco=?, FIDEelo=?, FIDEid=?, twz=?";
    }
    // Datum der zu übernehmenden DWZ Daten anhand der Saison festsetzen, eventuell useAsTWZ auslesen
    $lastDWZUpdate = clm_core::$db->saison->get(clm_core::$access->getSeason())->datum;
    if ($group) {
        $table = clm_core::$db->liga->get($id);
    } else {
        $table = clm_core::$db->turniere->get($id);
    }
    $params = new clm_class_params($table->params);
    $params->set("dwz_date", $lastDWZUpdate);
    $table->params = $params->params();
    if (!$group) {
        $useAsTWZ = $params->get("useAsTWZ", "0");
    }
    // Spieler DWZ Aktualisieren
    $query = 'SELECT a.zps as zps, a.mgl_nr as mgl_nr, b.DWZ as dwz, b.FIDE_Elo as FIDEelo, b.FIDE_ID as FIDEid, b.FIDE_Land as FIDEcco, b.DWZ_Index as dwz_index FROM ' . $table_list . ' as a' . ' INNER JOIN #__clm_dwz_spieler as b' . ' ON a.sid=b.sid AND a.zps=b.zps AND a.mgl_nr = b.Mgl_Nr ' . ' WHERE a.' . $table_list_id . ' = ' . $id;
    $players = clm_core::$db->loadObjectList($query);
    $sql = "UPDATE " . $table_list . " SET start_dwz=?, start_I0=?" . $elo . " WHERE " . $table_list_id . "=? AND zps=? AND mgl_nr=?";
    $stmt = clm_core::$db->prepare($sql);
    // Ergebnis Schreiben
    foreach ($players as $value) {
        if ($group) {
            $stmt->bind_param('iiiisi', $value->dwz, $value->dwz_index, $value->FIDEelo, $id, $value->zps, $value->mgl_nr);
        } else {
            // TWZ Aktualisieren
            $twz = clm_core::$load->gen_twz($useAsTWZ, $value->dwz, $value->FIDEelo);
            $stmt->bind_param('iisiiiisi', $value->dwz, $value->dwz_index, $value->FIDEcco, $value->FIDEelo, $value->FIDEid, $twz, $id, $value->zps, $value->mgl_nr);
        }
        $stmt->execute();
    }
    $stmt->close();
    // Berechne oder Lösche die inoff. DWZ nach dieser Änderung
    if ($group) {
        $params = clm_core::$db->liga->get($id)->params;
    } else {
        $params = clm_core::$db->turniere->get($id)->params;
    }
    $turParams = new clm_class_params($params);
    $autoDWZ = $turParams->get("autoDWZ", 0);
    if ($autoDWZ == 0) {
        clm_core::$api->direct("db_tournament_genDWZ", array($id, $group));
    } else {
        if ($autoDWZ == 1) {
            clm_core::$api->direct("db_tournament_delDWZ", array($id, $group));
        }
    }
    return array(true, "m_updateDWZSuccess");
}
function clm_api_db_tournament_copy($id, $group = true)
{
    $id = clm_core::$load->make_valid($id, 0, -1);
    if ($group) {
        $table_list = "#__clm_liga";
    } else {
        $table_list = "#__clm_turniere";
    }
    $sql = "SELECT * FROM " . $table_list . " WHERE id=" . $id;
    $table = clm_core::$db->loadAssocList($sql);
    $before_ID = $id;
    $lang = clm_core::$lang->tournament;
    $table[0]["name"] = $lang->copy2 . " " . $table[0]["name"];
    $table[0]["rnd"] = 0;
    $table[0]["published"] = 0;
    $out = new clm_class_params($table[0]["params"]);
    $out->set("dwz_date", "");
    $out->set("inofDWZ", "");
    $table[0]["params"] = $out->params();
    $keyS = "";
    $valueS = "";
    foreach ($table[0] as $key => $value) {
        if (is_numeric($key) || $key == "id") {
            continue;
        }
        if ($keyS != "") {
            $keyS .= ", ";
        }
        $keyS .= "`" . $key . "`";
        if ($valueS != "") {
            $valueS .= ", ";
        }
        $valueS .= "'" . clm_core::$db->escape($value) . "'";
    }
    $new = "INSERT INTO " . $table_list . " (" . $keyS . ") VALUES (" . $valueS . ")";
    clm_core::$db->query($new);
    $after_ID = clm_core::$db->insert_id();
    if (!$group) {
        return array(true, "");
    }
    if ($after_ID !== false and $after_ID != 0 and $after_ID != $before_ID) {
        // Runden und Rundentermine für neuen Mannschaftswettbewerb anlegen
        clm_core::$api->db_tournament_genRounds($after_ID, true);
        // copy Rundentermine für Mannschaftswettbewerbe
        $sql = "SELECT * FROM #__clm_runden_termine WHERE liga=" . $id . " ORDER BY nr ASC";
        $runden = clm_core::$db->loadAssocList($sql);
        // alle Runden durchgehen
        foreach ($runden as $runde) {
            $new = "UPDATE #__clm_runden_termine " . " SET name = '" . $runde["name"] . "'" . ", datum = '" . $runde["datum"] . "'" . ", startzeit = '" . $runde["startzeit"] . "'" . ", deadlineday = '" . $runde["deadlineday"] . "'" . ", deadlinetime = '" . $runde["deadlinetime"] . "'" . ", published = " . $runde["published"] . ", ordering = " . $runde["ordering"] . ", enddatum = '" . $runde["enddatum"] . "'" . " WHERE liga = " . $after_ID . " AND nr = " . $runde["nr"];
            clm_core::$db->query($new);
        }
        // Mannschaften anlegen
        for ($x = 1; $x < 1 + $table[0]['teil']; $x++) {
            $man_name = $lang->LIGEN_STD_TEAM . " " . $x;
            if ($x < 10) {
                $man_nr = $after_ID . '0' . $x;
            } else {
                $man_nr = $after_ID . $x;
            }
            $newt = " INSERT INTO #__clm_mannschaften " . " (`sid`,`name`,`liga`,`zps`,`liste`,`edit_liste`,`man_nr`,`tln_nr`,`mf`,`published`) " . " VALUES ('" . $table[0]['sid'] . "','{$man_name}','{$after_ID}','1','0','0','{$man_nr}','{$x}','0','0') ";
            clm_core::$db->query($newt);
        }
    }
    return array(true, "before_ID:" . $before_ID . "  after_ID:" . $after_ID);
}
function clm_api_db_tournament_genDWZ($id, $group = true)
{
    $id = clm_core::$load->make_valid($id, 0, -1);
    if ($group) {
        $table_main = "#__clm_liga";
        $table_dates = "#__clm_runden_termine";
        $table_dates_id = "liga";
        $table_list = "#__clm_meldeliste_spieler";
        $table_list_id = "lid";
        $table_round = "#__clm_rnd_spl";
        $table_round_id = "lid";
        $playerId = "zps=? AND mgl_nr=? AND lid=?";
        $birthAndID = "";
    } else {
        $table_main = "#__clm_turniere";
        $table_dates = "#__clm_turniere_rnd_termine";
        $table_dates_id = "turnier";
        $table_list = "#__clm_turniere_tlnr";
        $table_list_id = "turnier";
        $table_round = "#__clm_turniere_rnd_spl";
        $table_round_id = "turnier";
        $playerId = "snr=? AND turnier=?";
        $birthAndID = ", birthYear, snr";
    }
    // Alte Ergebnisse entfernen
    clm_core::$api->db_tournament_delDWZ($id, $group);
    // Liga Punktebereich auslesen
    $query = 'SELECT sid' . ' FROM ' . $table_main . ' WHERE id=' . $id;
    $liga = clm_core::$db->loadObjectList($query);
    if (count($liga) == 0) {
        return array(true, "e_calculateDWZNoLiga");
    }
    $liga = $liga[0];
    // Vermeintliches Ende bestimmen
    $query = 'SELECT MAX(datum) as date' . ' FROM ' . $table_dates . ' WHERE ' . $table_dates_id . '=' . $id;
    $datum = clm_core::$db->loadObjectList($query);
    if (count($datum) == 0) {
        return array(true, "e_calculateDWZNoRound");
    }
    $year = substr($datum[0]->date, 0, 4);
    if ($year == "0000") {
        $year = date('Y');
        // Falls kein Jahr angegeben wurde
    } else {
        $year = intval($year);
    }
    // Lese alle beteiligten Spieler aus
    $query = 'SELECT zps, mgl_nr, start_dwz, start_I0, FIDEelo' . $birthAndID . ' FROM ' . $table_list . ' WHERE ' . $table_list_id . '=' . $id;
    $spieler = clm_core::$db->loadObjectList($query);
    $dwz = new clm_class_dwz_rechner();
    if (count($spieler) == 0) {
        return array(false, "e_DWZnoPlayer");
    }
    // Spieler zur DWZ Auswertung hinzufügen
    for ($i = 0; $i < count($spieler); $i++) {
        // SWT Importe besitzen keinen Index, falls die DWZ größer als 0 ist muss es jedoch einen geben.
        if ($spieler[$i]->start_I0 == 0 && $spieler[$i]->start_dwz > 0) {
            $spieler[$i]->start_I0 = 22;
        }
        if ($group) {
            $query = 'SELECT Geburtsjahr' . ' FROM #__clm_dwz_spieler' . ' WHERE sid=' . $liga->sid . ' AND ZPS="' . clm_core::$db->escape($spieler[$i]->zps) . '"' . ' AND Mgl_Nr="' . clm_core::$db->escape($spieler[$i]->mgl_nr) . '"';
            $birth = clm_core::$db->loadObjectList($query);
            if (count($birth) == 0) {
                // Spieler in der Saison gelöscht?
                $birth = 0;
                // Spieler wird als älter als 25 angenommen
            } else {
                $birth = $birth[0]->Geburtsjahr;
            }
            $dwz->addPlayer($spieler[$i]->zps . ":" . $spieler[$i]->mgl_nr, $year - $birth, $spieler[$i]->start_dwz, $spieler[$i]->start_I0);
        } else {
            if (intval($spieler[$i]->birthYear) == 0) {
                $spieler[$i]->birthYear = $year - 100;
            }
            $dwz->addPlayer("p" . $spieler[$i]->snr, $year - $spieler[$i]->birthYear, $spieler[$i]->start_dwz, $spieler[$i]->start_I0, $spieler[$i]->FIDEelo);
        }
        // addPlayer($id, $A, $R_o, $Index)
    }
    // Wer hat sich diese Struktur ausgedacht?
    if ($group) {
        // Lese alle relevanten Partien aus
        $query = 'SELECT zps, spieler, gzps, gegner, ergebnis' . ' FROM ' . $table_round . ' WHERE ' . $table_round_id . '=' . $id . ' AND heim = 1';
    } else {
        // Lese alle relevanten Partien aus
        $query = 'SELECT ergebnis, spieler, gegner' . ' FROM ' . $table_round . ' WHERE ' . $table_round_id . '=' . $id . ' AND ergebnis IS NOT NULL' . ' AND heim = 1';
    }
    $partien = clm_core::$db->loadObjectList($query);
    // Partien zur DWZ Auswertung hinzufügen
    $someMatch = false;
    for ($i = 0; $i < count($partien); $i++) {
        list($punkte, $gpunkte) = clm_core::$load->gen_result($partien[$i]->ergebnis, 0);
        if ($punkte[0] == -1) {
            continue;
        }
        // addMatch($id1, $id2, $result)
        if ($group) {
            $dwz->addMatch($partien[$i]->zps . ":" . $partien[$i]->spieler, $partien[$i]->gzps . ":" . $partien[$i]->gegner, $punkte, $gpunkte);
        } else {
            $dwz->addMatch("p" . $partien[$i]->spieler, "p" . $partien[$i]->gegner, $punkte, $gpunkte);
        }
        $someMatch = true;
    }
    $result = $dwz->getAllPlayerObject();
    if (!$someMatch) {
        return array(false, "e_DWZnoMatch");
    }
    $sql = "UPDATE " . $table_list . " SET DWZ=?, I0=?, Punkte=?, Partien=?, We=?, Leistung=?, EFaktor=?, Niveau=? WHERE " . $playerId;
    $stmt = clm_core::$db->prepare($sql);
    // Ergebnis Schreiben
    foreach ($result as $id2 => $value) {
        // Korrektur Leistung: Anzeige bei weniger als 5 Spielen oder nur Siegen/Niederlagen nicht gewollt
        if ($value->n < 5 || $value->W == 0 || $value->W == $value->n) {
            $value->R_p = 0;
        }
        if ($group) {
            $id2 = explode(":", $id2);
            $stmt->bind_param('iididiiisii', $value->R_n, $value->R_nI, $value->W, $value->n, $value->W_e, $value->R_p, $value->E, $value->R_c, $id2[0], $id2[1], $id);
        } else {
            $id2 = explode("p", $id2);
            $stmt->bind_param('iididiiiii', $value->R_n, $value->R_nI, $value->W, $value->n, $value->W_e, $value->R_p, $value->E, $value->R_c, $id2[1], $id);
        }
        $stmt->execute();
    }
    $stmt->close();
    if ($group) {
        $table = clm_core::$db->liga->get($id);
    } else {
        $table = clm_core::$db->turniere->get($id);
    }
    if (!$table->isNew()) {
        $params = new clm_class_params($table->params);
        $params->set("inofDWZ", "1");
        $table->params = $params->params();
    }
    return array(true, "m_calculateDWZSuccess");
}