<?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" :
		   if (substr($value, 0, 4) == "Data") {
		   	  $datapage=FmtPageName($value, $pagename);
		      break;
		      }
		   else {
		      Redirect(FmtPageName($nextpage, $pagename)); 
			  }
		case "action" :
		   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]);
		$FmtPV["$$dv[0]"] = stripslashes("$dv[1]");
//		return $FmtPV["$$dv[0]"];  // used for debudding
		$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>');