OSDN Git Service

MERGE: リビジョン1873〜1893。skinnable-masterのマージ
[nucleus-jp/nucleus-next.git] / nucleus / libs / MEDIA.php
index 1c6ab00..b06eb64 100644 (file)
-<?php\r
-/*\r
- * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
- * Copyright (C) 2002-2012 The Nucleus Group\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- * (see nucleus/documentation/index.html#license for more info)\r
- */\r
-/**\r
- * Media classes for nucleus\r
- *\r
- * @license http://nucleuscms.org/license.txt GNU General Public License\r
- * @copyright Copyright (C) 2002-2012 The Nucleus Group\r
- * @version $Id: MEDIA.php 1870 2012-05-22 14:57:15Z sakamocchi $\r
- */\r
-\r
-define('PRIVATE_COLLECTION',           'Private Collection');\r
-define('READ_ONLY_MEDIA_FOLDER',       '(Read Only)');\r
-\r
-class Media\r
-{\r
-       static public $thumbdir = '.thumb';\r
-       static public $algorism = 'md5';\r
-       static public $image_mime = array(\r
-               'image/jpeg'    => '.jpeg',\r
-               'image/png'             => '.png',\r
-               'image/gif'             => '.gif',\r
-       );\r
-       \r
-       /**\r
-        * Media::getCollectionList()\r
-        * Gets the list of collections available to the currently logged\r
-        * in member\r
-        * \r
-        * @param       boolean $exceptReadOnly\r
-        * @return array        dirname => display name\r
-        */\r
-       static public function getCollectionList($exceptReadOnly = FALSE)\r
-       {\r
-               global $member, $DIR_MEDIA;\r
-               \r
-               $collections = array();\r
-               \r
-               // add private directory for member\r
-               $collections[$member->getID()] = PRIVATE_COLLECTION;\r
-               \r
-               // add global collections\r
-               if ( !is_dir($DIR_MEDIA) )\r
-               {\r
-                       return $collections;\r
-               }\r
-               \r
-               $dirhandle = opendir($DIR_MEDIA);\r
-               while ( $dirname = readdir($dirhandle) )\r
-               {\r
-                       // only add non-numeric (numeric=private) dirs\r
-                       if ( @is_dir($DIR_MEDIA . $dirname) &&\r
-                               ($dirname != '.') &&\r
-                               ($dirname != '..') &&\r
-                               ($dirname != self::$thumbdir) &&\r
-                               (!is_numeric($dirname)) )\r
-                               {\r
-                               if ( @is_writable($DIR_MEDIA . $dirname) )\r
-                               {\r
-                                       $collections[$dirname] = $dirname;\r
-                               }\r
-                               else if ( $exceptReadOnly == FALSE )\r
-                               {\r
-                                       $collections[$dirname] = $dirname . ' ' . READ_ONLY_MEDIA_FOLDER;\r
-                               }\r
-                       }\r
-               }\r
-               closedir($dirhandle);\r
-               \r
-               return $collections;\r
-       }\r
-       \r
-       /**\r
-        * Media::getMediaListByCollection()\r
-        * Returns an array of MediaObject objects for a certain collection\r
-        *\r
-        * @param       string  $collection     name of the collection\r
-        * @param       string  $filter         filter on filename (defaults to none)\r
-        * @return      void\r
-        */\r
-       static public function getMediaListByCollection($collection, $filter = '')\r
-       {\r
-               global $CONF, $DIR_MEDIA;\r
-               \r
-               $filelist = array();\r
-               \r
-               // 1. go through all objects and add them to the filelist\r
-               $mediadir = $DIR_MEDIA . $collection . '/';\r
-               \r
-               // return if dir does not exist\r
-               if ( !is_dir($mediadir) )\r
-               {\r
-                       return $filelist;\r
-               }\r
-               \r
-               $dirhandle = opendir($mediadir);\r
-               while ( $filename = readdir($dirhandle) )\r
-               {\r
-                       // only add files that match the filter\r
-                       if ( !is_dir($mediadir . $filename) && self::checkFilter($filename, $filter) )\r
-                       {\r
-                               array_push($filelist, new MediaObject($collection, $filename, $DIR_MEDIA));\r
-                       }\r
-               }\r
-               closedir($dirhandle);\r
-               \r
-               /* sort array */\r
-               if ( !$CONF['MediaPrefix'] )\r
-               {\r
-                       usort($filelist,  array(__CLASS__, 'sort_media_by_timestamp'));\r
-               }\r
-               else\r
-               {\r
-                       usort($filelist,  array(__CLASS__, 'sort_media_by_filename'));\r
-               }\r
-               \r
-               return $filelist;\r
-       }\r
-       \r
-       /**\r
-        * Media::checkFilter()\r
-        * \r
-        * @param       string  $strText\r
-        * @param       string  $strFilter\r
-        * @return      boolean\r
-        */\r
-       static public function checkFilter($strText, $strFilter)\r
-       {\r
-               if ( $strFilter == '' )\r
-               {\r
-                       return 1;\r
-               }\r
-               else\r
-               {\r
-                       return is_integer(i18n::strpos(strtolower($strText), strtolower($strFilter)));\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * Media::isValidCollection()\r
-        * checks if a collection exists with the given name, and if it's\r
-        * allowed for the currently logged in member to upload files to it\r
-        * \r
-        * @param       string  $collectionName\r
-        * @param       string  $exceptReadOnly\r
-        * @return      boolean\r
-        */\r
-       static public function isValidCollection($collectionName, $exceptReadOnly = FALSE)\r
-       {\r
-               global $member, $DIR_MEDIA;\r
-               \r
-               // allow creating new private directory\r
-               if ( $collectionName === (string)$member->getID() )\r
-               {\r
-                       return TRUE;\r
-               }\r
-               \r
-               $collections = self::getCollectionList($exceptReadOnly);\r
-               $dirname = $collections[$collectionName];\r
-               \r
-               if ( $dirname == NULL || $dirname === PRIVATE_COLLECTION )\r
-               {\r
-                       return FALSE;\r
-               }\r
-               \r
-               // other collections should exist and be writable\r
-               $collectionDir = $DIR_MEDIA . $collectionName;\r
-               if ( $exceptReadOnly )\r
-               {\r
-                       return ( @is_dir($collectionDir) && @is_writable($collectionDir) );\r
-               }\r
-               \r
-               // other collections should exist\r
-               return @is_dir($collectionDir);\r
-       }\r
-       \r
-       /**\r
-        * Media::addMediaObject()\r
-        * Adds an uploaded file to the media archive\r
-        *\r
-        * @param       string  $collection     collection\r
-        * @param       array   $uploadfile     the postFileInfo(..) array\r
-        * @param       string  $filename       the filename that should be used to save the file as\r
-        *                                                              (date prefix should be already added here)\r
-        * @return      string  blank if success, message if failed\r
-        */\r
-       static public function addMediaObject($collection, $uploadfile, $filename)\r
-       {\r
-               global $DIR_MEDIA, $manager;\r
-               \r
-               // clean filename of characters that may cause trouble in a filename using cleanFileName() function from globalfunctions.php\r
-               $filename = cleanFileName($filename);\r
-               \r
-               // should already have tested for allowable types before calling this method. This will only catch files with no extension at all\r
-               if ( $filename === FALSE )\r
-               {\r
-                       return _ERROR_BADFILETYPE;\r
-               }\r
-               \r
-               // trigger PreMediaUpload event\r
-               $manager->notify('PreMediaUpload',array('collection' => &$collection, 'uploadfile' => $uploadfile, 'filename' => &$filename));\r
-               \r
-               // don't allow uploads to unknown or forbidden collections\r
-               $exceptReadOnly = TRUE;\r
-               if ( !self::isValidCollection($collection,$exceptReadOnly) )\r
-               {\r
-                       return _ERROR_DISALLOWED;\r
-               }\r
-               \r
-               // check dir permissions (try to create dir if it does not exist)\r
-               $mediadir = $DIR_MEDIA . $collection;\r
-               \r
-               // try to create new private media directories if needed\r
-               if ( !@is_dir($mediadir) && is_numeric($collection) )\r
-               {\r
-                       $oldumask = umask(0000);\r
-                       if ( !@mkdir($mediadir, 0777) )\r
-                       {\r
-                               return _ERROR_BADPERMISSIONS;\r
-                       }\r
-                       umask($oldumask);\r
-               }\r
-               \r
-               // if dir still not exists, the action is disallowed\r
-               if ( !@is_dir($mediadir) )\r
-               {\r
-                       return _ERROR_DISALLOWED;\r
-               }\r
-               \r
-               if ( !is_writeable($mediadir) )\r
-               {\r
-                       return _ERROR_BADPERMISSIONS;\r
-               }\r
-               \r
-               // add trailing slash (don't add it earlier since it causes mkdir to fail on some systems)\r
-               $mediadir .= '/';\r
-               \r
-               if ( file_exists($mediadir . $filename) )\r
-               {\r
-                       return _ERROR_UPLOADDUPLICATE;\r
-               }\r
-               \r
-               // move file to directory\r
-               if ( is_uploaded_file($uploadfile) )\r
-               {\r
-                       if ( !@move_uploaded_file($uploadfile, $mediadir . $filename) )\r
-                       {\r
-                               return _ERROR_UPLOADMOVEP;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       if ( !copy($uploadfile, $mediadir . $filename) )\r
-                       {\r
-                               return _ERROR_UPLOADCOPY ;\r
-                       }\r
-               }\r
-               \r
-               // chmod uploaded file\r
-               $oldumask = umask(0000);\r
-               @chmod($mediadir . $filename, 0644);\r
-               umask($oldumask);\r
-               \r
-               $manager->notify('PostMediaUpload',array('collection' => $collection, 'mediadir' => $mediadir, 'filename' => $filename));\r
-               \r
-               return '';\r
-       }\r
-       \r
-       /**\r
-        * Media::addMediaObjectRaw()\r
-        * Adds an uploaded file to the media dir.\r
-        * \r
-        * NOTE: does not check if $collection is valid.\r
-        * \r
-        * @param       string  $collection     collection to use\r
-        * @param       string  $filename       the filename that should be used to save the file\r
-        *                                                              as (date prefix should be already added here)\r
-        * @param       &$data  File data (binary)\r
-        * @return      string  blank if success, message if failed\r
-        */\r
-       static public function addMediaObjectRaw($collection, $filename, &$data)\r
-       {\r
-               global $DIR_MEDIA;\r
-               \r
-               // check dir permissions (try to create dir if it does not exist)\r
-               $mediadir = $DIR_MEDIA . $collection;\r
-               \r
-               // try to create new private media directories if needed\r
-               if ( !@is_dir($mediadir) && is_numeric($collection) )\r
-               {\r
-                       $oldumask = umask(0000);\r
-                       if ( !@mkdir($mediadir, 0777) )\r
-                       {\r
-                               return _ERROR_BADPERMISSIONS;\r
-                       }\r
-                       umask($oldumask);\r
-               }\r
-               \r
-               // if dir still not exists, the action is disallowed\r
-               if ( !@is_dir($mediadir) )\r
-               {\r
-                       return _ERROR_DISALLOWED;\r
-               }\r
-               \r
-               if ( !is_writeable($mediadir) )\r
-               {\r
-                       return _ERROR_BADPERMISSIONS;\r
-               }\r
-               \r
-               // add trailing slash (don't add it earlier since it causes mkdir to fail on some systems)\r
-               $mediadir .= '/';\r
-               \r
-               if ( file_exists($mediadir . $filename) )\r
-               {\r
-                       return _ERROR_UPLOADDUPLICATE;\r
-               }\r
-               \r
-               // create file\r
-               $fh = @fopen($mediadir . $filename, 'wb');\r
-               if ( !$fh )\r
-               {\r
-                       return _ERROR_UPLOADFAILED;\r
-               }\r
-               $ok = @fwrite($fh, $data);\r
-               @fclose($fh);\r
-               if ( !$ok )\r
-               {\r
-                       return _ERROR_UPLOADFAILED;\r
-               }\r
-               \r
-               // chmod uploaded file\r
-               $oldumask = umask(0000);\r
-               @chmod($mediadir . $filename, 0644);\r
-               umask($oldumask);\r
-               \r
-               return '';\r
-       }\r
-       \r
-       /**\r
-        * Media::responseResampledImage()\r
-        * send resampled image via HTTP\r
-        * \r
-        * @param       object  $medium         MediaObject Object\r
-        * @exit\r
-        */\r
-       static public function responseResampledImage($medium, $maxwidth=0, $maxheight=0)\r
-       {\r
-               if ( get_class($medium) !== 'MediaObject' )\r
-               {\r
-                       header("HTTP/1.1 500 Internal Server Error");\r
-                       exit('Nucleus CMS: Fail to generate resampled image');\r
-                       return;\r
-               }\r
-               \r
-               $resampledimage = $medium->getResampledBinary($maxwidth, $maxheight);\r
-               if ( $resampledimage === FALSE )\r
-               {\r
-                       unset($resampledimage);\r
-                       header("HTTP/1.1 503 Service Unavailable");\r
-                       exit('Nucleus CMS: Fail to generate resampled image');\r
-                       return;\r
-               }\r
-               \r
-               header("Content-type: {$medium->mime}");\r
-               echo $resampledimage;\r
-               \r
-               unset($resampledimage);\r
-               \r
-               exit;\r
-       }\r
-       \r
-       /**\r
-        * Media::storeResampledImage()\r
-        * Store resampled image binary to filesystem as file\r
-        * \r
-        * @param       object  $medium         MediaObject Object\r
-        * @param       integer $maxwidth       maximum width\r
-        * @param       integer $maxheight      maximum height\r
-        * @param       string  $path           directory path for destination\r
-        * @param       string  $name           file name for destination\r
-        * @return      boolean\r
-        */\r
-       static public function storeResampledImage($medium, $maxwidth=0, $maxheight=0, $path='', $name='')\r
-       {\r
-               global $DIR_MEDIA;\r
-               \r
-               if ( get_class($medium) !== 'MediaObject' )\r
-               {\r
-                       return FALSE;\r
-               }\r
-               \r
-               if ( $path !== '' )\r
-               {\r
-                       $path = realpath($path);\r
-                       if ( !file_exists($path)\r
-                         || strpos($path, $DIR_MEDIA) !== 0 )\r
-                       {\r
-                               return FALSE;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       $path = '$DIR_MEDIA/' . self::$thumbdir;\r
-               }\r
-               \r
-               if ( $name === '' )\r
-               {\r
-                       $name = $medium->getHashedname();\r
-               }\r
-               \r
-               $resampledimage = $medium->getResampledBinary($maxwidth, $maxheight);\r
-               if ( !$resampledimage )\r
-               {\r
-                       unset($resampledimage);\r
-                       return FALSE;\r
-               }\r
-               \r
-               $handle = @fopen("{$path}/{$name}", 'w');\r
-               if ( !$handle )\r
-               {\r
-                       unset ($resampledimage);\r
-                       return FALSE;\r
-               }\r
-               \r
-               if ( !@fwrite($handle, $resampledimage) )\r
-               {\r
-                       unset($resampledimage);\r
-                       @unlink("{$path}/{$name}");\r
-                       return FALSE;\r
-               }\r
-               \r
-               unset($resampledimage);\r
-               fclose($handle);\r
-               \r
-               if ( !@chmod("{$path}/{$name}", 0774) )\r
-               {\r
-                       @unlink("{$path}/{$name}");\r
-                       return FALSE;\r
-               }\r
-               \r
-               return TRUE;\r
-       }\r
-       \r
-       /**\r
-        * Media::sort_media_by_timestamp()\r
-        * User-defined sort method to sort an array of MediaObjects\r
-        * \r
-        * @param       object  $a\r
-        * @param       object  $b\r
-        * @return      boolean\r
-        */\r
-       static private function sort_media_by_timestamp($a, $b)\r
-       {\r
-               if ($a->timestamp == $b->timestamp) return 0;\r
-               return ($a->timestamp > $b->timestamp) ? -1 : 1;\r
-       }\r
-       \r
-       /**\r
-        * Media::sort_media_by_filename()\r
-        * User-defined sort method to sort an array of MediaObjects\r
-        * \r
-        * @param       object  $a\r
-        * @param       object  $b\r
-        * @return      boolean\r
-        */\r
-       static private function sort_media_by_filename($a, $b)\r
-       {\r
-               if ($a->filename == $b->filename) return 0;\r
-               return ($a->filename > $b->filename) ? -1 : 1;\r
-       }\r
-}\r
-\r
-class MediaObject\r
-{\r
-       public $mime = '';\r
-       \r
-       public $root = '';\r
-       public $path = '';\r
-       public $private;\r
-       public $collection;\r
-       public $filename = '';\r
-       \r
-       public $prefix = '';\r
-       public $name = '';\r
-       public $suffix = '';\r
-       \r
-       public $timestamp = 0;\r
-       public $size = 0;\r
-       \r
-       public $width = 0;\r
-       public $height = 0;\r
-       public $resampledwidth = 0;\r
-       public $resampledheight = 0;\r
-       \r
-       /**\r
-        * MediaObject::__construct()\r
-        * \r
-        * @param       string          $collection     \r
-        * @param       string          $filename       \r
-        * @param       string          $root           fullpath to media directory\r
-        */\r
-       public function __construct($collection, $filename, $root=0)\r
-       {\r
-               global $CONF, $DIR_MEDIA;\r
-               \r
-               /* for backward compatibility */\r
-               if ( is_numeric($root) )\r
-               {\r
-                       $root = $DIR_MEDIA;\r
-               }\r
-               \r
-               $root = preg_replace('#/*$#', '', $root);\r
-               \r
-               /* get and validate fullpath for the medium */\r
-               if ( !file_exists($root)\r
-                 || FALSE === ($fullpath = realpath("{$root}/{$collection}/{$filename}"))\r
-                 || strpos($fullpath, $root) !== 0\r
-                 || !file_exists($fullpath) )\r
-               {\r
-                       return FALSE;\r
-               }\r
-               \r
-               /* store fundamentals */\r
-               $this->root = $root;\r
-               $this->private = (integer) $collection;\r
-               $this->collection = $collection;\r
-               $this->filename = basename($fullpath);\r
-               $this->timestamp = filemtime($fullpath);\r
-               \r
-               /* store relative directory path from root directory for media */\r
-               $this->path = preg_replace(array("#{$this->root}/#", "#/{$this->filename}#"), '', $fullpath);\r
-               if ( $this->path === $this->name )\r
-               {\r
-                       $this->path = ''; \r
-               }\r
-               \r
-               return;\r
-       }\r
-       \r
-       /**\r
-        * MediaObject::refine()\r
-        * refine data\r
-        * \r
-        * @param       void\r
-        * @return      void\r
-        */\r
-       public function refine()\r
-       {\r
-               global $CONF;\r
-               \r
-               /* store size (byte order) */\r
-               $this->size = filesize("{$this->root}/{$this->path}/{$this->filename}");\r
-               \r
-               /* get width and height if this is image binary */\r
-               if ( FALSE === ($info = @getimagesize ("{$this->root}/{$this->path}/{$this->filename}")) )\r
-               {\r
-                       $this->mime = 'application/octet-stream';\r
-                       $this->width = 0;\r
-                       $this->height = 0;\r
-               }\r
-               else\r
-               {\r
-                       $this->mime = $info['mime'];\r
-                       $this->width = $info[0];\r
-                       $this->height = $info[1];\r
-               }\r
-               \r
-               /* utilise Fileinfo subsystem if available */\r
-               if ( defined('FILEINFO_MIME_TYPE') && function_exists ('finfo_open')\r
-                 && (FALSE !== ($info = finfo_open(FILEINFO_MIME_TYPE))) )\r
-               {\r
-                       $this->mime = finfo_file($info, "{$this->root}/{$this->path}/{$this->filename}");\r
-               }\r
-               \r
-               /* store data with parsed filename */\r
-               if ( preg_match('#^(.*)\.([a-zA-Z0-9]{2,})$#', $this->filename, $info) === 1 )\r
-               {\r
-                       $this->name = $info[1];\r
-                       $this->suffix = $info[2];\r
-                       \r
-                       if ( $CONF['MediaPrefix'] && preg_match('#^([0-9]{8})\-(.*)$#', $this->name, $info) == 1 )\r
-                       {\r
-                               $this->prefix = preg_replace('#^([0-9]{4})([0-9]{2})([0-9]{2})$#', '$1/$2/$3', $info[1]);\r
-                               $this->name = $info[2];\r
-                       }\r
-               }\r
-               \r
-               return;\r
-       }\r
-       \r
-       /**\r
-        * MediaObject::setResampledSize()\r
-        * Set resampled size\r
-        * \r
-        * @param       integer $maxwidth\r
-        * @param       integer $maxheight\r
-        * @return      boolean\r
-        */\r
-       public function setResampledSize($maxwidth=0, $maxheight=0)\r
-       {\r
-               if ( ($maxwidth == 0) && ($maxheight == 0) )\r
-               {\r
-                       return FALSE;\r
-               }\r
-               else if ( $this->width == 0 || $this->height  == 0 )\r
-               {\r
-                       return FALSE;\r
-               }\r
-               else if ($this->width < $maxwidth && $this->height < $maxheight )\r
-               {\r
-                       $this->resampledwidth = $this->width;\r
-                       $this->resampledheight = $this->height;\r
-               }\r
-               else if ( $maxheight == 0 || $this->width > $this->height )\r
-               {\r
-                       $this->resampledheight = intval ($this->height * $maxwidth / $this->width);\r
-                       $this->resampledwidth = $maxwidth;\r
-               }\r
-               else if ( $maxwidth == 0 || $this->width <= $this->height )\r
-               {\r
-                       $this->resampledwidth = intval ($this->width * $maxheight / $this->height);\r
-                       $this->resampledheight = $maxheight;\r
-               }\r
-               return TRUE;\r
-       }\r
-       \r
-       /**\r
-        * MediaObject::getResampledBinary()\r
-        * Return resampled image binary\r
-        * \r
-        * @param       void\r
-        * @return      mixed   binary if success, FALSE if failed\r
-        */\r
-       public function getResampledBinary($maxwidth=0, $maxheight=0)\r
-       {\r
-               static $gdinfo = array();\r
-               static $original;\r
-               static $resampledimage;\r
-               \r
-               if ( !$this->setResampledSize($maxwidth, $maxheight) )\r
-               {\r
-                       return FALSE;\r
-               }\r
-               \r
-               if ( $gdinfo = array() )\r
-               {\r
-                       $gdinfo = gd_info();\r
-               }\r
-               \r
-               if ( $this->path !== '' )\r
-               {\r
-                       $fullpath = "{$this->root}/{$this->path}/{$this->name}";\r
-               }\r
-               else\r
-               {\r
-                       $fullpath = "{$this->root}/{$this->name}";\r
-               }\r
-               if ( !file_exists($fullpath) )\r
-               {\r
-                       return FALSE;\r
-               }\r
-               \r
-               if ( !array_key_exists($this->mime, Media::$image_mime)\r
-                 || $this->width == 0\r
-                 || $this->height == 0\r
-                 || $this->resampledwidth == 0\r
-                 || $this->resampledheight == 0 )\r
-               {\r
-                       return FALSE;\r
-               }\r
-               \r
-               /* check current available memory */\r
-               $memorymax = trim(ini_get("memory_limit"));\r
-               switch ( strtolower ($memorymax[strlen($memorymax)-1]) )\r
-               {\r
-                       case 'g':\r
-                               $memorymax *= 1024;\r
-                       case 'm':\r
-                               $memorymax *= 1024;\r
-                       case 'k':\r
-                               $memorymax *= 1024;\r
-               }\r
-               \r
-               /*\r
-                * this code is based on analyze if gd.c in php source code\r
-                * if you can read C/C++, please check these elements and notify us if you have some ideas\r
-                */\r
-               if ( (memory_get_usage()\r
-                  + ($this->resampledwidth * $this->resampledheight * 5 + $this->resampledheight * 24 + 10000)\r
-                  + ($this->width * $this->height * 5 + $this->height * 24 + 10000))\r
-                 > $memorymax )\r
-               {\r
-                       return FALSE;\r
-               }\r
-               \r
-               switch ( $this->mime )\r
-               {\r
-                       case 'image/gif':\r
-                               if ( (!array_key_exists('GIF Read Support', $gdinfo) || !isset($gdinfo['GIF Read Support']))\r
-                                 || (!array_key_exists('GIF Create Support', $gdinfo) || !isset($gdinfo['GIF Create Support'])) )\r
-                               {\r
-                                       return FALSE;\r
-                               }\r
-                               $function = 'imagecreatefromgif';\r
-                               break;\r
-                       case 'image/jpeg':\r
-                               if ( (!array_key_exists('JPEG Support', $gdinfo) || !isset($gdinfo['JPEG Support']))\r
-                                 && (!array_key_exists('JPG Support', $gdinfo) || !isset($gdinfo['JPG Support'])) )\r
-                               {\r
-                                       return FALSE;\r
-                               }\r
-                               $function = 'imagecreatefromjpeg';\r
-                               break;\r
-                       case 'image/png':\r
-                               if ( !array_key_exists('PNG Support', $gdinfo) || !isset($gdinfo['PNG Support']) )\r
-                               {\r
-                                       return FALSE;\r
-                               }\r
-                               $function = 'imagecreatefrompng';\r
-                               break;\r
-                       default:\r
-                               return FALSE;\r
-               }\r
-               \r
-               if ( !is_callable($function) )\r
-               {\r
-                       return FALSE;\r
-               }\r
-               \r
-               $original = call_user_func_array($function, array(&$fullpath));\r
-               if ( !$original )\r
-               {\r
-                       return FALSE;\r
-               }\r
-               \r
-               $resampledimage = imagecreatetruecolor($this->resampledwidth, $this->resampledheight);\r
-               if ( !$resampledimage )\r
-               {\r
-                       imagedestroy($original);\r
-                       return FALSE;\r
-               }\r
-               \r
-               @set_time_limit(ini_get('max_execution_time'));\r
-               if ( !ImageCopyResampled($resampledimage, $original, 0, 0, 0, 0, $this->resampledwidth, $this->resampledheight, $this->width, $this->height) )\r
-               {\r
-                       return FALSE;\r
-               }\r
-               \r
-               imagedestroy($original);\r
-               \r
-               ob_start();\r
-               \r
-               switch ( $this->mime )\r
-               {\r
-                       case 'image/gif':\r
-                               imagegif($resampledimage);\r
-                               break;\r
-                       case 'image/jpeg':\r
-                               imagejpeg($resampledimage);\r
-                               break;\r
-                       case 'image/png':\r
-                               imagepng($resampledimage);\r
-                               break;\r
-                       case 'image/bmp':\r
-                       case 'image/x-ms-bmp':\r
-                               imagepng($resampledimage);\r
-                               break;\r
-                       default:\r
-                               return FALSE;\r
-               }\r
-               \r
-               imagedestroy($resampledimage);\r
-               \r
-               return ob_get_clean();\r
-       }\r
-       \r
-       public function getHashedName()\r
-       {\r
-               return (string) hash(Media::$algorism, "{$this->path}/{$this->name}", FALSE);\r
-       }\r
-}\r
+<?php
+/*
+ * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
+ * Copyright (C) 2002-2012 The Nucleus Group
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * (see nucleus/documentation/index.html#license for more info)
+ */
+/**
+ * Media classes for nucleus
+ *
+ * @license http://nucleuscms.org/license.txt GNU General Public License
+ * @copyright Copyright (C) 2002-2012 The Nucleus Group
+ * @version $Id: MEDIA.php 1875 2012-06-17 07:30:44Z sakamocchi $
+ */
+
+define('PRIVATE_COLLECTION',           'Private Collection');
+define('READ_ONLY_MEDIA_FOLDER',       '(Read Only)');
+
+class Media
+{
+       static public $thumbdir = '.thumb';
+       static public $algorism = 'md5';
+       static public $image_mime = array(
+               'image/jpeg'    => '.jpeg',
+               'image/png'             => '.png',
+               'image/gif'             => '.gif',
+       );
+       
+       /**
+        * Media::getCollectionList()
+        * Gets the list of collections available to the currently logged
+        * in member
+        * 
+        * @param       boolean $exceptReadOnly
+        * @return array        dirname => display name
+        */
+       static public function getCollectionList($exceptReadOnly = FALSE)
+       {
+               global $member, $DIR_MEDIA;
+               
+               $collections = array();
+               
+               // add private directory for member
+               $collections[$member->getID()] = PRIVATE_COLLECTION;
+               
+               // add global collections
+               if ( !is_dir($DIR_MEDIA) )
+               {
+                       return $collections;
+               }
+               
+               $dirhandle = opendir($DIR_MEDIA);
+               while ( $dirname = readdir($dirhandle) )
+               {
+                       // only add non-numeric (numeric=private) dirs
+                       if ( @is_dir($DIR_MEDIA . $dirname) &&
+                               ($dirname != '.') &&
+                               ($dirname != '..') &&
+                               ($dirname != self::$thumbdir) &&
+                               (!is_numeric($dirname)) )
+                               {
+                               if ( @is_writable($DIR_MEDIA . $dirname) )
+                               {
+                                       $collections[$dirname] = $dirname;
+                               }
+                               else if ( $exceptReadOnly == FALSE )
+                               {
+                                       $collections[$dirname] = $dirname . ' ' . READ_ONLY_MEDIA_FOLDER;
+                               }
+                       }
+               }
+               closedir($dirhandle);
+               
+               return $collections;
+       }
+       
+       /**
+        * Media::getMediaListByCollection()
+        * Returns an array of MediaObject objects for a certain collection
+        *
+        * @param       string  $collection     name of the collection
+        * @param       string  $filter         filter on filename (defaults to none)
+        * @return      void
+        */
+       static public function getMediaListByCollection($collection, $filter = '')
+       {
+               global $CONF, $DIR_MEDIA;
+               
+               $filelist = array();
+               
+               // 1. go through all objects and add them to the filelist
+               $mediadir = $DIR_MEDIA . $collection . '/';
+               
+               // return if dir does not exist
+               if ( !is_dir($mediadir) )
+               {
+                       return $filelist;
+               }
+               
+               $dirhandle = opendir($mediadir);
+               while ( $filename = readdir($dirhandle) )
+               {
+                       // only add files that match the filter
+                       if ( !is_dir($mediadir . $filename) && self::checkFilter($filename, $filter) )
+                       {
+                               array_push($filelist, new MediaObject($collection, $filename, $DIR_MEDIA));
+                       }
+               }
+               closedir($dirhandle);
+               
+               /* sort array */
+               if ( !$CONF['MediaPrefix'] )
+               {
+                       usort($filelist,  array(__CLASS__, 'sort_media_by_timestamp'));
+               }
+               else
+               {
+                       usort($filelist,  array(__CLASS__, 'sort_media_by_filename'));
+               }
+               
+               return $filelist;
+       }
+       
+       /**
+        * Media::checkFilter()
+        * 
+        * @param       string  $strText
+        * @param       string  $strFilter
+        * @return      boolean
+        */
+       static public function checkFilter($strText, $strFilter)
+       {
+               if ( $strFilter == '' )
+               {
+                       return 1;
+               }
+               else
+               {
+                       return is_integer(i18n::strpos(strtolower($strText), strtolower($strFilter)));
+               }
+       }
+       
+       /**
+        * Media::isValidCollection()
+        * checks if a collection exists with the given name, and if it's
+        * allowed for the currently logged in member to upload files to it
+        * 
+        * @param       string  $collectionName
+        * @param       string  $exceptReadOnly
+        * @return      boolean
+        */
+       static public function isValidCollection($collectionName, $exceptReadOnly = FALSE)
+       {
+               global $member, $DIR_MEDIA;
+               
+               // allow creating new private directory
+               if ( $collectionName === (string)$member->getID() )
+               {
+                       return TRUE;
+               }
+               
+               $collections = self::getCollectionList($exceptReadOnly);
+               $dirname = $collections[$collectionName];
+               
+               if ( $dirname == NULL || $dirname === PRIVATE_COLLECTION )
+               {
+                       return FALSE;
+               }
+               
+               // other collections should exist and be writable
+               $collectionDir = $DIR_MEDIA . $collectionName;
+               if ( $exceptReadOnly )
+               {
+                       return ( @is_dir($collectionDir) && @is_writable($collectionDir) );
+               }
+               
+               // other collections should exist
+               return @is_dir($collectionDir);
+       }
+       
+       /**
+        * Media::addMediaObject()
+        * Adds an uploaded file to the media archive
+        *
+        * @param       string  $collection     collection
+        * @param       array   $uploadfile     the postFileInfo(..) array
+        * @param       string  $filename       the filename that should be used to save the file as
+        *                                                              (date prefix should be already added here)
+        * @return      string  blank if success, message if failed
+        */
+       static public function addMediaObject($collection, $uploadfile, $filename)
+       {
+               global $DIR_MEDIA, $manager;
+               
+               // clean filename of characters that may cause trouble in a filename using cleanFileName() function from globalfunctions.php
+               $filename = cleanFileName($filename);
+               
+               // should already have tested for allowable types before calling this method. This will only catch files with no extension at all
+               if ( $filename === FALSE )
+               {
+                       return _ERROR_BADFILETYPE;
+               }
+               
+               // trigger PreMediaUpload event
+               $manager->notify('PreMediaUpload',array('collection' => &$collection, 'uploadfile' => $uploadfile, 'filename' => &$filename));
+               
+               // don't allow uploads to unknown or forbidden collections
+               $exceptReadOnly = TRUE;
+               if ( !self::isValidCollection($collection,$exceptReadOnly) )
+               {
+                       return _ERROR_DISALLOWED;
+               }
+               
+               // check dir permissions (try to create dir if it does not exist)
+               $mediadir = $DIR_MEDIA . $collection;
+               
+               // try to create new private media directories if needed
+               if ( !@is_dir($mediadir) && is_numeric($collection) )
+               {
+                       $oldumask = umask(0000);
+                       if ( !@mkdir($mediadir, 0777) )
+                       {
+                               return _ERROR_BADPERMISSIONS;
+                       }
+                       umask($oldumask);
+               }
+               
+               // if dir still not exists, the action is disallowed
+               if ( !@is_dir($mediadir) )
+               {
+                       return _ERROR_DISALLOWED;
+               }
+               
+               if ( !is_writeable($mediadir) )
+               {
+                       return _ERROR_BADPERMISSIONS;
+               }
+               
+               // add trailing slash (don't add it earlier since it causes mkdir to fail on some systems)
+               $mediadir .= '/';
+               
+               if ( file_exists($mediadir . $filename) )
+               {
+                       return _ERROR_UPLOADDUPLICATE;
+               }
+               
+               // move file to directory
+               if ( is_uploaded_file($uploadfile) )
+               {
+                       if ( !@move_uploaded_file($uploadfile, $mediadir . $filename) )
+                       {
+                               return _ERROR_UPLOADMOVEP;
+                       }
+               }
+               else
+               {
+                       if ( !copy($uploadfile, $mediadir . $filename) )
+                       {
+                               return _ERROR_UPLOADCOPY ;
+                       }
+               }
+               
+               // chmod uploaded file
+               $oldumask = umask(0000);
+               @chmod($mediadir . $filename, 0644);
+               umask($oldumask);
+               
+               $manager->notify('PostMediaUpload',array('collection' => $collection, 'mediadir' => $mediadir, 'filename' => $filename));
+               
+               return '';
+       }
+       
+       /**
+        * Media::addMediaObjectRaw()
+        * Adds an uploaded file to the media dir.
+        * 
+        * NOTE: does not check if $collection is valid.
+        * 
+        * @param       string  $collection     collection to use
+        * @param       string  $filename       the filename that should be used to save the file
+        *                                                              as (date prefix should be already added here)
+        * @param       &$data  File data (binary)
+        * @return      string  blank if success, message if failed
+        */
+       static public function addMediaObjectRaw($collection, $filename, &$data)
+       {
+               global $DIR_MEDIA;
+               
+               // check dir permissions (try to create dir if it does not exist)
+               $mediadir = $DIR_MEDIA . $collection;
+               
+               // try to create new private media directories if needed
+               if ( !@is_dir($mediadir) && is_numeric($collection) )
+               {
+                       $oldumask = umask(0000);
+                       if ( !@mkdir($mediadir, 0777) )
+                       {
+                               return _ERROR_BADPERMISSIONS;
+                       }
+                       umask($oldumask);
+               }
+               
+               // if dir still not exists, the action is disallowed
+               if ( !@is_dir($mediadir) )
+               {
+                       return _ERROR_DISALLOWED;
+               }
+               
+               if ( !is_writeable($mediadir) )
+               {
+                       return _ERROR_BADPERMISSIONS;
+               }
+               
+               // add trailing slash (don't add it earlier since it causes mkdir to fail on some systems)
+               $mediadir .= '/';
+               
+               if ( file_exists($mediadir . $filename) )
+               {
+                       return _ERROR_UPLOADDUPLICATE;
+               }
+               
+               // create file
+               $fh = @fopen($mediadir . $filename, 'wb');
+               if ( !$fh )
+               {
+                       return _ERROR_UPLOADFAILED;
+               }
+               $ok = @fwrite($fh, $data);
+               @fclose($fh);
+               if ( !$ok )
+               {
+                       return _ERROR_UPLOADFAILED;
+               }
+               
+               // chmod uploaded file
+               $oldumask = umask(0000);
+               @chmod($mediadir . $filename, 0644);
+               umask($oldumask);
+               
+               return '';
+       }
+       
+       /**
+        * Media::responseResampledImage()
+        * send resampled image via HTTP
+        * 
+        * @param       object  $medium         MediaObject Object
+        * @exit
+        */
+       static public function responseResampledImage($medium, $maxwidth=0, $maxheight=0)
+       {
+               if ( get_class($medium) !== 'MediaObject' )
+               {
+                       header("HTTP/1.1 500 Internal Server Error");
+                       exit('Nucleus CMS: Fail to generate resampled image');
+                       return;
+               }
+               
+               $resampledimage = $medium->getResampledBinary($maxwidth, $maxheight);
+               if ( $resampledimage === FALSE )
+               {
+                       unset($resampledimage);
+                       header("HTTP/1.1 503 Service Unavailable");
+                       exit('Nucleus CMS: Fail to generate resampled image');
+                       return;
+               }
+               
+               header("Content-type: {$medium->mime}");
+               echo $resampledimage;
+               
+               unset($resampledimage);
+               
+               exit;
+       }
+       
+       /**
+        * Media::storeResampledImage()
+        * Store resampled image binary to filesystem as file
+        * 
+        * @param       object  $medium         MediaObject Object
+        * @param       integer $maxwidth       maximum width
+        * @param       integer $maxheight      maximum height
+        * @param       string  $path           directory path for destination
+        * @param       string  $name           file name for destination
+        * @return      boolean
+        */
+       static public function storeResampledImage($medium, $maxwidth=0, $maxheight=0, $path='', $name='')
+       {
+               global $DIR_MEDIA;
+               
+               if ( get_class($medium) !== 'MediaObject' )
+               {
+                       return FALSE;
+               }
+               
+               if ( $path !== '' )
+               {
+                       $path = realpath($path);
+                       if ( !file_exists($path)
+                         || strpos($path, $DIR_MEDIA) !== 0 )
+                       {
+                               return FALSE;
+                       }
+               }
+               else
+               {
+                       $path = '$DIR_MEDIA/' . self::$thumbdir;
+               }
+               
+               if ( $name === '' )
+               {
+                       $name = $medium->getHashedname();
+               }
+               
+               $resampledimage = $medium->getResampledBinary($maxwidth, $maxheight);
+               if ( !$resampledimage )
+               {
+                       unset($resampledimage);
+                       return FALSE;
+               }
+               
+               $handle = @fopen("{$path}/{$name}", 'w');
+               if ( !$handle )
+               {
+                       unset ($resampledimage);
+                       return FALSE;
+               }
+               
+               if ( !@fwrite($handle, $resampledimage) )
+               {
+                       unset($resampledimage);
+                       @unlink("{$path}/{$name}");
+                       return FALSE;
+               }
+               
+               unset($resampledimage);
+               fclose($handle);
+               
+               if ( !@chmod("{$path}/{$name}", 0774) )
+               {
+                       @unlink("{$path}/{$name}");
+                       return FALSE;
+               }
+               
+               return TRUE;
+       }
+       
+       /**
+        * Media::sort_media_by_timestamp()
+        * User-defined sort method to sort an array of MediaObjects
+        * 
+        * @param       object  $a
+        * @param       object  $b
+        * @return      boolean
+        */
+       static private function sort_media_by_timestamp($a, $b)
+       {
+               if ($a->timestamp == $b->timestamp) return 0;
+               return ($a->timestamp > $b->timestamp) ? -1 : 1;
+       }
+       
+       /**
+        * Media::sort_media_by_filename()
+        * User-defined sort method to sort an array of MediaObjects
+        * 
+        * @param       object  $a
+        * @param       object  $b
+        * @return      boolean
+        */
+       static private function sort_media_by_filename($a, $b)
+       {
+               if ($a->filename == $b->filename) return 0;
+               return ($a->filename > $b->filename) ? -1 : 1;
+       }
+}
+
+class MediaObject
+{
+       public $mime = '';
+       
+       public $root = '';
+       public $path = '';
+       public $private;
+       public $collection;
+       public $filename = '';
+       
+       public $prefix = '';
+       public $name = '';
+       public $suffix = '';
+       
+       public $timestamp = 0;
+       public $size = 0;
+       
+       public $width = 0;
+       public $height = 0;
+       public $resampledwidth = 0;
+       public $resampledheight = 0;
+       
+       /**
+        * MediaObject::__construct()
+        * 
+        * @param       string          $collection     
+        * @param       string          $filename       
+        * @param       string          $root           fullpath to media directory
+        */
+       public function __construct($collection, $filename, $root=0)
+       {
+               global $CONF, $DIR_MEDIA;
+               
+               /* for backward compatibility */
+               if ( is_numeric($root) )
+               {
+                       $root = $DIR_MEDIA;
+               }
+               
+               $root = preg_replace('#/*$#', '', $root);
+               
+               /* get and validate fullpath for the medium */
+               if ( !file_exists($root)
+                 || FALSE === ($fullpath = realpath("{$root}/{$collection}/{$filename}"))
+                 || strpos($fullpath, $root) !== 0
+                 || !file_exists($fullpath) )
+               {
+                       return FALSE;
+               }
+               
+               /* store fundamentals */
+               $this->root = $root;
+               $this->private = (integer) $collection;
+               $this->collection = $collection;
+               $this->filename = basename($fullpath);
+               $this->timestamp = filemtime($fullpath);
+               
+               /* store relative directory path from root directory for media */
+               $this->path = preg_replace(array("#{$this->root}/#", "#/{$this->filename}#"), '', $fullpath);
+               if ( $this->path === $this->name )
+               {
+                       $this->path = ''; 
+               }
+               
+               return;
+       }
+       
+       /**
+        * MediaObject::refine()
+        * refine data
+        * 
+        * @param       void
+        * @return      void
+        */
+       public function refine()
+       {
+               global $CONF;
+               
+               /* store size (byte order) */
+               $this->size = filesize("{$this->root}/{$this->path}/{$this->filename}");
+               
+               /* get width and height if this is image binary */
+               if ( FALSE === ($info = @getimagesize ("{$this->root}/{$this->path}/{$this->filename}")) )
+               {
+                       $this->mime = 'application/octet-stream';
+                       $this->width = 0;
+                       $this->height = 0;
+               }
+               else
+               {
+                       $this->mime = $info['mime'];
+                       $this->width = $info[0];
+                       $this->height = $info[1];
+               }
+               
+               /* utilise Fileinfo subsystem if available */
+               if ( defined('FILEINFO_MIME_TYPE') && function_exists ('finfo_open')
+                 && (FALSE !== ($info = finfo_open(FILEINFO_MIME_TYPE))) )
+               {
+                       $this->mime = finfo_file($info, "{$this->root}/{$this->path}/{$this->filename}");
+               }
+               
+               /* store data with parsed filename */
+               if ( preg_match('#^(.*)\.([a-zA-Z0-9]{2,})$#', $this->filename, $info) === 1 )
+               {
+                       $this->name = $info[1];
+                       $this->suffix = $info[2];
+                       
+                       if ( $CONF['MediaPrefix'] && preg_match('#^([0-9]{8})\-(.*)$#', $this->name, $info) == 1 )
+                       {
+                               $this->prefix = preg_replace('#^([0-9]{4})([0-9]{2})([0-9]{2})$#', '$1/$2/$3', $info[1]);
+                               $this->name = $info[2];
+                       }
+               }
+               
+               return;
+       }
+       
+       /**
+        * MediaObject::setResampledSize()
+        * Set resampled size
+        * 
+        * @param       integer $maxwidth
+        * @param       integer $maxheight
+        * @return      boolean
+        */
+       public function setResampledSize($maxwidth=0, $maxheight=0)
+       {
+               if ( ($maxwidth == 0) && ($maxheight == 0) )
+               {
+                       return FALSE;
+               }
+               else if ( $this->width == 0 || $this->height  == 0 )
+               {
+                       return FALSE;
+               }
+               else if ($this->width < $maxwidth && $this->height < $maxheight )
+               {
+                       $this->resampledwidth = $this->width;
+                       $this->resampledheight = $this->height;
+               }
+               else if ( $maxheight == 0 || $this->width > $this->height )
+               {
+                       $this->resampledheight = intval ($this->height * $maxwidth / $this->width);
+                       $this->resampledwidth = $maxwidth;
+               }
+               else if ( $maxwidth == 0 || $this->width <= $this->height )
+               {
+                       $this->resampledwidth = intval ($this->width * $maxheight / $this->height);
+                       $this->resampledheight = $maxheight;
+               }
+               return TRUE;
+       }
+       
+       /**
+        * MediaObject::getResampledBinary()
+        * Return resampled image binary
+        * 
+        * @param       void
+        * @return      mixed   binary if success, FALSE if failed
+        */
+       public function getResampledBinary($maxwidth=0, $maxheight=0)
+       {
+               static $gdinfo = array();
+               static $original;
+               static $resampledimage;
+               
+               if ( !$this->setResampledSize($maxwidth, $maxheight) )
+               {
+                       return FALSE;
+               }
+               
+               if ( $gdinfo = array() )
+               {
+                       $gdinfo = gd_info();
+               }
+               
+               if ( $this->path !== '' )
+               {
+                       $fullpath = "{$this->root}/{$this->path}/{$this->name}";
+               }
+               else
+               {
+                       $fullpath = "{$this->root}/{$this->name}";
+               }
+               if ( !file_exists($fullpath) )
+               {
+                       return FALSE;
+               }
+               
+               if ( !array_key_exists($this->mime, Media::$image_mime)
+                 || $this->width == 0
+                 || $this->height == 0
+                 || $this->resampledwidth == 0
+                 || $this->resampledheight == 0 )
+               {
+                       return FALSE;
+               }
+               
+               /* check current available memory */
+               $memorymax = trim(ini_get("memory_limit"));
+               switch ( strtolower ($memorymax[strlen($memorymax)-1]) )
+               {
+                       case 'g':
+                               $memorymax *= 1024;
+                       case 'm':
+                               $memorymax *= 1024;
+                       case 'k':
+                               $memorymax *= 1024;
+               }
+               
+               /*
+                * this code is based on analyze if gd.c in php source code
+                * if you can read C/C++, please check these elements and notify us if you have some ideas
+                */
+               if ( (memory_get_usage()
+                  + ($this->resampledwidth * $this->resampledheight * 5 + $this->resampledheight * 24 + 10000)
+                  + ($this->width * $this->height * 5 + $this->height * 24 + 10000))
+                 > $memorymax )
+               {
+                       return FALSE;
+               }
+               
+               switch ( $this->mime )
+               {
+                       case 'image/gif':
+                               if ( (!array_key_exists('GIF Read Support', $gdinfo) || !isset($gdinfo['GIF Read Support']))
+                                 || (!array_key_exists('GIF Create Support', $gdinfo) || !isset($gdinfo['GIF Create Support'])) )
+                               {
+                                       return FALSE;
+                               }
+                               $function = 'imagecreatefromgif';
+                               break;
+                       case 'image/jpeg':
+                               if ( (!array_key_exists('JPEG Support', $gdinfo) || !isset($gdinfo['JPEG Support']))
+                                 && (!array_key_exists('JPG Support', $gdinfo) || !isset($gdinfo['JPG Support'])) )
+                               {
+                                       return FALSE;
+                               }
+                               $function = 'imagecreatefromjpeg';
+                               break;
+                       case 'image/png':
+                               if ( !array_key_exists('PNG Support', $gdinfo) || !isset($gdinfo['PNG Support']) )
+                               {
+                                       return FALSE;
+                               }
+                               $function = 'imagecreatefrompng';
+                               break;
+                       default:
+                               return FALSE;
+               }
+               
+               if ( !is_callable($function) )
+               {
+                       return FALSE;
+               }
+               
+               $original = call_user_func_array($function, array(&$fullpath));
+               if ( !$original )
+               {
+                       return FALSE;
+               }
+               
+               $resampledimage = imagecreatetruecolor($this->resampledwidth, $this->resampledheight);
+               if ( !$resampledimage )
+               {
+                       imagedestroy($original);
+                       return FALSE;
+               }
+               
+               @set_time_limit(ini_get('max_execution_time'));
+               if ( !ImageCopyResampled($resampledimage, $original, 0, 0, 0, 0, $this->resampledwidth, $this->resampledheight, $this->width, $this->height) )
+               {
+                       return FALSE;
+               }
+               
+               imagedestroy($original);
+               
+               ob_start();
+               
+               switch ( $this->mime )
+               {
+                       case 'image/gif':
+                               imagegif($resampledimage);
+                               break;
+                       case 'image/jpeg':
+                               imagejpeg($resampledimage);
+                               break;
+                       case 'image/png':
+                               imagepng($resampledimage);
+                               break;
+                       case 'image/bmp':
+                       case 'image/x-ms-bmp':
+                               imagepng($resampledimage);
+                               break;
+                       default:
+                               return FALSE;
+               }
+               
+               imagedestroy($resampledimage);
+               
+               return ob_get_clean();
+       }
+       
+       public function getHashedName()
+       {
+               return (string) hash(Media::$algorism, "{$this->path}/{$this->name}", FALSE);
+       }
+}