From 03ed1a9e2bc884d2410e2b44335dfd2fad68de5f Mon Sep 17 00:00:00 2001
From: esanchezm <noreply@pandorafms.org>
Date: Mon, 12 Jan 2009 14:31:01 +0000
Subject: [PATCH] 2009-01-12  Esteban Sanchez  <estebans@artica.es>

	* godmode/agentes/alert_manager.php: Complete rewritten of the alert
	system when assigned alerts to an agent.

	* pandoradb.sql: New tables for alert system. These are:
	talert_commands, talert_actions, talert_templates,
	talert_template_modules, talert_template_module_actions. No migration
	tool is available yet.

	* godmode/alerts/configure_alert_template.php,
	godmode/alerts/configure_alert_action.php,
	godmode/alerts/alert_templates.php,
	godmode/alerts/configure_alert_command.php,
	godmode/alerts/alert_actions.php: Added to repository. Administration
	interface to new alert system.

	* godmode/alerts/modify_alert.php: Deleted from repository.

	* godmode/setup/setup.php: Added an example of the date format. Main
	table has now percentage width.

	* godmode/menu.php, operation/menu.php: Added new alert options.
	Removed refr value when it's not neccesary.

	* include/styles/pandora.css: Added width to textarea elements. Style
	correction and cleanup. Tables doesn't have a odd-even pattern, but
	the hovered row now changes its colour. New styles for alert pages.

	* include/functions_custom_graphs.php: Added to repository. custom
	graphs functions moved here.

	* include/functions_incidents.php, include/functions_events.php: Moved
	to LGPL. Style comment corrections.

	* include/functions_html.php: Documentation style correction. Added
	print_input_file() and print_label().

	* include/functions_ui.php: Doc style correction.

	* operation/reporting/graph_viewer.php: Include new function file with
	custom graphs. Use generic functions.

	* index.php: Unset pass from POST and REQUEST arrays.

	* include/functions_db.php: Some documentation updated to new format.
	Added format_array_to_update_sql() to generate SQL sentences for
	updates. Style correction.

	* godmode/agentes/configurar_agente.php: Variables renamed to have a
	meaning.

	* extensions/update_manager/main.php: Mark an string translatable.

	* extensions/update_manager/lib/libupdate_manager_client.php,
	godmode/alerts/configure_alert.php, include/functions.php,
	godmode/agentes/module_manager.php, operation/agentes/networkmap.php,
	operation/reporting/reporting_viewer.php,
	godmode/agentes/manage_config.php: Style correction.



git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@1331 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
---
 pandora_console/ChangeLog                     |  60 ++
 .../lib/libupdate_manager_client.php          |   1 -
 .../extensions/update_manager/main.php        |   2 +-
 .../godmode/agentes/alert_manager.php         | 440 +++++++-----
 .../godmode/agentes/configurar_agente.php     | 124 ++--
 .../godmode/agentes/manage_config.php         |   6 +-
 .../godmode/agentes/module_manager.php        | 191 +++---
 .../godmode/alerts/alert_actions.php          | 128 ++++
 .../godmode/alerts/alert_commands.php         | 138 ++++
 .../godmode/alerts/alert_templates.php        | 201 ++++++
 .../godmode/alerts/configure_alert.php        |  62 +-
 .../godmode/alerts/configure_alert_action.php | 121 ++++
 .../alerts/configure_alert_command.php        |  73 ++
 .../alerts/configure_alert_template.php       | 590 ++++++++++++++++
 .../godmode/alerts/modify_alert.php           | 116 ----
 pandora_console/godmode/menu.php              |  48 +-
 pandora_console/godmode/setup/setup.php       |   6 +-
 pandora_console/include/functions.php         |   7 +-
 pandora_console/include/functions_alerts.php  | 639 ++++++++++++++++++
 .../include/functions_custom_graphs.php       | 115 ++++
 pandora_console/include/functions_db.php      | 244 ++++---
 pandora_console/include/functions_events.php  |  21 +-
 pandora_console/include/functions_html.php    | 145 ++--
 .../include/functions_incidents.php           |  41 +-
 pandora_console/include/functions_ui.php      |   6 +-
 pandora_console/include/styles/pandora.css    | 139 ++--
 pandora_console/index.php                     |   2 +-
 .../operation/agentes/networkmap.php          |   3 -
 pandora_console/operation/menu.php            |  19 +-
 .../operation/reporting/graph_viewer.php      |  98 +--
 .../operation/reporting/reporting_viewer.php  |   1 -
 pandora_console/pandoradb.sql                 |  97 ++-
 32 files changed, 3062 insertions(+), 822 deletions(-)
 create mode 100644 pandora_console/godmode/alerts/alert_actions.php
 create mode 100644 pandora_console/godmode/alerts/alert_commands.php
 create mode 100644 pandora_console/godmode/alerts/alert_templates.php
 create mode 100644 pandora_console/godmode/alerts/configure_alert_action.php
 create mode 100644 pandora_console/godmode/alerts/configure_alert_command.php
 create mode 100644 pandora_console/godmode/alerts/configure_alert_template.php
 delete mode 100644 pandora_console/godmode/alerts/modify_alert.php
 create mode 100644 pandora_console/include/functions_alerts.php
 create mode 100644 pandora_console/include/functions_custom_graphs.php

diff --git a/pandora_console/ChangeLog b/pandora_console/ChangeLog
index e60199a249..180ec27b49 100644
--- a/pandora_console/ChangeLog
+++ b/pandora_console/ChangeLog
@@ -1,3 +1,63 @@
+2009-01-12  Esteban Sanchez  <estebans@artica.es>
+
+	* godmode/agentes/alert_manager.php: Complete rewritten of the alert
+	system when assigned alerts to an agent.
+
+	* pandoradb.sql: New tables for alert system. These are:
+	talert_commands, talert_actions, talert_templates,
+	talert_template_modules, talert_template_module_actions. No migration
+	tool is available yet.
+
+	* godmode/alerts/configure_alert_template.php,
+	godmode/alerts/configure_alert_action.php,
+	godmode/alerts/alert_templates.php,
+	godmode/alerts/configure_alert_command.php,
+	godmode/alerts/alert_actions.php: Added to repository. Administration
+	interface to new alert system.
+
+	* godmode/alerts/modify_alert.php: Deleted from repository.
+
+	* godmode/setup/setup.php: Added an example of the date format. Main
+	table has now percentage width.
+
+	* godmode/menu.php, operation/menu.php: Added new alert options.
+	Removed refr value when it's not neccesary.
+
+	* include/styles/pandora.css: Added width to textarea elements. Style
+	correction and cleanup. Tables doesn't have a odd-even pattern, but
+	the hovered row now changes its colour. New styles for alert pages.
+
+	* include/functions_custom_graphs.php: Added to repository. custom
+	graphs functions moved here.
+
+	* include/functions_incidents.php, include/functions_events.php: Moved
+	to LGPL. Style comment corrections.
+
+	* include/functions_html.php: Documentation style correction. Added
+	print_input_file() and print_label().
+
+	* include/functions_ui.php: Doc style correction.
+
+	* operation/reporting/graph_viewer.php: Include new function file with
+	custom graphs. Use generic functions.
+
+	* index.php: Unset pass from POST and REQUEST arrays.
+	
+	* include/functions_db.php: Some documentation updated to new format.
+	Added format_array_to_update_sql() to generate SQL sentences for
+	updates. Style correction.
+
+	* godmode/agentes/configurar_agente.php: Variables renamed to have a
+	meaning.
+
+	* extensions/update_manager/main.php: Mark an string translatable.
+
+	* extensions/update_manager/lib/libupdate_manager_client.php,
+	godmode/alerts/configure_alert.php, include/functions.php,
+	godmode/agentes/module_manager.php, operation/agentes/networkmap.php,
+	operation/reporting/reporting_viewer.php, 
+	godmode/agentes/manage_config.php: Style correction.
+
 2009-01-12  Sancho Lerena  <slerena@artica.es>
 
 	* pandoradb.sql: Removed fields "timestamp" and "id_agente" (and altered
diff --git a/pandora_console/extensions/update_manager/lib/libupdate_manager_client.php b/pandora_console/extensions/update_manager/lib/libupdate_manager_client.php
index a8675515d3..d6191ad539 100644
--- a/pandora_console/extensions/update_manager/lib/libupdate_manager_client.php
+++ b/pandora_console/extensions/update_manager/lib/libupdate_manager_client.php
@@ -20,7 +20,6 @@ if ((include_once ('XML/RPC.php')) != 1)
 error_reporting ($prev_level);
 unset ($prev_level);
 
-
 define ('XMLRPC_DEBUG', 0);
 define ('XMLRPC_TIMEOUT', 15);
 
diff --git a/pandora_console/extensions/update_manager/main.php b/pandora_console/extensions/update_manager/main.php
index c02d42a41f..10c53d1532 100644
--- a/pandora_console/extensions/update_manager/main.php
+++ b/pandora_console/extensions/update_manager/main.php
@@ -51,7 +51,7 @@ $user_key = get_user_key ($settings);
 $update_package = (bool) get_parameter_post ('update_package');
 
 if ($update_package) {
-	echo '<h2>Updating...</h2>';
+	echo '<h2>'.__('Updating').'...</h2>';
 	flush ();
 	$force = (bool) get_parameter_post ('force_update');
 	
diff --git a/pandora_console/godmode/agentes/alert_manager.php b/pandora_console/godmode/agentes/alert_manager.php
index 84f2a44a08..701228e780 100644
--- a/pandora_console/godmode/agentes/alert_manager.php
+++ b/pandora_console/godmode/agentes/alert_manager.php
@@ -17,175 +17,311 @@
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 // Load global vars
+require_once ('include/config.php');
+require_once ('include/functions_alerts.php');
+
 if (!isset ($id_agente)) {
 	die ("Not Authorized");
 }
 
 echo "<h2>".__('Agent configuration')." &gt; ".__('Alerts')."</h2>";
-// ==========================
-// Create module/type combo
-// ==========================
 
-echo '<table width="300" cellpadding="4" cellspacing="4" class="databox">';
-echo '<form name="modulo" method="post" action="index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&id_agente='.$id_agente.'">';
-echo "<tr><td class='datos'>";
-echo '<select name="form_alerttype">';
+$create_alert = (bool) get_parameter ('create_alert');
+$add_action = (bool) get_parameter ('add_action');
 
-echo "<option value='simple'>".__('Create a simple alert');
-echo "<option value='combined'>".__('Create a new combined alert');
-echo "</select></td>";
-echo '<td class="datos">';
-echo '<input align="right" name="updbutton" type="submit" class="sub wand" value="'.__('Create').'">';
-echo "</form>";
-echo "</table>";
-
-// ==========================
-// Simple alerts view
-// ==========================
-
-$sql = 'SELECT * FROM tagente_modulo WHERE id_agente = "'.$id_agente.'"';
-$result = mysql_query ($sql);
-if ($row = mysql_num_rows( $result)) {
-
-	echo "<h3>".__('Simple alerts')."</h3>";
-
-	$color=1;
-	$string='';
-	while ($row=mysql_fetch_array($result)){  // All modules of this agent
-		$id_tipo = $row["id_tipo_modulo"];
-		$nombre_modulo = substr($row["nombre"],0,21);
-		//module type modulo is $row2["nombre"];
+if ($create_alert) {
+	$id_alert_template = (int) get_parameter ('template');
+	$id_agent_module = (int) get_parameter ('id_agent_module');
+	
+	$id = create_alert_agent_module ($id_agent_module, $id_alert_template);
+	print_error_message ($id, __('Successfully created'),
+		__('Could not be created'));
+	if ($id !== false) {
+		$id_alert_action = (int) get_parameter ('action');
+		$fires_min = (int) get_parameter ('fires_min');
+		$fires_max = (int) get_parameter ('fires_max');
+		$values = array ();
+		if ($fires_min != -1)
+			$values['fires_min'] = $fires_min;
+		if ($fires_max != -1)
+			$values['fires_max'] = $fires_max;
 		
-		$sql = 'SELECT * 
-			FROM talerta_agente_modulo 
-			WHERE id_agente_modulo = '.$row["id_agente_modulo"];
-			// From all the alerts give me which are from my agent
-		$result3=mysql_query($sql);
-		while ($row3=mysql_fetch_array($result3)){
-			if ($color == 1){
-				$tdcolor="datos";
-				$color =0;
-			} else {
-				$tdcolor="datos2";
-				$color =1;
-			}
-			$sql4='SELECT nombre FROM talerta WHERE id_alerta = '.$row3["id_alerta"];
-			$result4=mysql_query($sql4);
-			$row4=mysql_fetch_array($result4);
-			// Alert name defined by  $row4["nombre"]; 
-			$nombre_alerta = $row4["nombre"];
-			$string = $string."<tr style='color: #666;'><td class='$tdcolor'>".$nombre_modulo;
-			
-			$string .= show_alert_row_edit ($row3, $tdcolor, $row["id_tipo_modulo"],0);
-			$string = $string."</td><td class='$tdcolor'>";
-		 	$id_grupo = dame_id_grupo($id_agente);
-			if (give_acl ($config['id_user'], $id_grupo, "LW")) {
-				$string = $string."<a href='index.php?sec=gagente&
-				sec2=godmode/agentes/configurar_agente&tab=alert&
-				id_agente=".$id_agente."&delete_alert=".$row3["id_aam"]."'>
-				<img src='images/cross.png' border=0 alt='".__('Delete')."'></a>  &nbsp; ";
-				$string = $string."<a href='index.php?sec=gagente&
-				sec2=godmode/agentes/configurar_agente&tab=alert&
-				id_agente=".$id_agente."&update_alert=".$row3["id_aam"]."'>
-				<img src='images/config.png' border=0 alt='".__('Update')."'></a>";		
-			}
-			$string = $string."</td>";
-		}
+		add_alert_agent_module_action ($id, $id_alert_action, $values);
 	}
-	if (isset($string) & $string!='') {
-	echo "<table cellpadding='4' cellspacing='4' width='750' class='databox'>
-	<tr><th>".__('Name')."</th>
-	<th>".__('Type')."</th>
-	<th>".__('Alert')."</th>
-	<th>".__('Threshold')."</th>
-	<th>".__('Min.')."</th>
-	<th>".__('Max.')."</th>
-	<th>".__('Time')."</th>
-	<th>".__('Description')."</th>
-	<th>".__('info')."</th>
-	<th width='50'>".__('Action')."</th></tr>";
-	echo $string;
-	echo "</table>";
-	} else {
-		echo "<div class='nf'>".__('This agent doesn\'t have any alert')."</div>";
-	}
-} else {
-	echo "<div class='nf'>".__('This agent doesn\'t have any module')."</div>";
 }
 
-// ==========================
-// Combined alerts view
-// ==========================
+if ($add_action) {
+	$id_action = (int) get_parameter ('action');
+	$id_alert_module = (int) get_parameter ('id_alert_module');
+	$fires_min = (int) get_parameter ('fires_min');
+	$fires_max = (int) get_parameter ('fires_max');
+	$values = array ();
+	if ($fires_min != -1)
+		$values['fires_min'] = $fires_min;
+	if ($fires_max != -1)
+		$values['fires_max'] = $fires_max;
+	
+	$result = add_alert_agent_module_action ($id_alert_module, $id_action, $values);
+	print_error_message ($id, __('Successfully added'),
+		__('Could not be added'));
+}
 
-echo "<h3>".__('Combined alerts')."</h3>";
+$modules = get_agent_modules ($id_agente,
+	array ('id_tipo_modulo', 'nombre', 'id_agente'));
 
-$sql = 'SELECT * FROM talerta_agente_modulo WHERE id_agent = '.$id_agente;
-$result = mysql_query ($sql);
-if (mysql_num_rows($result) == 0) {
-	echo "<div class='nf'>".__('This agent doesn\'t have any module')."</div>";
-} else {
-	$color = 1;
-	$string = "";
-	while ($row=mysql_fetch_array($result)){  
-		// Show data for this combined alert
-		$string .= "<tr><td class='datos3'>";
-		$string .= __('Combined')." #".$row["id_aam"];
-		$string .= show_alert_row_edit ($row, "datos3", 0, 1);
-		$string .= '<td class="datos3">'; // action
-		if (give_acl($config['id_user'], $id_grupo, "LW")==1){
-			$string .= "<a href='index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&id_agente=".$id_agente."&delete_alert=".$row["id_aam"]."'> <img src='images/cross.png' border=0 alt='".__('Delete')."'></a>  &nbsp; ";
-			$string .= "<a href='index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&id_agente=".$id_agente."&form_alerttype=combined&update_alert=".$row["id_aam"]."'>
-			<img src='images/config.png' border=0 alt='".__('Update')."'></a>";
-		}
-		$id_aam = $row["id_aam"];
-		$sql = "SELECT * FROM tcompound_alert, talerta_agente_modulo WHERE tcompound_alert.id = $id_aam AND talerta_agente_modulo.id_aam = tcompound_alert.id_aam";
-		$result2 = mysql_query ($sql);
-		while ($row2 = mysql_fetch_array($result2)) {
-			// Show data for each component of this combined alert
-			if ($color == 1){
-				$tdcolor="datos";
-				$color =0;
-			} else {
-				$tdcolor="datos2";
-				$color =1;
-			}
-			$module = get_db_row ("tagente_modulo", "id_agente_modulo", $row2["id_agente_modulo"]);
-			$description = $row2["descripcion"];
-			$alert_mode = $row2["operation"];
-			$id_agente_name = get_db_value ("nombre", "tagente", "id_agente", $module["id_agente"]);
-			$string .= "<tr style='color: #666;'><td class='$tdcolor'><a href='index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&id_agente=".$module["id_agente"]."'><b>".$id_agente_name." </b>- ".substr($module["nombre"],0,15)."</A>";
-			
-			$string .= show_alert_row_edit ($row2, $tdcolor, $module["id_tipo_modulo"],1);
+echo "<h3>".__('Modules defined')."</h3>";
 
-			$string .= "</td><td class='$tdcolor'>";
-			$id_grupo = dame_id_grupo($id_agente);
-			if (give_acl($config['id_user'], $id_grupo, "LW")==1){
-				$string .= "<a href='index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&id_agente=".$id_agente."&delete_alert_comp=".$row2["id_aam"]."'> <img src='images/cross.png' border=0 alt='".__('Delete')."'></a>  &nbsp; ";
-				$string .= "<a href='index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&id_agente=".$id_agente."&update_alert=".$row2["id_aam"]."'>
-				<img src='images/config.png' border=0 alt='".__('Update')."'></a>";		
-			}
-			$string .= "</td>";
-		}
+$table->id = 'modules';
+$table->cellspacing = '0';
+$table->width = '90%';
+$table->head = array ();
+$table->head[0] = __('Module');
+$table->data = array ();
+$table->style = array ();
+$table->style[1] = 'vertical-align: top';
+
+$table_alerts->class = 'listing';
+$table_alerts->width = '100%';
+$table_alerts->size = array ();
+$table_alerts->size[0] = '50%';
+$table_alerts->size[1] = '50%';
+$table_alerts->style = array ();
+$table_alerts->style[0] = 'vertical-align: top';
+$table_alerts->style[1] = 'vertical-align: top';
+
+foreach ($modules as $id_agent_module => $module) {
+	$data = array ();
+	
+	$last_data = return_value_agent_module ($id_agent_module);
+	if ($last_data === false)
+		$last_data = '<em>'.__('N/A').'</em>';
+	
+	$data[0] = '<span>'.$module['nombre'].'</span>';
+	$data[0] .= '<div class="actions left" style="visibility: hidden;">';
+	$data[0] .= '<span class="module_values" style="float: right;">';
+	$data[0] .= '<em>'.__('Latest value').'</em>: ';
+	$data[0] .= $last_data;
+	$data[0] .= '</span>';
+	$data[0] .= '</div>';
+	$data[0] .= '<div class="actions right" style="visibility: hidden;">';
+	$data[0] .= '<span class="add">';
+	$data[0] .= '<a href="#" class="add_alert" id="module-'.$id_agent_module.'">';
+	$data[0] .= __('Add alert');
+	$data[0] .= '</a>';
+	$data[0] .= '</span>';
+	$data[0] .= '</div>';
+	
+	
+	/* Alerts in module list */
+	$table_alerts->id = 'alerts-'.$id_agent_module;
+	$table_alerts->data = array ();
+	
+	$alerts = get_alerts_agent_module ($id_agent_module);
+	if ($alerts === false) {
+		$alerts = array ();
+	} else {
+		$data[0] .= '<h4 class="left" style="clear: left">';
+		$data[0] .= __('Alerts');
+		$data[0] .= '</h4>';
 	}
 	
-	if (isset($string) & $string != "") {
-		echo "<table cellpadding='4' cellspacing='4' width='750' class='databox'>
-		<tr><th>".__('Name')."</th>
-		<th>".__('Type')."</th>
-		<th>".__('Oper')."</th>
-		<th>".__('Threshold')."</th>
-		<th>".__('Min.')."</th>
-		<th>".__('Max.')."</th>
-		<th>".__('Time')."</th>
-		<th>".__('Description')."</th>
-		<th>".__('info')."</th>
-		<th width='50'>".__('Action')."</th></tr>";
-		echo $string;
-		echo "</table>";
-	} else {
-		echo "<div class='nf'>".__('This agent doesn\'t have any alert')."</div>";
+	foreach ($alerts as $alert) {
+		$alert_data = array ();
+		
+		$alert_actions = get_alert_agent_module_actions ($alert['id']);
+		
+		$alert_data[0] = get_alert_template_name ($alert['id_alert_template']);
+		$alert_data[0] .= '<span class="actions" style="visibility: hidden">';
+		$alert_data[0] .= '<a href="ajax.php?page=godmode/alerts/alert_templates&get_template_tooltip=1&id_template='.$alert['id_alert_template'].'"
+			class="template_details">';
+		$alert_data[0] .= print_image ("images/zoom.png", true,
+			array ("id" => 'template-details-'.$alert['id'],
+				"class" => "left img_help")
+			);
+		$alert_data[0] .= '</a>';
+		$alert_data[0] .= '</span>';
+		
+		$alert_data[1] = '<ul style="float: left; margin-bottom: 10px">';
+		foreach ($alert_actions as $action) {
+			$alert_data[1] .= '<li><div>';
+			$alert_data[1] .= '<span class="left">';
+			$alert_data[1] .= $action['name'].' ';
+			$alert_data[1] .= '<em>(';
+			if ($action['fires_min'] == $action['fires_max']) {
+				if ($action['fires_min'] == 0)
+					$alert_data[1] .= __('Always');
+				else
+					$alert_data[1] .= __('On').' '.$action['fires_min'];
+			} else {
+				if ($action['fires_min'] == 0)
+					$alert_data[1] .= __('Until').' '.$action['fires_max'];
+				else
+					$alert_data[1] .= __('From').' '.$action['fires_min'].
+						' '.__('to').' '.$action['fires_max'];
+			}
+			
+			$alert_data[1] .= ')</em>';
+			$alert_data[1] .= '</span>';
+			$alert_data[1] .= ' <span class="actions" style="visibility: hidden">';
+			$alert_data[1] .= '<span class="delete">';
+			$alert_data[1] .= '<a href="#">';
+			$alert_data[1] .= '<img src="images/cross.png" />';
+			$alert_data[1] .= '</a>';
+			$alert_data[1] .= '</span>';
+			$alert_data[1] .= '</span>';
+			$alert_data[1] .= '</div></li>';
+		}
+		$alert_data[1] .= '</ul>';
+		
+		$alert_data[1] .= '<div class="actions left" style="visibility: hidden; clear: left">';
+		$alert_data[1] .= '<a class="add_action" id="add-action-'.$alert['id'].'" href="#">';
+		$alert_data[1] .= __('Add action');
+		$alert_data[1] .= '</a>';
+		$alert_data[1] .= '</div>';
+		
+		$table_alerts->data['alert-'.$alert['id']] = $alert_data;
 	}
-} 
+	
+	$data[0] .= print_table ($table_alerts, true);
+	array_push ($table->data, $data);
+}
+
+print_table ($table);
+
+/* This hidden value is used in Javascript. It's a workaraound for IE because
+   it doesn't allow input elements creation. */
+print_input_hidden ('add_action', 1);
+print_input_hidden ('id_alert_module', 0);
+
+echo '<form class="add_alert_form" method="post" style="display: none"
+	action="index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&id_agente='.
+	$module['id_agente'].'">';
+echo '<div style="float:left">';
+print_label (__('Template'), 'template');
+$templates = get_alert_templates ();
+if (empty ($templates))
+	$templates = array ();
+print_select ($templates, 'template', '', '', __('None'), 0);
+echo '</div><div style="margin-left: 270px">';
+print_label (__('Action'), 'action');
+$actions = get_alert_actions ();
+if (empty ($actions))
+	$actions = array ();
+print_select ($actions, 'action', '', '', __('None'), 0);
+echo '<br />';
+echo '<span><a href="#" class="show_advanced_actions">'.__('Advanced options').' &raquo; </a></span>';
+echo '<span class="advanced_actions" style="display: none">';
+echo __('From').' ';
+print_input_text ('fires_min', -1, '', 4, 10);
+echo ' '.__('to').' ';
+print_input_text ('fires_max', -1, '', 4, 10);
+echo ' '.__('matches of the alert');
+echo '</span></div>';
+echo '<div style="float: right; margin-left: 30px;"><br />';
+print_submit_button (__('Add'), 'add', false, 'class="sub next"');
+print_input_hidden ('id_agent_module', 0);
+print_input_hidden ('create_alert', 1);
+echo '</div></form>';
 
 ?>
 
+<link rel="stylesheet" href="include/styles/cluetip.css" type="text/css" />
+<script type="text/javascript" src="include/javascript/jquery.cluetip.js"></script>
+
+<script type="text/javascript">
+$(document).ready (function () {
+	$("table#modules tr, table#listing tr").hover (
+		function () {
+			$(".actions", this).css ("visibility", "");
+		},
+		function () {
+			$(".actions", this).css ("visibility", "hidden");
+		}
+	);
+	
+	$("a.add_alert").click (function () {
+		if ($("form.add_alert_form", $(this).parents ("td")).length > 0) {
+			return false;
+		}
+		id = this.id.split ("-").pop ();
+		form = $("form.add_alert_form:last").clone (true);
+		$("input#hidden-id_agent_module", form).attr ("value", id);
+		$(this).parents ("td").append (form);
+		$(form).show ();
+		return false;
+	});
+	
+	$(".add_alert_form").submit (function () {
+		if ($("#template", this).attr ("value") == 0) {
+			return false;
+		}
+		
+		if ($("#action", this).attr ("value") == 0) {
+			return false;
+		}
+		return true;
+	});
+	
+	$("a.show_advanced_actions").click (function () {
+		/* It can be done in two different site, so it must use two different selectors */
+		actions = $(this).parents ("form").children ("span.advanced_actions");
+		if (actions.length == 0)
+			actions = $(this).parents ("div").children ("span.advanced_actions")
+		$("#text-fires_min", actions).attr ("value", 0);
+		$("#text-fires_max", actions).attr ("value", 0);
+		$(actions).show ();
+		$(this).remove ();
+		return false;
+	});
+	
+	$(".actions a.add_action").click (function () {
+		id = this.id.split ("-").pop ();
+		
+		/* Remove new alert form (if shown) to clean a bit the UI */
+		$(this).parents ("td:last").children ("form.add_alert_form")
+			.remove ();
+		
+		/* Replace link with a combo with the actions and a form */
+		a = $("a.show_advanced_actions:first").clone (true);
+		advanced = $("span.advanced_actions:first").clone (true).hide ();
+		select = $("select#action:first").clone ();
+		button = $('<input type="image" class="sub next" value="'+"<?php echo __('Add');?>"+'"></input>');
+		divbutton = $("<div></div>").css ("float", "right").html (button);
+		input1 = $("input#hidden-add_action");
+		input2 = $("input#hidden-id_alert_module").clone ().attr ("value", id);
+		form = $('<form method="post"></form>')
+			.append (select)
+			.append ("<br></br>")
+			.append (a)
+			.append (advanced)
+			.append (divbutton)
+			.append (input1)
+			.append (input2);
+		
+		$(this).parents (".actions:first").replaceWith (form);
+		
+		return false;
+	});
+	
+	$("a.template_details").cluetip ({
+		arrows: true,
+		attribute: 'href',
+		cluetipClass: 'default',
+		fx: { open: 'fadeIn', openSpeed: 'slow' },
+	}).click (function () {
+		return false;
+	});;
+	
+	$("select[name=template]").change (function () {
+		if (this.value == 0) {
+			$(this).parents ("div:first").children ("a").remove ();
+			return;
+		}
+		
+		details = $("a.template_details:first").clone (true)
+			.attr ("href",
+				"ajax.php?page=godmode/alerts/alert_templates&get_template_tooltip=1&id_template=" + this.value);
+		$(this).after (details);
+	});
+});
+</script>
diff --git a/pandora_console/godmode/agentes/configurar_agente.php b/pandora_console/godmode/agentes/configurar_agente.php
index 1b0cc0508b..75dbcc5d7e 100644
--- a/pandora_console/godmode/agentes/configurar_agente.php
+++ b/pandora_console/godmode/agentes/configurar_agente.php
@@ -567,8 +567,8 @@ if (isset($_GET["id_agente"])) {
 		exit;
 	}
 	
-	$row = get_db_row ('tagente', 'id_agente', $id_agente);
-	if (empty ($row)) {
+	$agent = get_db_row ('tagente', 'id_agente', $id_agente);
+	if (empty ($agent)) {
 		//Close out the page
 		echo '<h3 class="error">'.__('There was a problem loading agent').'</h3>';
 		echo '</table></div><div id="foot">';
@@ -577,21 +577,21 @@ if (isset($_GET["id_agente"])) {
 		exit;
 	}
 	
-	$intervalo = $row["intervalo"]; // Define interval in seconds
-	$nombre_agente = $row["nombre"];
-	$direccion_agente = $row["direccion"];
-	$grupo = $row["id_grupo"];
-	$ultima_act = $row["ultimo_contacto"];
-	$comentarios = $row["comentarios"];
-	$id_plugin_server = $row["id_plugin_server"];
-	$id_network_server = $row["id_network_server"];
-	$id_prediction_server = $row["id_prediction_server"];
-	$id_wmi_server = $row["id_wmi_server"];
-	$modo = $row["modo"];
-	$id_os = $row["id_os"];
-	$disabled = $row["disabled"];
-	$id_parent = $row["id_parent"];
-	$custom_id = $row["custom_id"];
+	$intervalo = $agent["intervalo"]; // Define interval in seconds
+	$nombre_agente = $agent["nombre"];
+	$direccion_agente = $agent["direccion"];
+	$grupo = $agent["id_grupo"];
+	$ultima_act = $agent["ultimo_contacto"];
+	$comentarios = $agent["comentarios"];
+	$id_plugin_server = $agent["id_plugin_server"];
+	$id_network_server = $agent["id_network_server"];
+	$id_prediction_server = $agent["id_prediction_server"];
+	$id_wmi_server = $agent["id_wmi_server"];
+	$modo = $agent["modo"];
+	$id_os = $agent["id_os"];
+	$disabled = $agent["disabled"];
+	$id_parent = $agent["id_parent"];
+	$custom_id = $agent["custom_id"];
 }
 
 // Read data module if editing module
@@ -600,28 +600,28 @@ if ((isset ($_GET["update_module"])) && (!isset ($_POST["oid"])) && (!isset ($_P
 	$update_module = 1;
 	$id_agente_modulo = (int) get_parameter_get ("update_module",0);
 
-	$row = get_db_row ('tagente_modulo', 'id_agente_modulo', $id_agente_modulo);
+	$module = get_db_row ('tagente_modulo', 'id_agente_modulo', $id_agente_modulo);
 
-	if ($row === false) {
+	if ($module === false) {
 		echo '<h3 class="error">'.__('There was a problem loading the module').'</h3>';
 	} else {
-		$modulo_id_agente = $row["id_agente"];
-		$modulo_id_tipo_modulo = $row["id_tipo_modulo"];
-		$modulo_nombre = $row["nombre"];
-		$modulo_descripcion = $row["descripcion"];
-		$tcp_send = $row["tcp_send"];
-		$tcp_rcv = $row["tcp_rcv"];
-		$ip_target = $row["ip_target"];
-		$snmp_community = $row["snmp_community"];
-		$snmp_oid = $row["snmp_oid"];
-		$id_module_group = $row["id_module_group"];
-		$module_interval = $row["module_interval"];
-		$modulo_max = $row["max"];
+		$modulo_id_agente = $module["id_agente"];
+		$modulo_id_tipo_modulo = $module["id_tipo_modulo"];
+		$modulo_nombre = $module["nombre"];
+		$modulo_descripcion = $module["descripcion"];
+		$tcp_send = $module["tcp_send"];
+		$tcp_rcv = $module["tcp_rcv"];
+		$ip_target = $module["ip_target"];
+		$snmp_community = $module["snmp_community"];
+		$snmp_oid = $module["snmp_oid"];
+		$id_module_group = $module["id_module_group"];
+		$module_interval = $module["module_interval"];
+		$modulo_max = $module["max"];
 		if (empty ($modulo_max))
 			$modulo_max = "N/A";
 		if (empty ($modulo_min))
 			$modulo_min = "N/A";	
-		$custom_id = $row["custom_id"];
+		$custom_id = $module["custom_id"];
 	}
 }
 
@@ -637,39 +637,39 @@ if (isset ($_GET["update_alert"])) {
 	
 	$update_alert = 1;
 	$id_aam = (int) get_parameter_get ("update_alert",0);
-	$row = get_db_row ('talerta_agente_modulo', 'id_aam', $id_aam);
+	$alert = get_db_row ('talerta_agente_modulo', 'id_aam', $id_aam);
 	
-	if ($row === false) {
+	if ($alert === false) {
 		echo '<h3 class="error">'.__('There was a problem loading the alert').'</h3>';
 	} else {
-		$alerta_id_aam = $row["id_aam"];
-		$alerta_campo1 = $row["al_campo1"];
-		$alerta_campo2 = $row["al_campo2"];
-		$alerta_campo3 = $row["al_campo3"];
-		$alerta_campo2_rec = $row["al_f2_recovery"];
-		$alerta_campo3_rec = $row["al_f3_recovery"];
-		$alerta_dis_max = $row["dis_max"];
-		$alerta_dis_min = $row["dis_min"];
-		$tipo_alerta = $row["id_alerta"];
-		$alert_text = $row["alert_text"];
-		$alerta_max_alerts = $row["max_alerts"];
-		$alerta_min_alerts = $row["min_alerts"];
-		$alerta_time_threshold = $row["time_threshold"];
-		$alerta_descripcion = $row["descripcion"];
-		$alerta_disable = $row["disable"];
-		$time_from = $row["time_from"];
-		$time_to = $row["time_to"];
-		$alerta_id_agentemodulo = $row["id_agente_modulo"]; // Only to show, cannot be changed
-		$alert_id_agent = $row["id_agent"];
-		$alert_d1 = $row["monday"];
-		$alert_d2 = $row["tuesday"];
-		$alert_d3 = $row["wednesday"];
-		$alert_d4 = $row["thursday"];
-		$alert_d5 = $row["friday"];
-		$alert_d6 = $row["saturday"];
-		$alert_d7 = $row["sunday"];
-		$alert_recovery = $row["recovery_notify"];
-		$alert_priority = $row["priority"];
+		$alerta_id_aam = $alert["id_aam"];
+		$alerta_campo1 = $alert["al_campo1"];
+		$alerta_campo2 = $alert["al_campo2"];
+		$alerta_campo3 = $alert["al_campo3"];
+		$alerta_campo2_rec = $alert["al_f2_recovery"];
+		$alerta_campo3_rec = $alert["al_f3_recovery"];
+		$alerta_dis_max = $alert["dis_max"];
+		$alerta_dis_min = $alert["dis_min"];
+		$tipo_alerta = $alert["id_alerta"];
+		$alert_text = $alert["alert_text"];
+		$alerta_max_alerts = $alert["max_alerts"];
+		$alerta_min_alerts = $alert["min_alerts"];
+		$alerta_time_threshold = $alert["time_threshold"];
+		$alerta_descripcion = $alert["descripcion"];
+		$alerta_disable = $alert["disable"];
+		$time_from = $alert["time_from"];
+		$time_to = $alert["time_to"];
+		$alerta_id_agentemodulo = $alert["id_agente_modulo"]; // Only to show, cannot be changed
+		$alert_id_agent = $alert["id_agent"];
+		$alert_d1 = $alert["monday"];
+		$alert_d2 = $alert["tuesday"];
+		$alert_d3 = $alert["wednesday"];
+		$alert_d4 = $alert["thursday"];
+		$alert_d5 = $alert["friday"];
+		$alert_d6 = $alert["saturday"];
+		$alert_d7 = $alert["sunday"];
+		$alert_recovery = $alert["recovery_notify"];
+		$alert_priority = $alert["priority"];
 	}
 }
 
diff --git a/pandora_console/godmode/agentes/manage_config.php b/pandora_console/godmode/agentes/manage_config.php
index ceb71096cd..2e6d702793 100644
--- a/pandora_console/godmode/agentes/manage_config.php
+++ b/pandora_console/godmode/agentes/manage_config.php
@@ -241,9 +241,7 @@ if (isset ($_POST["delete"])) {
 		echo '<h3 class="error">ERROR: '.__('No modules have been selected').'</h3>';
 		return;
 	}
-
-
-	
+		
 	// If selected modules or alerts
 	if (isset($_POST["alerts"])) {
 		$alertas = 1;
@@ -331,7 +329,7 @@ if (isset ($_POST["delete"])) {
 		process_sql ("COMMIT;");
 	}
 	process_sql ("SET AUTOCOMMIT = 1;");
-	return; //Page shouldn't continue anymore															
+	return; //Page shouldn't continue anymore
 } //if $_POST['delete']
 
 // -----------
diff --git a/pandora_console/godmode/agentes/module_manager.php b/pandora_console/godmode/agentes/module_manager.php
index fc2159451f..79adc7f562 100644
--- a/pandora_console/godmode/agentes/module_manager.php
+++ b/pandora_console/godmode/agentes/module_manager.php
@@ -41,22 +41,22 @@ $plugin_available = get_db_value ("plugin_server", "tserver", "plugin_server", "
 $prediction_available = get_db_value ("prediction_server", "tserver", "prediction_server", "1");
 
 // Development mode to use all servers
-if (1 == $develop_bypass) {
-    $network_available = 1;
-    $wmi_available = 1;
-    $plugin_available = 1;
-    $prediction_available = 1;
+if ($develop_bypass) {
+	$network_available = 1;
+	$wmi_available = 1;
+	$plugin_available = 1;
+	$prediction_available = 1;
 }
 
 echo "<option value='dataserver'>".__('Create a new data server module');
 if ($network_available == 1)
-    echo "<option value='networkserver'>".__('Create a new network server module');
+	echo "<option value='networkserver'>".__('Create a new network server module');
 if ($plugin_available == 1)
-    echo "<option value='pluginserver'>".__('Create a new plugin Server module');
+	echo "<option value='pluginserver'>".__('Create a new plugin Server module');
 if ($wmi_available == 1)
-    echo "<option value='wmiserver'>".__('Create a new WMI Server module');
+	echo "<option value='wmiserver'>".__('Create a new WMI Server module');
 if ($prediction_available == 1)
-    echo "<option value='predictionserver'>".__('Create a new prediction Server module');
+	echo "<option value='predictionserver'>".__('Create a new prediction Server module');
 echo "</select></td>";
 echo '<td class="datos">';
 echo '<input align="right" name="updbutton" type="submit" class="sub wand" value="'.__('Create').'">';
@@ -72,93 +72,94 @@ $sql1='SELECT * FROM tagente_modulo WHERE delete_pending = 0 AND id_agente = "'.
 ORDER BY id_module_group, nombre ';
 $result=mysql_query($sql1);
 if ($row=mysql_num_rows($result)){
-    echo '<table width="750" cellpadding="4" cellspacing="4" class="databox">';
-    echo '<tr>';
-    echo "<th>".__('Module name')."</th>";
-    echo '<th>'.__('S').'</th>';
-    echo '<th>'.__('Type').'</th>';
-    echo "<th>".__('Interval')."</th>";
-    echo "<th>".__('Description')."</th>";
-    echo "<th>".__('Max/Min')."</th>";
-    echo "<th width=65>".__('Action')."</th>";
-    $color=1; $last_modulegroup = "0";
-    while ($row = mysql_fetch_array($result)){
-        if ($color == 1){
-            $tdcolor = "datos";
-            $color = 0;
-        } else {
-            $tdcolor = "datos2";
-            $color = 1;
-        }
-        $id_tipo = $row["id_tipo_modulo"];
-        $id_module  = $row["id_modulo"];
-        $nombre_modulo = $row["nombre"];
-        $descripcion = $row["descripcion"];
-        $module_max = $row["max"];
-        $module_min = $row["min"];
-        $module_interval2 = $row["module_interval"];
-        $module_group2 = $row["id_module_group"];
-        if ($module_group2 != $last_modulegroup ){
-            // Render module group names  (fixed code)
-            $nombre_grupomodulo = dame_nombre_grupomodulo ($module_group2);
-            $last_modulegroup = $module_group2;
-            echo "<tr><td class='datos3' align='center' colspan='9'><b>".$nombre_grupomodulo."</b></td></tr>";
-        }
+	echo '<table width="750" cellpadding="4" cellspacing="4" class="databox">';
+	echo '<tr>';
+	echo "<th>".__('Module name')."</th>";
+	echo '<th>'.__('S').'</th>';
+	echo '<th>'.__('Type').'</th>';
+	echo "<th>".__('Interval')."</th>";
+	echo "<th>".__('Description')."</th>";
+	echo "<th>".__('Max/Min')."</th>";
+	echo "<th width=65>".__('Action')."</th>";
+	$color=1; $last_modulegroup = "0";
+	while ($row = mysql_fetch_array($result)){
+		if ($color == 1){
+			$tdcolor = "datos";
+			$color = 0;
+		} else {
+			$tdcolor = "datos2";
+			$color = 1;
+		}
+		$id_tipo = $row["id_tipo_modulo"];
+		$id_module  = $row["id_modulo"];
+		$nombre_modulo = $row["nombre"];
+		$descripcion = $row["descripcion"];
+		$module_max = $row["max"];
+		$module_min = $row["min"];
+		$module_interval2 = $row["module_interval"];
+		$module_group2 = $row["id_module_group"];
+		if ($module_group2 != $last_modulegroup ){
+			// Render module group names  (fixed code)
+			$nombre_grupomodulo = dame_nombre_grupomodulo ($module_group2);
+			$last_modulegroup = $module_group2;
+			echo "<tr><td class='datos3' align='center' colspan='9'><b>".$nombre_grupomodulo."</b></td></tr>";
+		}
 	
-	if ($row["disabled"] == 0)
-        	echo "<tr><td class='".$tdcolor."_id'>".$nombre_modulo."</td>";
-	else
-		echo "<tr><td class='$tdcolor'><i>$nombre_modulo</i></td>";
-        
-        // Module type (by server type )
-        echo "<td class='".$tdcolor."f9'>";
-        if ($id_module > 0) {
-            echo show_server_type ($id_module);
-            echo '&nbsp;';
-        }
+		if ($row["disabled"] == 0)
+			echo "<tr><td class='".$tdcolor."_id'>".$nombre_modulo."</td>";
+		else
+			echo "<tr><td class='$tdcolor'><i>$nombre_modulo</i></td>";
+		
+		// Module type (by server type )
+		echo "<td class='".$tdcolor."f9'>";
+		if ($id_module > 0) {
+			echo show_server_type ($id_module);
+			echo '&nbsp;';
+		}
 
-        // Module type (by data type)
-        echo "<td class='".$tdcolor."f9'>";
-        if ($id_tipo > 0) {
-            echo "<img src='images/".show_icon_type($id_tipo)."' border=0>";
-        }
-        echo "</td>";
+		// Module type (by data type)
+		echo "<td class='".$tdcolor."f9'>";
+		if ($id_tipo > 0) {
+			echo "<img src='images/".show_icon_type($id_tipo)."' border=0>";
+		}
+		echo "</td>";
 
-        // Module interval
-        if ($module_interval2!=0){
-            echo "<td class='$tdcolor'>".$module_interval2."</td>";
-        } else {
-            echo "<td class='$tdcolor'> N/A </td>";
-        }
-        echo "<td class='$tdcolor' title='$descripcion'>".substr($descripcion,0,30)."</td>";
-        
-        // MAX / MIN values
-        echo "<td class='$tdcolor'>";
-            if ($module_max == $module_min) {
-                $module_max = "N/A";
-                $module_min = "N/A";
-            }
-            echo $module_max." / ".$module_min;
-        echo "</td>";
+		// Module interval
+		if ($module_interval2!=0){
+			echo "<td class='$tdcolor'>".$module_interval2."</td>";
+		} else {
+			echo "<td class='$tdcolor'> N/A </td>";
+		}
+		echo "<td class='$tdcolor' title='$descripcion'>".substr($descripcion,0,30)."</td>";
+		
+		// MAX / MIN values
+		echo "<td class='$tdcolor'>";
+			if ($module_max == $module_min) {
+				$module_max = "N/A";
+				$module_min = "N/A";
+			}
+			echo $module_max." / ".$module_min;
+		echo "</td>";
 
-        // Delete module
-        echo "<td class='$tdcolor'>";
-        echo "<a href='index.php?sec=gagente&tab=module&sec2=godmode/agentes/configurar_agente&id_agente=$id_agente&delete_module=".$row["id_agente_modulo"]."'".' onClick="if (!confirm(\' '.__('Are you sure?').'\')) return false;">';
-        echo "<img src='images/cross.png' border=0 title='".__('Delete')."'>";
-        echo "</b></a>&nbsp;";
-	// Update module
-        echo "<a href='index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente=$id_agente&tab=module&update_module=".$row["id_agente_modulo"]."&moduletype=$id_module#modules'>";
-        echo "<img src='images/config.png' border=0 title='".__('Update')."' onLoad='type_change()'></b></a>";
-        
-        // Make a data normalization
-        if (($id_tipo == 22 ) OR ($id_tipo == 1 ) OR ($id_tipo == 4 ) OR ($id_tipo == 7 ) OR
-        ($id_tipo == 8 ) OR ($id_tipo == 11 ) OR ($id_tipo == 16) OR ($id_tipo == 22 )) {
-            echo "&nbsp;";
-            echo "<a href='index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente=$id_agente&tab=module&fix_module=".$row["id_agente_modulo"]."'".' onClick="if (!confirm(\' '.__('Are you sure?').'\')) return false;">';
-            echo "<img src='images/chart_curve.png' border=0 title='Normalize'></b></a>";
-        }
-    }
-    echo "</table>";
-	
-} else
-    echo "<div class='nf'>".__('No available data to show')."</div>";
+		// Delete module
+		echo "<td class='$tdcolor'>";
+		echo "<a href='index.php?sec=gagente&tab=module&sec2=godmode/agentes/configurar_agente&id_agente=$id_agente&delete_module=".$row["id_agente_modulo"]."'".' onClick="if (!confirm(\' '.__('Are you sure?').'\')) return false;">';
+		echo "<img src='images/cross.png' border=0 title='".__('Delete')."'>";
+		echo "</b></a>&nbsp;";
+		// Update module
+		echo "<a href='index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente=$id_agente&tab=module&update_module=".$row["id_agente_modulo"]."&moduletype=$id_module#modules'>";
+		echo "<img src='images/config.png' border=0 title='".__('Update')."' onLoad='type_change()'></b></a>";
+		
+		// Make a data normalization
+		if (($id_tipo == 22) OR ($id_tipo == 1) OR ($id_tipo == 4) OR ($id_tipo == 7) OR
+		($id_tipo == 8) OR ($id_tipo == 11) OR ($id_tipo == 16) OR ($id_tipo == 22)) {
+			echo "&nbsp;";
+			echo "<a href='index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente=$id_agente&tab=module&fix_module=".$row["id_agente_modulo"]."'".' onClick="if (!confirm(\' '.__('Are you sure?').'\')) return false;">';
+			echo "<img src='images/chart_curve.png' border=0 title='Normalize'></b></a>";
+		}
+	}
+	echo "</table>";
+} else {
+	echo "<div class='nf'>".__('No available data to show')."</div>";
+}
+?>
diff --git a/pandora_console/godmode/alerts/alert_actions.php b/pandora_console/godmode/alerts/alert_actions.php
new file mode 100644
index 0000000000..36327cd5c2
--- /dev/null
+++ b/pandora_console/godmode/alerts/alert_actions.php
@@ -0,0 +1,128 @@
+<?php 
+
+// Pandora FMS - the Flexible Monitoring System
+// ============================================
+// Copyright (c) 2008 Artica Soluciones Tecnologicas, http://www.artica.es
+// Please see http://pandora.sourceforge.net for full contribution list
+
+// This program 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 for version 2.
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+// Load global vars
+require_once ("include/config.php");
+require_once ("include/functions_alerts.php");
+
+check_login ();
+
+if (! give_acl ($config['id_user'], 0, "LM")) {
+	audit_db ($config['id_user'], $REMOTE_ADDR, "ACL Violation",
+		"Trying to access Alert actions");
+	require ("general/noaccess.php");
+	exit;
+}
+
+if (defined ('AJAX')) {
+	$get_alert_action = (bool) get_parameter ('get_alert_action');
+	if ($get_alert_action) {
+		$id = (int) get_parameter ('id');
+		$action = get_alert_action ($id);
+		$action['command'] = get_alert_action_alert_command ($action['id']);
+		
+		echo json_encode ($action);
+	}
+	return;
+}
+
+echo '<h1>'.__('Alert actions').'</h1>';
+
+$update_action = (bool) get_parameter ('update_action');
+$create_action = (bool) get_parameter ('create_action');
+$delete_action = (bool) get_parameter ('delete_action');
+
+if ($create_action) {
+	$name = (string) get_parameter ('name');
+	$id_alert_command = (int) get_parameter ('id_command');
+	$field1 = (string) get_parameter ('field1');
+	$field2 = (string) get_parameter ('field2');
+	$field3 = (string) get_parameter ('field3');
+	
+	$result = create_alert_action ($name, $id_alert_command,
+		array ('field1' => $field1,
+			'field2' => $field2,
+			'field3' => $field3));
+	
+	print_error_message ($result, __('Successfully created'),
+		__('Could not be created'));
+}
+
+if ($update_action) {
+	$id = (string) get_parameter ('id');
+	$name = (string) get_parameter ('name');
+	$id_alert_command = (int) get_parameter ('id_command');
+	$field1 = (string) get_parameter ('field1');
+	$field2 = (string) get_parameter ('field2');
+	$field3 = (string) get_parameter ('field3');
+	
+	$result = update_alert_action ($id, $id_alert_command, $name,
+		array ('field1' => $field1,
+			'field2' => $field2,
+			'field3' => $field3));
+	
+	print_error_message ($result, __('Successfully updated'),
+		__('Could not be updated'));
+}
+
+if ($delete_action) {
+	$id = get_parameter ('id');
+	
+	$result = delete_alert_action ($id);
+	
+	print_error_message ($result, __('Successfully deleted'),
+		__('Could not be deleted'));
+}
+
+$table->width = '90%';
+$table->data = array ();
+$table->head = array ();
+$table->head[0] = __('Name');
+$table->head[1] = __('Delete');
+$table->style = array ();
+$table->style[0] = 'font-weight: bold';
+$table->size = array ();
+$table->size[1] = '40px';
+$table->align = array ();
+$table->align[1] = 'center';
+
+$actions = get_db_all_rows_in_table ('talert_actions');
+if ($actions === false)
+	$actions = array ();
+
+foreach ($actions as $action) {
+	$data = array ();
+	
+	$data[0] = '<a href="index.php?sec=galertas&sec2=godmode/alerts/configure_alert_action&id='.$action['id'].'">'.
+		$action['name'].'</a>';
+	$data[1] = '<a href="index.php?sec=galertas&sec2=godmode/alerts/alert_actions&delete_action=1&id='.$action['id'].'"
+		onClick="if (!confirm(\''.__('Are you sure?').'\')) return false;">'.
+		'<img src="images/cross.png"></a>';
+	
+	array_push ($table->data, $data);
+}
+
+print_table ($table);
+
+echo '<div class="action-buttons" style="width: '.$table->width.'">';
+echo '<form method="post" action="index.php?sec=galertas&sec2=godmode/alerts/configure_alert_action">';
+print_submit_button (__('Create'), 'create', false, 'class="sub next"');
+print_input_hidden ('create_alert', 1);
+echo '</form>';
+echo '</div>';
+?>
diff --git a/pandora_console/godmode/alerts/alert_commands.php b/pandora_console/godmode/alerts/alert_commands.php
new file mode 100644
index 0000000000..f5edfa115d
--- /dev/null
+++ b/pandora_console/godmode/alerts/alert_commands.php
@@ -0,0 +1,138 @@
+<?php
+
+// Pandora FMS - the Flexible Monitoring System
+// ============================================
+// Copyright (c) 2008 Artica Soluciones Tecnologicas, http://www.artica.es
+// Please see http://pandora.sourceforge.net for full contribution list
+
+// This program 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 for version 2.
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+// Load global vars
+require_once ("include/config.php");
+require_once ("include/functions_alerts.php");
+
+check_login ();
+
+if (! give_acl ($config['id_user'], 0, "LM")) {
+	audit_db ($config['id_user'], $REMOTE_ADDR, "ACL Violation",
+		"Trying to access Alert Management");
+	require ("general/noaccess.php");
+	exit;
+}
+
+if (defined ('AJAX')) {
+	$get_alert_command = (bool) get_parameter ('get_alert_command');
+	if ($get_alert_command) {
+		$id = (int) get_parameter ('id');
+		$command = get_alert_command ($id);
+		echo json_encode ($command);
+	}
+	return;
+}
+
+echo '<h1>'.__('Alert commands').'</h1>';
+$update_command = (bool) get_parameter ('update_command');
+$create_command = (bool) get_parameter ('create_command');
+$delete_command = (bool) get_parameter ('delete_command');
+
+if ($create_command) {
+	$name = (string) get_parameter ('name');
+	$command = (string) get_parameter ('command');
+	$description = (string) get_parameter ('description');
+	
+	$result = create_alert_command ($name, $command,
+		array ('description' => $description));
+	
+	print_error_message ($result, __('Successfully created'),
+		__('Could not be created'));
+}
+
+if ($update_command) {
+	$id = (int) get_parameter ('id');
+	$alert = get_alert_command ($id);
+	if ($alert['internal']) {
+		audit_db ($config['id_user'], $REMOTE_ADDR, "ACL Violation", "Trying to access Alert Management");
+		require ("general/noaccess.php");
+		exit;
+	}
+	$name = (string) get_parameter ('name');
+	$command = (string) get_parameter ('command');
+	$description = (string) get_parameter ('description');
+	
+	$result = update_alert_command ($id, $name, $command,
+		array ('description' => $description));
+	
+	print_error_message ($result, __('Successfully updated'),
+		__('Could not be updated'));
+}
+
+if ($delete_command) {
+	$id = get_parameter ('id');
+	// Commands below 4 are special and cannot be deleted
+	if ($id < 4) {
+		audit_db ($config['id_user'], $REMOTE_ADDR, "ACL Violation",
+			"Trying to access Alert Management");
+		require ("general/noaccess.php");
+		exit;
+	}
+	
+	$result = delete_alert_command ($id);
+	
+	print_error_message ($result, __('Successfully deleted'),
+		__('Could not be deleted'));
+}
+
+$table->width = '90%';
+$table->data = array ();
+$table->head = array ();
+$table->head[0] = __('Name');
+$table->head[1] = __('Description');
+$table->head[2] = __('Delete');
+$table->style = array ();
+$table->style[0] = 'font-weight: bold';
+$table->size = array ();
+$table->size[2] = '40px';
+$table->align = array ();
+$table->align[2] = 'center';
+
+$commands = get_db_all_rows_in_table ('talert_commands');
+if ($commands === false)
+	$commands = array ();
+
+foreach ($commands as $command) {
+	$data = array ();
+	
+	if (! $command['internal'])
+		$data[0] = '<a href="index.php?sec=galertas&sec2=godmode/alerts/configure_alert_command&id='.$command['id'].'">'.
+			$command['name'].'</a>';
+	else
+		$data[0] = $command['name'];
+	
+	$data[1] = $command['description'];
+	$data[2] = '';
+	if (! $command['internal'])
+		$data[2] = '<a href="index.php?sec=gagente&sec2=godmode/alerts/alert_commands&delete_command=1&id='.$command['id'].'"
+			onClick="if (!confirm(\''.__('Are you sure?').'\')) return false;">'.
+			'<img src="images/cross.png"></a>';
+	
+	array_push ($table->data, $data);
+}
+
+print_table ($table);
+
+echo '<div class="action-buttons" style="width: '.$table->width.'">';
+echo '<form method="post" action="index.php?sec=galertas&sec2=godmode/alerts/configure_alert_command">';
+print_submit_button (__('Create'), 'create', false, 'class="sub next"');
+print_input_hidden ('create_alert', 1);
+echo '</form>';
+echo '</div>';
+?>
diff --git a/pandora_console/godmode/alerts/alert_templates.php b/pandora_console/godmode/alerts/alert_templates.php
new file mode 100644
index 0000000000..4a234b1b3d
--- /dev/null
+++ b/pandora_console/godmode/alerts/alert_templates.php
@@ -0,0 +1,201 @@
+<?php
+
+// Pandora FMS - the Flexible Monitoring System
+// ============================================
+// Copyright (c) 2008 Artica Soluciones Tecnologicas, http://www.artica.es
+// Please see http://pandora.sourceforge.net for full contribution list
+
+// This program 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 for version 2.
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+// Load global vars
+require_once ('include/config.php');
+require_once ('include/functions_alerts.php');
+
+check_login ();
+
+if (! give_acl ($config['id_user'], 0, "LM")) {
+	audit_db ($config['id_user'], $REMOTE_ADDR, "ACL Violation",
+		"Trying to access Alert Management");
+	require ("general/noaccess.php");
+	exit;
+}
+
+
+if (defined ('AJAX')) {
+	$get_template_tooltip = (bool) get_parameter ('get_template_tooltip');
+	
+	if ($get_template_tooltip) {
+		$id_template = (int) get_parameter ('id_template');
+		$template = get_alert_template ($id_template);
+		if ($template === false)
+			return;
+		
+		echo '<h3>'.$template['name'].'</h3>';
+		echo '<strong>'.__('Type').':</strong> '.get_alert_templates_type_name ($template['type']).'<br />';
+		
+		switch ($template['type']) {
+		case 'regex':
+		case 'equal':
+		case 'not_equal':
+			echo '<strong>'.__('Value').':</strong> ';
+			echo '<code>'.$template['value'].'</code>';
+			
+			break;
+		case 'max':
+		case 'max_min':
+			echo '<strong>'.__('Max. value').':</strong> ';
+			echo format_numeric ($template['max_value']);
+			echo '<br />';
+			
+			/* Break on max to not show min */
+			if ($template['type'] == 'max')
+				break;
+		case 'min':
+			echo '<strong>'.__('Min. value').':</strong> ';
+			echo format_numeric ($template['min_value']);
+			echo '<br />';
+		}
+		
+		if ($template['description'] != '') {
+			echo '<strong>'.__('Description').':</strong><br />';
+			echo $template['description'];
+			echo '<br />';
+		}
+		
+		if ($template['monday'] && $template['tuesday']
+			&& $template['wednesday'] && $template['thursday']
+			&& $template['friday'] && $template['saturday']
+			&& $template['sunday']) {
+			
+			/* Everyday */
+			echo '<strong>'.__('Everyday').'</strong><br />';
+		} else {
+			$days = array ('monday' => __('Monday'),
+				'tuesday' => __('Tuesday'),
+				'wednesday' => __('Wednesday'),
+				'thursday' => __('Thursday'),
+				'friday' => __('Friday'),
+				'saturday' => __('Saturday'),
+				'sunday' => __('Sunday'));
+			
+			echo '<strong>'.__('Days').'</strong>: '.__('Every').' ';
+			$actives = array ();
+			foreach ($days as $day => $name) {
+				if ($template[$day])
+					array_push ($actives, $name);
+			}
+			
+			$last = array_pop ($actives);
+			if (count ($actives)) {
+				echo implode (', ', $actives);
+				echo ' '.__('and').' ';
+			}
+			echo $last;
+			
+		}
+		echo '<br />';
+		
+		if ($template['time_from'] != $template['time_to']) {
+			echo '<strong>'.__('From').'</strong> ';
+			echo $template['time_from'];
+			echo ' <strong>'.__('to').'</strong> ';
+			echo $template['time_to'];
+			echo '<br />';
+		}
+		
+		
+		return;
+	}
+	
+	return;
+}
+
+echo '<h1>'.__('Alert templates').'</h1>';
+$update_template = (bool) get_parameter ('update_template');
+$delete_template = (bool) get_parameter ('delete_template');
+
+if ($update_template) {
+	$id = (int) get_parameter ('id');
+	
+	$recovery_notify = (bool) get_parameter ('recovery_notify');
+	$field2_recovery = (bool) get_parameter ('field2_recovery');
+	$field3_recovery = (bool) get_parameter ('field3_recovery');
+	
+	$result = update_alert_template ($id,
+		array ('recovery_notify' => $recovery_notify,
+			'field2_recovery' => $field2_recovery,
+			'field3_recovery' => $field3_recovery));
+	
+	print_error_message ($result, __('Successfully updated'),
+		__('Could not be updated'));
+}
+
+if ($delete_template) {
+	$id = get_parameter ('id');
+	// Templates below 4 are special and cannot be deleted
+	if ($id < 4) {
+		audit_db ($config['id_user'], $REMOTE_ADDR, "ACL Violation",
+			"Trying to access Alert Management");
+		require ("general/noaccess.php");
+		exit;
+	}
+	
+	$result = delete_alert_template ($id);
+	
+	print_error_message ($result, __('Successfully deleted'),
+		__('Could not be deleted'));
+}
+
+$table->width = '90%';
+$table->data = array ();
+$table->head = array ();
+$table->head[0] = __('Name');
+$table->head[1] = __('Description');
+$table->head[2] = __('Type');
+$table->head[3] = __('Delete');
+$table->style = array ();
+$table->style[0] = 'font-weight: bold';
+$table->size = array ();
+$table->size[2] = '10%';
+$table->size[3] = '40px';
+$table->align = array ();
+$table->align[3] = 'center';
+
+$templates = get_alert_templates (false);
+if ($templates === false)
+	$templates = array ();
+
+foreach ($templates as $template) {
+	$data = array ();
+	
+	$data[0] = '<a href="index.php?sec=galertas&sec2=godmode/alerts/configure_alert_template&id='.$template['id'].'">'.
+		$template['name'].'</a>';
+	
+	$data[1] = $template['description'];
+	$data[2] = get_alert_templates_type_name ($template['type']);
+	$data[3] = '<a href="index.php?sec=gagente&sec2=godmode/alerts/alert_templates&delete_template=1&id='.$template['id'].'"
+		onClick="if (!confirm(\''.__('Are you sure?').'\')) return false;">'.
+		'<img src="images/cross.png"></a>';
+	
+	array_push ($table->data, $data);
+}
+
+print_table ($table);
+
+echo '<div class="action-buttons" style="width: '.$table->width.'">';
+echo '<form method="post" action="index.php?sec=galertas&sec2=godmode/alerts/configure_alert_template">';
+print_submit_button (__('Create'), 'create', false, 'class="sub next"');
+print_input_hidden ('create_alert', 1);
+echo '</form>';
+echo '</div>';
+
+?>
diff --git a/pandora_console/godmode/alerts/configure_alert.php b/pandora_console/godmode/alerts/configure_alert.php
index eeaf5675b2..4a03588b9a 100644
--- a/pandora_console/godmode/alerts/configure_alert.php
+++ b/pandora_console/godmode/alerts/configure_alert.php
@@ -28,40 +28,40 @@ if (! give_acl ($config['id_user'], 0, "LM")) {
 	require ("general/noaccess.php");
 	exit;
 }
-	// Var init
-	$descripcion = "";
-	$nombre = "";
-	$comando ="";
-	
-	if (isset($_GET["id_alerta"])){
-		$id_alerta = entrada_limpia($_GET["id_alerta"]);
-		$sql1='SELECT * FROM talerta WHERE id_alerta = '.$id_alerta;
-		$result=mysql_query($sql1);
-		if ($row=mysql_fetch_array($result)){
-			$descripcion = $row["descripcion"];
-			$nombre= $row["nombre"];
-			$comando = $row["comando"];
-		} else
-			{
-			echo "<h3 class='error'>".__('There was a problem loading alert')."</h3>";
-			echo "</table>";
-			include ("general/footer.php");
-			exit;
-		}
-	}
-	
-	$creacion_alerta = 0;
-	if (isset($_GET["creacion"])){
-		$creacion_alerta = 1;
+// Var init
+$descripcion = "";
+$nombre = "";
+$comando ="";
+
+if (isset($_GET["id_alerta"])){
+	$id_alerta = entrada_limpia($_GET["id_alerta"]);
+	$sql1='SELECT * FROM talerta WHERE id_alerta = '.$id_alerta;
+	$result=mysql_query($sql1);
+	if ($row=mysql_fetch_array($result)){
+		$descripcion = $row["descripcion"];
+		$nombre= $row["nombre"];
+		$comando = $row["comando"];
+	} else
+		{
+		echo "<h3 class='error'>".__('There was a problem loading alert')."</h3>";
+		echo "</table>";
+		include ("general/footer.php");
+		exit;
 	}
+}
+
+$creacion_alerta = 0;
+if (isset($_GET["creacion"])){
+	$creacion_alerta = 1;
+}
 	
 echo "<h2>".__('Alert configuration')." &gt; ";
-	if (isset($_GET["creacion"])){
-		echo __('Create alert');
-	}
-	if (isset($_GET["id_alerta"])){
-		echo __('Modify alert');
-	}
+if (isset($_GET["creacion"])){
+	echo __('Create alert');
+}
+if (isset($_GET["id_alerta"])){
+	echo __('Modify alert');
+}
 pandora_help ("manage_alerts");
 echo "</h2>";
  ?>
diff --git a/pandora_console/godmode/alerts/configure_alert_action.php b/pandora_console/godmode/alerts/configure_alert_action.php
new file mode 100644
index 0000000000..c370b146e9
--- /dev/null
+++ b/pandora_console/godmode/alerts/configure_alert_action.php
@@ -0,0 +1,121 @@
+<?php 
+
+// Pandora FMS - the Flexible Monitoring System
+// ============================================
+// Copyright (c) 2008 Artica Soluciones Tecnologicas, http://www.artica.es
+// Please see http://pandora.sourceforge.net for full contribution list
+
+// This program 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 for version 2.
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+// Load global vars
+require_once ('include/config.php');
+require_once ('include/functions_alerts.php');
+
+check_login ();
+
+if (! give_acl ($config['id_user'], 0, "LM")) {
+	audit_db ($config['id_user'], $REMOTE_ADDR, "ACL Violation",
+		"Trying to access Alert Management");
+	require ("general/noaccess.php");
+	exit;
+}
+
+$id = (int) get_parameter ('id');
+
+$name = '';
+$id_command = '';
+$field1 = '';
+$field2 = '';
+$field3 = '';
+if ($id) {
+	$action = get_alert_action ($id);
+	$name = $action['name'];
+	$id_command = $action['id_alert_command'];
+	$field1 = $action['field1'];
+	$field2 = $action['field2'];
+	$field3 = $action['field3'];
+}
+
+echo '<h1>'.__('Configure alert action').'</h1>';
+
+$table->width = '90%';
+$table->style = array ();
+$table->style[0] = 'font-weight: bold';
+$table->size = array ();
+$table->size[0] = '20%';
+$table->data = array ();
+$table->data[0][0] = __('Name');
+$table->data[0][1] = print_input_text ('name', $name, '', 35, 255, true);
+
+$table->data[1][0] = __('Command');
+$table->data[1][1] = print_select_from_sql ('SELECT id, name FROM talert_commands',
+	'id_command', $id_command, '', __('None'), 0, true);
+
+$table->data[2][0] = __('Field 1');
+$table->data[2][1] = print_input_text ('field1', $field1, '', 35, 255, true);
+
+$table->data[3][0] = __('Field 2');
+$table->data[3][1] = print_input_text ('field2', $field2, '', 35, 255, true);
+
+$table->data[4][0] = __('Field 3');
+$table->data[4][1] = print_textarea ('field3', 30, 30, $field3, '', true);
+
+$table->data[6][0] = __('Command preview');
+$table->data[6][1] = print_textarea ('command_preview', 30, 30, '', 'disabled="disabled"', true);
+
+echo '<form method="post" action="index.php?sec=galertas&sec2=godmode/alerts/alert_actions">';
+print_table ($table);
+
+echo '<div class="action-buttons" style="width: '.$table->width.'">';
+if ($id) {
+	print_input_hidden ('id', $id);
+	print_input_hidden ('update_action', 1);
+	print_submit_button (__('Update'), 'create', false, 'class="sub upd"');
+} else {
+	print_input_hidden ('create_action', 1);
+	print_submit_button (__('Create'), 'create', false, 'class="sub next"');
+}
+echo '</div>';
+echo '</form>';
+?>
+
+<script type="text/javascript" src="include/javascript/pandora_alerts.js"></script>
+
+<script type="text/javascript">
+$(document).ready (function () {
+<?php if ($id_command) : ?>
+	original_command = "<?php echo get_alert_command_command ($id_command); ?>";
+	render_command_preview ();
+<?php endif; ?>
+	$("#id_command").change (function () {
+		values = Array ();
+		values.push ({name: "page",
+			value: "godmode/alerts/alert_commands"});
+		values.push ({name: "get_alert_command",
+			value: "1"});
+		values.push ({name: "id",
+			value: this.value});
+		jQuery.get ("ajax.php",
+			values,
+			function (data, status) {
+				original_command = html_entity_decode (data["command"]);
+				render_command_preview (original_command);
+			},
+			"json"
+		);
+	});
+	
+	$("#text-field1").keyup (render_command_preview);
+	$("#text-field2").keyup (render_command_preview);
+	$("#text-field3").keyup (render_command_preview);
+});
+</script>
diff --git a/pandora_console/godmode/alerts/configure_alert_command.php b/pandora_console/godmode/alerts/configure_alert_command.php
new file mode 100644
index 0000000000..7510f7b2c0
--- /dev/null
+++ b/pandora_console/godmode/alerts/configure_alert_command.php
@@ -0,0 +1,73 @@
+<?php 
+
+// Pandora FMS - the Flexible Monitoring System
+// ============================================
+// Copyright (c) 2008 Artica Soluciones Tecnologicas, http://www.artica.es
+// Please see http://pandora.sourceforge.net for full contribution list
+
+// This program 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 for version 2.
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+// Load global vars
+require_once ("include/config.php");
+require_once ("include/functions_alerts.php");
+
+check_login ();
+
+if (! give_acl ($config['id_user'], 0, "LM")) {
+	audit_db ($config['id_user'], $REMOTE_ADDR, "ACL Violation",
+		"Trying to access Alert Management");
+	require ("general/noaccess.php");
+	exit;
+}
+
+$id = (int) get_parameter ('id');
+
+$name = '';
+$command = '';
+$description = '';
+if ($id) {
+	$alert = get_alert_command ($id);
+	$name = $alert['name'];
+	$command = $alert['command'];
+	$description = $alert['description'];
+}
+
+echo '<h1>'.__('Configure alert command').'</h1>';
+
+$table->width = '90%';
+$table->style = array ();
+$table->style[0] = 'font-weight: bold';
+$table->size = array ();
+$table->size[0] = '20%';
+$table->data = array ();
+$table->data[0][0] = __('Name');
+$table->data[0][1] = print_input_text ('name', $name, '', 35, 255, true);
+$table->data[1][0] = __('Command');
+$table->data[1][1] = print_input_text ('command', $command, '', 35, 255, true);
+$table->data[2][0] = __('Description');
+$table->data[2][1] = print_textarea ('description', 30, 30, $description, '', true);
+
+echo '<form method="post" action="index.php?sec=galertas&sec2=godmode/alerts/alert_commands">';
+print_table ($table);
+
+echo '<div class="action-buttons" style="width: '.$table->width.'">';
+if ($id) {
+	print_input_hidden ('id', $id);
+	print_input_hidden ('update_command', 1);
+	print_submit_button (__('Update'), 'create', false, 'class="sub upd"');
+} else {
+	print_input_hidden ('create_command', 1);
+	print_submit_button (__('Create'), 'create', false, 'class="sub next"');
+}
+echo '</div>';
+echo '</form>';
+?>
diff --git a/pandora_console/godmode/alerts/configure_alert_template.php b/pandora_console/godmode/alerts/configure_alert_template.php
new file mode 100644
index 0000000000..2f00062ad7
--- /dev/null
+++ b/pandora_console/godmode/alerts/configure_alert_template.php
@@ -0,0 +1,590 @@
+<?php 
+
+// Pandora FMS - the Flexible Monitoring System
+// ============================================
+// Copyright (c) 2008 Artica Soluciones Tecnologicas, http://www.artica.es
+// Please see http://pandora.sourceforge.net for full contribution list
+
+// This program 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 for version 2.
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+// Load global vars
+require_once ('include/config.php');
+require_once ('include/functions_alerts.php');
+
+check_login ();
+
+if (! give_acl ($config['id_user'], 0, "LM")) {
+	audit_db ($config['id_user'], $REMOTE_ADDR, "ACL Violation",
+		"Trying to access Alert Management");
+	require ("general/noaccess.php");
+	exit;
+}
+
+function print_alert_template_steps ($step, $id) {
+	echo '<div style="margin-bottom: 15px">';
+	
+	/* Step 1 */
+	if ($step == 1)
+		echo '<strong>';
+	if ($id) {
+		echo '<a href="index.php?sec=galertas&sec2=godmode/alerts/configure_alert_template&id='.$id.'">';
+		echo __('Step').' 1 : '.__('Conditions');
+		echo '</a>';
+	} else {
+		echo __('Step').' 1 : '.__('Conditions');
+	}
+	if ($step == 1)
+		echo '</strong>';
+	
+	/* Step 2 */
+	echo ' &raquo; ';
+	
+	if ($step == 2)
+		echo '<strong>';
+	if ($id) {
+		echo '<a href="index.php?sec=galertas&sec2=godmode/alerts/configure_alert_template&id='.$id.'&step=2">';
+		echo __('Step').' 2 : '.__('Firing');
+		echo '</a>';
+	} else {
+		echo __('Step').' 2 : '.__('Firing');
+	}
+	if ($step == 2)
+		echo '</strong>';
+	
+	/* Step 3 */
+	echo ' &raquo; ';
+	
+	if ($step == 3)
+		echo '<strong>';
+	if ($id) {
+		echo '<a href="index.php?sec=galertas&sec2=godmode/alerts/configure_alert_template&id='.$id.'&step=3">';
+		echo __('Step').' 3 : '.__('Recovery');
+		echo '</a>';
+	} else {
+		echo __('Step').' 3 : '.__('Recovery');
+	}
+	if ($step == 3)
+		echo '</strong>';
+	
+	echo '</div>';
+}
+
+function update_template ($step) {
+	$id = (int) get_parameter ('id');
+	
+	if (empty ($id))
+		return false;
+	
+	if ($step == 1) {
+		$type = (string) get_parameter ('type');
+		$name = (string) get_parameter ('name');
+		$description = (string) get_parameter ('description');
+		$type = (string) get_parameter ('type');
+		$value = (string) get_parameter ('value');
+		$max = (float) get_parameter ('max');
+		$min = (float) get_parameter ('min');
+		
+		$result = update_alert_template ($id,
+			array ('type' => $type,
+				'description' => $description,
+				'value' => $value,
+				'max_value' => $max,
+				'min_value' => $min));
+	} elseif ($step == 2) {
+		$monday = (bool) get_parameter ('monday');
+		$tuesday = (bool) get_parameter ('tuesday');
+		$wednesday = (bool) get_parameter ('wednesday');
+		$thursday = (bool) get_parameter ('thursday');
+		$friday = (bool) get_parameter ('friday');
+		$saturday = (bool) get_parameter ('saturday');
+		$sunday = (bool) get_parameter ('sunday');
+		$time_from = (string) get_parameter ('time_from');
+		$time_from = date ("H:s:00", strtotime ($time_from));
+		$time_to = (string) get_parameter ('time_to');
+		$time_to = date ("H:s:00", strtotime ($time_to));
+		$threshold = (int) get_parameter ('threshold');
+		if ($threshold == -1)
+			$threshold = (int) get_parameter ('other_threshold');
+		$field1 = (string) get_parameter ('field1');
+		$field2 = (string) get_parameter ('field2');
+		$field3 = (string) get_parameter ('field3');
+		$default_action = (int) get_parameter ('default_action');
+		if (empty ($default_action)) {
+			$default_action = NULL;
+			$field1 = '';
+			$field2 = '';
+			$field3 = '';
+		}
+		
+		$values = array ('monday' => $monday,
+			'tuesday' => $tuesday,
+			'wednesday' => $wednesday,
+			'thursday' => $thursday,
+			'friday' => $friday,
+			'saturday' => $saturday,
+			'sunday' => $sunday,
+			'time_from' => $time_from,
+			'time_to' => $time_to,
+			'time_threshold' => $threshold,
+			'default_action' => $default_action,
+			'field1' => $field1,
+			'field2' => $field2,
+			'field3' => $field3
+			);
+		
+		if ($default_action) {
+			$values['id_alert_action'] = $default_action;
+			$values['field1'] = $field1;
+			$values['field2'] = $field2;
+			$values['field3'] = $field3;
+		}
+		
+		$result = update_alert_template ($id, $values);
+	} elseif ($step == 3) {
+		$recovery_notify = (bool) get_parameter ('recovery_notify');
+		$field2_recovery = (bool) get_parameter ('field2_recovery');
+		$field3_recovery = (bool) get_parameter ('field3_recovery');
+	
+		$result = update_alert_template ($id,
+			array ('recovery_notify' => $recovery_notify,
+				'field2_recovery' => $field2_recovery,
+				'field3_recovery' => $field3_recovery));
+	} else {
+		return false;
+	}
+	
+	return $result;
+}
+
+$id = (int) get_parameter ('id');
+
+/* We set here the number of steps */
+define ('LAST_STEP', 3);
+
+$step = (int) get_parameter ('step', 1);
+
+$create_template = (bool) get_parameter ('create_template');
+$update_template = (bool) get_parameter ('update_template');
+
+$name = '';
+$description = '';
+$type = '';
+$value = '';
+$max = '';
+$min = '';
+$time_from = '12:00';
+$time_to = '12:00';
+$monday = true;
+$tuesday = true;
+$wednesday = true;
+$thursday = true;
+$friday = true;
+$saturday = true;
+$sunday = true;
+$default_action = 0;
+$field1 = '';
+$field2 = '';
+$field3 = '';
+$min_alerts = 0;
+$max_alerts = 1;
+$threshold = 300;
+$recovery_notify = false;
+$field2_recovery = '';
+$field3_recovery = '';
+
+if ($create_template) {
+	$name = (string) get_parameter ('name');
+	$description = (string) get_parameter ('description');
+	$type = (string) get_parameter ('type');
+	$value = (string) get_parameter ('value');
+	$max = (float) get_parameter ('max');
+	$min = (float) get_parameter ('min');
+	
+	$result = create_alert_template ($name, $type,
+		array ('description' => $description,
+			'value' => $value,
+			'max' => $max,
+			'min' => $min));
+	
+	print_error_message ($result, __('Successfully created'),
+		__('Could not be created'));
+	/* Go to previous step in case of error */
+	if ($result === false)
+		$step = $step - 1;
+}
+
+if ($update_template) {
+	$result = update_template ($step - 1);
+	
+	print_error_message ($result, __('Successfully updated'),
+		__('Could not be updated'));
+	/* Go to previous step in case of error */
+	if ($result === false) {
+		$step = $step - 1;
+	}
+}
+
+if ($id) {
+	$template = get_alert_template ($id);
+	$name = $template['name'];
+	$description = $template['description'];
+	$type = $template['type'];
+	$value = $template['value'];
+	$max = $template['max_value'];
+	$min = $template['min_value'];
+	$time_from = $template['time_from'];
+	$time_to = $template['time_to'];
+	$monday = (bool) $template['monday'];
+	$tuesday = (bool) $template['tuesday'];
+	$wednesday = (bool) $template['wednesday'];
+	$thursday = (bool) $template['thursday'];
+	$friday = (bool) $template['friday'];
+	$saturday = (bool) $template['saturday'];
+	$sunday = (bool) $template['sunday'];
+	$max_alerts = $template['max_alerts'];
+	$min_alerts = $template['min_alerts'];
+	$threshold = $template['time_threshold'];
+	$recovery_notify = $template['recovery_notify'];
+	$field2_recovery = $template['field2_recovery'];
+	$field3_recovery = $template['field3_recovery'];
+	$default_action = $template['id_alert_action'];
+	$field1 = $template['field1'];
+	$field2 = $template['field2'];
+	$field3 = $template['field3'];
+}
+
+echo '<h1>'.__('Configure alert template').'</h1>';
+
+print_alert_template_steps ($step, $id);
+
+$table->id = 'template';
+$table->width = '90%';
+$table->style = array ();
+$table->style[0] = 'font-weight: bold';
+$table->style[2] = 'font-weight: bold';
+$table->size = array ();
+$table->size[0] = '20%';
+$table->size[2] = '20%';
+
+if ($step == 2) {
+	/* Firing conditions and events */
+	$threshold_values = get_alert_template_threshold_values ();
+	if (in_array ($threshold, array_keys ($threshold_values))) {
+		$table->style['other_label'] = 'display:none; font-weight: bold';
+		$table->style['other_input'] = 'display:none';
+		$threshold_selected = $threshold;
+	} else {
+		$table->style['other_label'] = 'font-weight: bold';
+		$threshold_selected = -1;
+	}
+	
+	if ($default_action == 0) {
+		$table->rowstyle = array ();
+		$table->rowstyle['field1'] = 'display: none';
+		$table->rowstyle['field2'] = 'display: none';
+		$table->rowstyle['field3'] = 'display: none';
+		$table->rowstyle['preview'] = 'display: none';
+	}
+	$table->colspan = array ();
+	$table->colspan[0][1] = 3;
+	$table->colspan[4][1] = 3;
+	$table->colspan['field1'][1] = 3;
+	$table->colspan['field2'][1] = 3;
+	$table->colspan['field3'][1] = 3;
+	$table->colspan['preview'][1] = 3;
+	
+	$table->data[0][0] = __('Days of week');
+	$table->data[0][1] = __('Mon');
+	$table->data[0][1] .= print_checkbox ('monday', 1, $monday, true);
+	$table->data[0][1] .= __('Tue');
+	$table->data[0][1] .= print_checkbox ('tuesday', 1, $tuesday, true);
+	$table->data[0][1] .= __('Wed');
+	$table->data[0][1] .= print_checkbox ('wednesday', 1, $wednesday, true);
+	$table->data[0][1] .= __('Thu');
+	$table->data[0][1] .= print_checkbox ('thursday', 1, $thursday, true);
+	$table->data[0][1] .= __('Fri');
+	$table->data[0][1] .= print_checkbox ('friday', 1, $friday, true);
+	$table->data[0][1] .= __('Sat');
+	$table->data[0][1] .= print_checkbox ('saturday', 1, $saturday, true);
+	$table->data[0][1] .= __('Sun');
+	$table->data[0][1] .= print_checkbox ('sunday', 1, $sunday, true);
+	
+	$table->data[1][0] = __('Time from');
+	$table->data[1][1] = print_input_text ('time_from', $time_from, '', 7, 7,
+		true);
+	$table->data[1][2] = __('Time to');
+	$table->data[1][3] = print_input_text ('time_to', $time_to, '', 7, 7,
+		true);
+	
+	$table->data['threshold'][0] = __('Time threshold');
+	$table->data['threshold'][1] = print_select ($threshold_values,
+		'threshold', $threshold_selected, '', '', '', true, false, false);
+	$table->data['threshold']['other_label'] = __('Other value');
+	$table->data['threshold']['other_input'] = print_input_text ('other_threshold',
+		$threshold, '', 5, 7, true);
+	$table->data['threshold']['other_input'] .= ' '.__('seconds');
+	
+	$table->data[3][0] = __('Min. number of alerts');
+	$table->data[3][1] = print_input_text ('min_alerts', $min_alerts, '',
+		5, 7, true);
+	$table->data[3][2] = __('Max. number of alerts');
+	$table->data[3][3] = print_input_text ('max_alerts', $max_alerts, '',
+		5, 7, true);
+	
+	$table->data[4][0] = __('Default action');
+	$table->data[4][1] = print_select_from_sql ('SELECT id, name FROM talert_actions ORDER BY name',
+		'default_action', $default_action, '', __('None'), 0,
+		true, false, false);
+	
+	$table->data['field1'][0] = __('Field 1');
+	$table->data['field1'][1] = print_input_text ('field1', $field1, '', 35, 255, true);
+	
+	$table->data['field2'][0] = __('Field 2');
+	$table->data['field2'][1] = print_input_text ('field2', $field2, '', 35, 255, true);
+	
+	$table->data['field3'][0] = __('Field 3');
+	$table->data['field3'][1] = print_textarea ('field3', 30, 30, $field3, '', true);
+	
+	$table->data['preview'][0] = __('Command preview');
+	$table->data['preview'][1] = print_textarea ('command_preview', 30, 30,
+		'', 'disabled="disabled"', true);
+} else if ($step == 3) {
+	/* Alert recover */
+	if (! $recovery_notify) {
+		$table->rowstyle = array ();
+		$table->rowstyle['field2'] = 'display:none;';
+		$table->rowstyle['field3'] = 'display:none';
+	}
+	$table->data[0][0] = __('Alert recovery');
+	$values = array (false => __('Disabled'), true => __('Enabled'));
+	$table->data[0][1] = print_select ($values,
+		'recovery_notify', $recovery_notify, '', '', '', true, false,
+		false);
+	
+	$table->data['field2'][0] = __('Field 2');
+	$table->data['field2'][1] = print_input_text ('field2_recovery',
+		$field2_recovery, '', 35, 255, true);
+	
+	$table->data['field3'][0] = __('Field 3');
+	$table->data['field3'][1] = print_textarea ('field3_recovery', 30, 30,
+		$field3_recovery, '', true);
+} else {
+	/* Step 1 by default */
+	$table->size = array ();
+	$table->size[0] = '20%';
+	$table->data = array ();
+	$table->rowstyle = array ();
+	$table->rowstyle['value'] = 'display: none';
+	$table->rowstyle['max'] = 'display: none';
+	$table->rowstyle['min'] = 'display: none';
+	
+	if ($id) {
+		switch ($type) {
+		case "equal":
+		case "not_equal":
+		case "regex":
+			$table->rowstyle['value'] = '';
+			break;
+		case "max_min":
+		case "max":
+			$table->rowstyle['max'] = '';
+			if ($type == 'max')
+				break;
+		case "min":
+			$table->rowstyle['min'] = '';
+			break;
+		}
+	}
+
+	$table->data[0][0] = __('Name');
+	$table->data[0][1] = print_input_text ('name', $name, '', 35, 255, true);
+
+	$table->data[1][0] = __('Description');
+	$table->data[1][1] =  print_textarea ('description', 30, 30,
+		$description, '', true);
+
+	$table->data[2][0] = __('Condition type');
+	$table->data[2][1] = print_select (get_alert_templates_types (), 'type',
+		$type, '', __('Select'), 0, true, false, false);
+
+	$table->data['value'][0] = __('Value');
+	$table->data['value'][1] = print_input_text ('value', $value, '',
+		35, 255, true);
+	$table->data['value'][1] .= '<span id="regex_ok">';
+	$table->data['value'][1] .= print_image ('images/suc.png', true,
+		array ('style' => 'display:none',
+			'id' => 'regex_good',
+			'title' => __('The regular expression is valid')));
+	$table->data['value'][1] .= print_image ('images/err.png', true,
+		array ('style' => 'display:none',
+			'id' => 'regex_bad',
+			'title' => __('The regular expression is not valid')));
+	$table->data['value'][1] .= '</span>';
+
+	$table->data['max'][0] = __('Max');
+	$table->data['max'][1] = print_input_text ('max', $max, '', 5, 255, true);
+
+	$table->data['min'][0] = __('Min');
+	$table->data['min'][1] = print_input_text ('min', $min, '', 5, 255, true);
+}
+
+/* If it's the last step it will redirect to template lists */
+if ($step >= LAST_STEP) {
+	echo '<form method="post" action="index.php?sec=galertas&sec2=godmode/alerts/alert_templates">';
+} else {
+	echo '<form method="post">';
+}
+print_table ($table);
+
+echo '<div class="action-buttons" style="width: '.$table->width.'">';
+if ($id) {
+	print_input_hidden ('id', $id);
+	print_input_hidden ('update_template', 1);
+} else {
+	print_input_hidden ('create_template', 1);
+}
+
+if ($step >= LAST_STEP) {
+	print_submit_button (__('Finish'), 'finish', false, 'class="sub upd"');
+} else {
+	print_input_hidden ('step', $step + 1);
+	print_submit_button (__('Next'), 'next', false, 'class="sub next"');
+}
+echo '</div>';
+echo '</form>';
+?>
+
+<script type="text/javascript" src="include/javascript/pandora_alerts.js"></script>
+<link rel="stylesheet" href="include/styles/timeentry.css" type="text/css" media="screen">
+<script src="include/javascript/jquery.ui.core.js"></script>
+<script src="include/javascript/jquery.timeentry.js"></script>
+<script src="include/languages/time_<?php echo $config['language']; ?>.js"></script>
+
+<script type="text/javascript">
+function check_regex () {
+	if ($("#type").attr ('value') != 'regex') {
+		$("img#regex_good, img#regex_bad").hide ();
+		return;
+	}
+	
+	try {
+		re = new RegExp ($("#text-value").attr ("value"));
+	} catch (error) {
+		$("img#regex_good").hide ();
+		$("img#regex_bad").show ();
+		return;
+	}
+	$("img#regex_bad").hide ();
+	$("img#regex_good").show ();
+}
+
+$(document).ready (function () {
+	$("#text-time_from, #text-time_to").timeEntry ({
+		spinnerImage: 'images/time-entry.png',
+		spinnerSize: [20, 20, 0]
+		}
+	);
+	
+	$("#type").change (function () {
+		switch (this.value) {
+		case "equal":
+		case "not_equal":
+			$("img#regex_good, img#regex_bad").hide ();
+		case "regex":
+			$("#template-max, #template-min").fadeOut ('normal',
+				function () {
+					$("#template-value").fadeIn ();
+					check_regex ();
+				}
+			);
+			break;
+		case "max_min":
+			$("#template-value").fadeOut ('normal',
+				function () {
+					$("#template-max").fadeIn ();
+					$("#template-min").fadeIn ();
+				}
+			);
+			break;
+		case "max":
+			$("#template-value, #template-min").fadeOut ('normal',
+				function () {
+					$("#template-max").fadeIn ();
+				}
+			);
+			break;
+		case "min":
+			$("#template-value, #template-max").fadeOut ('normal',
+				function () {
+					$("#template-min").fadeIn ();
+				}
+			);
+			break;
+		default:
+			$("#template-value, #template-max, #template-min").fadeOut ();
+			break;
+		}
+	});
+	
+	$("#text-value").keyup (check_regex);
+	$("#threshold").change (function () {
+		if (this.value == -1) {
+			$("#text-other_threshold").attr ("value", "");
+			$("#template-threshold-other_label").fadeIn ();
+			$("#template-threshold-other_input").fadeIn ();
+		} else {
+			$("#template-threshold-other_label").fadeOut ();
+			$("#template-threshold-other_input").fadeOut ();
+		}
+	});
+	
+	$("#recovery_notify").change (function () {
+		if (this.value == 1) {
+			$("#template-field2, #template-field3").fadeIn ();
+		} else {
+			$("#template-field2, #template-field3").fadeOut ();
+		}
+	});
+	
+	$("#default_action").change (function () {
+		if (this.value != 0) {
+			values = Array ();
+			values.push ({name: "page",
+				value: "godmode/alerts/alert_actions"});
+			values.push ({name: "get_alert_action",
+				value: "1"});
+			values.push ({name: "id",
+				value: this.value});
+			jQuery.get ("ajax.php",
+				values,
+				function (data) {
+					$("#text-field1").attr ("value", data["field1"]);
+					$("#text-field2").attr ("value", data["field2"]);
+					$("#text-field3").attr ("value", data["field3"]);
+					original_command = html_entity_decode (data["command"]["command"]);
+					render_command_preview ();
+					
+					$("#template-field1, #template-field2, #template-field3, #template-preview")
+						.fadeIn ();
+				},
+				"json"
+			);
+		} else {
+			$("#template-field1, #template-field2, #template-field3, #template-preview").fadeOut ();
+		}
+	});
+	
+	$("#text-field1").keyup (render_command_preview);
+	$("#text-field2").keyup (render_command_preview);
+	$("#text-field3").keyup (render_command_preview);
+})
+</script>
diff --git a/pandora_console/godmode/alerts/modify_alert.php b/pandora_console/godmode/alerts/modify_alert.php
deleted file mode 100644
index 0cf1d24b7b..0000000000
--- a/pandora_console/godmode/alerts/modify_alert.php
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-
-// Pandora FMS - the Flexible Monitoring System
-// ============================================
-// Copyright (c) 2008 Artica Soluciones Tecnologicas, http://www.artica.es
-// Please see http://pandora.sourceforge.net for full contribution list
-
-// This program 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 for version 2.
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-
-
-// Load global vars
-require_once ("include/config.php");
-
-check_login ();
-
-if (! give_acl ($config['id_user'], 0, "LM")) {
-	audit_db ($config['id_user'], $REMOTE_ADDR, "ACL Violation",
-		"Trying to access Alert Management");
-	require ("general/noaccess.php");
-	exit;
-}
-if (isset($_POST["update_alerta"])){ // if modified any parameter
-	$id_alerta = entrada_limpia($_POST["id_alerta"]);
-	if ($id_alerta < 4){
-		audit_db ($config['id_user'], $REMOTE_ADDR, "ACL Violation", "Trying to access Alert Management");
-		require ("general/noaccess.php");
-		exit;
-	}
-	$nombre =  entrada_limpia($_POST["nombre"]);
-	$comando =  entrada_limpia($_POST["comando"]);
-	$descripcion=  entrada_limpia($_POST["descripcion"]);
-	$sql_update ="UPDATE talerta SET nombre = '".$nombre."', comando = '".$comando."', descripcion = '".$descripcion."' WHERE id_alerta= '".$id_alerta."'";
-	$result=mysql_query($sql_update);	
-	if (! $result) {
-		echo "<h3 class='error'>".__('There was a problem updating alert')."</h3>";
-	} else {
-		echo "<h3 class='suc'>".__('Alert successfully updated')."</h3>";
-	}
-}
-
-if (isset($_POST["crear_alerta"])){ // if create alert
-	$nombre =  entrada_limpia($_POST["nombre"]);
-	$comando =  entrada_limpia($_POST["comando"]);
-	$descripcion=  entrada_limpia($_POST["descripcion"]);
-	$sql_update ="INSERT talerta (nombre, comando, descripcion) VALUES ('".$nombre."', '".$comando."', '".$descripcion."')";
-	$result=mysql_query($sql_update);	
-	if (! $result)
-		echo "<h3 class='error'>".__('There was a problem creating alert')."</h3>";
-	else
-		echo "<h3 class='suc'>".__('Alert successfully created')."</h3>";  
-}
-
-if (isset($_GET["borrar_alerta"])){ // if delete alert
-	$id_alerta = entrada_limpia($_GET["borrar_alerta"]);
-	if ($id_alerta < 4) {
-		audit_db ($config['id_user'],$REMOTE_ADDR, "ACL Violation","Trying to access Alert Management");
-		require ("general/noaccess.php");
-		exit;
-	}
-	$sql_delete= "DELETE FROM talerta WHERE id_alerta = ".$id_alerta;
-	$result=mysql_query($sql_delete);		
-	if (! $result)
-		echo "<h3 class='error'>".__('There was a problem deleting alert')."</h3>"; 
-	else
-		echo "<h3 class='suc'>".__('Alert successfully deleted')."</h3>"; 
-
-	$sql_delete2 ="DELETE FROM talerta_agente_modulo WHERE id_alerta = ".$id_alerta; 
-	$result=mysql_query($sql_delete2);
-}
-
-echo "<h2>".__('Alert configuration')." &gt; ";
-echo __('Alerts defined in Pandora')."</h2>";
-echo "<table width='500' cellpadding='4' cellspacing='4' class='databox'>";
-echo "<th width='100px'>".__('Alert name')."</th>";
-echo "<th>".__('Description')."</th>";
-echo "<th>".__('Delete')."</th>";
-$color=1;
-$sql1='SELECT * FROM talerta';
-$result=mysql_query($sql1);
-while ($row=mysql_fetch_array($result)){
-	if ($color == 1){
-		$tdcolor = "datos";
-		$color = 0;
-		}
-	else {
-		$tdcolor = "datos2";
-		$color = 1;
-	}
-	if ($row[0] > 4){
-		echo "<tr><td class='$tdcolor'><b><a href='index.php?sec=galertas&sec2=godmode/alerts/configure_alert&id_alerta=".$row["id_alerta"]."'>".$row["nombre"]."</a></b></td>";
-		echo "<td class='$tdcolor'>".$row["descripcion"]."</td>";
-		echo "<td class='$tdcolor' align='center'><a href='index.php?sec=gagente&sec2=godmode/alerts/modify_alert&borrar_alerta=".$row["id_alerta"]."' onClick='if (!confirm(\' ".__('Are you sure?')."\')) return false;'><img border='0' src='images/cross.png'></a></td>";
-	} else {
-		echo "<tr><td class='$tdcolor'><b>".$row["nombre"]."</b></td>";
-		echo "<td class='$tdcolor'>".$row["descripcion"]."</td>";
-	}
-}
-
-echo "</tr></table>";
-echo "<table width=500>";
-echo "<tr><td align='right'>";
-echo "<form method=post action='index.php?sec=galertas&sec2=godmode/alerts/configure_alert&creacion=1'>";
-echo "<input type='submit' class='sub next' name='crt' value='".__('Create alert')."'>";
-echo "</form>";
-echo "</td></tr></table>";
-?>
diff --git a/pandora_console/godmode/menu.php b/pandora_console/godmode/menu.php
index 0ff3d46f1f..ab498723db 100644
--- a/pandora_console/godmode/menu.php
+++ b/pandora_console/godmode/menu.php
@@ -25,61 +25,58 @@ if ((! give_acl ($config['id_user'], 0, "LM")) && (! give_acl ($config['id_user'
 }
 
 if (give_acl ($config['id_user'], 0, "AW")) {
-	
 	$menu["gagente"]["text"] = __('Manage agents');
 	$menu["gagente"]["sec2"] = "godmode/agentes/modificar_agente";
-	$menu["gagente"]["refr"] = 0;
 	$menu["gagente"]["id"] = "god-agents";
 		
 	$sub = array ();
 	$sub["godmode/agentes/manage_config"]["text"] = __('Manage config');
-	$sub["godmode/agentes/manage_config"]["refr"] = 0;
 	
 	$sub["godmode/agentes/manage_config_remote"]["text"] = __('Duplicate config');
-	$sub["godmode/agentes/manage_config_remote"]["refr"] = 0;
 	
 	if (give_acl ($config["id_user"], 0, "PM")) {
 		$sub["godmode/groups/group_list"]["text"] = __('Manage groups');
-		$sub["godmode/groups/group_list"]["refr"] = 0;
 	}
 	
 	$sub["godmode/agentes/planned_downtime"]["text"] = __('Scheduled downtime');
-	$sub["godmode/agentes/planned_downtime"]["refr"] = 0;
 
 	$menu["gagente"]["sub"] = $sub;
 }
 if (give_acl ($config['id_user'], 0, "PM")) {
 	$menu["gmodules"]["text"] = __('Manage modules');
 	$menu["gmodules"]["sec2"] = "godmode/agentes/modificar_agente";
-	$menu["gmodules"]["refr"] = 0;
 	$menu["gmodules"]["id"] = "god-modules";
 	
 	$sub = array ();
 	$sub["godmode/modules/manage_nc_groups"]["text"] = __('Component groups');
-	$sub["godmode/modules/manage_nc_groups"]["refr"] = 0;
 	
 	$sub["godmode/modules/manage_network_components"]["text"] = __('Module components');
-	$sub["godmode/modules/manage_network_components"]["refr"] = 0;
 	
 	$sub["godmode/modules/manage_network_templates"]["text"] = __('Module templates');
-	$sub["godmode/modules/manage_network_templates"]["refr"] = 0;
-
+	
 	enterprise_hook ('inventory_submenu');
-
+	
 	$menu["gmodules"]["sub"] = $sub;
 }
 
 if (give_acl ($config['id_user'], 0, "LM")) {
 	$menu["galertas"]["text"] = __('Manage alerts');
 	$menu["galertas"]["sec2"] = "godmode/alerts/modify_alert";
-	$menu["galertas"]["refr"] = 0;
 	$menu["galertas"]["id"] = "god-alerts";
+	
+	$sub = array ();
+	$sub["godmode/alerts/alert_templates"]["text"] = __('Templates');
+	
+	$sub["godmode/alerts/alert_actions"]["text"] = __('Actions');
+	
+	$sub["godmode/alerts/alert_commands"]["text"] = __('Commands');
+	
+	$menu["galertas"]["sub"] = $sub;
 }
 
 if (give_acl ($config['id_user'], 0, "UM")) {
 	$menu["gusuarios"]["text"] = __('Manage users');
 	$menu["gusuarios"]["sec2"] = "godmode/users/user_list";
-	$menu["gusuarios"]["refr"] = 0;
 	$menu["gusuarios"]["id"] = "god-users";
 }
 
@@ -87,13 +84,11 @@ if (give_acl ($config['id_user'], 0, "UM")) {
 if (give_acl($config['id_user'], 0, "AW")) {
 	$menu["gsnmpconsole"]["text"] = __('Manage SNMP console');
 	$menu["gsnmpconsole"]["sec2"] = "godmode/snmpconsole/snmp_alert";
-	$menu["gsnmpconsole"]["refr"] = 0;
 	$menu["gsnmpconsole"]["id"] = "god-snmpc";
 	
 	//SNMP Console alert
 	$sub = array ();
 	$sub["godmode/snmpconsole/snmp_alert"]["text"] = __('Component groups');
-	$sub["godmode/snmpconsole/snmp_alert"]["refr"] = 0;
 	
 	enterprise_hook ('snmpconsole_submenu');
 
@@ -104,45 +99,36 @@ if (give_acl($config['id_user'], 0, "AW")) {
 if (give_acl ($config['id_user'], 0, "PM")) {
 	$menu["greporting"]["text"] = __('Manage reports');
 	$menu["greporting"]["sec2"] = "godmode/reporting/reporting_builder";
-	$menu["greporting"]["refr"] = 0;
 	$menu["greporting"]["id"] = "god-reporting";
 
 	// Custom report builder
 	$sub = array ();
 	$sub["godmode/reporting/reporting_builder"]["text"] = __('Report builder');
-	$sub["godmode/reporting/reporting_builder"]["refr"] = 0;
 
 	// Custom graph builder
 	$sub["godmode/reporting/graph_builder"]["text"] = __('Graph builder');
-	$sub["godmode/reporting/graph_builder"]["refr"] = 0;
 	
 	// Custom map builder
 	$sub["godmode/reporting/map_builder"]["text"] = __('Map builder');
-	$sub["godmode/reporting/map_builder"]["refr"] = 0;
 	
 	$menu["greporting"]["sub"] = $sub;
 	
 	// Manage profiles
 	$menu["gperfiles"]["text"] = __('Manage profiles');
 	$menu["gperfiles"]["sec2"] = "godmode/profiles/profile_list";
-	$menu["gperfiles"]["refr"] = 0;
 	$menu["gperfiles"]["id"] = "god-profiles";
 	
 	// Servers
 	$menu["gservers"]["text"] = __('Manage servers');
 	$menu["gservers"]["sec2"] = "godmode/servers/modificar_server";
-	$menu["gservers"]["refr"] = 0;
 	$menu["gservers"]["id"] = "god-servers";
 	
 	$sub = array ();
 	$sub["godmode/servers/manage_recontask"]["text"] = __('Manage recontask');
-	$sub["godmode/servers/manage_recontask"]["refr"] = 0;
 	
 	$sub["godmode/servers/plugin"]["text"] = __('Manage plugins');
-	$sub["godmode/servers/plugin"]["refr"] = 0;
 	
 	$sub["godmode/servers/manage_export_form"]["text"] = __('Export targets');
-	$sub["godmode/servers/manage_export_form"]["refr"] = 0;
 	
 	$menu["gservers"]["sub"] = $sub;
 	
@@ -151,21 +137,17 @@ if (give_acl ($config['id_user'], 0, "PM")) {
 	// Audit
 	$menu["glog"]["text"] = __('System audit log');
 	$menu["glog"]["sec2"] = "godmode/admin_access_logs";
-	$menu["glog"]["refr"] = 0;
 	$menu["glog"]["id"] = "god-audit";
 	
 	// Setup
 	$menu["gsetup"]["text"] = __('Pandora setup');
 	$menu["gsetup"]["sec2"] = "godmode/setup/setup";
-	$menu["gsetup"]["refr"] = 0;
 	$menu["gsetup"]["id"] = "god-setup";
 	
 	$sub = array ();
 	$sub["godmode/setup/links"]["text"] = __('Links');
-	$sub["godmode/setup/links"]["refr"] = 0;
 	
 	$sub["godmode/setup/news"]["text"] = __('Site news');
-	$sub["godmode/setup/news"]["refr"] = 0;
 	
 	$menu["gsetup"]["sub"] = $sub;
 }
@@ -173,27 +155,20 @@ if (give_acl ($config['id_user'], 0, "PM")) {
 if (give_acl ($config['id_user'], 0, "DM")) {
 	$menu["gdbman"]["text"] = __('DB Maintenance');
 	$menu["gdbman"]["sec2"] = "godmode/db/db_main";
-	$menu["gdbman"]["refr"] = 0;
 	$menu["gdbman"]["id"] = "god-dbmaint";
 	
 	$sub = array ();
 	$sub["godmode/db/db_info"]["text"] = __('DB Information');
-	$sub["godmode/db/db_info"]["refr"] = 0;
 	
 	$sub["godmode/db/db_purge"]["text"] = __('Database purge');
-	$sub["godmode/db/db_purge"]["refr"] = 0;
 	
 	$sub["godmode/db/db_refine"]["text"] = __('Database debug');
-	$sub["godmode/db/db_refine"]["refr"] = 0;
 	
 	$sub["godmode/db/db_audit"]["text"] = __('Database audit');
-	$sub["godmode/db/db_audit"]["refr"] = 0;
 
 	$sub["godmode/db/db_event"]["text"] = __('Database event');
-	$sub["godmode/db/db_event"]["refr"] = 0;
 
 	$sub["godmode/db/db_sanity"]["text"] = __('Database sanity');
-	$sub["godmode/db/db_sanity"]["refr"] = 0;		
 
 	$menu["gdbman"]["sub"] = $sub;
 }
@@ -201,7 +176,6 @@ if (give_acl ($config['id_user'], 0, "DM")) {
 if (is_array ($config['extensions'])) {
 	$menu["gextensions"]["text"] = __('Extensions');
 	$menu["gextensions"]["sec2"] = "godmode/extensions";
-	$menu["gextensions"]["refr"] = 0;
 	$menu["gextensions"]["id"] = "god-extensions";
 	
 	$sub = array ();
diff --git a/pandora_console/godmode/setup/setup.php b/pandora_console/godmode/setup/setup.php
index 98653694ba..e068e25be3 100644
--- a/pandora_console/godmode/setup/setup.php
+++ b/pandora_console/godmode/setup/setup.php
@@ -80,13 +80,14 @@ echo __('General configuration')."</h2>";
 
 $file_styles = list_files('include/styles/', "pandora", 1, 0);
 
-$table->width = '500px';
+$table->width = '90%';
 $table->data = array ();
 $table->data[0][0] = __('Language Code for Pandora');
 $table->data[0][1] = print_select_from_sql ('SELECT id_language, name FROM tlanguage', 'language_code', $config["language"], '', '', '', true);
 
 $table->data[1][0] = __('Date format string') . pandora_help("date_format", true);
-$table->data[1][1] = print_input_text ('date_format', $config["date_format"], '', 30, 100, true);
+$table->data[1][1] = '<em>'.__('Example').'</em> '.date ($config["date_format"]);
+$table->data[1][1] .= print_input_text ('date_format', $config["date_format"], '', 30, 100, true);
 
 $table->data[2][0] = __('Remote config directory');
 $table->data[2][1] = print_input_text ('remote_config', $config["remote_config"], '', 30, 100, true);
@@ -150,7 +151,6 @@ echo '</form>';
 ?>
 
 <link rel="stylesheet" href="include/styles/color-picker.css" type="text/css" />
-<script type="text/javascript" src="include/javascript/jquery.js"></script>
 <script type="text/javascript" src="include/javascript/jquery.colorpicker.js"></script>
 <script language="javascript" type="text/javascript">
 $(document).ready (function () {
diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php
index 9b98f0afba..c121b9dbb8 100644
--- a/pandora_console/include/functions.php
+++ b/pandora_console/include/functions.php
@@ -286,10 +286,9 @@ function pagination ($count, $url, $offset, $pagination = 0, $return = false) {
 	
 	/* 	URL passed render links with some parameter
 			&offset - Offset records passed to next page
-	  		&counter - Number of items to be blocked 
-	   	Pagination needs $url to build the base URL to render links, its a base url, like 
-	   " http://pandora/index.php?sec=godmode&sec2=godmode/admin_access_logs "
-	   
+			&counter - Number of items to be blocked 
+		Pagination needs $url to build the base URL to render links, its a base url, like 
+		" http://pandora/index.php?sec=godmode&sec2=godmode/admin_access_logs "
 	*/
 	$block_limit = 15; // Visualize only $block_limit blocks
 	if ($count <= $pagination) {
diff --git a/pandora_console/include/functions_alerts.php b/pandora_console/include/functions_alerts.php
new file mode 100644
index 0000000000..1d728aea75
--- /dev/null
+++ b/pandora_console/include/functions_alerts.php
@@ -0,0 +1,639 @@
+<?php
+
+// Pandora FMS - the Flexible Monitoring System
+// ============================================
+// Copyright (c) 2008 Artica Soluciones Tecnologicas, http://www.artica.es
+// Please see http://pandora.sourceforge.net for full contribution list
+
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License (LGPL)
+// as published by the Free Software Foundation for version 2.
+// 
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+function clean_alert_command_values ($values, $set_empty = true) {
+	$retvalues = array ();
+	
+	if ($set_empty) {
+		$retvalues['description'] = '';
+	}
+	
+	if (empty ($values))
+		return $retvalues;
+	
+	if (isset ($values['description']))
+		$retvalues['description'] = (string) $values['description'];
+	
+	return $retvalues;
+}
+
+function create_alert_command ($name, $command, $values = false) {
+	if (empty ($name))
+		return false;
+	if (empty ($command))
+		return false;
+	
+	$values = clean_alert_command_values ($values);
+	
+	$sql = sprintf ('INSERT talert_commands (name, command, description)
+		VALUES ("%s", "%s", "%s")',
+		$name, $command, $values['description']);
+	return process_sql ($sql, 'insert_id');
+}
+
+function update_alert_command ($id_alert_command, $name, $command, $description = '') {
+	$id_alert_command = safe_int ($id_alert_command, 1);
+	if (empty ($id_alert_command))
+		return false;
+	if (empty ($name))
+		return false;
+	if (empty ($command))
+		return false;
+	
+	$values = clean_alert_command_values ($values);
+	
+	$sql = sprintf ('UPDATE talert_commands SET name = "%s", command = "%s",
+		description = "%s" WHERE id = %d',
+		$name, $command, $values['description'], $id_alert_command);
+	return process_sql ($sql) !== false;
+}
+
+function delete_alert_command ($id_alert_command) {
+	$id_alert_command = safe_int ($id_alert_command, 1);
+	if (empty ($id_alert_command))
+		return false;
+	
+	$sql = sprintf ('DELETE FROM talert_commands WHERE id = %d',
+		$id_alert_command);
+	return process_sql ($sql);
+}
+
+function get_alert_command ($id_alert_command) {
+	$id_alert_command = safe_int ($id_alert_command, 1);
+	if (empty ($id_alert_command))
+		return false;
+	
+	return get_db_row ('talert_commands', 'id', $id_alert_command);
+}
+
+function get_alert_command_name ($id_alert_command) {
+	$id_alert_command = safe_int ($id_alert_command, 1);
+	if (empty ($id_alert_command))
+		return false;
+	
+	return get_db_value ('name', 'talert_commands', 'id', $id_alert_command);
+}
+
+function get_alert_command_command ($id_alert_command) {
+	$id_alert_command = safe_int ($id_alert_command, 1);
+	if (empty ($id_alert_command))
+		return false;
+	
+	return get_db_value ('command', 'talert_commands', 'id', $id_alert_command);
+}
+
+function get_alert_command_description ($id_alert_command) {
+	$id_alert_command = safe_int ($id_alert_command, 1);
+	if (empty ($id_alert_command))
+		return false;
+	
+	return get_db_value ('description', 'talert_commands', 'id', $id_alert_command);
+}
+
+function clean_alert_action_values ($values, $set_empty = true) {
+	$retvalues = array ();
+	
+	if ($set_empty) {
+		$retvalues['field1'] = '';
+		$retvalues['field2'] = '';
+		$retvalues['field3'] = '';
+	}
+	
+	if (empty ($values))
+		return $retvalues;
+	
+	if (isset ($values['field1']))
+		$retvalues['field1'] = (string) $values['field1'];
+	if (isset ($values['field2']))
+		$retvalues['field2'] = (string) $values['field2'];
+	if (isset ($values['field3']))
+		$retvalues['field3'] = (string) $values['field3'];
+	
+	return $retvalues;
+}
+
+function create_alert_action ($name, $id_alert_command, $values = false) {
+	$id_alert_command = safe_int ($id_alert_command, 1);
+	if (empty ($id_alert_command))
+		return false;
+	if (empty ($name))
+		return false;
+	
+	$values = clean_alert_action_values ($values);
+	
+	$sql = sprintf ('INSERT talert_actions (name, id_alert_command, field1, field2, field3)
+		VALUES ("%s", %d, "%s", "%s", "%s")',
+		$name, $id_alert_command, $values['field1'], $values['field2'],
+		$values['field3']);
+	
+	return process_sql ($sql, 'insert_id');
+}
+
+function update_alert_action ($id_alert_action, $id_alert_command, $name, $values = false) {
+	$id_alert_action = safe_int ($id_alert_action, 1);
+	if (empty ($id_alert_action))
+		return false;
+	$id_alert_command = safe_int ($id_alert_command, 1);
+	if (empty ($id_alert_command))
+		return false;
+	if (empty ($name))
+		return false;
+	
+	$values = clean_alert_action_values ($values);
+	
+	$sql = sprintf ('UPDATE talert_actions SET name = "%s",
+		id_alert_command = %d, field1 = "%s",
+		field2 = "%s", field3 = "%s" WHERE id = %d',
+		$name, $id_alert_command, $values['field1'], $values['field2'],
+		$values['field3'], $id_alert_action);
+	
+	return process_sql ($sql) !== false;
+}
+
+function delete_alert_action ($id_alert_action) {
+	$id_alert_action = safe_int ($id_alert_action, 1);
+	if (empty ($id_alert_action))
+		return false;
+	
+	$sql = sprintf ('DELETE FROM talert_actions WHERE id = %d',
+		$id_alert_action);
+	return process_sql ($sql);
+}
+
+function get_alert_actions ($only_names = true) {
+	$all_actions = get_db_all_rows_in_table ('talert_actions');
+	
+	if ($all_actions === false)
+		return array ();
+	
+	if (! $only_names)
+		return $all_actions;
+	
+	$actions = array ();
+	foreach ($all_actions as $action) {
+		$actions[$action['id']] = $action['name'];
+	}
+	
+	return $actions;
+}
+
+function get_alert_action ($id_alert_action) {
+	$id_alert_action = safe_int ($id_alert_action, 1);
+	if (empty ($id_alert_action))
+		return false;
+	
+	return get_db_row ('talert_actions', 'id', $id_alert_action);
+}
+
+function get_alert_action_alert_command_id ($id_alert_action) {
+	return get_db_value ('id_alert_command', 'talert_actions', 'id', $id_alert_action);
+}
+
+function get_alert_action_alert_command ($id_alert_action) {
+	$id_command = get_alert_action_alert_command_id ($id_alert_action);
+	return get_alert_command ($id_command);
+}
+
+function get_alert_action_field1 ($id_alert_action) {
+	return get_db_value ('field1', 'talert_actions', 'id', $id_alert_action);
+}
+
+function get_alert_action_field2 ($id_alert_action) {
+	return get_db_value ('field2', 'talert_actions', 'id', $id_alert_action);
+}
+
+function get_alert_action_field3 ($id_alert_action) {
+	return get_db_value ('field3', 'talert_actions', 'id', $id_alert_action);
+}
+
+function get_alert_action_name ($id_alert_action) {
+	return get_db_value ('name', 'talert_actions', 'id', $id_alert_action);
+}
+
+function get_alert_templates_types () {
+	$types = array ();
+	
+	$types['regex'] = __('Regular expression');
+	$types['max_min'] = __('Max and min');
+	$types['max'] = __('Max');
+	$types['min'] = __('Min');
+	$types['equal'] = __('Equal to');
+	$types['not_equal'] = __('Not equal to');
+	
+	return $types;
+}
+
+function get_alert_templates_type_name ($type) {
+	$types = get_alert_templates_types ();
+	if (! isset ($type[$type]))
+		return __('Unknown');
+	return $types[$type];
+}
+
+function clean_alert_template_values ($values, $set_empty = true) {
+	$retvalues = array ();
+	
+	if ($set_empty) {
+		$retvalues['type'] = 'equal';
+		$retvalues['description'] = '';
+		$retvalues['id_alert_action'] = NULL;
+		$retvalues['field1'] = '';
+		$retvalues['field2'] = '';
+		$retvalues['field3'] = '';
+		$retvalues['value'] = '';
+		$retvalues['max_value'] = 0;
+		$retvalues['min_value'] = 0;
+		$retvalues['time_threshold'] = 0;
+		$retvalues['max_alerts'] = 0;
+		$retvalues['min_alerts'] = 0;
+		$retvalues['monday'] = 0;
+		$retvalues['tuesday'] = 0;
+		$retvalues['wednesday'] = 0;
+		$retvalues['thursday'] = 0;
+		$retvalues['friday'] = 0;
+		$retvalues['saturday'] = 0;
+		$retvalues['sunday'] = 0;
+		$retvalues['time_from'] = '00:00';
+		$retvalues['time_to'] = '00:00';
+		$retvalues['time_threshold'] = '300';
+		$retvalues['recovery_notify'] = '';
+		$retvalues['field2_recovery'] = '';
+		$retvalues['field2_recovery'] = '';
+	}
+	
+	if (empty ($values))
+		return $retvalues;
+	
+	if (isset ($values['type']))
+		$retvalues['type'] = (string) $values['type'];
+	if (isset ($values['description']))
+		$retvalues['description'] = (string) $values['description'];
+	if (isset ($values['id_alert_action']))
+		$retvalues['id_alert_action'] = (int) $values['id_alert_action'];
+	if (isset ($values['field1']))
+		$retvalues['field1'] = (string) $values['field1'];
+	if (isset ($values['field2']))
+		$retvalues['field2'] = (string) $values['field2'];
+	if (isset ($values['field3']))
+		$retvalues['field3'] = (string) $values['field3'];
+	if (isset ($values['value']))
+		$retvalues['value'] = (string) $values['value'];
+	if (isset ($values['max_value']))
+		$retvalues['max_value'] = (float) $values['max_value'];
+	if (isset ($values['min_value']))
+		$retvalues['min_value'] = (float) $values['min_value'];
+	if (isset ($values['time_threshold']))
+		$retvalues['time_threshold'] = (int) $values['time_threshold'];
+	if (isset ($values['max_alerts']))
+		$retvalues['max_alerts'] = (int) $values['max_alerts'];
+	if (isset ($values['min_alerts']))
+		$retvalues['min_alerts'] = (int) $values['min_alerts'];
+	if (isset ($values['monday']))
+		$retvalues['monday'] = (bool) $values['monday'];
+	if (isset ($values['tuesday']))
+		$retvalues['tuesday'] = (bool) $values['tuesday'];
+	if (isset ($values['wednesday']))
+		$retvalues['wednesday'] = (bool) $values['wednesday'];
+	if (isset ($values['thursday']))
+		$retvalues['thursday'] = (bool) $values['thursday'];
+	if (isset ($values['friday']))
+		$retvalues['friday'] = (bool) $values['friday'];
+	if (isset ($values['saturday']))
+		$retvalues['saturday'] = (bool) $values['saturday'];
+	if (isset ($values['sunday']))
+		$retvalues['sunday'] = (bool) $values['sunday'];
+	if (isset ($values['time_from']))
+		$retvalues['time_from'] = (string) $values['time_from'];
+	if (isset ($values['time_to']))
+		$retvalues['time_to'] = (string) $values['time_to'];
+	if (isset ($values['time_threshold']))
+		$retvalues['time_threshold'] = (int) $values['time_threshold'];
+	if (isset ($values['recovery_notify']))
+		$retvalues['recovery_notify'] = (bool) $values['recovery_notify'];
+	if (isset ($values['field2_recovery']))
+		$retvalues['field2_recovery'] = (string) $values['field2_recovery'];
+	if (isset ($values['field3_recovery']))
+		$retvalues['field3_recovery'] = (string) $values['field3_recovery'];
+	
+	return $retvalues;
+}
+
+function create_alert_template ($name, $type, $values = false) {
+	if (empty ($name))
+		return false;
+	if (empty ($type))
+		return false;
+	
+	$values = clean_alert_template_values ($values);
+	
+	switch ($type) {
+	/* TODO: Check values based on type, return false if failure */
+	}
+	
+	$sql = sprintf ('INSERT talert_templates (name, type, description,
+		field1, field2, field3, value, max_value, min_value,
+		time_threshold, max_alerts, min_alerts)
+		VALUES ("%s", "%s", "%s", "%s", "%s", "%s", "%s", %.2f,
+		%.2f, %d, %d, %d)',
+		$name, $type, $values['description'], $values['field1'],
+		$values['field2'], $values['field3'], $values['value'],
+		$values['max_value'], $values['min_value'],
+		$values['time_threshold'], $values['max_alerts'],
+		$values['min_alerts']);
+	
+	return process_sql ($sql, 'insert_id');
+}
+
+function update_alert_template ($id_alert_template, $values = false) {
+	$id_alert_template = safe_int ($id_alert_template, 1);
+	if (empty ($id_alert_template))
+		return false;
+	
+	$values = clean_alert_template_values ($values, false);
+	
+	$sql = sprintf ('UPDATE talert_templates
+		SET %s
+		WHERE id = %d',
+		format_array_to_update_sql ($values), $id_alert_template);
+	echo $sql;
+	return process_sql ($sql) !== false;
+}
+
+function delete_alert_template ($id_alert_template) {
+	$id_alert_template = safe_int ($id_alert_template, 1);
+	if (empty ($id_alert_template))
+		return false;
+	
+	$sql = sprintf ('DELETE FROM talert_templates WHERE id = %d',
+		$id_alert_template);
+	return process_sql ($sql);
+}
+
+function get_alert_templates ($only_names = true) {
+	$all_templates = get_db_all_rows_in_table ('talert_templates');
+	
+	if ($all_templates === false)
+		return array ();
+	
+	if (! $only_names)
+		return $all_templates;
+	
+	$templates = array ();
+	foreach ($all_templates as $template) {
+		$templates[$template['id']] = $template['name'];
+	}
+	
+	return $templates;
+}
+
+function get_alert_template ($id_alert_template) {
+	$id_alert_template = safe_int ($id_alert_template, 1);
+	if (empty ($id_alert_template))
+		return false;
+	
+	return get_db_row ('talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_field1 ($id_alert_template) {
+	return get_db_value ('field1', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_field2 ($id_alert_template) {
+	return get_db_value ('field2', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_field3 ($id_alert_template) {
+	return get_db_value ('field3', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_name ($id_alert_template) {
+	return get_db_value ('name', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_description ($id_alert_template) {
+	return get_db_value ('description', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_type ($id_alert_template) {
+	return get_db_value ('type', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_type_name ($id_alert_template) {
+	$type = get_alert_template_type ($id_alert_template);
+	return get_alert_templates_type_name ($type);
+}
+
+function get_alert_template_value ($id_alert_template) {
+	return get_db_value ('value', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_max_value ($id_alert_template) {
+	return get_db_value ('max_value', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_min_value ($id_alert_template) {
+	return get_db_value ('min_value', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_alert_text ($id_alert_template) {
+	return get_db_value ('alert_text', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_time_from ($id_alert_template) {
+	return get_db_value ('time_from', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_time_to ($id_alert_template) {
+	return get_db_value ('time_from', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_weekdays ($id_alert_template) {
+	$alert = get_alert_template ($id_alert_template);
+	if ($alert === false)
+		return false;
+	$retval = array ();
+	$days = array ('monday', 'tuesday', 'wednesday', 'thursday', 'friday',
+		'saturday', 'sunday');
+	foreach ($days as $day)
+		$retval[$day] = (bool) $alert[$day];
+	return $retval;
+}
+
+function get_alert_template_recovery_notify ($id_alert_template) {
+	return get_db_value ('recovery_notify', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_field2_recovery ($id_alert_template) {
+	return get_db_value ('field2_recovery', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_field3_recovery ($id_alert_template) {
+	return get_db_value ('field3_recovery', 'talert_templates', 'id', $id_alert_template);
+}
+
+function get_alert_template_threshold_values () {
+	$times = array ();
+	
+	$times['300'] = '5 '.__('minutes');
+	$times['600'] = '10 '.__('minutes');
+	$times['900'] = '15 '.__('minutes');
+	$times['1800'] = '30 '.__('minutes');
+	$times['3600'] = '1 '.__('hour');
+	$times['7200'] = '2 '.__('hours');
+	$times['18000'] = '5 '.__('hours');
+	$times['43200'] = '12 '.__('hours');
+	$times['86400'] = '1 '.__('day');
+	$times['604800'] = '1 '.__('week');
+	$times['-1'] = __('Other value');
+	
+	return $times;
+}
+
+function clean_alert_agent_module_values ($values, $set_empty = true) {
+	$retvalues = array ();
+	
+	if ($set_empty) {
+		$retvalues['internal_counter'] = 0;
+		$retvalues['last_fired'] = 0;
+		$retvalues['times_fired'] = 0;
+		$retvalues['disabled'] = 0;
+		$retvalues['priority'] = 0;
+		$retvalues['force_execution'] = 0;
+	}
+	
+	if (empty ($values))
+		return $retvalues;
+	
+	if (isset ($values['internal_counter']))
+		$retvalues['internal_counter'] = (int) $values['internal_counter'];
+	if (isset ($values['last_fired']))
+		$retvalues['last_fired'] = (int) $values['last_fired'];
+	if (isset ($values['times_fired']))
+		$retvalues['times_fired'] = (int) $values['times_fired'];
+	if (isset ($values['disabled']))
+		$retvalues['disabled'] = (int) $values['disabled'];
+	if (isset ($values['priority']))
+		$retvalues['priority'] = (int) $values['priority'];
+	if (isset ($values['force_execution']))
+		$retvalues['force_execution'] = (int) $values['force_execution'];
+	
+	return $retvalues;
+}
+
+function create_alert_agent_module ($id_agent_module, $id_alert_template, $values = false) {
+	if (empty ($id_agent_module))
+		return false;
+	if (empty ($id_alert_template))
+		return false;
+	
+	$values = clean_alert_agent_module_values ($values);
+	
+	$sql = sprintf ('INSERT talert_template_modules (id_agent_module,
+		id_alert_template, internal_counter, last_fired, times_fired,
+		disabled, priority, force_execution)
+		VALUES (%d, %d, %d, %d, %d, %d, %d, %d)',
+		$id_agent_module, $id_alert_template,
+		$values['internal_counter'], $values['last_fired'],
+		$values['times_fired'], $values['disabled'], $values['priority'],
+		$values['force_execution']);
+	
+	return process_sql ($sql, 'insert_id');
+}
+
+function update_alert_agent_module ($id_alert_agent_module, $values = false) {
+	if (empty ($id_agent_module))
+		return false;
+	
+	$values = clean_alert_agent_module_values ($values, false);
+	if ($empty ($values))
+		return true;
+	
+	$sql = sprintf ('UPDATE talert_template_modules
+		SET %s
+		WHERE id = %d',
+		format_array_to_update_sql ($values), $id_alert_agent_module);
+	
+	return process_sql ($sql) !== false;
+}
+
+function get_alert_agent_module ($id_alert_agent_module) {
+	$id_alert_agent_module = safe_int ($id_alert_agent_module, 1);
+	if (empty ($id_alert_agent_module))
+		return false;
+	
+	return get_db_row ('talert_template_modules', 'id', $id_alert_agent_module);
+}
+
+function get_alerts_agent_module ($id_agent_module) {
+	$sql = sprintf ('SELECT * FROM talert_template_modules
+		WHERE id_agent_module = %d
+		AND disabled = 0', $id_agent_module);
+	return get_db_all_rows_sql ($sql);
+}
+
+function add_alert_agent_module_action ($id_alert_agent_module, $id_alert_action, $options = false) {
+	if (empty ($id_alert_agent_module))
+		return false;
+	if (empty ($id_alert_action))
+		return false;
+	
+	$fires_max = 0;
+	$fires_min = 0;
+	if ($options) {
+		$max = 0;
+		$min = 0;
+		if (isset ($options['fires_max']))
+			$max = (int) $options['fires_max'];
+		if (isset ($options['fires_min']))
+			$min = (int) $options['fires_min'];
+		
+		$fires_max = max ($max, $min);
+		$fires_min = min ($max, $min);
+	}
+	
+	$sql = sprintf ('INSERT INTO talert_template_module_actions
+		VALUES (%d, %d, %d, %d)',
+		$id_alert_agent_module, $id_alert_action, $fires_min, $fires_max);
+	
+	return process_sql ($sql) !== false;
+}
+
+function get_alert_agent_module_actions ($id_alert_agent_module) {
+	if (empty ($id_alert_agent_module))
+		return false;
+	
+	$sql = sprintf ('SELECT id_alert_action id, fires_min, fires_max
+		FROM talert_template_module_actions
+		WHERE id_alert_template_module = %d',
+		$id_alert_agent_module);
+	$actions = get_db_all_rows_sql ($sql);
+	if ($actions === false)
+		return array ();
+	
+	$retval = array ();
+	foreach ($actions as $element) {
+		$action = get_alert_action ($element['id']);
+		$action['fires_min'] = $element['fires_min'];
+		$action['fires_max'] = $element['fires_max'];
+		array_push ($retval, $action);
+	}
+	
+	return $retval;
+}
+?>
diff --git a/pandora_console/include/functions_custom_graphs.php b/pandora_console/include/functions_custom_graphs.php
new file mode 100644
index 0000000000..18f234aa68
--- /dev/null
+++ b/pandora_console/include/functions_custom_graphs.php
@@ -0,0 +1,115 @@
+<?php 
+
+// Pandora FMS - the Flexible Monitoring System
+// ============================================
+// Copyright (c) 2008 Artica Soluciones Tecnologicas, http://www.artica.es
+// Please see http://pandora.sourceforge.net for full contribution list
+
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License (LGPL)
+// as published by the Free Software Foundation for version 2.
+// 
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+/**
+ * Get all the custom graphs a user can see.
+ *
+ * @param $id_user User id to check.
+ * @param $only_names Wheter to return only graphs names in an associative array
+ * or all the values.
+ *
+ * @return Custom graphs of a an user. Empty array if none.
+ */
+function get_user_custom_graphs ($id_user = 0, $only_names = false) {
+	global $config;
+	
+	if (!$id_user) {
+		$id_user = $config['id_user'];
+	}
+	
+	$all_graphs = get_db_all_rows_in_table ('tgraph', 'name');
+	if ($all_graphs === false)
+		return array ();
+	
+	$graphs = array ();
+	foreach ($all_graphs as $graph) {
+		if ($graph["id_user"] != $id_user && $graph['private'])
+			continue;
+		
+		if ($only_names) {
+			$graphs[$graph['id_graph']] = $graph['name'];
+		} else {
+			array_push ($graphs, $graph);
+		}
+	}
+	
+	return $graphs;
+}
+
+/**
+ * Print a custom graph image.
+ *
+ * @param $id_graph Graph id to print.
+ * @param $height Height of the returning image.
+ * @param $width Width of the returning image.
+ * @param $period Period of time to get data in seconds.
+ * @param $stacked Wheter the graph is stacked or not.
+ * @param $return Whether to return an output string or echo now (optional, echo by default).
+ */
+function print_custom_graph ($id_graph, $height, $width, $period, $stacked, $return = false) {
+	global $config;
+	
+	$sources = get_db_all_rows_field_filter ('tgraph_source', 'id_graph', $id_graph);
+	$modules = array ();
+	$weights = array ();
+	foreach ($sources as $source) {
+		$sql = sprintf ("SELECT id_grupo
+			FROM tagente, tagente_modulo
+			WHERE tagente_modulo.id_agente_modulo = %d
+			AND tagente.id_agente = tagente_modulo.id_agente",
+			$source['id_agent_module']);
+		$id_group = get_db_sql ($sql);
+		if (! give_acl ($config["id_user"], $id_group, 'AR'))
+			continue;
+		array_push ($modules, $source['id_agent_module']);
+		array_push ($weights, $source['weight']);
+	}
+	$modules = implode (',', $modules);
+	$weights = implode (',', $weights);
+	
+	$output = '<img src="reporting/fgraph.php?tipo=combined&height='.$height.'&width='.$width.'&id='.$modules.'&period='.$period.'&weight_l='.$weights.'&stacked='.$stacked.'">';
+	
+	if ($return)
+		return $output;
+	echo $output;
+}
+
+/**
+ * Get all the possible periods in a custom graph.
+ *
+ * @return The possible periods in a custom graph in an associative array.
+ */
+function get_custom_graph_periods () {
+	$periods = array ();
+	
+	$periods[1] = __('1 hour');
+	$periods[2] = '2 '.__('hours');
+	$periods[3] = '3 '.__('hours');
+	$periods[6] = '6 '.__('hours');
+	$periods[12] = '12 '.__('hours');
+	$periods[24] = __('1 day');
+	$periods[48] = __('2 days');
+	$periods[360] = __('1 week');
+	$periods[720] = __('1 month');
+	$periods[4320] = __('6 months');
+	
+	return $periods;
+}
+
+?>
diff --git a/pandora_console/include/functions_db.php b/pandora_console/include/functions_db.php
index 5456c02f7f..791ec6a776 100644
--- a/pandora_console/include/functions_db.php
+++ b/pandora_console/include/functions_db.php
@@ -246,10 +246,12 @@ function get_group_agents ($id_group = 0, $disabled = false, $case = "lower") {
 /**
  * Get all the modules in an agent. If an empty list is passed it will select all
  *
- * @param mixed $id_agent Agent id. If empty it selects all, array or int can be passed too
- * @param mixed $details Array, comma delimited list or singular value of rows to select. If nothing is specified, nombre will be selected
+ * @param mixed Agent id to get modules. It can also be an array of agent id's.
+ * @param mixed Array, comma delimited list or singular value of rows to
+ * select. If nothing is specified, nombre will be selected.
  *
- * @return array An array with all modules in the agent. If multiple rows are selected, they will be in an array
+ * @return array An array with all modules in the agent.
+ * If multiple rows are selected, they will be in an array
  */
 function get_agent_modules ($id_agent, $details = false) {
 	$id_agent = safe_int ($id_agent, 1);
@@ -266,8 +268,13 @@ function get_agent_modules ($id_agent, $details = false) {
 		$details = safe_input ($details);
 	}
 	
-	$sql = "SELECT id_agente_modulo,".implode (",", (array) $details)." FROM tagente_modulo".$filter." ORDER BY nombre";
-	$result = get_db_all_rows_sql ($sql); //cast as array, that way a false will be converted into an array
+	$sql = sprintf ('SELECT id_agente_modulo,%s
+		FROM tagente_modulo
+		%s
+		ORDER BY nombre',
+		implode (",", (array) $details),
+		$filter);
+	$result = get_db_all_rows_sql ($sql);
 	
 	if (empty ($result)) {
 		return array ();
@@ -276,9 +283,10 @@ function get_agent_modules ($id_agent, $details = false) {
 	$modules = array ();
 	foreach ($result as $row) {
 		if (is_array ($details)) {
-			$modules[$row["id_agente_modulo"]] = $row; //Just stack the information in array by ID
+			 //Just stack the information in array by ID
+			$modules[$row['id_agente_modulo']] = $row;
 		} else {
-			$modules[$row["id_agente_modulo"]] = $row[$details];
+			$modules[$row['id_agente_modulo']] = $row[$details];
 		}
 	}
 	return $modules;
@@ -287,26 +295,33 @@ function get_agent_modules ($id_agent, $details = false) {
 /**
  * Get all the simple alerts of an agent.
  *
- * @param int $id_agent Agent id
- * @param string $filter Filter on "fired", "notfired" or "disabled"
+ * @param int Agent id
+ * @param string Filter on "fired", "notfired" or "disabled". Any other value
+ * will not do any filter.
  *
- * @return array An array with all simple alerts defined for an agent.
+ * @return array All simple alerts defined for an agent. Empty array if no
+ * alerts found.
  */
 function get_agent_alerts_simple ($id_agent, $filter = false) {
 	switch ($filter) {
-			case "notfired":
-				$filter = ' AND times_fired = 0 AND disable = 0';
-			break;
-			case "fired":
-				$filter = ' AND times_fired > 0 AND disable = 0';
-			break;
-			case "disabled":
-				$filter = ' AND disable = 1';
-			break;
-			default:
-				$filter = '';
+	case "notfired":
+		$filter = ' AND times_fired = 0 AND disable = 0';
+		break;
+	case "fired":
+		$filter = ' AND times_fired > 0 AND disable = 0';
+		break;
+	case "disabled":
+		$filter = ' AND disable = 1';
+		break;
+	default:
+		$filter = '';
 	}
-	$sql = sprintf ("SELECT talerta_agente_modulo.* FROM talerta_agente_modulo, tagente_modulo WHERE talerta_agente_modulo.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.id_agente = %d%s", $id_agent, $filter);
+	
+	$sql = sprintf ("SELECT talerta_agente_modulo.*
+		FROM talerta_agente_modulo, tagente_modulo
+		WHERE talerta_agente_modulo.id_agente_modulo = tagente_modulo.id_agente_modulo
+		AND tagente_modulo.id_agente = %d %s",
+		$id_agent, $filter);
 	$alerts = get_db_all_rows_sql ($sql);
 	
 	if ($alerts === false)
@@ -363,7 +378,7 @@ function get_agent_alerts ($id_agent, $filter = false) {
  * A user can view a report by two ways:
  *  - The user created the report (id_user field in treport)
  *  - The report is not private and the user has reading privileges on 
- *    the group associated to the report
+ *	the group associated to the report
  *
  * @param string $id_user User id
  *
@@ -516,7 +531,8 @@ function get_agentmodule_agent ($id_agentmodule) {
  * @return string The name of the given agent module.
  */
 function get_agentmodule_agent_name ($id_agentmodule) {
-	return (string) get_agent_name (get_agentmodule_agent ($id_agentmodule)); //since this is a helper function we don't need to do casting
+	// Since this is a helper function we don't need to do casting
+	return (string) get_agent_name (get_agentmodule_agent ($id_agentmodule));
 }
 
 /** 
@@ -1132,7 +1148,7 @@ function show_icon_type ($id_type) {
  *
  * @return string Fully formatted  IMG HTML tag with icon
  */
-function show_server_type ($id){ 
+function show_server_type ($id) {
 	global $config;
 	switch ($id) {
 	case 1:
@@ -1391,7 +1407,7 @@ function get_db_row ($table, $field_search, $condition) {
 	}
 	$result = get_db_all_rows_sql ($sql);
 		
-	if($result === false) 
+	if ($result === false) 
 		return false;
 	
 	return $result[0];
@@ -1454,9 +1470,9 @@ function sql_error_handler ($errno, $errstr) {
  * @param string $sql SQL statement to execute
  *
  * @param string $rettype (optional) What type of info to return in case of INSERT/UPDATE.
- *        'affected_rows' will return mysql_affected_rows (default value)
- *        'insert_id' will return the ID of an autoincrement value
- *        'info' will return the full (debug) information of a query
+ *		'affected_rows' will return mysql_affected_rows (default value)
+ *		'insert_id' will return the ID of an autoincrement value
+ *		'info' will return the full (debug) information of a query
  *
  * @return mixed An array with the rows, columns and values in a multidimensional array or false in error
  */
@@ -1530,7 +1546,7 @@ function get_db_all_rows_in_table ($table, $order_field = "") {
  * @return mixed A matrix with all the values in the table that matches the condition in the field or false
  */
 function get_db_all_rows_field_filter ($table, $field, $condition, $order_field = "") {
-	if (is_int ($condition)) {
+	if (is_int ($condition) || is_bool ($condition)) {
 		$sql = sprintf ("SELECT * FROM `%s` WHERE `%s` = %d", $table, $field, $condition);
 	} else if (is_float ($condition) || is_double ($condition)) {
 		$sql = sprintf ("SELECT * FROM `%s` WHERE `%s` = %f", $table, $field, $condition);
@@ -1563,6 +1579,53 @@ function get_db_all_fields_in_table ($table, $field = '', $condition = '', $orde
 	return get_db_all_rows_sql ($sql);
 }
 
+/**
+ * Formats an array of values into a SQL string.
+ *
+ * This function is useful to generate an UPDATE SQL sentence from a list of
+ * values. Example code:
+ *
+ * <code>
+ * <?php
+ * $values = array ();
+ * $values['name'] = "Name";
+ * $values['description'] = "Long description";
+ * $sql = 'UPDATE table SET '.format_array_to_update_sql ($values).' WHERE id=1';
+ * echo $sql;
+ * ?>
+ * </code>
+ * Will return:
+ * <code>
+ * UPDATE table SET `name` = "Name", `description` = "Long description" WHERE id=1
+ * </code>
+ *
+ * @param array Values to be formatted in an array indexed by the field name.
+ *
+ * @return string Values joined into an SQL string that can fits into an UPDATE
+ * sentence.
+ */
+function format_array_to_update_sql ($values) {
+	$fields = array ();
+	
+	foreach ($values as $field => $value) {
+		if (! is_string ($field))
+			continue;
+		
+		if ($value === NULL) {
+			$sql = sprintf ("`%s` = NULL", $field);
+		} elseif (is_int ($value) || is_bool ($value)) {
+			$sql = sprintf ("`%s` = %d", $field, $value);
+		} else if (is_float ($value) || is_double ($value)) {
+			$sql = sprintf ("`%s` = %f", $field, $value);
+		} else {
+			$sql = sprintf ("`%s` = '%s'", $field, $value);
+		}
+		array_push ($fields, $sql);
+	}
+	
+	return implode (", ", $fields);
+}
+
 /** 
  * Get the status of an alert assigned to an agent module.
  * 
@@ -1644,7 +1707,7 @@ function return_value_agent_module ($id_agentmodule) {
  * @return int The X axis coordinate value.
  */
 function get_layoutdata_x ($id_layoutdata) {
-	return (float) get_db_value ('pos_x', 'tlayout_data', 'id', $id_layoutdata);
+	return (float) get_db_value ('pos_x', 'tlayout_data', 'id', (int) $id_layoutdata);
 }
 
 /** 
@@ -1655,7 +1718,7 @@ function get_layoutdata_x ($id_layoutdata) {
  * @return int The Y axis coordinate value.
  */
 function get_layoutdata_y ($id_layoutdata){
-	return (float) get_db_value ('pos_y', 'tlayout_data', 'id', $id_layoutdata);
+	return (float) get_db_value ('pos_y', 'tlayout_data', 'id', (int) $id_layoutdata);
 }
 
 /**
@@ -1671,7 +1734,10 @@ function get_layoutdata_y ($id_layoutdata){
  *
  * @return mixed The row of tagente_datos of the last period. False if there were no data.
  */
-function get_previous_data ($id_agent_module, $utimestamp) {
+function get_previous_data ($id_agent_module, $utimestamp = 0) {
+	if (empty ($utimestamp))
+		$utimestamp = time ();
+	
 	$interval = get_module_interval ($id_agent_module);
 	$sql = sprintf ('SELECT * FROM tagente_datos 
 			WHERE id_agente_modulo = %d 
@@ -1722,7 +1788,7 @@ function get_agentmodule_data_average ($id_agent_module, $period, $date = 0) {
  * @param int $period Period of time to check (in seconds)
  * @param int $date Top date to check the values. Default current time.
  * 
- * @return int The maximum module value in the interval.
+ * @return float The maximum module value in the interval.
  */
 function get_agentmodule_data_max ($id_agent_module, $period, $date = 0) {
 	if (! $date)
@@ -1737,20 +1803,20 @@ function get_agentmodule_data_max ($id_agent_module, $period, $date = 0) {
 	
 	/* Get also the previous report before the selected interval. */
 	$previous_data = get_previous_data ($id_agent_module, $datelimit);
-	if ($previous_data)
+	if ($previous_data !== false)
 		return max ($previous_data['datos'], $max);
 	
-	return max ($previous_data, $max);
+	return max ((float) $previous_data, $max);
 }
 
 /** 
  * Get the minimum value of an agent module in a period of time.
  * 
- * @param int $id_agent_module Agent module id to get the minimum value.
- * @param int $period Period of time to check (in seconds)
- * @param int $date Top date to check the values. Default current time.
+ * @param int Agent module id to get the minimum value.
+ * @param int Period of time to check (in seconds)
+ * @param int Top date to check the values in Unix time. Default current time.
  * 
- * @return int The minimum module value of the module
+ * @return float The minimum module value of the module
  */
 function get_agentmodule_data_min ($id_agent_module, $period, $date = 0) {
 	if (! $date)
@@ -1848,6 +1914,7 @@ function get_agentmodule_data_sum ($id_agent_module, $period, $date = 0) {
 	
 	return (float) $sum;
 }
+
 /** 
  * Get a translated string
  * 
@@ -2005,25 +2072,23 @@ function show_alert_row_mini ($id_combined_alert) {
  * @deprecated use get_server_info instead 
  * Get statistical information for a given server
  *
- * @param int $id_server 
- *
- * @return array Serverinfo array
- */
+ * @param int Server id to get status
+ * @return array Server info array
+*/
 function server_status ($id_server) {
 	$serverinfo = get_server_info ($id_server);
 	return $serverinfo[$id_server];
 }
 
 /**
- * This function will delete the agent from the database in a transaction
- * You can pass a variable or an array of ID's to be removed (int)
+ * Delete an agent from the database.
  *
- * @param mixed $id_agents An array or variable with integeres of ID's to be erased
+ * @param mixed An array of agents ids or a single integer id to be erased
  *
- * @return bool false in case of a problem, true in case of successful
- */
+ * @return bool False if error, true if success.
+*/
 function delete_agent ($id_agents) {
-        //Init vars
+	//Init vars
 	$errors = 0;
 	
 	//Subfunciton for less typing
@@ -2075,12 +2140,12 @@ function delete_agent ($id_agents) {
 		// because it's a huge ammount of time. tagente_module has a special
 		// field to mark for delete each module of agent deleted and in 
 		// daily maintance process, all data for that modules are deleted
-		        
-        //Alert
+		
+		//Alert
 		temp_sql_delete ("tcompound_alert", "id_aam", "ANY(SELECT id_aam FROM talerta_agente_modulo WHERE id_agent = ".$id_agent.")");
 		temp_sql_delete ("talerta_agente_modulo", "id_agente_modulo", $tmodbase);
 		temp_sql_delete ("talerta_agente_modulo", "id_agent", $id_agent);
-        
+		
 		//Events (up/down monitors)
 		temp_sql_delete ("tevento", "id_agente", $id_agent);
 
@@ -2088,7 +2153,7 @@ function delete_agent ($id_agents) {
 		temp_sql_delete ("tgraph_source", "id_agent_module", $tmodbase);
 		temp_sql_delete ("tlayout_data", "id_agente_modulo", $tmodbase);
 		temp_sql_delete ("treport_content", "id_agent_module", $tmodbase);
-        
+		
 		//Planned Downtime
 		temp_sql_delete ("tplanned_downtime_agents", "id_agent", $id_agent);
 		
@@ -2132,9 +2197,9 @@ function delete_agent ($id_agents) {
 /**
  * This function will get all the server information in an array or a specific server
  *
- * @param mixed $id_server An optional integer or array of integers to select specific servers
+ * @param mixed An optional integer or array of integers to select specific servers
  *
- * @return bool false in case the server doesn't exist or an array with info 
+ * @return mixed False in case the server doesn't exist or an array with info.
  */
 function get_server_info ($id_server = -1) {
 	if (is_array ($id_server)) {
@@ -2173,30 +2238,30 @@ function get_server_info ($id_server = -1) {
 		}
 		
 		$server["modules"] = get_db_sql ("SELECT COUNT(*) FROM tagente_estado, tagente_modulo 
-										 WHERE tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo
-										 AND tagente_modulo.disabled = 0
-										 AND tagente_estado.running_by = ".$server["id_server"]);
+			 WHERE tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo
+			 AND tagente_modulo.disabled = 0
+			 AND tagente_estado.running_by = ".$server["id_server"]);
 			
 		$server["module_lag"] = get_db_sql ("SELECT COUNT(*) FROM tagente_estado, tagente_modulo, tagente
-											WHERE tagente_estado.last_execution_try > 0
-											AND tagente_estado.running_by = ".$server["id_server"]."
-											AND tagente_modulo.id_agente = tagente.id_agente
-											AND tagente.disabled = 0
-											AND tagente_modulo.disabled = 0
-											AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
-											AND (UNIX_TIMESTAMP() - tagente_estado.last_execution_try - tagente_estado.current_interval < 1200)");
+			WHERE tagente_estado.last_execution_try > 0
+			AND tagente_estado.running_by = ".$server["id_server"]."
+			AND tagente_modulo.id_agente = tagente.id_agente
+			AND tagente.disabled = 0
+			AND tagente_modulo.disabled = 0
+			AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
+			AND (UNIX_TIMESTAMP() - tagente_estado.last_execution_try - tagente_estado.current_interval < 1200)");
 			
 		// Lag over 1200 seconds is not lag, is module without contacting data in several time.or with a 
 		// 1200 sec is 20 min
 		$server["lag"] = get_db_sql ("SELECT MAX(tagente_estado.last_execution_try - tagente_estado.current_interval)
-										 FROM tagente_estado, tagente_modulo, tagente
-										 WHERE tagente_estado.last_execution_try > 0
-										 AND tagente_estado.running_by = ".$server["id_server"]."
-										 AND tagente_modulo.id_agente = tagente.id_agente
-										 AND tagente.disabled = 0
-										 AND tagente_modulo.disabled = 0
-										 AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
-										 AND (UNIX_TIMESTAMP() - tagente_estado.last_execution_try - tagente_estado.current_interval < 1200)");
+			 FROM tagente_estado, tagente_modulo, tagente
+			 WHERE tagente_estado.last_execution_try > 0
+			 AND tagente_estado.running_by = ".$server["id_server"]."
+			 AND tagente_modulo.id_agente = tagente.id_agente
+			 AND tagente.disabled = 0
+			 AND tagente_modulo.disabled = 0
+			 AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
+			 AND (UNIX_TIMESTAMP() - tagente_estado.last_execution_try - tagente_estado.current_interval < 1200)");
 			
 		if (empty ($server["lag"])) {
 			$server["lag"] = 0;
@@ -2211,15 +2276,16 @@ function get_server_info ($id_server = -1) {
 }
 
 /**
- * This function will return the number of all agent modules in the database
+ * Get the number of all agent modules in the database
  *
- * @param mixed $id_agent array of or just integers with agent(s). Leave empty to select everything
+ * @param mixed Array of integers with agent(s) id or a single agent id. Default
+ * value will select all.
  *
  * @return int The number of agent modules
- *
-  */
+ */
 function get_agent_modules_count ($id_agent = 0) {
-	$id_agent = safe_int ($id_agent, 1); //Make sure we're all int's and filter out bad stuff
+	//Make sure we're all int's and filter out bad stuff
+	$id_agent = safe_int ($id_agent, 1);
 	
 	if (empty ($id_agent)) {
 		//If the array proved empty or the agent is less than 1 (eg. -1)
@@ -2234,7 +2300,7 @@ function get_agent_modules_count ($id_agent = 0) {
 /**
  * This function gets the agent group for a given agent module
  *
- * @param int $id_module: The agent module id
+ * @param int The agent module id
  *
  * @return int The group id
  */
@@ -2246,7 +2312,7 @@ function get_agentmodule_group ($id_module) {
 /**
  * This function gets the group for a given agent
  *
- * @param int $id_agent: The agent id
+ * @param int The agent id
  *
  * @return int The group id
  */
@@ -2257,7 +2323,7 @@ function get_agent_group ($id_agent) {
 /**
  * This function gets the group name for a given group id
  *
- * @param int $id_group: The group id
+ * @param int The group id
  *
  * @return string The group name
  */
@@ -2265,12 +2331,14 @@ function get_group_name ($id_group) {
 	return (string) get_db_value ('nombre', 'tgrupo', 'id_grupo', (int) $id_group);
 }
 /**
+ *  Validates an alert id or an array of alert id's
+ *
  * Validates an alert id or an array of alert id's
  *
- * @param mixed $alert_id Array of or a single id
+ * @param mixed Array of alerts ids or single id
  *
- * @return bool True if it was successful, false if it doesn't
-  */
+ * @return bool True if it was successful, false otherwise.
+ */
 function process_alerts_validate ($id_alert) {
 	global $config;
 	require_once ("include/functions_events.php");
@@ -2312,7 +2380,9 @@ function process_alerts_validate ($id_alert) {
 }
 
 /**
- * Gets all module groups. (General, Networking, System). Module groups are merely for sorting frontend
+ * Gets all module groups. (General, Networking, System).
+ *
+ * Module groups are merely for sorting frontend
  *
  * @return array All module groups
  */
@@ -2334,7 +2404,7 @@ function get_modulegroups () {
 /**
  * Gets a modulegroup name based on the id
  *
- * @param int $modulegroup_id The id of the modulegroup
+ * @param int The id of the modulegroup
  *
  * @return string The modulegroup name
  */	
diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php
index c78c10efa2..f462725e8b 100644
--- a/pandora_console/include/functions_events.php
+++ b/pandora_console/include/functions_events.php
@@ -6,8 +6,9 @@
 // Please see http://pandora.sourceforge.net for full contribution list
 
 // This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
+// modify it under the terms of the GNU Lesser General Public License (LGPL)
 // as published by the Free Software Foundation for version 2.
+// 
 // This program is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
@@ -26,7 +27,8 @@
 function delete_event ($id_event) {
 	global $config;
 	
-	$id_event = (array) safe_int ($id_event, 1); //Cleans up the selection for all unwanted values also casts any single values as an array 
+	//Cleans up the selection for all unwanted values also casts any single values as an array 
+	$id_event = (array) safe_int ($id_event, 1);
 	
 	process_sql ("SET AUTOCOMMIT = 0;");
 	process_sql ("START TRANSACTION;");
@@ -71,7 +73,8 @@ function delete_event ($id_event) {
 function process_event_validate ($id_event) {
 	global $config;
 	
-	$id_event = (array) safe_int ($id_event, 1); //Cleans up the selection for all unwanted values also casts any single values as an array 
+	//Cleans up the selection for all unwanted values also casts any single values as an array 
+	$id_event = (array) safe_int ($id_event, 1);
 	
 	process_sql ("SET AUTOCOMMIT = 0;");
 	process_sql ("START TRANSACTION;");
@@ -145,11 +148,11 @@ function get_event_description ($id_event) {
  */
 function create_event ($event, $id_group, $id_agent, $status = 0, $id_user = "", $event_type = "unknown", $priority = 0, $id_agent_module = 0, $id_aam = 0) {
 	$sql = sprintf ('INSERT INTO tevento (id_agente, id_grupo, evento, timestamp, 
-					estado, utimestamp, id_usuario, event_type, criticity,
-					id_agentmodule, id_alert_am) 
-					VALUES (%d, %d, "%s", NOW(), %d, NOW(), "%s", "%s", %d, %d, %d)',
-					$id_agent, $id_group, $event, $status, $id_user, $event_type,
-					$priority, $id_agent_module, $id_aam);
+		estado, utimestamp, id_usuario, event_type, criticity,
+		id_agentmodule, id_alert_am) 
+		VALUES (%d, %d, "%s", NOW(), %d, NOW(), "%s", "%s", %d, %d, %d)',
+		$id_agent, $id_group, $event, $status, $id_user, $event_type,
+		$priority, $id_agent_module, $id_aam);
 	
 	return (int) process_sql ($sql, "insert_id");
 }
@@ -286,4 +289,4 @@ function print_events_table ($filter = "", $limit = 10, $width = 440, $return =
 		return $return;
 	}
 }
-?>
\ No newline at end of file
+?>
diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php
index 97edf558e3..c831814cf3 100644
--- a/pandora_console/include/functions_html.php
+++ b/pandora_console/include/functions_html.php
@@ -23,16 +23,16 @@
  * 
  * Based on choose_from_menu() from Moodle 
  * 
- * @param array $fields Array with dropdown values. Example: $fields["value"] = "label"
- * @param string $name Select form name
- * @param variant $selected Current selected value. Can be a single value or an
+ * @param array Array with dropdown values. Example: $fields["value"] = "label"
+ * @param string Select form name
+ * @param variant Current selected value. Can be a single value or an
  * array of selected values (in combination with multiple)
- * @param string $script Javascript onChange code.
- * @param string $nothing Label when nothing is selected.
- * @param variant $nothing_value Value when nothing is selected
- * @param bool $return Whether to return an output string or echo now (optional, echo by default).
- * @param bool $multiple Set the input to allow multiple selections (optional, single selection by default).
- * @param bool $sort Whether to sort the options or not (optional, unsorted by default).
+ * @param string Javascript onChange code.
+ * @param string Label when nothing is selected.
+ * @param variant Value when nothing is selected
+ * @param bool Whether to return an output string or echo now (optional, echo by default).
+ * @param bool Set the input to allow multiple selections (optional, single selection by default).
+ * @param bool Whether to sort the options or not (optional, unsorted by default).
  *
  * @return string HTML code if return parameter is true.
  */
@@ -60,7 +60,8 @@ function print_select ($fields, $name, $selected = '', $script = '', $nothing =
 		if ($nothing_value == $selected) {
 			$output .= " selected";
 		}
-		$output .= '>'.$nothing."</option>"; //You should pass a translated string already
+		//You should pass a translated string already
+		$output .= '>'.$nothing."</option>";
 	}
 
 	if (!empty ($fields)) {
@@ -343,7 +344,7 @@ function print_textarea ($name, $rows, $columns, $value = '', $attributes = '',
 /**
  * Print a nicely formatted table. Code taken from moodle.
  *
- * @param object $table is an object with several properties:
+ * @param object Object with several properties:
  *     $table->head - An array of heading names.
  *     $table->align - An array of column alignments
  *     $table->valign - An array of column alignments
@@ -365,7 +366,7 @@ function print_textarea ($name, $rows, $columns, $value = '', $attributes = '',
  *     $table->title - Title of the table is a single string that will be on top of the table in the head spanning the whole table
  *	   $table->titlestyle - Title style
  *	   $table->titleclass - Title class
- * @param bool $return whether to return an output string or echo now
+ * @param  bool Whether to return an output string or echo now
  *
  * @return string HTML code if return parameter is true.
  */
@@ -544,14 +545,14 @@ function print_table (&$table, $return = false) {
 /**
  * Render a radio button input. Extended version, use print_radio_button() to simplify.
  *
- * @param string $name Input name.
- * @param string $value Input value.
- * @param string $checked Set the button to be marked (optional, unmarked by default).
- * @param bool $disabled Disable the button (optional, button enabled by default).
- * @param string $script Script to execute when onClick event is triggered (optional).
- * @param string $attributes Optional HTML attributes. It's a free string which will be 
+ * @param string Input name.
+ * @param string Input value.
+ * @param string Set the button to be marked (optional, unmarked by default).
+ * @param bool Disable the button (optional, button enabled by default).
+ * @param string Script to execute when onClick event is triggered (optional).
+ * @param string Optional HTML attributes. It's a free string which will be 
 	inserted into the HTML tag, use it carefully (optional).
- * @param bool $return Whether to return an output string or echo now (optional, echo by default).
+ * @param bool Whether to return an output string or echo now (optional, echo by default).
  *
  * @return string HTML code if return parameter is true.
  */
@@ -589,11 +590,11 @@ function print_radio_button_extended ($name, $value, $label, $checkedvalue, $dis
 /**
  * Render a radio button input.
  *
- * @param string $name Input name.
- * @param string $value Input value.
- * @param string $label Label to add after the radio button (optional).
- * @param string $checkedvalue Checked and selected value, the button will be selected if it matches $value (optional).
- * @param bool $return Whether to return an output string or echo now (optional, echo by default).
+ * @param string Input name.
+ * @param string Input value.
+ * @param string Label to add after the radio button (optional).
+ * @param string Checked and selected value, the button will be selected if it matches $value (optional).
+ * @param bool Whether to return an output string or echo now (optional, echo by default).
  *
  * @return string HTML code if return parameter is true.
  */
@@ -609,14 +610,14 @@ function print_radio_button ($name, $value, $label = '', $checkedvalue = '', $re
 /**
  * Render a checkbox button input. Extended version, use print_checkbox() to simplify.
  *
- * @param string $name Input name.
- * @param string $value Input value.
- * @param string $checked Set the button to be marked (optional, unmarked by default).
- * @param bool $disabled Disable the button  (optional, button enabled by default).
- * @param string $script Script to execute when onClick event is triggered (optional).
- * @param string $attributes Optional HTML attributes. It's a free string which will be 
+ * @param string Input name.
+ * @param string Input value.
+ * @param string Set the button to be marked (optional, unmarked by default).
+ * @param bool Disable the button  (optional, button enabled by default).
+ * @param string Script to execute when onClick event is triggered (optional).
+ * @param string Optional HTML attributes. It's a free string which will be 
 	inserted into the HTML tag, use it carefully (optional).
- * @param bool $return Whether to return an output string or echo now (optional, echo by default).
+ * @param bool Whether to return an output string or echo now (optional, echo by default).
  *
  * @return string HTML code if return parameter is true.
  */
@@ -642,10 +643,10 @@ function print_checkbox_extended ($name, $value, $checked, $disabled, $script, $
 /**
  * Render a checkbox button input.
  *
- * @param string $name Input name.
- * @param string $value Input value.
- * @param string $checked Set the button to be marked (optional, unmarked by default).
- * @param bool $return Whether to return an output string or echo now (optional, echo by default).
+ * @param string Input name.
+ * @param string Input value.
+ * @param string Set the button to be marked (optional, unmarked by default).
+ * @param bool Whether to return an output string or echo now (optional, echo by default).
  *
  * @return string HTML code if return parameter is true.
  */
@@ -660,8 +661,8 @@ function print_checkbox ($name, $value, $checked = false, $return = false) {
 /** 
  * Prints only a tip button which shows a text when the user puts the mouse over it.
  * 
- * @param string $text Complete text to show in the tip
- * @param bool $return whether to return an output string or echo now
+ * @param string Complete text to show in the tip
+ * @param bool whether to return an output string or echo now
  *
  * @return string HTML code if return parameter is true.
  */
@@ -716,4 +717,72 @@ function print_image ($src, $return = false, $options = false) {
 		return $output;
 	echo $output;
 }
-?>
\ No newline at end of file
+
+/**
+ * Render an input text element. Extended version, use print_input_text() to simplify.
+ *
+ * @param string Input name.
+ * @param bool Whether to return an output string or echo now (optional, echo by default).
+ * @param array An array with optional HTML parameters. 
+ *	Key size: HTML size attribute.
+ *	Key disabled: Whether to disable the input or not.
+ *	Key class: HTML class
+ */
+function print_input_file ($name, $return = false, $options = false) {
+	$output = '';
+	
+	$output .= '<input type="file" value="" name="'.$name.'" id="file-'.$name.'" ';
+	
+	if ($options) {
+		if (isset ($options['size']))
+			$output .= 'size="'.$options['size'].'"';
+		
+		if (isset ($options['disabled']))
+			$output .= 'disabled="disabled"';
+		
+		if (isset ($options['class']))
+			$output .= 'class="'.$options['class'].'"';
+	}
+	
+	$output .= ' />';
+
+	if ($return)
+		return $output;
+	echo $output;
+}
+
+/**
+ * Render a label for a input elemennt.
+ *
+ * @param string Label text.
+ * @param string Input id to refer.
+ * @param bool Whether to return an output string or echo now (optional, echo by default).
+ * @param array An array with optional HTML parameters. 
+ *	Key html: Extra HTML to add after the label.
+ *	Key class: HTML class
+ */
+function print_label ($text, $id, $return = false, $options = false) {
+	$output = '';
+	
+	$output .= '<label id="label-'.$id.'" ';
+	
+	if ($options) {
+		if (isset ($options['class']))
+			$output .= 'class="'.$options['class'].'" ';
+	}
+	
+	$output .= 'for="'.$id.'" >';
+	$output .= $text;
+	$output .= '</label>';
+	
+	if ($options) {
+		if (isset ($options['html']))
+			$output .= $options['html'];
+	}
+	
+	if ($return)
+		return $output;
+	
+	echo $output;
+}
+?>
diff --git a/pandora_console/include/functions_incidents.php b/pandora_console/include/functions_incidents.php
index 845eadb9ff..9a832a421f 100644
--- a/pandora_console/include/functions_incidents.php
+++ b/pandora_console/include/functions_incidents.php
@@ -5,8 +5,9 @@
 // Please see http://pandora.sourceforge.net for full contribution list
 
 // This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
+// modify it under the terms of the GNU Lesser General Public License (LGPL)
 // as published by the Free Software Foundation for version 2.
+// 
 // This program is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
@@ -41,24 +42,24 @@ function get_incidents_priorities () {
  */
 function print_incidents_priority_img ($id_priority, $return = false) {
 	switch ($id_priority) {
-		case 0:
-			$img = '<img src="images/dot_green.png" /><img src="images/dot_green.png" /><img src="images/dot_yellow.png" />';
-			break;
-		case 1:
-			$img = '<img src="images/dot_green.png" /><img src="images/dot_yellow.png" /><img src="images/dot_yellow.png" />';
-			break;
-		case 2:
-			$img = '<img src="images/dot_yellow.png" /><img src="images/dot_yellow.png" /><img src="images/dot_red.png" />';
-			break;
-		case 3:
-			$img = '<img src="images/dot_yellow.png" /><img src="images/dot_red.png" /><img src="images/dot_red.png" />';
-			break;
-		case 4:
-			$img = '<img src="images/dot_red.png" /><img src="images/dot_red.png" /><img src="images/dot_red.png" />';
-			break;
-		case 10:
-			$img = '<img src="images/dot_green.png" /><img src="images/dot_green.png" /><img src="images/dot_green.png" />';
-			break;
+	case 0:
+		$img = '<img src="images/dot_green.png" /><img src="images/dot_green.png" /><img src="images/dot_yellow.png" />';
+		break;
+	case 1:
+		$img = '<img src="images/dot_green.png" /><img src="images/dot_yellow.png" /><img src="images/dot_yellow.png" />';
+		break;
+	case 2:
+		$img = '<img src="images/dot_yellow.png" /><img src="images/dot_yellow.png" /><img src="images/dot_red.png" />';
+		break;
+	case 3:
+		$img = '<img src="images/dot_yellow.png" /><img src="images/dot_red.png" /><img src="images/dot_red.png" />';
+		break;
+	case 4:
+		$img = '<img src="images/dot_red.png" /><img src="images/dot_red.png" /><img src="images/dot_red.png" />';
+		break;
+	case 10:
+		$img = '<img src="images/dot_green.png" /><img src="images/dot_green.png" /><img src="images/dot_green.png" />';
+		break;
 	}
 	
 	if ($return === false) {
@@ -442,4 +443,4 @@ $result = get_db_sql ($sql);
 if (!empty ($result)) {
 	upgrade_inc13to21 ();
 }
-?>
\ No newline at end of file
+?>
diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php
index bfcaf26efb..5f40dd350b 100644
--- a/pandora_console/include/functions_ui.php
+++ b/pandora_console/include/functions_ui.php
@@ -59,9 +59,9 @@ function print_error_message ($result, $good = '', $bad = '', $attributes = '',
  * @param int $unixtime: Any type of timestamp really, but we prefer unixtime
  * @param bool $return whether to output the string or return it
  * @param array $option: An array with different options for this function
- *		Key html_attr: which html attributes to add (defaults to none)
- *		Key tag: Which html tag to use (defaults to span)
- *		Key prominent: Overrides user preference and display "comparation" or "timestamp"
+ *	Key html_attr: which html attributes to add (defaults to none)
+ *	Key tag: Which html tag to use (defaults to span)
+ *	Key prominent: Overrides user preference and display "comparation" or "timestamp"
  *
  * @return string HTML code if return parameter is true.
  */
diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css
index 4c7d3b0fe9..ca03def764 100644
--- a/pandora_console/include/styles/pandora.css
+++ b/pandora_console/include/styles/pandora.css
@@ -1,7 +1,6 @@
 /* 
 // Pandora FMS - the Flexible Monitoring System
 // =============================================
-
 // Copyright (c) 2004-2008 Sancho Lerena, slerena@gmail.comnt
 // Copyright (c) 2004-2008 Raul Mateos Martin, raulofpandora@gmail.com
 // Copyright (c) 2005-2008 Artica Soluciones Tecnologicas, info@artica.es
@@ -17,7 +16,6 @@
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
-
 @import url(menu.css);
 @import url(tip.css);
 * {
@@ -33,6 +31,7 @@ input, textarea {
 textarea {
 	padding: 5px;
 	height: 100px;
+	width: 100%;
 }
 textarea.conf_editor {
 	padding: 5px;
@@ -96,13 +95,11 @@ a.white_bold {
 	text-decoration: none;
 	font-weight: bold;
 }
-
 a.white_grey_bold {
 	color: #999;
 	text-decoration: none;
 	font-weight: bold;
 }
-
 a.white {
 	color: #eee;
 	text-decoration: none;
@@ -187,7 +184,7 @@ div#main {
 	padding-bottom: 20px;
 	margin-bottom: 25px;
 	background-color: #fefefe;
-    background-image: url(../../images/backgrounds/background4.jpg);
+	background-image: url(../../images/backgrounds/background4.jpg);
 	margin-top: 0px;
 	margin-left: 0px;
 	margin-right: 0px;
@@ -222,8 +219,8 @@ div#foot {
 }
 label {
 	display: block;
-	float: left;
 	padding-top: 4px;
+	font-weight: bold;
 }
 th > label {
 	padding-top: 7px;
@@ -253,35 +250,35 @@ input.sub {
 	border-right-color: #708090;
 	-moz-border-radius: 5%;
 	font-size: 8pt;
+	background-color: #e5e5e5;
+}
+input.next, input.upd, input.ok, input.wand, input.delete, input.search, input.copy {
+	padding-right: 21px;
 }
 input.next {
-	padding-right: 21px;
 	background: #e5e5e5 url(../../images/go.png) no-repeat right 2px;
 }
 input.upd {
-	padding-right: 21px;
 	background: #e5e5e5 url(../../images/upd.png) no-repeat right 3px;
 }
 input.wand {
-	padding-right: 21px;
 	background: #e5e5e5 url(../../images/wand.png) no-repeat right 3px;
 }
 input.delete {
-	padding-right: 21px;
 	background: #e5e5e5 url(../../images/cross.png) no-repeat right 3px;
 }
 input.search {
-	padding-right: 21px;
 	background: #e5e5e5 url(../../images/zoom.png) no-repeat right 3px;
 }
 input.copy {
-	padding-right: 21px;
 	background: #e5e5e5 url(../../images/copy.png) no-repeat right 3px;
 }
 input.ok {
-	padding-right: 21px;
 	background: #e5e5e5 url(../../images/ok.png) no-repeat right 3px;
 }
+input.ok {
+	background: #e5e5e5 url(../../images/add.png) no-repeat right 3px;
+}
 table, img {
 	border: 0px;
 }
@@ -289,10 +286,13 @@ th {
 	color: #fff;
 	background-color: #786;
 }
-td.datos, td.datost, td.datosb , td.datos_id, td.datosf9 {
+tr.datos, tr.datost, tr.datosb , tr.datos_id, tr.datosf9,
+tr.datos2, tr.datos2t, tr.datos2b, tr.datos2_id , tr.datos2f9, {
 	background-color: #f9f9f9;
 }
-td.datos2, td.datos2t, td.datos2b, td.datos2_id , td.datos2f9 {
+tr.datos:hover, tr.datost:hover, tr.datosb:hover, tr.datos_id:hover,
+tr.datosf9:hover, tr.datos2:hover, tr.datos2t:hover,
+tr.datos2b:hover, tr.datos2_id:hover, tr.datos2f9:hover {
 	background-color: #efefef; 
 }
 td.datos3 {
@@ -433,22 +433,22 @@ div.title_line {
 	width: 762px;
 }
 #menu_tab_frame {
-    background: #D84437; 
-    width: 805px; 
-    min-height: 22px; 
-    padding-left: 0px;
-    margin-left: -25px;
-    float:left; 
-    border-bottom: 1px solid #778866;
+	background: #D84437; 
+	width: 805px; 
+	min-height: 22px; 
+	padding-left: 0px;
+	margin-left: -25px;
+	float:left; 
+	border-bottom: 1px solid #778866;
 }
 #menu_tab_frame_view {
-    background: #66AA44; 
-    width: 805px; 
-    min-height: 22px; 
-    padding-left: 0px;
-    margin-left: -25px;
-    float:left; 
-    border-bottom: 1px solid #778866;
+	background: #66AA44; 
+	width: 805px; 
+	min-height: 22px; 
+	padding-left: 0px;
+	margin-left: -25px;
+	float:left; 
+	border-bottom: 1px solid #778866;
 }
 #menu_tab .mn, #menu_tab ul, #menu_tab .mn ul {
 	padding: 0px;
@@ -468,12 +468,12 @@ div.title_line {
 	line-height: 18px;
 }
 #menu_tab li.nomn_high a {
-    background: #799E48;
-    color: #fff;
-    padding: 2px 10px 2px 10px;
-    border-left: 2px solid #778866;
-    font-weight: bold;
-    line-height: 18px;
+	background: #799E48;
+	color: #fff;
+	padding: 2px 10px 2px 10px;
+	border-left: 2px solid #778866;
+	font-weight: bold;
+	line-height: 18px;
 }
 #menu_tab .mn li a {
 	display: block;
@@ -481,7 +481,7 @@ div.title_line {
 }
 #menu_tab li.nomn:hover a, #menu_tab li:hover ul a:hover {
 	background: #799E48;
-    color: #fff;
+	color: #fff;
 }
 #menu_tab li:hover a {
 	background: #b2b08a url("../images/arrow.png") no-repeat right 3px;
@@ -540,16 +540,16 @@ span.master {
 	background: url(../../images/master.png) no-repeat;
 }
 span.wmi {
-    background: url(../../images/wmi.png) no-repeat;
+	background: url(../../images/wmi.png) no-repeat;
 }
 span.prediction {
-    background: url(../../images/chart_bar.png) no-repeat;
+	background: url(../../images/chart_bar.png) no-repeat;
 }
 span.plugin {
-    background: url(../../images/plugin.png) no-repeat;
+	background: url(../../images/plugin.png) no-repeat;
 }
 span.export {
-    background: url(../../images/database_refresh.png) no-repeat;
+	background: url(../../images/database_refresh.png) no-repeat;
 }
 span.snmp {
 	background: url(../../images/snmp.png) no-repeat;
@@ -566,11 +566,9 @@ span.rmess {
 span.nrmess {
 	background: url(../../images/email.png) no-repeat;
 }
-
 /* This kind of span do not have any sense, should be replaced on PHP code
 by a real img in code. They are not useful because insert too much margin around
 (for example, not valid to use in the table of server view */
-
 span.users, span.agents, span.data, span.alerts, span.time, span.net,
 span.master, span.snmp, span.binary, span.recon, span.wmi, span.prediction,
 span.plugin, span.plugin, span.export {
@@ -613,7 +611,6 @@ span.rmess, span.nrmess {
 	padding-top: 6px;
 	padding-left: 12em;	
 }
-
 span#logo_text1 {
 	font: bolder 3em Arial, Sans-serif;
 	letter-spacing: -2px;
@@ -630,41 +627,32 @@ span#logo_text2 {
 .bt0 {
 	border-top: 0px;
 }
-
 .action-buttons {
 	text-align: right;
 }
-
 #table-add-item select, #table-add-sla select {
 	width: 180px;
 }
-
 /* classes for event priorities. Sits now in functions.php */
 .datos_green, .datos_greenf9 {
 	background-color: #BBFFA4;
 }
-
 .datos_red, .datos_redf9 {
 	background-color: #FFC0B5;
 }
-
 .datos_yellow, .datos_yellowf9 {
 	background-color: #F4FFBF;
 }
-
 .datos_blue, .datos_bluef9 {
 	background-color: #CDE2EA;
 }
-
 .datos_grey, .datos_greyf9 {
 	background-color: #E4E4E4;
 }
-
 td.datos_greyf9, td.datos_bluef9, td.datos_greenf9, td.datos_redf9, td.datos_yellowf9 {
 	padding: 5px 5px 5px 5px;
 }
 /* end of classes for event priorities */
-
 div#main_pure {
 	background-color: #fefefe;
 	text-align: left;
@@ -673,44 +661,35 @@ div#main_pure {
 	margin-left: 10px;
 	margin-right: 10px;
 }
-
 #table-agent-configuration radio {
 	margin-right: 40px;
 }
-
 .ui-draggable {
 	cursor:move;
 }
-
 #layout_trash_drop {
 	float: right;
 	width: 300px;
 	height: 180px;
 	background: #fff url("../../images/trash.png") no-repeat bottom left;
 }
-
 #layout_trash_drop div {
 	display: block;
 }
-
 #layout_editor_drop {
 	float: left;
 	width: 300px;
 }
-
 .agent_reporting {
 	margin: 5px;
 	padding: 5px;
 }
-
 .report_table, .agent_reporting {
 	border: #CCC outset 3px;
 }
-
 .img_help {
 	cursor: help;
 }
-
 #loading {
 	position:fixed;
 	width: 200px;
@@ -720,15 +699,47 @@ div#main_pure {
 	background-color: #999999;
 	padding: 20px;
 }
-
 /* big_data is used in tactical and logon_ok */
 a.big_data {
 	text-decoration: none; font: bold 2em Arial, Sans-serif;
 }
-
 .notify {
 	background-color: #f7ffa5;
 	text-align: center;
 	font-weight: bold;
 	padding: 8px;
-}
\ No newline at end of file
+}
+.listing {
+	border-collapse: collapse;
+}
+.listing td {
+	border-bottom: 1px solid #CCCCCC;
+	border-top: 1px solid #CCCCCC;
+}
+.left {
+	float: left;
+	text-align: left;
+}
+.right {
+	float: right;
+	text-align: right;
+}
+.top {
+	vertical-align: top
+	margin-top: 0;
+	padding-top: 0;
+}
+ul {
+	list-style-type: none;
+	padding-left: 0;
+	margin-left: 0;
+}
+span.actions {
+	margin-left: 30px;
+}
+code {
+	font-family: courier;
+}
+select#template, select#action {
+	width: 250px;
+}
diff --git a/pandora_console/index.php b/pandora_console/index.php
index dc01108b4f..f0d315e86f 100644
--- a/pandora_console/index.php
+++ b/pandora_console/index.php
@@ -165,7 +165,7 @@ if (! isset ($_SESSION['id_usuario']) && isset ($_GET["login"])) {
 		logon_db ($nick, $REMOTE_ADDR);
 		$_SESSION['id_usuario'] = $nick;
 		$config['id_user'] = $nick;
-		unset ($_GET['pass'], $pass);
+		unset ($_GET['pass'], $pass, $_POST['pass'], $_REQUEST['pass']);
 	} else {
 		// User not known
 		$login_failed = true;
diff --git a/pandora_console/operation/agentes/networkmap.php b/pandora_console/operation/agentes/networkmap.php
index 79fc2fa21c..a155f2e632 100644
--- a/pandora_console/operation/agentes/networkmap.php
+++ b/pandora_console/operation/agentes/networkmap.php
@@ -15,8 +15,6 @@
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-
-
 // Load global vars
 require("include/config.php");
 
@@ -369,7 +367,6 @@ if ($result !== false) {
 
 <link rel="stylesheet" href="include/styles/cluetip.css" type="text/css" />
 <script type="text/javascript" src="include/javascript/jquery.js"></script>
-<script type="text/javascript" src="include/javascript/jquery.js"></script>
 <script type="text/javascript" src="include/javascript/jquery.cluetip.js"></script>
 
 <script language="javascript" type="text/javascript">
diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php
index f94157fc7c..2d6ba25d81 100644
--- a/pandora_console/operation/menu.php
+++ b/pandora_console/operation/menu.php
@@ -39,7 +39,6 @@ if (give_acl ($config['id_user'], 0, "AR")) {
 	$sub["operation/agentes/estado_grupo"]["refr"] = 60;
 	
 	$sub["operation/agentes/networkmap"]["text"] = __('Network Map');
-	$sub["operation/agentes/networkmap"]["refr"] = 0;
 	
 	$sub["operation/agentes/estado_agente"]["text"] = __('Agent detail');
 	$sub["operation/agentes/estado_agente"]["refr"] = 60;
@@ -88,7 +87,7 @@ if (give_acl ($config['id_user'], 0, "AR")) {
 	$menu["estado_server"]["id"] = "oper-servers";
 	//End of server view
 }
-				
+
 enterprise_hook ('inventory_menu');
 
 //Incidents
@@ -100,10 +99,8 @@ if (give_acl ($config['id_user'], 0, "IR") == 1) {
 	
 	$sub = array ();
 	$sub["operation/incidents/incident_search"]["text"] = __('Search incidents');
-	$sub["operation/incidents/incident_search"]["refr"] = 0;
 	
 	$sub["operation/incidents/incident_statistics"]["text"] = __('Statistics');
-	$sub["operation/incidents/incident_statistics"]["refr"] = 0;
 	
 	$menu["incidencias"]["sub"] = $sub;
 }
@@ -118,40 +115,33 @@ if (give_acl ($config['id_user'], 0, "AR")) {
 	
 	$sub = array ();
 	$sub["operation/events/event_statistics"]["text"] = __('Statistics');
-	$sub["operation/events/event_statistics"]["refr"] = 0;
 	
 	//RSS
 	$sub["operation/events/events_rss.php"]["text"] = __('RSS');
-	$sub["operation/events/events_rss.php"]["refr"] = 0;
 	$sub["operation/events/events_rss.php"]["type"] = "direct";
 	
 	//CSV
 	$sub["operation/events/export_csv.php"]["text"] = __('CSV File');
-	$sub["operation/events/export_csv.php"]["refr"] = 0;
 	$sub["operation/events/export_csv.php"]["type"] = "direct";
 	
 	//Marquee
 	$sub["operation/events/events_marquee.php"]["text"] = __('Marquee');
-	$sub["operation/events/events_marquee.php"]["refr"] = 0;
 	$sub["operation/events/events_marquee.php"]["type"] = "direct";
 	
 	$menu["eventos"]["sub"] = $sub;
 	
 	// Users
 	$menu["usuarios"]["text"] = __('View users');
-	$menu["usuarios"]["refr"] = 0;
 	$menu["usuarios"]["sec2"] = "operation/users/user";
 	$menu["usuarios"]["id"] = "oper-users";
 	
 	$sub = array ();
 	$sub["operation/users/user_edit"]["text"] = __('Edit my user');
-	$sub["operation/users/user_edit"]["refr"] = 0;
 	$sub["operation/users/user_edit"]["options"]["name"] = "ver";
 	$sub["operation/users/user_edit"]["options"]["value"] = $config["id_user"];
 	
 	if (give_acl ($config["id_user"], 0, "UM")) {
 		$sub["operation/users/user_statistics"]["text"] = __('Statistics');
-		$sub["operation/users/user_statistics"]["refr"] = 0;
 	}
 	
 	$menu["usuarios"]["sub"] = $sub;
@@ -171,7 +161,6 @@ if (give_acl ($config['id_user'], 0, "AR")) {
 	
 	$sub = array ();
 	$sub["operation/messages/message"]["text"] = __('Messages to groups');
-	$sub["operation/messages/message"]["refr"] = 0;
 	$sub["operation/messages/message"]["options"]["name"] = "nuevo_g";
 	$sub["operation/messages/message"]["options"]["value"] = 1;
 	
@@ -179,23 +168,19 @@ if (give_acl ($config['id_user'], 0, "AR")) {
 	
 	// Reporting
 	$menu["reporting"]["text"] = __('Reporting');
-	$menu["reporting"]["refr"] = 0;
 	$menu["reporting"]["sec2"] = "operation/reporting/custom_reporting";
 	$menu["reporting"]["id"] = "oper-reporting";
 	
 	$sub = array ();
 	$sub["operation/reporting/custom_reporting"]["text"] = __('Custom reporting');
-	$sub["operation/reporting/custom_reporting"]["refr"] = 0;
 
 	$sub["operation/reporting/graph_viewer"]["text"] = __('Custom graphs');	
-	$sub["operation/reporting/graph_viewer"]["refr"] = 0;
 	
 	$menu["reporting"]["sub"] = $sub;
 	
 	// Extensions menu additions
 	if (is_array ($config['extensions'])) {
 		$menu["extensions"]["text"] = __('Extensions');
-		$menu["extensions"]["refr"] = 0;
 		$menu["extensions"]["sec2"] = "operation/extensions";
 		$menu["extensions"]["id"] = "oper-extensions";
 		
@@ -212,4 +197,4 @@ if (give_acl ($config['id_user'], 0, "AR")) {
 		$menu["extensions"]["sub"] = $sub;
 	}
 }
-?>
\ No newline at end of file
+?>
diff --git a/pandora_console/operation/reporting/graph_viewer.php b/pandora_console/operation/reporting/graph_viewer.php
index ec66a7f900..d5ee5eaaad 100644
--- a/pandora_console/operation/reporting/graph_viewer.php
+++ b/pandora_console/operation/reporting/graph_viewer.php
@@ -21,6 +21,8 @@
 
 check_login ();
 
+require_once ('include/functions_custom_graphs.php');
+
 $delete_graph = (bool) get_parameter ('delete_graph');
 $view_graph = (bool) get_parameter ('view_graph');
 $id = (int) get_parameter ('id');
@@ -82,7 +84,6 @@ if ($view_graph) {
 		if ($stacked == -1)
 			$stacked = $graph["stacked"];
 		
-
 		$name = $graph["name"];
 		if (($graph["private"]==1) && ($graph["id_user"] != $id_user)){
 			audit_db($config['id_user'],$REMOTE_ADDR, "ACL Violation","Trying to access to a custom graph not allowed");
@@ -90,29 +91,11 @@ if ($view_graph) {
 			exit;
 		}
 		
-		$sql2="SELECT * FROM tgraph_source WHERE id_graph = $id";
-		$res2=mysql_query($sql2);
-		while ($graph_source = mysql_fetch_array($res2)) {
-			$weight = $graph_source["weight"];
-			$id_agent_module = $graph_source["id_agent_module"];
-			$id_grupo = get_db_sql ("SELECT id_grupo FROM tagente, tagente_modulo WHERE tagente_modulo.id_agente_modulo = $id_agent_module AND tagente.id_agente = tagente_modulo.id_agente");
-			if (give_acl($config["id_user"], $id_grupo, "AR")==1){
-				if (!isset($modules)){
-					$modules = $id_agent_module;
-					$weights = $weight;
-				} else {
-					$modules = $modules.",".$id_agent_module;
-					$weights = $weights.",".$weight;
-				}
-			}
-		}
 		echo "<h2>".__('Reporting')." &gt; ";
 		echo __('Combined image render')."</h2>";
 		echo "<table class='databox_frame' cellpadding=0 cellspacing=0>";
 		echo "<tr><td>";
-		echo "<img 
-src='reporting/fgraph.php?tipo=combined&height=$height&width=$width&id=$modules&period=$period&weight_l=$weights&stacked=$stacked' 
-border=1 alt=''>";
+		print_custom_graph ($id, $height, $width, $period, $stacked);
 		echo "</td></tr></table>";
 		$period_label = human_time_description ($period);
 		echo "<form method='POST' action='index.php?sec=reporting&sec2=operation/reporting/graph_viewer&view_graph=1&id=$id'>";
@@ -120,18 +103,9 @@ border=1 alt=''>";
 		echo "<tr><td class='datos'>";
 		echo "<b>".__('Period')."</b>";
 		echo "<td class='datos'>";
-		$periods = array ();
-		$periods[1] = __('1 hour');
-		$periods[2] = '2 '.__('hours');
-		$periods[3] = '3 '.__('hours');
-		$periods[6] = '6 '.__('hours');
-		$periods[12] = '12 '.__('hours');
-		$periods[24] = __('1 day');
-		$periods[48] = __('2 days');
-		$periods[360] = __('1 week');
-		$periods[720] = __('1 month');
-		$periods[4320] = __('6 months');
-		print_select ($periods, 'period', intval ($period / 3600), '', '', 0);
+		
+		print_select (get_custom_graph_periods (), 'period', intval ($period / 3600),
+			'', '', 0, false, false, false);
 
 		echo "<td class='datos'>";
 		$stackeds = array ();
@@ -158,43 +132,35 @@ border=1 alt=''>";
 echo "<h2>" . __('Reporting') . " &gt; ";
 echo __('Custom graph viewer') . "</h2>";
 
-$color=1;
-$sql="SELECT * FROM tgraph ORDER by name";
-$res=mysql_query($sql);
-if (mysql_num_rows($res)) {
-	echo "<table width='500' cellpadding=4 cellpadding=4 class='databox_frame'>";
-	echo "<tr>
-		<th>".__('Graph name')."</th>
-		<th>".__('Description')."</th>
-		<th>".__('View')."</th>";
+$graphs = get_user_custom_graphs ();
+if (! empty ($graphs)) {
+	$table->width = '500px';
+	$tale->class = 'databox_frame';
+	$table->align = array ();
+	$table->align[2] = 'center';
+	$table->head = array ();
+	$table->head[0] = __('Graph name');
+	$table->head[1] = __('Description');
 	if (give_acl ($config['id_user'], 0, "AW"))
-		echo "<th>".__('Delete')."</th>";
-	echo "</tr>";
-
-	while ($graph = mysql_fetch_array($res)){
-		if (($graph["private"] == 0) || ($graph["id_user"] == $id_user)) {
-			// Calculate table line color
-			if ($color == 1){
-				$tdcolor = "datos";
-				$color = 0;
-			}
-			else {
-				$tdcolor = "datos2";
-				$color = 1;
-			}
-			echo "<tr>";
-			echo "<td valign='top' class='$tdcolor'>".$graph["name"]."</td>";
-			echo "<td class='$tdcolor'>".$graph["description"]."</td>";
-			$id =  $graph["id_graph"];
-			echo "<td valign='middle' class='$tdcolor' align='center'><a href='index.php?sec=reporting&sec2=operation/reporting/graph_viewer&view_graph=1&id=$id'><img src='images/images.png'></a>";
-			
-			if (give_acl ($config['id_user'], 0, "AW")) {
-				echo "<td class='$tdcolor' align='center'><a href='index.php?sec=reporting&sec2=operation/reporting/graph_viewer&delete_graph=1&id=$id' ".'onClick="if (!confirm(\' '.__('Are you sure?').'\')) return false;">';
-				echo "<img src='images/cross.png'></a></td>";
-			}
+		$table->head[2] = __('Delete');
+	$table->data = array ();
+	
+	foreach ($graphs as $graph) {
+		$data = array ();
+		
+		$data[0] = '<a href="index.php?sec=reporting&sec2=operation/reporting/graph_viewer&view_graph=1&id='.
+			$graph['id_graph'].'">'.$graph['name'].'</a>';
+		$data[1] = $graph["description"];
+		
+		if (give_acl ($config['id_user'], 0, "AW")) {
+			$data[2] = '<a href="index.php?sec=reporting&sec2=operation/reporting/graph_viewer&delete_graph=1&id='
+				.$graph['id_graph'].'" onClick="if (!confirm(\''.__('Are you sure?').'\'))
+					return false;"><img src="images/cross.png" /></a>';
 		}
+		
+		array_push ($table->data, $data);
 	}
-	echo "</table>";
+	print_table ($table);
 } else {
 	echo "<div class='nf'>".__('There are no defined reportings')."</div>";
 }
diff --git a/pandora_console/operation/reporting/reporting_viewer.php b/pandora_console/operation/reporting/reporting_viewer.php
index b6a7a72c90..a34333501b 100644
--- a/pandora_console/operation/reporting/reporting_viewer.php
+++ b/pandora_console/operation/reporting/reporting_viewer.php
@@ -16,7 +16,6 @@
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-
 // Login check
 require("include/config.php");
 
diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql
index 3f2ed2f89c..66e1bfb034 100644
--- a/pandora_console/pandoradb.sql
+++ b/pandora_console/pandoradb.sql
@@ -200,13 +200,96 @@ CREATE TABLE  IF NOT EXISTS  `talert_snmp` (
   PRIMARY KEY  (`id_as`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
+CREATE TABLE  IF NOT EXISTS `talert_commands` (
+  `id` int(10) unsigned NOT NULL auto_increment,
+  `name` varchar(100) NOT NULL default '',
+  `command` varchar(500) default '',
+  `description` varchar(255) default '',
+  `internal` tinyint(1) default 0,
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE  IF NOT EXISTS `talert_actions` (
+  `id` int(10) unsigned NOT NULL auto_increment,
+  `name` varchar(255) default '',
+  `id_alert_command` int(10) unsigned NOT NULL,
+  `field1` varchar(255) NOT NULL default '',
+  `field2` varchar(255) default '',
+  `field3` varchar(255) default '',
+  PRIMARY KEY  (`id`),
+  FOREIGN KEY (`id_alert_command`) REFERENCES talert_commands(`id`)
+    ON DELETE RESTRICT ON UPDATE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `talert_templates` (
+  `id` int(10) unsigned NOT NULL auto_increment,
+  `name` varchar(255) default '',
+  `description` mediumtext default '',
+  `id_alert_action` int(10) unsigned NULL,
+  `field1` varchar(255) default '',
+  `field2` varchar(255) default '',
+  `field3` mediumtext NOT NULL,
+  `type` ENUM ('regex', 'max_min', 'max', 'min', 'equal', 'not_equal'),
+  `value` varchar(255) default '',
+  `max_value` double(18,2) default NULL,
+  `min_value` double(18,2) default NULL,
+  `time_threshold` int(10) NOT NULL default '0',
+  `max_alerts` int(4) unsigned NOT NULL default '1',
+  `module_type` int(10) unsigned NOT NULL default '0',
+  `min_alerts` int(4) unsigned NOT NULL default '0',
+  `alert_text` varchar(255) default '',
+  `time_from` time default '00:00:00',
+  `time_to` time default '00:00:00',
+  `monday` tinyint(1) default '1',
+  `tuesday` tinyint(1) default '1',
+  `wednesday` tinyint(1) default '1',
+  `thursday` tinyint(1) default '1',
+  `friday` tinyint(1) default '1',
+  `saturday` tinyint(1) default '1',
+  `sunday` tinyint(1) default '1',
+  `recovery_notify` tinyint(1) default '0',
+  `field2_recovery` varchar(255) NOT NULL default '',
+  `field3_recovery` mediumtext NOT NULL,
+  PRIMARY KEY  (`id`),
+  FOREIGN KEY (`id_alert_action`) REFERENCES talert_actions(`id`)
+    ON DELETE RESTRICT ON UPDATE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `talert_template_modules` (
+  `id` int(10) unsigned NOT NULL auto_increment,
+  `id_agent_module` int(10) unsigned NOT NULL,
+  `id_alert_template` int(10) unsigned NOT NULL,
+  `internal_counter` int(4) default '0',
+  `last_fired` bigint(20) NOT NULL default '0',
+  `times_fired` int(3) NOT NULL default '0',
+  `disabled` tinyint(1) default '0',
+  `priority` tinyint(4) default '0',
+  `force_execution` tinyint(1) default '0',
+  PRIMARY KEY (`id`),
+  FOREIGN KEY (`id_agent_module`) REFERENCES tagente_modulo(`id_agente_modulo`)
+    ON DELETE CASCADE ON UPDATE CASCADE,
+  FOREIGN KEY (`id_alert_template`) REFERENCES talert_templates(`id`)
+    ON DELETE RESTRICT ON UPDATE CASCADE,
+  UNIQUE (`id_agent_module`, `id_alert_template`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `talert_template_module_actions` (
+  `id_alert_template_module` int(10) unsigned NOT NULL,
+  `id_alert_action` int(10) unsigned NOT NULL,
+  `fires_min` int(3) unsigned default 0,
+  `fires_max` int(3) unsigned default 0,
+  FOREIGN KEY (`id_alert_template_module`) REFERENCES talert_template_modules(`id`)
+    ON DELETE CASCADE ON UPDATE CASCADE,
+  FOREIGN KEY (`id_alert_action`) REFERENCES talert_actions(`id`)
+    ON DELETE RESTRICT ON UPDATE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 CREATE TABLE  IF NOT EXISTS `talerta` (
-  `id_alerta` int(10) unsigned NOT NULL auto_increment,
-  `nombre` varchar(100) NOT NULL default '',
-  `comando` varchar(500) default '',
-  `descripcion` varchar(255) default '',
-  PRIMARY KEY  (`id_alerta`)
+  `id` int(10) unsigned NOT NULL auto_increment,
+  `id_alert_module` int(10) unsigned NOT NULL,
+  `id_alert_template` int(10) unsigned NOT NULL,
+  `id_alert_action` int(10) unsigned NOT NULL,
+  PRIMARY KEY  (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 CREATE TABLE  IF NOT EXISTS `tcompound_alert` (
@@ -251,8 +334,8 @@ CREATE TABLE `talerta_agente_modulo` (
   `al_f3_recovery` mediumtext NOT NULL,
   `flag` tinyint(1) unsigned default '0',
   PRIMARY KEY  (`id_aam`),
-	KEY `id_agente_modulo` (`id_agente_modulo`),
-	KEY `disable` (`disable`)
+  KEY `id_agente_modulo` (`id_agente_modulo`),
+  KEY `disable` (`disable`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;