<?php
/**
 * This file is part of
 * pragmaMx - Web Content Management System.
 * Copyright by pragmaMx Developer Team - http://www.pragmamx.org
 *
 * pragmaMx is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * $Revision: 1.19 $
 * $Author: tora60 $
 * $Date: 2008/01/28 15:04:38 $
 */

/**
 * kein Test wegen direktaufruf, weil diese Datei bereits in der mod.php
 * includet wird, wenn die mainfile noch nicht geladen ist und auch keine
 * Fehler verursachen kann
 *
 * zur Kontrollausgabe, um zu sehen, welche Regeln importiert wurden und was
 * in $content steht kann man die Variable "mod_rewrite_check" per GET uebergeben
 */

/**
 * Variablen deklarieren, weil in Funktion includet wird :-(
 */
global $modrew_prepareauto, $modrew_alternate;

/**
 * die URL's automatisch generieren fuer alles was ueber die modules.php laeuft?
 */
$modrew_prepareauto = true;

/**
 * Ansonsten werden nur die Ersetzungen des Array's $replace_arr beachtet und
 * es muss die .htaccess Dateie geaendert bzw. ergaenzt werden. Dieser Teil
 * sollte dann auskommentiert/entfernt werden:
 */
// dynamisches ersetzen in mod.php
// RewriteRule ^([^-]+)-(.+)\.html$ mod.php?$1&________________________$2 [L]
// RewriteRule ^([^-]+)\.html$ mod.php?$1 [L]
// RewriteRule ^([^-]+)\.html$ mod.php?$1 [L]
/**
 * durch was sollen bei automatischer Ersetzung, die erwuenschten Bindestriche in der URL ersetzt werden?
 */
$modrew_alternate = '~';

/**
 * Array mit allen Schluesseln und Werten zum Suchen & ersetzen zurueckgeben
 */
function mxGetModRewriteArray()
{
    /**
     * der zu suchende regulaere Ausdruck ist der Schluessel des Arrays der
     * ersetzende Wert ist der Wert des Arrays
     */
    // das Array initialisieren
    $replace_arr = array();
    // der Ordner mit den mod_rewrite rules
    $dir = dirname(__FILE__) . '/rewrite';
    // den Ordner oeffnen und in einer Schleife durchlaufen
    $handle = opendir($dir);
    if (!$handle) {
        if (MX_IS_ADMIN) {
            die('mod_rewrite Error:<br />folder <i>"' . $dir . '"</i> is missing!');
        }
        return $replace_arr;
    }
    // eventuell durch das includen der Dateien entstehenden output puffern
    ob_start();
    while (false !== ($file = readdir($handle))) {
        if (preg_match("#\.php$#", $file)) {
            // alle gefundenen php Dateien includen
            include($dir . '/' . $file);
            // wenn es eine Datei von Google-Tap ist...
            if (isset($urlin, $urlout)) {
                // aus den darin enthaltenen beiden Arrays, das entsprechende Array fuer mx-Modrewrite generieren
                foreach ($urlin as $i => $in) {
                    if (isset($urlout[$i])) {
                        $replace_arr[$in] = $urlout[$i];
                    }
                }
                // unbedingt vor dem naechsten Schleifendurchlauf aufraeumen
                unset($urlin, $urlout);
            }
        }
    }
    // den Ordner mit den rule wieder schliessen
    closedir($handle);
    // evtl. entstandenen output verwerfen
    ob_end_clean();
    // das neue Array zurueckgeben
    return $replace_arr;
}

/**
 * Alle in dem uebergebenen String enthaltenen Links umschreiben
 */
function mxPrepareModRewrite($content)
{
    global $modrew_prepareauto, $modrew_alternate;
    // wenn kein Content
    if (empty($content)) {
        return $content;
    }
    // die Regeln importieren
    static $replace_arr;
    if (!isset($replace_arr)) {
        $replace_arr = mxGetModRewriteArray();
    }
    // zur Kontrollausgabe, um zu sehen, welche Regeln importiert wurden und was in $content steht
    if (isset($_GET['mod_rewrite_check']) && MX_IS_ADMIN) {
        var_dump($replace_arr, $content);
    }

    if (!empty($replace_arr)) {
        $patterns = array_keys($replace_arr);
        $replaces = array_values($replace_arr);
        $content = @preg_replace($patterns, $replaces, $content);
    }
    // nur wenn die Ersetzungen automatisch generiert werden sollen
    // $modrew_prepareauto muss dazu auf TRUE gesetzt werden
    if ($modrew_prepareauto && $content) {
        // // ab hier werden die Ersetzungen automatisch generiert, nach Moeglichkeit hier nichts aendern !
        // $pattern  = '!(<a(?:[^>]+)href=["\']|<link>)(?:'.MX_BASE_URL.')?modules\.php\?([^'.$modrew_alternate.'\.\'"-%]+)(["\']|</link>)!i';
        $pattern = '!(<a(?:[^>]+)href=["\']|<link>)(?:' . preg_quote(MX_BASE_URL, '!') . ')?modules\.php\?((?:[[:alnum:]\=&_.;]|&amp;)+)(#[^"\']+)?(["\']|</link>)!i';

        if (!preg_match_all($pattern, $content, $matches)) {
            return $content;
        }
        foreach($matches[2] as $i => $value) {
            // gewuenschte Bindestriche ersetzen
            $x = str_replace(array('-', '&amp;'), array($modrew_alternate, '&'), $value);
            $arr = explode('&', $x);
            $name = '';
            $newarr = array();
            $ilink = '';
            foreach($arr as $para) {
                if (($para === 'file=index') || ($para === 'op=modload')) {
                    continue;
                }
                $xar = explode('=', $para);
                if (!isset($xar[1])) {
                    // falls kein Wert zum Parameter vorhanden ist
                    $xar[1] = '';
                } else if (isset($xar[2])) {
                    // falls zusaetzliche IstGleich-Zeichen im Wert vorhanden sind
                    $uups = $xar;
                    array_shift($uups);
                    // das Array neu zusammensetzen
                    $xar = array($xar[0], implode('=', $uups));
                }
                if ($xar[0] === 'name') {
                    $name = $xar[1];
                } else {
                    $check = explode('#', $xar[1]);
                    if (isset($check[1])) {
                        $ilink = '#' . $check[1];
                        $xar[1] = $check[0];
                    }
                    $newarr[] = $xar[0] . '-' . $xar[1];
                }
            }
            $newstr = $name;
            if (count($newarr)) {
                $newstr .= '-' . (implode('-', $newarr));
            }
            $newstr .= '.html';
            // Extralange Parameter ignorieren
            if (strlen($newstr) < 255) {
                // der zu ersetzende String
                $old[$i] = $matches[0][$i];
                // der neue String
                $new[$i] = $matches[1][$i] . MX_BASE_URL . $newstr . $ilink . $matches[3][$i] . $matches[4][$i];
            }
        }
        if (isset($old)) {
            $content = str_replace($old, $new, $content);

// Start mod_rewrite Erweiterung (News, Downloads, Web_Links, Content)
// Umlaute
$umlaute = array("ä", "ü", "ö", "Ä", "Ü", "Ö", "ß", "&");
$ersetzung = array("ae", "ue", "oe", "Ae", "Ue", "Oe", "ss", "und");
//DOWNLOADS	DETAILS LID
    global $prefix;
			preg_match_all('#Downloads-op-view-lid-(\d*)#', $content, $down, PREG_SET_ORDER);
			foreach ($down as $down1){

			$down2[0] = preg_replace('#Downloads-op-view-lid-#', '', $down1[0]);
			$abfrage = "SELECT title, lid FROM " . $prefix . "_downloads_downloads WHERE lid = '$down2[0]'";
  				$ergebnis = mysql_query($abfrage);
  					while($row = mysql_fetch_array($ergebnis))
    				{

						$titel_down_rewrite = $row["title"];
						$titel_down_rewrite = str_replace($umlaute, $ersetzung, $titel_down_rewrite);
						$titel_down_rewrite = preg_replace('#\W#', "-", $titel_down_rewrite);
						$titel_down_rewrite = preg_replace('#---#', "-", $titel_down_rewrite);
						$titel_down_rewrite = preg_replace('#--#', "-", $titel_down_rewrite);
						$titel_down_fert = "Downloads-lid-";
						$titel_down_fert.= "$titel_down_rewrite-";
						$titel_down_fert.= $down2[0];
						$replace = "#".$down1[0]."(?!\d)#";
						$content = preg_replace($replace, $titel_down_fert, $content);
									}

					}
//Downloads Categorie (CID)
preg_match_all('#Downloads-cid-(\d*)#', $content, $down, PREG_SET_ORDER);
			foreach ($down as $down1){

			$down2[0] = preg_replace('#Downloads-cid-#', '', $down1[0]);
			$abfrage = "SELECT title, cid FROM " . $prefix . "_downloads_categories WHERE cid = '$down2[0]'";
  				$ergebnis = mysql_query($abfrage);
  					while($row = mysql_fetch_array($ergebnis))
    				{

						$titel_down_rewrite = $row["title"];
						$titel_down_rewrite = str_replace($umlaute, $ersetzung, $titel_down_rewrite);
						$titel_down_rewrite = preg_replace('#\W#', "-", $titel_down_rewrite);
						$titel_down_rewrite = preg_replace('#---#', "-", $titel_down_rewrite);
						$titel_down_rewrite = preg_replace('#--#', "-", $titel_down_rewrite);
						$titel_down_fert = "Downloads-cid-";
						$titel_down_fert.= "$titel_down_rewrite-";
						$titel_down_fert.= $down2[0];
						$replace = "#".$down1[0]."(?!\d)#";
						$content = preg_replace($replace, $titel_down_fert, $content);
									}

					}
 /**
 * ############################################################################################
 * ############################################################################################
 * ############################################################################################
 *  Content-Modification             Start
 * ############################################################################################
 * ############################################################################################
 * ############################################################################################
 */
//Content Categorie

preg_match_all('#Content-cid-(\d*)#', $content, $pages, PREG_SET_ORDER);
			foreach ($pages as $pages1){

			$pages2[0] = preg_replace('#Content-cid-#', '', $pages1[0]);
			$abfrage = "SELECT title, cid FROM " . $prefix . "_pages_categories WHERE cid = '$pages2[0]'";
  				$ergebnis = mysql_query($abfrage);
  					while($row = mysql_fetch_array($ergebnis))
    				{

						$titel_pages_rewrite = $row["title"];
						$titel_pages_rewrite = str_replace($umlaute, $ersetzung, $titel_pages_rewrite);
						$titel_pages_rewrite = preg_replace('#\W#', "-", $titel_pages_rewrite);
						$titel_pages_rewrite = preg_replace('#---#', "-", $titel_pages_rewrite);
						$titel_pages_rewrite = preg_replace('#--#', "-", $titel_pages_rewrite);
/**                                                                normalerweise 1 Bindestrich am Ende          */
						$titel_pages_fert = "Content-cid---";
						$titel_pages_fert.= "$titel_pages_rewrite---";
						$titel_pages_fert.= $pages2[0];
						$replace = "#".$pages1[0]."(?!\d)#";
						$content = preg_replace($replace, $titel_pages_fert, $content);
									}

					}
//Content Details

preg_match_all('#Content-pid-(\d*)#', $content, $pages, PREG_SET_ORDER);
			foreach ($pages as $pages1){

			$pages2[0] = preg_replace('#Content-pid-#', '', $pages1[0]);
			$abfrage = "SELECT title, pid FROM " . $prefix . "_pages WHERE pid = '$pages2[0]'";
  				$ergebnis = mysql_query($abfrage);
  					while($row = mysql_fetch_array($ergebnis))
    				{

						$titel_pages_rewrite = $row["title"];
						$titel_pages_rewrite = str_replace($umlaute, $ersetzung, $titel_pages_rewrite);
						$titel_pages_rewrite = preg_replace('#\W#', "-", $titel_pages_rewrite);
						$titel_pages_rewrite = preg_replace('#---#', "-", $titel_pages_rewrite);
						$titel_pages_rewrite = preg_replace('#--#', "-", $titel_pages_rewrite);
/**                                                                normalerweise 1 Bindestrich am Ende          */
						$titel_pages_fert = "Content-pid---";
						$titel_pages_fert.= "$titel_pages_rewrite---";
						$titel_pages_fert.= $pages2[0];
						$replace = "#".$pages1[0]."(?!\d)#";
						$content = preg_replace($replace, $titel_pages_fert, $content);
									}

					}
 /**
 * ############################################################################################
 * ############################################################################################
 * ############################################################################################
 *  Content-Modification             Ende
 * ############################################################################################
 * ############################################################################################
 * ############################################################################################
 */
//Web_Links Categorie

preg_match_all('#Web_Links-cid-(\d*)#', $content, $links, PREG_SET_ORDER);
			foreach ($links as $links1){

			$links2[0] = preg_replace('#Web_Links-cid-#', '', $links1[0]);
			$abfrage = "SELECT title, cid FROM " . $prefix . "_links_categories WHERE cid = '$links2[0]'";
  				$ergebnis = mysql_query($abfrage);
  					while($row = mysql_fetch_array($ergebnis))
    				{

						$titel_links_rewrite = $row["title"];
						$titel_links_rewrite = str_replace($umlaute, $ersetzung, $titel_links_rewrite);
						$titel_links_rewrite = preg_replace('#\W#', "-", $titel_links_rewrite);
						$titel_links_rewrite = preg_replace('#---#', "-", $titel_links_rewrite);
						$titel_links_rewrite = preg_replace('#--#', "-", $titel_links_rewrite);
						$titel_links_fert = "Web_Links-cid-";
						$titel_links_fert.= "$titel_links_rewrite-";
						$titel_links_fert.= $links2[0];
						$replace = "#".$links1[0]."(?!\d)#";
						$content = preg_replace($replace, $titel_links_fert, $content);
									}

					}
//Web_Links Details
preg_match_all('#Web_Links-op-view-lid-(\d*)#', $content, $links, PREG_SET_ORDER);
			foreach ($links as $links1){

			$links2[0] = preg_replace('#Web_Links-op-view-lid-#', '', $links1[0]);
			$abfrage = "SELECT title, lid FROM " . $prefix . "_links_links WHERE lid = '$links2[0]'";
  				$ergebnis = mysql_query($abfrage);
  					while($row = mysql_fetch_array($ergebnis))
    				{

						$titel_links_rewrite = $row["title"];
						$titel_links_rewrite = str_replace($umlaute, $ersetzung, $titel_links_rewrite);
						$titel_links_rewrite = preg_replace('#\W#', "-", $titel_links_rewrite);
						$titel_links_rewrite = preg_replace('#---#', "-", $titel_links_rewrite);
						$titel_links_rewrite = preg_replace('#--#', "-", $titel_links_rewrite);
						$titel_links_fert = "Web_Links-lid-";
						$titel_links_fert.= "$titel_links_rewrite-";
						$titel_links_fert.= $links2[0];
						$replace = "#".$links1[0]."(?!\d)#";
						$content = preg_replace($replace, $titel_links_fert, $content);
									}

					}
// News Categorie
preg_match_all('#News-file-categories-catid-(\d*)#', $content, $news, PREG_SET_ORDER);
			foreach ($news as $news1){

			$news2[0] = preg_replace('#News-file-categories-catid-#', '', $news1[0]);
			$abfrage = "SELECT title, catid FROM " . $prefix . "_stories_cat WHERE catid = '$news2[0]'";
  				$ergebnis = mysql_query($abfrage);
  					while($row = mysql_fetch_array($ergebnis))
    				{

						$titel_news_rewrite = $row["title"];
						$titel_news_rewrite = str_replace($umlaute, $ersetzung, $titel_news_rewrite);
						$titel_news_rewrite = preg_replace('#\W#', "-", $titel_news_rewrite);
						$titel_news_rewrite = preg_replace('#---#', "-", $titel_news_rewrite);
						$titel_news_rewrite = preg_replace('#--#', "-", $titel_news_rewrite);
						$titel_news_fert = "News-cat-";
						$titel_news_fert.= "$titel_news_rewrite-";
						$titel_news_fert.= $news2[0];
						$replace = "#".$news1[0]."(?!\d)#";
						$content = preg_replace($replace, $titel_news_fert, $content);
									}

					}
//News Details
preg_match_all('#News-file-article-sid-(\d*)#', $content, $news, PREG_SET_ORDER);
			foreach ($news as $news1){

			$news2[0] = preg_replace('#News-file-article-sid-#', '', $news1[0]);
			$abfrage = "SELECT title, sid FROM " . $prefix . "_stories WHERE sid = '$news2[0]'";
  				$ergebnis = mysql_query($abfrage);
  					while($row = mysql_fetch_array($ergebnis))
    				{

						$titel_news_rewrite = $row["title"];
						$titel_news_rewrite = str_replace($umlaute, $ersetzung, $titel_news_rewrite);
						$titel_news_rewrite = preg_replace('#\W#', "-", $titel_news_rewrite);
						$titel_news_rewrite = preg_replace('#---#', "-", $titel_news_rewrite);
						$titel_news_rewrite = preg_replace('#--#', "-", $titel_news_rewrite);
						$titel_news_fert = "News-sid-";
						$titel_news_fert.= "$titel_news_rewrite-";
						$titel_news_fert.= $news2[0];
						$replace = "#".$news1[0]."(?!\d)#";
						$content = preg_replace($replace, $titel_news_fert, $content);
									}

					}
// Ende mod_rewrite

        }
    }
    return $content;
}

/**
 * Die per umgeschriebener URL dem Script uebergebene Request Parameter
 * wieder in eine verwendbare Form bringen
 */
function mxUndoModRewrite()
{
    global $modrew_alternate, $PHP_SELF;
    $name = '';
    $get = array();
    if (isset($_GET['name'])) {
        $name = $_GET['name'];
    } else if (strpos($_SERVER['QUERY_STRING'], '&________________________') === false) {
        $name = str_replace('..', '', $_SERVER['QUERY_STRING']);
    } else {
        list($name, $querystring) = explode('&________________________', $_SERVER['QUERY_STRING']);
        unset($_GET['________________________' . $querystring], $_REQUEST['________________________' . $querystring]);
        $che = explode('-', $querystring);
        $che = array_chunk($che, 2);
        foreach($che as $part) {
            $key = @str_replace($modrew_alternate, '-', $part[0]);
            $value = @str_replace($modrew_alternate, '-', $part[1]);
            $get[$key] = $value;
        }
    }

    if ($name != 'mxcredit' && !file_exists(PMX_REAL_BASE_DIR . '/modules/' . $name . '/.')) {
        switch (true) {
            case file_exists(PMX_REAL_BASE_DIR . '/modules/' . ucfirst($name) . '/.'):
                $name = ucfirst($name);
                break;
            case file_exists(PMX_REAL_BASE_DIR . '/modules/' . strtolower($name) . '/.'):
                $name = strtolower($name);
                break;
            case file_exists(PMX_REAL_BASE_DIR . '/modules/' . strtoupper($name) . '/.'):
                $name = strtoupper($name);
                break;
            case file_exists(PMX_REAL_BASE_DIR . '/modules/' . ucwords($name) . '/.'):
                $name = ucwords($name);
                break;
            default:
                header('HTTP/1.1 301 Moved Permanently');
                header("Refresh: 2;url=./?moderror=" . urlencode($name));
        }
    }
    unset($_GET[$name], $_REQUEST[$name], $get[$name]);

    $_GET = array_merge(array('name' => $name), $get, $_GET);
    $new = '';
    foreach ($_GET as $key => $value) {
        $new .= '&' . $key . '=' . $value;
    }

    $_SERVER['QUERY_STRING'] = trim($new, '& ');
    $_SERVER["PHP_SELF"] = rtrim(dirname($_SERVER["PHP_SELF"]), '/') . '/modules.php';
    $_SERVER['SCRIPT_NAME'] = $_SERVER["PHP_SELF"];
    $_SERVER['SCRIPT_FILENAME'] = rtrim(dirname($_SERVER['SCRIPT_FILENAME']), '/') . '/modules.php';
    if (isset($PHP_SELF)) {
        $PHP_SELF = $_SERVER["PHP_SELF"];
    }
}