<?php
  session_start();
  $SID=session_id();

/**
 *	Captcha Bild mit Farbverlauf
 *
 *	Systemvoraussetzung:
 *	Linux, Windows
 * 	PHP 4 >= 4.0.0-RC2 , PHP 5
 *	GD-Bibliothek ( > gd-1.6 )
 *	FreeType-Bibliothek
 *
 *	Erstellt ein Captcha Bild mit Farbverlauf und 6 Buchstaben 
 *  und Zahlen
 *
 * 	LICENSE: GNU General Public License (GPL)
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License version 2,
 *	as published by the Free Software Foundation.
 *
 *	@category   Captcha
 *	@author     Damir Enseleit <info@selfphp.de>
 *	@copyright  2001-2006 SELFPHP
 *	@version    $Id: captcha.php,v 0.10 2006/04/07 13:15:30 des1 Exp $
 *	@link       http://www.selfphp.de
 */

/**
 * Erstellt ein Array aus Gross-, Kleinbuchstaben und Zahlen
 * Schlecht unterscheidbare Buchstaben und Zahlen werden ausgeschlossen
 * Ausgeschlossen werden:
 * 	i, I, l, L, o, O, 1, 0
 *
 * Können auch wahlweise mit 
 * range('A','Z');
 * range('a','z');
 * range(0,9);
 * erzeugt werden
 *
 * @return	array		Liefert ein Array aus Buchstaben und Zahlen
 */
function MakeAlphabet()
{
	// Grossbuchstaben erzeugen
	for ($x = 65; $x <= 90; $x++) {
  	if($x != 73 && $x != 76 && $x != 79)
  		$alphabet[] = chr($x);
	}

	// Kleinbuchstaben erzeugen
	for ($x = 97; $x <= 122; $x++) {
	   if($x != 105 && $x != 108 && $x != 111)
	   	$alphabet[] = chr($x);
	}

	// Zahlen erzeugen
	for ($x = 48; $x <= 57; $x++) {
    if($x != 48 && $x != 49)
    	$alphabet[] = chr($x);
	}
	
	return $alphabet;
}

/**
 * Erstellt einen Außenrahmen um das Captcha-Bild
 *
 * @param		integer		$imgWidth			Breite des Bildes
 * @param		integer		$imgHeight		Höhe des Bildes
 * @param		resource  $im						Zeiger auf das Bild
 * @param		array		  $color				Farbwerte im RGB-Format
 *
 * @return	void			
 */
function makeBorder($imgWidth,$imgHeight,$im,$color)
{
	imageline($im,0,0,$imgWidth,0,$color); 
	imageline($im,0,$imgHeight-1,$imgWidth,$imgHeight-1,$color);
	imageline($im,0,0,0,$imgHeight,$color);  
	imageline($im,$imgWidth-1,0,$imgWidth-1,$imgHeight,$color);
}

/**
 * Erstellt den Farbverlauf im Captcha-Bild
 *
 * @param		array			$fromRGB			Farbwerte im RGB-Format
 * @param		array			$toRGB				Farbwerte im RGB-Format
 * @param		integer	  $imgHeight		Bildhöhe
 *
 * @return	array 		Gibt ein Array für den Farbverlauf zurück			
 */
function makeGradient($fromRGB,$toRGB,$imgHeight)
{
	
	$diffR = ($fromRGB[0]-$toRGB[0]); //38
	$diffG = ($fromRGB[1]-$toRGB[1]); //133
	$diffB = ($fromRGB[2]-$toRGB[2]); // -6

	$maxR = $diffR / $imgHeight; // 0.475
	$maxG = $diffG / $imgHeight; // 1,66
	$maxB = $diffB / $imgHeight; // 0.075

	$maxNR = $maxR;
	$maxNG = $maxG;
	$maxNB = $maxB;

	for($x=0;$x<$imgHeight;$x++)
	{
		$color['r'][$x] = abs($fromRGB[0] - $maxR);
		$color['g'][$x] = abs($fromRGB[1] - $maxG);
		$color['b'][$x] = abs($fromRGB[2] - $maxB);
		$maxR += $maxNR;
		$maxG += $maxNG;
		$maxB += $maxNB;
	}
	
	return $color;
	
}


// TTF-Schrift
// Sie sollten hier unbedingt den absoluten Pfad angeben, da ansonsten
// eventuell die TTF-Datei nicht eingebunden werden kann!
//$fileTTF =  '/homepages/29/d151852282/htdocs/kochbuch/bddavinc.ttf';
$fileTTF =  $_SERVER["DOCUMENT_ROOT"] . $_SESSION['LEC_PATH'] . '/bin/primer_0.ttf';

// Verzeichnis für die Captcha-Bilder (muss Schreibrechte besitzen!)
// Ausserdem sollten in diesem Ordner nur die Bilder gespeichert werden
// da das Programm in regelmaessigen Abstaenden dieses leert!
// Kein abschliessenden Slash benutzen!
$captchaDir = $_SERVER["DOCUMENT_ROOT"] . $_SESSION['LEC_PATH'] . '/bin/captchadir';

// Schriftgröße
$size = 28;

//Bildgroesse
$imgWidth = 200;//200
$imgHeight = 50;//80


// Farbverlauf RGB-Wert Start und RGB-Wert Ende
$fromRGB = array(255,255,255);
$toRGB = array(255,255,255);

// Randfarbe
$colorBorder = array(0,0,160);


header("Content-type: image/png");

$im = @imagecreate($imgWidth, $imgHeight)
  or die("GD! Initialisierung fehlgeschlagen");

// Definiert die Farbe für den Border
$colorB = imagecolorallocate($im,$colorBorder[0],$colorBorder[1],$colorBorder[2]);

// Erstellt den Farbverlauf
$colorRGB = makeGradient($fromRGB,$toRGB,$imgHeight);

for($x=0;$x<$imgHeight;$x++)
{
	$r = $colorRGB['r'][$x];
	$g = $colorRGB['g'][$x];
	$b = $colorRGB['b'][$x];
	$color = imagecolorallocate($im,$r,$g,$b);
	imageline($im,0,$x,$imgWidth,$x,$color);
}


//Wortliste erstellen
$alphabet = MakeAlphabet();

// Array des Alphabets durchwürfeln
shuffle($alphabet); 

$mix = range(0,255);
shuffle($mix);

$colors=array(
	imagecolorallocate($im,$mix[0],$mix[6],$mix[12]),
	imagecolorallocate($im,$mix[1],$mix[7],$mix[13]),
	imagecolorallocate($im,$mix[2],$mix[8],$mix[14]),
	imagecolorallocate($im,$mix[3],$mix[9],$mix[15]),
	imagecolorallocate($im,$mix[4],$mix[10],$mix[16]),
	imagecolorallocate($im,$mix[5],$mix[11],$mix[17])
);

// Zeichnet die Buchstaben und baut den Dateinamen auf
for($x=0;$x<6;$x++){ 

	$angel = rand(-25,25);
	$y = rand($size,$imgHeight-20);
	imagettftext($im, $size, $angel, $next, $y, $colors[$x], $fileTTF,$alphabet[$x]);
	$next += $size + ($imgWidth/$size);
	$fileName .= $alphabet[$x];

}

// Border erstellen
makeBorder($imgWidth,$imgHeight,$im,$colorB);

// Uebermittelter Hash-Wert ueberpruefen
if(!preg_match('/^[a-f0-9]{32}$/',$_GET['codeCaptcha']))
	$_GET['codeCaptcha'] = md5(microtime());

// Image speichern	
imagepng($im,$captchaDir.'/'.$_GET['codeCaptcha'].'_'.$fileName.'.png');

imagedestroy($im);

// Bild ausgeben
readfile($captchaDir.'/'.$_GET['codeCaptcha'].'_'.$fileName.'.png');
?>
