<?php
	!defined('IN_SYS') && exit('Illegal access!');
	header("pragma:no-cache\r\n");
	header("Cache-Control:no-cache\r\n");
	header("Expires:0\r\n");
	session_start();

	function getcaptcha($tool=true)
	{
		global $LA,$captchalang;
		$spanid='captcha_'.mt_rand(1000,9999);
		$spanid2='captcha2_'.mt_rand(1000,9999);

		if($LA['captcha_type']==1 || !class_exists('SWFFont'))//createcaptcha()
		{
			return '<img src="" id="'.$spanid.'" width="'.$LA['captcha_width'].'" height="'.$LA['captcha_height'].'"  onclick="$(\'#'.$spanid.'\').show();$(\'#'.$spanid2.'\').hide();$(\'#'.$spanid.'\').attr(\'src\',\''.LA_PATH.'api/captcha/captcha.php?\'+Math.random());" style="display:none;cursor:pointer"/> <span id="'.$spanid2.'" onclick="$(\'#'.$spanid2.'\').hide();$(\'#'.$spanid.'\').attr(\'src\',\''.LA_PATH.'api/captcha/captcha.php?\'+Math.random());$(\'#'.$spanid.'\').show();" style="font-size:12px;cursor:pointer">点击查看</span>';
		}
		else
		{
			return '<span id="'.$spanid.'"></span><script type="text/javascript">
function raload_'.$spanid.'()
{
	swfobject.embedSWF("'.LA_PATH.'api/captcha/captcha.php?'.mt_rand().'", "'.$spanid.'", "85", "25", "9.0.0", "'.LA_PATH.'api/captcha/expressInstall.swf");
}raload_'.$spanid.'();</script> &nbsp;<a href="javascript:void(0);" onclick="javascript:raload_'.$spanid.'();">'.($tool?$captchalang['refresh']:'').'</a>';
		}
	}

	function createcaptcha()
	{
		global $LA;
		$charset='abcdefghkmnprstuvwyz23456789';
		$code='';
		if(function_exists('imagecreate'))
		{
			$len=strlen($charset)-1;
			for($i=0;$i<$LA['captcha_length'];$i++)
			{
					$code.=$charset[mt_rand(0,$len)];
			}
		}
		else
		{
			$code='abcd';
		}

		$_SESSION['captcha']=$code;

		if($LA['captcha_type']==1 || !class_exists('SWFFont'))
		{
			@ImageCode($code, 60);
		}
		else
		{
			
			$font = new SWFFont( '_sans' );
			$tf = new SWFTextField();
			$tf->setFont( $font ); 
			$tf->setColor( rand(90,255),rand(90,255),rand(90,255) ); 
			$tf->setHeight( ($LA['captcha_height']-2) ); 
			$tf->addString( $code);
			$m = new SWFMovie();
			$m->setbackground( 237,247,255 );   //设置背景颜色
			$m->setDimension($LA['captcha_width'],$LA['captcha_height']);
			$f_tf = $m->add( $tf );
			$f_tf->moveTo( 20, 0 );
			header('Content-type: application/x-shockwave-flash');
			$m->output();
		}
	}

	/**
	 * ImageCode 生成GIF图片验证
	 * @param $string 字符串
	 * @param $width 宽度
	 * @param $height 高度
	 * */
	function ImageCode($string = '')
	{
		global $LA;
		$font=SYSTEM_ROOT.'statics/fonts/captcha.ttf';
		$authstr = $string ? $string : ((time() % 2 == 0) ? mt_rand(1000, 9999) : mt_rand(10000, 99999)); 
		
		$board_width = $LA['captcha_width'];
		$board_height = $LA['captcha_height'];

		// 生成一个32帧的GIF动画
		for($i = 0; $i < 32; $i++)
		{

			$image = imagecreate($board_width, $board_height);
			imagecolorallocate($image, 0,0,0);
			// 设定文字颜色数组 
			$colorList[] = ImageColorAllocate($image, 15,73,210);
			$colorList[] = ImageColorAllocate($image, 0,64,0);
			$colorList[] = ImageColorAllocate($image, 0,0,64);
			$colorList[] = ImageColorAllocate($image, 0,128,128);
			$colorList[] = ImageColorAllocate($image, 27,52,47);
			$colorList[] = ImageColorAllocate($image, 51,0,102);
			$colorList[] = ImageColorAllocate($image, 0,0,145);
			$colorList[] = ImageColorAllocate($image, 0,0,113);
			$colorList[] = ImageColorAllocate($image, 0,51,51);
			$colorList[] = ImageColorAllocate($image, 158,180,35);
			$colorList[] = ImageColorAllocate($image, 59,59,59);
			$colorList[] = ImageColorAllocate($image, 0,0,0);
			$colorList[] = ImageColorAllocate($image, 1,128,180);
			$colorList[] = ImageColorAllocate($image, 0,153,51);
			$colorList[] = ImageColorAllocate($image, 60,131,1);
			$colorList[] = ImageColorAllocate($image, 0,0,0);
			$fontcolor = ImageColorAllocate($image, 0,0,0);
			$gray = ImageColorAllocate($image, 245,245,245); 
			
			$color = imagecolorallocate($image, 255,255,255);
			$color2 = imagecolorallocate($image, 255,0,0);
			
			imagefill($image, 0, 0, $gray);
			
			$space = 16;		// 字符间距
			if($i > 0)			// 屏蔽第一帧
			{
				for ($k = 0; $k < strlen($authstr); $k++) 
				{ 
					$colorRandom = mt_rand(0,sizeof($colorList)-1); 
					$float_top = rand(0,4);
					$float_left = rand(0,3);
					imagettftext($image,14,mt_rand(-30,30),$space * $k+$space,$LA['captcha_height']/1.4,$colorList[$colorRandom],$font,substr($authstr, $k, 1));
				}
			}
			
			for ($k = 0; $k < 20; $k++) 
			{ 
				$colorRandom = mt_rand(0,sizeof($colorList)-1); 
				imagesetpixel($image, rand()%70 , rand()%15 , $colorList[$colorRandom]); 
		
			}
			// 添加干扰线
			for($k = 0; $k < 3; $k++)
			{
				$colorRandom = mt_rand(0, sizeof($colorList)-1); 
				$todrawline = 1;
				if($todrawline)
				{
					imageline($image, mt_rand(0, $board_width), mt_rand(0,$board_height), mt_rand(0,$board_width), mt_rand(0,$board_height), $colorList[$colorRandom]);
				}
				else 
				{
					$w = mt_rand(0,$board_width);
					$h = mt_rand(0,$board_width);
					imagearc($image, $board_width - floor($w / 2) , floor($h / 2), $w, $h,  rand(90,180), rand(180,270), $colorList[$colorRandom]);
				}
			}
			imagegif($image,SYSTEM_ROOT.'data/tmp/'.md5($string).'-'.$i.'.gif');
			imagedestroy($image);
			$imagedata[] = file_get_contents(SYSTEM_ROOT.'data/tmp/'.md5($string).'-'.$i.'.gif');
			@unlink(SYSTEM_ROOT.'data/tmp/'.md5($string).'-'.$i.'.gif');
 
			++$i;  
		}
		
		$gif = new GIFEncoder($imagedata);  
		Header ('Content-type:image/gif');  
		echo $gif->GetAnimation();  
	}

	/**
	 * GIFEncoder类
	 * */
	Class GIFEncoder 
	{
		var $GIF = "GIF89a";                /* GIF header 6 bytes        */  
		var $VER = "GIFEncoder V2.06";        /* Encoder version             */  

		var $BUF = Array ( );  
		var $LOP =  0;  
		var $DIS =  2;  
		var $COL = -1;  
		var $IMG = -1;  

		var $ERR = Array (  
			'ERR00' =>"Does not supported function for only one image!",  
			'ERR01' =>"Source is not a GIF image!",  
			'ERR02' =>"Unintelligible flag ",  
			'ERR03' =>"Could not make animation from animated GIF source",  
		);  
		
		function GIFEncoder ($GIF_src, $GIF_dly = 100, $GIF_lop = 0, $GIF_dis = 0,  $GIF_red = 0, $GIF_grn = 0, $GIF_blu = 0, $GIF_mod = 'bin' ) 
		{  
			if (!is_array($GIF_src) && !is_array($GIF_tim)) 
			{  
				printf ( "%s: %s", $this->VER, $this->ERR['ERR00']);  
				exit( 0 );
			}  
			$this->LOP = ($GIF_lop > -1) ? $GIF_lop : 0;  
			$this->DIS = ($GIF_dis > -1) ? (( $GIF_dis < 3 ) ? $GIF_dis : 3) : 2;  
			$this->COL = ($GIF_red > -1 && $GIF_grn > -1 && $GIF_blu > -1) ? ($GIF_red | ($GIF_grn << 8) | ($GIF_blu << 16)) : -1;  

			for ($i = 0, $src_count = count($GIF_src); $i < $src_count; $i++ ) 
			{
				if (strToLower( $GIF_mod ) == "url") 
				{  
					$this->BUF[] = fread (fopen($GIF_src [$i], "rb"), filesize ($GIF_src [$i]));  
				}  
				elseif(strToLower($GIF_mod) == "bin") 
				{  
					$this->BUF [ ] = $GIF_src [ $i ];  
				}  
				else 
				{  
					printf("%s: %s ( %s )!", $this->VER, $this->ERR [ 'ERR02' ], $GIF_mod);  
					exit(0);  
				}  
				if (substr($this->BUF[$i], 0, 6) != "GIF87a" && substr($this->BUF [$i], 0, 6) != "GIF89a") 
				{  
					printf( "%s: %d %s", $this->VER, $i, $this->ERR ['ERR01']);  
					exit(0);  
				}  
				for ($j = (13 + 3 * (2 << (ord($this->BUF[$i]{10}) & 0x07 ))), $k = TRUE; $k; $j++)
				{  
					switch ($this->BUF [$i]{$j}) 
					{  
						case "!":  
							if ((substr($this->BUF[$i], ($j + 3), 8)) == "NETSCAPE") 
							{  
									printf( "%s: %s ( %s source )!", $this->VER, $this->ERR ['ERR03'], ($i + 1));  
									exit( 0 );  
							}  
							break;  
						case ";":  
							$k = FALSE;  
							break;  
					}  
				}  
			}  
			GIFEncoder::GIFAddHeader();  
			for($i = 0, $count_buf = count($this->BUF); $i < $count_buf; $i++) 
			{  
				GIFEncoder::GIFAddFrames($i, $GIF_dly[$i]);  
			}  
			GIFEncoder::GIFAddFooter();  
		}  
		
		function GIFAddHeader ( ) 
		{  
			$cmap = 0;  
			
			if (ord($this->BUF[0]{10}) & 0x80 ) 
			{  
				$cmap = 3 * ( 2 << ( ord ( $this->BUF [ 0 ]{10} ) & 0x07 ));  
				
				$this->GIF .= substr ( $this->BUF [ 0 ], 6, 7);  
				$this->GIF .= substr ( $this->BUF [ 0 ], 13, $cmap);  
				$this->GIF .= "!\377\13NETSCAPE2.0\3\1" . GIFEncoder::GIFWord ( $this->LOP ) . "\0";  
			}  
		}  
		
		function GIFAddFrames ( $i, $d ) 
		{  

			$Locals_str = 13 + 3 * (2 <<(ord($this->BUF[$i]{10}) & 0x07));  

			$Locals_end = strlen($this->BUF[$i]) - $Locals_str - 1;  
			$Locals_tmp = substr ($this->BUF[$i], $Locals_str, $Locals_end);  

			$Global_len = 2 << (ord( $this->BUF [0]{10} ) & 0x07 );  
			$Locals_len = 2 << (ord( $this->BUF[$i]{10}) & 0x07);  

			$Global_rgb = substr($this->BUF[0], 13, 3 * (2 << ( ord ( $this->BUF[0]{10} ) & 0x07)));  
			$Locals_rgb = substr ( $this->BUF[$i], 13, 3 * (2 << ( ord ( $this->BUF[$i]{10} ) & 0x07)));  

			$Locals_ext = "!\xF9\x04" . chr(($this->DIS << 2) + 0) . chr(($d >> 0) & 0xFF) . chr(($d >> 8) & 0xFF) . "\x0\x0";  

			if ( $this->COL > -1 && ord($this->BUF[$i]{10}) & 0x80)
			{  
				for($j = 0; $j < (2 << (ord( $this->BUF[$i]{10}) & 0x07)); $j++ ) 
				{  
					if(ord ($Locals_rgb{3 * $j + 0}) == ($this->COL >>  0) & 0xFF && ord ( $Locals_rgb { 3 * $j + 1 } ) == ( $this->COL >>  8 ) & 0xFF && ord ( $Locals_rgb { 3 * $j + 2 } ) == ( $this->COL >> 16 ) & 0xFF ) 
					{  
						$Locals_ext = "!\xF9\x04" . chr(($this->DIS << 2) + 1) . chr (( $d >> 0) & 0xFF) . chr (( $d >> 8) & 0xFF) . chr ($j) . "\x0";  
						break;  
					}  
				}  
			}  
			switch ( $Locals_tmp { 0 } ) 
			{  
				case "!":  
					$Locals_img = substr($Locals_tmp, 8, 10);  
					$Locals_tmp = substr($Locals_tmp, 18, strlen ($Locals_tmp) - 18);  
					break;  
				case ",":  
					$Locals_img = substr($Locals_tmp, 0, 10);  
					$Locals_tmp = substr($Locals_tmp, 10, strlen($Locals_tmp) - 10);  
					break;  
			}  
			if ( ord ( $this->BUF[$i]{10} ) & 0x80 && $this->IMG > -1 ) 
			{  
				if ( $Global_len == $Locals_len ) 
				{  
					if ( GIFEncoder::GIFBlockCompare ( $Global_rgb, $Locals_rgb, $Global_len ) ) 
					{  
						$this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );  
					}  
					else 
					{  
						$byte  = ord ( $Locals_img{9});  
						$byte |= 0x80;  
						$byte &= 0xF8;  
						$byte |= ( ord ( $this->BUF [ 0 ]{10}) & 0x07);  
						$Locals_img{9} = chr($byte);  
						$this->GIF .= ($Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp);  
					}  
				}  
				else 
				{  
					$byte  = ord($Locals_img{9});  
					$byte |= 0x80;  
					$byte &= 0xF8;  
					$byte |= (ord($this->BUF[$i]{10}) & 0x07);  
					$Locals_img {9} = chr($byte);  
					$this->GIF .= ($Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp);  
				}  
			}  
			else 
			{  
				$this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );  
			}  
			$this->IMG  = 1;  
		}  
		
		function GIFAddFooter ( ) {  
			$this->GIF .= ";";  
		}  
		
		function GIFBlockCompare ( $GlobalBlock, $LocalBlock, $Len ) 
		{  
			for ( $i = 0; $i < $Len; $i++ ) 
			{  
				if($GlobalBlock { 3 * $i + 0 } != $LocalBlock { 3 * $i + 0 } || $GlobalBlock { 3 * $i + 1 } != $LocalBlock { 3 * $i + 1 } || $GlobalBlock { 3 * $i + 2 } != $LocalBlock{3 * $i + 2}) 
				{  
					return ( 0 );  
				}  
			}  
			return ( 1 );  
		}  
		
		function GIFWord ( $int ) 
		{  
		   return ( chr ( $int & 0xFF ) . chr ( ( $int >> 8 ) & 0xFF ) );  
		}  
		
		function GetAnimation ( ) 
		{  
			return ($this->GIF);  
		}  
	}
?>