<?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
// naam_van_persoon => email adres
$SETTINGS['emails'] = array('Ik'        => 'ik@jij.nl', 
							'Hij'       => 'Hij@zij.com',
							'Bin laden' => 'b.laden@alquada.ak',
							'Bush'		=> 'bush@whitehouse.gov',
							);

//standaard persoon die aangekruist staat (email adres)
$SETTINGS['stdmail'] = 'Ik';

//onderwerpen gebruiken?
//true / false
$SETTINGS['do_onderwerpen'] = true;

//welke onderwerpen?
// id => onderwerp
$SETTINGS['onderwerpen'] = array(1  => 'Suggesie',
								 2  => 'Klacht',
								 3  => 'Ideëen',
								 4  => 'Vraag',
								 );

//wat is het standaard onderwerp
// $SETTINGS['onderwerpen'][ id_van onderwerp ]
$SETTINGS['stdsub'] = $SETTINGS['onderwerpen'][4];

// 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;<span style="font-weight:bold;">Test formulier script</span>&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 parse_incoming() {
	////////////////////////////////////////////////
	/// Deze functie geeft al het 'incoming' via
	/// _POST en _GET terug. _POST heeft voorrang,
	/// dus als een key in _GET al bestaat, wordt
	/// de key overgeschreven
	////////////////////////////////////////////////
	/// array parse_incoming( void );

	$return = array();

	
	//eerst get,
	foreach ($_GET as $k => $v) {
		if (!is_array($v)) {
			$return[ $k ] = clean_value($v);
		}
	}
	
	//en dan post!
	foreach ($_POST as $k => $v) {
		if (!is_array($v)) {
			$return[ $k ] = clean_value($v);
		}
	}
	return $return;

}

function clean_value($val) {
    	global $site;
    	
    	if ($val == "")
    	{
    		return "";
    	}
    	
    	$val = str_replace( "&#032;", " ", $val );

    	$val = str_replace( chr(0xCA), "", $val );
    	
    	$val = str_replace( "&"            , "&amp;"         , $val );
    	$val = str_replace( "<!--"         , "&#60;&#33;--"  , $val );
    	$val = str_replace( "-->"          , "--&#62;"       , $val );
    	$val = preg_replace( "/<script/i"  , "&#60;script"   , $val );
    	$val = str_replace( ">"            , "&gt;"          , $val );
    	$val = str_replace( "<"            , "&lt;"          , $val );
    	$val = str_replace( "\""           , "&quot;"        , $val );
    	$val = preg_replace( "/\n/"        , "<br>"          , $val ); 
    	$val = preg_replace( "/\\\$/"      , "&#036;"        , $val );
    	$val = preg_replace( "/\r/"        , ""              , $val ); 
    	$val = str_replace( "!"            , "&#33;"         , $val );
    	$val = str_replace( "'"            , "&#39;"         , $val ); 

		$val = preg_replace("/&amp;#([0-9]+);/s", "&#\\1;", $val );
		
    	$val = stripslashes($val);
    	
    	$val = preg_replace( "/\\\(?!&amp;#|\?#)/", "&#092;", $val ); 
    	
    	return $val;
}

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
    ///////////////////////////////////////////////
    /// boolean checkcookie( void );

    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 H:i:xxxx
    /// d/m/Y H:i:xxxx
    /// d.m.y H:i:xxx
    /// 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 (!preg_match("/^[A-Za-z0-9._\-]+\@[A-Za-z0-9._\-]+\.[A-Za-z]{2,4}$/",$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;
    } 
	if (strlen($input) < $minstrlen) {
        return false;
    } 
	if (strlen($input) > $maxstrlen) {
        return false;
    }

    $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, $to = false, $onderwerp = false) {
    ///////////////////////////////////////////////
    /// Laat formulier zien. Error als opgegeven
    ////////////////////////////////////////////////
    /// 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>';
    }

	if ($to == false) {
		$to = $SETTINGS['stdmail'];
	}
	if ($onderwerp == false) {
		$onderwerp = $SETTINGS['stdsub'];
	}
	$t = $_SERVER['PHP_SELF'];
	$s = explode("/", $_SERVER['PHP_SELF']);
	$this_file = $s[ count($s) - 1 ];
    echo '<form name="contact" action="'.$this_file.'" method="post">';
    echo '<input type="hidden" name="ip" value="'.$_SERVER['REMOTE_ADDR'].'" />';
	echo '<input type="hidden" name="act" value="dosend" />';

    echo '<table>'; //hier kun je eventueel nog style info aan toevoegen

    echo '<tr><td colspan="2" align="center">'.$header.'</td></tr>';
    echo '<tr><td align="left" valign="top">Je naam:</td><td align="left"><input type="text" name="naam" value="'.$naam.'" size="75" maxlength="'.$SETTINGS['naam_max'].'" /></td></tr>';
    echo '<tr><td align="left" valign="top">Je email:</td><td align="left"><input type="text" name="email" value="'.$email.'" size="75" maxlength="'.$SETTINGS['email_max'].'" /></td></tr>';
	echo '<tr><td align="left" valign="top">Ontvanger:</td><td align="left">';
	foreach ($SETTINGS['emails'] as $name => $adres) {
		$name = htmlentities($name);
		echo '<input type="radio" name="to" value="'.str_replace('_', ' ', $name).'" id="'.str_replace('_', ' ', $name).'" ';
		if (strtolower($to) == strtolower($name)) {
			echo 'checked="checked" ';
		}
		echo '/><label for="'.str_replace('_', ' ', $name).'">'.$name.'</label><br />';
	}
	print '</td></tr>';
	if ($SETTINGS['do_onderwerpen'] == true) {
		print '<tr><td align="left" valign="top">Onderwerp:</td>';
		print '<td align="left"><select name="onderwerp">';
		foreach ($SETTINGS['onderwerpen'] as $id => $sub) {
			print '<option value="'.$id.'" ';
			if ($sub == $onderwerp) {
				print 'selected="selected"';
			}
			print '>'.htmlentities($sub).'</option>';
		}
		print '</select></td></tr>';
	}

    echo '<tr><td align="left" valign="top">Titel:</td><td align="left"><input type="text" name="titel" value="'.$titel.'" size="75" maxlength="'.$SETTINGS['titel_max'].'" /></td></tr>';
    echo '<tr><td align="left" valign="top">Je bericht:</td><td align="left"><textarea name="bericht" cols="75" rows="7" wrap="soft">'.$bericht.'</textarea></td>';
    echo '<tr><td align="center" colspan="2"><input type="submit" name="submit" value="Verzend email" /></td></tr>';
    echo '</table></form>';
}

function sendmail($naam, $email, $titel, $bericht, $ip, $datum, $to, $onderwerp) {
    //////////////////////////////////////////////
    /// 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  = $SETTINGS['emails'][ str_replace(' ', '_', $to) ];
	$sub = $SETTINGS['onderwerpen'][ $onderwerp ];

    $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>".$naam."</td></tr>";
        $message .= "<tr><td>Email:</td><td><a href=\"mailto:".$email."\">".$email."</a></td></tr>";
		$message .= "<tr><td>Onderwerp:</td><td>".htmlentities($sub)."</td></tr>";
        $message .= "<tr><td>Titel:</td><td>".$titel."</td></tr>";
        $message .= "<tr><td>Bericht:</td><td>".$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 .= "Onderwerp:\n";
		$message .= $sub."\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 <{$email}>\r\n";

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

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


$IN = parse_incoming();

if (checkcookie()) {
	if ($IN['act'] != 'dosend') {
		show_form();
	} else {
		$err = false;
		if (!checkstring($IN['naam'], $SETTINGS['naam_min'], $SETTINGS['naam_max'])) {
			$err = 'Geen naam ingevoerd of je naam is te kort of te lang.';
		} elseif (!checkstring($IN['email'], $SETTINGS['email_min'], $SETTINGS['email_max'])) {
			$err = 'Geen email ingevoerd of je email is te kort of te lang.';
		} elseif (!validate_email($IN['email']) && $SETTINGS['email_check'] == true) {
			$err = 'Ongeldig email adres ingevoerd.';
		} elseif (!checkstring($IN['titel'], $SETTINGS['titel_min'], $SETTINGS['titel_max'])) {
			$err = 'Geen titel ingevoerd of je titel is te kort of te lang.';
		} elseif (!checkstring($IN['bericht'], $SETTINGS['bericht_min'], $SETTINGS['bericht_max'])) {
			$err = 'Geen bericht ingevoerd of je bericht is te kort of te lang.';
		} 
		if ($err == false) {
			$datum = get_date($SETTINGS['timezone'], $SETTINGS['adjustment']);
			if (!sendmail($IN['naam'], $IN['email'], $IN['titel'], $IN['bericht'], $IN['ip'], $datum, $IN['to'], $IN['onderwerp'])) {
				echo $SETTINGS['no_email'];
			} else {
				echo $SETTINGS['bericht_suc'];
				setcookie('sendmail', "yeah", $SETTINGS['expire_cookie']);
			}
		} else {
			show_form($IN['naam'], $IN['email'], $IN['titel'], $IN['bericht'], $err, $IN['to'], $IN['onderwerp']);
		}
	}
} else {
    echo $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();
?>