From 14b85c78aff0585aba2303606686452a180d84a7 Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Mon, 07 May 2012 11:16:55 -0400
Subject: [PATCH] Added mail account import tool.

---
 interface/web/tools/lib/menu.d/import.menu.php       |   22 ++
 interface/web/tools/lib/lang/en.lng                  |    1 
 interface/web/tools/templates/import_ispconfig.htm   |  105 +++++++++++++
 interface/web/tools/lib/lang/en_import_ispconfig.lng |   24 +++
 interface/web/tools/import_ispconfig.php             |  303 +++++++++++++++++++++++++++++++++++++
 interface/web/tools/lib/lang/en_resync.lng           |    2 
 6 files changed, 456 insertions(+), 1 deletions(-)

diff --git a/interface/web/tools/import_ispconfig.php b/interface/web/tools/import_ispconfig.php
new file mode 100644
index 0000000..eb0a2f3
--- /dev/null
+++ b/interface/web/tools/import_ispconfig.php
@@ -0,0 +1,303 @@
+<?php
+/*
+Copyright (c) 2012, Till Brehm, projektfarm Gmbh, ISPConfig UG
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+//* Check permissions for module
+$app->auth->check_module_permissions('admin');
+
+//* This is only allowed for administrators
+if(!$app->auth->is_admin()) die('only allowed for administrators.');
+
+$app->uses('tpl,validate_dns');
+
+$app->tpl->newTemplate('form.tpl.htm');
+$app->tpl->setInclude('content_tpl', 'templates/import_ispconfig.htm');
+$msg = '';
+$error = '';
+
+//* load language file
+$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_import_ispconfig.lng';
+include($lng_file);
+$app->tpl->setVar($wb);
+
+if(isset($_POST['connected'])) {
+	$connected = intval($_POST['connected']);
+	if($connected == 0) {
+
+		//* Try to connect to remote server
+		if(empty($_POST['remote_server'])) $error .= 'Remote Server is empty.</br>';
+		if(empty($_POST['remote_user'])) $error .= 'Remote User is empty.</br>';
+		if(empty($_POST['remote_password'])) $error .= 'Remote Password is empty.</br>';
+
+		if($error == '') {
+			try {
+				$client = new SoapClient(null, array('location' => $_POST['remote_server'],
+                                     'uri'      => $_POST['remote_server'].'/index.php',
+									 'trace' => 1,
+									 'exceptions' => 1));
+				
+				if($remote_session_id = $client->login($_POST['remote_user'],$_POST['remote_password'])) {
+					$connected = 1;
+					$msg .= 'Successfully connected to remote server.';
+				}
+			} catch (SoapFault $e) {
+				//echo $client->__getLastResponse();
+				$error .= $e->getMessage();
+				$connected = 0;
+			}
+		}
+	}
+	
+	if($connected == 1) {
+		
+		//* Fill the client select field
+		$sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0 ORDER BY name";
+		$clients = $app->db->queryAllRecords($sql);
+		$client_select = "";
+		if(is_array($clients)) {
+			foreach( $clients as $client) {
+				$selected = @($client['groupid'] == $_POST['client_group_id'])?'SELECTED':'';
+				$client_select .= "<option value='$client[groupid]' $selected>$client[name]</option>\r\n";
+			}
+		}
+		$app->tpl->setVar("client_group_id",$client_select);
+		
+		
+		try {
+			$client = new SoapClient(null, array('location' => $_POST['remote_server'],
+                                'uri'      => $_POST['remote_server'].'/index.php',
+								'trace' => 1,
+								'exceptions' => 1));
+		
+		if(!isset($remote_session_id)) $remote_session_id = $_POST['remote_session_id'];
+		
+		//* Get all email domains
+		$mail_domains = $client->mail_domain_get($remote_session_id, array('active' => 'y'));
+		$mail_domain_select = '<option value="">-- select domain --</option>';
+		if(is_array($mail_domains)) {
+			foreach( $mail_domains as $mail_domain) {
+				$selected = @($mail_domain['domain'] == $_POST['mail_domain'])?'SELECTED':'';
+				$mail_domain_select .= "<option value='$mail_domain[domain]' $selected>$mail_domain[domain]</option>\r\n";
+			}
+		}
+		$app->tpl->setVar("mail_domain",$mail_domain_select);
+		
+		//* Do the import
+		if($_POST['mail_domain'] != '') start_domain_import($_POST['mail_domain']);
+		
+		
+		
+		} catch (SoapFault $e) {
+			//echo $client->__getLastResponse();
+			$error .= $e->getMessage();
+			$connected = 0;
+		}
+		
+	}
+	
+}
+
+$app->tpl->setVar('remote_server',$_POST['remote_server']);
+$app->tpl->setVar('remote_user',$_POST['remote_user']);
+$app->tpl->setVar('remote_password',$_POST['remote_password']);
+$app->tpl->setVar('connected',$connected);
+$app->tpl->setVar('remote_session_id',$remote_session_id);
+$app->tpl->setVar('msg',$msg);
+$app->tpl->setVar('error',$error);
+
+$app->tpl_defaults();
+$app->tpl->pparse();
+
+###########################################################
+
+function start_domain_import($mail_domain) {
+	global $app, $conf, $client, $msg, $error, $remote_session_id;
+	
+	//* Get the user and groupid for the new records
+	$sys_groupid = intval($_POST['client_group_id']);
+	$tmp = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE default_group = $sys_groupid");
+	$sys_userid = intval($tmp['userid']);
+	unset($tmp);
+	if($sys_groupid == 0) $error .= 'Inavlid groupid<br />';
+	if($sys_userid == 0) $error .= 'Inavlid Userid<br />';
+	
+	//* get the mail domain record
+	$mail_domain_rec = $client->mail_domain_get($remote_session_id, array('domain' => $mail_domain));
+	if(is_array($mail_domain_rec)) {
+		$mail_domain_rec = $mail_domain_rec[0];
+		$tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM mail_domain WHERE domain = '".$app->db->quote($mail_domain)."'");
+		if($tmp['number'] > 0) $error .= 'Domain '.$mail_domain.' exists already in local database.<br />';
+		unset($tmp);
+		
+		//* Change the record owner and remove the index field
+		$mail_domain_rec['sys_userid'] = $sys_userid;
+		$mail_domain_rec['sys_groupid'] = $sys_groupid;
+		unset($mail_domain_rec['domain_id']);
+		
+		//* Insert domain if no error occurred
+		if($error == '') {
+			$app->db->datalogInsert('mail_domain', $mail_domain_rec, 'domain_id');
+			$msg .= "Imported mail domain ".$mail_domain_rec['domain']."<br />";
+		} else {
+			return false;
+		}
+		
+		//* Import mailboxes
+		if(isset($_POST['import_mailbox']) && $_POST['import_mailbox'] == 1) {
+			$mail_users = $client->mail_user_get($remote_session_id, array('email' => '%@'.$mail_domain));
+			if(is_array($mail_users)) {
+				foreach($mail_users as $mail_user) {
+					$tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE email = '".$app->db->quote($mail_user['email'])."'");
+					if($tmp['number'] == 0) {
+						
+						//* Prepare record
+						$mail_user['sys_userid'] = $sys_userid;
+						$mail_user['sys_groupid'] = $sys_groupid;
+						$remote_mailuser_id = $mail_user['mailuser_id'];
+						unset($mail_user['mailuser_id']);
+						if(!isset($_POST['import_user_filter'])) $mail_user['custom_mailfilter'] = '';
+						
+						//* Insert record in DB
+						$local_mailuser_id = $app->db->datalogInsert('mail_user', $mail_user, 'mailuser_id');
+						$msg .= "Imported mailbox ".$mail_user['email']."<br />";
+						
+						//* Import mail user filters
+						if(isset($_POST['import_user_filter']) && $_POST['import_user_filter'] == 1 && $local_mailuser_id > 0) {
+							
+							$mail_user_filters = $client->mail_user_filter_get($remote_session_id, array('mailuser_id' => $remote_mailuser_id));
+							
+							if(is_array($mail_user_filters)) {
+								foreach($mail_user_filters as $mail_user_filter) {
+									$mail_user_filter['sys_userid'] = $sys_userid;
+									$mail_user_filter['sys_groupid'] = $sys_groupid;
+									$mail_user_filter['mailuser_id'] = $local_mailuser_id;
+									unset($mail_user_filter['filter_id']);
+									
+									//* Insert record in DB
+									$app->db->datalogInsert('mail_user_filter', $mail_user_filter, 'filter_id');
+									$msg .= "Imported mailbox filter ".$mail_user['email'].": ".$mail_user_filter['rulename']."<br />";
+								}
+							}
+						}
+					} else {
+						$error .= "Mailbox ".$mail_user['email']." exists in local database. Skipped import of mailbox<br />";
+					}
+					
+				}
+			}
+		}
+		
+		//* Import email aliases
+		if(isset($_POST['import_alias']) && $_POST['import_alias'] == 1) {
+			$mail_aliases = $client->mail_alias_get($remote_session_id, array('type' => 'alias', 'destination' => '%@'.$mail_domain));
+			if(is_array($mail_aliases)) {
+				foreach($mail_aliases as $mail_alias) {
+					$tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE `type` = 'alias' AND source = '".$app->db->quote($mail_alias['source'])."' AND destination = '".$app->db->quote($mail_alias['destination'])."'");
+					if($tmp['number'] == 0) {
+						$mail_alias['sys_userid'] = $sys_userid;
+						$mail_alias['sys_groupid'] = $sys_groupid;
+						unset($mail_alias['forwarding_id']);
+						$app->db->datalogInsert('mail_forwarding', $mail_alias, 'forwarding_id');
+						$msg .= "Imported email alias ".$mail_alias['source']."<br />";
+					} else {
+						$error .= "Email alias ".$mail_alias['source']." exists in local database. Skipped import.<br />";
+					}
+					
+				}
+			}
+		}
+		
+		//* Import domain aliases
+		if(isset($_POST['import_aliasdomain']) && $_POST['import_aliasdomain'] == 1) {
+			$mail_aliases = $client->mail_alias_get($remote_session_id, array('type' => 'aliasdomain', 'destination' => '@'.$mail_domain));
+			if(is_array($mail_aliases)) {
+				foreach($mail_aliases as $mail_alias) {
+					$tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE `type` = 'aliasdomain' AND source = '".$app->db->quote($mail_alias['source'])."' AND destination = '".$app->db->quote($mail_alias['destination'])."'");
+					if($tmp['number'] == 0) {
+						$mail_alias['sys_userid'] = $sys_userid;
+						$mail_alias['sys_groupid'] = $sys_groupid;
+						unset($mail_alias['forwarding_id']);
+						$app->db->datalogInsert('mail_forwarding', $mail_alias, 'forwarding_id');
+						$msg .= "Imported email aliasdomain ".$mail_alias['source']."<br />";
+					} else {
+						$error .= "Email aliasdomain ".$mail_alias['source']." exists in local database. Skipped import.<br />";
+					}
+					
+				}
+			}
+		}
+		
+		//* Import email forward
+		if(isset($_POST['import_forward']) && $_POST['import_forward'] == 1) {
+			$mail_forwards = $client->mail_forward_get($remote_session_id, array('type' => 'forward', 'source' => '%@'.$mail_domain));
+			if(is_array($mail_forwards)) {
+				foreach($mail_forwards as $mail_forward) {
+					$tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE `type` = 'forward' AND source = '".$app->db->quote($mail_forward['source'])."' AND destination = '".$app->db->quote($mail_forward['destination'])."'");
+					if($tmp['number'] == 0) {
+						$mail_forward['sys_userid'] = $sys_userid;
+						$mail_forward['sys_groupid'] = $sys_groupid;
+						unset($mail_forward['forwarding_id']);
+						$app->db->datalogInsert('mail_forwarding', $mail_forward, 'forwarding_id');
+						$msg .= "Imported email forward ".$mail_forward['source']."<br />";
+					} else {
+						$error .= "Email forward ".$mail_forward['source']." exists in local database. Skipped import.<br />";
+					}
+					
+				}
+			}
+		}
+		
+		//* Import spamfilter
+		if(isset($_POST['import_spamfilter']) && $_POST['import_spamfilter'] == 1) {
+			$mail_spamfilters = $client->mail_spamfilter_user_get($remote_session_id, array('email' => '%@'.$mail_domain));
+			if(is_array($mail_spamfilters)) {
+				foreach($mail_spamfilters as $mail_spamfilter) {
+					$tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM spamfilter_users WHERE email = '".$app->db->quote($mail_spamfilter['email'])."'");
+					if($tmp['number'] == 0) {
+						$mail_spamfilter['sys_userid'] = $sys_userid;
+						$mail_spamfilter['sys_groupid'] = $sys_groupid;
+						unset($mail_spamfilter['id']);
+						$app->db->datalogInsert('spamfilter_users', $mail_spamfilter, 'id');
+						$msg .= "Imported spamfilter user ".$mail_spamfilter['email']."<br />";
+					} else {
+						$error .= "Spamfilter user ".$mail_spamfilter['email']." exists in local database. Skipped import.<br />";
+					}
+					
+				}
+			}
+		}
+
+	}
+	
+}
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/tools/lib/lang/en.lng b/interface/web/tools/lib/lang/en.lng
index 0122dcd..597be72 100644
--- a/interface/web/tools/lib/lang/en.lng
+++ b/interface/web/tools/lib/lang/en.lng
@@ -6,4 +6,5 @@
 $wb['ispconfig_tools_note'] = 'This module allows you to change the password and language and to start a resync of the DNS records.';
 $wb['Sync Tools'] = 'Sync Tools';
 $wb['Resync'] = 'Resync';
+$wb['Import'] = 'Import';
 ?>
\ No newline at end of file
diff --git a/interface/web/tools/lib/lang/en_import_ispconfig.lng b/interface/web/tools/lib/lang/en_import_ispconfig.lng
new file mode 100644
index 0000000..65ea145
--- /dev/null
+++ b/interface/web/tools/lib/lang/en_import_ispconfig.lng
@@ -0,0 +1,24 @@
+<?php
+$wb['head_txt'] = 'Import email configuration from ISPConfig 3';
+$wb['legend_txt'] = 'Remote server connection details';
+$wb['legend2_txt'] = 'Import email domain';
+$wb['resync_sites_txt'] = 'Resync Websites';
+$wb['resync_ftp_txt'] = 'Resync FTP users';
+$wb['resync_shell_txt'] = 'Resync shell users';
+$wb['resync_cron_txt'] = 'Resync cronjobs';
+$wb['resync_db_txt'] = 'Resync clientdb config';
+$wb['resync_mailbox_txt'] = 'Resync Mailboxes';
+$wb['resync_dns_txt'] = 'Resync DNS records';
+$wb['btn_start_txt'] = 'Start Import';
+$wb['btn_connect_txt'] = 'Connect to remote server';
+$wb['btn_cancel_txt'] = 'Cancel';
+$wb['client_group_id_txt'] = 'Local client';
+$wb['mail_domain_txt'] = 'Remote email domain';
+$wb['import_mailbox_txt'] = 'Import mailbox';
+$wb['import_aliasdomain_txt'] = 'Import alias domain';
+$wb['import_alias_txt'] = 'Import email alias';
+$wb['import_forward_txt'] = 'Import forward';
+$wb['import_user_filter_txt'] = 'Import user filter';
+$wb['import_spamfilter_txt'] = 'Import spamfilter';
+
+?>
\ No newline at end of file
diff --git a/interface/web/tools/lib/lang/en_resync.lng b/interface/web/tools/lib/lang/en_resync.lng
index ae87bbd..f4cbf0d 100644
--- a/interface/web/tools/lib/lang/en_resync.lng
+++ b/interface/web/tools/lib/lang/en_resync.lng
@@ -5,7 +5,7 @@
 $wb['resync_ftp_txt'] = 'Resync FTP users';
 $wb['resync_shell_txt'] = 'Resync shell users';
 $wb['resync_cron_txt'] = 'Resync cronjobs';
-$wb['resync_db_txt'] = 'Resync database config';
+$wb['resync_db_txt'] = 'Resync clientdb config';
 $wb['resync_mailbox_txt'] = 'Resync Mailboxes';
 $wb['resync_dns_txt'] = 'Resync DNS records';
 $wb['btn_start_txt'] = 'Start';
diff --git a/interface/web/tools/lib/menu.d/import.menu.php b/interface/web/tools/lib/menu.d/import.menu.php
new file mode 100644
index 0000000..086fd63
--- /dev/null
+++ b/interface/web/tools/lib/menu.d/import.menu.php
@@ -0,0 +1,22 @@
+<?php
+
+
+// Menu
+
+if($app->auth->is_admin()) {
+
+$items = array();
+
+$items[] = array( 'title' 	=> 'ISPConfig 3',
+				  'target' 	=> 'content',
+				  'link'	=> 'tools/import_ispconfig.php');
+
+
+$module['nav'][] = array(	'title'	=> 'Import',
+							'open' 	=> 1,
+							'items'	=> $items);
+
+unset($items);
+}
+
+?>
\ No newline at end of file
diff --git a/interface/web/tools/templates/import_ispconfig.htm b/interface/web/tools/templates/import_ispconfig.htm
new file mode 100644
index 0000000..4980dc4
--- /dev/null
+++ b/interface/web/tools/templates/import_ispconfig.htm
@@ -0,0 +1,105 @@
+<h2>{tmpl_var name="head_txt"}</h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_language_import">
+  
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels"><legend>{tmpl_var name="legend_txt"}</legend>
+	  <div class="ctrlHolder">
+		<p class="label">Remote API URL</p>
+		<div class="multiField">
+			<input id="remote_server" type="text" value="{tmpl_var name='remote_server'}" name="remote_server" /> (e.g. https://www.example.com:8080/remote/ )
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">Remote User</p>
+		<div class="multiField">
+			<input id="remote_user" type="text" value="{tmpl_var name='remote_user'}" name="remote_user" />
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">Remote password</p>
+		<div class="multiField">
+			<input id="remote_password" type="text" value="{tmpl_var name='remote_password'}" name="remote_password" />
+		</div>
+	  </div>
+	</fieldset>
+	  <tmpl_if name="connected">
+<div class="pnl_formsarea">
+    <fieldset class="inlineLabels"><legend>{tmpl_var name="legend2_txt"}</legend>
+	  <div class="ctrlHolder">
+      	<label for="mail_domain">{tmpl_var name='mail_domain_txt'}</label>
+        <select name="mail_domain" id="mail_domain" class="selectInput">
+					{tmpl_var name='mail_domain'}
+		</select>
+      </div>
+	  <div class="ctrlHolder">
+      	<label for="client_group_id">{tmpl_var name='client_group_id_txt'}</label>
+        <select name="client_group_id" id="client_group_id" class="selectInput">
+					{tmpl_var name='client_group_id'}
+		</select>
+      </div>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="import_mailbox_txt"}</p>
+		<div class="multiField">
+			<input id="import_mailbox" type="checkbox" value="1" name="import_mailbox" checked="checked" />
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="import_user_filter_txt"}</p>
+		<div class="multiField">
+			<input id="import_user_filter" type="checkbox" value="1" name="import_user_filter" checked="checked" />
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="import_spamfilter_txt"}</p>
+		<div class="multiField">
+			<input id="import_spamfilter" type="checkbox" value="1" name="import_spamfilter" checked="checked" />
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="import_alias_txt"}</p>
+		<div class="multiField">
+			<input id="import_alias" type="checkbox" value="1" name="import_alias" checked="checked" />
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="import_forward_txt"}</p>
+		<div class="multiField">
+			<input id="import_forward" type="checkbox" value="1" name="import_forward" checked="checked" />
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="import_aliasdomain_txt"}</p>
+		<div class="multiField">
+			<input id="import_aliasdomain" type="checkbox" value="1" name="import_aliasdomain" checked="checked" />
+		</div>
+	  </div>
+	</fieldset>
+	  </tmpl_if>
+	  
+
+	
+	<tmpl_if name="msg">
+	<div id="OKMsg"><p><tmpl_var name="msg"></p></div>
+  </tmpl_if>
+  <tmpl_if name="error">
+	<div id="errorMsg"><h3>ERROR</h3><ol><tmpl_var name="error"></ol></div>
+  </tmpl_if>
+	
+    <input type="hidden" name="remote_session_id" value="{tmpl_var name='remote_session_id'}">
+	<input type="hidden" name="connected" value="{tmpl_var name='connected'}">
+<tmpl_if name="connected">
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="Import" onClick="submitForm('pageForm','tools/import_ispconfig.php');"><span>{tmpl_var name="btn_start_txt"}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="Cancel" onClick="loadContent('tools/index.php');"><span>{tmpl_var name="btn_cancel_txt"}</span></button>
+    </div>
+<tmpl_else>
+	<div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="Import" onClick="submitForm('pageForm','tools/import_ispconfig.php');"><span>{tmpl_var name="btn_connect_txt"}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="Cancel" onClick="loadContent('tools/index.php');"><span>{tmpl_var name="btn_cancel_txt"}</span></button>
+    </div>
+</tmpl_if>
+  </div>
+  
+</div>

--
Gitblit v1.9.1