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

/*
* @Description: This recipe extends forms capability on PmWiki, including:
* data storage and retrieval through page variables, & 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 saving data to another page
$HandleActions['data'] = 'SaveData';

# Function called by action to save data
function SaveData() {
  global $WorkDir, $pagename;
  $datapage = "Data-$pagename";
  $nextpage = $pagename;
  $myHeaders = "version=pmwiki-2.1.11 ordered=1 urlencoded=1
text=(:comment data:) %0a%0a";
  $data = '';
  foreach ($_POST as $field => $value) {
	switch ($field)	{
		case "nextpage" :
		   $nextpage=FmtPageName($value, $pagename);
		   break;
		case "datapage" :
		   $datapage=FmtPageName($value, $pagename);
		   break;
		case "action" :
		   break;
		case "profile" :
			$data .= "$field=[[~$value]] %0a%0a";
			break;
		case "formlink" :
			$data .= "$field=[[$pagename]] %0a%0a";
			break;
		default:
		   $data .= "$field=$value %0a%0a";
		}
	}
  if ($data == '') {
  	Redirect(FmtPageName($nextpage, $pagename));
	}

  if ($ds = fopen("$WorkDir/$datapage", "wb")){
    fwrite($ds,"$myHeaders");
    fwrite($ds,"$data");
	fwrite($ds,"(:comment data:) %0a%0a");
    fclose($ds); 
    PageIndexUpdate("$datapage");
	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;
  $datapage = substr($l, 1);
  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]);
//		return "$dv[0] + $dv[1]";  // used for debudding
		$FmtPV["$$dv[0]"] = "$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 (.*?):\\)/', '<option value=$1>');
Markup('selectend', 'inline', '/\(:selectend:\\)/', '</select>');