/**
 * Kopieren eines Artikels von einer Kategorie in eine andere
 * 
 * @param $id          ArtikelId des zu kopierenden Artikels
 * @param $to_cat_id   KategorieId in die der Artikel kopiert werden soll
 */
function rex_copyArticle($id, $to_cat_id)
{
    global $REX, $REX_USER;
    $id = (int) $id;
    $to_cat_id = (int) $to_cat_id;
    // Artikel in jeder Sprache kopieren
    foreach ($REX['CLANG'] as $clang => $clang_name) {
        // validierung der id & from_cat_id
        $from_sql = new sql();
        $qry = 'select * from ' . $REX['TABLE_PREFIX'] . 'article where clang="' . $clang . '" and id="' . $id . '"';
        $from_sql->setQuery($qry);
        if ($from_sql->getRows() == 1) {
            // validierung der to_cat_id
            $to_sql = new sql();
            $to_sql->setQuery('select * from ' . $REX['TABLE_PREFIX'] . 'article where clang="' . $clang . '" and startpage=1 and id="' . $to_cat_id . '"');
            if ($to_sql->getRows() == 1) {
                $art_sql = new sql();
                $art_sql->setTable($REX['TABLE_PREFIX'] . 'article');
                if ($new_id == "") {
                    $new_id = $art_sql->setNewId('id');
                }
                $art_sql->setValue('id', $new_id);
                // neuen auto_incrment erzwingen
                $art_sql->setValue('re_id', $to_sql->getValue('id'));
                $art_sql->setValue('path', $to_sql->getValue('path') . $to_sql->getValue('id') . '|');
                $art_sql->setValue('catname', $to_sql->getValue('name'));
                $art_sql->setValue('prior', 99999);
                // Artikel als letzten Artikel in die neue Kat einfügen
                $art_sql->setValue('status', 0);
                // Kopierter Artikel offline setzen
                $art_sql->setValue('createdate', time());
                $art_sql->setValue('createuser', addslashes($REX_USER->getValue('login')));
                $art_sql->setValue('startpage', 0);
                // schon gesetzte Felder nicht wieder überschreiben
                $dont_copy = array('id', 'pid', 're_id', 'catname', 'path', 'prior', 'status', 'createdate', 'createuser', 'startpage');
                foreach (array_diff($to_sql->getFieldnames(), $dont_copy) as $fld_name) {
                    $art_sql->setValue($fld_name, $from_sql->getValue($fld_name));
                }
                $art_sql->setValue("clang", $clang);
                $art_sql->insert();
                // ArticleSlices kopieren
                rex_copyContent($id, $new_id, $clang, $clang);
                // Prios neu berechnen
                rex_newArtPrio($to_cat_id, $clang, 1, 0);
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    // Generated des Artikels neu erzeugen
    rex_generateArticle($id, false);
    // Generated der Kategorien neu erzeugen, da sich derin befindliche Artikel geändert haben
    rex_generateArticle($to_cat_id, false);
    return $new_id;
}
/**
 * Löscht einen Artikel und reorganisiert die Prioritäten verbleibender Geschwister-Artikel
 *
 * @param int $article_id Id des Artikels die gelöscht werden soll
 *
 * @return array Ein Array welches den status sowie eine Fehlermeldung beinhaltet
 */
function rex_deleteArticleReorganized($article_id)
{
    global $REX;
    $return = array();
    $return['state'] = false;
    $return['message'] = '';
    $Art = rex_sql::factory();
    $Art->setQuery('select * from ' . $REX['TABLE_PREFIX'] . 'article where id=' . $article_id . ' and startpage=0');
    if ($Art->getRows() == count($REX['CLANG'])) {
        $return = rex_deleteArticle($article_id);
        $re_id = $Art->getValue('re_id');
        foreach ($REX['CLANG'] as $clang => $clang_name) {
            // ----- PRIOR
            rex_newArtPrio($Art->getValue('re_id'), $clang, 0, 1);
            // ----- EXTENSION POINT
            $return = rex_register_extension_point('ART_DELETED', $return, array('id' => $article_id, 'clang' => $clang, 're_id' => $re_id, 'name' => $Art->getValue('name'), 'status' => $Art->getValue('status'), 'prior' => $Art->getValue('prior'), 'path' => $Art->getValue('path'), 'template_id' => $Art->getValue('template_id')));
            $Art->next();
        }
    }
    return array($return['state'], $return['message']);
}
            $EA->update();
            // ----- PRIOR
            rex_newArtPrio($category_id, $clang, $Position_Article, $thisArt->getValue("prior"));
            rex_generateArticle($article_id);
            // ----- EXTENSION POINT
            $message = rex_register_extension_point('ART_UPDATED', $message, array("id" => $article_id, "status" => $thisArt->getValue("status"), "name" => $article_name, "clang" => $clang, "re_id" => $category_id, "prior" => $Position_Article, "path" => $KATPATH, "template_id" => $template_id));
        } elseif (isset($function) and $function == "delete_article" && $article_id != "" && $KATPERM && !$REX_USER->isValueOf("rights", "editContentOnly[]")) {
            // --------------------- ARTIKEL DELETE
            $message = rex_deleteArticle($article_id);
            $re_id = $thisArt->getValue("re_id");
            // ----- PRIO
            $CL = $REX['CLANG'];
            reset($CL);
            for ($j = 0; $j < count($CL); $j++) {
                $mlang = key($CL);
                rex_newArtPrio($thisArt->getValue("re_id"), $mlang, 0, 1);
                next($CL);
            }
            // ----- EXTENSION POINT
            $message = rex_register_extension_point('ART_DELETED', $message, array("id" => $article_id, "re_id" => $re_id));
        }
    }
}
// --------------------------------------------- KATEGORIE LISTE
if ($KATPERM && !$REX_USER->isValueOf("rights", "editContentOnly[]")) {
    $addc = '<a href="index.php?page=structure&amp;category_id=' . $category_id . '&amp;function=add_cat&amp;clang=' . $clang . '"><img src="pics/folder_plus.gif" width="16" height="16" border="0" alt="' . $I18N->msg("add_category") . '" title="' . $I18N->msg("add_category") . '"></a>';
} else {
    $addc = "&nbsp;";
}
echo "<table class=rex style=table-layout:auto; cellpadding=5 cellspacing=1>\r\n    <tr>\r\n      <th class=icon>{$addc}</th>";
if ($REX_USER->isValueOf("rights", "advancedMode[]")) {
/**
 * Verschieben eines Artikels von einer Kategorie in eine Andere
 *
 * @param int $id          ArtikelId des zu verschiebenden Artikels
 * @param int $from_cat_id KategorieId des Artikels, der Verschoben wird
 * @param int $to_cat_id   KategorieId in die der Artikel verschoben werden soll
 *
 * @return boolean TRUE bei Erfolg, sonst FALSE
 */
function rex_moveArticle($id, $from_cat_id, $to_cat_id)
{
    global $REX;
    $id = (int) $id;
    $to_cat_id = (int) $to_cat_id;
    $from_cat_id = (int) $from_cat_id;
    if ($from_cat_id == $to_cat_id) {
        return false;
    }
    // Artikel in jeder Sprache verschieben
    foreach ($REX['CLANG'] as $clang => $clang_name) {
        // validierung der id & from_cat_id
        $from_sql = rex_sql::factory();
        $from_sql->setQuery('select * from ' . $REX['TABLE_PREFIX'] . 'article where clang="' . $clang . '" and startpage<>1 and id="' . $id . '" and re_id="' . $from_cat_id . '"');
        if ($from_sql->getRows() == 1) {
            // validierung der to_cat_id
            $to_sql = rex_sql::factory();
            $to_sql->setQuery('select * from ' . $REX['TABLE_PREFIX'] . 'article where clang="' . $clang . '" and startpage=1 and id="' . $to_cat_id . '"');
            if ($to_sql->getRows() == 1 || $to_cat_id == 0) {
                if ($to_sql->getRows() == 1) {
                    $re_id = $to_sql->getValue('id');
                    $path = $to_sql->getValue('path') . $to_sql->getValue('id') . '|';
                    $catname = $to_sql->getValue('catname');
                } else {
                    // In RootEbene
                    $re_id = 0;
                    $path = '|';
                    $catname = $from_sql->getValue('name');
                }
                $art_sql = rex_sql::factory();
                //$art_sql->debugsql = 1;
                $art_sql->setTable($REX['TABLE_PREFIX'] . 'article');
                $art_sql->setValue('re_id', $re_id);
                $art_sql->setValue('path', $path);
                $art_sql->setValue('catname', $art_sql->escape($catname));
                // Artikel als letzten Artikel in die neue Kat einfügen
                $art_sql->setValue('prior', '99999');
                // Kopierter Artikel offline setzen
                $art_sql->setValue('status', $from_sql->getValue('status'));
                $art_sql->addGlobalUpdateFields();
                $art_sql->setWhere('clang="' . $clang . '" and startpage<>1 and id="' . $id . '" and re_id="' . $from_cat_id . '"');
                $art_sql->update();
                // Prios neu berechnen
                rex_newArtPrio($to_cat_id, $clang, 1, 0);
                rex_newArtPrio($from_cat_id, $clang, 1, 0);
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    // Caches des Artikels löschen, in allen Sprachen
    rex_deleteCacheArticle($id);
    // Caches der Kategorien löschen, da sich derin befindliche Artikel geändert haben
    rex_deleteCacheArticle($from_cat_id);
    rex_deleteCacheArticle($to_cat_id);
    return true;
}