<?php

	/**
	 * List triggers on a table
	 *
	 * $Id: triggers.php,v 1.37 2007/09/19 14:42:12 ioguix Exp $
	 */

	// Include application functions
	include_once('./libraries/lib.inc.php');
	include_once('./classes/class.select.php');
	
	$action = (isset($_REQUEST['action'])) ? $_REQUEST['action'] : '';

	/** 
	 * Function to save after altering a trigger
	 */
	function doSaveAlter() {
		global $data, $lang;
		
		$status = $data->alterTrigger($_POST['table'], $_POST['trigger'], $_POST['name']);
		if ($status == 0)
			doDefault($lang['strtriggeraltered']);
		else
			doAlter($lang['strtriggeralteredbad']);
	}

	/**
	 * Function to allow altering of a trigger
	 */
	function doAlter($msg = '') {
		global $data, $misc;
		global $lang;
		
		$misc->printTrail('trigger');
		$misc->printTitle($lang['stralter'],'pg.trigger.alter');
		$misc->printMsg($msg);
		
		$triggerdata = $data->getTrigger($_REQUEST['table'], $_REQUEST['trigger']);
		
		if ($triggerdata->recordCount() > 0) {
			
			if (!isset($_POST['name'])) $_POST['name'] = $triggerdata->fields['tgname'];
			
			echo "<form action=\"triggers.php\" method=\"post\">\n";
			echo "<table>\n";
			echo "<tr><th class=\"data\">{$lang['strname']}</th>\n";
			echo "<td class=\"data1\">";
			echo "<input name=\"name\" size=\"32\" maxlength=\"{$data->_maxNameLen}\" value=\"", 
				htmlspecialchars($_POST['name']), "\" />\n";
			echo "</table>\n";
			echo "<p><input type=\"hidden\" name=\"action\" value=\"alter\" />\n";
			echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
			echo "<input type=\"hidden\" name=\"trigger\" value=\"", htmlspecialchars($_REQUEST['trigger']), "\" />\n";
			echo $misc->form;
			echo "<input type=\"submit\" name=\"alter\" value=\"{$lang['strok']}\" />\n";
			echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" /></p>\n";
			echo "</form>\n";
		}
		else echo "<p>{$lang['strnodata']}</p>\n";
	}
	
	/**
	 * Show confirmation of drop and perform actual drop
	 */
	function doDrop($confirm) {
		global $data, $misc;
		global $lang;

		if ($confirm) {
			$misc->printTrail('trigger');
			$misc->printTitle($lang['strdrop'],'pg.trigger.drop');

			echo "<p>", sprintf($lang['strconfdroptrigger'], $misc->printVal($_REQUEST['trigger']),
				$misc->printVal($_REQUEST['table'])), "</p>\n";

			echo "<form action=\"triggers.php\" method=\"post\">\n";
			echo "<input type=\"hidden\" name=\"action\" value=\"drop\" />\n";
			echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
			echo "<input type=\"hidden\" name=\"trigger\" value=\"", htmlspecialchars($_REQUEST['trigger']), "\" />\n";
			echo $misc->form;
			echo "<p><input type=\"checkbox\" id=\"cascade\" name=\"cascade\" /> <label for=\"cascade\">{$lang['strcascade']}</label></p>\n";
			echo "<input type=\"submit\" name=\"yes\" value=\"{$lang['stryes']}\" />\n";
			echo "<input type=\"submit\" name=\"no\" value=\"{$lang['strno']}\" />\n";
			echo "</form>\n";
		}
		else {
			$status = $data->dropTrigger($_POST['trigger'], $_POST['table'], isset($_POST['cascade']));
			if ($status == 0)
				doDefault($lang['strtriggerdropped']);
			else
				doDefault($lang['strtriggerdroppedbad']);
		}

	}

	/**
	 * Show confirmation of enable trigger and perform enabling the trigger
	 */
	function doEnable($confirm) {
		global $data, $misc;
		global $lang;

		if ($confirm) {
			$misc->printTrail('trigger');
			$misc->printTitle($lang['strenable'],'pg.table.alter');

			echo "<p>", sprintf($lang['strconfenabletrigger'], $misc->printVal($_REQUEST['trigger']),
				$misc->printVal($_REQUEST['table'])), "</p>\n";

			echo "<form action=\"triggers.php\" method=\"post\">\n";
			echo "<input type=\"hidden\" name=\"action\" value=\"enable\" />\n";
			echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
			echo "<input type=\"hidden\" name=\"trigger\" value=\"", htmlspecialchars($_REQUEST['trigger']), "\" />\n";
			echo $misc->form;
			echo "<input type=\"submit\" name=\"yes\" value=\"{$lang['stryes']}\" />\n";
			echo "<input type=\"submit\" name=\"no\" value=\"{$lang['strno']}\" />\n";
			echo "</form>\n";
		}
		else {
			$status = $data->enableTrigger($_POST['trigger'], $_POST['table']);
			if ($status == 0)
				doDefault($lang['strtriggerenabled']);
			else
				doDefault($lang['strtriggerenabledbad']);
		}

	}

	/**
	 * Show confirmation of disable trigger and perform disabling the trigger
	 */
	function doDisable($confirm) {
		global $data, $misc;
		global $lang;

		if ($confirm) {
			$misc->printTrail('trigger');
			$misc->printTitle($lang['strdisable'],'pg.table.alter');

			echo "<p>", sprintf($lang['strconfdisabletrigger'], $misc->printVal($_REQUEST['trigger']),
				$misc->printVal($_REQUEST['table'])), "</p>\n";

			echo "<form action=\"triggers.php\" method=\"post\">\n";
			echo "<input type=\"hidden\" name=\"action\" value=\"disable\" />\n";
			echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
			echo "<input type=\"hidden\" name=\"trigger\" value=\"", htmlspecialchars($_REQUEST['trigger']), "\" />\n";
			echo $misc->form;
			echo "<input type=\"submit\" name=\"yes\" value=\"{$lang['stryes']}\" />\n";
			echo "<input type=\"submit\" name=\"no\" value=\"{$lang['strno']}\" />\n";
			echo "</form>\n";
		}
		else {
			$status = $data->disableTrigger($_POST['trigger'], $_POST['table']);
			if ($status == 0)
				doDefault($lang['strtriggerdisabled']);
			else
				doDefault($lang['strtriggerdisabledbad']);
		}

	}

	/**
	 * Let them create s.th.
	 */
	function doCreate($msg = '') {
		global $data, $misc;
		global $lang;
		
		$misc->printTrail('table');
		$misc->printTitle($lang['strcreatetrigger'],'pg.trigger.create');
		$misc->printMsg($msg);
		
		// Get all the functions that can be used in triggers
		$funcs = $data->getTriggerFunctions();
		if ($funcs->recordCount() == 0) {
			doDefault($lang['strnofunctions']);
			return;
		}

		/* Populate functions */
		$sel0 = new XHTML_Select('formFunction');
		while (!$funcs->EOF) {
			$sel0->add(new XHTML_Option($funcs->fields['proname']));
			$funcs->moveNext();
		}

		/* Populate times */
		$sel1 = new XHTML_Select('formExecTime');
		$sel1->set_data($data->triggerExecTimes);

		/* Populate events */
		$sel2 = new XHTML_Select('formEvent');
		$sel2->set_data($data->triggerEvents);
		
		/* Populate occurences */
		$sel3 = new XHTML_Select('formFrequency');
		$sel3->set_data($data->triggerFrequency);
		
		echo "<form action=\"triggers.php\" method=\"post\">\n";
		echo "<table>\n";
		echo "<tr>\n";
		echo "		<th class=\"data\">{$lang['strname']}</th>\n";
		echo "		<th class=\"data\">{$lang['strwhen']}</th>\n";
		echo "</tr>\n";
		echo "<tr>\n";
		echo "		<td class=\"data1\"> <input type=\"text\" name=\"formTriggerName\" size=\"32\" /></td>\n";
		echo "		<td class=\"data1\"> ", $sel1->fetch(), "</td>\n";
		echo "</tr>\n";
		echo "<tr>\n";
		echo "    <th class=\"data\">{$lang['strevent']}</th>\n";
		echo "    <th class=\"data\">{$lang['strforeach']}</th>\n";
		echo "</tr>\n";
		echo "<tr>\n";
		echo "     <td class=\"data1\"> ", $sel2->fetch(), "</td>\n";
		echo "     <td class=\"data1\"> ", $sel3->fetch(), "</td>\n";
		echo "</tr>\n";
		echo "<tr><th class=\"data\"> {$lang['strfunction']}</th>\n";
		echo "<th class=\"data\"> {$lang['strarguments']}</th></tr>\n";
		echo "<tr><td class=\"data1\">", $sel0->fetch(), "</td>\n";
		echo "<td class=\"data1\">(<input type=\"text\" name=\"formTriggerArgs\" size=\"32\" />)</td>\n";
		echo "</tr></table>\n";
		echo "<p><input type=\"submit\" value=\"{$lang['strcreate']}\" />\n";
		echo "<input type=\"submit\" name=\"cancel\" value=\"{$lang['strcancel']}\" /></p>\n";
		echo "<input type=\"hidden\" name=\"action\" value=\"save_create\" />\n";
		echo "<input type=\"hidden\" name=\"table\" value=\"", htmlspecialchars($_REQUEST['table']), "\" />\n";
		echo $misc->form;
		echo "</form>\n";
	}
	
	/**
	 * Actually creates the new trigger in the database
	 */
	function doSaveCreate() {
		global $data;
		global $lang;		
	
		// Check that they've given a name and a definition

		if ($_POST['formFunction'] == '')
			doCreate($lang['strtriggerneedsfunc']);
		elseif ($_POST['formTriggerName'] == '')
			doCreate($lang['strtriggerneedsname']);
		elseif ($_POST['formEvent'] == '') 
			doCreate();
		else {		 
			$status = $data->createTrigger($_POST['formTriggerName'], $_POST['table'],
					$_POST['formFunction'], $_POST['formExecTime'], $_POST['formEvent'],
					$_POST['formFrequency'], $_POST['formTriggerArgs']);
			if ($status == 0)
				doDefault($lang['strtriggercreated']);
			else
				doCreate($lang['strtriggercreatedbad']);
		}
	}	

	/**
	 * List all the triggers on the table
	 */
	function doDefault($msg = '') {
		global $data, $misc, $database;
		global $lang;

		function tgPre(&$rowdata) {
			global $data, $lang;
			// Nasty hack to support pre-7.4 PostgreSQL
			$rowdata->fields['+tgdef'] = $rowdata->fields['tgdef'] !== null
									? $rowdata->fields['tgdef']
									: $data->getTriggerDef($rowdata->fields);
		}
		
		$misc->printTrail('table');
		$misc->printTabs('table','triggers');
		$misc->printMsg($msg);

		$triggers = $data->getTriggers($_REQUEST['table']);

		$columns = array(
			'trigger' => array(
				'title' => $lang['strname'],
				'field' => field('tgname'),
			),
			'definition' => array(
				'title' => $lang['strdefinition'],
				'field' => field('+tgdef'),
			),
			'function' => array(
				'title' => $lang['strfunction'],
				'field' => field('proproto'),
				'url' => "functions.php?action=properties&amp;server={$_REQUEST['server']}&amp;database={$_REQUEST['database']}&amp;",
				'vars' => array(
					'schema' => 'pronamespace',
					'function' => 'proproto',
					'function_oid' => 'prooid',
				),
			),
			'actions' => array(
				'title' => $lang['stractions'],
			),
		);

		$actions = array(
			'alter' => array(
				'title' => $lang['stralter'],
				'url'   => "triggers.php?action=confirm_alter&amp;{$misc->href}&amp;table=".urlencode($_REQUEST['table'])."&amp;",
				'vars'  => array('trigger' => 'tgname'),
			),
			'drop' => array(
				'title' => $lang['strdrop'],
				'url'   => "triggers.php?action=confirm_drop&amp;{$misc->href}&amp;table=".urlencode($_REQUEST['table'])."&amp;",
				'vars'  => array('trigger' => 'tgname'),
			),
		);
		if($data->hasDisableTriggers()) {
			if(!$data->phpBool($triggers->fields["tgenabled"])) {
				$actions['enable'] = array(
					'title' => $lang['strenable'],
					'url'   => "triggers.php?action=confirm_enable&amp;{$misc->href}&amp;table=".urlencode($_REQUEST['table'])."&amp;",
					'vars'  => array('trigger' => 'tgname'),
				);
			} else {
				$actions['disable'] = array(
					'title' => $lang['strdisable'],
					'url'   => "triggers.php?action=confirm_disable&amp;{$misc->href}&amp;table=".urlencode($_REQUEST['table'])."&amp;",
					'vars'  => array('trigger' => 'tgname'),
				);
			}
		}

		$misc->printTable($triggers, $columns, $actions, $lang['strnotriggers'], 'tgPre');
		
		echo "<p><a class=\"navlink\" href=\"triggers.php?action=create&amp;{$misc->href}&amp;table=", urlencode($_REQUEST['table']), "\">{$lang['strcreatetrigger']}</a></p>\n";
	}

	function doTree() {

		global $misc, $data;

		$triggers = $data->getTriggers($_REQUEST['table']);

		$reqvars = $misc->getRequestVars('table');
		
		$attrs = array(
			'text'   => field('tgname'),
			'icon'   => 'Trigger',
		);

		$misc->printTreeXML($triggers, $attrs);
		exit;
	}

	if ($action == 'tree') doTree();

	$misc->printHeader($lang['strtables'] . ' - ' . $_REQUEST['table'] . ' - ' . $lang['strtriggers']);
	$misc->printBody();

	switch ($action) {
		case 'alter':
			if (isset($_POST['alter'])) doSaveAlter();
			else doDefault();
			break;
		case 'confirm_alter':
			doAlter();
			break;
		case 'confirm_enable':
			doEnable(true);
			break;
		case 'confirm_disable':
			doDisable(true);
			break;
		case 'save_create':
			if (isset($_POST['cancel'])) doDefault();
			else doSaveCreate();
			break;
		case 'create':
			doCreate();
			break;
		case 'drop':
			if (isset($_POST['yes'])) doDrop(false);
			else doDefault();
			break;
		case 'confirm_drop':
			doDrop(true);
			break;
		case 'enable':
			if (isset($_POST['yes'])) doEnable(false);
			else doDefault();
			break;
		case 'disable':
			if (isset($_POST['yes'])) doDisable(false);
			else doDefault();
			break;
		default:
			doDefault();
			break;
	}
	
	$misc->printFooter();

?>