<?php
/**
 * @file		default.php 	Plugin for the default CAPTCHA GD image
 *~TERABYTE_DOC_READY~
 * $Copyright: (c) 2001 - 2011 Invision Power Services, Inc.$
 *
 * $Author: bfarber $
 * @since		Friday 19th May 2006 17:33
 * $LastChangedDate: 2012-02-10 20:05:52 -0500 (Fri, 10 Feb 2012) $
 * @version		v3.4.6
 * $Revision: 10288 $
 */

/**
 *
 * @class		captchaPlugin
 * @brief		Plugin for the default CAPTCHA GD image
 * @note		This plugin is automatically loaded by classCaptcha class based on the CAPTCHA setting
 *
 */
class captchaPlugin
{
	/**#@+
	 * Registry Object Shortcuts
	 *
	 * @var		object
	 */
	public $registry;
	public $DB;
	public $settings;
	public $member;
	/**#@-*/
	
	/**
	 * String that stores the backgrounds path
	 *
	 * @var		string
	 */
	public $path_background		= '';
	
	/**
	 * String that stores the fonts path
	 *
	 * @var		string
	 */
	public $path_fonts			= '';

	/**
	 * String that stores the captcha key
	 *
	 * @var		string
	 */
	public $captchaKey 			= '';
	
	/**
	 * Constructor
	 *
	 * @param	object		$registry		Registry Object
	 * @return	@e void
	 */
	public function __construct( ipsRegistry $registry )
	{
		$this->registry	=  $registry;
		$this->DB		=  $this->registry->DB();
		$this->settings	=& $this->registry->fetchSettings();
		$this->member	=  $this->registry->member();
		
		/* Settings */
		$this->path_background	= DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_captcha/captcha_backgrounds';
		$this->path_fonts		= DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_captcha/captcha_fonts';
	}
	
	/**
	 * Returns the captcha template
	 *
	 * @return	@e string
	 *
	 * <b>Example Usage:</b>
	 * @code
	 * $gdImage = $this->getTemplate();
	 * @endcode
	 */
	public function getTemplate()
	{
		//-----------------------------------------
		// Clear old
		//-----------------------------------------
		
		$this->_clearSessions( $this->member->ip_address );
		
		//-----------------------------------------
		// Create new ID
		//-----------------------------------------
		
		$captcha_unique_id = md5( uniqid( time() ) );
		$captcha_string    = "";
		
		//-----------------------------------------
		// Create new string
		//-----------------------------------------

		/**
		 * Array of characters 
		 * Removed: 0, o, O, 1, l, I, i, L (because they're hard to differentiate)
		 */
		$array_of_chars = array( 
								'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
								'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
								'2', '3', '4', '5', '6', '7', '8', '9',
								);
		
		/* Get 6 random characters */
		for( $i = 0; $i < 6; $i++ )
		{
			$idx = mt_rand( 0, count( $array_of_chars ) - 1 );
			$captcha_string .= $array_of_chars[ $idx ];
		}		
		
		//-----------------------------------------
		// Add to the DB
		//-----------------------------------------
		
		$this->DB->insert( 'captcha', array( 'captcha_unique_id' => $captcha_unique_id,
											 'captcha_string'    => $captcha_string,
											 'captcha_ipaddress' => $this->member->ip_address,
											 'captcha_date'      => time() ) );
		
		/* Make available */
		$this->captchaKey = $captcha_unique_id;
		
		/* Return template */
		return $this->registry->output->getTemplate('global_other')->captchaGD( $captcha_unique_id );
	}
	
	/**
	 * Validates the entered captcha code, returning true on success and false on failure
	 *
	 * @return	@e boolean
	 *
	 * <b>Example Usage:</b>
	 * @code
	 * $isValid = $this->validate();
	 * @endcode
	 */
	public function validate()
	{
		/* Init vars */
		$captcha_unique_id       = IPSText::alphanumericalClean( $_REQUEST['captcha_unique_id'] );
		$captcha_input_NOT_CLEAN = trim( $_REQUEST['captcha_string'] );
		
		/* Get ID from DB */
		$captcha = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'captcha', 'where' => "captcha_unique_id='". addslashes( $captcha_unique_id )."'" ) );
	
		if ( ! $captcha['captcha_unique_id'] )
		{
			return FALSE;
		}
		
		/* Check */
		if ( $captcha['captcha_string'] != $captcha_input_NOT_CLEAN )
		{
			return FALSE;
		}
		else
		{
			$this->_clearSessions( $this->member->ip_address );
			return TRUE;
		}
	}
	
	/**
	 * Generates the captcha image.  Returns false on failure.
	 *
	 * @param	array		$captcha_unique_id		Key 0 of the array contains the Unique ID
	 * @return	@e mixed
	 *
	 * <b>Example Usage:</b>
	 * @code
	 * $captchaImage = $this->showImage( $captcha_unique_id );
	 * @endcode
	 */
	public function showImage( $captcha_unique_id )
	{
		//-----------------------------------------
		// Magic _call method makes an array
		//-----------------------------------------
		
		$captcha_unique_id	= $captcha_unique_id[0];
		
		if ( ! $captcha_unique_id )
		{
			return false;
		}
		
		/* Get the info from the DB */
		$captcha = $this->DB->buildAndFetch( array( 'select' => '*', 'from' => 'captcha', 'where' => "captcha_unique_id='" . $captcha_unique_id . "'" ) );
	
		if ( ! $captcha['captcha_unique_id'] )
		{
			return false;
		}
		
		/* Show it... */
		$this->_showGDImage( $captcha['captcha_string'] );
	}

	/**
	 * Prints captcha image and headers
	 *
	 * @param	string		$content		Key to show in the GD image
	 * @return	@e void
	 *
	 * <b>Example Usage:</b>
	 * @code
	 * $this->_showGDImage( $captcha_string );
	 * @endcode
	 */
	protected function _showGDImage( $content="" )
	{
		//-----------------------------------------
		// Is GD Available?
		//-----------------------------------------
		
		if ( ! extension_loaded('gd') )
		{
			@header( "Content-Type: image/gif" );
			print base64_decode( "R0lGODlhyAA8AJEAAN/f3z8/P8zMzP///yH5BAAAAAAALAAAAADIADwAAAL/nI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8YhMlgACwEHQXESfzgOzykQAqgMmFMr9Rq+GbHlqAFsFWnFVrfwIAvQAu15P0A14Nn8/ADhXd4dnl2YYCAioGHBgyDbnNzBIV0gYxzEYWdg1iLAnScmFuQdAt2UKZTcl+mip+HoYG+tKOfv3N5l5garnmPt6CwyaFzrranu7i0crObvoaKvMyMhrIQhFuyzcyGwXcOpoLYg7DGsZXk5r6DSN51RNfF0RPU5sy7gpnH5bjLhrk7Y9/RQNisfq2CRJauTR6xUuFyBx/yrWypMMmTlq/9IwQnKWcKG5cvMeShBIMOFIaV9w2eti6SBABAyjvBRFMaZCMaxsqtxl8iShjpj+VfqGCJg4XzOfJCK5DVWliFNXlSIENKjWrVy7ev0KNqzYsWTFwhlFU8waLk+efGF7hi0aSgu3iGmV1cxdoGTinimbiGOeP8SWhps6z3AkeMMWW20mMykqQyuJDbYWdufKBJWc2uWmAJZdO0yOKfTCCqHGiO4E/oKGriTYaBw5g/MDqynNlW9Uhmx66tM2i05dNcM8O6Rg2MHLYKraLTpDcLebTke4APkcduAoku0DWpe24MI96ewZPdiy6Rlx/0Y+XJevlNu/z6vtlHFxZbpv9f9edYkfxgVmjnqSxXYOYPfFVMgXIHGC0ltWDNXYJ6Lsw82AFVpWEk4pEabgbsfBM5FphyDWRh1OLCUgbC06NtNU6UV1T1Jl3YhjjjruyGOPPv4IZJBC6tDXGUDB4UUaK06RhRl/0aWWF3CR4YWESraR1ZCh6dMOiMNIFE2GI/bRJYiIEeULiloyUNSFLzWC3VXcqEJXTBe1qApDpbXUEYxr2tYeQCyyGMuIcxbokHfPvPjHf25mqeWHoLEX0iH0UScmUzSWNxmj20yH6Z+/yNTeM0N1cumkg9E4GHnluLcfeKLm95yLoO5ZKJrhgeaQm4xlFGshcK3pYZ9LradQrmY5nmhVdMm+qqpKYkIqpDyltWkpjJJaaKmd6kXjHUXvDPborOaei2666q7LbrvuvgtvvPLOS2+9YBUAADs=" );
			exit();
		}
				
		//-----------------------------------------
		// INIT
		//-----------------------------------------
		
		$content       = '  '. preg_replace( "/(\w)/", "\\1 ", $content ) .' ';
		$use_fonts     = 0;
		$tmp_x         = 135;
		$tmp_y         = 20;
		$image_x       = 200;
		$image_y       = 60;
		$circles       = 3;
		$continue_loop = TRUE;
		$_started      = FALSE;
		
		//-----------------------------------------
		// Get backgrounds and fonts...
		//-----------------------------------------
		
		$backgrounds = $this->_getBackgrounds();
		$fonts       = $this->_getFonts();

		//-----------------------------------------
		// Got a background?
		//-----------------------------------------
		$_imgs = array();
		
		while ( $continue_loop )
		{
			if ( is_array( $backgrounds ) AND count( $backgrounds ) )
			{
				$i = mt_rand(0, count( $backgrounds ) - 1 );
			
				$background      = $backgrounds[ $i ];
				$_file_extension = preg_replace( "#^.*\.(\w{2,4})$#is", "\\1", strtolower( $background ) );
			
				switch( $_file_extension )
				{
					case 'jpg':
					case 'jpe':
					case 'jpeg':
						if ( ! function_exists('imagecreatefromjpeg') OR ! $im = @imagecreatefromjpeg($background) )
						{
							unset( $backgrounds[ $i ] );
						}
						else
						{
							$_imgs[] = $im;
							
							if( count( $_imgs ) > 2 )
							{
								$continue_loop = FALSE;
								$_started      = TRUE;
							}
						}
						break;
					case 'gif':
						if ( ! function_exists('imagecreatefromgif') OR ! $im = @imagecreatefromgif($background) )
						{
							unset( $backgrounds[ $i ] );
						}
						else
						{
							$_imgs[] = $im;
							
							if( count( $_imgs ) > 2 )
							{
								$continue_loop = FALSE;
								$_started      = TRUE;
							}
						}
						break;
					case 'png':
						if ( ! function_exists('imagecreatefrompng') OR ! $im = @imagecreatefrompng($background) )
						{
							unset( $backgrounds[ $i ] );
						}
						else
						{
							$_imgs[] = $im;
							
							if( count( $_imgs ) > 2 )
							{
								$continue_loop = FALSE;
								$_started      = TRUE;
							}
						}
						break;
				}
			}
			else
			{
				$continue_loop = FALSE;
			}
		}
		
		/* Create a new background */
		if( count( $_imgs > 2 ) )
		{
			/* Setup */
			$strip_count = 8;
			$strips      = ceil( $image_x / $strip_count );
			$im          = imagecreatetruecolor( $image_x, $image_y );	
			$curr_offset = 0;
			$alternate   = 0;
			
			for( $i = 0; $i < $strip_count; $i++ )
			{
				/* Alternate the background */
				$alternate++;
				$alternate = ( $alternate > 2 ) ? 0 : $alternate;
				
				/* Width of the strip */
				$end_strip = ( $i * $strips ) + mt_rand( 1, $strips );
				
				/* Copy the splice */
				imagecopymerge( $im, $_imgs[$alternate], $curr_offset, 0, $curr_offset, 0, $end_strip, $image_y, mt_rand( 1, 100 ) );
				
				/* Increment the offset */
				$curr_offset += $end_strip;
			}
			
			$_started = TRUE;
			
		}
		
		//-----------------------------------------
		// Still not got one? DO OLD FASHIONED
		//-----------------------------------------
		
		if ( $_started !== TRUE )
		{
			$im  = imagecreatetruecolor($image_x, $image_y);
			$tmp = imagecreatetruecolor($tmp_x, $tmp_y);
			
			$white  = ImageColorAllocate($tmp, 255, 255, 255);
			$black  = ImageColorAllocate($tmp, 0, 0, 0);
			$grey   = ImageColorAllocate($tmp, 200, 200, 200 );

			imagefill($tmp, 0, 0, $white);

			for ( $i = 1; $i <= $circles; $i++ )
			{
				$values = array(
								0  => mt_rand(0, $tmp_x - 10),
								1  => mt_rand(0, $tmp_y - 3),
								2  => mt_rand(0, $tmp_x - 10),
								3  => mt_rand(0, $tmp_y - 3),
								4  => mt_rand(0, $tmp_x - 10),
								5  => mt_rand(0, $tmp_y - 3),
								6  => mt_rand(0, $tmp_x - 10),
								7  => mt_rand(0, $tmp_y - 3),
								8  => mt_rand(0, $tmp_x - 10),
								9  => mt_rand(0, $tmp_y - 3),
								10 => mt_rand(0, $tmp_x - 10),
								11 => mt_rand(0, $tmp_y - 3),
						     );

				$randomcolor = imagecolorallocate( $tmp, mt_rand(100,255), mt_rand(100,255), mt_rand(100,255) );
				imagefilledpolygon($tmp, $values, 6, $randomcolor );
			}

			$num     = strlen($content);
			$x_param = 0;
			$y_param = 0;

			for( $i = 0; $i < $num; $i++ )
			{
				$x_param += mt_rand(-1,12);
				$y_param = mt_rand(-3,8);
				
				if( $x_param + 18 > $image_x )
				{
					$x_param -= ceil( $x_param + 18 - $image_x );
				}

				$randomcolor = imagecolorallocate( $tmp, mt_rand(0,150), mt_rand(0,150), mt_rand(0,150) );

				imagestring($tmp, 5, $x_param+1, $y_param+1, $content{$i}, $grey);
				imagestring($tmp, 5, $x_param, $y_param, $content{$i}, $randomcolor);
			}

			//-----------------------------------------
			// Distort by resizing
			//-----------------------------------------

			imagecopyresized($im, $tmp, 0, 0, 0, 0, $image_x, $image_y, $tmp_x, $tmp_y);

			imagedestroy($tmp);
			
			//-----------------------------------------
			// Background dots and lines
			//-----------------------------------------

			$random_pixels = $image_x * $image_y / 10;

			for ($i = 0; $i < $random_pixels; $i++)
			{
				$randomcolor = imagecolorallocate( $im, mt_rand(0,150), mt_rand(0,150), mt_rand(0,150) );
				ImageSetPixel($im, mt_rand(0, $image_x), mt_rand(0, $image_y), $randomcolor);
			}

			$no_x_lines = ($image_x - 1) / 5;

			for ( $i = 0; $i <= $no_x_lines; $i++ )
			{
				ImageLine( $im, $i * $no_x_lines, 0, $i * $no_x_lines, $image_y, $grey );
				ImageLine( $im, $i * $no_x_lines, 0, ($i * $no_x_lines)+$no_x_lines, $image_y, $grey );
			}

			$no_y_lines = ($image_y - 1) / 5;

			for ( $i = 0; $i <= $no_y_lines; $i++ )
			{
				ImageLine( $im, 0, $i * $no_y_lines, $image_x, $i * $no_y_lines, $grey );
			}
		}
		else
		{
			//-----------------------------------------
			// Can we use fonts?
			//-----------------------------------------
			
			if ( function_exists('imagettftext') AND is_array( $fonts ) AND count( $fonts ) )
			{
				if ( function_exists('imageantialias') )
				{
					imageantialias( $im, TRUE );
				}
				
				$num       = strlen($content);
				$x_param   = -10;
				$y_param   = 0;

				for( $i = 0; $i < $num; $i++ )
				{
					/* Random Font */
					$_font       = $fonts[ mt_rand( 0, count( $fonts ) - 1 ) ];
					
					$y_param     = mt_rand( 35, 48 );
					
					# Main color
					$col_r       = mt_rand(50,200);
					$col_g       = mt_rand(0,150);
					$col_b       = mt_rand(50,200);
					# High light
					$col_r_l     = ( $col_r + 50 > 255 ) ? 255 : $col_r + 50;
					$col_g_l     = ( $col_g + 50 > 255 ) ? 255 : $col_g + 50;
					$col_b_l     = ( $col_b + 50 > 255 ) ? 255 : $col_b + 50;
					# Low light
					$col_r_d     = ( $col_r - 50 < 0 ) ? 0 : $col_r - 50;
					$col_g_d     = ( $col_g - 50 < 0 ) ? 0 : $col_g - 50;
					$col_b_d     = ( $col_b - 50 < 0 ) ? 0 : $col_b - 50;
					
					$color_main  = imagecolorallocate( $im, $col_r, $col_g, $col_b );
					$color_light = imagecolorallocate( $im, $col_r_l, $col_g_l, $col_b_l );
					$color_dark  = imagecolorallocate( $im, $col_r_d, $col_g_d, $col_b_d );
					$_slant      = mt_rand( -20, 40 );
					
					if ( $i == 1 OR $i == 3 OR $i == 5 )
					{
						for( $ii = 0 ; $ii < 2 ; $ii++ )
						{
							$a   = $x_param + 50;
							$b   = mt_rand(0,100);
							$c   = $a + 20;
							$d   = $b + 20;
							$e   = ( $i == 3 ) ? mt_rand( 280, 320 ) : mt_rand( -320, -280 );
							
							imagearc( $im, $a  , $b  , $c, $d, 0, $e, $color_light );
							imagearc( $im, $a+1, $b+1, $c, $d, 0, $e, $color_main );
						}
					}
					
					$text_size = mt_rand( 24, 30 ); //24
					
					if ( ! $_result = @imagettftext( $im, $text_size, $_slant, $x_param - 1, $y_param - 1, $color_light, $_font, $content[$i] ) )
					{
						$use_fonts = FALSE;
						break;
					}
					else
					{
						@imagettftext( $im, $text_size, $_slant, $x_param + 1, $y_param + 1, $color_dark, $_font, $content[$i] );
						@imagettftext( $im, $text_size, $_slant, $x_param, $y_param, $color_main, $_font, $content[$i] );
					}
					
					$x_param += mt_rand( 13, 16 ); //15,18
					
					if( $x_param + 18 > $image_x )
					{
						$x_param -= ceil( $x_param + 18 - $image_x );
					}					
				}

				$use_fonts = TRUE;
			}
			
			if ( ! $use_fonts )
			{
				//-----------------------------------------
				// Continue with nice background image
				//-----------------------------------------
			
				$tmp         = imagecreatetruecolor($tmp_x  , $tmp_y  );
				$tmp2        = imagecreatetruecolor($image_x, $image_y);
		
				$white       = imagecolorallocate( $tmp, 255, 255, 255 );
				$black       = imagecolorallocate( $tmp, 0, 0, 0 );
				$grey        = imagecolorallocate( $tmp, 100, 100, 100 );
				$transparent = imagecolorallocate( $tmp2, 255, 255, 255 );
				$_white      = imagecolorallocate( $tmp2, 255, 255, 255 );
			
				imagefill($tmp , 0, 0, $white );
				imagefill($tmp2, 0, 0, $_white);
			
				$num         = strlen($content);
				$x_param     = 0;
				$y_param     = 0;

				for( $i = 0; $i < $num; $i++ )
				{
					if ( $i > 0 )
					{
						$x_param += mt_rand( 6, 12 );
						
						if( $x_param + 18 > $image_x )
						{
							$x_param -= ceil( $x_param + 18 - $image_x );
						}
					}
				
					$y_param  = mt_rand( 0, 5 );
				
					$randomcolor = imagecolorallocate( $tmp, mt_rand(50,200), mt_rand(50,200), mt_rand(50,200) );

					imagestring( $tmp, 5, $x_param + 1, $y_param + 1, $content{$i}, $grey );
					imagestring( $tmp, 5, $x_param    , $y_param    , $content{$i}, $randomcolor );
				}
			
				imagecopyresized($tmp2, $tmp, 0, 0, 0, 0, $image_x, $image_y, $tmp_x, $tmp_y );
			
				$tmp2 = $this->_showGDImageWave( $tmp2, 8, true );
			
				imagecolortransparent( $tmp2, $transparent );
				imagecopymerge( $im, $tmp2, 0, 0, 0, 0, $image_x, $image_y, 100 );
		
				imagedestroy($tmp);
				imagedestroy($tmp2);
			}
		}
		
		//-----------------------------------------
		// Blur?
		//-----------------------------------------
		
		if ( function_exists( 'imagefilter' ) )
		{
			@imagefilter( $im, IMG_FILTER_GAUSSIAN_BLUR );
		}
		
		//-----------------------------------------
		// Render a border
		//-----------------------------------------
		
		$black = imagecolorallocate( $im, 0, 0, 0 );
		
		imageline( $im, 0, 0, $image_x, 0, $black );
		imageline( $im, 0, 0, 0, $image_y, $black );
		imageline( $im, $image_x - 1, 0, $image_x - 1, $image_y, $black );
		imageline( $im, 0, $image_y - 1, $image_x, $image_y - 1, $black );
		
		//-----------------------------------------
		// Show it!
		//-----------------------------------------
		
		@header( "Content-Type: image/jpeg" );
		
		imagejpeg( $im );
		imagedestroy( $im );
		
		exit();
	}

	/**
	 * Create wave effect for GD images
	 *
	 * @param	resources		$im		Image resource
	 * @param	integer			$wave	Wave factor
	 * @return	@e resource
	 *
	 * <b>Example Usage:</b>
	 * @code
	 * $imageResource = $this->_showGDImageWave( $captcha_string );
	 * @endcode
	 */
	protected function _showGDImageWave( $im, $wave=10 )
	{
		$_width  = imagesx( $im );
		$_height = imagesy( $im );

		$tmp = imagecreatetruecolor( $_width, $_height );

		$_direction = ( time() % 2 ) ? TRUE : FALSE;

		for ( $x = 0; $x < $_width; $x++ )
		{
			for ( $y = 0 ; $y < $_height ; $y++ )
			{
				$xo = $wave * sin( 2 * 3.1415 * $y / 128 );
				$yo = $wave * cos( 2 * 3.1415 * $x / 128 );

				$_x = $x - $xo;
				$_y = $y - $yo;
				
				if ( ($_x > 0 AND $_x < $_width) AND ($_y > 0 AND $_y < $_height) )
				{
					$index  = imagecolorat($im, $_x, $_y);
               		$colors = imagecolorsforindex($im, $index);
               		$color  = imagecolorresolve( $tmp, $colors['red'], $colors['green'], $colors['blue'] );
				}
				else
				{
					$color = imagecolorresolve( $tmp, 255, 255, 255 );
				}

				imagesetpixel( $tmp, $x, $y, $color );
			}
		}

		return $tmp;
	}

	/**
	 * Removes extinct captcha sessions or 'dead' entries
	 *
	 * @param	string		$ip_address		Optional IP address to clear out on
	 * @return	@e void
	 *
	 * <b>Example Usage:</b>
	 * @code
	 * $this->_clearSessions( $ip_address );
	 * @endcode
	 */
	protected function _clearSessions( $ip_address='' )
	{
		/* Init vars */
		$time  = time() - 60 * 3600;
		$extra = ( $ip_address ) ? " OR captcha_ipaddress='" . $ip_address . "'" : '';
		
		/* Remove from DB */
		$this->DB->delete( 'captcha', 'captcha_date < ' . $time . $extra );
	}
	
	/**
	 * Retrieves the list of backgrounds from the specified path
	 *
	 * @return	@e array
	 *
	 * <b>Example Usage:</b>
	 * @code
	 * $images = $this->_getBackgrounds();
	 * @endcode
	 */
	protected function _getBackgrounds()
	{
		/* Init vars */
		$images = array();
		$_path  = $this->path_background;
		
		/* Loop */
		if ( $_dir = opendir( $_path ) )
		{
			while( false !== ( $_file = readdir( $_dir ) ) )
			{
				if ( preg_match( "#\.(gif|jpeg|jpg|png)$#i", $_file ) )
				{
					$images[] = $_path . '/' . $_file;
				}
			}
		}

		return $images;
	}

	/**
	 * Retrieves the list of fonts from the specified path
	 *
	 * @return	@e array
	 *
	 * <b>Example Usage:</b>
	 * @code
	 * $fonts = $this->_getFonts();
	 * @endcode
	 */
	protected function _getFonts()
	{
		/* Init vars */
		$fonts  = array();
		$_path  = $this->path_fonts;
		
		/* Loop */
		if ( $_dir = @opendir( $_path ) )
		{
			while( false !== ( $_file = @readdir( $_dir ) ) )
			{
				if ( preg_match( "#\.(ttf)$#i", $_file ) )
				{
					$fonts[] = $_path . '/' . $_file;
				}
			}
		}
		
		return $fonts;
	}
}