<?php
/*
 File: /app/controllers/components/image.php
*/
class ImageComponent extends Object
{
	/*  from http://sabbour.wordpress.com/2008/05/13/image-upload-and-resize-component-for-cakephp-12/
	*	Uploads an image and its thumbnail into $folderName/big and $folderName/small respectivley.
	* 	the  generated thumnail could either have the same aspect ratio as the uploaded image, or could 
	*	be a zoomed and cropped version.
	
	* 	Directions:
	*	In view where you upload the image, make sure your form creation is similar to the following
	*	<?= $form->create('FurnitureSet',array('type' => 'file')); ?>
	*
	*	In view where you upload the image, make sure that you have a file input similar to the following
	*	<?= $form->file('Image/name1'); ?>
	*	
	*	In the controller, add the component to your components array
	*	var $components = array("Image");
	*
	*	In your controller action (the parameters are expained below)
	*	$image_path = $this->Image->upload_image_and_thumbnail($this->data,"name1",573,80,"sets",true);
	*	this returns the file name of the result image.  You can  store this file name in the database
	*
	*	Note that your image will be stored in 2 locations:
	*	Image: /webroot/img/$folderName/big/$image_path 
	*	Thumbnail:  /webroot/img/$folderName/small/$image_path 
	*
	*	Finally in the view where you want to see the images
	*	<?= $html->image('sets/big/'.$furnitureSet['FurnitureSet']['image_path']);
	* 	where "sets" is the folder name we saved our pictures in, and $furnitureSet['FurnitureSet']['image_path'] is the file name we stored in the database
	
	*	Parameters:
	*	$data: CakePHP data array from the form
	*	$datakey: key in the $data array. If you used <?= $form->file('Image/name1'); ?> in your view, then $datakey = name1
	*	$imgscale: the maximum width or height that you want your picture to be resized to
	*	$thumbscale: the maximum width or height that you want your thumbnail to be resized to
	*	$folderName: the name of the parent folder of the images. The images will be stored to /webroot/img/$folderName/big/ and  /webroot/img/$folderName/small/
	*	$square: a boolean flag indicating whether you want square and zoom cropped thumbnails, or thumbnails with the same aspect ratio of the source image
	*/	
	function upload_image_and_thumbnail($data, $datakey, $imgscale, $thumbscale, $folderName, $square) {
		if (strlen($data['Image'][$datakey]['name'])>4){ 
					$error = 0;
					$tempuploaddir = "img/temp"; // the /temp/ directory, should delete the image after we upload
					$biguploaddir = "img/".$folderName."/big"; // the /big/ directory
					$smalluploaddir = "img/".$folderName."/small"; // the /small/ directory for thumbnails
					
					// Make sure the required directories exist, and create them if necessary
					if(!is_dir($tempuploaddir)) mkdir($tempuploaddir,true);
					if(!is_dir($biguploaddir)) mkdir($biguploaddir,true);
					if(!is_dir($smalluploaddir)) mkdir($smalluploaddir,true);
					
					$filetype = $this->getFileExtension($data['Image'][$datakey]['name']);
					$filetype = strtolower($filetype);
 
					if (($filetype != "jpeg")  && ($filetype != "jpg") && ($filetype != "gif") && ($filetype != "png"))
					{
						// verify the extension
						return;
					}
					else
					{
						// Get the image size
						$imgsize = GetImageSize($data['Image'][$datakey]['tmp_name']);
					}

					// Generate a unique name for the image (from the timestamp)
					$id_unic = str_replace(".", "", strtotime ("now"));
					$filename = $id_unic;
					  
					settype($filename,"string");
					$filename.= ".";
					$filename.=$filetype;
					$tempfile = $tempuploaddir . "/$filename";
					$resizedfile = $biguploaddir . "/$filename";
					$croppedfile = $smalluploaddir . "/$filename";
					
					
					if (is_uploaded_file($data['Image'][$datakey]['tmp_name']))
                    {                    
						// Copy the image into the temporary directory
                        if (!copy($data['Image'][$datakey]['tmp_name'],"$tempfile"))
                        {
                            print "Error Uploading File!.";
                            exit(); 
                        }
						else {				
							/*
							 *	Generate the big version of the image with max of $imgscale in either directions
							 */
							$this->resize_img($tempfile, $imgscale, $resizedfile);							
							
							if($square) {
								/*
								 *	Generate the small square version of the image with scale of $thumbscale
								 */
								$this->crop_img($tempfile, $thumbscale, $croppedfile);
							}
							else {
								/*
								 *	Generate the big version of the image with max of $imgscale in either directions
								 */
								$this->resize_img($tempfile, $thumbscale, $croppedfile);
							}
							
							// Delete the temporary image
							unlink($tempfile);
						}
                    }
 
                     // Image uploaded, return the file name
					 return $filename;   
		}
	}
	
	/*
	*	Deletes the image and its associated thumbnail
	*	Example in controller action:	$this->Image->delete_image("1210632285.jpg","sets");
	*
	*	Parameters:
	*	$filename: The file name of the image
	*	$folderName: the name of the parent folder of the images. The images will be stored to /webroot/img/$folderName/big/ and  /webroot/img/$folderName/small/
	*/
	function delete_image($filename,$folderName) {
		unlink("img/".$folderName."/big/".$filename);
		unlink("img/".$folderName."/small/".$filename);
	}
	
    function crop_img($imgname, $scale, $filename) {	
		$filetype = $this->getFileExtension($imgname);
		$filetype = strtolower($filetype);
			  
		switch($filetype){
			case "jpeg":
			case "jpg":
			  $img_src = ImageCreateFromjpeg ($imgname);
			 break;
			 case "gif":
			  $img_src = imagecreatefromgif ($imgname);
			 break;
			 case "png":
			  $img_src = imagecreatefrompng ($imgname);
			 break;
		}
		
	    $width = imagesx($img_src);
	    $height = imagesy($img_src);
	    $ratiox = $width / $height * $scale;
	    $ratioy = $height / $width * $scale;
		 
	    //-- Calculate resampling
	    $newheight = ($width <= $height) ? $ratioy : $scale;
	    $newwidth = ($width <= $height) ? $scale : $ratiox;
		
	    //-- Calculate cropping (division by zero)
	    $cropx = ($newwidth - $scale != 0) ? ($newwidth - $scale) / 2 : 0;
	    $cropy = ($newheight - $scale != 0) ? ($newheight - $scale) / 2 : 0;
		
	    //-- Setup Resample & Crop buffers
	    $resampled = imagecreatetruecolor($newwidth, $newheight);
	    $cropped = imagecreatetruecolor($scale, $scale);
		
	    //-- Resample
	    imagecopyresampled($resampled, $img_src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
	    //-- Crop
	    imagecopy($cropped, $resampled, 0, 0, $cropx, $cropy, $newwidth, $newheight);

		// Save the cropped image
		switch($filetype)
		{
			case "jpeg":
			case "jpg":
			 imagejpeg($cropped,$filename,80);
			 break;
			 case "gif":
			 imagegif($cropped,$filename,80);
			 break;
			 case "png":
			 imagepng($cropped,$filename,80);
			 break;
		}
    }
	
	function resize_img($imgname, $size, $filename)	{
		$filetype = $this->getFileExtension($imgname);
		$filetype = strtolower($filetype);

		switch($filetype) {
			case "jpeg":
			case "jpg":
			$img_src = ImageCreateFromjpeg ($imgname);
			break;
			case "gif":
			$img_src = imagecreatefromgif ($imgname);
			break;
			case "png":
			$img_src = imagecreatefrompng ($imgname);
			break;
		}

		$true_width = imagesx($img_src);
		$true_height = imagesy($img_src);

		if ($true_width>=$true_height)
		{
			$width=$size;
			$height = ($width/$true_width)*$true_height;
		}
		else
		{
			$width=$size;
			$height = ($width/$true_width)*$true_height;
		}
		$img_des = ImageCreateTrueColor($width,$height);
		imagecopyresampled ($img_des, $img_src, 0, 0, 0, 0, $width, $height, $true_width, $true_height);

		// Save the resized image
		switch($filetype)
		{
			case "jpeg":
			case "jpg":
			 imagejpeg($img_des,$filename,80);
			 break;
			 case "gif":
			 imagegif($img_des,$filename,80);
			 break;
			 case "png":
			 imagepng($img_des,$filename,80);
			 break;
		}
	}
 
    function getFileExtension($str) {
 
        $i = strrpos($str,".");
        if (!$i) { return ""; }
        $l = strlen($str) - $i;
        $ext = substr($str,$i+1,$l);
        return $ext;
    }
} ?>
