<?php
	/**
	 * Elgg multi-image uploader action
	* 
	* This will upload up to 10 images at at time to an album
	 */

	global $CONFIG;
	include dirname(dirname(__FILE__)) . "/lib/resize.php";
	include dirname(dirname(__FILE__)) . "/lib/exif.php";

	// Make sure we're logged in 
	gatekeeper();
	
	// Get common variables
	$access_id = (int) get_input("access_id");
	$container_guid = (int) get_input('container_guid', 0);
	if (!$container_guid)
		$container_guid == $_SESSION['user']->getGUID();

	$album = get_entity($container_guid);

	$maxfilesize = (float) get_plugin_setting('maxfilesize','tidypics'); 
	if (!$maxfilesize)
		$maxfilesize = 5; // default to 5 MB if not set 
	$maxfilesize = 1024 * 1024 * $maxfilesize; // convert to bytes from MBs

	$quota = get_plugin_setting('quota','tidypics');
	$quota = 1024 * 1024 * $quota;
	$image_repo_size_md = get_metadata_byname($album->container_guid, "image_repo_size");
	$image_repo_size = (int)$image_repo_size_md->value;

	$image_lib = get_plugin_setting('image_lib', 'tidypics');
	if (!$image_lib)
		$image_lib = "GD";

	// post limit exceeded
	if (count($_FILES) == 0) {
		trigger_error('Tidypics warning: user exceeded post limit on image upload', E_USER_WARNING);
		register_error(elgg_echo('tidypics:exceedpostlimit'));
		forward(get_input('forward_url', $_SERVER['HTTP_REFERER']));
	}

	// test to make sure at least 1 image was selected by user
	$num_images = 0;
	foreach($_FILES as $key => $sent_file) {
		if (!empty($sent_file['name']))
			$num_images++;
	}
	if ($num_images == 0) {
		// have user try again
		register_error(elgg_echo('tidypics:noimages'));
		forward(get_input('forward_url', $_SERVER['HTTP_REFERER']));
	}

	$uploaded_images = array();
	$not_uploaded = array();
	$error_msgs = array();
	
	$img_river_view = get_plugin_setting('img_river_view', 'tidypics');
	
	$accepted_formats = array(
								'image/jpeg',
								'image/png',
								'image/gif',
								'image/pjpeg',
								'image/x-png',
								);


	foreach($_FILES as $key => $sent_file) {
		
		// skip empty entries 
		if (empty($sent_file['name']))
			continue;
		
		$name = $sent_file['name'];
		$mime = $sent_file['type'];

		if ($sent_file['error']) {
			array_push($not_uploaded, $sent_file['name']);
			if ($sent_file['error'] == 1) {
				trigger_error('Tidypics warning: image exceed server php upload limit', E_USER_WARNING);
				array_push($error_msgs, elgg_echo('tidypics:image_mem'));
			}
			else {
				array_push($error_msgs, elgg_echo('tidypics:unk_error'));
			}
			continue;
		}
		
		//make sure file is an image
		if (!in_array($mime, $accepted_formats)) {
			array_push($not_uploaded, $sent_file['name']);
			array_push($error_msgs, elgg_echo('tidypics:not_image'));
			continue;
		}

		// check quota
		if ($quota) {
			if ($image_repo_size + $sent_file['size'] > $quota) {
				array_push($not_uploaded, $sent_file['name']);
				array_push($error_msgs, elgg_echo('tidypics:exceed_quota'));
				continue;
			}
		}
		
		// make sure file does not exceed memory limit
		if ($sent_file['size'] > $maxfilesize) {
			array_push($not_uploaded, $sent_file['name']);
			array_push($error_msgs, elgg_echo('tidypics:image_mem'));
			continue;
		}
		
		// make sure the in memory image size does not exceed memory available - GD only
		$imginfo = getimagesize($sent_file['tmp_name']);
		$mem_avail = ini_get('memory_limit');
		$mem_avail = rtrim($mem_avail, 'M');
		$mem_avail = $mem_avail * 1024 * 1024;
		if ($image_lib == 'GD') {
			$mem_required = ceil(5.35 * $imginfo[0] * $imginfo[1]);
			
			$mem_used = memory_get_usage();
				
			$mem_avail = $mem_avail - $mem_used - 2097152; // 2 MB buffer
			if ($mem_required > $mem_avail) {
				array_push($not_uploaded, $sent_file['name']);
				array_push($error_msgs, elgg_echo('tidypics:image_pixels'));
				trigger_error('Tidypics warning: image memory size too large for resizing so rejecting', E_USER_WARNING);
				continue;
			}
		} else if ($image_lib == 'ImageMagickPHP') {
			// haven't been able to determine a limit like there is for GD
		}

		//this will save to users folder in /image/ and organize by photo album
		$prefix = "image/" . $container_guid . "/";
		$file = new ElggFile();
		$filestorename = strtolower(time().$name);
		$file->setFilename($prefix.$filestorename);
		$file->setMimeType($mime);
		$file->originalfilename = $name;
		$file->subtype="image";
		$file->simpletype="image";
		$file->access_id = $access_id;
		if ($container_guid) {
			$file->container_guid = $container_guid;
		}
		$file->open("write");
		$file->write(get_uploaded_file($key));
		$file->close();
		$result = $file->save();

		if (!$result) {
			array_push($not_uploaded, $sent_file['name']);
			array_push($error_msgs, elgg_echo('tidypics:save_error'));
			continue;
		}
		
		//get and store the exif data
		td_get_exif($file);
		
		
		// resize photos to create thumbnails
		if ($image_lib == 'ImageMagick') { // ImageMagick command line
			
			if (tp_create_im_cmdline_thumbnails($file, $prefix, $filestorename) != true) {
				trigger_error('Tidypics warning: failed to create thumbnails - ImageMagick command line', E_USER_WARNING);
			}
			
		} else if ($image_lib == 'ImageMagickPHP') {  // imagick php extension 
			
			if (tp_create_imagick_thumbnails($file, $prefix, $filestorename) != true) {
				trigger_error('Tidypics warning: failed to create thumbnails - ImageMagick PHP', E_USER_WARNING);
			}
		
		} else { 
			
			if (tp_create_gd_thumbnails($file, $prefix, $filestorename) != true) {
				trigger_error('Tidypics warning: failed to create thumbnails - GD', E_USER_WARNING);
			}
			
		} // end of image library selector

		//keep one file handy so we can add a notice to the river if single image option selected
		if(!$file_for_river) {
			$file_for_river = $file;
		}

		array_push($uploaded_images, $file->guid);

		// update user/group size for checking quota
		$image_repo_size += $sent_file['size'];

		// plugins can register to be told when a new image has been uploaded
		trigger_elgg_event('upload', 'tp_image', $file);
		
		// successful upload so check if this is a new album and throw river event/notification if so
		if ($album->new_album == TP_NEW_ALBUM) {
			$album->new_album = TP_OLD_ALBUM;

			// we throw the notification manually here so users are not told about the new album until there
			// is at least a few photos in it
			object_notifications('create', 'object', $album);
			
			if (function_exists('add_to_river'))
				add_to_river('river/object/album/create', 'create', $album->owner_guid, $album->guid);
		}
	
		if ($img_river_view == "all") {
			add_to_river('river/object/image/create', 'create', $file->getObjectOwnerGUID(), $file->getGUID());
		}
		unset($file);  // may not be needed but there seems to be a memory leak

	} //end of for loop
				
	if (count($not_uploaded) > 0) {
		if (count($uploaded_images) > 0)
			$error = sprintf(elgg_echo("tidypics:partialuploadfailure"), count($not_uploaded), count($not_uploaded) + count($uploaded_images))  . '<br />';
		else
			$error = elgg_echo("tidypics:completeuploadfailure") . '<br />';

		$num_failures = count($not_uploaded);
		for ($i = 0; $i < $num_failures; $i++) {
			$error .= "{$not_uploaded[$i]}: {$error_msgs[$i]} <br />";
		}
		register_error($error);
		
		if (count($uploaded_images) == 0)
			forward(get_input('forward_url', $_SERVER['HTTP_REFERER'])); //upload failed, so forward to previous page
		else {
			// some images did upload so we fall through
		}
	} else {
			system_message(elgg_echo('tidypics:upl_success'));
	}

	
	if (count($uploaded_images) && $img_river_view == "1") {
		if (function_exists('add_to_river')) {
			add_to_river('river/object/image/create', 'create', $file_for_river->getObjectOwnerGUID(), $file_for_river->getGUID());
		}
	}
	
	// update image repo size
	create_metadata($album->container_guid, "image_repo_size", $image_repo_size, 'integer', $album->container_guid);
	
	// plugins can register to be told when a Tidypics album has had images added
	trigger_elgg_event('upload', 'tp_album', $album);
	
	
	//forward to multi-image edit page
	forward($CONFIG->wwwroot . 'mod/tidypics/pages/edit_multiple.php?files=' . implode('-', $uploaded_images)); 

?>