<?
#################################################################################
#
# Autor: Michael Brauchl Version 1.0
# Autor: Paul Eppner (paul@twomoons.de) Version 1.2
# Autor: Karsten Pawlik Version 1.3
# Autor: Karsten Pawlik Version 1.3.1 (bugfix release for 1.3)
# Datum:  14.12.2003
# Lizenz: GPL
#
#################################################################################


### User Authentifizierung mittels Cookie #######################################
#
# Hat der User keine Cookies eingestellt, wird bei jedem Aufruf einer Seite
# erneut eine Session geöffnet. Damit erhält der Zielhost auch keine Cookies
# zurückgeliefert.
#
#################################################################################

if (!isset($_COOKIE['webgrab_user'])) $webgrab_user = time();
else $webgrab_user = $_COOKIE['webgrab_user'];

// Cookie setzen
$time = mktime()+31449600;
$date = date("l, d-M-y H:i:s", ($time));
header("Set-Cookie: webgrab_user=$webgrab_user; expires=$date GMT;/;$SERVER_NAME;0");

### Decoder für http 1.1 ########################################################
#
# Das etwas schneller Protokoll HTTP 1.1 liefert die Daten in einzelnen
# "Stücken". Das hat den Vorteil, dass die Paketgröße optimiert ist, aber auch
# den Nachteil, dass man sich um das wieder zusammensetzen kümmern muß.
#
#################################################################################

function Decode_Chunked_Message($message) {

         $DEBUG = FALSE;
         $CRLF_LENGHT = 2;
         $chunk_pos=0;
         $crlf_pos = strpos ($message , "\r\n" , $chunk_pos);
         $chunk_size=trim(substr($message,$chunk_pos,$crlf_pos));
         $octets_to_read = hexdec($chunk_size);
         $start_read = $crlf_pos + $CRLF_LENGHT;
         $buffer='';

         while ($octets_to_read > 0) {
                 if ($DEBUG) {
                         echo "chunk_pos : $chunk_pos<br>
                         crlf_pos : $crlf_pos<br>
                         octets_to_read : $octets_to_read ($chunk_size)<br>
                         start_read : $start_read<br><br><br>";
                 }
                 $buffer.=substr($message,$start_read,$octets_to_read);
                 if ($DEBUG) {
                         echo "Buffer size:".strlen($buffer)."<br>";
                         echo "Buffer content:".htmlentities(substr($message,$start_read,$octets_to_read))."<br>";
                 }
                 $chunk_pos = $start_read + $octets_to_read + $CRLF_LENGHT;
                 if (strlen($message)>$chunk_pos) {
                         $crlf_pos = @strpos ($message , "\r\n" , $chunk_pos);
                         $chunk_size=trim(substr($message,$chunk_pos,$crlf_pos-$chunk_pos));
                         $octets_to_read = hexdec($chunk_size);
                         $start_read = $crlf_pos + $CRLF_LENGHT;
                 } else $octets_to_read=0;
         } return $buffer;
}

### Verwaltung von Cookies ######################################################
#
# Wenn eine Website ein Cookie setzt, muß das abgelegt werden, um es beim
# nächsten Besuch der Seite dem Server zu liefern.
#
# Diese Klasse wird noch ausgebaut. Was noch nicht implementiert ist: Löschen von
# alten Cookies und Behandlung von Pfaden. Das sollte aber kein Problem
# darstellen.
#
#################################################################################

class cookie_container {

         // wenn vorhanden, cookiefile lesen
         function cookie_container() {
                 global $webgrab_user, $dedi_db, $db, $dedi_mod, $con_side, $idcatside;

		$sql = "SELECT value FROM $dedi_db[content_external] WHERE idsidelang='".$con_side[$idcatside]['idsidelang']."' AND container='".$dedi_mod['container']['id']."' AND number='".$dedi_mod['modul']['id']."' AND typenumber='$webgrab_user'";
		$db->query($sql);
		if ($db->next_record()) $this->$webgrab_user = unserialize ($db->f('value'));
         }

         // Domainnamen für den Hash encodieren
         function encode_domainname($domain_name) {
                 $save_name = substr($domain_name, 1);
                 $save_name = str_replace ('.','_DOT_', $save_name);
                 return $save_name;
         }

         // speichert ein cookie im container
         function put_cookie($cookie) {
                 global $url, $webgrab_user;

                 // namen von Parametern trennen
                 if (strstr($cookie,';')) {
                         $value_pair = trim(substr($cookie, 0, strpos($cookie, ';')));
                         $cookie_parms = substr($cookie, strpos($cookie, ';')+1);
                         $parms = explode(';',$cookie_parms);
                         foreach ($parms as $parm) {
                                 list($k,$v)=explode('=',$parm);
                                 $temp->$k = $v;
                         }
                 } else $value_pair = trim($cookie);
                 $temp->name = trim(substr($value_pair,0,strpos($value_pair,'=')));
                 $temp->value = trim(substr($value_pair,strpos($value_pair,'=')+1));
                 $save_name = $this->encode_domainname('.'.$url['domain']);
                 while (list($k, $v) = each($temp)) $this->$webgrab_user->domain[$save_name][$temp->name][$k]=$v;
                 unset ($temp);
         }

         function save() {
                 global $webgrab_user, $dedi_db, $db, $con_side, $dedi_mod, $auth, $idcatside;

                 $towrite = serialize ($this->$webgrab_user);
		set_magic_quotes_gpc($towrite);
		$sql = "UPDATE $dedi_db[content_external] SET value='$towrite', lastmodified='".time()."' WHERE idsidelang='".$con_side[$idcatside]['idsidelang']."' AND container='".$dedi_mod['container']['id']."' AND number='".$dedi_mod['modul']['id']."' AND typenumber='$webgrab_user'";
		$db->query($sql);
		if (!$db->affected_rows()) {
	                 $sql = "INSERT INTO $dedi_db[content_external] (idsidelang, container, number, typenumber, value, online, author, created, lastmodified) VALUES ('".$con_side[$idcatside]['idsidelang']."', '".$dedi_mod['container']['id']."', '".$dedi_mod['modul']['id']."', '$webgrab_user', '$towrite', '0', '".$auth->auth['uid']."', '".time()."', '".time()."')";
	                 $db->query($sql);
		}
         }

         function send_cookie() {
                 global $url, $webgrab_user;

                 $domain = $this->encode_domainname('.'.$url['domain']);
                 if (!isset($this->$webgrab_user->domain[$domain])) return false;
                 $RetVal = 'Cookie: ';
                 foreach ($this->$webgrab_user->domain[$domain] as $cookie) $RetVal.= trim($cookie['name']).'='.trim($cookie['value']).'; ';
                 $RetVal = substr($RetVal,0,-2)."\r\n";
                 return $RetVal;
         }
}

### Ein Formular zum Server senden ##############################################
#
# Diese Funktion sendet die Daten, die zuerst an das Skript WebGrab gepostet
# wurden an den Server. Es wird dabei ein Browser und die Funktion POST
# simuliert.
#
#################################################################################

function PostToHost($url, $data_to_send, $referer) {
         global $cookie_container, $http_header;

		 if ($url['scheme'] == "https") {
			 if ($port == "") {
				 $port = 443;
			 } else {
				 $port = $url['port'];
			 }
			 $protprefix = "ssl://";
		 } else {
			 if ($port == "") {
				 $port = 80;
			 } else {
				 $port = $url['port'];
			 }
			 $protprefix = "";
		 }

		 $cRetVal = '';

         // Verbindung aufbauen
         $fp = fsockopen($protprefix.$url['host'], $port, $errno, $errstr, 30);

         // Verbindung fehlgeschlagen
         if (!$fp) {
                 echo "Host: ".$url['host']." nicht erreichbar!<br>\n";
                 echo "Fehler: $errstr ($errno)<br>\n";
                 exit;
         }

         // Daten übermitteln
         fputs ($fp, "POST ".$url['path']." HTTP/1.1\r\n");
         fputs ($fp, "Host: ".$url['host']."\r\n");
         if ($cookie = $cookie_container->send_cookie()) fputs($fp, $cookie);
         fputs ($fp, "Accept: ".$_SERVER['HTTP_ACCEPT']."\r\n");
         fputs ($fp, "Accept-Language: ".$_SERVER['HTTP_ACCEPT_LANGUAGE']."\r\n");
         fputs ($fp, "User-Agent: ".$_SERVER['HTTP_USER_AGENT']."\r\n");
         fputs ($fp, "Referer: $referer\r\n");
         fputs ($fp, "Content-type: application/x-www-form-urlencoded\r\n");
         fputs ($fp, "Content-length: " . strlen($data_to_send) . "\r\n");
         fputs ($fp, "Connection: close\r\n\r\n");
         fputs ($fp, $data_to_send);
         while (!feof($fp)) $cRetVal .= fgets($fp, 128);
         fclose ($fp);

         $TempVal = explode("\r\n\r\n", $cRetVal);
         $http_header = $TempVal[0];
         $chunked_content = trim(str_replace($http_header, '', $cRetVal));
         if (stristr($http_header,'Transfer-Encoding: chunked')) $cRetVal = Decode_Chunked_Message($chunked_content);
         else $cRetVal = $chunked_content;
         return $cRetVal;
}

### GET-Request simulieren ######################################################
#
# Diese Funktion holt eine Seite mit GET vom Server.
#
#################################################################################

function GetFromHost($url, $referer) {
         global $cookie_container, $http_header;

		 if ($url['scheme'] == "https") {
			 if ($port == "") {
				 $port = 443;
			 } else {
				 $port = $url['port'];
			 }
			 $protprefix = "ssl://";
		 } else {
			 if ($port == "") {
				 $port = 80;
			 } else {
				 $port = $url['port'];
			 }
			 $protprefix = "";
		 }

		 $cRetVal = '';
         // Verbindung aufbauen
         $fp = fsockopen($protprefix.$url['host'], $port, $errno, $errstr, 30);

         // Verbindung fehlgeschlagen
         if (!$fp) {
                 echo "Host: ".$url['host']." nicht erreichbar!<br>\n";
                 echo "Fehler: $errstr ($errno)<br>\n";
                 exit;
         }

         // Daten übermitteln
         fputs ($fp, "GET ".$url['path']." HTTP/1.1\r\n");
         fputs ($fp, "Host: ".$url['host']."\r\n");
         fputs ($fp, "Referer: $referer\r\n");
         fputs ($fp, "Accept: ".$_SERVER['HTTP_ACCEPT']."\r\n");
         fputs ($fp, "Accept-Language: ".$_SERVER['HTTP_ACCEPT_LANGUAGE']."\r\n");
         fputs ($fp, "User-Agent: ".$_SERVER['HTTP_USER_AGENT']."\r\n");
         if ($cookie = $cookie_container->send_cookie()) fputs($fp, $cookie);
         fputs ($fp, "Connection: close\r\n\r\n");
         while (!feof($fp)) $cRetVal .= fgets($fp, 128);
         fclose ($fp);
         $TempVal = explode("\r\n\r\n", $cRetVal);
         $http_header = $TempVal[0];
         $chunked_content = trim(str_replace($http_header, '', $cRetVal));
         if (!stristr($http_header, 'Content-Type: text/html')) {
                 header('Location: '.$protprefix.$url['host'].$url['path']);
                 exit;
         }
         if (stristr($http_header,'Transfer-Encoding: chunked')) $cRetVal = Decode_Chunked_Message($chunked_content);
         else $cRetVal = $chunked_content;
         return $cRetVal;
}

### Vorbereitung eines Strings für die RegEx-Suche ##############################
#
# Diese Funktion macht ein bißchen "mehr" als stripslashes();
#
#################################################################################

function clear_reg (&$wert) {
         $wert = str_replace('\\\\','\\',$wert);
         $wert = str_replace('\[','[',$wert);
         $wert = str_replace('\]',']',$wert);
         $wert = str_replace('\+','+',$wert);
         $wert = str_replace('\.','.',$wert);
         $wert = str_replace('\/','/',$wert);
         $wert = str_replace('\"','"',$wert);
         $wert = str_replace('\?','?',$wert);
         $wert = str_replace('\(','(',$wert);
         $wert = str_replace('\)',')',$wert);
         $wert = str_replace('\=','=',$wert);
         $wert = str_replace('\*','*',$wert);
         $wert = str_replace('\$','$',$wert);
         $wert = str_replace('\&','&',$wert);
         $wert = str_replace('\;',';',$wert);
         $wert = str_replace('\#','#',$wert);
}

function clear_reg_reverse (&$wert) {
         $wert = str_replace('\\','\\\\',$wert);
         $wert = str_replace('[','\[',$wert);
         $wert = str_replace(']','\]',$wert);
         $wert = str_replace('+','\+',$wert);
         $wert = str_replace('.','\.',$wert);
         $wert = str_replace('/','\/',$wert);
         $wert = str_replace('"','\"',$wert);
         $wert = str_replace('?','\?',$wert);
         $wert = str_replace('(','\(',$wert);
         $wert = str_replace(')','\)',$wert);
         $wert = str_replace('=','\=',$wert);
         $wert = str_replace('*','\*',$wert);
         $wert = str_replace('$','\$',$wert);
         $wert = str_replace('&','\&',$wert);
         $wert = str_replace(';','\;',$wert);
         $wert = str_replace('#','\#',$wert);
}

### Ersetzen der Blöcke #########################################################
#
# Hier werden die in der Konfigurationsdatei definierten Blöcke ersetzt.
#
#################################################################################

function replace_content_blocks(&$content) {
         global $url, $location;

         $RetVal ='';


         # Pfad checken
         if (isset($location) AND isset($url['path'])) {
				 for ($i = 0; $i < count ($location); $i++) {
					for ($j=0; $j < count ($location[$i]['search_block_start']); $j++) {
						clear_reg($location[$i]['search_block_start'][$j]);
						clear_reg($location[$i]['search_block_stop'][$j]);
						clear_reg($location[$i]['replace_block_line'][$j]);
					}
				 }
                 for ($i = 0; $i < count ($location); $i++) {
                         $tocheck = $url['host'].$url['path'];
                         if (stristr($tocheck, $location[$i]['value'])) {
                                 if (isset($location[$i]['search_block_start'])) {
                                         $status = 'search';
                                         $current_rep = '';
                                         $search_block_count = count ($location[$i]['search_block_start']);
                                         $temp_content = explode ("\n", $content);

                                         # content-datei scannen
                                         foreach ($temp_content as $line) {
                                                 if ($status == 'search') {
                                                         for ($j=0; $j < $search_block_count; $j++) {
                                                                 if (stristr($line,$location[$i]['search_block_start'][$j])) {
                                                                         $status = 'remove';
                                                                         $current_rep = $j;
                                                                         $retval = $retval.substr($line,0, strpos($line,$location[$i]['search_block_start'][$j]));
                                                                         break 1;
                                                                 }
                                                         }
                                                         if ($status != 'remove') $retval = $retval. "\n". $line;
                                                 }
                                                 if ($status == 'remove') {
                                                         if (stristr($line, $location[$i]['search_block_stop'][$current_rep])) {
                                                                 # datei?
                                                                 if (isset ($location[$i]['replace_block_file'][$current_rep])) {
                                                                         $insert = implode("",file($location[$i]['replace_block_file'][$current_rep]));
                                                                         $retval = $retval.$insert.substr($line,strpos($line,$location[$i]['search_block_stop'][$current_rep])+strlen($location[$i]['search_block_stop'][$current_rep]));
                                                                         $current_rep='';
                                                                         $status = 'search';
                                                                 } else if (isset ($location[$i]['replace_block_line'][$current_rep])) {
                                                                         $retval = $retval.$location[$i]['replace_block_line'][$current_rep].substr($line,strpos($line,$location[$i]['search_block_stop'][$current_rep])+strlen($location[$i]['search_block_stop'][$current_rep]));
                                                                         $current_rep='';
                                                                         $status = 'search';
                                                                 } else {
                                                                         echo "Fehler beim Ersetzen von $location[$i]['search_block_start'][$current_rep]";
                                                                         exit;
                                                                 }
                                                         }
                                                 }
                                         }
                                         $content=$retval;
                                 }
                         }
                 }
         }
         return;
}

### suchbegriffe ersetzen #######################################################

function replace_content(&$content) {
         global $url, $location;


		 $trenner = '[\040|\n|\t|\r]*';

         # pfad checken
         if (isset($location) and isset($url['path'])) {
				 for ($i = 0; $i < count ($location); $i++) {
					for ($j=0; $j < count ($location[$i]['search']); $j++) {
						clear_reg($location[$i]['search'][$j]);
						clear_reg($location[$i]['replace'][$j]);
					}
				 }
                 for ($i = 0; $i < count ($location); $i++) {
                         $tocheck = $url['host'].$url['path'];
                         if (stristr($tocheck, $location[$i]['value'])) {
                                 if (isset($location[$i]['search'])) {
                                         for ($j = 0; $j < count($location[$i]['search']); $j++) {
                                                 $search = $location[$i]['search'][$j];
                                                 clear_reg ($search);
                                                 $search = "/".$search."/i";
                                                 $replace = $location[$i]['replace'][$j];
                                                 $content = preg_replace($search, $replace, $content);
                                         }
                                 }
                         }
                 }
         }
         return;
}

### Überprüfen, ob ein link ersetzt werden soll #################################

function check_link($link) {
         global $location;

	return true;
         $url = parse_url($link);

         # pfad checken
         if (isset($location) and isset($url['path'])) {
                 for ($i = 0; $i < count ($location); $i++) {
                         $tocheck = $url['host'].$url['path'];
                         if (stristr($tocheck, $location[$i]['value'])) return true;
                 }
         }
         return false;
}

### aufbau des neuen links ######################################################

function make_link ($link, $base_url) {
         global $url, $path, $php_self, $server_name, $idcatside, $con_side;

		 if ($url['scheme'] == "https") {
			 if ($port != "") {
				 $url['port'] = ":".$url['port'];
			 }
		 } else {
			 if ($port != "") {
				 $url['port'] = ":".$url['port'];
			 }
		 }
         $new_server = $con_side[$idcatside]['link'].'&webgrab_path=';
         if (strstr($link,'webgrab')) return $link;
         if (trim($link) == '') return;
         if (strtoupper(trim(substr($link,0,11))) == 'JAVASCRIPT:') return $link;
         if (strtoupper(substr($link,0,4)) == 'HTTP') {
                 if (stristr($link, 'mailto:')) return $link;
                 $new_url = $link;
                 if (check_link($new_url) == true) return $new_server.base64_encode($new_url);
                 else return $link;
         }
         if ($link[0] == '/') {
                 if ($base_url) $new_url = $base_url.$link;
                 else $new_url = $url['scheme']."://".$url['host'].$url['port'].$link;
                 if (check_link($new_url) == true) return $new_server.base64_encode($new_url);
                 else return base64_encode($new_url);
         }
         if ($link[0] == '#') {
                 $togo = $path;
                 if ($base_url) $new_url = $base_url.$link;
                 else {
                         if ($togo[0] != '/') $togo = '/'.$togo;
                         $new_url = $url['scheme']."://".$url['host'].$url['port'].$togo.$link;
                 }
                 if (check_link($new_url) == true) return $new_server.base64_encode($new_url);
                 else return base64_encode($new_url);
         }
         if (strtoupper(substr($link,0,4)) != 'HTTP') {
                 if (stristr($link, 'mailto:')) return $link;
                 if (stristr($link, 'javascript:')) return $link;

		if ($link[0] != '/') {
			if (stristr(basename($path), '.') OR stristr(basename($path), '?')) {
				if (dirname($path) != '\\') $path_dir = dirname($path).'/';
				else $path_dir = '/';
			} else $path_dir = $path;
			if ($base_url) $new_url = $base_url."/".$link;
			else $new_url = $url['scheme']."://".$url['host'].$url['port']."/".$path_dir.$link;
		} else $new_url = $url['scheme']."://".$url['host'].$url['port']."/".$link;
		if (check_link($new_url) == true) return $new_server.base64_encode($new_url);
		else return base64_encode($new_url);
         }
return $link;
}

### grafiklinks werden anders behandelt als hrefs ###############################

function make_graphic_link ($link,$base_url) {
         global $url, $path, $php_self, $server_name;

         if (stristr($link,$url['scheme']."://".$url['host'].$url['port'])) return $link;
         if (strstr($link,'webgrab')) return $link;
         if (trim($link) == '') return $link;
         if ($link[0] == '/') {
		if ($base_url) $new_url = $base_url.$link;
		else $new_url = $url['scheme'].'://'.$url['host'].$url['port'].$link;
                 return $new_url;
         }
         if (strtoupper(substr($link,0,4)) != 'HTTP') {
                 if (stristr(basename($path), '.') or stristr(basename($path), '?')) {
			if (dirname($path) != '\\') $path_dir = dirname($path).'/';
			else $path_dir = '/';
                 }
                 else $path_dir = $path;
		if ($base_url) $new_url = $base_url.$link;
		else $new_url = $url['scheme'].'://'.$url['host'].$url['port'].$path_dir.$link;
                 return $new_url;
         }
         return $link;
}

### bug mit slashes fixen #######################################################
#
# daran habe ich lange gearbeitet. es sieht so aus, als wäre das ein bug in der
# regex-implementierung von php. bei einem gefundenen wert werden vor slashes
# weitere slashes gesetzt. kommen in einem wert mehrere slashes vor, wird beim
# letzten vorkommen nichts mehr vorangesetzt. diese funktion korrigiert diesen
# bug.
#
#################################################################################

function corr_slashes_bug($value) {
         if (stristr($value,'\\\\"')) {
                 $value=str_replace ('\\\\"','#t#',$value);
                 $value=str_replace ('\\"','\\\\"',$value);
                 $value=str_replace ('#t#','\\\\"',$value);
         }
         $value = stripslashes($value);
         return $value;
}

### Links ersetzen ##############################################################
#
# Ich habe mit vielen Seiten getestet, gehe aber davon aus, dass in Zukunft
# noch einige Änderungen an dieser Funktion erforderlich sein werden.
#
#################################################################################

function replace_url($content) {
         global $url, $base_url, $path, $PHP_SELF, $SERVER_NAME, $idcatside, $con_side, $lang, $view, $cfg_client, $cfg_dedi, $sess;

         $new_server = $cfg_client[htmlpath].$con_side[$idcatside]['link'].'&webgrab_path=';
         $self_path = $cfg_client[htmlpath].$con_side[$idcatside]['link'];
         $trenner = '[\040|\n|\t|\r]*';

	// Base-href sichern
	unset($base_url);
	preg_match_all('/base'.$trenner.'href'.$trenner.'='.$trenner."[\"|\']?([^\'|\"|>|\040]+)[\'|\"|>|\040]{1}/i", $content, $ArrayOfLinks);
	if (isset($ArrayOfLinks[1][0])) {
         	$base_url = $ArrayOfLinks[1][0];
		$search = '/base'.$trenner.'href'.$trenner.'='.$trenner."([\"|\']{1})?([^\'|\"|>|\040]*)([\'|\"|>|\040]{1})/i";
		$replace = "base href=\\1".$new_server.base64_encode($base_url)."\\3";
		$content = preg_replace($search, $replace, $content);
	}

	// forms
	unset($ArrayOfLinks);
	preg_match_all("/(<".$trenner."form[^>]*>)/i", $content, $ArrayOfLinks);
	$links = array_unique ($ArrayOfLinks[1]);

	while (list(,$link) = each($links)) {
		if (strstr($link,'webgrab')) continue;
		if (trim($link) == '') continue;
		if (preg_match("/action".$trenner."=".$trenner."([\"|\'])?([^\"|\'|\040|>]*)([\"|\'])?/i", $link, $matches)) {
			$link = $matches[2];
			$action = $matches[2];
			if (trim($action) == '') {
				$togo = $path;
				if ($togo[0] != '/') $togo = '/'.$togo[0];
				$action = $url['scheme'].'://'.$url['host'].$url['port'].$togo.$action;
			}
			if (stristr($action, 'mailto:')) continue;
			else if ($action[0] == '/') $action = $url['scheme'].'://'.$url['host'].$url['port'].$action;
			else if (strtoupper(substr($action,0,4)) != 'HTTP') {
				if (stristr($action, 'mailto:')) continue;
				if (stristr(basename($path), '.') OR stristr(basename($path), '?')) $togo = dirname($path).'/';
				else $togo = $path;
				if ($togo[0] != '/') $togo = '/'.$togo;
				$action = $url['scheme'].'://'.$url['host'].$url['port'].$togo.$action;
			}
			clear_reg_reverse($link);
			$search  = array("/<".$trenner."form([^>]*)action".$trenner."=".$trenner."([\"|\'])?".$link."([\"|\'])?".$trenner."([^>]*)>/i");
			$replace = array("<form\\1action = \\2".$self_path."\\3 \\4><input type=hidden name=webgrab_path value=".base64_encode($action).">");
			$content = preg_replace($search, $replace, $content);
		} else {
			if ($path[0] != '/') $path = '/'.$path;
			$action = $url['scheme'].'://'.$url['host'].$url['port'].$path;
			preg_match("/<".$trenner."form([^>]*)>/i", $link, $matches);
			$toreplace = $matches[1];
			clear_reg_reverse ($toreplace);
			$search  = array("/<".$trenner."form".$toreplace.">/i");
			$replace = array('<form'.stripslashes($toreplace).'><input type=hidden name=webgrab_path value='.base64_encode($action).'>');
			$content = preg_replace($search, $replace, $content);
		}
	}

	// hrefs behandeln
	$search = "/<".$trenner."(a|link)([^>]+)href".$trenner.'='.$trenner."([\"|\'|\\\\]*)([^\'|\"|>|\040]*)([\"|\'|>|\040|\\\\]*)/ie";
	$replace = "'<'.stripslashes('\\1\\2href = \\3').make_link('\\4', '$base_url').stripslashes('\\5').''";
	$content = preg_replace($search, $replace, $content);


	// .hrefs behandeln
	$search = "/\.href".$trenner."=".$trenner."\'([^\']*)\'/ie";
	$replace = "'.href=\''.make_link('\\1','$base_url').'\''";
	$content = preg_replace($search, $replace, $content);


	// metaangaben
	$search = "/content".$trenner."=".$trenner."([\"|\'])?([^\;]*);".$trenner."URL".$trenner."=".$trenner."([^\"|\'|>|\040]+)/ie";
	$replace = "'content='.stripslashes('\\1\\2').'; url='.make_link('\\3','$base_url').stripslashes('\\4').''";
	$content = preg_replace($search, $replace, $content);


	// location replace ersetzen
	$search = "/location\.replace".$trenner."\(".$trenner."([\'|\"])?([^\'|\"]*)([\'|\"])?".$trenner."\)/ie";
	$replace = "'location.replace ('.stripslashes('\\1').make_link('\\2','$base_url').stripslashes('\\3').')'";
	$content = preg_replace($search, $replace, $content);


	// frames
	$search = "/frame([^>]*src".$trenner."=".$trenner."[\"|\'|\\\\]*)([^\'|\"|>|\040]*)([\'|\"|>|\040|\\\\]*)/ie";
	$replace = "'frame'.stripslashes('\\1').make_link('\\2','$base_url').stripslashes('\\3').''";
	$content = preg_replace($search, $replace, $content);


	// Alle verbleibenden Urls ersetzen, in denen die Domäne vorkommt,
	// aber nicht webgrab.
	$search = "/([\"|\'|\040|\n|\r|\t|\\\\]+)(http:\/\/[a-zA-Z0123456789\.\_]*".$url['domain']."[a-zA-Z0123456789\_\/\.\?\&\=\;\-]*)([\"|\'|\040|\n|\t|\r|>|\\\\]+)/ieS";
	$replace = "''.stripslashes('\\1').make_link('\\2','$base_url').stripslashes('\\3').''";
	$content = preg_replace($search, $replace, $content);

//	$decoded_server = $new_server;
//	clear_reg ($decoded_server);
	// eventuelle fehler bei Formularen zurücktauschen
	$content = str_replace('<input type="hidden" name="webgrab_path" value="'.$new_server,'<input type=hidden name=webgrab_path value="',$content);

	// eventuelle fehler bei Grafiken zurücktauschen
	$search  = array("/(img|script|image)([^>]*)".$trenner."src".$trenner."=([\n|\t|\r|\040]*)([\"|\']{1})".$decoded_server."([a-zA-Z0123456789\.\_\?\&\+\-\:\/]*)([\"|\']{1})([>|\040|\n|\r|\t]{1})/i");
	$replace = array("\\1\\2src = \\3\\4\\5\\6\\7");
	$content = preg_replace($search, $replace, $content);

	// eventuelle fehler bei link zurücktauschen
	$search  = array("/(link)([^>]*)href".$trenner."=([\n|\t|\r|\040]*)([\"|\']{1})".$decoded_server."([a-zA-Z0123456789\.\_\?\&\+\-\:\/]*)([\"|\']{1})([>|\040|\n|\r|\t]{1})/i");
	$replace = array("\\1\\2href = \\3\\4\\5\\6\\7");
	$content = preg_replace($search, $replace, $content);

	// grafiken tauschen
	$search = "/<".$trenner."(img|script|image)([^>]*".$trenner."src[\040|\n|\t|\r|\\\\]*=[\n|\t|\r|\040|\"|\'|\\\\]*)([^\"|>|\040|\|\\\\']*)([^>]*>)/ieS";
	$replace = "'<'.stripslashes('\\1\\2').make_graphic_link('\\3','$base_url').corr_slashes_bug('\\4').''";
	$content = preg_replace($search, $replace, $content);

	// button-grafiken tauschen
	$search = "/<".$trenner."input".$trenner."([^>]*src".$trenner."=[\n|\t|\r|\040|\"|\'|\\\\]*)([^\"|>|\040|\']*)([\"|>|\040|\n|\r|\t|\'|\\\\]{1})/ie";
	$replace = "'<input '.stripslashes('\\1').make_graphic_link('\\2','$base_url').stripslashes('\\3').''";
	$content = preg_replace($search, $replace, $content);

	// javascript grafiken tauschen
	$search = "/\.src".$trenner."=[\t|\040]*([\"|\']){1}([^\'|\n|\"|\r|\.]+\.[a-za-z0-9]+)([\"|\']){1}/ie";
	$replace = "'.src='.stripslashes('\\1').make_graphic_link('\\2','$base_url').stripslashes('\\3').''";
	$content = preg_replace($search, $replace, $content);


	// background-images tauschen background="/gfx/bottom_15.jpg"
	$search = "/(background".$trenner."=[\n|\t|\r|\040|\"|\']*)([^\"|>|\040|\']*)([\"|>|\040|\n|\r|\t|\'\/]{1})/ie";
	$replace = "''.stripslashes('\\1').make_graphic_link('\\2','$base_url').stripslashes('\\3').''";
	$content = preg_replace($search, $replace, $content);

	// eventuelle fehler bei Backgrounds zurücktauschen
	$search  = array("/background".$trenner."=([\n|\t|\r|\040]*)([\"|\']{1})?".$decoded_server."([a-zA-Z0123456789\.\_\?\&\+\-\:]*)([\"|\']{1})?([>|\040|\n|\r|\t]{1})/i");
	$replace = array("background = \\1\\2\\3\\4\\5");
	$content = preg_replace($search, $replace, $content);

	return $content;
}


#################################################################################
### Start der Hauptroutine ######################################################
#################################################################################

$cookie_container = new cookie_container;
$content='';

while (!isset($http_header) OR stristr($http_header, 'Location')) {
         unset ($url);
         unset ($http_header);

	// Aktuelle Seitenadresse auslesen
         if (isset($_POST) AND count($_POST) > 0) {
                 if ($webgrab_path) $webgrab_path = base64_decode($webgrab_path);
                 else $webgrab_path = $webgrab_no_path;

		// sind die POST-Daten überhaupt für Webgrab?
		if (array_key_exists('webgrab_path', $_POST)) $webgrab_action = 'POST';
                 else $webgrab_action = 'GET';
         } else if (isset($_GET['webgrab_path']) OR isset($continue_more)) {
                 if (isset($continue_more)) $webgrab_path = $continue_more;
                 else $webgrab_path = base64_decode($webgrab_path);
                 $webgrab_action = 'GET';
         } else {
                 $webgrab_path = $webgrab_no_path;
                 $webgrab_action = 'GET';
         }
	// URL parsen
	$url = parse_url($webgrab_path);

	unset($content);
	unset($http_header);

	// REFERER herausfinden
	if (strpos($_SERVER['HTTP_REFERER'],'webgrab_path=')) {

		// DeDi-Parameter wegschneiden
         	$url['referer'] = substr($_SERVER['HTTP_REFERER'],strpos($_SERVER['HTTP_REFERER'],'webgrab_path=')+13);

		// Formparameter, falls vorhanden anfügen
		if (strpos($url['referer'],'&')) {
                 	$referer = base64_decode(substr($url['referer'], 0, strpos($url['referer'],'&')));
                 	$referer = $referer.substr($url['referer'], strpos($url['referer'],'&')+1);
                 }
                 else $referer = base64_decode($url['referer']);
         } else $referer = $webgrab_no_path;

	// Daten an Server senden und Seite abgreifen
         if ($webgrab_action == 'GET') {

		// Formularparameter auslesen
		if (is_array($_GET)) {
			$form['query'] = '';
			while (list($key, $val) = each ($_GET)) {
				if (is_array($val)) {
					while (list($cur_key, $cur_val) = each ($val)) $form['query'] .= '&'.urlencode($key).'['.urlencode($cur_key).'] = '.urlencode(stripslashes($cur_val));
				} else $form['query'] .= '&'.urlencode($key).'='.urlencode(stripslashes($val));
			}

			// DeDi GET-Parameter entfernen
			if (strpos($form['query'],'webgrab_path=')) $form['query'] = substr($form['query'], strpos($form['query'],'webgrab_path=')+13);

			// Webgrab-Parameter entfernen
			if (strpos($form['query'],'&')) $form['query'] = substr($form['query'], strpos($form['query'],'&')+1);
                         else unset($form['query']);

			// Anfrage-Querry erstellen
                        	if ($form['query']) $form['query'] = explode ('&', $form['query']);
			$send['query'] = array_merge ($url['query'], $form['query']);
			$send['query'] = implode ('&', array_unique ($send['query']));
                 }
		if ($send['query'] != '') $path = $url['path'].'?'.$send['query'];
		else $path = $url['path'];

		// Anfrage an Server senden
//		$content = GetFromHost($url['protocol'], $url['host'], $url['port'], $path, $referer);
		$content = GetFromHost($url, $referer);
         } else {

		// Formularparameter auslesen
		if (is_array($_POST)) {
			$form['query'] = '';
			while (list($key, $val) = each ($_POST)) {
				if (is_array($val)) {
					while (list($cur_key, $cur_val) = each ($val)) $form['query'] .= '&'.urlencode($key).'['.urlencode($cur_key).'] = '.urlencode(stripslashes($cur_val));
				} else $form['query'] .= '&'.urlencode($key).'='.urlencode(stripslashes($val));
			}
			if ($form['query'] != '') $form['query'] = substr($form['query'], 1);

			if (is_array($url['query'])) $url['query'] = implode ('&', $url['query']);
			if ($url['query'] != '') $path = $url['path'].'?'.$url['query'];
			else $path = $url['path'];

			// Anfrage an Server senden
			$content = PostToHost($url['host'], $path, $form['query'], $referer);
		}
	}

	// aktuellen Cookie erstellen
         $all_headers = explode("\r\n", $http_header);
         foreach ($all_headers as $this_header) {
                 if (stristr($this_header, 'Set-Cookie')) {
                         $cookie = substr($this_header, strpos(strtoupper($this_header), 'SET-COOKIE:')+11);
                         $cookie_container->put_cookie($cookie);
                 }
         }

	// wenn Weiterleitungsheader -> Seite weiterleiten
         if (stristr($http_header, 'Location')) {

		// Weiterleitungsadresse aus Header suchen
                 $new_url = substr($http_header, strpos(strtoupper($http_header), 'LOCATION:')+9);
                 if (strstr($new_url, "\n")) $new_url = substr($new_url, 0, strpos($new_url, "\n"));
                 else if (strstr($new_url, "\r")) $new_url = substr($new_url, 0, strpos($new_url, "\r"));
                 else $new_url = trim($new_url);
                 unset ($_GET);
                 unset ($_POST);
                 $continue_more = urldecode(trim($new_url));

		// relativen Pfad in absoluten umwandeln
		if (strtoupper(substr($continue_more,0,4)) != 'HTTP') {
			if ($continue_more[0] != '/') {
				if (stristr(basename($path), '.') OR stristr(basename($path), '?')) {
                                 	if (dirname($path) != '\\') $path_dir = dirname($path).'/';
                                         else $path_dir = '/';
                                 }
				else $path_dir = $path;
				$continue_more = $url['scheme'].'://'.$url['host'].$url['port'].$path_dir.$continue_more;
			} else $continue_more = $url['scheme'].'://'.$url['host'].$url['port'].$continue_more;
		}
	}
}

// Blöcke ersetzen
replace_content_blocks($content);

// Blöcke entfernen
replace_content($content);

// URLs parsen
$content = replace_url($content);

// Cookie speichern
$cookie_container->save();

// Header übernehmen
foreach ($all_headers as $this_header) {
	if (stristr($this_header, 'Expires')) header($this_header."\r\n");
	if (stristr($this_header, 'Cache-Control')) header($this_header."\r\n");
//	if (stristr($this_header, 'Content-Length')) header("Content-Length: ".strlen(trim($content))."\r\n");
}

// Seite ausgeben
echo trim($content);
?>