<?php

/************************************
 pragmaMx  Content Management System
 Copyright (c) 2005 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/html/includes/mx_modrewrite.php,v $
 $Revision: 1.3.4.2 $
 $Author: tora60 $
 $Date: 2006/12/03 12:03:13 $
************************************/

// 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 übergeben


// Variablen deklarieren, weil in Funktion includet wird :-(
global $modrew_prepareauto, $modrew_alternate;

/// die URL's automatisch generieren für alles was über die modules.php läuft?
$modrew_prepareauto = TRUE;

/// Ansonsten werden nur die Ersetzungen des Array's $replace_arr beachtet 
/// und es muss die .htaccess Dateie geändert bzw. ergänzt 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 erwünschten Bindestriche in der URL ersetzt werden?
$modrew_alternate = '~';


##########################################################################################
function mxGetModRewriteArray() {
	// der zu suchende reguläre Ausdruck ist der Schlüssel 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 öffnen 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 entstehen den ouzput 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) && isset($urlout)) {
				// aus den darin enthaltenen beiden Arrays, das entsprechende Array für mx-Modrewrite generieren
				foreach ($urlin as $i => $in) {
					if (isset($urlout[$i])) {
						$replace_arr[$in] = $urlout[$i];
						}
					}
				// unbedingt vor dem nächsten Schleifendurchlauf aufräumen
				unset($urlin, $urlout);
				}
			}
		}
	// den Ordner mit den rule wieder schliessen
	closedir($handle);
	// evtl. entstandenen output verwerfen
	ob_end_clean();
	// das neue Array zurückgeben
	return $replace_arr;
	}


##########################################################################################
function mxPrepareModRewrite($content) {	
	global $modrew_prepareauto, $modrew_alternate;
	static $funcisdone;
	/// wenn Funktion bereits ausgeführt, oder kein Content
	if (isset($funcisdone) || empty($content)) {
		return $content;
		}
	$funcisdone = TRUE;

	/// die Regeln importieren
	$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 (count($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) {
		
		//// 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>)(?:'.MX_BASE_URL.')?modules\.php\?((?:[[:alnum:]\=&_]|&amp;)+)(["\']|</link>)!i';

		preg_match_all($pattern, $content, $matches);

		foreach($matches[2] as $i => $value) {
			// der zu ersetzende String
			$old[] = $matches[0][$i];
			// 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 ($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'.$ilink;
			$new[] = $matches[1][$i].MX_BASE_URL.$newstr.$matches[3][$i];
			
			}
		if (isset($old)) {
			$content = str_replace($old, $new, $content);
			
//Moderewrite Erweiterung (News, Downloads, Web_Links)
// Umlaute 
$umlaute = array("ä", "ü", "ö", "Ä", "Ü", "Ö", "ß");
$ersetzung = array("ae", "ue", "oe", "Ae", "Ue", "Oe", "ss");
//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);								
									}
		
					}
//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);
									}
		
					}
			}
		}

	return $content;
	}



##########################################################################################
function mxUndoModRewrite() {
	global $modrew_alternate;
	$name = '';
	$new = '';
	if (isset($_GET['name'])) {
		$name = $_GET['name'];
		}
	else if(strpos($_SERVER['QUERY_STRING'], '&________________________') === false) {
		#print "kein querystring\n<br>\n";
		#print "dateiname: ".$_SERVER['QUERY_STRING'];
		$name = str_replace('..', '', $_SERVER['QUERY_STRING']);
		}
	else {
		#mxDebugFuncVars($_SERVER['QUERY_STRING'], $_SERVER['PHP_SELF']);
		list($name, $querystring) = explode('&________________________', $_SERVER['QUERY_STRING']);
		unset($_GET['________________________'.$querystring]);
		unset($_REQUEST['________________________'.$querystring]);
		#print "querystring: ".$querystring;
		#print "\n<br>\n";
		#print "dateiname: ".$name;
		#print "\n<br>\n";
		$http_querystring = explode('-', $querystring);
		while(list(, $value) = each($http_querystring)) {
			if(!strlen($value) || !strlen(current($http_querystring)))  {
				continue;
				}
			#print $value.' = '.current($http_querystring)."\n<br>\n";
			$varname = $value;
			$varvalue = current($http_querystring);
			$varvalue = str_replace($modrew_alternate, '-', $varvalue);
			$_GET[$varname] = $varvalue;
			$new .= '&'.$varname.'='.$varvalue;
			$_REQUEST[$varname] = $varvalue;
			$out[$varname] = $varvalue;
			#print $value.' = '.current($http_querystring)."\n<br>\n";
			next($http_querystring);
			}
		}

	if (!file_exists(MX_DOC_ROOT.'/modules/'.$name.'/.')) {
		@header("HTTP/1.0 404 Not Found");
		@header("Status: 404 Not Found");
	}
	unset($_GET[$name]);
	unset($_REQUEST[$name]);
	$_GET['name'] = $name;
	$_REQUEST['name'] = $name;
	$out['name'] = $name;
	
	$_SERVER["PHP_SELF"] = dirname($_SERVER["PHP_SELF"]).'/modules.php';
	$_SERVER['SCRIPT_NAME'] = $_SERVER["PHP_SELF"];
	$_SERVER['SCRIPT_FILENAME'] = dirname($_SERVER['SCRIPT_FILENAME']).'/modules.php';
	$_SERVER['QUERY_STRING'] = 'name='.$name.$new;
	$out['PHP_SELF'] = $_SERVER["PHP_SELF"];

	#mxdebugfuncvars($_GET);
	#mxdebugfuncvars($_REQUEST);
	#mxdebugfuncvars($name);
	
	return $out;
	}
