<?php if (!defined('PmWiki')) exit();

/*
* @Description: This recipe extends forms capability on PmWiki, including:
* data storage, data retrieval through page variables, email processing
* an alternate way to register and authenticate members & pulldown menus
* @author: Dan Vis aka Caveman <editor àt fast döt st>  
* @license http://www.gnu.org/licenses/gpl.html GNU General Public License
*/



# Action for activating this recipe
$HandleActions['data'] = 'Data';

# Function called by action = data
function Data() {
	global $WorkDir, $pagename, $MessagesFmt;
	$nextpage = $pagename;
	$datapage = "Data-$pagename";  
	$datamembers = "Data-Member";  

	foreach ($_POST as $field => $value) {
		switch ($field)	{
			case "NextPage" :
		    	$nextpage=FmtPageName($value, $pagename);
				break;

			case "DataPage" :
				if (substr($value, 0, 4) == "Data") {
		   	   		$datapage=FmtPageName($value, $pagename);
			    	}
				break;
		   
			case "Check" :  
				if ($value=="") {
					$MessagesFmt[] = "<h5 class='wikimessage'>$[No member name entered. Please try again:]</h5>";
					HandleBrowse($pagename);
					return;
			   		}
				if($value!=PageVar(MakePageName($pagename, $value), '$Name')) {
					$MessagesFmt[] = "<h5 class='wikimessage'>$[Invalid member name. Please try again:]</h5>";
					HandleBrowse($pagename);
					return;
					}
				if (PageExists("$datamembers.$value")) {
					$MessagesFmt[] = "<h5 class='wikimessage'>$[Member name already taken.  Please try again:]</h5>";
					HandleBrowse($pagename);
					return;
					}
				$nextpage=FmtPageName("$nextpage?myname=$value", $pagename);
				break;

			case "Login" :
				if (($value == "auto") and (! PageExists("$datamembers.$_POST[Member]"))) {
					AuthUserId($pagename, $_POST['Member']);					
					break;
					}
				if ($dr = fopen("$WorkDir/$datamembers.$_POST[Member]", "rb")){
					$pc = fread($dr, filesize("$WorkDir/$datamembers.$_POST[Member]"));
					fclose($dr);
					$dc = explode("(:comment data:) %0a%0a", $pc);
					$db = explode(" %0a%0a", $dc[1]);
					$dv = explode ("=", $db[1]);
					$pass1 = substr(urlencode(stripslashes($dv[1])),3,-3);
					$pass2 = $_POST['Password'];
					if ($pass1 == $pass2) {			   
						AuthUserId($pagename, $_POST['Member']);
						break;
						}
					$MessagesFmt[] = "<h5 class='wikimessage'>$[Incorrect member name or password:]</h5>";
					HandleBrowse($pagename);
					return;
					}
				break;
			   
			case "SaveData" :
				$data = '';
				$d = explode(",", $value);
				foreach ($d as $f => $v) {
					$data .= "$v=\"$_POST[$v]\" %0a%0a"; 
					}
				$data = "version=pmwiki-2.1.11 ordered=1 urlencoded=1
text=(:comment data:) %0a%0a" . $data . "(:comment data:) %0a%0a
";
				if ($ds = fopen("$WorkDir/$datapage", "wb")){
					fwrite($ds,"$data");
					fclose($ds); 
					PageIndexUpdate("$datapage");
					}
				break;

			case "EmailData" :
				$data = '';
				if ($_POST[EmailTo] == "") {
					$MessagesFmt[] = "<h5 class='wikimessage'>$[To email address required.  Mail not sent.]</h5>";
					HandleBrowse($pagename);
					return;
					}
				if ($_POST[EmailFrom] == "") {
					$MessagesFmt[] = "<h5 class='wikimessage'>$[From email address required.  Mail not sent.]</h5>";
					HandleBrowse($pagename);
					return;
					}
				if ($_POST[Subject] == "") {
					$MessagesFmt[] = "<h5 class='wikimessage'>$[Subject required.  Mail not sent:]</h5>";
					HandleBrowse($pagename);
					return;
					}
				$d = explode(",", $value);
				foreach ($d as $f => $v) {
					$data .= "$_POST[$v]

";
					} 
				if ($data == "") {
					$MessagesFmt[] = "<h5 class='wikimessage'>$[The message has no content.  Mail not sent:]</h3>";
					HandleBrowse($pagename);
					return;
					}
				mail($_POST[EmailTo], $_POST[Subject], $data, "From: $_POST[EmailFrom]");
				break;
			}
		}
  	Redirect(FmtPageName($nextpage, $pagename));
}



# Directive to retrieve data from another page
Markup('fastdata', '<{$var}', '/\(:data(.*?):\)/ei', "ReadData('$1')");

# Function called by directive to retrieve form data
function ReadData($l) {
	global $WorkDir, $FmtPV, $pagename;
    $datapage = substr($l, 1);
	if (substr($datapage, -1, 1) == "*") {
		$name = explode(".", $pagename);
		$datapage = substr($datapage,0,strlen($datapage)-1) . $name[1];
		}
	if (substr($datapage, 0, 4) != "Data") {
		return "invalid data parameter";
		}
	clearstatcache();
	if ($dr = fopen("$WorkDir/$datapage", "rb")){
		$pc = fread($dr, filesize("$WorkDir/$datapage"));
		fclose($dr);
		$dc = explode("(:comment data:) %0a%0a", $pc);
		$db = explode(" %0a%0a", $dc[1]);
		$i = 0;
		while ($i < count($db)-1) {
			$dv = explode ("=", $db[$i]);
			$FmtPV["$$dv[0]"] = stripslashes("$dv[1]");
			$i = $i + 1;
			}
		return;
		}
	return "data not found";
}



# Markups for pull down menu's
Markup('select', 'inline', '/\(:select (.*?):\\)/', '<select name=$1>');
Markup('option', 'inline',
     '/\\(:option (.*?):\\)/e',
     "Keep(PSS(\"<option value='$1'>\"))");
Markup('selectend', 'inline', '/\(:selectend:\\)/', '</select>');