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

/*
	AuxSelect recipe
	Copyright 2007 Marc Cooper
	gmane@auxbuss.com
    http://www.auxbuss.com/

	This is a PmWiki recipe. It allows the creation of a dropdown select 
	widget, the value of which persists - usually from web-page to 
	web-page - due to the dropdown's selected item being stored in a 
	session variable. A common example is a widget that allows the 
	site visitor to select their preferred currency.

	This recipe is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.
*/

define(AUXSELECT_VERSION, '20070127');

function AuxSelect($name, $arrayname, $opt) {
	global $AuxSelectData;
	$defaults = array(
		'default'		=> '',
		'id'			=> 'auxselect',
		'text'			=> '',
		'submittext'	=> 'set'
	); 
	$opt = array_merge($defaults, ParseArgs($opt));
	extract($opt);

	if (! isset($AuxSelectData[$arrayname])) return 'Array does not exist';
	$values = $AuxSelectData[$arrayname];

	@session_start();	
	if (!isset($_SESSION[$name])) $_SESSION[$name]=$default;
	else $default = $_SESSION[$name];

	$out  = "(:input form '' post id=$id:)$text";
	$out .= "(:input default name=$name value='$default':)";
	foreach ($values as $v)
		$out .= "(:input select name=$name value='$v':)";
	$out .= "(:input hidden action AuxSelectChange:)";
	$out .= "(:input hidden name $name:)";
	$out .= "(:input submit value='$submittext':)";
	$out .= "(:input end:)";
	return $out;
}
Markup('auxSelect', '<directives',
	'/\\(:auxSelect\\s+([\\w]+)\\s?(\\w+)*\\s*(.*?)\\s*:\)/ei',
	"AuxSelect(PSS('$1'),PSS('$2'),PSS('$3'))");

$HandleActions['AuxSelectChange'] = 'HandleAuxSelectChange';
function HandleAuxSelectChange($pagename) {
	global $HandleActions;
	$fn = $HandleActions['browse'];
	$name = $_POST['name'];
	@session_start();
	$_SESSION[$name]=$_POST[$name];
	return $fn($pagename);
}
function AuxSelectData($arrayname, $opt) {
	global $AuxSelectData;
	if (isset($AuxSelectData[$arrayname])) return 'Cannot overwrite existing array';
	$opt = ParseArgs($opt);
	foreach ($opt[''] as $v) $AuxSelectData[$arrayname][] = $v;
	return;
}
Markup('auxSelectData', 'inline',
	'/\\(:auxSelectData\\s+([\\w]+)\\s*(.*?)\\s*:\)/ei',
	"AuxSelectData(PSS('$1'),PSS('$2'))");