<?php
/**
 * pragmaMx  Content Management System
 * Copyright (c) 2007 pragmaMx Dev Team - http://pragmaMx.org
 * 
 * This program 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 2 of the License, or
 * (at your option) any later version.
 * 
 * $Source: /home/www/dps3311/home/cvsroot/pragmamx/pragmamx_01/includes/mx_modrewrite.php,v $
 * $Revision: 1.14 $
 * $Author: tora60 $
 * $Date: 2007/05/02 20:18:47 $
 */

/**
 * 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 ($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])) {
                    $xar[1] = '';
                } 
                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';
            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
// Umlaute 

$umlaute = array(
"ä",
"ü",
"ö",
"Ä",
"Ü",
"Ö",
"ß",
"ñ",
"ó",
"ô",
"í",
"á",
"ú",
"é",
"ê",
"ã",
"ç",
"û",
"è",
"à",
"ë",
"î"
);

$ersetzung = array(
"ae",
"ue",
"oe",
"Ae",
"Ue",
"Oe",
"ss",
"n",
"o",
"o",
"i",
"a",
"u",
"e",
"e",
"a",
"c",
"u",
"e",
"a",
"e",
"i"
);

// Kalender Event

preg_match_all('#Kalender-op-view-eid-(\d*)#', $content, $event, PREG_SET_ORDER);
			foreach ($event as $event1){

			$event2[0] = preg_replace('#Kalender-op-view-eid-#', '', $event1[0]);
			$abfrage = "SELECT title, eid FROM mx_events WHERE eid = '$event2[0]'";
  				$ergebnis = mysql_query($abfrage);
  					while($row = mysql_fetch_array($ergebnis))
    				{

						$titel_event_rewrite = $row["title"];
						$titel_event_rewrite = str_replace($umlaute, $ersetzung, $titel_event_rewrite);
						$titel_event_rewrite = preg_replace('#\W#', "-", $titel_event_rewrite);
						$titel_event_rewrite = preg_replace('#---#', "-", $titel_event_rewrite);
						$titel_event_rewrite = preg_replace('#--#', "-", $titel_event_rewrite);
						$titel_event_fert = "Kalender-event-";
						$titel_event_fert.= "$titel_event_rewrite-";
						$titel_event_fert.= $event2[0];
						$replace = "#".$event1[0]."(?!\d)#";
						$content = preg_replace($replace, $titel_event_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(MX_DOC_ROOT . '/modules/' . $name . '/.')) {
        switch (true) {
            case file_exists(MX_DOC_ROOT . '/modules/' . ucfirst($name) . '/.'):
                $name = ucfirst($name);
                break;
            case file_exists(MX_DOC_ROOT . '/modules/' . strtolower($name) . '/.'):
                $name = strtolower($name);
                break;
            case file_exists(MX_DOC_ROOT . '/modules/' . strtoupper($name) . '/.'):
                $name = strtoupper($name);
                break;
            case file_exists(MX_DOC_ROOT . '/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"];
    } 
} 
