<?php
////////////////////////////////////////////////
/// Contact formulier met formherhaling
/// Gemaakt door Sebazzz
/// xhtml compatible
///////////////////////////////////////////

//output buffering aanzetten om leuke errors te verhelpen/voorkomen
ob_start();

//headers alvast instellen

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");


/////////////////////////////////////////////////////
/// Variablen die ingesteld moeten worden
/////////////////////////////////////////////////////

// Maanden, hoef je eigen niks aan te wijzigen, tenzij je
// natuurlijk de maanden in het engels wil ontvangen
$SETTINGS['maanden']	                   = array(
'01' => 'Januari',
'02' => 'Februari',
'03' => 'Maart',
'04' => 'April',
'05' => 'Mei',
'06' => 'Juni',
'07' => 'Juli',
'08' => 'Augustus',
'09' => 'September',
'10' => 'Oktober',
'11' => 'November',
'12' => 'December'
);

// email adres(sen) waar het naartoe moet
$SETTINGS['emails'] = array('ik@jij.nl', 'Hij@zij.com');

// html email of plain text? kies uit:
// text/html - text/plain
$SETTINGS['mime'] = 'text/html';

//datum formaat volgens php's date() functie
$SETTINGS['datum_formaat'] = 'd-m-Y H:i:s';

//tijdzone waar je in zit
$SETTINGS['timezone'] = 1;

//STA, Server Time Adjustment in minuten. Zegt het al...
$SETTINGS['adjustment'] = 0;

//input: minimale en maximale string lengte van naam?
$SETTINGS['naam_min'] = 3;
$SETTINGS['naam_max'] = 20;

//input: minimale en maximale string lengte van titel?
$SETTINGS['titel_min'] = 4;
$SETTINGS['titel_max'] = 40;

//input: minimale en maximale string lengte van titel?
$SETTINGS['email_min'] = 4;
$SETTINGS['email_max'] = 40;

//input: minimale en maximale string lengte van bericht? maximale woord lengte?
$SETTINGS['bericht_min'] = 20;
$SETTINGS['bericht_max'] = 10000;
$SETTINGS['bericht_wmx'] = 50;

//bericht dat weergegeven wordt bovenaan het formulier, html ingeschakelt
//hoeft er niks? laat dan &nbsp; staan
$SETTINGS['bericht_top'] = '&nbsp;';

//bericht dat weergegeven wordt nadat het emailtje successvol is verzonden
$SETTINGS['bericht_suc']  = 'Bedankt voor het versturen van een e-mail.';
$SETTINGS['bericht_suc'] .= 'Je zult snel een antwoord krijgen indien nodig. <br />';
$SETTINGS['bericht_suc'] .= 'We gaan vertroiuwelijk om met de informatie en ';
$SETTINGS['bericht_suc'] .= 'je email adres zal nooit aan derden worden gegeven.';

//kijken voor een geldige email adres? true voor ja, false voor nee
$SETTINGS['email_check'] = true;

//foutmelding om te weergeven als het verzenden van 
//de email niet is gelukt(dus als mail() FALSE geeft)
//html ingeschakelt
$SETTINGS['no_email'] = 'Er is een foutje opgetreden waardoor het email verzenden is mislukt...';

//foutmelding om te weergeven als degene al een emailtje heeft verzonden. html ingeschakelt
$SETTINGS['error_spam'] = 'Jij hebt al eens een emailtje gestuurd vandaag!';

//tijd wanneer het koekje beschimmeld raakt ( in andere taal: cookie verloop tijd)
$SETTINGS['expire_cookie'] = time() + (3600 * 24); //verloopt na een dag


/// niks meer te editen

// error reporting goed zetten
error_reporting(E_ALL ^ E_NOTICE);
//////////////////////////////
/// functies defineeren
////////////////////////////

function checkcookie() {
	///////////////////////////////////////////////
	/// Deze functie kijkt voor een cookie,
	/// in dit geval of de gast al eens een
	/// mailtje heeft gestuurd. 
	// geeft false voor ja, true voor nee
	/// Voor php versie < 4 of register_globals off,
	/// uncomment de global regel
	///////////////////////////////////////////////
	/// boolean checkcookie( void );

	//global $HTTP_COOKIE_VARS;
	if ($_COOKIE['sendmail'] == "yeah") {
		return false;
	}
	return true;
}


function vervang_maand($datum) {
	//////////////////////////////////////////////////
	/// Deze functie gaat ervan uit dat $datum het
	/// volgende datum formaat gebruikt: 
	/// d-m-Y xxxxxxx
	/// d/m/Y xxxxxxx
	/// d.m.y xxxxxxx
	/// Je zou natuurlijk strftime() kunnen gebruiken
	/// maar omdat we dan gebruik gaan maken van de 
	/// ingebakken taalpakketten van php en het kan 
	/// wel eens gebeuren dat men alleen engels 
	/// in die versie heeft gestopt en dus nederlands
	/// niet ondersteund wordt.
	////////////////////////////////////////////////
	/// string vervang_maand(string date);
	global $SETTINGS;
	list($dag, $maand, $rest) = split('[/.-]', $datum);
	foreach ($SETTINGS['maanden'] as $nummer => $naam) {
		$maand = str_replace ($nummer, $naam, $maand);
	}
	$temp_array = array( $dag, $maand, $rest);
	$datum = implode(" ", $temp_array);
	return $datum;
}

function validate_email($input) {
	///////////////////////////////////////
	/// Kijkt of $input een geldig 
	/// email adres bevat
	/////////////////////////////////////
	/// boolean validate_email( string email );

	if (!stristr($input, '@') || !stristr($input, '.')) {
		return false;
	}
	return true;
}

function checkstring($input, $minstrlen = 3, $maxstrlen = 10000, $maxwordlen = 300) {
	////////////////////////////////
	/// Check $input string
	/// Geeft false als het niet goed is
	/// geeft true als de string $input
	/// oke is
	/////////////////////////////
	/// boolean checkstring(string input, [int minimaal tekens, [int maximaal tekens, [int maximaal woord lengte]]]);

	if (empty($input)) {
		return false;
	} elseif (strlen($input) < $minstrlen) {
		return false;
	} elseif (strlen($input) > $maxstrlen) {
		return false;
	} else {
		$temp_array = explode(" ", $input);
		foreach ($temp_array as $woord) {
			if (strlen($woord) > $maxwordlen) {
			return false;
			}
		} 
	return true;
	}
}

function get_date($timezone = 1, $adjustment = 0) {
	////////////////////////////////////////////////
	/// Verkrijg de datum en tijd van een tijdzone
	/////////////////////////////////////
	/// string get_date( [int timezone, [int adjustment]] );
	global $SETTINGS;
	$adjustment = $adjustment / 60;
	$date = gmdate($SETTINGS['datum_formaat'], time() + 3600*($adjustment + $timezone + date("I")));
	
	return $date;
}

function show_form($naam = '', $email = '', $titel = '', $bericht = '', $error = false) {
	///////////////////////////////////////////////
	/// Laat formulier zien. Error als opgegeven
	/// voeg $HTTP_SERVER_VARS toe aan het global
	/// stukje als je geen superglobals kan of
	/// wil gebruiken
	////////////////////////////////////////////////
	/// void show_form( [string naam, [string email, [string titel, [string bericht, [string error]]]]] );
	global $SETTINGS;
	if ($error == false) {
		$header = $SETTINGS['bericht_top'];
	} else {
		$header = '<span style="color:#FF0000;font-weight:bold;">'.$error.'</span>';
	}
	print '<form name="contact" action="'.$_SERVER['PHP_SELF'].'" method="post">';
	print '<input type="hidden" name="ip" value="'.$_SERVER['REMOTE_ADDR'].'" />';
	print '<table>'; //hier kun je eventueel nog style info aan toevoegen
	print '<tr><td colspan="2" align="center">'.$header.'</td></tr>';
	print '<tr><td align="left" valign="top">Je naam:</td><td align="left"><input type="text" name="naam" value="'.htmlentities($naam).'" size="75" maxlength="'.$SETTINGS['naam_max'].'" /></td></tr>';
	print '<tr><td align="left" valign="top">Je email:</td><td align="left"><input type="text" name="email" value="'.htmlentities($email).'" size="75" maxlength="'.$SETTINGS['email_max'].'" /></td></tr>';
	print '<tr><td align="left" valign="top">Titel:</td><td align="left"><input type="text" name="titel" value="'.htmlentities($titel).'" size="75" maxlength="'.$SETTINGS['titel_max'].'" /></td></tr>';
	print '<tr><td align="left" valign="top">Je bericht:</td><td align="left"><textarea name="bericht" cols="75" rows="7" wrap="soft">'.htmlentities($bericht).'</textarea></td>';
	print '<tr><td align="center" colspan="2"><input type="submit" name="submit" value="Verzend email" /></td></tr>';
	print '</table></form>';
}

function sendmail($naam, $email, $titel, $bericht, $ip, $datum) {
	//////////////////////////////////////////////
	/// Stuurt emaitje. Gebruikt de $SETTINGS var
	/// en geeft false als het niet lukt
	/////////////////////////////////////////////
	/// boolean sendmail( string naam, string email, string titel, string bericht, string ip);
	global $SETTINGS;
	$to = implode(", ", $SETTINGS['emails']);

	$subject = "Mailtje van je website - ".$naam.": ".$titel;
	if ($SETTINGS['mime'] == "text/html") {
		$headers  = "MIME-Version: 1.0\r\n";
		$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";

		$message  = "<html><head>";
		$message .= "</head><body>";
		$message .= "Je hebt een emailtje gekregen van een gast van de website!<br /><br />";
		$message .= "<table>";
		$message .= "<tr><td>Naam:</td><td>".htmlentities($naam)."</td></tr>";
		$message .= "<tr><td>Email:</td><td><a href=\"mailto:".htmlentities($email)."\">".htmlentities($email)."</a></td></tr>";
		$message .= "<tr><td>Titel:</td><td>".htmlentities($titel)."</td></tr>";
		$message .= "<tr><td>Bericht:</td><td>".htmlentities($bericht)."</td></tr>";
		$message .= "<tr><td colspan=\"2\">&nbsp;</td></tr>";
		$message .= "<tr><td>Datum:</td><td>".vervang_maand($datum)."</td></tr>";
		$message .= "<tr><td>Ip:</td><td><a href=\"http://sunny.nic.com/cgi-bin/whois\">".$ip."</a></td></tr>";
		$message .= "</table></body></html>";


	} else {
		$headers  = "MIME-Version: 1.0\r\n";
		$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";

		$message  = "==============================================\n";
		$message .= "Emailtje van een gast van je website!\n";
		$message .= "==============================================\n";
		$message .= "\n";
		$message .= "Naam:\n";
		$message .= $naam."\n\n";
		$message .= "Email:\n";
		$message .= $email."\n\n";
		$message .= "Titel:\n";
		$message .= $titel."\n\n";
		$message .= "Bericht:\n";
		$message .= $bericht."\n\n";
		$message .= "\n";
		$message .= "Datum:\n";
		$message .= vervang_maand($datum)."\n\n";
		$message .= "Ip adres:\n";
		$message .= $ip."\n\n";

	}
	$headers .= "From: Php automailer <noreply@stfu.com>\r\n";

	if (!mail($to, $subject, $message, $headers)) {
		return false;
	}
	return true;
}

///////////////////////////
/// En nu het script.....
///////////////////////////

if (checkcookie()) {
if (!$_POST['submit']) {
	show_form();
} else {
	if (!checkstring($_POST['naam'], $SETTINGS['naam_min'], $SETTINGS['naam_max'])) {
		show_form($_POST['naam'], $_POST['email'], $_POST['titel'], $_POST['bericht'], 'Geen naam ingevoerd of je naam is te kort of te lang.');
	} elseif (!checkstring($_POST['email'], $SETTINGS['email_min'], $SETTINGS['email_max'])) {
		show_form($_POST['naam'], $_POST['email'], $_POST['titel'], $_POST['bericht'], 'Geen email ingevoerd of je email is te kort of te lang.');
	} elseif (!validate_email($_POST['email']) && $SETTINGS['email_check'] == true) {
		show_form($_POST['naam'], $_POST['email'], $_POST['titel'], $_POST['bericht'], 'Ongeldig email adres ingevoerd.');
	} elseif (!checkstring($_POST['titel'], $SETTINGS['titel_min'], $SETTINGS['titel_max'])) {
		show_form($_POST['naam'], $_POST['email'], $_POST['titel'], $_POST['bericht'], 'Geen titel ingevoerd of je titel is te kort of te lang.');
	} elseif (!checkstring($_POST['bericht'], $SETTINGS['bericht_min'], $SETTINGS['bericht_max'])) {
		show_form($_POST['naam'], $_POST['email'], $_POST['titel'], $_POST['bericht'], 'Geen bericht ingevoerd of je bericht is te kort of te lang.');
	} else {
		$datum = get_date($SETTINGS['timezone'], $SETTINGS['adjustment']);
		if (!sendmail($_POST['naam'], $_POST['email'], $_POST['titel'], $_POST['bericht'], $_POST['ip'], $datum)) {
			print $SETTINGS['no_email'];
		} else {
			print $SETTINGS['bericht_suc'];
			setcookie('sendmail', "yeah", $SETTINGS['expire_cookie']);
		}
	}
}
} else {
	print $SETTINGS['error_spam'];
}

//laten we nu maar alles outputten, het is genoeg
//geweest voor deze keer en er komen toch 
//geen headers meer ^^
ob_end_flush();
?>