<?php

	/**
	 * Dieses Modul ist für die Ausgabe der Produktbilder zuständig
	 */
	class wpsg_mod_produktbilder extends wpsg_mod_basic
	{
		
		var $lizenz = 1;
		var $id = 120;
		var $hilfeURL = 'http://wpshopgermany.de/?p=530';
		
		/**
		 * Costructor
		 */
		public function __construct()
		{
			
			parent::__construct();
			
			$this->name = __('Produktbilder', 'wpsg');
			$this->group = __('Produkte', 'wpsg');
			$this->desc = __('Ermöglicht es Bilder zu Produkten anzugeben.', 'wpsg');
						
		} // public function __construct()
		
		public function install() 
		{ 
			 
			if ($this->shop->get_option('wpsg_mod_produktbilder_width') === false || $this->shop->get_option('wpsg_mod_produktbilder_width') == '') $this->shop->update_option('wpsg_mod_produktbilder_width', '150');
			if ($this->shop->get_option('wpsg_mod_produktbilder_height') === false || $this->shop->get_option('wpsg_mod_produktbilder_height') == '') $this->shop->update_option('wpsg_mod_produktbilder_height', '150');
			
			$this->shop->checkDefault('wpsg_mod_produktbilder_mode', 's');
			$this->shop->checkDefault('wpsg_mod_produktbilder_quality', '75');
			
		} // public function install()
		
		/**
		 * 
		 * Enter description here ...
		 */
		function wpsg_enqueue_scripts()
		{
			
			if (is_admin())
			{
			
				wp_enqueue_script('wpsg_ajaxupload', $this->shop->getRessourceURL('js/ajaxupload.js'));
				
			}
				
		} // function wpsg_enqueue_scripts()
		
		public function be_ajax() 
		{ 
		
			if ($_REQUEST['wpsg_mod_produktbilder_clearcache'] == '1')
			{

				$this->picClearCash();
				$this->shop->addBackendMessage(__('Bildercache gelöscht.', 'wpsg')); 
				
				$this->shop->redirect(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_produktbilder');
				
			}
			
		} // public function be_ajax()
		
		public function settings_edit()
		{
			 			
			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktbilder/settings_edit.phtml');
			
		} // public function settings_edit()
		
		public function settings_save()
		{
			
			$this->shop->update_option('wpsg_mod_produktbilder_width', $_REQUEST['wpsg_mod_produktbilder_width']);
			$this->shop->update_option('wpsg_mod_produktbilder_height', $_REQUEST['wpsg_mod_produktbilder_height']);
			$this->shop->update_option('wpsg_mod_produktbilder_mode', $_REQUEST['wpsg_mod_produktbilder_mode']);
			if ($_REQUEST['wpsg_mod_produktbilder_quality'] == '') $_REQUEST['wpsg_mod_produktbilder_quality'] = 75;
				
			$this->shop->update_option('wpsg_mod_produktbilder_quality', $_REQUEST['wpsg_mod_produktbilder_quality']);
			
		} // public function settings_save()
		
		public function admin_presentation() 
		{ 

			echo wpsg_drawForm_Checkbox('wpsg_mod_produktbilder_basketimage', __('Produktbild im Warenkorb anzeigen', 'wpsg'), $this->shop->get_option('wpsg_mod_produktbilder_basketimage'));
			echo wpsg_drawForm_Checkbox('wpsg_mod_produktbilder_overviewimage', __('Produktbild in Bestellzusammenfassung anzeigen', 'wpsg'), $this->shop->get_option('wpsg_mod_produktbilder_overviewimage')); 
			
			
		} // public function admin_presentation()
		
		public function admin_presentation_submit() 
		{ 
			
			$this->shop->update_option('wpsg_mod_produktbilder_basketimage', $_REQUEST['wpsg_mod_produktbilder_basketimage']);
			$this->shop->update_option('wpsg_mod_produktbilder_overviewimage', $_REQUEST['wpsg_mod_produktbilder_overviewimage']);
			
		} // public function admin_presentation_submit()
		 
		public function picClearCash()
		{	
			
			$handle = opendir($this->getPicPath(''));
   
			$strContent = "";
			$arFiles = array();
	   		while($filename = readdir($handle))
	   		{
	   				
	   			if (is_dir($this->getPicPath('').$filename) && $filename != "." && $filename != ".." && $filename != '')
	   			{
	   				
	   				if (file_exists($this->getPicPath('').$filename.'/tn/')) wpsg_rrmdir($this->getPicPath('').$filename."/tn/");
	   				
	   			}
	   				   				   				   				   				
	   		}
	   		
		} // public function picClearCash()

		public function produkt_ajax() 
		{
			
			if ($_REQUEST['cmd'] == 'upload')
			{

				if (file_exists($_FILES['userfile']['tmp_name']))
				{
					
					$uploaddir = $this->getPicPath($_REQUEST['edit_id']);
					
					if (!file_exists($uploaddir)) mkdir($uploaddir, 0777, true);
					if (!file_exists($uploaddir.'tn/')) mkdir($uploaddir.'tn/', 0777, true);
					
					$uploadfile = $uploaddir.basename($_FILES['userfile']['name']);
					
					move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);
					
					$uri = $this->makeTn($_REQUEST['edit_id'], $_FILES['userfile']['name'], get_option("wpsg_mod_produktbilder_width"), get_option("wpsg_mod_produktbilder_height"), get_option("wpsg_mod_produktbilder_mode"));
					
					if ($this->shop->hasMod('wpsg_mod_produktartikel')) $this->shop->callMod('wpsg_mod_produktartikel', 'updatePostThumbnail', array($_REQUEST['edit_id']));
					
					die("1");
					
				} 
				else
				{
					
					die(__('Fehler beim Upload! Datei existiert nicht.', 'wpsg'));
					
				}
				
			}
			else if ($_REQUEST['cmd'] == 'remove')
			{
								
				unlink($this->getPicPath($_REQUEST['edit_id']).'/'.$_REQUEST['file']);
				
				$this->shop->view['data']['id'] = $_REQUEST['edit_id'];				
				
				if ($this->shop->hasMod('wpsg_mod_produktartikel')) $this->shop->callMod('wpsg_mod_produktartikel', 'updatePostThumbnail', array($_REQUEST['edit_id']));
				
				die($this->getProduktBilderListe($_REQUEST['edit_id']));
				
			}
			else if ($_REQUEST['cmd'] == 'produktbilder_liste')
			{
				
				$this->shop->view['data']['id'] = $_REQUEST['edit_id'];				
				die($this->getProduktBilderListe($_REQUEST['edit_id']));
				
			}
			
		} // public function produkt_ajax()
		
		public function produkt_save(&$produkt_id) 
		{ 
		
			if (wpsg_isSizedArray($_FILES['wpsg_mod_produktbilder_file']) && file_exists($_FILES['wpsg_mod_produktbilder_file']['tmp_name']))
			{
				
				$uploaddir = $this->getPicPath($produkt_id);
				
				if (!file_exists($uploaddir)) mkdir($uploaddir, 0777, true);
				if (!file_exists($uploaddir.'tn/')) mkdir($uploaddir.'tn/', 0777, true);
				
				$uploadfile = $uploaddir.basename($_FILES['wpsg_mod_produktbilder_file']['name']);
				
				move_uploaded_file($_FILES['wpsg_mod_produktbilder_file']['tmp_name'], $uploadfile);
				
				$uri = $this->makeTn($produkt_id, $_FILES['wpsg_mod_produktbilder_file']['name'], get_option("wpsg_mod_produktbilder_width"), get_option("wpsg_mod_produktbilder_height"), get_option("wpsg_mod_produktbilder_mode"));
				
			}
			
		} // public function produkt_save(&$produkt_id)
		
		public function produkt_edit_content(&$produkt_data) 
		{ 
			
			if (isset($_REQUEST['wpsg_lang'])) return;
			
			$this->shop->view['data'] = $produkt_data;
			
			if ($produkt_data['id'] > 0)
			{

				$this->shop->view['modul'] = &$this;
				$this->shop->view['ProduktBilderPath'] = $this->getPicPath($produkt_data['id']);
				$this->shop->view['ProduktBilderURL'] = $this->getPicPath($produkt_data['id'], true);
				$this->shop->view['ProduktList'] = $this->getProduktBilderListe($produkt_data['id']);
				
			}
			
			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktbilder/produkt_edit_content.phtml');	
			
		} // public function produkt_edit_content(&$produkt_data)
		
		public function produkt_createTranslation(&$produkt_id, &$trans_id)
		{
			
		 	$path_src = $this->getPicPath($produkt_id);
		 	$path_trg = $this->getPicPath($trans_id);
		 	
		 	wpsg_copy($path_src, $path_trg);
			
		} // public function produkt_createTranslation(&$produkt_id, &$trans_id)
		
		public function produkt_copy(&$produkt_id, &$copy_id) { 
			
			// Wie bei der erstellung einer neuen Übersetzung ...
			$this->produkt_createTranslation($produkt_id, $copy_id);
			
		} // public function produkt_copy(&$produkt_id, &$copy_id)
		
		public function checkGeneralBackendError()
		{
			
						
		} // public function checkGeneralBackendError()
		
		/* Modulfunktionen */

		/**
		 * Generiert ein Bild für ein Produkt, ersetzt ###BILD_1_500_500_c###
		 * 
		 * @param unknown_type $p_id
		 * @param unknown_type $pic
		 * @param unknown_type $setW
		 * @param unknown_type $setH
		 * @param unknown_type $mode
		 */
		public function genBild($p_id, $pic, $setW, $setH, $mode, $rel = 'gallery')
		{
						
			$produkt = $this->db->fetchRow("SELECT * FROM `".WPSG_TBL_PRODUCTS."` WHERE `id` = '".wpsg_q($p_id)."'");
			
			$handle = opendir($this->getPicPath($produkt['id']));
			
			if (is_int($pic))
			{
				
				// Bilder des Produktes laden 
	   			$arBilder = $this->getProduktBilder($p_id); if ($pic > 0) $pic --;
	   				
	   			if (!array_key_exists($pic, $arBilder)) return;
	   			
	   			$pic = $arBilder[$pic];
	   			
			}
   			 
   			$this->shop->view['url_tn'] = $this->makeTn($produkt['id'], $pic, $setW, $setH, $mode);
			$this->shop->view['url_orginal'] = $this->getPicPath($produkt['id'], true).$pic;
			$this->shop->view['produkt'] = $produkt;
			$this->shop->view['rel'] = $rel;
			   			
			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktbilder/produktbild.phtml', false);
   									
		} // public function genBild($p_id, $pic, $setW, $setH, $mode)
		
		/**
		 * Wird vom Template produkt_edit_content.phtml aufgerufen und per Ajax aktualisiert.
		 * Zeichnet die Liste mit den Produktbildern
		 */
		public function getProduktBilderListe($produkt_id)
		{
			
			$this->shop->view['modul'] = &$this;
			$this->shop->view['ProduktBilderPath'] = $this->getPicPath($produkt_id);
			$this->shop->view['ProduktBilderURL'] = $this->getPicPath($produkt_id, true);
			$this->shop->view['ProduktBilder'] = $this->getProduktBilder($produkt_id);
			
			return $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_produktbilder/produkt_edit_list.phtml', false);
			
		} // public function getProduktBilderListe($produkt_id)
		
		/**
		 * Gibt die verfügbaren Möglichkeiten für den Bildzuschnitt zurück
		 */
		public function getImageModes()
		{
		
			return array(		
				'n' => __('Unbearbeitet', 'wpsg'),
				's' => __('Einpassen', 'wpsg'),
				'sz' => __('Einpassen mit Freifläche', 'wpsg'),
				'z' => __('Strecken', 'wpsg'),
				'sw' => __('Skallieren auf Breite', 'wpsg'),
				'sh' => __('Skallieren auf Höhe', 'wpsg'),
				'c' => __('Zuschneiden', 'wpsg'),
				'cz' => __('Zentrieren und Abschneiden', 'wpsg')
			);
			
		} // public function getImageModes()		
		
		/**
		 * Gibt eien Array mit den Produktbildern zurück
		 */
		public function getProduktBilder($produkt_id)
		{
			
			$arFiles = array();

			// Bilder aus dem Dateisystem raussuchen
			$path = $this->getPicPath($this->shop->getProduktId($produkt_id));
						 
			$handle = opendir($path);
			
			while ($filename = readdir($handle))
			{
				
				if (is_file($path.'/'.$filename) && $filename != '.' && $filename != '..' && $filename != '')
				{
					
					$arFiles[] = $filename;
					
				}
				
			}
			
			wpsg_asort($arFiles);
			
			$arReturn = array();
			foreach ($arFiles as $k => $v) $arReturn[] = $v;
						
			return $arReturn;
			
		} // public function getProduktBilder($produkt_id)
		
		/*
 		 * Gibt den Absoluten Pfad zurück wo die Bilder gespeichert sind
 		 * Ist der Parameter $url auf true so wird der relative Pfad für die Ausgabe in URLs zurückgegeben
 		 */
 		public function getPicPath($produkt_id, $url = false)
 		{
 		 	 			
 			if ($this->shop->isMultiBlog())
			{
 
				if ($url) return WPSG_URL_CONTENT.WPSG_MB_UPLOADS.'/wpsg/wpsg_produktbilder/'.$produkt_id.'/';
				else 
				{
					
					$path = WP_CONTENT_DIR.'/'.WPSG_MB_UPLOADS.'/wpsg/wpsg_produktbilder/'.$produkt_id.'/'; 
					
					if (!file_exists($path)) mkdir($path, 0777, true);
					
					return $path;
					
				}
				 
			}
			else
			{
				
				if ($url) return WPSG_URL_CONTENT.'uploads/wpsg_produktbilder/'.$produkt_id.'/';
				else 
				{
					
					$path = WP_CONTENT_DIR.'/uploads/wpsg_produktbilder/'.$produkt_id.'/';
					
					if (!file_exists($path)) mkdir($path, 0777, true);
					
					return $path;
					
				}
				
			}
			 
 		} // private function getPicPath($produkt_id, $url = false)

 		/**
 		 * VERALTET! Erstellt das Thumbnail zu dem Bild $file aus dem Produkt $p_id
 		 *
 		 * @param int $p_id Id des Produktes
 		 * @param String $file Dateiname des Bildes (Ohne Pfad)
 		 * @param int $setW Angestrebte Breite des Bildes
 		 * @param int $setH Angestrebte Höhe des Bildes
 		 * @param String $mode Modus 
  		 */
 		public function makeTn($p_id, $file, $setW, $setH, $mode)
		{
			
			$p_id = $this->shop->getProduktId($p_id);

			$uploaddir = $this->getPicPath($p_id);
			$uploaddir_tn = $this->getPicPath($p_id)."tn/";
			$url_bilder = $this->getPicPath($p_id, true);
			
			if (!file_exists($uploaddir)) mkdir($uploaddir, 0777, true);
			if (!file_exists($uploaddir_tn)) mkdir($uploaddir_tn, 0777, true);
			
			// Default Werte
			if ($setW <= 0) $setW = 100;
			if ($setH <= 0) $setH = 100;
			if ($mode == "" || !isset($mode)) $mode = 's';
			
			$src_file = $uploaddir.$file;
			$trg_file = $uploaddir_tn.$mode.'-'.$setW.'-'.$setH.'-'.$file;
			
			if (!file_exists($src_file) || !is_file($src_file)) return;
			
			// Quelldatei existiert nicht
			if (!file_exists($src_file)) return "FILE NOT FOUND: ".$uploaddir.$file;
			
			if (file_exists($trg_file)) return $this->shop->url(str_replace(' ', '%20', $url_bilder."tn/".$mode.'-'.$setW.'-'.$setH.'-'.$file));
			
			$b = copy($src_file, $trg_file);
 
			$ImInf = GetImageSize($trg_file);
			$W = $ImInf[0];
			$H = $ImInf[1];
			
			switch (strtolower(preg_replace("/.*\./", "", $trg_file)))
			{
				case 'gif':
					$srcImage = imagecreatefromgif($trg_file);
					break;
				case 'png':				
					$srcImage = imagecreatefrompng($trg_file);
					break;
				case 'jpg':
					$srcImage = imagecreatefromjpeg($trg_file);
					break;
				case 'bmp':
					$srcImage = imagecreatefromwbmp($trg_file);
					break;
				default:
					return __("Unbekanntes Dateiformat", "wpsg");
			}
												
			switch (strtolower($mode))
			{
				
				case 'c':	// CROP
					
					$dstImage = ImageCreateTrueColor($setW, $setH);
					 					
					imagealphablending($dstImage, false);
					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 0, 0, 0, 127));
					imagefill($dstImage, 0, 0, $color);
					imagesavealpha($dstImage, true);
					 					
					// Längste Seite finden
					if ($W > $H)
					{						
						$new_width = $W / ($H / $setH);
						imagecopyresampled($dstImage, $srcImage, 0 - ($new_width / 2) + ($setW / 2), 0, 0, 0, $new_width, $setH, $W, $H);
					}
					else
					{
						$new_height = $H / ($W / $setW);
						imagecopyresampled($dstImage, $srcImage, 0, 0 - ($new_height / 2) + ($setH / 2), 0, 0, $setW, $new_height, $W, $H);						
					}
					 
					break;	

				case 'cz': // CROP CENTER
				
					$dstImage = ImageCreateTrueColor($setW, $setH);
					
					imagealphablending($dstImage, false);
					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 0, 0, 0, 127));
					imagefill($dstImage, 0, 0, $color);
					imagesavealpha($dstImage, true);
					
					$new_width = $H * $setW / $setH;
					$new_height = $W * $setH / $setW;
					
					if ($new_width > $W)
					{
						
						$y = (($H - $new_height) / 2);
						
						imagecopyresampled($dstImage, $srcImage, 0, 0, 0, $y, $setW, $setH, $W, $new_height);
						
					}
					else
					{
						
						$x = (($W - $new_width) / 2);
						
						imagecopyresampled($dstImage, $srcImage, 0, 0, $x, 0, $setW, $setH, $new_width, $H);
						
					}
					
					break;
						
				case 'z':   // STRETCH
					 
					$dstImage = ImageCreateTrueColor($setW, $setH);
					
					imagealphablending($dstImage, false);
					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 0, 0, 0, 127));
					imagefill($dstImage, 0, 0, $color);
					imagesavealpha($dstImage, true);
					
					imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $setW, $setH, $W, $H); 
					break;
					
				case 'n': 	// NIX 
					
					return $url_bilder.$file;
					
					break;
					
				case 'sz':  // SCALE und Freifläche
					
					$dstImage = ImageCreateTrueColor($setW, $setH);
					list($width, $height) = $this->getNewSize($W, $H, $setW, $setH);					
					 
					imagealphablending($dstImage, false);					
					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 255, 255, 255, 127));
					imagefill($dstImage, 0, 0, $color);
					imagesavealpha($dstImage, true);
										
					if ($width < $setW) $dst_x = ($setW - $width) / 2;
					if ($height < $setH) $dst_x = ($setW - $width) / 2;
										
					imagecopyresampled($dstImage, $srcImage, $dst_x, $dst_y, 0, 0, $width, $height, $W, $H);														
									
					break; 	

				case 'sw': // SCALE WIDTH
					
					$height = $H / ($W / $setW);
					
					$dstImage = ImageCreateTrueColor($setW, $height);
					
					imagealphablending($dstImage, false);
					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 255, 255, 255, 127));
					imagefill($dstImage, 0, 0, $color);
					imagesavealpha($dstImage, true);
					
					imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $setW, $height, $W, $H);
						
					break;
					
				case 'sh': // SCALE HEIGHT
					
					$width = $W / ($H / $setH);
					
					$dstImage = ImageCreateTrueColor($width, $setH);
						
					imagealphablending($dstImage, false);
					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 255, 255, 255, 127));
					imagefill($dstImage, 0, 0, $color);
					imagesavealpha($dstImage, true);
						
					imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $width, $setH, $W, $H);
										
					break;
										
				case 's':	// SCALE INTO
				default:
					
					list($width, $height) = $this->getNewSize($W, $H, $setW, $setH);					
					$dstImage = ImageCreateTrueColor($width, $height);
					
					imagealphablending($dstImage, false);
					$color = imagecolortransparent($dstImage, imagecolorallocatealpha($dstImage, 0, 0, 0, 127));
					imagefill($dstImage, 0, 0, $color);
					imagesavealpha($dstImage, true);
					
					imagecopyresampled($dstImage, $srcImage, 0, 0, 0, 0, $width, $height, $W, $H);														
					break;
					
			}		
			
			switch (strtolower(preg_replace("/.*\./", "", $trg_file)))
			{
				
				case 'gif':
					ImageGIF($dstImage, $trg_file);
				case 'png':

					$quality = 9 - wpsg_round($this->shop->get_option('wpsg_mod_produktbilder_quality') / 10, 0);
					if ($quality < 9) $quality = 0;
					
					ImagePNG($dstImage, $trg_file, $quality);
					break;
				case 'jpg':
				case 'bmp':
				default:
					ImageJPEG($dstImage, $trg_file, $this->shop->get_option('wpsg_mod_produktbilder_quality'));
					break;	
								
			}		
			 
			imageDestroy($dstImage);
			imageDestroy($srcImage);	

			return $this->shop->url(str_replace(' ', '%20', $url_bilder."tn/".$mode.'-'.$setW.'-'.$setH.'-'.$file));
			
		} // private function makeTn($mode, $set_width, $set_height)
		
		/**
		 * Bestimmt die Größe im Seitenverhältnis für skallierte Bilder
		 */
		private function getNewSize($w, $h, $maxW, $maxH)
		{
		    
		    if ($w > $h)
		    {
		    	
				// Breite skallieren und schauen ob Höhe reinpasst   		
		    	// Bild ist breiter als hoch -> versuchen nach breite zu skallieren
		    	$newWidth = $maxW;
		    	$newHeight = ($maxW / $w) * $h;
		    	
		    	if ($newHeight > $maxH)
		    	{
		    		
		    		// Bild ist nach skallierung auf Breite zu hoch ! 
		    		// jetzt noch auf Höhe skallieren
		    		$newWidth = ($maxH / $newHeight) * $maxW;
		    		$newHeight = $maxH;  
		    		  			    			
		    	}
		    	
		    }
		    else 
		    {
		    	
		    	// Nach Höhe skallieren
		    	$newHeight = $maxH;
		    	$newWidth = ($maxH / $h) * $w;
		    	
		    	if ($newWidth > $maxW)
		    	{
		    		
		    		// Bild ist nach skallierung auf Höhe zu schmal !
		    		// jetzt Breite anpassen
		    		$newHeight = ($maxW / $newWidth) * $maxH;
		    		$newWidth = $maxW;
		    		
		    	}
		    	
		    }
		    
		    return array($newWidth, $newHeight);
		    
		} // function getNewSize($w, $h, $maxW, $maxH)
		
	} // class wpsg_mod_produktbilder extends wpsg_mod_basic

?>