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

/*
* @Description: This recipe extends forms capability on PmWiki, including:
* extremely flexible data storage, retrieval, and email processing.
* Also allows for an alternate way to register and authenticate members.
* And includes an enumerator, pulldown menus, etc.!  For info, see docs at
* http://www.pmwiki.org/wiki/Cookbook/FASTData.  Hope you enjoy it!
* @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";
	$pagecreated = "false";
	$count = "1000";  

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

			case "DataPage" :
				if (substr($value, -2, 2) == ".#") {
					$g = substr($value, 0, strlen($value)-2);
					foreach(ListPages("/^$g\\.\\d/") as $n) {
						$n = substr($n,strlen($g)+1);
						$count = max($count,$n+1);
						}
					$value = $g . "." . $count;
					}
				$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" :
				if (substr($datapage, 0, 4) != "Data") {
		   	   		break;
			    	}
				$data = '';
				$d = explode(",", $value);
				foreach ($d as $f => $v) {
					if (substr($v,0,1) == '-' ) {
						$v = substr($v,1);
						if ($_POST[$v] != "") $data .= "$_POST[$v] %0a%0a"; 
						}
					else {
						$data .= "$v=\"$_POST[$v]\" %0a%0a"; 
						}
					}
				if ((PageExists("$datapage")) or ($pagecreated == "true")) {
					$dr = fopen("$WorkDir/$datapage", "rb");
					$pc = fread($dr, filesize("$WorkDir/$datapage"));
					fclose($dr);
					$dc = explode("(:comment data:) %0a%0a", $pc);
					}
				else {
					$dc[1] = "";
					$dc[2] = "[[#Data]] %0a%0a";					
					$pagecreated = "true";
					}
				$dc[0] ="version=pmwiki-2.1.11 ordered=1 urlencoded=1
text=";
				$dc[1] = $data;
				$pc = "$dc[0](:comment data:) %0a%0a$dc[1](:comment data:) %0a%0a$dc[2](:comment data:) %0a%0a";
				if ($ds = fopen("$WorkDir/$datapage", "wb")){
					fwrite($ds,"$pc");
					fclose($ds); 
					PageIndexUpdate("$datapage");
					}
				break;

			case "AppendData" :
				if (substr($datapage, 0, 4) != "Data") {
		   	   		break;
			    	}
				$data = '';
				$d = explode(",", $value);
				foreach ($d as $f => $v) {
					if (substr($v,0,1) == '-' ) {
						$v = substr($v,1);
						$data .= "$_POST[$v] %0a%0a"; 
						}
					else {
						$data .= "$v=\"$_POST[$v]\" %0a%0a"; 
						}
					}
				if ((PageExists("$datapage")) or ($pagecreated == "true")) {
					$dr = fopen("$WorkDir/$datapage", "rb");
					$pc = fread($dr, filesize("$WorkDir/$datapage"));
					fclose($dr);
					$dc = explode("(:comment data:) %0a%0a", $pc);
					}
				else {
					$dc[1] = "";
					$dc[2] = "[[#Data]] %0a%0a";					
					$pagecreated = "true";
					}
				$dc[0] ="version=pmwiki-2.1.11 ordered=1 urlencoded=1
text=";
				$dc[2] .= $data;
				$pc = "$dc[0](:comment data:) %0a%0a$dc[1](:comment data:) %0a%0a$dc[2](:comment data:) %0a%0a";
				if ($ds = fopen("$WorkDir/$datapage", "wb")){
					fwrite($ds,"$pc");
					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) {
					if (substr($v,0,1) == '-' ) {
						$v = substr($v,1);
						$data .= "$_POST[$v] 

"; 
						}
					else {
						$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, -2, 2) == ".*") {
		$name = explode(".", $pagename);
		$datapage = substr($datapage,0,strlen($datapage)-1) . $name[1];
		}
	if (substr($datapage, 0, 4) != "Data") {
		return "invalid data parameter";
		}
	if (PageExists("$datapage")) {
		$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>');