<?php
/** 
*
* @package VC
* @version $Id$
* @copyright (c) 2006 phpBB Group 
* @license http://opensource.org/licenses/gpl-license.php GNU Public License 
*
*/

/**
* Based on PHP-Class hn_captcha Version 1.3, released 11-Apr-2006
* Original Author - Horst Nogajski, horst@nogajski.de
*
* @package VC
*/
class captcha
{
	var $width = 360;
	var $height = 96;

	function execute($code, $seed)
	{
		global $config;
		$stats = gd_info();

		$bundled = (substr($stats['GD Version'], 0, 7) === 'bundled') ? true : false;

		preg_match('/[\\d.]+/', $stats['GD Version'], $version);
		$gd_version = (version_compare($version[0], '2.0.1', '>=')) ? 2 : 1;

		// create the image, stay compat with older versions of GD
		if ($gd_version === 2)
		{
			$func1 = 'imagecreatetruecolor';
			$func2 = 'imagecolorallocate';
		}
		else
		{
			$func1 = 'imagecreate';
			$func2 = 'imagecolorclosest';
		}

		$image = $func1($this->width, $this->height);

		if ($bundled)
		{
			imageantialias($image, true);
		}

		// seed the random generator
		mt_srand($seed);

		// set background color
		$back = imagecolorallocate($image, mt_rand(224, 255), mt_rand(224, 255), mt_rand(224, 255));
		imagefilledrectangle($image, 0, 0, $this->width, $this->height, $back);

		// allocates the 216 websafe color palette to the image
		if ($gd_version === 1)
		{
			for ($r = 0; $r <= 255; $r += 51)
			{
				for ($g = 0; $g <= 255; $g += 51)
				{
					for ($b = 0; $b <= 255; $b += 51)
					{
						imagecolorallocate($image, $r, $g, $b);
					}
				}
			}
		}

		// fill with noise or grid
		if ($config['captcha_gd_noise'])
		{
			$chars_allowed = array_merge(range('1', '9'), range('A', 'Z'));
			// random characters in background with random position, angle, color
			for ($i = 0 ; $i < 72; $i++)
			{
				$size	= mt_rand(8, 23);
				$angle	= mt_rand(0, 360);
				$x		= mt_rand(0, 360);
				$y		= mt_rand(0, (int)($this->height - ($size / 5)));
				$color	= $func2($image, mt_rand(160, 224), mt_rand(160, 224), mt_rand(160, 224));
				$text	= $chars_allowed[mt_rand(0, sizeof($chars_allowed) - 1)];
				imagettftext($image, $size, $angle, $x, $y, $color, $this->get_font(), $text);
			}
			unset($chars_allowed);
		}
		else
		{
			// generate grid
			for ($i = 0; $i < $this->width; $i += 13)
			{
				$color	= $func2($image, mt_rand(160, 224), mt_rand(160, 224), mt_rand(160, 224));
				imageline($image, $i, 0, $i, $this->height, $color);
			}

			for ($i = 0; $i < $this->height; $i += 11)
			{
				$color	= $func2($image, mt_rand(160, 224), mt_rand(160, 224), mt_rand(160, 224));
				imageline($image, 0, $i, $this->width, $i, $color);
			}
		}

		$len = strlen($code);

		for ($i = 0, $x = mt_rand(20, 40); $i < $len; $i++)
		{
			$text	= strtoupper($code[$i]);
			$angle	= mt_rand(-30, 30);
			$size	= mt_rand(20, 40);
			$y		= mt_rand((int)($size * 1.5), (int)($this->height - ($size / 7)));

			$color	= $func2($image, mt_rand(0, 127), mt_rand(0, 127), mt_rand(0, 127));
			$shadow = $func2($image, mt_rand(127, 254), mt_rand(127, 254), mt_rand(127, 254));
			$font = $this->get_font();

			imagettftext($image, $size, $angle, $x + (int)($size / 15), $y, $shadow, $font, $text);
			imagettftext($image, $size, $angle, $x, $y - (int)($size / 15), $color, $font, $text);

			$x += $size + 4;
		}

		// Output image
		header('Content-Type: image/png');
		header('Cache-control: no-cache, no-store');
		imagepng($image);
		imagedestroy($image);
	}

	function get_font()
	{
		static $fonts = array();
	
		if (!sizeof($fonts))
		{
			global $phpbb_root_path;
	
			$dr = @opendir($phpbb_root_path . 'includes/captcha/fonts');

			if (!$dr)
			{
				trigger_error('Unable to open includes/captcha/fonts directory.', E_USER_ERROR);
			}

			while (false !== ($entry = readdir($dr)))
			{
				if (strtolower(pathinfo($entry, PATHINFO_EXTENSION)) == 'ttf')
				{
					$fonts[] = $phpbb_root_path . 'includes/captcha/fonts/' . $entry;
				}
			}
			closedir($dr);
		}

		return $fonts[mt_rand(0, sizeof($fonts) - 1)];
	}
}

?>