<?php
/**
 * Implementation of SchedulerTaskMgr view
 *
 * @category   DMS
 * @package    SeedDMS
 * @license    GPL 2
 * @version    @version@
 * @author     Uwe Steinmann <uwe@steinmann.cx>
 * @copyright  Copyright (C) 2013 Uwe Steinmann
 * @version    Release: @package_version@
 */

/**
 * Include parent class
 */
//require_once("class.Bootstrap.php");

/**
 * Class which outputs the html page for SchedulerTaskMgr view
 *
 * @category   DMS
 * @package    SeedDMS
 * @author     Uwe Steinmann <uwe@steinmann.cx>
 * @copyright  Copyright (C) 2013 Uwe Steinmann
 * @version    Release: @package_version@
 */
class SeedDMS_View_SchedulerTaskMgr extends SeedDMS_Theme_Style {

	function js() { /* {{{ */
		header('Content-Type: application/javascript');
?>
$(document).ready( function() {
	$('body').on('click', '.addtask', function(ev){
		ev.preventDefault();
		$('#editaddtask.ajax').trigger('update', {extension: $(this).data('extension'), task: $(this).data('task')});
	});
	$('body').on('click', '.listtasks', function(ev){
		ev.preventDefault();
		$('#listtasks.ajax').trigger('update', {extension: $(this).data('extension'), task: $(this).data('task')});
	});
	$('body').on('click', '.edittask', function(ev){
		ev.preventDefault();
		$('#editaddtask.ajax').trigger('update', {taskid: $(this).data('id'), action: $(this).data('action')});
		$("html, body").animate({ scrollTop: 0 }, "slow");
	});
	$('#listtasks.ajax').trigger('update', {});

	$('body').on('click', '.removetask', function(ev){
		ev.preventDefault();
		ev.stopPropagation();
		id = $(ev.currentTarget).attr('rel');
		confirmmsg = $(ev.currentTarget).attr('confirmmsg');
		msg = $(ev.currentTarget).attr('msg');
		formtoken = '<?= createFormKey('removetask') ?>';
		bootbox.dialog(confirmmsg, [{
			"label" : "<i class='fa fa-remove'></i> <?= getMLText("rm_task") ?>",
			"class" : "btn-danger",
			"callback": function() {
				$.post('../op/op.SchedulerTaskMgr.php',
					{ action: 'removetask', taskid: id, formtoken: formtoken },
					function(data) {
						if(data.success) {
							$('#table-row-task-'+id).hide('slow');
							noty({
								text: msg,
								type: 'success',
								dismissQueue: true,
								layout: 'topRight',
								theme: 'defaultTheme',
								timeout: 1500,
							});
						} else {
							noty({
								text: data.message,
								type: 'error',
								dismissQueue: true,
								layout: 'topRight',
								theme: 'defaultTheme',
								timeout: 3500,
							});
						}
					},
					'json'
				);
			}
		}, {
			"label" : "<?= getMLText("cancel") ?>",
			"class" : "btn-cancel",
			"callback": function() {
			}
		}]);
	});
});
<?php
	} /* }}} */

	public function form() { /* {{{ */
		$dms = $this->params['dms'];
		$user = $this->params['user'];
		$extname = $this->params['extname'];
		$taskname = $this->params['taskname'];
		if($extname && $taskname && is_object($taskobj = resolveTask($GLOBALS['SEEDDMS_SCHEDULER']['tasks'][$extname][$taskname]))) {
			if(method_exists($taskobj, 'getAdditionalParams'))
				$additionalparams = $taskobj->getAdditionalParams();
			else
				$additionalparams = null;
?>
	<form action="../op/op.SchedulerTaskMgr.php" method="post" class="form-horizontal">
	<?=	createHiddenFieldWithKey('addtask') ?>
	<input type="hidden" name="action" value="addtask">
	<input type="hidden" name="extension" value="<?= $extname ?>">
	<input type="hidden" name="task" value="<?= $taskname ?>">
	<div class="control-group">
		<label class="control-label" for="extension"><?= getMLText("scheduler_class");?>:</label>
		<div class="controls">
		<span class="input uneditable-input"><?= $extname ?>::<?= $taskname ?></span>
		</div>
	</div>
<?php
			$this->formField(
				getMLText('task_name'),
				array(
					'element'=>'input',
					'type'=>'text',
					'id'=>'name',
					'name'=>'name',
					'value'=>'',
					'required'=>true,
				)
			);
			$this->formField(
				getMLText('task_description'),
				array(
					'element'=>'input',
					'type'=>'text',
					'id'=>'description',
					'name'=>'description',
					'value'=>'',
					'required'=>false,
				)
			);
			$this->formField(
				getMLText('task_frequency'),
				array(
					'element'=>'input',
					'type'=>'text',
					'id'=>'frequency',
					'name'=>'frequency',
					'value'=>'',
					'required'=>true,
					'placeholder'=>getMLText('task_frequency_placeholder'),
				)
			);
			$this->formField(
				getMLText('task_disabled'),
				array(
					'element'=>'input',
					'type'=>'checkbox',
					'id'=>'disabled',
					'name'=>'disabled',
					'value'=>'1',
					'checked'=>true,
				)
			);
			if($additionalparams) {
				foreach($additionalparams as $param) {
					switch($param['type']) {
					case 'boolean':
						$this->formField(
							getMLText("task_".$extname."_".$taskname."_".$param['name']),
							array(
								'element'=>'input',
								'type'=>'checkbox',
								'id'=>'params_'.$param['name'],
								'name'=>'params['.$param['name'].']',
								'value'=>'1',
								'checked'=>false,
							),
							array(
								'help'=>$param['description']
							)
						);
						break;
					case 'password':
						$this->formField(
							getMLText('task_'.$extname."_".$taskname."_".$param['name']),
							array(
								'element'=>'input',
								'type'=>'password',
								'id'=>'params_'.$param['name'],
								'name'=>'params['.$param['name'].']',
								'required'=>false
							),
							array(
								'help'=>$param['description']
							)
						);
						break;
					case 'select':
						$this->formField(
							getMLText('task_'.$extname."_".$taskname."_".$param['name']),
							array(
								'element'=>'select',
								'class'=>'chzn-select',
								'name'=>'params['.$param['name'].']',
								'multiple'=>false,
								'attributes'=>array(array('data-placeholder', getMLText('select_value'), array('data-no_results_text', getMLText('unknown_value')))),
								'options'=>$param['options'],
							),
							array(
								'help'=>$param['description']
							)
						);
						break;
					default:
						$this->formField(
							getMLText('task_'.$extname."_".$taskname."_".$param['name']),
							array(
								'element'=>'input',
								'type'=>(($param['type'] == 'integer') ? 'number' : 'text'),
								'id'=>'params_'.$param['name'],
								'name'=>'params['.$param['name'].']',
								'required'=>false
							),
							array(
								'help'=>$param['description']
							)
						);
						break;
					}
				}
			}
?>
	<div class="control-group">
		<label class="control-label" for="login"></label>
		<div class="controls">
			<button type="submit" class="btn btn-primary"><i class="fa fa-save"></i> <?php printMLText("save")?></button>
		</div>
	</div>
	</form>
<?php
		}
	} /* }}} */

	public function edittask() { /* {{{ */
		$dms = $this->params['dms'];
		$user = $this->params['user'];
		$scheduler = $this->params['scheduler'];
		$taskid = $this->params['taskid'];

		$task = $scheduler->getTask($taskid);
		if(!isset($GLOBALS['SEEDDMS_SCHEDULER']['tasks'][$task->getExtension()])) {
			$this->errorMsg(getMLText('scheduler_extension_not_available'));
			return;
		}

		$taskobj = $GLOBALS['SEEDDMS_SCHEDULER']['tasks'][$task->getExtension()][$task->getTask()];
		$taskobj = resolveTask($taskobj);
		if(!is_object($taskobj)) {
			$this->errorMsg(getMLText('task_class_not_callable'));
			return;
		}
?>
	<form action="../op/op.SchedulerTaskMgr.php" method="post" class="form-horizontal">
	<?=	createHiddenFieldWithKey('edittask') ?>
	<input type="hidden" name="action" value="edittask">
	<input type="hidden" name="taskid" value="<?= $taskid ?>">
	<input type="hidden" name="extension" value="<?= $task->getExtension() ?>">
	<input type="hidden" name="task" value="<?= $task->getTask() ?>">
	<div class="control-group">
		<label class="control-label" for="extension"><?= getMLText("scheduler_class");?>:</label>
		<div class="controls">
		<span class="input uneditable-input"><?= $task->getExtension() ?>::<?= $task->getTask() ?></span>
		</div>
	</div>
<?php
		$this->formField(
			getMLText('task_name'),
			array(
				'element'=>'input',
				'type'=>'text',
				'id'=>'name',
				'name'=>'name',
				'value'=>$task->getName(),
				'required'=>true,
			)
		);
		$this->formField(
			getMLText('task_description'),
			array(
				'element'=>'input',
				'type'=>'text',
				'id'=>'description',
				'name'=>'description',
				'value'=>$task->getDescription(),
				'required'=>false,
			)
		);
		$this->formField(
			getMLText('task_frequency'),
			array(
				'element'=>'input',
				'type'=>'text',
				'id'=>'frequency',
				'name'=>'frequency',
				'value'=>$task->getFrequency(),
				'required'=>true,
			)
		);
		$this->formField(
			getMLText('task_disabled'),
			array(
				'element'=>'input',
				'type'=>'checkbox',
				'id'=>'disabled',
				'name'=>'disabled',
				'value'=>'1',
				'checked'=>$task->getDisabled(),
			)
		);
		if($additionalparams = $taskobj->getAdditionalParams()) {
			foreach($additionalparams as $param) {
				switch($param['type']) {
				case 'boolean':
					$this->formField(
						getMLText("task_".$task->getExtension()."_".$task->getTask()."_".$param['name']),
						array(
							'element'=>'input',
							'type'=>'checkbox',
							'id'=>'params_'.$param['name'],
							'name'=>'params['.$param['name'].']',
							'value'=>'1',
							'checked'=>$task->getParameter($param['name']) == 1,
						),
						array(
							'help'=>$param['description']
						)
					);
					break;
				case 'password':
					$this->formField(
						getMLText("task_".$task->getExtension()."_".$task->getTask()."_".$param['name']),
						array(
							'element'=>'input',
							'type'=>'password',
							'id'=>'params_'.$param['name'],
							'name'=>'params['.$param['name'].']',
							'value'=>$task->getParameter()[$param['name']],
							'required'=>false
						),
						array(
							'help'=>$param['description']
						)
					);
					break;
				case 'select':
					$this->formField(
						getMLText('task_'.$extname."_".$taskname."_".$param['name']),
						array(
							'element'=>'select',
							'class'=>'chzn-select',
							'name'=>'params['.$param['name'].']',
							'multiple'=>false,
							'attributes'=>array(array('data-placeholder', getMLText('select_value'), array('data-no_results_text', getMLText('unknown_value')))),
							'options'=>$task->getParameter()[$param['options']],
						),
						array(
							'help'=>$param['description']
						)
					);
					break;
				default:
					$this->formField(
						getMLText("task_".$task->getExtension()."_".$task->getTask()."_".$param['name']),
						array(
							'element'=>'input',
							'type'=>(($param['type'] == 'integer') ? 'number' : 'text'),
							'id'=>'params_'.$param['name'],
							'name'=>'params['.$param['name'].']',
							'value'=>$task->getParameter()[$param['name']],
							'required'=>false
						),
						array(
							'help'=>$param['description']
						)
					);
					break;
				}
			}
		}
?>
	<div class="control-group">
		<label class="control-label" for="login"></label>
		<div class="controls">
			<button type="submit" class="btn btn-primary"><i class="fa fa-save"></i> <?php printMLText("save")?></button>
		</div>
	</div>
	</form>
<?php
	} /* }}} */

	public function tasklist() { /* {{{ */
		$dms = $this->params['dms'];
		$user = $this->params['user'];
		$extname = $this->params['extname'];
		$taskname = $this->params['taskname'];
		$scheduler = $this->params['scheduler'];

		if($extname && $taskname)
			$tasks = $scheduler->getTasksByExtension($extname, $taskname);
		else
			$tasks = $scheduler->getTasks();
		if(!$tasks)
			return;

		$this->contentHeading(getMLText("scheduler_class_tasks"));
		echo "<table class=\"table _table-condensed\">\n";
		print "<thead>\n<tr>\n";
		print "<th>".getMLText('scheduler_class')."</th>\n";	
		print "<th>".getMLText('task_name')."/".getMLText('task_description')."</th>\n";	
		print "<th>".getMLText('task_frequency')."</th>\n";	
		print "<th>".getMLText('task_next_run')."</th>\n";	
		print "<th>".getMLText('task_last_run')."</th>\n";	
		print "<th></th>\n";	
		print "</tr></thead><tbody>\n";
		foreach($tasks as $task) {
			if(!isset($GLOBALS['SEEDDMS_SCHEDULER']['tasks'][$task->getExtension()][$task->getTask()]) || !is_object(resolveTask($GLOBALS['SEEDDMS_SCHEDULER']['tasks'][$task->getExtension()][$task->getTask()])))
				$class = 'table-danger error';
			else
				$class = 'table-success success';
			echo "<tr id=\"table-row-task-".$task->getID()."\" class=\"".(!$task->getDisabled() ? " ".$class : "")."\">";
			echo "<td>";
			echo $task->getExtension()."::".$task->getTask();
			echo "</td>";
			echo "<td width=\"100%\">";
			echo "<strong>".$task->getName()."</strong></br>";
			echo $task->getDescription();
			echo "</td>";
			echo "<td>";
			echo $task->getFrequency();
			echo "</td>";
			echo "<td>";
			echo getLongReadableDate(makeTsFromDate($task->getNextRun()));
			echo "</td>";
			echo "<td>";
			if($task->getLastRun())
				echo getLongReadableDate(makeTsFromDate($task->getLastRun()));
			echo "</td>";
			echo "<td nowrap>";
			print "<div class=\"list-action\">";
			print "<a class=\"removetask\" rel=\"".$task->getID()."\" msg=\"".getMLText('remove_task')."\" confirmmsg=\"".htmlspecialchars(getMLText("confirm_rm_task"), ENT_QUOTES)."\" title=\"".getMLText("remove_task")."\"><i class=\"fa fa-remove\"></i></a>";
			if(isset($GLOBALS['SEEDDMS_SCHEDULER']['tasks'][$task->getExtension()])) {
				print "<a class=\"edittask\" data-action=\"edittask\" data-id=\"".$task->getID()."\" href=\"../out/out.SchedulerTaskMgr.php?action=edittask\" title=\"".getMLText("edit_task")."\"><i class=\"fa fa-edit\"></i></a>";
			}
			print "</div>";
			echo "</td>";
			echo "</tr>";
		}
		echo "</tbody></table>\n";
	} /* }}} */

	function show() { /* {{{ */
		$dms = $this->params['dms'];
		$user = $this->params['user'];
		$extname = $this->params['extname'];
		$taskname = $this->params['taskname'];
		$scheduler = $this->params['scheduler'];
	
		$this->htmlAddHeader('<script type="text/javascript" src="../styles/'.$this->theme.'/bootbox/bootbox.min.js"></script>'."\n", 'js');

		$this->htmlStartPage(getMLText("admin_tools"));
		$this->globalNavigation();
		$this->contentStart();
		$this->pageNavigation(getMLText("admin_tools"), "admin_tools");
		$this->contentHeading(getMLText("scheduler_task_mgr"));
		$this->rowStart();
		$this->columnStart(6);
		if(!empty($GLOBALS['SEEDDMS_SCHEDULER']['tasks'])) {
			echo "<table class=\"table _table-condensed\">\n";
			print "<thead>\n<tr>\n";
			print "<th>".getMLText('scheduler_class')."</th>\n";	
			print "<th>".getMLText('scheduler_class_description')."</th>\n";	
			print "<th>".getMLText('scheduler_class_parameter')."</th>\n";	
			print "<th></th>\n";	
			print "</tr></thead><tbody>\n";
			$errmsgs = array();
			foreach($GLOBALS['SEEDDMS_SCHEDULER']['tasks'] as $extname=>$tasks) {
				foreach($tasks as $taskname=>$task) {
					$task = resolveTask($task);
					if(!is_object($task))
						continue;
					echo "<tr>";
					echo "<td>";
					echo $extname."::".$taskname;
					echo "</td>";
					echo "<td width=\"100%\">";
					echo $task->getDescription();
					echo "</td>";
					echo "<td>";
					$params = $task->getAdditionalParams();
					$k = array();
					foreach($params as $param)
						$k[] = $param['name'];
					echo implode(', ', $k);
					echo "</td>";
					echo "<td>";
					print "<div class=\"list-action\">";
					$t = $scheduler->getTasksByExtension($extname, $taskname);
					if($t) {
						print "<a class=\"listtasks\" data-extension=\"".$extname."\" data-task=\"".$taskname."\" href=\"../out/out.SchedulerTaskMgr.php?extension=".$extname."&task=".$taskname."\" title=\"".getMLText("list_tasks")."\"><i class=\"fa fa-list\"></i></a>";
					}
					print "<a class=\"addtask\" data-extension=\"".$extname."\" data-task=\"".$taskname."\" href=\"../out/out.SchedulerTaskMgr.php?extension=".$extname."&task=".$taskname."\" title=\"".getMLText("add_task")."\"><i class=\"fa fa-plus\"></i></a>";
					print "</div>";
					echo "</td>";
					echo "</tr>";
				}
			}
			echo "</tbody></table>\n";
		}
?>
		<div id="listtasks" class="ajax" data-view="SchedulerTaskMgr" data-action="tasklist"></div>
<?php
		$this->columnEnd();
		$this->columnStart(6);
?>
		<div id="editaddtask" class="ajax" data-view="SchedulerTaskMgr" data-action="form"></div>
<?php
		$this->columnEnd();
		$this->rowEnd();
		$this->contentEnd();
		$this->htmlEndPage();
	} /* }}} */
}
?>