<?php

	/**
	 * Primäre Klasse, von dem alle anderen Controller abgeleitet sind
	 */
	class wpsg_SystemController 
	{
				
		/** Datenbankobjekt */
		var $db;
		
		/** Das Shop Objekt vom Typ wpsg_ShopController */
		var $shop;
		
		/** Text des letzten CURL Fehlers */
		var $last_curl_error;
		
		/** @var array */
		var $arTemplateStack;
		
		/** @var boolean - Wird auf true gesetzt, wenn die Meldungen ausgegbene werden */
		public $bMessageOut = false;
		
		var $htmlMail = false;
		
		/**
		 * Contstructor
		 */
		public function __construct()
		{
			
			$this->db = &$GLOBALS['wpsg_db'];
			
			if (get_class($this) != 'wpsg_ShopController')
			{

				$this->shop = &$GLOBALS['wpsg_sc'];
				
			}
			
			$this->view = array();
			$this->arTemplateStack = array();
			
		} // public function __construct()
		
		/**
		 * Wird von den abgeleiteten Controllern aufgerufen wenn sie die Ausgabe übernehmen
		 */
		public function dispatch()
		{
			
			$this->shop->checkEscape();
			
		} // public function dispatch()
				
		/**
		 * Gibt eine Einstellung anhand ihres Schlssels zur�ck
		 * Erst mal nur Tunnel für die Wordpress Funktion
		 */
		public function &get_option($key, $force_global = false)
		{
			
			$return = false;
			
			if ($force_global)
				$return = get_site_option($key);
			else
				$return = get_option($key);
			
			return $return;
			
		} // public function get_option($key)
		
		/**
		 * Setzt eine Einstellung
		 * Est mal nur Tunnel für die Wordpress Funktion
		 */
		public function update_option($key, $value, $force_global = false, $addTrans = false)
		{
			
			if ($force_global)
				update_site_option($key, $value);
			else
				update_option($key, $value);
			
			if ($addTrans === true) $GLOBALS['wpsg_sc']->addTranslationString($key, $value);
			
		} // public function update_option($key, $value)
		
		/**
		 * Führt eine Header Weiterleitung durch. Es darf vorher keine Ausgabe erfolgen (logischerweise)
		 */
		public function redirect($url) 
		{
		
			header('Location: '.html_entity_decode($url));
			exit;
			
		} // public function redirect($url)
		
		/**
		 * Führt eine Anfrage an $url mittels curl durch und liefert das Ergebniss als String zurück
		 * POST Daten können dabei mittels $post_data angehängt werden
		 * @param string $url URL die angefragt werden soll
		 * @param array $post_data Daten, die mittels POST mitgesendet werden sollen
		 */
		public function get_url_post_content($url, $post_data = array(), $addition_curl_options = array())
		{
			
			$ch = curl_init();
			
			curl_setopt($ch, CURLOPT_HEADER, 0);
			
			if (wpsg_isSizedArray($addition_curl_options))
			{
				
				foreach ($addition_curl_options as $option_key => $option_value)
				{
					 
					curl_setopt($ch, $option_key, $option_value);
					
				}
				
			}
						
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($ch, CURLOPT_URL, $url);
			curl_setopt($ch, CURLOPT_POST, count($post_data));
			curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data, null, '&'));
			
			$data = curl_exec($ch); 
			
			if ($data === false)
			{
			
				$this->last_curl_error = curl_error($ch);
				
				wpsg_debug(curl_error($ch));
				
			}
			
			curl_close($ch); 
			
			return $data;
			
		} // public function get_url_post_content($url, $post_data = array())
		
		/**
		 * Gibt die Antwort einer URL zurück
		 */
		public function get_url_content($url)
		{
			
			$Return = @file_get_contents($url);			
						
			if (!$Return)
			{

				$ch = curl_init();
 
				curl_setopt($ch, CURLOPT_HEADER, 0);
				curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
				curl_setopt($ch, CURLOPT_URL, $url);
 
				$data = curl_exec($ch); 
				curl_close($ch);
 
				return $data;
				
			}
			else
			{
				
				return $Return;
				
			}
			
		} // public function get_url_content($url)
		
		/**
		 * Fügt eine Hinweismeldung eines Backend Moduls hinzu 
 		 * Wird mittels writeBackendMessage ausgegeben
		 */
		public function addBackendMessage($message)
		{
			
			if (!wpsg_isSizedArray($_SESSION['wpsg']['backendMessage'])) $_SESSION['wpsg']['backendMessage'] = array();
			
			$_SESSION['wpsg']['backendMessage'][] = $message;
			
		} // public function addBackendMessage($message)
		
		/**
		 * Fügt eine neue Fehlermeldung eines Backend Moduls hinzu
		 * @param \String $hideLink Soll die Meldung ausblendbar sein, so muss ein Key mitgegeben werden der die Meldung identifiziert
		 */
		public function addBackendError($message, $hideLinkKey = false, $addBlendOut = true)
		{
			
			if ($hideLinkKey === false) $message_key = md5($message);
			else $message_key = $hideLinkKey;
			
			// Wenn schon drin, dann nichts machen
			if (array_key_exists($message_key, (array)$_SESSION['wpsg']['backendError'])) return;
			
			if (wpsg_isSizedString($hideLinkKey) && $addBlendOut === true)
			{
				
				// Wurde die Meldung bereits ausgeblendet ?
				if ($this->get_option($hideLinkKey) === '1')
				{
					
					return false;
					
				}
				
				$message .= '<p style="float:right;">'.wpsg_translate(
					__('<a href="#1#">Klicken Sie hier, um die Meldung auszublenden.</a>', 'wpsg'),
						WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&noheader=1&action=clearMessage&wpsg_message='.$hideLinkKey.'&wpsg_redirect='.rawurlencode($_SERVER['REQUEST_URI'])
				).'</p><div class="wpsg_clearer"></div><br />';
				
			}
							
			$_SESSION['wpsg']['backendError'][$message_key] = $message;
							
		} // public function addBackendError($message, $hideLinkKey = false)
		
		/**
		 * Ersetzt die alte addOneViewError
		 * Zeigt Meldungen persistent im Backend an, bis sie gelesen wurden oder durch den Shop entfernt wurden
		 * 
		 * @param unknown $message
		 * @param unknown $message_key
		 */
		public function addPersistentBackendError($message, $message_key)
		{
			
			$arPersistentBackendError = $this->get_option('wpsg_persistentBackendError');
			if (!is_array($arPersistentBackendError)) $arPersistentBackendError = array();
			
			if (!array_key_exists($message_key, $arPersistentBackendError)) 
				$arPersistentBackendError[$message_key] = array(
					'message' => $message,
					'hide' => false
				);
			
			$this->update_option('wpsg_persistentBackendError', $arPersistentBackendError);
			
		} // public function addPersistentBackendError($message, $message_key)
		
		/**
		 * Entfernt eine Meldung, wenn Sie nicht länger angezeigt werden soll
		 * 
		 * @param unknown $message_key
		 */
		public function removePersistentBackendError($message_key)
		{
			
			$arPersistentBackendError = $this->get_option('wpsg_persistentBackendError');
			if (!is_array($arPersistentBackendError)) $arPersistentBackendError = array();
			
			if (array_key_exists($message_key, $arPersistentBackendError)) unset($arPersistentBackendError[$message_key]);
			
			$this->update_option('wpsg_persistentBackendError', $arPersistentBackendError);
			
		} // public function removePersistentBackendError($message_key)
		
		public function hidePersistentBackendError($message_key)
		{
			
			$arPersistentBackendError = $this->get_option('wpsg_persistentBackendError');
			if (!is_array($arPersistentBackendError)) $arPersistentBackendError = array();
			
			if (array_key_exists($message_key, $arPersistentBackendError)) $arPersistentBackendError[$message_key]['hide'] = true;
			
			$this->update_option('wpsg_persistentBackendError', $arPersistentBackendError);
			
		} // public function hidePersistentBackendError($message_key)
		
		/**
		 * Fügt eine Meldung fürs Frontend hinzu
		 * Die Meldungen werden zum nächstmöglichen Zeitpunkt ausgegeben
		 */
		public function addFrontendMessage($message)
		{
			
			if (!isset($_SESSION['wpsg']['frontendMessage'])) $_SESSION['wpsg']['frontendMessage'] = array();
			
			if (!in_array($message, (array)$_SESSION['wpsg']['frontendMessage'])) $_SESSION['wpsg']['frontendMessage'][] = $message;
			
		} // public function addFrontendMessage($message)
		
		/**
		 * Fügt eine Fehlermeldung fürs Frontend hinzu
		 * Die Meldungen werden zum nächstmöglichen Zeitpunkt ausgegeben
		 */
		public function addFrontendError($message)
		{
			
			if (!isset($_SESSION['wpsg']['frontendError'])) $_SESSION['wpsg']['frontendError'] = array();
			
			if (!in_array($message, (array)$_SESSION['wpsg']['frontendError'])) $_SESSION['wpsg']['frontendError'][] = $message;
								
		} // public function addFrontendError($error)
		
		/**
		 * Gibt die Fehler und Hinweise im Frontend aus
		 */
		public function writeFrontendMessage()
		{
			
			$this->bMessageOut = true;
			
			$strOut  = '';
			
			if (wpsg_isSizedArray($_SESSION['wpsg']['frontendMessage']))
			{
	 
				$strOut  .= '<div id="wpsg_message" class="published updated">';
				
				foreach ($_SESSION['wpsg']['frontendMessage'] as $m) 
				{
					$strOut .= '<p>'.$m.'</p>';
				}
	
				$strOut .= '</div>';

				//wird jetzt in der Shutdown Action gemacht
				//unset($_SESSION['wpsg']['frontendMessage']);
				
			}
										
			if (wpsg_isSizedArray($_SESSION['wpsg']['frontendError']))
			{

				$strOut  .= '<div id="wpsg_error" class="published error">';
				
				foreach ($_SESSION['wpsg']['frontendError'] as $m) 
				{
					$strOut .= '<p>'.$m.'</p>';
				}
	
				$strOut .= '</div>';
				
				//wird jetzt in der Shutdown Action gemacht
				//unset($_SESSION['wpsg']['frontendError']);
				
			}
		 
			return $strOut;
			
		} // public function writeFrontendMessage()
		
		/**
		 * Gibt die Backend Messages aus 
		 */
		public function writeBackendMessage()
		{

			$this->bMessageOut = true;
			
			$strOut  = '';
			 
			// Updatefehler etc.
			$arPersistentBackendError = $this->get_option('wpsg_persistentBackendError');
				
			if (wpsg_isSizedArray($arPersistentBackendError))
			{
			
				$strMessageOut = "";
							
				foreach ($arPersistentBackendError as $message_key => $message)
				{
		 	
					if ($message['hide'] !== true)
					{
							
						$strMessageOut .= '<p>';
						$strMessageOut .= $message['message'];
						$strMessageOut .= '<a title="'.__('Meldung ausblenden', 'wpsg').'" href="'.WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&noheader=1&action=clearMessage&wpsg_message='.$message_key.'&wpsg_redirect='.rawurlencode($_SERVER['REQUEST_URI']).'">';
						$strMessageOut .= '<img src="'.$this->getRessourceURL('gfx/bin_x.png').'" alt="'.__('Meldung ausblenden', 'wpsg').'" />';
						$strMessageOut .= '</a>';
						$strMessageOut .= '</p>';
			
					}
						
				}
			
				if (wpsg_isSizedString($strMessageOut)) $strOut .= '<div id="message" class="wpsg_message error">'.$strMessageOut.'</div>';
							
			}
			
			//if (!isset($_SESSION['wpsg']['backendMessage']) && !isset($_SESSION['wpsg']['backendError'])) return $strOut;
			
			if (is_array($_SESSION['wpsg']['backendMessage']) && sizeof($_SESSION['wpsg']['backendMessage']) > 0)
			{
			
				$strOut  .= '<div id="message" class="updated">';
				
				foreach ($_SESSION['wpsg']['backendMessage'] as $m) 
				{
					
					if (preg_match('/^nohspc_/', $m))
					{
						$strOut .= '<p>'.preg_replace('/^nohspc_/', '', $m).'</p>';
					}
					else
					{					
						$strOut .= '<p>'.wpsg_hspc($m).'</p>';
					}
					
				}
	
				$strOut .= '</div>';

				unset($_SESSION['wpsg']['backendMessage']);
				
			}
			
			if (wpsg_isSizedArray($_SESSION['wpsg']['backendError']))
			{

				//$strOut  .= '<div id="message" class="error below-h2">';
				$strOut  .= '<div id="message" class="error">'; // below-h2 nicht setzen sonst schiebt sich diese Meldung über das Banner
				
				foreach ($_SESSION['wpsg']['backendError'] as $m) 
				{
					
					if (preg_match('/^nohspc_/',$m))
					{
						$strOut .= '<p>'.preg_replace('/^nohspc_/', '', $m).'</p>';
					}
					else
					{
						$strOut .= '<p>'.wpsg_hspc($m).'</p>';
					}
					
				}
	
				$strOut .= '</div>'; 
				
			}
			 
			if (wpsg_isSizedString($strOut)) $strOut = '<div class="wrap">'.$strOut.'</div>';
			
			if (!$this->hasMod('wpsg_mod_core')) 
			{
				
				// Free Version => Bannern
				$banner = base64_decode(strrev('==wZwpmLwYDe4YDNyVmbuFmQtA1VvIXZu5WYi9yczVmcwRmcvd3LlRmLx4WZoNmbuVWYt5yZtl2LvoDc0RHa')); //http://img.maennchen1.de/wordpress/banner/WP-Banner468x60.jpg

				if (@file_get_contents($banner))
				{
				
					$strOut = '<div class="msg_wrap"><a href="http://shop.maennchen1.de/category/wpshopgermany/" target="_blank"><img src="'.$banner.'" /></a><br />'.$strOut.'</div>';
					
				}
				
			}
			
			return $strOut;
			
		} // public function writeBackendMessage()
		
		/**
		 * Löscht die Session mit den fehlerhaft eingegebenen Feldern
		 */
		public function ClearSessionErrors()
		{
			
			unset($_SESSION['wpsg']['errorFields']);
			
		} // public function ClearSessionErrors()
		
		/**
		 * Löscht die Fehlermeldungen für das Frontend
		 */
		public function clearFrontendError()
		{
			
			unset($_SESSION['wpsg']['frontendError']);
			
		}
		
		/**
		 * Löscht die Meldungen für das Frontend
		 */
		public function clearFrontendMessage()
		{
		
			unset($_SESSION['wpsg']['frontendMessage']);
			
		}
				
		/**
		 * Löscht die Meldungen aus der Session
		 */
		public function clearMessages()
		{
				
			unset($_SESSION['wpsg']['backendError']);
			unset($_SESSION['wpsg']['backendMessage']);
				
			$this->clearFrontendError();
			$this->clearFrontendMessage();
							
		} // public function clearMessages()
		
		/**
		 * Gibt die URL zu einer Ressource (JS/GFX/CSS/..) die unter views liegt zurück
		 * In der Variable path wird der Pfad ab dem views Verzeichni übergeben. Es wird dann geprüft ob die Ressource
		 * im user_views liegt und wenn ja dieser Pfad zurückgegeben
		 */
		public function getRessourceURL($path)
		{
			
			if (file_exists(WPSG_PATH_USERVIEW.$path) && $this->get_option('wpsg_ignoreuserview') != '1')
			{
				
				// Datei existiert im UserView
				$url = WPSG_URL_USERVIEW.$path;
				
			}
			else if (file_exists(WPSG_PATH_TEMPLATEVIEW.'/'.$path) && $this->get_option('wpsg_ignoreuserview') != '1')
			{
				
				// Datei existiert im Template
				$url = get_template_directory_uri().'/wpsg_views/'.$path;
				
			}
			else if (file_exists(WPSG_PATH_USERVIEW_OLD.'/'.$path) && $this->get_option('wpsg_ignoreuserview') != '1')			
			{
				
				// Datei existiert im alten UserView
				$url = WPSG_URL_CONTENT.'plugins/wpshopgermany/user_views/'.$path;
				
			}
			else
			{
				
				$url = WPSG_URL_CONTENT.'plugins/wpshopgermany/views/'.$path;
				
			}
			
			$url = $this->url($url);
			
			return $url;
			
		} // public function getRessourceURL($path)
		
		/**
		 * Gibt die URL für die Flaggen bei Mehrsprachigkeit zurück
		 */
		public function getFlagURL()
		{
			
			return WPSG_URL_CONTENT.'plugins/qtranslate-x/flags/';
			
		} // public function getFlagURL()
		
		/**
		 * Bearbeitet URLs
		 * Die Funktion macht erst einmal nichts
		 * @param \String $url URL vor Bearbeitung
		 * @return \String $url URL nach Bearbeitung
		 */
		public function url($url)
		{
			
			return $url;
			//return preg_replace('/(^http:\/\/)|(^https:\/\/)|(^ssl:\/\/)/', '//', $url);
			
		} // public function url($url)
		
		/**
		 * Gitb Pfad zu einer Datei die unter views liegt zurück
		 * In der Variable path wird der Pfad ab dem views Verzeichni übergeben. Es wird dann geprüft ob die Datei
		 * im user_views liegt und wenn ja dieser Pfad zurückgegeben
		 */
		public function getRessourcePath($path)
		{

			if (file_exists(WPSG_PATH_USERVIEW.$path))
			{
			
				// Datei existiert im UserView
				return WPSG_PATH_USERVIEW.$path;
				
			}
			else if (file_exists(WPSG_PATH_TEMPLATEVIEW.'/'.$path))
			{
				
				// Datei existiert im Template
				return WPSG_PATH_TEMPLATEVIEW.'/'.$path;
				
			}
			else if (file_exists(WPSG_PATH_USERVIEW_OLD.'/'.$path))
			{

				// Datei existiert im alten UserView
				return WPSG_PATH_USERVIEW_OLD.'/'.$path;
				
			}
			else
			{

				return WPSG_PATH_VIEW.'/'.$path;
				
			}
			
		} // public function getRessourceURL($path)
		
		/**
		 * Zeigt eine Template Datei an
		 */
		public function render($file, $out = true)
		{

			$this->arTemplateStack[] = preg_replace('/(.*)\//', '', $file);
			
			// Datei im UserView
			$uv_file = str_replace(WPSG_PATH_VIEW, WPSG_PATH_USERVIEW, $file);
			$uv_old_file = str_replace(WPSG_PATH_VIEW, WPSG_PATH_USERVIEW_OLD, $file);
			$theme_file = str_replace(WPSG_PATH_VIEW, WPSG_PATH_TEMPLATEVIEW, $file);
						
			if (!$out) { ob_start(); }
			
			if (sizeof($this->arTemplateStack) == 1 && $this->get_option('wpsg_autoraw') === '1' && !is_admin() && !$this->bShortcode) echo '[raw]';
			
			if (file_exists($uv_file) && $this->get_option('wpsg_ignoreuserview') != '1')
			{
				include $uv_file;
			}
			else if (file_exists($theme_file) && $this->get_option('wpsg_ignoreuserview') != '1')
			{				 
				include $theme_file;				
			}
			else if (file_exists($uv_old_file) && $this->get_option('wpsg_ignoreuserview') != '1')
			{
				include $uv_old_file;
			}
			else if (file_exists($file))
			{					
				include $file;
			}
			else
			{
				die(wpsg_translate(__("Templatedatei existiert nicht (#1#) !", 'wpsg'), $file));
			}
			
			if (sizeof($this->arTemplateStack) == 1 && $this->get_option('wpsg_autoraw') === '1' && !is_admin() && !$this->bShortcode) echo '[/raw]';
			
			array_pop($this->arTemplateStack);
						
			if (!$out) { $content = ob_get_contents(); ob_end_clean(); return $content; }
			
		} // public function render($file)
		
		/**
		 * Erstellt eine neue Seite im Wordpress 
		 */
		public function createPage($title, $page_key, $page_id)
		{

			global $wpdb, $current_user;
			
			if ($page_id == -1) 
			{
				
				$user_id = 0;
			
				if (function_exists("get_currentuserinfo"))
				{
					get_currentuserinfo();
					$user_id = $current_user->user_ID;
				}
				
				if ($user_id == 0 && function_exists("get_current_user_id"))
				{
					$user_id = get_current_user_id();
				} 
				
				$page_id = $this->db->ImportQuery($wpdb->prefix."posts", array(
					"post_author" => $user_id,
					"post_date" => "NOW()",
					"post_title" => $title,
					"post_date_gmt" => "NOW()",
					"post_name" => mb_strtolower($title),
					"post_status" => "publish",
					"comment_status" => "closed",
					"ping_status" => "neue-seite",
					"post_type" => "page",
					"post_content" => '',
					"ping_status" => "closed",
					"comment_status" => "closed",
					"post_excerpt" => "",
					"to_ping" => "",
					"pinged" => "",
					"post_content_filtered" => ""
				));

				$this->db->UpdateQuery($wpdb->prefix."posts", array(
					"post_name" => $this->clear($title, $page_id)
				), "`ID` = '".wpsg_q($page_id)."'");
				
			}
			
			if ($page_id > 0) 
			{
				
				$this->update_option($page_key, $page_id);
				
			} 
			
		} // private function createPage($title)
		 
		/**
		 * Bereinigt den URL Key bzw. das Path Segment
		 * Ist der Parameter post_id angegeben, so wird überprüft das kein Post ungleich dieser ID mit diesem Segment existiert
		 */
		public function clear($value, $post_id = false)
		{
				 
			global $wpdb;
			
			$arReplace = array(
				'/Ö/' => 'Oe', '/ö/' => 'oe',
				'/Ü/' => 'Ue', '/ü/' => 'ue',
				'/Ä/' => 'Ae', '/ä/' => 'ae',
				'/ß/' => 'ss', '/\040/' => '-',
				'/\€/' => 'EURO',
				'/\//' => '_',
				'/\[/' => '',
				'/\]/' => '',
				'/\|/' => ''
			);
			
			$strReturn = preg_replace(array_keys($arReplace), array_values($arReplace), $value);
			$strReturn = sanitize_title($strReturn);
		 			
			if (is_numeric($post_id) && $post_id > 0)
			{
				
				$n = 0;
				
				while (true)
				{
					
					$n ++;
					
					$nPostsSame = $this->db->fetchOne("SELECT COUNT(*) FROM `".$wpdb->prefix."posts` WHERE `post_name` = '".wpsg_q($strReturn)."' AND `id` != '".wpsg_q($post_id)."'");
					
					if ($nPostsSame > 0)
					{
						
						$strReturn .= $n;
						
					}
					else
					{
						
						break;
						
					}
					
				}
				
			}
			
			return $strReturn;
			
		} // private function clear($value)
		
	} // public class SystemController 

?>