From 853c4ab4f188661780703d299b308f3bd3a6e1d2 Mon Sep 17 00:00:00 2001 From: SJ Date: Thu, 6 Sep 2012 15:27:20 +0200 Subject: [PATCH] major rewrite of the web interface --- etc/sphinx.conf | 6 +- src/config.h | 4 +- util/db-mysql.sql | 15 +- webui/config.php | 3 + webui/controller/audit/audit.php | 2 +- webui/controller/common/layout-health.php | 26 - webui/controller/common/layout-minimal.php | 26 - .../{layout-search.php => layout-new.php} | 6 +- webui/controller/folder/folder.php | 48 + webui/controller/health/health.php | 2 +- webui/controller/login/login.php | 6 + webui/controller/login/logout.php | 2 +- webui/controller/message/bulkrestore.php | 12 +- webui/controller/message/download.php | 11 +- webui/controller/message/headers.php | 8 +- webui/controller/message/note.php | 30 + webui/controller/message/restore.php | 8 +- webui/controller/message/view.php | 8 +- webui/controller/search/folder.php | 24 + webui/controller/search/helper.php | 150 +- webui/controller/search/popup.php | 17 + webui/controller/search/search.php | 45 +- webui/controller/search/tag.php | 7 +- webui/controller/user/add.php | 2 + webui/controller/user/edit.php | 2 + webui/controller/user/settings.php | 4 +- webui/language/en/messages.php | 8 + webui/language/hu/messages.iso-8859-2.php | 8 + webui/language/hu/messages.php | 8 + webui/model/folder/folder.php | 111 ++ webui/model/message/restore.php | 6 +- webui/model/search/message.php | 61 +- webui/model/search/search.php | 413 +++--- webui/model/user/auth.php | 1 + webui/model/user/user.php | 32 + webui/view/javascript/colorbox.js | 888 ----------- webui/view/javascript/jquery-1.4.2.min.js | 154 -- webui/view/javascript/piler.js | 161 +- webui/view/javascript/rc1.js | 188 +++ webui/view/javascript/rc2.js | 87 ++ webui/view/javascript/splitter.js | 199 +++ webui/view/javascript/tip_balloon.js | 221 --- webui/view/javascript/tip_balloon/b.gif | Bin 46 -> 0 bytes .../javascript/tip_balloon/background.gif | Bin 43 -> 0 bytes webui/view/javascript/tip_balloon/l.gif | Bin 46 -> 0 bytes webui/view/javascript/tip_balloon/lb.gif | Bin 85 -> 0 bytes webui/view/javascript/tip_balloon/lt.gif | Bin 86 -> 0 bytes webui/view/javascript/tip_balloon/r.gif | Bin 46 -> 0 bytes webui/view/javascript/tip_balloon/rb.gif | Bin 86 -> 0 bytes webui/view/javascript/tip_balloon/rt.gif | Bin 85 -> 0 bytes webui/view/javascript/tip_balloon/stemb.gif | Bin 165 -> 0 bytes webui/view/javascript/tip_balloon/stemt.gif | Bin 167 -> 0 bytes webui/view/javascript/tip_balloon/t.gif | Bin 46 -> 0 bytes webui/view/javascript/tip_centerwindow.js | 104 -- webui/view/javascript/tip_followscroll.js | 88 -- webui/view/javascript/wz_tooltip.js | 1301 ----------------- .../dark-grey-disclosure-arrow-down.png | Bin 0 -> 94 bytes webui/view/theme/default/images/dimple.png | Bin 0 -> 174 bytes .../theme/default/images/groupactions.png | Bin 0 -> 495 bytes .../light-grey-disclosure-arrow-down.png | Bin 0 -> 93 bytes .../view/theme/default/images/listheader.gif | Bin 0 -> 470 bytes webui/view/theme/default/images/notes.png | Bin 0 -> 768 bytes .../theme/default/stylesheet/colorbox.css | 37 - webui/view/theme/default/stylesheet/mini.css | 56 + .../default/stylesheet/style-default.css | 25 +- .../theme/default/templates/audit/audit.tpl | 2 +- .../theme/default/templates/audit/helper.tpl | 38 +- .../templates/common/layout-health.tpl | 60 - .../templates/common/layout-minimal.tpl | 47 - .../default/templates/common/layout-new.tpl | 142 ++ .../templates/common/layout-search.tpl | 59 - .../theme/default/templates/common/layout.tpl | 27 +- .../default/templates/common/menu-admin.tpl | 17 +- .../theme/default/templates/common/menu.tpl | 34 +- .../theme/default/templates/group/list.tpl | 2 +- .../default/templates/message/headers.tpl | 4 +- .../default/templates/message/restore.tpl | 4 +- .../theme/default/templates/message/view.tpl | 25 +- .../default/templates/policy/archiving.tpl | 4 +- .../default/templates/policy/retention.tpl | 4 +- .../default/templates/search/advanced.tpl | 130 -- .../theme/default/templates/search/expert.tpl | 59 - .../theme/default/templates/search/folder.tpl | 12 + .../theme/default/templates/search/helper.tpl | 90 +- .../theme/default/templates/search/popup.tpl | 69 + .../theme/default/templates/search/search.tpl | 61 +- .../view/theme/default/templates/user/add.tpl | 11 + .../theme/default/templates/user/edit.tpl | 14 + 88 files changed, 1707 insertions(+), 3839 deletions(-) delete mode 100644 webui/controller/common/layout-health.php delete mode 100644 webui/controller/common/layout-minimal.php rename webui/controller/common/{layout-search.php => layout-new.php} (78%) create mode 100644 webui/controller/folder/folder.php create mode 100644 webui/controller/message/note.php create mode 100644 webui/controller/search/folder.php create mode 100644 webui/controller/search/popup.php create mode 100644 webui/model/folder/folder.php delete mode 100644 webui/view/javascript/colorbox.js delete mode 100644 webui/view/javascript/jquery-1.4.2.min.js create mode 100644 webui/view/javascript/rc1.js create mode 100644 webui/view/javascript/rc2.js create mode 100644 webui/view/javascript/splitter.js delete mode 100644 webui/view/javascript/tip_balloon.js delete mode 100644 webui/view/javascript/tip_balloon/b.gif delete mode 100644 webui/view/javascript/tip_balloon/background.gif delete mode 100644 webui/view/javascript/tip_balloon/l.gif delete mode 100644 webui/view/javascript/tip_balloon/lb.gif delete mode 100644 webui/view/javascript/tip_balloon/lt.gif delete mode 100644 webui/view/javascript/tip_balloon/r.gif delete mode 100644 webui/view/javascript/tip_balloon/rb.gif delete mode 100644 webui/view/javascript/tip_balloon/rt.gif delete mode 100644 webui/view/javascript/tip_balloon/stemb.gif delete mode 100644 webui/view/javascript/tip_balloon/stemt.gif delete mode 100644 webui/view/javascript/tip_balloon/t.gif delete mode 100644 webui/view/javascript/tip_centerwindow.js delete mode 100644 webui/view/javascript/tip_followscroll.js delete mode 100644 webui/view/javascript/wz_tooltip.js create mode 100644 webui/view/theme/default/images/dark-grey-disclosure-arrow-down.png create mode 100644 webui/view/theme/default/images/dimple.png create mode 100644 webui/view/theme/default/images/groupactions.png create mode 100644 webui/view/theme/default/images/light-grey-disclosure-arrow-down.png create mode 100644 webui/view/theme/default/images/listheader.gif create mode 100644 webui/view/theme/default/images/notes.png delete mode 100644 webui/view/theme/default/stylesheet/colorbox.css create mode 100644 webui/view/theme/default/stylesheet/mini.css delete mode 100644 webui/view/theme/default/templates/common/layout-health.tpl delete mode 100644 webui/view/theme/default/templates/common/layout-minimal.tpl create mode 100644 webui/view/theme/default/templates/common/layout-new.tpl delete mode 100644 webui/view/theme/default/templates/common/layout-search.tpl delete mode 100644 webui/view/theme/default/templates/search/advanced.tpl delete mode 100644 webui/view/theme/default/templates/search/expert.tpl create mode 100644 webui/view/theme/default/templates/search/folder.tpl create mode 100644 webui/view/theme/default/templates/search/popup.tpl diff --git a/etc/sphinx.conf b/etc/sphinx.conf index 78cb9ddd..f2d094c6 100644 --- a/etc/sphinx.conf +++ b/etc/sphinx.conf @@ -57,8 +57,9 @@ source tag sql_pass = piler sql_query_pre = SET NAMES utf8 - sql_query = SELECT `id`, `uid`, `tag` FROM `tag` + sql_query = SELECT `_id`, `id`, `uid`, `tag` FROM `tag` + sql_attr_uint = id sql_attr_uint = uid } @@ -73,8 +74,9 @@ source note sql_pass = piler sql_query_pre = SET NAMES utf8 - sql_query = SELECT `id`, `uid`, `note` FROM `note` + sql_query = SELECT `_id`, `id`, `uid`, `note` FROM `note` + sql_attr_uint = id sql_attr_uint = uid } diff --git a/src/config.h b/src/config.h index a1adee6d..e65f49a9 100644 --- a/src/config.h +++ b/src/config.h @@ -11,9 +11,9 @@ #define PROGNAME "piler" -#define VERSION "0.1.20" +#define VERSION "0.1.21" -#define BUILD 697 +#define BUILD 701 #define HOSTID "mailarchiver" diff --git a/util/db-mysql.sql b/util/db-mysql.sql index 69860c28..007603c6 100644 --- a/util/db-mysql.sql +++ b/util/db-mysql.sql @@ -103,10 +103,12 @@ create view `v_attachment` AS select `id` as `i`, `piler_id`, `attachment_id`, ` drop table if exists `tag`; create table if not exists `tag` ( + `_id` bigint unsigned auto_increment not null, `id` bigint not null, `uid` int not null, `tag` char(255) default null, - unique(`id`, `uid`) + unique(`id`, `uid`), + key (`_id`) ) ENGINE=InnoDB; @@ -247,12 +249,21 @@ create table if not exists `folder` ( ) Engine=InnoDB; +create table if not exists `folder_user` ( + `id` bigint unsigned not null, + `uid` int unsigned not null, + key `folder_user_idx` (`id`), + key `folder_user_idx2` (`uid`) +) ENGINE=InnoDB; + + create table if not exists `note` ( + `_id` bigint unsigned auto_increment not null, `id` bigint unsigned not null, `uid` int not null, `note` text default null, unique(`id`, `uid`), - key (`id`) + key (`_id`) ) ENGINE=InnoDB; diff --git a/webui/config.php b/webui/config.php index b0aae162..b169eb67 100644 --- a/webui/config.php +++ b/webui/config.php @@ -14,6 +14,7 @@ define('ENABLE_HISTORY', 1); define('ENABLE_REMOTE_IMAGES', '0'); define('ENABLE_ON_THE_FLY_VERIFICATION', 1); define('ENABLE_LDAP_IMPORT_FEATURE', 0); +define('ENABLE_FOLDER_RESTRICTIONS', 0); define('REMOTE_IMAGE_REPLACEMENT', '/view/theme/default/images/remote.gif'); define('ICON_ARROW_UP', '/view/theme/default/images/arrowup.gif'); @@ -84,6 +85,8 @@ define('TABLE_USER', 'user'); define('TABLE_GROUP', 'group'); define('TABLE_GROUP_USER', 'group_user'); define('TABLE_GROUP_EMAIL', 'group_email'); +define('TABLE_FOLDER', 'folder'); +define('TABLE_FOLDER_USER', 'folder_user'); define('TABLE_EMAIL', 'email'); define('TABLE_META', 'metadata'); define('TABLE_ATTACHMENT', 'attachment'); diff --git a/webui/controller/audit/audit.php b/webui/controller/audit/audit.php index ee6948e9..901793df 100644 --- a/webui/controller/audit/audit.php +++ b/webui/controller/audit/audit.php @@ -7,7 +7,7 @@ class ControllerAuditAudit extends Controller { $this->id = "content"; $this->template = "audit/audit.tpl"; - $this->layout = "common/layout-search"; + $this->layout = "common/layout"; $request = Registry::get('request'); $db = Registry::get('db'); diff --git a/webui/controller/common/layout-health.php b/webui/controller/common/layout-health.php deleted file mode 100644 index 30918b6a..00000000 --- a/webui/controller/common/layout-health.php +++ /dev/null @@ -1,26 +0,0 @@ -data['title'] = $this->document->title; - - $this->template = "common/layout-health.tpl"; - - - $this->children = array( - "common/menu", - "common/footer" - ); - - $this->render(); - - } - - -} - - -?> diff --git a/webui/controller/common/layout-minimal.php b/webui/controller/common/layout-minimal.php deleted file mode 100644 index a0478f55..00000000 --- a/webui/controller/common/layout-minimal.php +++ /dev/null @@ -1,26 +0,0 @@ -data['title'] = $this->document->title; - - $this->template = "common/layout-minimal.tpl"; - - - $this->children = array( - "common/menu", - "common/footer" - ); - - $this->render(); - - } - - -} - - -?> diff --git a/webui/controller/common/layout-search.php b/webui/controller/common/layout-new.php similarity index 78% rename from webui/controller/common/layout-search.php rename to webui/controller/common/layout-new.php index ef95fdcb..4f266e8d 100644 --- a/webui/controller/common/layout-search.php +++ b/webui/controller/common/layout-new.php @@ -1,13 +1,13 @@ data['title'] = $this->document->title; - $this->template = "common/layout-search.tpl"; + $this->template = "common/layout-new.tpl"; $this->data['search_args'] = ''; @@ -23,6 +23,8 @@ class ControllerCommonLayoutSearch extends Controller { $this->children = array( "common/menu", + "search/folder", + "search/popup", "common/footer" ); diff --git a/webui/controller/folder/folder.php b/webui/controller/folder/folder.php new file mode 100644 index 00000000..c8982b62 --- /dev/null +++ b/webui/controller/folder/folder.php @@ -0,0 +1,48 @@ +id = "content"; + $this->template = "user/list.tpl"; + $this->layout = "common/layout-empty"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + $language = Registry::get('language'); + + $this->load->model('folder/folder'); + + + $this->data['term'] = ''; + + if(!isset($this->request->get['term']) || strlen($this->request->get['term']) < 2) { die("no data"); } + + + /* check if we are admin */ + + if(Registry::get('admin_user') == 1) { + $results = $this->model_folder_folder->get_folders_by_string($this->request->get['term']); + + $i = 0; + $s = '[ '; + + foreach($results as $result) { + $i++; + $s .= '{ "id": "' . $i . '", "value": "' . $result['name'] . '" },'; + } + + $s = preg_replace("/,$/", "", $s) . " ]"; + + print $s; + } + } + + +} + +?> diff --git a/webui/controller/health/health.php b/webui/controller/health/health.php index 41063c9f..64ee754b 100644 --- a/webui/controller/health/health.php +++ b/webui/controller/health/health.php @@ -7,7 +7,7 @@ class ControllerHealthHealth extends Controller { $this->id = "content"; $this->template = "health/health.tpl"; - $this->layout = "common/layout-health"; + $this->layout = "common/layout"; $this->load->model('health/health'); diff --git a/webui/controller/login/login.php b/webui/controller/login/login.php index 0fda9846..6674e683 100644 --- a/webui/controller/login/login.php +++ b/webui/controller/login/login.php @@ -18,6 +18,7 @@ class ControllerLoginLogin extends Controller { $this->load->model('user/auth'); $this->load->model('user/user'); $this->load->model('user/prefs'); + $this->load->model('folder/folder'); $this->document->title = $this->data['text_login']; @@ -29,6 +30,11 @@ class ControllerLoginLogin extends Controller { LOGGER('logged in'); + if(isAdminUser() == 1) { + header("Location: " . SITE_URL . "index.php?route=health/health"); + exit; + } + if(isset($_POST['relocation']) && $_POST['relocation']) { header("Location: " . SITE_URL . $_POST['relocation']); } else { diff --git a/webui/controller/login/logout.php b/webui/controller/login/logout.php index 71e41a4c..f23c117b 100644 --- a/webui/controller/login/logout.php +++ b/webui/controller/login/logout.php @@ -8,7 +8,7 @@ class ControllerLoginLogout extends Controller { $this->id = "content"; $this->template = "login/logout.tpl"; - $this->layout = "common/layout-minimal"; + $this->layout = "common/layout"; $request = Registry::get('request'); diff --git a/webui/controller/message/bulkrestore.php b/webui/controller/message/bulkrestore.php index 78b975ef..9296f370 100644 --- a/webui/controller/message/bulkrestore.php +++ b/webui/controller/message/bulkrestore.php @@ -23,7 +23,7 @@ class ControllerMessageBulkrestore extends Controller { if(!isset($this->request->post['idlist']) || $this->request->post['idlist'] == '') { die("no idlist parameter given"); } - list($a, $idlist) = $this->model_search_search->check_your_permission_by_id_list(explode(",", $this->request->post['idlist'])); + $idlist = $this->model_search_search->check_your_permission_by_id_list(explode(",", $this->request->post['idlist'])); $download = $this->request->post['download']; @@ -55,10 +55,14 @@ class ControllerMessageBulkrestore extends Controller { array_push($rcpt, $_SESSION['email']); } - $x = $this->model_mail_mail->send_smtp_email(SMARTHOST, SMARTHOST_PORT, SMTP_DOMAIN, SMTP_FROMADDR, $rcpt, - "Received: by piler" . EOL . PILER_HEADER_FIELD . $id . EOL . $this->model_search_message->get_raw_message($id) ); + if(count($rcpt) > 0) { + $piler_id = $this->model_search_message->get_piler_id_by_id($id); - if($x == 1) { $this->data['restored']++; } + $x = $this->model_mail_mail->send_smtp_email(SMARTHOST, SMARTHOST_PORT, SMTP_DOMAIN, SMTP_FROMADDR, $rcpt, + "Received: by piler" . EOL . PILER_HEADER_FIELD . $id . EOL . $this->model_search_message->get_raw_message($piler_id) ); + + if($x == 1) { $this->data['restored']++; } + } } diff --git a/webui/controller/message/download.php b/webui/controller/message/download.php index 18ce30be..58b2126f 100644 --- a/webui/controller/message/download.php +++ b/webui/controller/message/download.php @@ -20,11 +20,11 @@ class ControllerMessageDownload extends Controller { $this->data['id'] = @$this->request->get['id']; if(!verify_piler_id($this->data['id'])) { - AUDIT(ACTION_UNKNOWN, '', '', $this->data['id'], 'unknown piler id: ' . $this->data['id']); + AUDIT(ACTION_UNKNOWN, '', '', $this->data['id'], 'unknown id: ' . $this->data['id']); die("invalid id: " . $this->data['id']); } - if(!$this->model_search_search->check_your_permission_by_piler_id($this->data['id'])) { + if(!$this->model_search_search->check_your_permission_by_id($this->data['id'])) { AUDIT(ACTION_UNAUTHORIZED_VIEW_MESSAGE, '', '', $this->data['id'], ''); die("no permission for " . $this->data['id']); } @@ -32,13 +32,16 @@ class ControllerMessageDownload extends Controller { AUDIT(ACTION_DOWNLOAD_MESSAGE, '', '', $this->data['id'], ''); + $this->data['piler_id'] = $this->model_search_message->get_piler_id_by_id($this->data['id']); + header("Cache-Control: public, must-revalidate"); header("Pragma: no-cache"); header("Content-Type: application/octet-stream"); - header("Content-Disposition: attachment; filename=" . $this->data['id'] . ".eml"); + header("Content-Disposition: attachment; filename=" . $this->data['piler_id'] . ".eml"); header("Content-Transfer-Encoding: binary\n"); - print $this->model_search_message->get_raw_message($this->data['id']); + + print $this->model_search_message->get_raw_message($this->data['piler_id']); exit; $this->render(); diff --git a/webui/controller/message/headers.php b/webui/controller/message/headers.php index 31a109b6..49ada36a 100644 --- a/webui/controller/message/headers.php +++ b/webui/controller/message/headers.php @@ -22,18 +22,20 @@ class ControllerMessageHeaders extends Controller { $this->data['id'] = @$this->request->get['id']; if(!verify_piler_id($this->data['id'])) { - AUDIT(ACTION_UNKNOWN, '', '', $this->data['id'], 'unknown piler id: ' . $this->data['id']); + AUDIT(ACTION_UNKNOWN, '', '', $this->data['id'], 'unknown id: ' . $this->data['id']); die("invalid id: " . $this->data['id']); } - if(!$this->model_search_search->check_your_permission_by_piler_id($this->data['id'])) { + if(!$this->model_search_search->check_your_permission_by_id($this->data['id'])) { AUDIT(ACTION_UNAUTHORIZED_VIEW_MESSAGE, '', '', $this->data['id'], ''); die("no permission for " . $this->data['id']); } AUDIT(ACTION_VIEW_HEADER, '', '', $this->data['id'], ''); - $this->data['data'] = $this->model_search_message->get_message_headers($this->data['id']); + $this->data['piler_id'] = $this->model_search_message->get_piler_id_by_id($this->data['id']); + + $this->data['data'] = $this->model_search_message->get_message_headers($this->data['piler_id']); $this->render(); } diff --git a/webui/controller/message/note.php b/webui/controller/message/note.php new file mode 100644 index 00000000..9eab0c97 --- /dev/null +++ b/webui/controller/message/note.php @@ -0,0 +1,30 @@ +id = "content"; + $this->template = "message/note.tpl"; + $this->layout = "common/layout-empty"; + + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('search/search'); + $this->load->model('search/message'); + + if(isset($this->request->post['note']) && isset($this->request->post['id'])) { + + if($this->model_search_search->check_your_permission_by_id($this->request->post['id']) == 1) { + $this->model_search_message->add_message_note($this->request->post['id'], $_SESSION['uid'], $this->request->post['note']); + } + } + } + +} + +?> diff --git a/webui/controller/message/restore.php b/webui/controller/message/restore.php index 658a9d6a..13128770 100644 --- a/webui/controller/message/restore.php +++ b/webui/controller/message/restore.php @@ -27,7 +27,7 @@ class ControllerMessageRestore extends Controller { die("invalid id: " . $this->data['id']); } - if(!$this->model_search_search->check_your_permission_by_piler_id($this->data['id'])) { + if(!$this->model_search_search->check_your_permission_by_id($this->data['id'])) { AUDIT(ACTION_UNAUTHORIZED_VIEW_MESSAGE, '', '', $this->data['id'], ''); die("no permission for " . $this->data['id']); } @@ -42,16 +42,18 @@ class ControllerMessageRestore extends Controller { /* send the email to all the recipients of the original email if we are admin or auditor users */ - if(Registry::get('auditor_user') == 1) { + if(Registry::get('admin_user') == 1 || Registry::get('auditor_user') == 1) { $rcpt = $this->model_search_search->get_message_recipients($this->data['id']); + } else { array_push($rcpt, $_SESSION['email']); } + $this->data['piler_id'] = $this->model_search_message->get_piler_id_by_id($this->data['id']); $x = $this->model_mail_mail->send_smtp_email(SMARTHOST, SMARTHOST_PORT, SMTP_DOMAIN, SMTP_FROMADDR, $rcpt, - "Received: by piler" . EOL . PILER_HEADER_FIELD . $this->data['id'] . EOL . $this->model_search_message->get_raw_message($this->data['id']) ); + "Received: by piler" . EOL . PILER_HEADER_FIELD . $this->data['id'] . EOL . $this->model_search_message->get_raw_message($this->data['piler_id']) ); if($x == 1) { $this->data['data'] = $this->data['text_restored']; } else { $this->data['data'] = $this->data['text_failed_to_restore']; } diff --git a/webui/controller/message/view.php b/webui/controller/message/view.php index 08b35c60..e3d75651 100644 --- a/webui/controller/message/view.php +++ b/webui/controller/message/view.php @@ -30,11 +30,11 @@ class ControllerMessageView extends Controller { if(!verify_piler_id($this->data['id'])) { - AUDIT(ACTION_UNKNOWN, '', '', $this->data['id'], 'unknown piler id: ' . $this->data['id']); + AUDIT(ACTION_UNKNOWN, '', '', $this->data['id'], 'unknown id: ' . $this->data['id']); die("invalid id: " . $this->data['id']); } - if(!$this->model_search_search->check_your_permission_by_piler_id($this->data['id'])) { + if(!$this->model_search_search->check_your_permission_by_id($this->data['id'])) { AUDIT(ACTION_UNAUTHORIZED_VIEW_MESSAGE, '', '', $this->data['id'], ''); die("no permission for " . $this->data['id']); } @@ -57,9 +57,11 @@ class ControllerMessageView extends Controller { exit; } + $this->data['piler_id'] = $this->model_search_message->get_piler_id_by_id($this->data['id']); - $this->data['message'] = $this->model_search_message->extract_message($this->data['id']); + $this->data['message'] = $this->model_search_message->extract_message($this->data['piler_id']); $this->data['message']['tag'] = $this->model_search_message->get_message_tag($this->data['id'], $_SESSION['uid']); + $this->data['message']['note'] = $this->model_search_message->get_message_note($this->data['id'], $_SESSION['uid']); $this->render(); } diff --git a/webui/controller/search/folder.php b/webui/controller/search/folder.php new file mode 100644 index 00000000..82a282ab --- /dev/null +++ b/webui/controller/search/folder.php @@ -0,0 +1,24 @@ +id = "folder"; + $this->template = "search/folder.tpl"; + + $request = Registry::get('request'); + $db = Registry::get('db'); + + $this->load->model('folder/folder'); + + $this->data['folders'] = $this->model_folder_folder->get_folders_for_user(); + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/search/helper.php b/webui/controller/search/helper.php index c316dc5f..688df486 100644 --- a/webui/controller/search/helper.php +++ b/webui/controller/search/helper.php @@ -4,14 +4,8 @@ class ControllerSearchHelper extends Controller { private $error = array(); private $a = array( - 'o_from' => '', - 'f_from' => '', - 'o_to' => '', - 'f_to' => '', 'from' => '', 'to' => '', - 'from_domain' => '', - 'to_domain' => '', 'subject' => '', 'body' => '', 'date1' => '', @@ -20,7 +14,9 @@ class ControllerSearchHelper extends Controller { 'size' => '', 'attachment_type' => '', 'tag' => '', + 'note' => '', 'ref' => '', + 'folders' => '', 'any' => '' ); @@ -49,27 +45,26 @@ class ControllerSearchHelper extends Controller { $this->data['n'] = -1; - if($this->request->post['searchtype'] == 'advanced') { + if($this->request->post['searchtype'] == 'expert'){ + + if(isset($this->request->post['search']) && preg_match("/(from|to|subject|body|direction|size|date1|date2|attachment|tagnote)\:/", $this->request->post['search'])) { + $this->preprocess_post_expert_request($this->request->post); + } + else { + $this->naive_preprocess_post_expert_request($this->request->post); + } - $this->preprocess_post_advanced_request($this->request->post); $this->fixup_post_request(); - list ($this->data['n'], $this->data['all_ids'], $this->data['messages']) = $this->model_search_search->search_messages($this->a, ADVANCED_SEARCH, $this->data['page']); - } - - else if($this->request->post['searchtype'] == 'expert'){ - - $this->preprocess_post_expert_request($this->request->post); - $this->fixup_post_request(); - - list ($this->data['n'], $this->data['all_ids'], $this->data['messages']) = $this->model_search_search->search_messages($this->a, ADVANCED_SEARCH, $this->data['page']); + list ($this->data['n'], $this->data['all_ids'], $this->data['messages']) = $this->model_search_search->search_messages($this->a, $this->data['page']); } else { $this->fixup_post_simple_request(); - list ($this->data['n'], $this->data['all_ids'], $this->data['messages']) = $this->model_search_search->search_messages($this->request->post, SIMPLE_SEARCH, $this->data['page']); + list ($this->data['n'], $this->data['all_ids'], $this->data['messages']) = $this->model_search_search->search_messages($this->request->post, $this->data['page']); } + if($this->a['ref']) { $this->data['_ref'] = $this->a['ref']; } if(isset($this->request->post['ref']) && $this->request->post['ref']) { $this->data['_ref'] = $this->request->post['ref']; } @@ -97,24 +92,43 @@ class ControllerSearchHelper extends Controller { private function fixup_post_request() { - $this->a['o_from'] = substr($this->a['o_from'], 1, strlen($this->a['o_from'])); - $this->a['f_from'] = substr($this->a['f_from'], 1, strlen($this->a['f_from'])); - $this->a['o_to'] = substr($this->a['o_to'], 1, strlen($this->a['o_to'])); - $this->a['f_to'] = substr($this->a['f_to'], 1, strlen($this->a['f_to'])); - $this->a['from'] = substr($this->a['from'], 1, strlen($this->a['from'])); - $this->a['to'] = substr($this->a['to'], 1, strlen($this->a['to'])); - $this->a['from_domain'] = substr($this->a['from_domain'], 1, strlen($this->a['from_domain'])); - $this->a['to_domain'] = substr($this->a['to_domain'], 1, strlen($this->a['to_domain'])); - if(isset($this->request->post['ref'])) { $this->a['ref'] = $this->request->post['ref']; } + if(isset($this->request->post['folders'])) { $this->a['folders'] = $this->request->post['folders']; } $this->a['sort'] = $this->request->post['sort']; $this->a['order'] = $this->request->post['order']; } + private function naive_preprocess_post_expert_request($data = array()) { + $ndate = 0; + + if(!isset($data['search'])) { return; } + + $b = preg_split("/\s/", $data['search']); + + while(list($k, $v) = each($b)) { + if($v == '') { continue; } + + if(preg_match("/\d{4}\-\d{1,2}\-\d{1,2}/", $v)) { + $ndate++; + $this->a["date$ndate"] = $v; + } + else if(strchr($v, '@')) { + $this->a['from'] .= " $v"; + } + else { $this->a['any'] .= ' ' . $v; } + } + + if($this->a['date1'] && $this->a['date2'] == '') { $this->a['date2'] = $this->a['date1']; } + + if($this->a['any'] == ' ' . $this->data['text_enter_search_terms']) { $this->a['any'] = ''; } + } + + private function preprocess_post_expert_request($data = array()) { $token = ''; + $ndate = 0; if(!isset($data['search'])) { return; } @@ -137,41 +151,37 @@ class ControllerSearchHelper extends Controller { else if($v == 'attachment:' || $v == 'a:') { $token = 'attachment_type'; continue; } else if($v == 'size') { $token = 'size'; continue; } else if($v == 'tag:') { $token = 'tag'; continue; } + else if($v == 'note:') { $token = 'note'; continue; } else if($v == 'ref:') { $token = 'ref'; continue; } - else { $this->a['any'] .= ' ' . $v; } + else { + if(preg_match("/\d{4}\-\d{1,2}\-\d{1,2}/", $v)) { + $ndate++; + $this->a["date$ndate"] = $v; + } + } + if($token == 'from') { - $v = fix_email_address($v); - - if(substr($v, 0, 1) == '@') { $this->a['from_domain'] .= "|$v"; } - else if(strstr($v, '@')) { - if(in_array($v, $_SESSION['emails'])) { $this->a['o_from'] .= "|$v"; } else { $this->a['f_from'] .= "|$v"; } - } - else { - $this->a['from'] .= " $v"; - } + if($v == 'OR') { continue; } + $this->a['from'] .= " $v"; } + else if($token == 'to') { - $v = fix_email_address($v); - - if(substr($v, 0, 1) == '@') { $this->a['to_domain'] .= "|$v"; } - else if(strstr($v, '@')) { - if(in_array($v, $_SESSION['emails'])) { $this->a['o_to'] .= "|$v"; } else { $this->a['f_to'] .= "|$v"; } - } - else { - $this->a['to'] .= " $v"; - } + if($v == 'OR') { continue; } + $this->a['to'] .= " $v"; } + else if($token == 'subject') { $this->a['subject'] .= ' ' . $v; } else if($token == 'body') { $this->a['body'] .= ' ' . $v; } else if($token == 'date1') { $this->a['date1'] = ' ' . $v; } else if($token == 'date2') { $this->a['date2'] = ' ' . $v; } else if($token == 'attachment_type') { $this->a['attachment_type'] .= '|' . $v; } else if($token == 'tag') { $this->a['tag'] .= ' ' . $v; } + else if($token == 'note') { $this->a['note'] .= ' ' . $v; } else if($token == 'ref') { $this->a['ref'] = ' ' . $v; } else if($token == 'direction') { - if($v == 'inbound') { $this->a['direction'] = 0; } + if($v == 'inbound') { $this->a['direction'] = "0"; } else if($v == 'outbound') { $this->a['direction'] = 2; } else if($v == 'internal') { $this->a['direction'] = 1; } } @@ -205,52 +215,6 @@ class ControllerSearchHelper extends Controller { } - private function preprocess_post_advanced_request($data = array()) { - - if(isset($data['f'])) { - foreach($data['f'] as $f) { - $v = array_shift($data['v']); - - if($v == '') { continue; } - - if($f == 'from') { - $v = fix_email_address($v); - - if(substr($v, 0, 1) == '@') { $this->a['from_domain'] .= "|$v"; } - else if(strstr($v, '@')) { - if(in_array($v, $_SESSION['emails'])) { $this->a['o_from'] .= "|$v"; } else { $this->a['f_from'] .= "|$v"; } - } - else { - $this->a['from'] .= " $v"; - } - } - - if($f == 'to') { - $v = fix_email_address($v); - - if(substr($v, 0, 1) == '@') { $this->a['to_domain'] .= "|$v"; } - else if(strstr($v, '@')) { - if(in_array($v, $_SESSION['emails'])) { $this->a['o_to'] .= "|$v"; } else { $this->a['f_to'] .= "|$v"; } - } - else { - $this->a['to'] .= " $v"; - } - } - - - if($f == 'subject') { $this->a['subject'] .= ' ' . $v; } - if($f == 'body') { $this->a['body'] .= ' ' . $v; } - } - } - - if(isset($data['attachment_type'])) { $this->a['attachment_type'] = $data['attachment_type']; } - if(isset($data['direction'])) { $this->a['direction'] = $data['direction']; } - if(isset($data['tag'])) { $this->a['tag'] = $data['tag']; } - if(isset($data['date1'])) { $this->a['date1'] = $data['date1']; } - if(isset($data['date2'])) { $this->a['date2'] = $data['date2']; } - } - - } ?> diff --git a/webui/controller/search/popup.php b/webui/controller/search/popup.php new file mode 100644 index 00000000..8b750f67 --- /dev/null +++ b/webui/controller/search/popup.php @@ -0,0 +1,17 @@ +id = "popup"; + $this->template = "search/popup.tpl"; + + $this->render(); + } + + +} + +?> diff --git a/webui/controller/search/search.php b/webui/controller/search/search.php index cf11eb4f..daa2a0e6 100644 --- a/webui/controller/search/search.php +++ b/webui/controller/search/search.php @@ -7,31 +7,16 @@ class ControllerSearchSearch extends Controller { $this->id = "content"; $this->template = "search/search.tpl"; - $this->layout = "common/layout-search"; + $this->layout = "common/layout-new"; $request = Registry::get('request'); $db = Registry::get('db'); $this->load->model('search/search'); - $this->document->title = $this->data['text_simple_search']; + $this->document->title = $this->data['text_search']; - $this->data['searchtype'] = 'simple'; - - if(isset($this->request->get['type'])) { - if($this->request->get['type'] == 'advanced') { - $this->template = "search/advanced.tpl"; - $this->data['searchtype'] = 'advanced'; - $this->document->title = $this->data['text_advanced_search']; - } - - if($this->request->get['type'] == 'expert') { - $this->template = "search/expert.tpl"; - $this->data['searchtype'] = 'expert'; - $this->document->title = $this->data['text_expert_search']; - } - - } + $this->data['searchtype'] = 'expert'; if(isset($this->request->post['searchterm'])) { $this->fixup_post_request(); @@ -63,30 +48,6 @@ class ControllerSearchSearch extends Controller { if(isset($a['sort'])) { $this->data['sort'] = $a['sort']; } if(isset($a['order'])) { $this->data['order'] = $a['order']; } - if(isset($a['f'])) { - foreach($a['f'] as $f) { - $val = array_shift($a['v']); - - if($val == '') { continue; } - - if($i == 0) { - $this->data['key0'] = 0; - - if($f == 'from') { $this->data['key0'] = 0; } - else if($f == 'to') { $this->data['key0'] = 1; } - else if($f == 'subject') { $this->data['key0'] = 2; } - else if($f == 'body') { $this->data['key0'] = 3; } - - $this->data['val0'] = $val; - } - else { - array_push($this->data['blocks'], array('key' => $f, 'val' => $val)); - } - - $i++; - } - } - if(isset($a['date1'])) { $this->data['date1'] = $a['date1']; } if(isset($a['date2'])) { $this->data['date2'] = $a['date2']; } diff --git a/webui/controller/search/tag.php b/webui/controller/search/tag.php index 0d40fc32..6e257994 100644 --- a/webui/controller/search/tag.php +++ b/webui/controller/search/tag.php @@ -19,11 +19,12 @@ class ControllerSearchTag extends Controller { if(isset($this->request->post['tag']) && isset($this->request->post['idlist'])) { $idlist = explode(",", $this->request->post['idlist']); + if(count($idlist) > 0) { $q = ''; - list($ids, $a) = $this->model_search_search->check_your_permission_by_id_list($idlist); + $ids = $this->model_search_search->check_your_permission_by_id_list($idlist); for($i=0; $imodel_search_message->bulk_add_message_tag($ids, $_SESSION['uid'], $this->request->post['tag'], $q); } } - - /*$this->data['message'] = 'I tagged this!'; - - $this->render();*/ } } diff --git a/webui/controller/user/add.php b/webui/controller/user/add.php index 6d333cd6..fd1aeb47 100644 --- a/webui/controller/user/add.php +++ b/webui/controller/user/add.php @@ -17,6 +17,7 @@ class ControllerUserAdd extends Controller { $this->load->model('user/user'); $this->load->model('group/group'); + $this->load->model('folder/folder'); $this->document->title = $this->data['text_add_new_user_alias']; @@ -61,6 +62,7 @@ class ControllerUserAdd extends Controller { else { $this->data['next_user_id'] = $this->model_user_user->get_next_uid(); $this->data['groups'] = $this->model_group_group->get_groups(); + $this->data['folders'] = $this->model_folder_folder->get_folders(); } } else { diff --git a/webui/controller/user/edit.php b/webui/controller/user/edit.php index 633a82e7..fb3a7f56 100644 --- a/webui/controller/user/edit.php +++ b/webui/controller/user/edit.php @@ -20,6 +20,7 @@ class ControllerUserEdit extends Controller { $this->load->model('user/user'); $this->load->model('group/group'); + $this->load->model('folder/folder'); $this->document->title = $language->get('text_edit_user'); @@ -74,6 +75,7 @@ class ControllerUserEdit extends Controller { $this->data['user']['group_membership'] = $this->model_user_user->get_additional_uids($this->data['uid']); $this->data['user']['group'] = $this->model_group_group->get_groups_by_uid($this->data['uid']); + $this->data['user']['folder'] = $this->model_folder_folder->get_folders_by_uid($this->data['uid']); $this->data['emails'] = $this->model_user_user->get_emails($this->data['user']['username']); diff --git a/webui/controller/user/settings.php b/webui/controller/user/settings.php index c8312aff..b44bd899 100644 --- a/webui/controller/user/settings.php +++ b/webui/controller/user/settings.php @@ -17,9 +17,7 @@ class ControllerUserSettings extends Controller { $this->load->model('user/auth'); $this->load->model('user/prefs'); - - $this->document->title = $this->data['text_home']; - + $this->document->title = $this->data['text_settings']; if(isset($this->request->post['pagelen']) && isset($this->request->post['lang']) && isset($this->request->post['theme'])) { $this->model_user_prefs->set_user_preferences(Registry::get('username'), $this->request->post); diff --git a/webui/language/en/messages.php b/webui/language/en/messages.php index 2081d50e..104e5228 100644 --- a/webui/language/en/messages.php +++ b/webui/language/en/messages.php @@ -20,6 +20,7 @@ $_['text_any'] = "any"; $_['text_archive_size'] = "Archive size"; $_['text_archived_messages'] = "Archived messages"; $_['text_archiving_rules'] = "Archiving rules"; +$_['text_attachment'] = "Attachment"; $_['text_attachment_size'] = "Attachment size"; $_['text_attachment_type'] = "Attachment type"; $_['text_audit'] = "Audit"; @@ -111,6 +112,7 @@ $_['text_failed_to_remove'] = "Failed to remove"; $_['text_failed_to_restore'] = "Failed to restore"; $_['text_failed_to_update'] = "Failed to update"; $_['text_first'] = "First"; +$_['text_folders'] = "Folders"; $_['text_from'] = "From"; $_['text_from_domain'] = "From domain"; @@ -186,6 +188,7 @@ $_['text_no_subject'] = "no subject"; $_['text_no_such_policy'] = "No such policy"; $_['text_non_existent_queue_directory'] = "The queue directory you have specified does not exist"; $_['text_non_existing_user'] = "Non existing user"; +$_['text_notes'] = "Notes"; $_['text_not_found'] = "Not found"; $_['text_not_running'] = "not running"; $_['text_not_spam'] = "not spam"; @@ -233,6 +236,7 @@ $_['text_remove_this_policy'] = "Remove this policy"; $_['text_remove_this_group'] = "Remove this group"; $_['text_remove_this_user'] = "Remove this user"; $_['text_reset_counters'] = "Reset counters"; +$_['text_restored'] = "Restored"; $_['text_restore_message'] = "restore message"; $_['text_restore_to_mailbox'] = "Restore message to mailbox"; $_['text_restored'] = "Restored"; @@ -242,6 +246,7 @@ $_['text_role'] = "Role"; $_['text_running'] = "running"; $_['text_save'] = "Save"; +$_['text_saved'] = "Saved"; $_['text_save_search'] = "save search"; $_['text_save_search_terms'] = "Save search terms"; $_['text_saved_search_terms'] = "Saved search terms"; @@ -249,6 +254,8 @@ $_['text_search'] = "Search"; $_['text_search2'] = "search"; $_['text_search_emails'] = "Search email addresses"; $_['text_search_email_to_add'] = "Search email to add"; +$_['text_search_folders'] = "Search folders"; +$_['text_search_folder_to_add'] = "Search folder to add"; $_['text_search_groups'] = "Search groups"; $_['text_search_group_to_add'] = "Search group to add"; $_['text_search_terms'] = "Search terms"; @@ -280,6 +287,7 @@ $_['text_successfully_updated'] = "Successfully modified"; $_['text_swap_usage'] = "Swap usage"; $_['text_tag_search_results'] = "Tag search results"; +$_['text_tagged'] = "Tagged"; $_['text_tags'] = "Tags"; $_['text_text'] = "Text"; $_['text_text2'] = "text"; diff --git a/webui/language/hu/messages.iso-8859-2.php b/webui/language/hu/messages.iso-8859-2.php index 3ec3e621..59b0fa08 100644 --- a/webui/language/hu/messages.iso-8859-2.php +++ b/webui/language/hu/messages.iso-8859-2.php @@ -20,6 +20,7 @@ $_['text_any'] = "mindegy"; $_['text_archive_size'] = "Archívum méret"; $_['text_archived_messages'] = "Archivált levelek"; $_['text_archiving_rules'] = "Archiválási szabályok"; +$_['text_attachment'] = "Melléklet"; $_['text_attachment_size'] = "Melléklet méret"; $_['text_attachment_type'] = "Melléklet típus"; $_['text_audit'] = "Audit"; @@ -111,6 +112,7 @@ $_['text_failed_to_remove'] = "Hiba az elt $_['text_failed_to_restore'] = "Hiba a visszaállítás során"; $_['text_failed_to_update'] = "Nem sikerült módosítani"; $_['text_first'] = "Első"; +$_['text_folders'] = "Mappák"; $_['text_from'] = "Feladó"; $_['text_from_domain'] = "Feladó domain"; @@ -187,6 +189,7 @@ $_['text_no_subject'] = "nincs t $_['text_no_such_policy'] = "Nincs ilyen házirend"; $_['text_non_existent_queue_directory'] = "A megadott queue könyvtár nem létezik"; $_['text_non_existing_user'] = "Nem létező felhasználó"; +$_['text_notes'] = "Megjegyzések"; $_['text_not_found'] = "Nincs találat"; $_['text_not_running'] = "nem fut"; $_['text_not_spam'] = "nem spam"; @@ -234,6 +237,7 @@ $_['text_remove_this_group'] = "Csoport t $_['text_remove_this_policy'] = "Házirend törlése"; $_['text_remove_this_user'] = "Felhasználó törlése"; $_['text_reset_counters'] = "Számlálók nullázása"; +$_['text_restored'] = "Visszaállítva"; $_['text_restore_message'] = "levél visszaállítása"; $_['text_restore_to_mailbox'] = "Levél visszaállítása postafiókba"; $_['text_restored'] = "Visszaállítva"; @@ -243,6 +247,7 @@ $_['text_role'] = "Felhaszn $_['text_running'] = "fut"; $_['text_save'] = "Mentés"; +$_['text_saved'] = "Elmentve"; $_['text_save_search'] = "keresés mentése"; $_['text_save_search_terms'] = "Keresési feltétel mentése"; $_['text_saved_search_terms'] = "Elmentett keresések"; @@ -250,6 +255,8 @@ $_['text_search'] = "Keres $_['text_search2'] = "keresés"; $_['text_search_emails'] = "Email címek keresése"; $_['text_search_email_to_add'] = "írja be az email cím elejét"; +$_['text_search_folders'] = "Mappák keresése"; +$_['text_search_folder_to_add'] = "Írja be a mappa elejét"; $_['text_search_groups'] = "Csoportok keresése"; $_['text_search_group_to_add'] = "írja be a csoport nevének elejét"; $_['text_search_terms'] = "Keresési feltételek"; @@ -281,6 +288,7 @@ $_['text_successfully_updated'] = "Sikeresen m $_['text_swap_usage'] = "Swap használat"; $_['text_tag_search_results'] = "Keresés eredményének címkézése"; +$_['text_tagged'] = "Címkézve"; $_['text_tags'] = "Címkék"; $_['text_text'] = "Szöveg"; $_['text_text2'] = "szöveg"; diff --git a/webui/language/hu/messages.php b/webui/language/hu/messages.php index dba388b0..459c8492 100644 --- a/webui/language/hu/messages.php +++ b/webui/language/hu/messages.php @@ -20,6 +20,7 @@ $_['text_any'] = "mindegy"; $_['text_archive_size'] = "ArchĂ­vum mĂ©ret"; $_['text_archived_messages'] = "Archivált levelek"; $_['text_archiving_rules'] = "Archiválási szabályok"; +$_['text_attachment'] = "MellĂ©klet"; $_['text_attachment_size'] = "MellĂ©klet mĂ©ret"; $_['text_attachment_type'] = "MellĂ©klet tĂ­pus"; $_['text_audit'] = "Audit"; @@ -111,6 +112,7 @@ $_['text_failed_to_remove'] = "Hiba az eltávolĂ­táskor"; $_['text_failed_to_restore'] = "Hiba a visszaállĂ­tás során"; $_['text_failed_to_update'] = "Nem sikerĂĽlt mĂłdosĂ­tani"; $_['text_first'] = "ElsĹ‘"; +$_['text_folders'] = "Mappák"; $_['text_from'] = "FeladĂł"; $_['text_from_domain'] = "FeladĂł domain"; @@ -187,6 +189,7 @@ $_['text_no_subject'] = "nincs tárgy"; $_['text_no_such_policy'] = "Nincs ilyen házirend"; $_['text_non_existent_queue_directory'] = "A megadott queue könyvtár nem lĂ©tezik"; $_['text_non_existing_user'] = "Nem lĂ©tezĹ‘ felhasználĂł"; +$_['text_notes'] = "MegjegyzĂ©sek"; $_['text_not_found'] = "Nincs találat"; $_['text_not_running'] = "nem fut"; $_['text_not_spam'] = "nem spam"; @@ -234,6 +237,7 @@ $_['text_remove_this_group'] = "Csoport törlĂ©se"; $_['text_remove_this_policy'] = "Házirend törlĂ©se"; $_['text_remove_this_user'] = "FelhasználĂł törlĂ©se"; $_['text_reset_counters'] = "SzámlálĂłk nullázása"; +$_['text_restored'] = "VisszaállĂ­tva"; $_['text_restore_message'] = "levĂ©l visszaállĂ­tása"; $_['text_restore_to_mailbox'] = "LevĂ©l visszaállĂ­tása postafiĂłkba"; $_['text_restored'] = "VisszaállĂ­tva"; @@ -243,6 +247,7 @@ $_['text_role'] = "FelhasználĂłtĂ­pus"; $_['text_running'] = "fut"; $_['text_save'] = "MentĂ©s"; +$_['text_saved'] = "Elmentve"; $_['text_save_search'] = "keresĂ©s mentĂ©se"; $_['text_save_search_terms'] = "KeresĂ©si feltĂ©tel mentĂ©se"; $_['text_saved_search_terms'] = "Elmentett keresĂ©sek"; @@ -250,6 +255,8 @@ $_['text_search'] = "KeresĂ©s"; $_['text_search2'] = "keresĂ©s"; $_['text_search_emails'] = "Email cĂ­mek keresĂ©se"; $_['text_search_email_to_add'] = "Ă­rja be az email cĂ­m elejĂ©t"; +$_['text_search_folders'] = "Mappák keresĂ©se"; +$_['text_search_folder_to_add'] = "ĂŤrja be a mappa elejĂ©t"; $_['text_search_groups'] = "Csoportok keresĂ©se"; $_['text_search_group_to_add'] = "Ă­rja be a csoport nevĂ©nek elejĂ©t"; $_['text_search_terms'] = "KeresĂ©si feltĂ©telek"; @@ -281,6 +288,7 @@ $_['text_successfully_updated'] = "Sikeresen mĂłdosĂ­tva"; $_['text_swap_usage'] = "Swap használat"; $_['text_tag_search_results'] = "KeresĂ©s eredmĂ©nyĂ©nek cĂ­mkĂ©zĂ©se"; +$_['text_tagged'] = "CĂ­mkĂ©zve"; $_['text_tags'] = "CĂ­mkĂ©k"; $_['text_text'] = "Szöveg"; $_['text_text2'] = "szöveg"; diff --git a/webui/model/folder/folder.php b/webui/model/folder/folder.php new file mode 100644 index 00000000..5ad5ee5f --- /dev/null +++ b/webui/model/folder/folder.php @@ -0,0 +1,111 @@ + 0) { $limit = " LIMIT " . (int)$from . ", " . (int)$page_len; } + + $query = $this->db->query("SELECT `id`, `name` FROM `" . TABLE_FOLDER . "` $where_cond $_order $limit", $Q); + + foreach ($query->rows as $q) { + + $groups[] = array( + 'id' => $q['id'], + 'foldername' => $q['name'] + ); + } + + return $groups; + } + + + public function get_folders_for_user() { + $q = str_repeat("?,", count($_SESSION['folders'])); + $q = preg_replace("/\,$/", "", $q); + + $query = $this->db->query("SELECT `id`, `name` FROM `" . TABLE_FOLDER . "` WHERE id IN ($q)", $_SESSION['folders']); + + if(isset($query->rows)) { return $query->rows; } + + return array(); + } + + + public function get_all_folder_ids($uid = 0) { + $arr = array(); + + $query = $this->db->query("SELECT id FROM `" . TABLE_FOLDER_USER . "` WHERE uid=?", array($uid)); + + if(isset($query->rows)) { + foreach ($query->rows as $q) { + array_push($arr, $q['id']); + $this->get_sub_folders($q['id'], &$arr); + } + } + + return $arr; + } + + + private function get_sub_folders($id = 0, $arr = array()) { + $query = $this->db->query("SELECT id FROM `" . TABLE_FOLDER . "` WHERE parent_id=?", array($id)); + + if(isset($query->rows)) { + foreach ($query->rows as $q) { + array_push($arr, $q['id']); + $this->get_sub_folders($q['id'], &$arr); + } + } + + } + + public function get_folders_by_string($s = '') { + if(strlen($s) < 2) { return array(); } + + $query = $this->db->query("SELECT name FROM `" . TABLE_FOLDER . "` WHERE name LIKE ? ORDER BY name ASC", array($s . "%") ); + + if(isset($query->rows)) { return $query->rows; } + + return array(); + } + + + public function get_folders_by_uid($uid = 0) { + $folders = ''; + + $query = $this->db->query("SELECT `" . TABLE_FOLDER_USER . "`.id, name FROM `" . TABLE_FOLDER_USER . "`, `" . TABLE_FOLDER . "` WHERE `" . TABLE_FOLDER_USER . "`.id=`" . TABLE_FOLDER . "`.id AND uid=?", array($uid) ); + + if(isset($query->rows)) { + foreach ($query->rows as $q) { $folders .= "\n" . $q['name']; } + } + + return preg_replace("/^\n/", "", $folders); + } + + +} + +?> diff --git a/webui/model/message/restore.php b/webui/model/message/restore.php index f080b865..5e2e8341 100644 --- a/webui/model/message/restore.php +++ b/webui/model/message/restore.php @@ -14,8 +14,10 @@ class ModelMessageRestore extends Model { if($zip->open($filename, ZIPARCHIVE::CREATE) != true) { exit("cannot open <$filename>\n"); } foreach($idlist as $id) { - $rawemail = $this->model_search_message->get_raw_message($id); - $zip->addFromString($id . ".eml", $rawemail); + $piler_id = $this->model_search_message->get_piler_id_by_id($id); + + $rawemail = $this->model_search_message->get_raw_message($piler_id); + $zip->addFromString($piler_id . ".eml", $rawemail); AUDIT(ACTION_DOWNLOAD_MESSAGE, '', '', $id, ''); } diff --git a/webui/model/search/message.php b/webui/model/search/message.php index 6b9298e6..c4d78513 100644 --- a/webui/model/search/message.php +++ b/webui/model/search/message.php @@ -375,10 +375,17 @@ class ModelSearchMessage extends Model { } + public function get_piler_id_by_id($id = 0) { + $query = $this->db->query("SELECT `piler_id` FROM `" . TABLE_META . "` WHERE id=?", array($id)); + if(isset($query->row['piler_id'])) { return $query->row['piler_id']; } + return ''; + } + + public function get_message_tag($id = '', $uid = 0) { if($id == '' || $uid <= 0) { return ''; } - $query = $this->db->query("SELECT `tag` FROM " . TABLE_TAG . "," . TABLE_META . " WHERE " . TABLE_TAG . ".id=" . TABLE_META . ".id AND uid=? AND piler_id=?", array($uid, $id)); + $query = $this->db->query("SELECT `tag` FROM " . TABLE_TAG . " WHERE uid=? AND id=?", array($uid, $id)); if(isset($query->row['tag'])) { return $query->row['tag']; } @@ -389,25 +396,16 @@ class ModelSearchMessage extends Model { public function add_message_tag($id = '', $uid = 0, $tag = '') { if($id == '' || $uid <= 0) { return 0; } - $query = $this->db->query("SELECT `id` FROM " . TABLE_META . " WHERE piler_id=?", array($id)); - - if(isset($query->row['id']) && $query->row['id'] > 0) { - - $id = $query->row['id']; - - if($tag == '') { - $query = $this->db->query("DELETE FROM " . TABLE_TAG . " WHERE uid=? AND id=?", array($uid, $id)); - } else { - $query = $this->db->query("UPDATE " . TABLE_TAG . " SET tag=? WHERE uid=? AND id=?", array($tag, $uid, $id)); - if($this->db->countAffected() == 0) { - $query = $this->db->query("INSERT INTO " . TABLE_TAG . " (id, uid, tag) VALUES(?,?,?)", array($id, $uid, $tag)); - } + if($tag == '') { + $query = $this->db->query("DELETE FROM " . TABLE_TAG . " WHERE uid=? AND id=?", array($uid, $id)); + } else { + $query = $this->db->query("UPDATE " . TABLE_TAG . " SET tag=? WHERE uid=? AND id=?", array($tag, $uid, $id)); + if($this->db->countAffected() == 0) { + $query = $this->db->query("INSERT INTO " . TABLE_TAG . " (id, uid, tag) VALUES(?,?,?)", array($id, $uid, $tag)); } - - return 1; } - return 0; + return 1; } @@ -423,6 +421,35 @@ class ModelSearchMessage extends Model { } } + + public function get_message_note($id = '', $uid = 0) { + if($id == '' || $uid <= 0) { return ''; } + + $query = $this->db->query("SELECT `note` FROM " . TABLE_NOTE . " WHERE uid=? AND id=?", array($uid, $id)); + + if(isset($query->row['note'])) { return $query->row['note']; } + + return ''; + } + + + public function add_message_note($id = '', $uid = 0, $note = '') { + if($id == '' || $uid <= 0) { return 0; } + + if($note == '') { + $query = $this->db->query("DELETE FROM " . TABLE_NOTE . " WHERE uid=? AND id=?", array($uid, $id)); + } else { + $query = $this->db->query("UPDATE " . TABLE_NOTE . " SET note=? WHERE uid=? AND id=?", array($note, $uid, $id)); + if($this->db->countAffected() == 0) { + $query = $this->db->query("INSERT INTO " . TABLE_NOTE . " (id, uid, note) VALUES(?,?,?)", array($id, $uid, $note)); + } + } + + return 1; + } + + + } ?> diff --git a/webui/model/search/search.php b/webui/model/search/search.php index 0aea8170..5e4e9d4c 100644 --- a/webui/model/search/search.php +++ b/webui/model/search/search.php @@ -2,7 +2,7 @@ class ModelSearchSearch extends Model { - public function search_messages($data = array(), $search_type = SIMPLE_SEARCH, $page = 0) { + public function search_messages($data = array(), $page = 0) { $one_page_of_ids = array(); $total_hits = 0; $sort = "sent"; @@ -48,21 +48,13 @@ class ModelSearchSearch extends Model { $all_ids = $this->query_all_possible_IDs_by_reference($data['ref'], $cache_key); } else { - if($search_type == SIMPLE_SEARCH) { - $conditions = $this->assemble_simple_query_conditions($data); - } - else { - $conditions = $this->assemble_advanced_query_conditions($data); - } - - $all_ids = $this->query_all_possible_IDs($data, $conditions, $sort, $order, $sortorder, $cache_key); + $all_ids = $this->query_all_possible_IDs($data, $sort, $order, $sortorder, $cache_key); } } - $total_hits = count($all_ids); - $all_ids_csv = implode(",", $all_ids); + $data['page_len'] = get_page_length(); @@ -83,182 +75,183 @@ class ModelSearchSearch extends Model { } + $all_ids_csv = substr($all_ids_csv, 1, strlen($all_ids_csv)); + + return array($total_hits, $all_ids_csv, $this->get_meta_data($one_page_of_ids, $q, $sortorder)); } - private function assemble_advanced_query_conditions($data = array()) { - $f1 = $f2 = $t1 = $t2 = $fd = $td = ''; - $incoming = $outgoing = ''; - $email = $match = ''; - $n_fc = $n_tc = 0; + private function assemble_email_address_condition($from = '', $to = '') { + $s = ''; + $f_from = $f_fromdomain = $f_to = $f_todomain = ''; + $o_from = $o_fromdomain = $o_to = $o_todomain = ''; + $f_f = $o_f = $f_t = $o_t = ''; + $f = $t = $fdomain = $tdomain = ''; - $data['f_from'] = $this->fix_email_address_for_sphinx($data['f_from']); - $data['o_from'] = $this->fix_email_address_for_sphinx($data['o_from']); - $data['f_to'] = $this->fix_email_address_for_sphinx($data['f_to']); - $data['o_to'] = $this->fix_email_address_for_sphinx($data['o_to']); - $data['from_domain'] = $this->fix_email_address_for_sphinx($data['from_domain']); - $data['to_domain'] = $this->fix_email_address_for_sphinx($data['to_domain']); + $session_emails = $this->fix_email_address_for_sphinx($_SESSION['emails']); - $data['body'] = $this->fixup_sphinx_operators($data['body']); - $data['subject'] = $this->fixup_sphinx_operators($data['subject']); + $all_your_addresses = $this->get_all_your_address(); - $data['any'] = $this->fixup_sphinx_operators($data['any']); - $data['any'] = $this->fix_email_address_for_sphinx($data['any']); + $from = preg_replace("/OR/", "", $from); + $to = preg_replace("/OR/", "", $to); + if($from) { + $e = preg_split("/\s/", $from); + foreach ($e as $email) { + if($email == '') { continue; } - if(Registry::get('auditor_user') == 1) { - if($data['f_from']) { $f1 .= "|" . $data['f_from']; $n_fc++; } - if($data['o_from']) { $f1 .= "|" . $data['o_from']; $n_fc++; } - if($data['from_domain']) { $fd .= "(@fromdomain " . substr($data['from_domain'], 1, strlen($data['from_domain'])) . ")"; $n_fc++; } - if($data['from']) { $f1 .= "|" . $this->fixup_sphinx_operators($data['from']); $n_fc++; } + $email = $this->fix_email_address_for_sphinx($email); - if($data['f_to']) { $t1 .= "|" . $data['f_to']; $n_tc++; } - if($data['o_to']) { $t1 .= "|" . $data['o_to']; $n_tc++; } - if($data['to_domain']) { $td .= "(@todomain " . substr($data['to_domain'], 1, strlen($data['to_domain'])) . ")"; $n_tc++; } - if($data['to']) { $f2 .= "|" . $this->fixup_sphinx_operators($data['to']); $n_tc++; } + $field = 'from'; + if($email[0] == 'X') { + $email = substr($email, 1, strlen($email)); - if($f1) { $f1 = "(@from " . substr($f1, 1, strlen($f1)) . ")"; } - if($t1) { $t1 = "(@to " . substr($t1, 1, strlen($t1)) . ")"; } - - } - else { - $all_your_addresses = $this->get_all_your_address(); - - if($data['f_from']) { $f1 = "(@from " . $data['f_from'] . " @to $all_your_addresses)"; $n_fc++; } - if($data['o_from']) { $f2 = "(@from " . $data['o_from'] . ")"; $n_fc++; } - if($data['from_domain']) { $fd = "(@fromdomain " . substr($data['from_domain'], 1, strlen($data['from_domain'])) . " @to $all_your_addresses)"; $n_fc++; } - if($data['from']) { $fd = "(@from " . $this->fixup_sphinx_operators($data['from']) . " @to $all_your_addresses)"; $n_fc++; } - - if($data['f_to']) { $t1 = "(@to " . $data['f_to'] . " @from $all_your_addresses)"; $n_tc++; } - if($data['o_to']) { $t2 = "(@to " . $data['o_to'] . ")"; $n_tc++; } - if($data['to_domain']) { $td = "(@todomain " . substr($data['to_domain'], 1, strlen($data['to_domain'])) . " @from $all_your_addresses)"; $n_tc++; } - if($data['to']) { $fd = "(@to " . $this->fixup_sphinx_operators($data['to']) . " @from $all_your_addresses)"; $n_tc++; } - - if($n_fc == 0 && $n_tc == 0 && $data['from_domain'] == '' && $data['to_domain'] == '') { - if($data['direction'] == 2) { - $f1 = " (@from " . $all_your_addresses . ")"; - } else { - $t1 = " (@to " . $all_your_addresses . ")"; + $field = 'fromdomain'; + $fdomain .= "|$email"; } - } - } - - if($f1) { $incoming .= "|$f1"; } - if($f2) { $incoming .= "|$f2"; } - if($fd) { $incoming .= "|$fd"; } - - if($t1) { $outgoing .= "|$t1"; } - if($t2) { $outgoing .= "|$t2"; } - if($td) { $outgoing .= "|$td"; } - - if($incoming) { $incoming = substr($incoming, 1, strlen($incoming)); if($n_fc > 1) { $incoming = "($incoming)"; } } - if($outgoing) { $outgoing = substr($outgoing, 1, strlen($outgoing)); if($n_tc > 1) { $outgoing = "($outgoing)"; } } - - - if($incoming) { - $email = $incoming; - if($outgoing) { $email = $incoming . " & " . $outgoing; } - } else if($outgoing) { - $email = $outgoing; - } - - - if($email) { $match = $email; } - - if($data['body']) { if($match) { $match .= " & "; } $match .= "(@body " . $data['body'] . ") "; } - if($data['subject']) { if($match) { $match .= " & "; } $match .= "(@subject " . $data['subject'] . ") "; } - if($data['attachment_type'] && $data['attachment_type'] != "any") { if($match) { $match .= " & "; } $match .= "(@attachment_types " . $data['attachment_type'] . ") "; } - - if($data['any']) { if($match) { $match .= " & "; } $match .= "(" . $data['any'] . ") "; } - - return $match; - } - - - private function assemble_simple_query_conditions($data = array(), $sort = 'sent', $order = 'DESC', $sortorder = '', $cache_key = '') { - $email = $match = ""; - - if(Registry::get('auditor_user') == 0) { - - $all_your_addresses = $this->get_all_your_address(); - - if(isset($data['from'])) { $data['from'] = fix_email_address($data['from']); } - if(isset($data['to'])) { $data['to'] = fix_email_address($data['to']); } - - // missing From: address - - if(!isset($data['from'])) { - - if(isset($data['to']) && substr($data['to'], 0, 1) == '@') { - $email = "@from $all_your_addresses @todomain " . $this->fix_email_address_for_sphinx(substr($data['to'], 1, strlen($data['to']))); - } - else if(isset($data['to']) && !strstr($data['to'], '@')) { $email = "@from $all_your_addresses @to " . $this->fixup_sphinx_operators($this->fix_email_address_for_sphinx($data['to'])); } - else if(!isset($data['to'])) { $email = "@to $all_your_addresses"; } - else if(!in_array($data['to'], $_SESSION['emails'])) { $email = "@from $all_your_addresses @to " . $this->fix_email_address_for_sphinx($data['to']); } - else { $email = "@to " . $this->fix_email_address_for_sphinx($data['to']); } - - } - - // missing To: address - - else if(!isset($data['to'])) { - if(isset($data['from']) && substr($data['from'], 0, 1) == '@') { - $email = "@to $all_your_addresses @fromdomain " . $this->fix_email_address_for_sphinx(substr($data['from'], 1, strlen($data['from']))); - } - else if(isset($data['from']) && !strstr($data['from'], '@')) { $email = "@to $all_your_addresses @from " . $this->fixup_sphinx_operators($this->fix_email_address_for_sphinx($data['from'])); } - else if(!in_array($data['from'], $_SESSION['emails'])) { $email = "@to $all_your_addresses @from " . $this->fix_email_address_for_sphinx($data['from']); } - else { $email = "@from " . $this->fix_email_address_for_sphinx($data['from']); } - } - - else if(isset($data['from']) && isset($data['to'])) { - - if( - (!in_array($data['from'], $_SESSION['emails']) && in_array($data['to'], $_SESSION['emails'])) || - (!in_array($data['to'], $_SESSION['emails']) && in_array($data['from'], $_SESSION['emails'])) - ) { - $email = "@from " . $this->fix_email_address_for_sphinx($data['from']) . " @to " . $this->fix_email_address_for_sphinx($data['to']); - } - else { - $email = " @to INVALID "; + $f .= "|$email"; } - } + + if(in_array($email, $session_emails)) { + $a = "o_$field"; + } + else { + $a = "f_$field"; + } + + if($$a) { $$a .= "|"; } + $$a .= "$email"; + } } - else { - if(isset($data['from'])) { - if(substr($data['from'], 0, 1) == '@') { $match .= " @fromdomain " . $this->fix_email_address_for_sphinx(substr($data['from'], 1, strlen($data['from']))); } - else { $match .= " @from " . $this->fixup_sphinx_operators($this->fix_email_address_for_sphinx($data['from'])); } - } - if(isset($data['to'])) { - if(substr($data['to'], 0, 1) == '@') { $match .= " @todomain " . $this->fix_email_address_for_sphinx(substr($data['to'], 1, strlen($data['to']))); } - else { $match .= " @to " . $this->fixup_sphinx_operators($this->fix_email_address_for_sphinx($data['to'])); } - } + if($to) { + $e = preg_split("/\s/", $to); + foreach ($e as $email) { + if($email == '') { continue; } + $email = $this->fix_email_address_for_sphinx($email); + + $field = 'to'; + if($email[0] == 'X') { + $email = substr($email, 1, strlen($email)); + $field = 'todomain'; + $tdomain .= "|$email"; + } + else { + $t .= "|$email"; + } + + if(in_array($email, $session_emails)) { + $a = "o_$field"; + } + else { + $a = "f_$field"; + } + + if($$a) { $$a .= "|"; } + $$a .= "$email"; + } } + if($f) { $f = preg_replace("/^\|/", "@from ", $f); } - if(isset($data['subject'])) { - $data['subject'] = $this->fixup_sphinx_operators($data['subject']); - $match .= " @(subject,body) " . $data['subject']; + if($fdomain) { + $fdomain = preg_replace("/^\|/", "@fromdomain ", $fdomain); + if($f) { $f = "(($f)|($fdomain))"; } + else { $f = "($fdomain)"; } + } + + if($t) { $t = preg_replace("/^\|/", "@to ", $t); } + + if($tdomain) { + $tdomain = preg_replace("/^\|/", "@todomain ", $tdomain); + if($t) { $t = "(($t)|($tdomain))"; } + else { $t = "($tdomain)"; } } - if($email) { $match = " $email " . $match; } + if(Registry::get('auditor_user') == 1 || ENABLE_FOLDER_RESTRICTIONS == 1) { + if($from == '' && $to == '') { return ""; } + + if($f && $t) { return "($f & $t)"; } + else if($f) { return "($f)"; } + else if($t) { return "($t)"; } + } + + + if($f_from) { $f_f = "@from $f_from"; } + if($f_fromdomain) { if($f_f) { $f_f = "($f_f | @fromdomain $f_fromdomain)"; } else { $f_f = "@fromdomain $f_fromdomain"; } } + + if($o_from) { $o_f = "@from $o_from"; } + + if($f_to) { $f_t = "@to $f_to"; } + if($f_todomain) { if($f_t) { $f_t = "($f_t | @todomain $f_todomain)"; } else { $f_t = "@todomain $f_todomain"; } } + + if($o_to) { $o_t = "@to $o_to"; } + + + if($f_f == '' && $o_f == '' && $f_t == '' && $o_t == '') { return "@to $all_your_addresses"; } + if($f_f == '' && $o_f == '' && $f_t == '' && $o_t ) { return "$o_t"; } + if($f_f == '' && $o_f == '' && $f_t && $o_t == '') { return "(@from $all_your_addresses & $f_t)"; } + if($f_f == '' && $o_f == '' && $f_t && $o_t ) { return "($o_t | (@from $all_your_addresses & $f_t))"; } + + if($f_f == '' && $o_f && $f_t == '' && $o_t == '') { return "$o_f"; } + if($f_f == '' && $o_f && $f_t == '' && $o_t ) { return "($o_f & $o_t)"; } + if($f_f == '' && $o_f && $f_t && $o_t == '') { return "($o_f & $f_t)"; } + if($f_f == '' && $o_f && $f_t && $o_t ) { return "(($o_f & $f_t) | ($o_f & $o_t))"; } + + if($f_f && $o_f == '' && $f_t == '' && $o_t == '') { return "($f_f & @to $all_your_addresses)"; } + if($f_f && $o_f == '' && $f_t == '' && $o_t ) { return "($f_f & $o_t)"; } + if($f_f && $o_f == '' && $f_t && $o_t == '') { return "@from INVALID"; } + if($f_f && $o_f == '' && $f_t && $o_t ) { return "($f_f & $o_t)"; } + + if($f_f && $o_f && $f_t == '' && $o_t == '') { return "(($f_f & @to $all_your_addresses)|$o_f)"; } + if($f_f && $o_f && $f_t == '' && $o_t ) { return "(($f_f & $o_t)|($o_f & $o_t))"; } + if($f_f && $o_f && $f_t && $o_t == '') { return "($o_f & $f_t)"; } + if($f_f && $o_f && $f_t && $o_t ) { return "(($f_f & $o_t)|($o_f & $f_t))"; } + + + return "(@from $all_your_addresses | @to $all_your_addresses)"; - return $match; } - private function query_all_possible_IDs($data = array(), $conditions = '', $sort = 'sent', $order = 'DESC', $sortorder = '', $cache_key = '') { + private function query_all_possible_IDs($data = array(), $sort = 'sent', $order = 'DESC', $sortorder = '', $cache_key = '') { $ids = array(); - $direction = $size = ''; + $__folders = array(); + $match = ''; + $direction = $attachment = $size = $folders = ''; $tag_id_list = ''; $a = ""; + + $match = $this->assemble_email_address_condition($data['from'], $data['to']); + + if($data['body']) { + $data['body'] = $this->fixup_sphinx_operators($data['body']); + if($match) { $match .= " & "; } $match .= "(@body " . $data['body'] . ") "; + } + + if($data['subject']) { + $data['subject'] = $this->fixup_sphinx_operators($data['subject']); + if($match) { $match .= " & "; } $match .= "(@subject " . $data['subject'] . ") "; + } + + if($data['attachment_type'] && $data['attachment_type'] != "any") { if($match) { $match .= " & "; } $match .= "(@attachment_types " . $data['attachment_type'] . ") "; } + + + if($data['any']) { + $data['any'] = $this->fixup_sphinx_operators($data['any']); + $data['any'] = $this->fix_email_address_for_sphinx($data['any']); + if($match) { $match = "($match) & "; } $match .= "(" . $data['any'] . ") "; + } + + + if($data['sort'] == 'from' || $data['sort'] == 'subj') { $sortorder = ''; } $date = fixup_date_condition('sent', $data['date1'], $data['date2']); @@ -273,20 +266,31 @@ class ModelSearchSearch extends Model { } if(isset($data['attachment_type']) && $data['attachment_type'] == 'any') { $a = "attachments > 0 AND "; } + else if(isset($data['has_attachment']) && $data['has_attachment'] == 1) { $attachment = "attachments > 0 AND "; } - if(isset($data['tag']) && $data['tag']) { - $data['tag'] = $this->fixup_sphinx_operators($data['tag']); - $aa = $this->sphx->query("SELECT id FROM " . SPHINX_TAG_INDEX . " WHERE uid=" . $_SESSION['uid'] . " AND MATCH('@tag " . $data['tag'] . " ') "); - - foreach($aa->rows as $a) { - $tag_id_list .= "," . $a['id']; + if(ENABLE_FOLDER_RESTRICTIONS == 1) { + $s = explode(" ", $data['folders']); + while(list($k,$v) = each($s)) { + if(in_array($v, $_SESSION['folders'])) { + array_push($__folders, $v); + } } - $query = $this->sphx->query("SELECT id FROM " . SPHINX_MAIN_INDEX . " WHERE id IN (" . substr($tag_id_list, 1, strlen($tag_id_list)) . ") $sortorder LIMIT 0," . MAX_SEARCH_HITS); + $folders = "folder IN (" . implode(",", $__folders) . ") AND "; + } + + + if(isset($data['tag']) && $data['tag']) { + $id_list = $this->get_sphinx_id_list($data['tag'], SPHINX_TAG_INDEX, 'tag'); + $query = $this->sphx->query("SELECT id FROM " . SPHINX_MAIN_INDEX . " WHERE $folders id IN ($id_list) $sortorder LIMIT 0," . MAX_SEARCH_HITS); + } + else if(isset($data['note']) && $data['note']) { + $id_list = $this->get_sphinx_id_list($data['note'], SPHINX_NOTE_INDEX, 'note'); + $query = $this->sphx->query("SELECT id FROM " . SPHINX_MAIN_INDEX . " WHERE $folders id IN ($id_list) $sortorder LIMIT 0," . MAX_SEARCH_HITS); } else { - $query = $this->sphx->query("SELECT id FROM " . SPHINX_MAIN_INDEX . " WHERE $a $date $direction $size MATCH('$conditions') $sortorder LIMIT 0," . MAX_SEARCH_HITS); + $query = $this->sphx->query("SELECT id FROM " . SPHINX_MAIN_INDEX . " WHERE $a $date $attachment $direction $size $folders MATCH('$match') $sortorder LIMIT 0," . MAX_SEARCH_HITS); } //print $query->query; print "

" . $query->exec_time . "

\n"; @@ -331,7 +335,6 @@ class ModelSearchSearch extends Model { $memcache->add($cache_key, array('ts' => time(), 'total_hits' => count($ids), 'ids' => $ids), 0, MEMCACHED_TTL); } - return $ids; } @@ -347,6 +350,15 @@ class ModelSearchSearch extends Model { array_push($ids, $q['id']); } + if(ENABLE_FOLDER_RESTRICTIONS == 1) { + $query = $this->sphx->query("SELECT id, folder FROM " . SPHINX_MAIN_INDEX . " WHERE id IN (" . implode(",", $ids) . ")"); + $ids = array(); + foreach($query->rows as $q) { + if(isset($q['folder']) && in_array($q['folder'], $_SESSION['folders'])) { array_push($ids, $q['id']); } + } + } + + if(MEMCACHED_ENABLED && $cache_key) { $memcache = Registry::get('memcache'); $memcache->add($cache_key, array('ts' => time(), 'total_hits' => count($ids), 'ids' => $ids), 0, MEMCACHED_TTL); @@ -356,10 +368,27 @@ class ModelSearchSearch extends Model { } + private function get_sphinx_id_list($s = '', $sphx_table = '', $field = '') { + $id_list = ''; + + $s = $this->fixup_sphinx_operators($s); + + $q = $this->sphx->query("SELECT id FROM $sphx_table WHERE uid=" . $_SESSION['uid'] . " AND MATCH('@$field $s') "); + + foreach($q->rows as $a) { + $id_list .= "," . $a['id']; + } + + if($id_list) { $id_list = substr($id_list, 1, strlen($id_list)); } + + return $id_list; + } + + private function get_meta_data($ids = array(), $q = '', $sortorder = '') { $messages = array(); $tag = array(); - + $note = array(); if(count($ids) == 0) return $messages; @@ -376,6 +405,11 @@ class ModelSearchSearch extends Model { $tag[$t['id']] = $t['tag']; } + $notes = $this->db->query("SELECT `id`, `note` FROM " . TABLE_NOTE . " WHERE `uid`=? AND `id` IN ($q)", $ids); + + foreach ($notes->rows as $n) { + $note[$n['id']] = $n['note']; + } $lang = Registry::get('language'); @@ -399,6 +433,7 @@ class ModelSearchSearch extends Model { } if(isset($tag[$m['id']])) { $m['tag'] = $tag[$m['id']]; } else { $m['tag'] = ''; } + if(isset($note[$m['id']])) { $m['note'] = $note[$m['id']]; } else { $m['note'] = ''; } array_push($messages, $m); } @@ -419,7 +454,7 @@ class ModelSearchSearch extends Model { array_push($domains, $q['domain']); } - $query = $this->db->query("SELECT `to` FROM " . VIEW_MESSAGES . " WHERE piler_id=?", array($id)); + $query = $this->db->query("SELECT `to` FROM " . VIEW_MESSAGES . " WHERE id=?", array($id)); foreach($query->rows as $q) { $mydomain = 0; @@ -449,7 +484,7 @@ class ModelSearchSearch extends Model { } - public function check_your_permission_by_piler_id($id = '') { + public function check_your_permission_by_id($id = '') { $q = ''; $arr = $a = array(); @@ -470,9 +505,14 @@ class ModelSearchSearch extends Model { $arr = array_merge($arr, $a, $a); - $query = $this->db->query("SELECT * FROM " . VIEW_MESSAGES . " WHERE piler_id=? AND ( `from` IN ($q) OR `to` IN ($q) )", $arr); - - if(isset($query->row['id'])) { return 1; } + if(ENABLE_FOLDER_RESTRICTIONS == 1) { + $query = $this->sphx->query("SELECT folder FROM " . SPHINX_MAIN_INDEX . " WHERE id=" . (int)$id); + if(isset($query->row['folder']) && in_array($query->row['folder'], $_SESSION['folders'])) { return 1; } + } + else { + $query = $this->db->query("SELECT id FROM " . VIEW_MESSAGES . " WHERE id=? AND ( `from` IN ($q) OR `to` IN ($q) )", $arr); + if(isset($query->row['id'])) { return 1; } + } return 0; } @@ -480,9 +520,9 @@ class ModelSearchSearch extends Model { public function check_your_permission_by_id_list($id = array()) { $q = $q2 = ''; - $arr = $a = $result = $result2 = array(); + $arr = $a = $result = array(); - if(count($id) < 1) { return array($result, $result2); } + if(count($id) < 1) { return $result; } $arr = $id; @@ -490,6 +530,7 @@ class ModelSearchSearch extends Model { $q2 .= ",?"; } + $q2 = preg_replace("/^\,/", "", $q2); if(Registry::get('auditor_user') == 0) { @@ -505,21 +546,30 @@ class ModelSearchSearch extends Model { $q = preg_replace("/^\,/", "", $q); if(Registry::get('auditor_user') == 1) { - $query = $this->db->query("SELECT distinct id, piler_id FROM " . VIEW_MESSAGES . " WHERE `id` IN ($q2)", $arr); + $query = $this->db->query("SELECT id FROM `" . TABLE_META . "` WHERE `id` IN ($q2)", $arr); } else { - $arr = array_merge($arr, $a, $a); - $query = $this->db->query("SELECT distinct id, piler_id FROM " . VIEW_MESSAGES . " WHERE `id` IN ($q2) AND ( `from` IN ($q) OR `to` IN ($q) )", $arr); - } - - if($query->num_rows > 0) { - foreach ($query->rows as $q) { - array_push($result, $q['id']); - array_push($result2, $q['piler_id']); + if(ENABLE_FOLDER_RESTRICTIONS == 1) { + $query = $this->sphx->query("SELECT id FROM " . SPHINX_MAIN_INDEX . " WHERE id IN (" . implode(",", $id) . ")"); + } + else { + $arr = array_merge($arr, $a, $a); + $query = $this->db->query("SELECT id FROM `" . VIEW_MESSAGES . "` WHERE `id` IN ($q2) AND ( `from` IN ($q) OR `to` IN ($q) )", $arr); } } - return array($result, $result2); + if($query->num_rows > 0) { + foreach ($query->rows as $q) { + if(ENABLE_FOLDER_RESTRICTIONS == 1) { + if(in_array($q['folder'], $_SESSION['folders'])) { array_push($result, $q['id']); } + } + else { + array_push($result, $q['id']); + } + } + } + + return $result; } @@ -566,6 +616,7 @@ class ModelSearchSearch extends Model { $s = preg_replace("/ OR /", "|", $s); $s = preg_replace("/(\-)/", " ", $s); + $s = preg_replace("/\'/", '"', $s); $a = explode(" ", $s); $s = ''; diff --git a/webui/model/user/auth.php b/webui/model/user/auth.php index 31f37f59..890c02b9 100644 --- a/webui/model/user/auth.php +++ b/webui/model/user/auth.php @@ -20,6 +20,7 @@ class ModelUserAuth extends Model { $_SESSION['realname'] = $query->row['realname']; $_SESSION['emails'] = $this->model_user_user->get_users_all_email_addresses($query->row['uid']); + $_SESSION['folders'] = $this->model_folder_folder->get_all_folder_ids($query->row['uid']); AUDIT(ACTION_LOGIN, $username, '', '', 'successful auth against user table'); diff --git a/webui/model/user/user.php b/webui/model/user/user.php index 200e9491..09ad970a 100644 --- a/webui/model/user/user.php +++ b/webui/model/user/user.php @@ -302,6 +302,7 @@ class ModelUserUser extends Model { } $this->update_group_settings((int)$user['uid'], $user['group']); + $this->update_folder_settings((int)$user['uid'], $user['folder']); return 1; } @@ -378,6 +379,7 @@ class ModelUserUser extends Model { } $this->update_group_settings((int)$user['uid'], $user['group']); + $this->update_folder_settings((int)$user['uid'], $user['folder']); return 1; } @@ -413,6 +415,36 @@ class ModelUserUser extends Model { } + private function update_folder_settings($uid = -1, $folder = '') { + $__g = array(); + + if($uid <= 0) { return 0; } + + $query = $this->db->query("DELETE FROM `" . TABLE_FOLDER_USER . "` WHERE uid=?", array($uid)); + + $query = $this->db->query("SELECT id, name FROM `" . TABLE_FOLDER . "`"); + + $folders = array(); + + foreach ($query->rows as $q) { + $folders[$q['name']] = $q['id']; + } + + $folder = explode("\n", $folder); + + foreach($folder as $g) { + $g = rtrim($g); + + if($g && !isset($__g[$folders[$g]])) { + $query = $this->db->query("INSERT INTO `" . TABLE_FOLDER_USER . "` (id, uid) VALUES(?,?)", array($folders[$g], (int)$uid)); + $__g[$folders[$g]] = 1; + } + } + + return 1; + } + + public function delete_user($uid) { if(!$this->check_uid($uid)){ return 0; } diff --git a/webui/view/javascript/colorbox.js b/webui/view/javascript/colorbox.js deleted file mode 100644 index a82c6afd..00000000 --- a/webui/view/javascript/colorbox.js +++ /dev/null @@ -1,888 +0,0 @@ -// ColorBox v1.3.19 - jQuery lightbox plugin -// (c) 2011 Jack Moore - jacklmoore.com -// License: http://www.opensource.org/licenses/mit-license.php -(function ($, document, window) { - var - // Default settings object. - // See http://jacklmoore.com/colorbox for details. - defaults = { - transition: "elastic", - speed: 300, - width: false, - initialWidth: "600", - innerWidth: false, - maxWidth: false, - height: false, - initialHeight: "450", - innerHeight: false, - maxHeight: false, - scalePhotos: true, - scrolling: true, - inline: false, - html: false, - iframe: false, - fastIframe: true, - photo: false, - href: false, - title: false, - rel: false, - opacity: 0.9, - preloading: true, - current: "image {current} of {total}", - previous: "previous", - next: "next", - close: "close", - open: false, - returnFocus: true, - reposition: true, - loop: true, - slideshow: false, - slideshowAuto: true, - slideshowSpeed: 2500, - slideshowStart: "start slideshow", - slideshowStop: "stop slideshow", - onOpen: false, - onLoad: false, - onComplete: false, - onCleanup: false, - onClosed: false, - overlayClose: true, - escKey: true, - arrowKey: true, - top: false, - bottom: false, - left: false, - right: false, - fixed: false, - data: undefined - }, - - // Abstracting the HTML and event identifiers for easy rebranding - colorbox = 'colorbox', - prefix = 'cbox', - boxElement = prefix + 'Element', - - // Events - event_open = prefix + '_open', - event_load = prefix + '_load', - event_complete = prefix + '_complete', - event_cleanup = prefix + '_cleanup', - event_closed = prefix + '_closed', - event_purge = prefix + '_purge', - - // Special Handling for IE - isIE = !$.support.opacity && !$.support.style, // IE7 & IE8 - isIE6 = isIE && !window.XMLHttpRequest, // IE6 - event_ie6 = prefix + '_IE6', - - // Cached jQuery Object Variables - $overlay, - $box, - $wrap, - $content, - $topBorder, - $leftBorder, - $rightBorder, - $bottomBorder, - $related, - $window, - $loaded, - $loadingBay, - $loadingOverlay, - $title, - $current, - $slideshow, - $next, - $prev, - $close, - $groupControls, - - // Variables for cached values or use across multiple functions - settings, - interfaceHeight, - interfaceWidth, - loadedHeight, - loadedWidth, - element, - index, - photo, - open, - active, - closing, - loadingTimer, - publicMethod, - div = "div", - init; - - // **************** - // HELPER FUNCTIONS - // **************** - - // Convience function for creating new jQuery objects - function $tag(tag, id, css) { - var element = document.createElement(tag); - - if (id) { - element.id = prefix + id; - } - - if (css) { - element.style.cssText = css; - } - - return $(element); - } - - // Determine the next and previous members in a group. - function getIndex(increment) { - var - max = $related.length, - newIndex = (index + increment) % max; - - return (newIndex < 0) ? max + newIndex : newIndex; - } - - // Convert '%' and 'px' values to integers - function setSize(size, dimension) { - return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : $window.height()) / 100) : 1) * parseInt(size, 10)); - } - - // Checks an href to see if it is a photo. - // There is a force photo option (photo: true) for hrefs that cannot be matched by this regex. - function isImage(url) { - return settings.photo || /\.(gif|png|jpe?g|bmp|ico)((#|\?).*)?$/i.test(url); - } - - // Assigns function results to their respective properties - function makeSettings() { - var i; - settings = $.extend({}, $.data(element, colorbox)); - - for (i in settings) { - if ($.isFunction(settings[i]) && i.slice(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time. - settings[i] = settings[i].call(element); - } - } - - settings.rel = settings.rel || element.rel || 'nofollow'; - settings.href = settings.href || $(element).attr('href'); - settings.title = settings.title || element.title; - - if (typeof settings.href === "string") { - settings.href = $.trim(settings.href); - } - } - - function trigger(event, callback) { - $.event.trigger(event); - if (callback) { - callback.call(element); - } - } - - // Slideshow functionality - function slideshow() { - var - timeOut, - className = prefix + "Slideshow_", - click = "click." + prefix, - start, - stop, - clear; - - if (settings.slideshow && $related[1]) { - start = function () { - $slideshow - .text(settings.slideshowStop) - .unbind(click) - .bind(event_complete, function () { - if (settings.loop || $related[index + 1]) { - timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed); - } - }) - .bind(event_load, function () { - clearTimeout(timeOut); - }) - .one(click + ' ' + event_cleanup, stop); - $box.removeClass(className + "off").addClass(className + "on"); - timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed); - }; - - stop = function () { - clearTimeout(timeOut); - $slideshow - .text(settings.slideshowStart) - .unbind([event_complete, event_load, event_cleanup, click].join(' ')) - .one(click, function () { - publicMethod.next(); - start(); - }); - $box.removeClass(className + "on").addClass(className + "off"); - }; - - if (settings.slideshowAuto) { - start(); - } else { - stop(); - } - } else { - $box.removeClass(className + "off " + className + "on"); - } - } - - function launch(target) { - if (!closing) { - - element = target; - - makeSettings(); - - $related = $(element); - - index = 0; - - if (settings.rel !== 'nofollow') { - $related = $('.' + boxElement).filter(function () { - var relRelated = $.data(this, colorbox).rel || this.rel; - return (relRelated === settings.rel); - }); - index = $related.index(element); - - // Check direct calls to ColorBox. - if (index === -1) { - $related = $related.add(element); - index = $related.length - 1; - } - } - - if (!open) { - open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys. - - $box.show(); - - if (settings.returnFocus) { - $(element).blur().one(event_closed, function () { - $(this).focus(); - }); - } - - // +settings.opacity avoids a problem in IE when using non-zero-prefixed-string-values, like '.5' - $overlay.css({"opacity": +settings.opacity, "cursor": settings.overlayClose ? "pointer" : "auto"}).show(); - - // Opens inital empty ColorBox prior to content being loaded. - settings.w = setSize(settings.initialWidth, 'x'); - settings.h = setSize(settings.initialHeight, 'y'); - publicMethod.position(); - - if (isIE6) { - $window.bind('resize.' + event_ie6 + ' scroll.' + event_ie6, function () { - $overlay.css({width: $window.width(), height: $window.height(), top: $window.scrollTop(), left: $window.scrollLeft()}); - }).trigger('resize.' + event_ie6); - } - - trigger(event_open, settings.onOpen); - - $groupControls.add($title).hide(); - - $close.html(settings.close).show(); - } - - publicMethod.load(true); - } - } - - // ColorBox's markup needs to be added to the DOM prior to being called - // so that the browser will go ahead and load the CSS background images. - function appendHTML() { - if (!$box && document.body) { - init = false; - - $window = $(window); - $box = $tag(div).attr({id: colorbox, 'class': isIE ? prefix + (isIE6 ? 'IE6' : 'IE') : ''}).hide(); - $overlay = $tag(div, "Overlay", isIE6 ? 'position:absolute' : '').hide(); - $wrap = $tag(div, "Wrapper"); - $content = $tag(div, "Content").append( - $loaded = $tag(div, "LoadedContent", 'width:0; height:0; overflow:hidden'), - $loadingOverlay = $tag(div, "LoadingOverlay").add($tag(div, "LoadingGraphic")), - $title = $tag(div, "Title"), - $current = $tag(div, "Current"), - $next = $tag(div, "Next"), - $prev = $tag(div, "Previous"), - $slideshow = $tag(div, "Slideshow").bind(event_open, slideshow), - $close = $tag(div, "Close") - ); - - $wrap.append( // The 3x3 Grid that makes up ColorBox - $tag(div).append( - $tag(div, "TopLeft"), - $topBorder = $tag(div, "TopCenter"), - $tag(div, "TopRight") - ), - $tag(div, false, 'clear:left').append( - $leftBorder = $tag(div, "MiddleLeft"), - $content, - $rightBorder = $tag(div, "MiddleRight") - ), - $tag(div, false, 'clear:left').append( - $tag(div, "BottomLeft"), - $bottomBorder = $tag(div, "BottomCenter"), - $tag(div, "BottomRight") - ) - ).find('div div').css({'float': 'left'}); - - $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none'); - - $groupControls = $next.add($prev).add($current).add($slideshow); - - $(document.body).append($overlay, $box.append($wrap, $loadingBay)); - } - } - - // Add ColorBox's event bindings - function addBindings() { - if ($box) { - if (!init) { - init = true; - - // Cache values needed for size calculations - interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();//Subtraction needed for IE6 - interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width(); - loadedHeight = $loaded.outerHeight(true); - loadedWidth = $loaded.outerWidth(true); - - // Setting padding to remove the need to do size conversions during the animation step. - $box.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth}); - - // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly. - $next.click(function () { - publicMethod.next(); - }); - $prev.click(function () { - publicMethod.prev(); - }); - $close.click(function () { - publicMethod.close(); - }); - $overlay.click(function () { - if (settings.overlayClose) { - publicMethod.close(); - } - }); - - // Key Bindings - $(document).bind('keydown.' + prefix, function (e) { - var key = e.keyCode; - if (open && settings.escKey && key === 27) { - e.preventDefault(); - publicMethod.close(); - } - if (open && settings.arrowKey && $related[1]) { - if (key === 37) { - e.preventDefault(); - $prev.click(); - } else if (key === 39) { - e.preventDefault(); - $next.click(); - } - } - }); - - $('.' + boxElement, document).live('click', function (e) { - // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt. - // See: http://jacklmoore.com/notes/click-events/ - if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey)) { - e.preventDefault(); - launch(this); - } - }); - } - return true; - } - return false; - } - - // Don't do anything if ColorBox already exists. - if ($.colorbox) { - return; - } - - // Append the HTML when the DOM loads - $(appendHTML); - - - // **************** - // PUBLIC FUNCTIONS - // Usage format: $.fn.colorbox.close(); - // Usage from within an iframe: parent.$.fn.colorbox.close(); - // **************** - - publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) { - var $this = this; - - options = options || {}; - - appendHTML(); - - if (addBindings()) { - if (!$this[0]) { - if ($this.selector) { // if a selector was given and it didn't match any elements, go ahead and exit. - return $this; - } - // if no selector was given (ie. $.colorbox()), create a temporary element to work with - $this = $(''); - options.open = true; // assume an immediate open - } - - if (callback) { - options.onComplete = callback; - } - - $this.each(function () { - $.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options)); - }).addClass(boxElement); - - if (($.isFunction(options.open) && options.open.call($this)) || options.open) { - launch($this[0]); - } - } - - return $this; - }; - - publicMethod.position = function (speed, loadedCallback) { - var - top = 0, - left = 0, - offset = $box.offset(), - scrollTop = $window.scrollTop(), - scrollLeft = $window.scrollLeft(); - - $window.unbind('resize.' + prefix); - - // remove the modal so that it doesn't influence the document width/height - $box.css({top: -9e4, left: -9e4}); - - if (settings.fixed && !isIE6) { - offset.top -= scrollTop; - offset.left -= scrollLeft; - $box.css({position: 'fixed'}); - } else { - top = scrollTop; - left = scrollLeft; - $box.css({position: 'absolute'}); - } - - // keeps the top and left positions within the browser's viewport. - if (settings.right !== false) { - left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.right, 'x'), 0); - } else if (settings.left !== false) { - left += setSize(settings.left, 'x'); - } else { - left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2); - } - - if (settings.bottom !== false) { - top += Math.max($window.height() - settings.h - loadedHeight - interfaceHeight - setSize(settings.bottom, 'y'), 0); - } else if (settings.top !== false) { - top += setSize(settings.top, 'y'); - } else { - top += Math.round(Math.max($window.height() - settings.h - loadedHeight - interfaceHeight, 0) / 2); - } - - $box.css({top: offset.top, left: offset.left}); - - // setting the speed to 0 to reduce the delay between same-sized content. - speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed || 0; - - // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly, - // but it has to be shrank down around the size of div#colorbox when it's done. If not, - // it can invoke an obscure IE bug when using iframes. - $wrap[0].style.width = $wrap[0].style.height = "9999px"; - - function modalDimensions(that) { - $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = that.style.width; - $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = that.style.height; - } - - $box.dequeue().animate({width: settings.w + loadedWidth, height: settings.h + loadedHeight, top: top, left: left}, { - duration: speed, - complete: function () { - modalDimensions(this); - - active = false; - - // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation. - $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px"; - $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px"; - - if (settings.reposition) { - setTimeout(function () { // small delay before binding onresize due to an IE8 bug. - $window.bind('resize.' + prefix, publicMethod.position); - }, 1); - } - - if (loadedCallback) { - loadedCallback(); - } - }, - step: function () { - modalDimensions(this); - } - }); - }; - - publicMethod.resize = function (options) { - if (open) { - options = options || {}; - - if (options.width) { - settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth; - } - if (options.innerWidth) { - settings.w = setSize(options.innerWidth, 'x'); - } - $loaded.css({width: settings.w}); - - if (options.height) { - settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight; - } - if (options.innerHeight) { - settings.h = setSize(options.innerHeight, 'y'); - } - if (!options.innerHeight && !options.height) { - $loaded.css({height: "auto"}); - settings.h = $loaded.height(); - } - $loaded.css({height: settings.h}); - - publicMethod.position(settings.transition === "none" ? 0 : settings.speed); - } - }; - - publicMethod.prep = function (object) { - if (!open) { - return; - } - - var callback, speed = settings.transition === "none" ? 0 : settings.speed; - - $loaded.remove(); - $loaded = $tag(div, 'LoadedContent').append(object); - - function getWidth() { - settings.w = settings.w || $loaded.width(); - settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w; - return settings.w; - } - function getHeight() { - settings.h = settings.h || $loaded.height(); - settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h; - return settings.h; - } - - $loaded.hide() - .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations. - .css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'}) - .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height. - .prependTo($content); - - $loadingBay.hide(); - - // floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width. - //$(photo).css({'float': 'none', marginLeft: 'auto', marginRight: 'auto'}); - - $(photo).css({'float': 'none'}); - - // Hides SELECT elements in IE6 because they would otherwise sit on top of the overlay. - if (isIE6) { - $('select').not($box.find('select')).filter(function () { - return this.style.visibility !== 'hidden'; - }).css({'visibility': 'hidden'}).one(event_cleanup, function () { - this.style.visibility = 'inherit'; - }); - } - - callback = function () { - var preload, i, total = $related.length, iframe, frameBorder = 'frameBorder', allowTransparency = 'allowTransparency', complete, src, img; - - if (!open) { - return; - } - - function removeFilter() { - if (isIE) { - $box[0].style.removeAttribute('filter'); - } - } - - complete = function () { - clearTimeout(loadingTimer); - $loadingOverlay.hide(); - trigger(event_complete, settings.onComplete); - }; - - if (isIE) { - //This fadeIn helps the bicubic resampling to kick-in. - if (photo) { - $loaded.fadeIn(100); - } - } - - $title.html(settings.title).add($loaded).show(); - - if (total > 1) { // handle grouping - if (typeof settings.current === "string") { - $current.html(settings.current.replace('{current}', index + 1).replace('{total}', total)).show(); - } - - $next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(settings.next); - $prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous); - - if (settings.slideshow) { - $slideshow.show(); - } - - // Preloads images within a rel group - if (settings.preloading) { - preload = [ - getIndex(-1), - getIndex(1) - ]; - while (i = $related[preload.pop()]) { - src = $.data(i, colorbox).href || i.href; - if ($.isFunction(src)) { - src = src.call(i); - } - if (isImage(src)) { - img = new Image(); - img.src = src; - } - } - } - } else { - $groupControls.hide(); - } - - if (settings.iframe) { - iframe = $tag('iframe')[0]; - - if (frameBorder in iframe) { - iframe[frameBorder] = 0; - } - if (allowTransparency in iframe) { - iframe[allowTransparency] = "true"; - } - // give the iframe a unique name to prevent caching - iframe.name = prefix + (+new Date()); - if (settings.fastIframe) { - complete(); - } else { - $(iframe).one('load', complete); - } - iframe.src = settings.href; - if (!settings.scrolling) { - iframe.scrolling = "no"; - } - $(iframe).addClass(prefix + 'Iframe').appendTo($loaded).one(event_purge, function () { - iframe.src = "//about:blank"; - }); - } else { - complete(); - } - - if (settings.transition === 'fade') { - $box.fadeTo(speed, 1, removeFilter); - } else { - removeFilter(); - } - }; - - if (settings.transition === 'fade') { - $box.fadeTo(speed, 0, function () { - publicMethod.position(0, callback); - }); - } else { - publicMethod.position(speed, callback); - } - }; - - publicMethod.load = function (launched) { - var href, setResize, prep = publicMethod.prep; - - active = true; - - photo = false; - - element = $related[index]; - - if (!launched) { - makeSettings(); - } - - trigger(event_purge); - - trigger(event_load, settings.onLoad); - - settings.h = settings.height ? - setSize(settings.height, 'y') - loadedHeight - interfaceHeight : - settings.innerHeight && setSize(settings.innerHeight, 'y'); - - settings.w = settings.width ? - setSize(settings.width, 'x') - loadedWidth - interfaceWidth : - settings.innerWidth && setSize(settings.innerWidth, 'x'); - - // Sets the minimum dimensions for use in image scaling - settings.mw = settings.w; - settings.mh = settings.h; - - // Re-evaluate the minimum width and height based on maxWidth and maxHeight values. - // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead. - if (settings.maxWidth) { - settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth; - settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw; - } - if (settings.maxHeight) { - settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight; - settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh; - } - - href = settings.href; - - loadingTimer = setTimeout(function () { - $loadingOverlay.show(); - }, 100); - - if (settings.inline) { - // Inserts an empty placeholder where inline content is being pulled from. - // An event is bound to put inline content back when ColorBox closes or loads new content. - $tag(div).hide().insertBefore($(href)[0]).one(event_purge, function () { - $(this).replaceWith($loaded.children()); - }); - prep($(href)); - } else if (settings.iframe) { - // IFrame element won't be added to the DOM until it is ready to be displayed, - // to avoid problems with DOM-ready JS that might be trying to run in that iframe. - prep(" "); - } else if (settings.html) { - prep(settings.html); - } else if (isImage(href)) { - $(photo = new Image()) - .addClass(prefix + 'Photo') - .error(function () { - settings.title = false; - prep($tag(div, 'Error').text('This image could not be loaded')); - }) - .load(function () { - var percent; - photo.onload = null; //stops animated gifs from firing the onload repeatedly. - - if (settings.scalePhotos) { - setResize = function () { - photo.height -= photo.height * percent; - photo.width -= photo.width * percent; - }; - if (settings.mw && photo.width > settings.mw) { - percent = (photo.width - settings.mw) / photo.width; - setResize(); - } - if (settings.mh && photo.height > settings.mh) { - percent = (photo.height - settings.mh) / photo.height; - setResize(); - } - } - - if (settings.h) { - photo.style.marginTop = Math.max(settings.h - photo.height, 0) / 2 + 'px'; - } - - if ($related[1] && (settings.loop || $related[index + 1])) { - photo.style.cursor = 'pointer'; - photo.onclick = function () { - publicMethod.next(); - }; - } - - if (isIE) { - photo.style.msInterpolationMode = 'bicubic'; - } - - setTimeout(function () { // A pause because Chrome will sometimes report a 0 by 0 size otherwise. - prep(photo); - }, 1); - }); - - setTimeout(function () { // A pause because Opera 10.6+ will sometimes not run the onload function otherwise. - photo.src = href; - }, 1); - } else if (href) { - $loadingBay.load(href, settings.data, function (data, status, xhr) { - prep(status === 'error' ? $tag(div, 'Error').text('Request unsuccessful: ' + xhr.statusText) : $(this).contents()); - }); - } - }; - - // Navigates to the next page/image in a set. - publicMethod.next = function () { - if (!active && $related[1] && (settings.loop || $related[index + 1])) { - index = getIndex(1); - publicMethod.load(); - } - }; - - publicMethod.prev = function () { - if (!active && $related[1] && (settings.loop || index)) { - index = getIndex(-1); - publicMethod.load(); - } - }; - - // Note: to use this within an iframe use the following format: parent.$.fn.colorbox.close(); - publicMethod.close = function () { - if (open && !closing) { - - closing = true; - - open = false; - - trigger(event_cleanup, settings.onCleanup); - - $window.unbind('.' + prefix + ' .' + event_ie6); - - $overlay.fadeTo(200, 0); - - $box.stop().fadeTo(300, 0, function () { - - $box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide(); - - trigger(event_purge); - - $loaded.remove(); - - setTimeout(function () { - closing = false; - trigger(event_closed, settings.onClosed); - }, 1); - }); - } - }; - - // Removes changes ColorBox made to the document, but does not remove the plugin - // from jQuery. - publicMethod.remove = function () { - $([]).add($box).add($overlay).remove(); - $box = null; - $('.' + boxElement) - .removeData(colorbox) - .removeClass(boxElement) - .die(); - }; - - // A method for fetching the current element ColorBox is referencing. - // returns a jQuery object. - publicMethod.element = function () { - return $(element); - }; - - publicMethod.settings = defaults; - -}(jQuery, document, this)); \ No newline at end of file diff --git a/webui/view/javascript/jquery-1.4.2.min.js b/webui/view/javascript/jquery-1.4.2.min.js deleted file mode 100644 index 7c243080..00000000 --- a/webui/view/javascript/jquery-1.4.2.min.js +++ /dev/null @@ -1,154 +0,0 @@ -/*! - * jQuery JavaScript Library v1.4.2 - * http://jquery.com/ - * - * Copyright 2010, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2010, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Sat Feb 13 22:33:48 2010 -0500 - */ -(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, -Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& -(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, -a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== -"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, -function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
a"; -var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, -parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= -false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= -s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, -applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; -else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, -a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== -w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, -cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= -c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); -a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, -function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); -k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), -C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= -e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& -f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; -if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", -e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, -"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, -d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, -e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); -t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| -g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, -CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, -g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, -text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, -setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= -h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== -"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, -h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& -q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; -if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); -(function(){var g=s.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: -function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= -{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== -"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", -d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? -a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== -1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= -c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, -wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, -prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, -this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); -return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, -""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); -return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", -""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= -c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? -c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= -function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= -Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, -"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= -a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= -a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== -"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, -serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), -function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, -global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& -e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? -"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== -false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= -false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", -c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| -d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); -g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== -1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== -"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; -if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== -"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| -c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; -this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= -this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, -e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
"; -a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); -c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, -d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- -f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": -"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in -e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/webui/view/javascript/piler.js b/webui/view/javascript/piler.js index f89def00..388aa8bc 100644 --- a/webui/view/javascript/piler.js +++ b/webui/view/javascript/piler.js @@ -69,7 +69,39 @@ function load_ajax_url(url) { function load_search_results(url, params, page) { - document.getElementById('AS').innerHTML = '
spinner
'; + document.getElementById('messagelistcontainer').innerHTML = 'spinner'; + + var http = getXMLHttp(); + + if(http == null) { alert("Error creating XMLHttpRequest"); return; } + + http.open("POST", url, true); + + params = params + "&page=" + page; + + http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + http.setRequestHeader("Content-length", params.length); + http.setRequestHeader("Connection", "close"); + + + http.onreadystatechange = function() { + if(http.readyState == 4) { + if(http.status == 200) { + document.getElementById('mailcontframe').innerHTML = http.responseText; + } + else { + alert("Problem retrieving XML data:" + http.statusText); + } + } + } + + http.send(params); +} + + +function load_audit_results(url, params, page) { + + document.getElementById('AS').innerHTML = 'spinner'; var http = getXMLHttp(); @@ -88,9 +120,6 @@ function load_search_results(url, params, page) { if(http.readyState == 4) { if(http.status == 200) { document.getElementById('AS').innerHTML = http.responseText; - - $(".messagelink").colorbox({iframe:true, width:"80%", height:"80%" }); - } else { alert("Problem retrieving XML data:" + http.statusText); @@ -102,7 +131,30 @@ function load_search_results(url, params, page) { } -function send_ajax_post_request(url, params, id) { +function load_url_with_get(url, id) { + var http = getXMLHttp(); + + if(http == null) { alert("Error creating XMLHttpRequest"); return; } + + http.onreadystatechange = function() { + if(http.readyState == 4) { + if(http.status == 200){ + document.getElementById(id).innerHTML = http.responseText; + } + else alert("Problem retrieving XML data:" + http.statusText); + } + } + + http.open("GET", url, true); + http.send(null); + + document.body.style.cursor = 'default'; + + +} + + +function send_ajax_post_request(url, params) { var http = getXMLHttp(); if(http == null) { alert("Error creating XMLHttpRequest"); return; } @@ -117,7 +169,6 @@ function send_ajax_post_request(url, params, id) { http.onreadystatechange = function() { if(http.readyState == 4) { if(http.status == 200) { - document.getElementById(id).innerHTML = http.responseText; } else { alert("Problem retrieving XML data:" + http.statusText); @@ -135,26 +186,30 @@ function add_message_reference_to_form(s) { } -function assemble_search_term(n) { +function assemble_search_term(n, prefix) { var data = ''; var attachment_type = ''; var e; + var folders = ''; - e = document.getElementById('searchtype'); + e = document.getElementById(prefix + 'searchtype'); if(e && e.value) { data = data + "searchtype=" + e.value; } - e = document.getElementById('_search'); + e = document.getElementById(prefix + '_search'); if(e && e.value) { data = data + "&search=" + e.value; } - e = document.getElementById('from'); + e = document.getElementById(prefix + 'from'); if(e && e.value) { data = data + "&from=" + e.value; } - e = document.getElementById('to'); + e = document.getElementById(prefix + 'to'); if(e && e.value) { data = data + "&to=" + e.value; } - e = document.getElementById('subject'); + e = document.getElementById(prefix + 'subject'); if(e && e.value) { data = data + "&subject=" + e.value; } + e = document.getElementById(prefix + 'body'); + if(e && e.value) { data = data + "&body=" + e.value; } + for(i=0; i<=n; i++) { var a = 'key' + i; var b = 'val' + i; @@ -175,10 +230,10 @@ function assemble_search_term(n) { e = document.getElementById('date2'); if(e && e.value) { data = data + "&date2=" + e.value; } - e = document.getElementById('direction'); + e = document.getElementById(prefix + 'direction'); if(e && e.value) { data = data + "&direction=" + e.value; } - e = document.getElementById('action'); + e = document.getElementById(prefix + 'action'); if(e && e.value) { data = data + "&action=" + e.value; } for(i=0; i= 0; + this.mac = this.platform.indexOf("mac") >= 0; + this.linux = this.platform.indexOf("linux") >= 0; + this.unix = this.platform.indexOf("unix") >= 0; + this.dom = document.getElementById ? !0 : !1; + this.dom2 = document.addEventListener && document.removeEventListener; + this.ie4 = (this.ie = document.all && !window.opera) && !this.dom; + this.ie5 = this.dom && this.appver.indexOf("MSIE 5") > 0; + this.ie8 = this.dom && this.appver.indexOf("MSIE 8") > 0; + this.ie7 = this.dom && this.appver.indexOf("MSIE 7") > 0; + this.ie6 = this.dom && !this.ie8 && !this.ie7 && this.appver.indexOf("MSIE 6") > 0; + this.mz = this.dom && this.ver >= 5; + this.ns6 = (this.ns = this.ver < 5 && this.name == "Netscape" || this.ver >= 5 && this.vendor.indexOf("Netscape") >= 0) && parseInt(this.vendver) == 6; + this.ns7 = this.ns && parseInt(this.vendver) == 7; + this.chrome = this.agent_lc.indexOf("chrome") > 0; + this.safari = !this.chrome && (this.agent_lc.indexOf("safari") > 0 || this.agent_lc.indexOf("applewebkit") > 0); + this.konq = this.agent_lc.indexOf("konqueror") > 0; + this.iphone = this.safari && this.agent_lc.indexOf("iphone") > 0; + this.ipad = this.safari && this.agent_lc.indexOf("ipad") > 0; + if ((this.opera = window.opera ? !0 : !1) && window.RegExp) this.vendver = /opera(\s|\/)([0-9\.]+)/.test(this.agent_lc) ? parseFloat(RegExp.$2) : -1; + else if (this.chrome && window.RegExp) this.vendver = /chrome\/([0-9\.]+)/.test(this.agent_lc) ? parseFloat(RegExp.$1) : 0; + else if (!this.vendver && this.safari) this.vendver = /(safari|applewebkit)\/([0-9]+)/.test(this.agent_lc) ? parseInt(RegExp.$2) : 0; + else if (!this.vendver && this.mz || this.agent.indexOf("Camino") > 0) this.vendver = /rv:([0-9\.]+)/.test(this.agent) ? parseFloat(RegExp.$1) : 0; + else if (this.ie && window.RegExp) this.vendver = /msie\s+([0-9\.]+)/.test(this.agent_lc) ? parseFloat(RegExp.$1) : 0; + else if (this.konq && window.RegExp) this.vendver = /khtml\/([0-9\.]+)/.test(this.agent_lc) ? parseFloat(RegExp.$1) : 0; + if (this.safari && /;\s+([a-z]{2})-[a-z]{2}\)/.test(this.agent_lc)) this.lang = RegExp.$1; + this.dhtml = this.ie4 && this.win || this.ie5 || this.ie6 || this.ns4 || this.mz; + this.vml = this.win && this.ie && this.dom && !this.opera; + this.pngalpha = this.mz || this.opera && this.vendver >= 6 || this.ie && this.mac && this.vendver >= 5 || this.ie && this.win && this.vendver >= 5.5 || this.safari; + this.opacity = this.mz || this.ie && this.vendver >= 5.5 && !this.opera || this.safari && this.vendver >= 100; + this.cookies = a.cookieEnabled; + this.xmlhttp_test = function () { + var a = new Function("try{var o=new ActiveXObject('Microsoft.XMLHTTP');return true;}catch(err){return false;}"); + return this.xmlhttp = window.XMLHttpRequest || window.ActiveXObject && a() + }; + this.set_html_class = function () { + var a = " js"; + this.ie ? (a += " ie", this.ie5 ? a += " ie5" : this.ie6 ? a += " ie6" : this.ie7 ? a += " ie7" : this.ie8 && (a += " ie8")) : this.opera ? a += " opera" : this.konq ? a += " konqueror" : this.safari && (a += " safari"); + this.chrome ? a += " chrome" : this.iphone ? a += " iphone" : this.ipad ? a += " ipad" : this.ns6 ? a += " netscape6" : this.ns7 && (a += " netscape7"); + document.documentElement && (document.documentElement.className += a) + } +} + +function rcube_layer(a, b) { + this.name = a; + this.create = function (c) { + var b = c.x ? c.x : 0, + e = c.y ? c.y : 0, + f = c.width, + g = c.height, + i = c.zindex, + j = c.vis, + c = c.parent, + h = document.createElement("DIV"); + with(h) { + a = this.name; + with(style) position = "absolute", visibility = j ? j == 2 ? "inherit" : "visible" : "hidden", left = b + "px", top = e + "px", f && (width = f.toString().match(/\%$/) ? f : f + "px"), g && (height = g.toString().match(/\%$/) ? g : g + "px"), i && (zIndex = i) + } + c ? c.appendChild(h) : document.body.appendChild(h); + this.elm = h + }; + b != null ? (this.create(b), this.name = this.elm.id) : this.elm = document.getElementById(a); + if (!this.elm) return !1; + this.css = this.elm.style; + this.event = this.elm; + this.width = this.elm.offsetWidth; + this.height = this.elm.offsetHeight; + this.x = parseInt(this.elm.offsetLeft); + this.y = parseInt(this.elm.offsetTop); + this.visible = this.css.visibility == "visible" || this.css.visibility == "show" || this.css.visibility == "inherit" ? !0 : !1; + this.move = function (a, b) { + this.x = a; + this.y = b; + this.css.left = Math.round(this.x) + "px"; + this.css.top = Math.round(this.y) + "px" + }; + this.resize = function (a, b) { + this.css.width = a + "px"; + this.css.height = b + "px"; + this.width = a; + this.height = b + }; + this.show = function (a) { + a == 1 ? (this.css.visibility = "visible", this.visible = !0) : a == 2 ? (this.css.visibility = "inherit", this.visible = !0) : (this.css.visibility = "hidden", this.visible = !1) + }; + this.write = function (a) { + this.elm.innerHTML = a + } +} + +var rcube_event = { + get_target: function (a) { + return (a = a || window.event) && a.target ? a.target : a.srcElement + }, + get_keycode: function (a) { + return (a = a || window.event) && a.keyCode ? a.keyCode : a && a.which ? a.which : 0 + }, + get_button: function (a) { + return (a = a || window.event) && typeof a.button != "undefined" ? a.button : a && a.which ? a.which : 0 + }, + get_modifier: function (a) { + var b = 0, + a = a || window.event; + if (bw.mac && a) return b += (a.metaKey && CONTROL_KEY) + (a.shiftKey && SHIFT_KEY), b; + if (a) return b += (a.ctrlKey && CONTROL_KEY) + (a.shiftKey && SHIFT_KEY), b + }, + get_mouse_pos: function (a) { + if (!a) a = window.event; + var b = a.pageX ? a.pageX : a.clientX, + c = a.pageY ? a.pageY : a.clientY; + document.body && document.all && (b += document.body.scrollLeft, c += document.body.scrollTop); + a._offset && (b += a._offset.left, c += a._offset.top); + return { + x: b, + y: c + } + }, + add_listener: function (a) { + if (a.object && a.method) { + if (!a.element) a.element = document; + if (!a.object._rc_events) a.object._rc_events = []; + var b = a.event + "*" + a.method; + a.object._rc_events[b] || (a.object._rc_events[b] = function (c) { + return a.object[a.method](c) + }); + a.element.addEventListener ? a.element.addEventListener(a.event, + a.object._rc_events[b], !1) : a.element.attachEvent ? (a.element.detachEvent("on" + a.event, a.object._rc_events[b]), a.element.attachEvent("on" + a.event, a.object._rc_events[b])) : a.element["on" + a.event] = a.object._rc_events[b] + } + }, + remove_listener: function (a) { + if (!a.element) a.element = document; + var b = a.event + "*" + a.method; + a.object && a.object._rc_events && a.object._rc_events[b] && (a.element.removeEventListener ? a.element.removeEventListener(a.event, a.object._rc_events[b], !1) : a.element.detachEvent ? a.element.detachEvent("on" + a.event, a.object._rc_events[b]) : a.element["on" + a.event] = null) + }, + cancel: function (a) { + a = a ? a : window.event; + a.preventDefault && a.preventDefault(); + a.stopPropagation && a.stopPropagation(); + a.cancelBubble = !0; + return a.returnValue = !1 + }, + touchevent: function (a) { + return { + pageX: a.pageX, + pageY: a.pageY, + offsetX: a.pageX - a.target.offsetLeft, + offsetY: a.pageY - a.target.offsetTop, + target: a.target, + istouch: !0 + } + } +}; + +function setCookie(a, b, c, d, e, f) { + a = a + "=" + escape(b) + (c ? "; expires=" + c.toGMTString() : "") + (d ? "; path=" + d : "") + (e ? "; domain=" + e : "") + (f ? "; secure" : ""); + document.cookie = a +} + +function getCookie(a) { + var b = document.cookie; + a += "="; + var c = b.indexOf("; " + a); + if (c == -1) { + if (c = b.indexOf(a), c != 0) return null + } else c += 2; + var d = document.cookie.indexOf(";", c); + if (d == -1) d = b.length; + return unescape(b.substring(c + a.length, d)) +} + + +var bw = new roundcube_browser; + +roundcube_browser.prototype.set_cookie = setCookie; +roundcube_browser.prototype.get_cookie = getCookie; + diff --git a/webui/view/javascript/rc2.js b/webui/view/javascript/rc2.js new file mode 100644 index 00000000..9ad2f9df --- /dev/null +++ b/webui/view/javascript/rc2.js @@ -0,0 +1,87 @@ +function rcube_webmail() { + this.env = {}; + this.labels = {}; + this.buttons = {}; + this.buttons_sel = {}; + this.gui_objects = {}; + this.gui_containers = {}; + this.commands = {}; + this.command_handlers = {}; + this.onloads = []; + this.messages = {}; + this.ref = "rcmail"; + var j = this; + this.dblclick_time = 500; + this.message_time = 2E3; + this.identifier_expr = RegExp("[^0-9a-z-_]", "gi"); + this.mimetypes = "text/plain,text/html,text/xml,image/jpeg,image/gif,image/png,application/x-javascript,application/pdf,application/x-shockwave-flash".split(","); + this.env.keep_alive = 60; + this.env.request_timeout = 180; + this.env.draft_autosave = 0; + this.env.comm_path = "./"; + this.env.blankpage = "program/blank.gif"; + $.ajaxSetup({ + cache: !1, + error: function (a, b, d) { + j.http_error(a, b, d) + }, + beforeSend: function (a) { + a.setRequestHeader("X-Roundcube-Request", j.env.request_token) + } + }); + this.set_env = function (a, b) { + if (a != null && typeof a == "object" && !b) for (var d in a) this.env[d] = a[d]; + else this.env[a] = b + }; + this.add_label = function (a, b) { + this.labels[a] = b + }; + this.register_button = function (a, b, d, e, f, g) { + this.buttons[a] || (this.buttons[a] = []); + b = { + id: b, + type: d + }; + if (e) b.act = e; + if (f) b.sel = f; + if (g) b.over = g; + this.buttons[a].push(b) + }; + this.gui_object = function (a, b) { + this.gui_objects[a] = b + }; + this.gui_container = function (a, b) { + this.gui_containers[a] = b + }; + this.add_element = function (a, b) { + this.gui_containers[b] && this.gui_containers[b].jquery && this.gui_containers[b].append(a) + }; + this.register_command = function (a, b, d) { + this.command_handlers[a] = b; + d && this.enable_command(a, !0) + }; + this.add_onload = function (a) { + this.onloads.push(a) + }; + this.init = function () { + var a = this; + this.task = this.env.task; + if (!bw.dom || !bw.xmlhttp_test()) this.goto_url("error", "_code=0x199"); + else { + for (var b in this.gui_containers) this.gui_containers[b] = $("#" + this.gui_containers[b]); + for (b in this.gui_objects) this.gui_objects[b] = rcube_find_object(this.gui_objects[b]); + + this.loaded = !0; + this.pending_message && this.display_message(this.pending_message[0], this.pending_message[1]); + if (this.gui_objects.folderlist) this.gui_containers.foldertray = $(this.gui_objects.folderlist); + /*this.triggerEvent("init", { + task: this.task, + action: this.env.action + });*/ + for (var d in this.onloads) if (typeof this.onloads[d] == "string") eval(this.onloads[d]); + else if (typeof this.onloads[d] == "function") this.onloads[d](); + //this.start_keepalive() + } + }; + +} diff --git a/webui/view/javascript/splitter.js b/webui/view/javascript/splitter.js new file mode 100644 index 00000000..e11f9fea --- /dev/null +++ b/webui/view/javascript/splitter.js @@ -0,0 +1,199 @@ + +/** + * Roundcube splitter GUI class + * + * @constructor + */ +function rcube_splitter(attrib) +{ + this.p1id = attrib.p1; + this.p2id = attrib.p2; + this.id = attrib.id ? attrib.id : this.p1id + '_' + this.p2id + '_splitter'; + this.orientation = attrib.orientation; + this.horizontal = (this.orientation == 'horizontal' || this.orientation == 'h'); + this.offset = bw.ie6 ? 2 : 0; + this.pos = attrib.start ? attrib.start * 1 : 0; + this.relative = attrib.relative ? true : false; + this.drag_active = false; + + this.init = function() + { + this.p1 = document.getElementById(this.p1id); + this.p2 = document.getElementById(this.p2id); + + // create and position the handle for this splitter + this.p1pos = this.relative ? $(this.p1).position() : $(this.p1).offset(); + this.p2pos = this.relative ? $(this.p2).position() : $(this.p2).offset(); + + if (this.horizontal) { + var top = this.p1pos.top + this.p1.offsetHeight; + this.layer = new rcube_layer(this.id, {x: 0, y: top, height: 10, + width: '100%', vis: 1, parent: this.p1.parentNode}); + } + else { + var left = this.p1pos.left + this.p1.offsetWidth; + this.layer = new rcube_layer(this.id, {x: left, y: 0, width: 10, + height: '100%', vis: 1, parent: this.p1.parentNode}); + } + + this.elm = this.layer.elm; + this.elm.className = 'splitter '+(this.horizontal ? 'splitter-h' : 'splitter-v'); + this.elm.unselectable = 'on'; + + // add the mouse event listeners + rcube_event.add_listener({element: this.elm, event:'mousedown', object:this, method:'onDragStart'}); + if (bw.ie) + rcube_event.add_listener({element: window, event:'resize', object:this, method:'onResize'}); + + // read saved position from cookie + var cookie = bw.get_cookie(this.id); + if (cookie && !isNaN(cookie)) { + this.pos = parseFloat(cookie); + this.resize(); + } + else if (this.pos) { + this.resize(); + this.set_cookie(); + } + }; + + /** + * Set size and position of all DOM objects + * according to the saved splitter position + */ + this.resize = function() + { + if (this.horizontal) { + var lh = this.layer.height - this.offset * 2; + this.p1.style.height = Math.floor(this.pos - this.p1pos.top - lh / 2) + 'px'; + this.p2.style.top = Math.ceil(this.pos + lh / 2) + 'px'; + this.layer.move(this.layer.x, Math.round(this.pos - lh / 2 + 1)); + if (bw.ie) { + var new_height = parseInt(this.p2.parentNode.offsetHeight, 10) - parseInt(this.p2.style.top, 10) - (bw.ie8 ? 2 : 0); + this.p2.style.height = (new_height > 0 ? new_height : 0) + 'px'; + } + } + else { + this.p1.style.width = Math.floor(this.pos - this.p1pos.left - this.layer.width / 2) + 'px'; + this.p2.style.left = Math.ceil(this.pos + this.layer.width / 2) + 'px'; + this.layer.move(Math.round(this.pos - this.layer.width / 2 + 1), this.layer.y); + if (bw.ie) { + var new_width = parseInt(this.p2.parentNode.offsetWidth, 10) - parseInt(this.p2.style.left, 10) ; + this.p2.style.width = (new_width > 0 ? new_width : 0) + 'px'; + } + } + $(this.p2).resize(); + $(this.p1).resize(); + }; + + /** + * Handler for mousedown events + */ + this.onDragStart = function(e) + { + // disable text selection while dragging the splitter + if (bw.konq || bw.chrome || bw.safari) + document.body.style.webkitUserSelect = 'none'; + + this.p1pos = this.relative ? $(this.p1).position() : $(this.p1).offset(); + this.p2pos = this.relative ? $(this.p2).position() : $(this.p2).offset(); + this.drag_active = true; + + // start listening to mousemove events + rcube_event.add_listener({element:document, event:'mousemove', object:this, method:'onDrag'}); + rcube_event.add_listener({element:document, event:'mouseup', object:this, method:'onDragStop'}); + + // enable dragging above iframes + $('iframe').each(function() { + $('
') + .css({background: '#fff', + width: this.offsetWidth+'px', height: this.offsetHeight+'px', + position: 'absolute', opacity: '0.001', zIndex: 1000 + }) + .css($(this).offset()) + .appendTo('body'); + }); + }; + + /** + * Handler for mousemove events + */ + this.onDrag = function(e) + { + if (!this.drag_active) + return false; + + var pos = rcube_event.get_mouse_pos(e); + + if (this.relative) { + var parent = $(this.p1.parentNode).offset(); + pos.x -= parent.left; + pos.y -= parent.top; + } + + if (this.horizontal) { + if (((pos.y - this.layer.height * 1.5) > this.p1pos.top) && ((pos.y + this.layer.height * 1.5) < (this.p2pos.top + this.p2.offsetHeight))) { + this.pos = pos.y; + this.resize(); + } + } + else { + if (((pos.x - this.layer.width * 1.5) > this.p1pos.left) && ((pos.x + this.layer.width * 1.5) < (this.p2pos.left + this.p2.offsetWidth))) { + this.pos = pos.x; + this.resize(); + } + } + + this.p1pos = this.relative ? $(this.p1).position() : $(this.p1).offset(); + this.p2pos = this.relative ? $(this.p2).position() : $(this.p2).offset(); + return false; + }; + + /** + * Handler for mouseup events + */ + this.onDragStop = function(e) + { + // resume the ability to highlight text + if (bw.konq || bw.chrome || bw.safari) + document.body.style.webkitUserSelect = 'auto'; + + // cancel the listening for drag events + rcube_event.remove_listener({element:document, event:'mousemove', object:this, method:'onDrag'}); + rcube_event.remove_listener({element:document, event:'mouseup', object:this, method:'onDragStop'}); + this.drag_active = false; + + // remove temp divs + $('div.iframe-splitter-fix').each(function() { this.parentNode.removeChild(this); }); + + this.set_cookie(); + + return bw.safari ? true : rcube_event.cancel(e); + }; + + /** + * Handler for window resize events + */ + this.onResize = function(e) + { + if (this.horizontal) { + var new_height = parseInt(this.p2.parentNode.offsetHeight, 10) - parseInt(this.p2.style.top, 10) - (bw.ie8 ? 2 : 0); + this.p2.style.height = (new_height > 0 ? new_height : 0) +'px'; + } + else { + var new_width = parseInt(this.p2.parentNode.offsetWidth, 10) - parseInt(this.p2.style.left, 10); + this.p2.style.width = (new_width > 0 ? new_width : 0) + 'px'; + } + }; + + /** + * Saves splitter position in cookie + */ + this.set_cookie = function() + { + var exp = new Date(); + exp.setYear(exp.getFullYear() + 1); + bw.set_cookie(this.id, this.pos, exp); + }; + +} // end class rcube_splitter diff --git a/webui/view/javascript/tip_balloon.js b/webui/view/javascript/tip_balloon.js deleted file mode 100644 index b2cb069e..00000000 --- a/webui/view/javascript/tip_balloon.js +++ /dev/null @@ -1,221 +0,0 @@ -/* -tip_balloon.js v. 1.81 - -The latest version is available at -http://www.walterzorn.com -or http://www.devira.com -or http://www.walterzorn.de - -Initial author: Walter Zorn -Last modified: 2.2.2009 - -Extension for the tooltip library wz_tooltip.js. -Implements balloon tooltips. -*/ - -// Make sure that the core file wz_tooltip.js is included first -if(typeof config == "undefined") - alert("Error:\nThe core tooltip script file 'wz_tooltip.js' must be included first, before the plugin files!"); - -// Here we define new global configuration variable(s) (as members of the -// predefined "config." class). -// From each of these config variables, wz_tooltip.js will automatically derive -// a command which can be passed to Tip() or TagToTip() in order to customize -// tooltips individually. These command names are just the config variable -// name(s) translated to uppercase, -// e.g. from config. Balloon a command BALLOON will automatically be -// created. - -//=================== GLOBAL TOOLTIP CONFIGURATION =========================// -config. Balloon = false // true or false - set to true if you want this to be the default behaviour -config. BalloonImgPath = "view/javascript/tip_balloon/" // Path to images (border, corners, stem), in quotes. Path must be relative to your HTML file. -// Sizes of balloon images -config. BalloonEdgeSize = 6 // Integer - sidelength of quadratic corner images -config. BalloonStemWidth = 15 // Integer -config. BalloonStemHeight = 19 // Integer -config. BalloonStemOffset = -7 // Integer - horizontal offset of left stem edge from mouse (recommended: -stemwidth/2 to center the stem above the mouse) -config. BalloonImgExt = "gif";// File name extension of default balloon images, e.g. "gif" or "png" -//======= END OF TOOLTIP CONFIG, DO NOT CHANGE ANYTHING BELOW ==============// - - -// Create a new tt_Extension object (make sure that the name of that object, -// here balloon, is unique amongst the extensions available for wz_tooltips.js): -var balloon = new tt_Extension(); - -// Implement extension eventhandlers on which our extension should react - -balloon.OnLoadConfig = function() -{ - if(tt_aV[BALLOON]) - { - // Turn off native style properties which are not appropriate - balloon.padding = Math.max(tt_aV[PADDING] - tt_aV[BALLOONEDGESIZE], 0); - balloon.width = tt_aV[WIDTH]; - //if(tt_bBoxOld) - // balloon.width += (balloon.padding << 1); - tt_aV[BORDERWIDTH] = 0; - tt_aV[WIDTH] = 0; - tt_aV[PADDING] = 0; - tt_aV[BGCOLOR] = ""; - tt_aV[BGIMG] = ""; - tt_aV[SHADOW] = false; - // Append slash to img path if missing - if(tt_aV[BALLOONIMGPATH].charAt(tt_aV[BALLOONIMGPATH].length - 1) != '/') - tt_aV[BALLOONIMGPATH] += "/"; - return true; - } - return false; -}; -balloon.OnCreateContentString = function() -{ - if(!tt_aV[BALLOON]) - return false; - - var aImg, sImgZ, sCssCrn, sVaT, sVaB, sCss0; - - // Cache balloon images in advance: - // Either use the pre-cached default images... - if(tt_aV[BALLOONIMGPATH] == config.BalloonImgPath) - aImg = balloon.aDefImg; - // ...or load images from different directory - else - aImg = Balloon_CacheImgs(tt_aV[BALLOONIMGPATH], tt_aV[BALLOONIMGEXT]); - sCss0 = 'padding:0;margin:0;border:0;line-height:0;overflow:hidden;'; - sCssCrn = ' style="position:relative;width:' + tt_aV[BALLOONEDGESIZE] + 'px;' + sCss0 + 'overflow:hidden;'; - sVaT = 'vertical-align:top;" valign="top"'; - sVaB = 'vertical-align:bottom;" valign="bottom"'; - sImgZ = '" style="' + sCss0 + '" />'; - - tt_sContent = '' - // Left-top corner - + '' - + '' - + '' - + '
' - + '
' - + '' - // Right-top corner - + '' - + '' - // Redundant image for bugous old Geckos which won't auto-expand TD height to 100% - + '' + tt_sContent + '' - // Right border - + '
' - // Right-bottom corner - + '' - + ' -balloon.width + iAdd) - bdy.style.width = (-balloon.width + iAdd) + "px"; - } -} -// This mechanism pre-caches the default images specified by -// congif.BalloonImgPath, so, whenever a balloon tip using these default images -// is created, no further server connection is necessary. -function Balloon_PreCacheDefImgs() -{ - // Append slash to img path if missing - if(config.BalloonImgPath.charAt(config.BalloonImgPath.length - 1) != '/') - config.BalloonImgPath += "/"; - // Preload default images into array - balloon.aDefImg = Balloon_CacheImgs(config.BalloonImgPath, config.BalloonImgExt); -} -Balloon_PreCacheDefImgs(); diff --git a/webui/view/javascript/tip_balloon/b.gif b/webui/view/javascript/tip_balloon/b.gif deleted file mode 100644 index ff0c04b25026303e67ec8673797925a00dcea3e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46 rcmZ?wbhEHbWMp7tn8*ME|9_tW(+oNw3M9_J!OpEDVe+EDY8Fs-Fdb diff --git a/webui/view/javascript/tip_balloon/l.gif b/webui/view/javascript/tip_balloon/l.gif deleted file mode 100644 index 14a68d93d294649fc6b2f8c5d87d302c1b3be1a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46 rcmZ?wbhEHbWMg1tn8*ME|9_tW(+oNw3M9_J!Opfia{Qv)-0R|L*vT!mmurTO=1VCyTIHVYu fIV2nk7#JB?d6^_UCLC~Vfia{Qv)-0R|L*vT!mmurTO=1VCyTIHVak gIYcB96c`woSd?T88V)$M@ktu-C^$T7Xkf4g0MkMg7XSbN diff --git a/webui/view/javascript/tip_balloon/r.gif b/webui/view/javascript/tip_balloon/r.gif deleted file mode 100644 index be041ff92be8fe421efe9e77f672d9ca35505e52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46 rcmZ?wbhEHbWMg1tn8*ME|9_tW(+oNw3M9_J!Opfia{Qv)-0R|L*vT!mmurTO=1VCyTIHVca gIb;+R4jf=);NTIN5TM}9#3G^ABEhieXaj>a0O0HtRR910 diff --git a/webui/view/javascript/tip_balloon/rt.gif b/webui/view/javascript/tip_balloon/rt.gif deleted file mode 100644 index 2752a0ccb5da339688777e9a888eda583e2662e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85 zcmZ?wbhEHbWMg1sSj4~(6XjW3mArG?l>fia{Qv)-0R|L*vT!mmurTO=1VCyTIHVYu d1tcs2fP5Bq9s`SjhfXbg><%Rw3Jwko)&RUN67T>3 diff --git a/webui/view/javascript/tip_balloon/stemb.gif b/webui/view/javascript/tip_balloon/stemb.gif deleted file mode 100644 index 92f2ad5153515817faffc2709325ca16a1bbd130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmZ?wbhEHb;YutRe;u8x}Y+v$AkV6l{3Nz{t)dkP$J#p@Es5jb(v{!2yOIb_SlD2nL1|%-ouG zHY+DCIzCy^T}+2lSk<{%J8_%Ik4?)?%v8(1r88smGe2hA)_+ShMUqb~a*9^V)iTNm PULG(z>ko&q0)sUG4*@pV diff --git a/webui/view/javascript/tip_balloon/stemt.gif b/webui/view/javascript/tip_balloon/stemt.gif deleted file mode 100644 index d259a4aec530a01e55e9ae13489d71b5673bc832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmZ?wbhEHb-NO{2VeC3I`e*IfS_+6ciR7W@g}GsOZ?RfU#MGRnO#rf$|Y1HkGt384n&EY?t;f ztC854a-x&ZbJvj-1r6R)d4;#_(cF~OFx%KaYYXR;WWPr1#&0$Xn>EfduypNG5qRL> RwbFvM;Yie`hK2?PYXGl-JXQbz diff --git a/webui/view/javascript/tip_balloon/t.gif b/webui/view/javascript/tip_balloon/t.gif deleted file mode 100644 index 6fec86f81a20ed7a511b40c85d3fa2a918ed7d0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46 rcmZ?wbhEHbWMp7tn8*ME|9_tW(+oNw3M9_J!Op section, and invoke -Tip('Tooltip text') to show and UnTip() to hide the tooltip, from the desired -HTML eventhandlers. Example: -My home page -No container DIV required. -By default, width and height of tooltips are automatically adapted to content. -Is even capable of dynamically converting arbitrary HTML elements to tooltips -by calling TagToTip('ID_of_HTML_element_to_be_converted') instead of Tip(), -which means you can put important, search-engine-relevant stuff into tooltips. -Appearance & behaviour of tooltips can be individually configured -via commands passed to Tip() or TagToTip(). - -Tab Width: 4 -LICENSE: LGPL - -This library 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; either -version 2.1 of the License, or (at your option) any later version. - -This library 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. - -For more details on the GNU Lesser General Public License, -see http://www.gnu.org/copyleft/lesser.html -*/ - -var config = new Object(); - - -//=================== GLOBAL TOOLTIP CONFIGURATION =========================// -var tt_Debug = true // false or true - recommended: false once you release your page to the public -var tt_Enabled = true // Allows to (temporarily) suppress tooltips, e.g. by providing the user with a button that sets this global variable to false -var TagsToTip = true // false or true - if true, HTML elements to be converted to tooltips via TagToTip() are automatically hidden; - // if false, you should hide those HTML elements yourself - -// For each of the following config variables there exists a command, which is -// just the variablename in uppercase, to be passed to Tip() or TagToTip() to -// configure tooltips individually. Individual commands override global -// configuration. Order of commands is arbitrary. -// Example: onmouseover="Tip('Tooltip text', LEFT, true, BGCOLOR, '#FF9900', FADEIN, 400)" - -config. Above = false // false or true - tooltip above mousepointer -config. BgColor = '#E2E7FF' // Background colour (HTML colour value, in quotes) -config. BgImg = '' // Path to background image, none if empty string '' -config. BorderColor = '#003099' -config. BorderStyle = 'solid' // Any permitted CSS value, but I recommend 'solid', 'dotted' or 'dashed' -config. BorderWidth = 1 -config. CenterMouse = false // false or true - center the tip horizontally below (or above) the mousepointer -config. ClickClose = false // false or true - close tooltip if the user clicks somewhere -config. ClickSticky = false // false or true - make tooltip sticky if user left-clicks on the hovered element while the tooltip is active -config. CloseBtn = false // false or true - closebutton in titlebar -config. CloseBtnColors = ['#990000', '#FFFFFF', '#DD3333', '#FFFFFF'] // [Background, text, hovered background, hovered text] - use empty strings '' to inherit title colours -config. CloseBtnText = ' X ' // Close button text (may also be an image tag) -config. CopyContent = true // When converting a HTML element to a tooltip, copy only the element's content, rather than converting the element by its own -config. Delay = 400 // Time span in ms until tooltip shows up -config. Duration = 0 // Time span in ms after which the tooltip disappears; 0 for infinite duration, < 0 for delay in ms _after_ the onmouseout until the tooltip disappears -config. Exclusive = false // false or true - no other tooltip can appear until the current one has actively been closed -config. FadeIn = 100 // Fade-in duration in ms, e.g. 400; 0 for no animation -config. FadeOut = 100 -config. FadeInterval = 30 // Duration of each fade step in ms (recommended: 30) - shorter is smoother but causes more CPU-load -config. Fix = null // Fixated position, two modes. Mode 1: x- an y-coordinates in brackets, e.g. [210, 480]. Mode 2: Show tooltip at a position related to an HTML element: [ID of HTML element, x-offset, y-offset from HTML element], e.g. ['SomeID', 10, 30]. Value null (default) for no fixated positioning. -config. FollowMouse = true // false or true - tooltip follows the mouse -config. FontColor = '#000044' -config. FontFace = 'Verdana,Geneva,sans-serif' -config. FontSize = '8pt' // E.g. '9pt' or '12px' - unit is mandatory -config. FontWeight = 'normal' // 'normal' or 'bold'; -config. Height = 0 // Tooltip height; 0 for automatic adaption to tooltip content, < 0 (e.g. -100) for a maximum for automatic adaption -config. JumpHorz = false // false or true - jump horizontally to other side of mouse if tooltip would extend past clientarea boundary -config. JumpVert = true // false or true - jump vertically " -config. Left = false // false or true - tooltip on the left of the mouse -config. OffsetX = 14 // Horizontal offset of left-top corner from mousepointer -config. OffsetY = 8 // Vertical offset -config. Opacity = 100 // Integer between 0 and 100 - opacity of tooltip in percent -config. Padding = 3 // Spacing between border and content -config. Shadow = false // false or true -config. ShadowColor = '#C0C0C0' -config. ShadowWidth = 5 -config. Sticky = false // false or true - fixate tip, ie. don't follow the mouse and don't hide on mouseout -config. TextAlign = 'left' // 'left', 'right' or 'justify' -config. Title = '' // Default title text applied to all tips (no default title: empty string '') -config. TitleAlign = 'left' // 'left' or 'right' - text alignment inside the title bar -config. TitleBgColor = '' // If empty string '', BorderColor will be used -config. TitleFontColor = '#FFFFFF' // Color of title text - if '', BgColor (of tooltip body) will be used -config. TitleFontFace = '' // If '' use FontFace (boldified) -config. TitleFontSize = '' // If '' use FontSize -config. TitlePadding = 2 -config. Width = 0 // Tooltip width; 0 for automatic adaption to tooltip content; < -1 (e.g. -240) for a maximum width for that automatic adaption; - // -1: tooltip width confined to the width required for the titlebar -//======= END OF TOOLTIP CONFIG, DO NOT CHANGE ANYTHING BELOW ==============// - - - - -//===================== PUBLIC =============================================// -function Tip() -{ - tt_Tip(arguments, null); -} -function TagToTip() -{ - var t2t = tt_GetElt(arguments[0]); - if(t2t) - tt_Tip(arguments, t2t); -} -function UnTip() -{ - tt_OpReHref(); - if(tt_aV[DURATION] < 0 && (tt_iState & 0x2)) - tt_tDurt.Timer("tt_HideInit()", -tt_aV[DURATION], true); - else if(!(tt_aV[STICKY] && (tt_iState & 0x2))) - tt_HideInit(); -} - -//================== PUBLIC PLUGIN API =====================================// -// Extension eventhandlers currently supported: -// OnLoadConfig, OnCreateContentString, OnSubDivsCreated, OnShow, OnMoveBefore, -// OnMoveAfter, OnHideInit, OnHide, OnKill - -var tt_aElt = new Array(10), // Container DIV, outer title & body DIVs, inner title & body TDs, closebutton SPAN, shadow DIVs, and IFRAME to cover windowed elements in IE -tt_aV = new Array(), // Caches and enumerates config data for currently active tooltip -tt_sContent, // Inner tooltip text or HTML -tt_t2t, tt_t2tDad, // Tag converted to tip, and its DOM parent element -tt_musX, tt_musY, -tt_over, -tt_x, tt_y, tt_w, tt_h; // Position, width and height of currently displayed tooltip - -function tt_Extension() -{ - tt_ExtCmdEnum(); - tt_aExt[tt_aExt.length] = this; - return this; -} -function tt_SetTipPos(x, y) -{ - var css = tt_aElt[0].style; - - tt_x = x; - tt_y = y; - css.left = x + "px"; - css.top = y + "px"; - if(tt_ie56) - { - var ifrm = tt_aElt[tt_aElt.length - 1]; - if(ifrm) - { - ifrm.style.left = css.left; - ifrm.style.top = css.top; - } - } -} -function tt_HideInit() -{ - if(tt_iState) - { - tt_ExtCallFncs(0, "HideInit"); - tt_iState &= ~(0x4 | 0x8); - if(tt_flagOpa && tt_aV[FADEOUT]) - { - tt_tFade.EndTimer(); - if(tt_opa) - { - var n = Math.round(tt_aV[FADEOUT] / (tt_aV[FADEINTERVAL] * (tt_aV[OPACITY] / tt_opa))); - tt_Fade(tt_opa, tt_opa, 0, n); - return; - } - } - tt_tHide.Timer("tt_Hide();", 1, false); - } -} -function tt_Hide() -{ - if(tt_db && tt_iState) - { - tt_OpReHref(); - if(tt_iState & 0x2) - { - tt_aElt[0].style.visibility = "hidden"; - tt_ExtCallFncs(0, "Hide"); - } - tt_tShow.EndTimer(); - tt_tHide.EndTimer(); - tt_tDurt.EndTimer(); - tt_tFade.EndTimer(); - if(!tt_op && !tt_ie) - { - tt_tWaitMov.EndTimer(); - tt_bWait = false; - } - if(tt_aV[CLICKCLOSE] || tt_aV[CLICKSTICKY]) - tt_RemEvtFnc(document, "mouseup", tt_OnLClick); - tt_ExtCallFncs(0, "Kill"); - // In case of a TagToTip tip, hide converted DOM node and - // re-insert it into DOM - if(tt_t2t && !tt_aV[COPYCONTENT]) - tt_UnEl2Tip(); - tt_iState = 0; - tt_over = null; - tt_ResetMainDiv(); - if(tt_aElt[tt_aElt.length - 1]) - tt_aElt[tt_aElt.length - 1].style.display = "none"; - } -} -function tt_GetElt(id) -{ - return(document.getElementById ? document.getElementById(id) - : document.all ? document.all[id] - : null); -} -function tt_GetDivW(el) -{ - return(el ? (el.offsetWidth || el.style.pixelWidth || 0) : 0); -} -function tt_GetDivH(el) -{ - return(el ? (el.offsetHeight || el.style.pixelHeight || 0) : 0); -} -function tt_GetScrollX() -{ - return(window.pageXOffset || (tt_db ? (tt_db.scrollLeft || 0) : 0)); -} -function tt_GetScrollY() -{ - return(window.pageYOffset || (tt_db ? (tt_db.scrollTop || 0) : 0)); -} -function tt_GetClientW() -{ - return tt_GetWndCliSiz("Width"); -} -function tt_GetClientH() -{ - return tt_GetWndCliSiz("Height"); -} -function tt_GetEvtX(e) -{ - return (e ? ((typeof(e.pageX) != tt_u) ? e.pageX : (e.clientX + tt_GetScrollX())) : 0); -} -function tt_GetEvtY(e) -{ - return (e ? ((typeof(e.pageY) != tt_u) ? e.pageY : (e.clientY + tt_GetScrollY())) : 0); -} -function tt_AddEvtFnc(el, sEvt, PFnc) -{ - if(el) - { - if(el.addEventListener) - el.addEventListener(sEvt, PFnc, false); - else - el.attachEvent("on" + sEvt, PFnc); - } -} -function tt_RemEvtFnc(el, sEvt, PFnc) -{ - if(el) - { - if(el.removeEventListener) - el.removeEventListener(sEvt, PFnc, false); - else - el.detachEvent("on" + sEvt, PFnc); - } -} -function tt_GetDad(el) -{ - return(el.parentNode || el.parentElement || el.offsetParent); -} -function tt_MovDomNode(el, dadFrom, dadTo) -{ - if(dadFrom) - dadFrom.removeChild(el); - if(dadTo) - dadTo.appendChild(el); -} - -//====================== PRIVATE ===========================================// -var tt_aExt = new Array(), // Array of extension objects - -tt_db, tt_op, tt_ie, tt_ie56, tt_bBoxOld, // Browser flags -tt_body, -tt_ovr_, // HTML element the mouse is currently over -tt_flagOpa, // Opacity support: 1=IE, 2=Khtml, 3=KHTML, 4=Moz, 5=W3C -tt_maxPosX, tt_maxPosY, -tt_iState = 0, // Tooltip active |= 1, shown |= 2, move with mouse |= 4, exclusive |= 8 -tt_opa, // Currently applied opacity -tt_bJmpVert, tt_bJmpHorz,// Tip temporarily on other side of mouse -tt_elDeHref, // The tag from which we've removed the href attribute -// Timer -tt_tShow = new Number(0), tt_tHide = new Number(0), tt_tDurt = new Number(0), -tt_tFade = new Number(0), tt_tWaitMov = new Number(0), -tt_bWait = false, -tt_u = "undefined"; - - -function tt_Init() -{ - tt_MkCmdEnum(); - // Send old browsers instantly to hell - if(!tt_Browser() || !tt_MkMainDiv()) - return; - tt_IsW3cBox(); - tt_OpaSupport(); - tt_AddEvtFnc(document, "mousemove", tt_Move); - // In Debug mode we search for TagToTip() calls in order to notify - // the user if they've forgotten to set the TagsToTip config flag - if(TagsToTip || tt_Debug) - tt_SetOnloadFnc(); - // Ensure the tip be hidden when the page unloads - tt_AddEvtFnc(window, "unload", tt_Hide); -} -// Creates command names by translating config variable names to upper case -function tt_MkCmdEnum() -{ - var n = 0; - for(var i in config) - eval("window." + i.toString().toUpperCase() + " = " + n++); - tt_aV.length = n; -} -function tt_Browser() -{ - var n, nv, n6, w3c; - - n = navigator.userAgent.toLowerCase(), - nv = navigator.appVersion; - tt_op = (document.defaultView && typeof(eval("w" + "indow" + "." + "o" + "p" + "er" + "a")) != tt_u); - tt_ie = n.indexOf("msie") != -1 && document.all && !tt_op; - if(tt_ie) - { - var ieOld = (!document.compatMode || document.compatMode == "BackCompat"); - tt_db = !ieOld ? document.documentElement : (document.body || null); - if(tt_db) - tt_ie56 = parseFloat(nv.substring(nv.indexOf("MSIE") + 5)) >= 5.5 - && typeof document.body.style.maxHeight == tt_u; - } - else - { - tt_db = document.documentElement || document.body || - (document.getElementsByTagName ? document.getElementsByTagName("body")[0] - : null); - if(!tt_op) - { - n6 = document.defaultView && typeof document.defaultView.getComputedStyle != tt_u; - w3c = !n6 && document.getElementById; - } - } - tt_body = (document.getElementsByTagName ? document.getElementsByTagName("body")[0] - : (document.body || null)); - if(tt_ie || n6 || tt_op || w3c) - { - if(tt_body && tt_db) - { - if(document.attachEvent || document.addEventListener) - return true; - } - else - tt_Err("wz_tooltip.js must be included INSIDE the body section," - + " immediately after the opening tag.", false); - } - tt_db = null; - return false; -} -function tt_MkMainDiv() -{ - // Create the tooltip DIV - if(tt_body.insertAdjacentHTML) - tt_body.insertAdjacentHTML("afterBegin", tt_MkMainDivHtm()); - else if(typeof tt_body.innerHTML != tt_u && document.createElement && tt_body.appendChild) - tt_body.appendChild(tt_MkMainDivDom()); - if(window.tt_GetMainDivRefs /* FireFox Alzheimer */ && tt_GetMainDivRefs()) - return true; - tt_db = null; - return false; -} -function tt_MkMainDivHtm() -{ - return( - '
' + - (tt_ie56 ? ('') - : '') - ); -} -function tt_MkMainDivDom() -{ - var el = document.createElement("div"); - if(el) - el.id = "WzTtDiV"; - return el; -} -function tt_GetMainDivRefs() -{ - tt_aElt[0] = tt_GetElt("WzTtDiV"); - if(tt_ie56 && tt_aElt[0]) - { - tt_aElt[tt_aElt.length - 1] = tt_GetElt("WzTtIfRm"); - if(!tt_aElt[tt_aElt.length - 1]) - tt_aElt[0] = null; - } - if(tt_aElt[0]) - { - var css = tt_aElt[0].style; - - css.visibility = "hidden"; - css.position = "absolute"; - css.overflow = "hidden"; - return true; - } - return false; -} -function tt_ResetMainDiv() -{ - tt_SetTipPos(0, 0); - tt_aElt[0].innerHTML = ""; - tt_aElt[0].style.width = "0px"; - tt_h = 0; -} -function tt_IsW3cBox() -{ - var css = tt_aElt[0].style; - - css.padding = "10px"; - css.width = "40px"; - tt_bBoxOld = (tt_GetDivW(tt_aElt[0]) == 40); - css.padding = "0px"; - tt_ResetMainDiv(); -} -function tt_OpaSupport() -{ - var css = tt_body.style; - - tt_flagOpa = (typeof(css.KhtmlOpacity) != tt_u) ? 2 - : (typeof(css.KHTMLOpacity) != tt_u) ? 3 - : (typeof(css.MozOpacity) != tt_u) ? 4 - : (typeof(css.opacity) != tt_u) ? 5 - : (typeof(css.filter) != tt_u) ? 1 - : 0; -} -// Ported from http://dean.edwards.name/weblog/2006/06/again/ -// (Dean Edwards et al.) -function tt_SetOnloadFnc() -{ - tt_AddEvtFnc(document, "DOMContentLoaded", tt_HideSrcTags); - tt_AddEvtFnc(window, "load", tt_HideSrcTags); - if(tt_body.attachEvent) - tt_body.attachEvent("onreadystatechange", - function() { - if(tt_body.readyState == "complete") - tt_HideSrcTags(); - } ); - if(/WebKit|KHTML/i.test(navigator.userAgent)) - { - var t = setInterval(function() { - if(/loaded|complete/.test(document.readyState)) - { - clearInterval(t); - tt_HideSrcTags(); - } - }, 10); - } -} -function tt_HideSrcTags() -{ - if(!window.tt_HideSrcTags || window.tt_HideSrcTags.done) - return; - window.tt_HideSrcTags.done = true; - if(!tt_HideSrcTagsRecurs(tt_body)) - tt_Err("There are HTML elements to be converted to tooltips.\nIf you" - + " want these HTML elements to be automatically hidden, you" - + " must edit wz_tooltip.js, and set TagsToTip in the global" - + " tooltip configuration to true.", true); -} -function tt_HideSrcTagsRecurs(dad) -{ - var ovr, asT2t; - // Walk the DOM tree for tags that have an onmouseover or onclick attribute - // containing a TagToTip('...') call. - // (.childNodes first since .children is bugous in Safari) - var a = dad.childNodes || dad.children || null; - - for(var i = a ? a.length : 0; i;) - {--i; - if(!tt_HideSrcTagsRecurs(a[i])) - return false; - ovr = a[i].getAttribute ? (a[i].getAttribute("onmouseover") || a[i].getAttribute("onclick")) - : (typeof a[i].onmouseover == "function") ? (a[i].onmouseover || a[i].onclick) - : null; - if(ovr) - { - asT2t = ovr.toString().match(/TagToTip\s*\(\s*'[^'.]+'\s*[\),]/); - if(asT2t && asT2t.length) - { - if(!tt_HideSrcTag(asT2t[0])) - return false; - } - } - } - return true; -} -function tt_HideSrcTag(sT2t) -{ - var id, el; - - // The ID passed to the found TagToTip() call identifies an HTML element - // to be converted to a tooltip, so hide that element - id = sT2t.replace(/.+'([^'.]+)'.+/, "$1"); - el = tt_GetElt(id); - if(el) - { - if(tt_Debug && !TagsToTip) - return false; - else - el.style.display = "none"; - } - else - tt_Err("Invalid ID\n'" + id + "'\npassed to TagToTip()." - + " There exists no HTML element with that ID.", true); - return true; -} -function tt_Tip(arg, t2t) -{ - if(!tt_db || (tt_iState & 0x8)) - return; - if(tt_iState) - tt_Hide(); - if(!tt_Enabled) - return; - tt_t2t = t2t; - if(!tt_ReadCmds(arg)) - return; - tt_iState = 0x1 | 0x4; - tt_AdaptConfig1(); - tt_MkTipContent(arg); - tt_MkTipSubDivs(); - tt_FormatTip(); - tt_bJmpVert = false; - tt_bJmpHorz = false; - tt_maxPosX = tt_GetClientW() + tt_GetScrollX() - tt_w - 1; - tt_maxPosY = tt_GetClientH() + tt_GetScrollY() - tt_h - 1; - tt_AdaptConfig2(); - // Ensure the tip be shown and positioned before the first onmousemove - tt_OverInit(); - tt_ShowInit(); - tt_Move(); -} -function tt_ReadCmds(a) -{ - var i; - - // First load the global config values, to initialize also values - // for which no command is passed - i = 0; - for(var j in config) - tt_aV[i++] = config[j]; - // Then replace each cached config value for which a command is - // passed (ensure the # of command args plus value args be even) - if(a.length & 1) - { - for(i = a.length - 1; i > 0; i -= 2) - tt_aV[a[i - 1]] = a[i]; - return true; - } - tt_Err("Incorrect call of Tip() or TagToTip().\n" - + "Each command must be followed by a value.", true); - return false; -} -function tt_AdaptConfig1() -{ - tt_ExtCallFncs(0, "LoadConfig"); - // Inherit unspecified title formattings from body - if(!tt_aV[TITLEBGCOLOR].length) - tt_aV[TITLEBGCOLOR] = tt_aV[BORDERCOLOR]; - if(!tt_aV[TITLEFONTCOLOR].length) - tt_aV[TITLEFONTCOLOR] = tt_aV[BGCOLOR]; - if(!tt_aV[TITLEFONTFACE].length) - tt_aV[TITLEFONTFACE] = tt_aV[FONTFACE]; - if(!tt_aV[TITLEFONTSIZE].length) - tt_aV[TITLEFONTSIZE] = tt_aV[FONTSIZE]; - if(tt_aV[CLOSEBTN]) - { - // Use title colours for non-specified closebutton colours - if(!tt_aV[CLOSEBTNCOLORS]) - tt_aV[CLOSEBTNCOLORS] = new Array("", "", "", ""); - for(var i = 4; i;) - {--i; - if(!tt_aV[CLOSEBTNCOLORS][i].length) - tt_aV[CLOSEBTNCOLORS][i] = (i & 1) ? tt_aV[TITLEFONTCOLOR] : tt_aV[TITLEBGCOLOR]; - } - // Enforce titlebar be shown - if(!tt_aV[TITLE].length) - tt_aV[TITLE] = " "; - } - // Circumvents broken display of images and fade-in flicker in Geckos < 1.8 - if(tt_aV[OPACITY] == 100 && typeof tt_aElt[0].style.MozOpacity != tt_u && !Array.every) - tt_aV[OPACITY] = 99; - // Smartly shorten the delay for fade-in tooltips - if(tt_aV[FADEIN] && tt_flagOpa && tt_aV[DELAY] > 100) - tt_aV[DELAY] = Math.max(tt_aV[DELAY] - tt_aV[FADEIN], 100); -} -function tt_AdaptConfig2() -{ - if(tt_aV[CENTERMOUSE]) - { - tt_aV[OFFSETX] -= ((tt_w - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0)) >> 1); - tt_aV[JUMPHORZ] = false; - } -} -// Expose content globally so extensions can modify it -function tt_MkTipContent(a) -{ - if(tt_t2t) - { - if(tt_aV[COPYCONTENT]) - tt_sContent = tt_t2t.innerHTML; - else - tt_sContent = ""; - } - else - tt_sContent = a[0]; - tt_ExtCallFncs(0, "CreateContentString"); -} -function tt_MkTipSubDivs() -{ - var sCss = 'position:relative;margin:0px;padding:0px;border-width:0px;left:0px;top:0px;line-height:normal;width:auto;', - sTbTrTd = ' cellspacing="0" cellpadding="0" border="0" style="' + sCss + '">
' - // Image redundancy for bugous old Geckos that won't auto-expand TD height to 100% - + '' - + '
' - + '' - + '
' - + '' - + tt_aV[TITLE] - + '' - + (tt_aV[CLOSEBTN] ? - ('') - : '') - + '
' - + '' - + tt_aV[CLOSEBTNTEXT] - + '
') - : '') - + '
' - + '' - + tt_sContent - + '
' - + (tt_aV[SHADOW] - ? ('
' - + '
') - : '') - ); - tt_GetSubDivRefs(); - // Convert DOM node to tip - if(tt_t2t && !tt_aV[COPYCONTENT]) - tt_El2Tip(); - tt_ExtCallFncs(0, "SubDivsCreated"); -} -function tt_GetSubDivRefs() -{ - var aId = new Array("WzTiTl", "WzTiTlTb", "WzTiTlI", "WzClOsE", "WzBoDy", "WzBoDyI", "WzTtShDwB", "WzTtShDwR"); - - for(var i = aId.length; i; --i) - tt_aElt[i] = tt_GetElt(aId[i - 1]); -} -function tt_FormatTip() -{ - var css, w, h, pad = tt_aV[PADDING], padT, wBrd = tt_aV[BORDERWIDTH], - iOffY, iOffSh, iAdd = (pad + wBrd) << 1; - - //--------- Title DIV ---------- - if(tt_aV[TITLE].length) - { - padT = tt_aV[TITLEPADDING]; - css = tt_aElt[1].style; - css.background = tt_aV[TITLEBGCOLOR]; - css.paddingTop = css.paddingBottom = padT + "px"; - css.paddingLeft = css.paddingRight = (padT + 2) + "px"; - css = tt_aElt[3].style; - css.color = tt_aV[TITLEFONTCOLOR]; - if(tt_aV[WIDTH] == -1) - css.whiteSpace = "nowrap"; - css.fontFamily = tt_aV[TITLEFONTFACE]; - css.fontSize = tt_aV[TITLEFONTSIZE]; - css.fontWeight = "bold"; - css.textAlign = tt_aV[TITLEALIGN]; - // Close button DIV - if(tt_aElt[4]) - { - css = tt_aElt[4].style; - css.background = tt_aV[CLOSEBTNCOLORS][0]; - css.color = tt_aV[CLOSEBTNCOLORS][1]; - css.fontFamily = tt_aV[TITLEFONTFACE]; - css.fontSize = tt_aV[TITLEFONTSIZE]; - css.fontWeight = "bold"; - } - if(tt_aV[WIDTH] > 0) - tt_w = tt_aV[WIDTH]; - else - { - tt_w = tt_GetDivW(tt_aElt[3]) + tt_GetDivW(tt_aElt[4]); - // Some spacing between title DIV and closebutton - if(tt_aElt[4]) - tt_w += pad; - // Restrict auto width to max width - if(tt_aV[WIDTH] < -1 && tt_w > -tt_aV[WIDTH]) - tt_w = -tt_aV[WIDTH]; - } - // Ensure the top border of the body DIV be covered by the title DIV - iOffY = -wBrd; - } - else - { - tt_w = 0; - iOffY = 0; - } - - //-------- Body DIV ------------ - css = tt_aElt[5].style; - css.top = iOffY + "px"; - if(wBrd) - { - css.borderColor = tt_aV[BORDERCOLOR]; - css.borderStyle = tt_aV[BORDERSTYLE]; - css.borderWidth = wBrd + "px"; - } - if(tt_aV[BGCOLOR].length) - css.background = tt_aV[BGCOLOR]; - if(tt_aV[BGIMG].length) - css.backgroundImage = "url(" + tt_aV[BGIMG] + ")"; - css.padding = pad + "px"; - css.textAlign = tt_aV[TEXTALIGN]; - if(tt_aV[HEIGHT]) - { - css.overflow = "auto"; - if(tt_aV[HEIGHT] > 0) - css.height = (tt_aV[HEIGHT] + iAdd) + "px"; - else - tt_h = iAdd - tt_aV[HEIGHT]; - } - // TD inside body DIV - css = tt_aElt[6].style; - css.color = tt_aV[FONTCOLOR]; - css.fontFamily = tt_aV[FONTFACE]; - css.fontSize = tt_aV[FONTSIZE]; - css.fontWeight = tt_aV[FONTWEIGHT]; - css.textAlign = tt_aV[TEXTALIGN]; - if(tt_aV[WIDTH] > 0) - w = tt_aV[WIDTH]; - // Width like title (if existent) - else if(tt_aV[WIDTH] == -1 && tt_w) - w = tt_w; - else - { - // Measure width of the body's inner TD, as some browsers would expand - // the container and outer body DIV to 100% - w = tt_GetDivW(tt_aElt[6]); - // Restrict auto width to max width - if(tt_aV[WIDTH] < -1 && w > -tt_aV[WIDTH]) - w = -tt_aV[WIDTH]; - } - if(w > tt_w) - tt_w = w; - tt_w += iAdd; - - //--------- Shadow DIVs ------------ - if(tt_aV[SHADOW]) - { - tt_w += tt_aV[SHADOWWIDTH]; - iOffSh = Math.floor((tt_aV[SHADOWWIDTH] * 4) / 3); - // Bottom shadow - css = tt_aElt[7].style; - css.top = iOffY + "px"; - css.left = iOffSh + "px"; - css.width = (tt_w - iOffSh - tt_aV[SHADOWWIDTH]) + "px"; - css.height = tt_aV[SHADOWWIDTH] + "px"; - css.background = tt_aV[SHADOWCOLOR]; - // Right shadow - css = tt_aElt[8].style; - css.top = iOffSh + "px"; - css.left = (tt_w - tt_aV[SHADOWWIDTH]) + "px"; - css.width = tt_aV[SHADOWWIDTH] + "px"; - css.background = tt_aV[SHADOWCOLOR]; - } - else - iOffSh = 0; - - //-------- Container DIV ------- - tt_SetTipOpa(tt_aV[FADEIN] ? 0 : tt_aV[OPACITY]); - tt_FixSize(iOffY, iOffSh); -} -// Fixate the size so it can't dynamically change while the tooltip is moving. -function tt_FixSize(iOffY, iOffSh) -{ - var wIn, wOut, h, add, pad = tt_aV[PADDING], wBrd = tt_aV[BORDERWIDTH], i; - - tt_aElt[0].style.width = tt_w + "px"; - tt_aElt[0].style.pixelWidth = tt_w; - wOut = tt_w - ((tt_aV[SHADOW]) ? tt_aV[SHADOWWIDTH] : 0); - // Body - wIn = wOut; - if(!tt_bBoxOld) - wIn -= (pad + wBrd) << 1; - tt_aElt[5].style.width = wIn + "px"; - // Title - if(tt_aElt[1]) - { - wIn = wOut - ((tt_aV[TITLEPADDING] + 2) << 1); - if(!tt_bBoxOld) - wOut = wIn; - tt_aElt[1].style.width = wOut + "px"; - tt_aElt[2].style.width = wIn + "px"; - } - // Max height specified - if(tt_h) - { - h = tt_GetDivH(tt_aElt[5]); - if(h > tt_h) - { - if(!tt_bBoxOld) - tt_h -= (pad + wBrd) << 1; - tt_aElt[5].style.height = tt_h + "px"; - } - } - tt_h = tt_GetDivH(tt_aElt[0]) + iOffY; - // Right shadow - if(tt_aElt[8]) - tt_aElt[8].style.height = (tt_h - iOffSh) + "px"; - i = tt_aElt.length - 1; - if(tt_aElt[i]) - { - tt_aElt[i].style.width = tt_w + "px"; - tt_aElt[i].style.height = tt_h + "px"; - } -} -function tt_DeAlt(el) -{ - var aKid; - - if(el) - { - if(el.alt) - el.alt = ""; - if(el.title) - el.title = ""; - aKid = el.childNodes || el.children || null; - if(aKid) - { - for(var i = aKid.length; i;) - tt_DeAlt(aKid[--i]); - } - } -} -// This hack removes the native tooltips over links in Opera -function tt_OpDeHref(el) -{ - if(!tt_op) - return; - if(tt_elDeHref) - tt_OpReHref(); - while(el) - { - if(el.hasAttribute && el.hasAttribute("href")) - { - el.t_href = el.getAttribute("href"); - el.t_stats = window.status; - el.removeAttribute("href"); - el.style.cursor = "hand"; - tt_AddEvtFnc(el, "mousedown", tt_OpReHref); - window.status = el.t_href; - tt_elDeHref = el; - break; - } - el = tt_GetDad(el); - } -} -function tt_OpReHref() -{ - if(tt_elDeHref) - { - tt_elDeHref.setAttribute("href", tt_elDeHref.t_href); - tt_RemEvtFnc(tt_elDeHref, "mousedown", tt_OpReHref); - window.status = tt_elDeHref.t_stats; - tt_elDeHref = null; - } -} -function tt_El2Tip() -{ - var css = tt_t2t.style; - - // Store previous positioning - tt_t2t.t_cp = css.position; - tt_t2t.t_cl = css.left; - tt_t2t.t_ct = css.top; - tt_t2t.t_cd = css.display; - // Store the tag's parent element so we can restore that DOM branch - // when the tooltip is being hidden - tt_t2tDad = tt_GetDad(tt_t2t); - tt_MovDomNode(tt_t2t, tt_t2tDad, tt_aElt[6]); - css.display = "block"; - css.position = "static"; - css.left = css.top = css.marginLeft = css.marginTop = "0px"; -} -function tt_UnEl2Tip() -{ - // Restore positioning and display - var css = tt_t2t.style; - - css.display = tt_t2t.t_cd; - tt_MovDomNode(tt_t2t, tt_GetDad(tt_t2t), tt_t2tDad); - css.position = tt_t2t.t_cp; - css.left = tt_t2t.t_cl; - css.top = tt_t2t.t_ct; - tt_t2tDad = null; -} -function tt_OverInit() -{ - if(window.event) - tt_over = window.event.target || window.event.srcElement; - else - tt_over = tt_ovr_; - tt_DeAlt(tt_over); - tt_OpDeHref(tt_over); -} -function tt_ShowInit() -{ - tt_tShow.Timer("tt_Show()", tt_aV[DELAY], true); - if(tt_aV[CLICKCLOSE] || tt_aV[CLICKSTICKY]) - tt_AddEvtFnc(document, "mouseup", tt_OnLClick); -} -function tt_Show() -{ - var css = tt_aElt[0].style; - - // Override the z-index of the topmost wz_dragdrop.js D&D item - css.zIndex = Math.max((window.dd && dd.z) ? (dd.z + 2) : 0, 1010); - if(tt_aV[STICKY] || !tt_aV[FOLLOWMOUSE]) - tt_iState &= ~0x4; - if(tt_aV[EXCLUSIVE]) - tt_iState |= 0x8; - if(tt_aV[DURATION] > 0) - tt_tDurt.Timer("tt_HideInit()", tt_aV[DURATION], true); - tt_ExtCallFncs(0, "Show") - css.visibility = "visible"; - tt_iState |= 0x2; - if(tt_aV[FADEIN]) - tt_Fade(0, 0, tt_aV[OPACITY], Math.round(tt_aV[FADEIN] / tt_aV[FADEINTERVAL])); - tt_ShowIfrm(); -} -function tt_ShowIfrm() -{ - if(tt_ie56) - { - var ifrm = tt_aElt[tt_aElt.length - 1]; - if(ifrm) - { - var css = ifrm.style; - css.zIndex = tt_aElt[0].style.zIndex - 1; - css.display = "block"; - } - } -} -function tt_Move(e) -{ - if(e) - tt_ovr_ = e.target || e.srcElement; - e = e || window.event; - if(e) - { - tt_musX = tt_GetEvtX(e); - tt_musY = tt_GetEvtY(e); - } - if(tt_iState & 0x4) - { - // Prevent jam of mousemove events - if(!tt_op && !tt_ie) - { - if(tt_bWait) - return; - tt_bWait = true; - tt_tWaitMov.Timer("tt_bWait = false;", 1, true); - } - if(tt_aV[FIX]) - { - tt_iState &= ~0x4; - tt_PosFix(); - } - else if(!tt_ExtCallFncs(e, "MoveBefore")) - tt_SetTipPos(tt_Pos(0), tt_Pos(1)); - tt_ExtCallFncs([tt_musX, tt_musY], "MoveAfter") - } -} -function tt_Pos(iDim) -{ - var iX, bJmpMod, cmdAlt, cmdOff, cx, iMax, iScrl, iMus, bJmp; - - // Map values according to dimension to calculate - if(iDim) - { - bJmpMod = tt_aV[JUMPVERT]; - cmdAlt = ABOVE; - cmdOff = OFFSETY; - cx = tt_h; - iMax = tt_maxPosY; - iScrl = tt_GetScrollY(); - iMus = tt_musY; - bJmp = tt_bJmpVert; - } - else - { - bJmpMod = tt_aV[JUMPHORZ]; - cmdAlt = LEFT; - cmdOff = OFFSETX; - cx = tt_w; - iMax = tt_maxPosX; - iScrl = tt_GetScrollX(); - iMus = tt_musX; - bJmp = tt_bJmpHorz; - } - if(bJmpMod) - { - if(tt_aV[cmdAlt] && (!bJmp || tt_CalcPosAlt(iDim) >= iScrl + 16)) - iX = tt_PosAlt(iDim); - else if(!tt_aV[cmdAlt] && bJmp && tt_CalcPosDef(iDim) > iMax - 16) - iX = tt_PosAlt(iDim); - else - iX = tt_PosDef(iDim); - } - else - { - iX = iMus; - if(tt_aV[cmdAlt]) - iX -= cx + tt_aV[cmdOff] - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0); - else - iX += tt_aV[cmdOff]; - } - // Prevent tip from extending past clientarea boundary - if(iX > iMax) - iX = bJmpMod ? tt_PosAlt(iDim) : iMax; - // In case of insufficient space on both sides, ensure the left/upper part - // of the tip be visible - if(iX < iScrl) - iX = bJmpMod ? tt_PosDef(iDim) : iScrl; - return iX; -} -function tt_PosDef(iDim) -{ - if(iDim) - tt_bJmpVert = tt_aV[ABOVE]; - else - tt_bJmpHorz = tt_aV[LEFT]; - return tt_CalcPosDef(iDim); -} -function tt_PosAlt(iDim) -{ - if(iDim) - tt_bJmpVert = !tt_aV[ABOVE]; - else - tt_bJmpHorz = !tt_aV[LEFT]; - return tt_CalcPosAlt(iDim); -} -function tt_CalcPosDef(iDim) -{ - return iDim ? (tt_musY + tt_aV[OFFSETY]) : (tt_musX + tt_aV[OFFSETX]); -} -function tt_CalcPosAlt(iDim) -{ - var cmdOff = iDim ? OFFSETY : OFFSETX; - var dx = tt_aV[cmdOff] - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0); - if(tt_aV[cmdOff] > 0 && dx <= 0) - dx = 1; - return((iDim ? (tt_musY - tt_h) : (tt_musX - tt_w)) - dx); -} -function tt_PosFix() -{ - var iX, iY; - - if(typeof(tt_aV[FIX][0]) == "number") - { - iX = tt_aV[FIX][0]; - iY = tt_aV[FIX][1]; - } - else - { - if(typeof(tt_aV[FIX][0]) == "string") - el = tt_GetElt(tt_aV[FIX][0]); - // First slot in array is direct reference to HTML element - else - el = tt_aV[FIX][0]; - iX = tt_aV[FIX][1]; - iY = tt_aV[FIX][2]; - // By default, vert pos is related to bottom edge of HTML element - if(!tt_aV[ABOVE] && el) - iY += tt_GetDivH(el); - for(; el; el = el.offsetParent) - { - iX += el.offsetLeft || 0; - iY += el.offsetTop || 0; - } - } - // For a fixed tip positioned above the mouse, use the bottom edge as anchor - // (recommended by Christophe Rebeschini, 31.1.2008) - if(tt_aV[ABOVE]) - iY -= tt_h; - tt_SetTipPos(iX, iY); -} -function tt_Fade(a, now, z, n) -{ - if(n) - { - now += Math.round((z - now) / n); - if((z > a) ? (now >= z) : (now <= z)) - now = z; - else - tt_tFade.Timer( - "tt_Fade(" - + a + "," + now + "," + z + "," + (n - 1) - + ")", - tt_aV[FADEINTERVAL], - true - ); - } - now ? tt_SetTipOpa(now) : tt_Hide(); -} -function tt_SetTipOpa(opa) -{ - // To circumvent the opacity nesting flaws of IE, we set the opacity - // for each sub-DIV separately, rather than for the container DIV. - tt_SetOpa(tt_aElt[5], opa); - if(tt_aElt[1]) - tt_SetOpa(tt_aElt[1], opa); - if(tt_aV[SHADOW]) - { - opa = Math.round(opa * 0.8); - tt_SetOpa(tt_aElt[7], opa); - tt_SetOpa(tt_aElt[8], opa); - } -} -function tt_OnCloseBtnOver(iOver) -{ - var css = tt_aElt[4].style; - - iOver <<= 1; - css.background = tt_aV[CLOSEBTNCOLORS][iOver]; - css.color = tt_aV[CLOSEBTNCOLORS][iOver + 1]; -} -function tt_OnLClick(e) -{ - // Ignore right-clicks - e = e || window.event; - if(!((e.button && e.button & 2) || (e.which && e.which == 3))) - { - if(tt_aV[CLICKSTICKY] && (tt_iState & 0x4)) - { - tt_aV[STICKY] = true; - tt_iState &= ~0x4; - } - else if(tt_aV[CLICKCLOSE]) - tt_HideInit(); - } -} -function tt_Int(x) -{ - var y; - - return(isNaN(y = parseInt(x)) ? 0 : y); -} -Number.prototype.Timer = function(s, iT, bUrge) -{ - if(!this.value || bUrge) - this.value = window.setTimeout(s, iT); -} -Number.prototype.EndTimer = function() -{ - if(this.value) - { - window.clearTimeout(this.value); - this.value = 0; - } -} -function tt_GetWndCliSiz(s) -{ - var db, y = window["inner" + s], sC = "client" + s, sN = "number"; - if(typeof y == sN) - { - var y2; - return( - // Gecko or Opera with scrollbar - // ... quirks mode - ((db = document.body) && typeof(y2 = db[sC]) == sN && y2 && y2 <= y) ? y2 - // ... strict mode - : ((db = document.documentElement) && typeof(y2 = db[sC]) == sN && y2 && y2 <= y) ? y2 - // No scrollbar, or clientarea size == 0, or other browser (KHTML etc.) - : y - ); - } - // IE - return( - // document.documentElement.client+s functional, returns > 0 - ((db = document.documentElement) && (y = db[sC])) ? y - // ... not functional, in which case document.body.client+s - // is the clientarea size, fortunately - : document.body[sC] - ); -} -function tt_SetOpa(el, opa) -{ - var css = el.style; - - tt_opa = opa; - if(tt_flagOpa == 1) - { - if(opa < 100) - { - // Hacks for bugs of IE: - // 1.) Once a CSS filter has been applied, fonts are no longer - // anti-aliased, so we store the previous 'non-filter' to be - // able to restore it - if(typeof(el.filtNo) == tt_u) - el.filtNo = css.filter; - // 2.) A DIV cannot be made visible in a single step if an - // opacity < 100 has been applied while the DIV was hidden - var bVis = css.visibility != "hidden"; - // 3.) In IE6, applying an opacity < 100 has no effect if the - // element has no layout (position, size, zoom, ...) - css.zoom = "100%"; - if(!bVis) - css.visibility = "visible"; - css.filter = "alpha(opacity=" + opa + ")"; - if(!bVis) - css.visibility = "hidden"; - } - else if(typeof(el.filtNo) != tt_u) - // Restore 'non-filter' - css.filter = el.filtNo; - } - else - { - opa /= 100.0; - switch(tt_flagOpa) - { - case 2: - css.KhtmlOpacity = opa; break; - case 3: - css.KHTMLOpacity = opa; break; - case 4: - css.MozOpacity = opa; break; - case 5: - css.opacity = opa; break; - } - } -} -function tt_Err(sErr, bIfDebug) -{ - if(tt_Debug || !bIfDebug) - alert("Tooltip Script Error Message:\n\n" + sErr); -} - -//============ EXTENSION (PLUGIN) MANAGER ===============// -function tt_ExtCmdEnum() -{ - var s; - - // Add new command(s) to the commands enum - for(var i in config) - { - s = "window." + i.toString().toUpperCase(); - if(eval("typeof(" + s + ") == tt_u")) - { - eval(s + " = " + tt_aV.length); - tt_aV[tt_aV.length] = null; - } - } -} -function tt_ExtCallFncs(arg, sFnc) -{ - var b = false; - for(var i = tt_aExt.length; i;) - {--i; - var fnc = tt_aExt[i]["On" + sFnc]; - // Call the method the extension has defined for this event - if(fnc && fnc(arg)) - b = true; - } - return b; -} - -tt_Init(); diff --git a/webui/view/theme/default/images/dark-grey-disclosure-arrow-down.png b/webui/view/theme/default/images/dark-grey-disclosure-arrow-down.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ceb84bf3d54068da6f0cf35fd68ed6939899f3 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)I!3HFqj;YoHDOFDw#}JO_(BFM+qVZ~e>HU5a&6PP zx&Xst9vqH!)8`mB75B}bvLtY_<#K_&JWEA#dY|0WK6Oue;rDmPB`VG(@@DJ)XM7uN V`7Jd0=tH1|44$rjF6*2UngEuzJAnWI literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/groupactions.png b/webui/view/theme/default/images/groupactions.png new file mode 100644 index 0000000000000000000000000000000000000000..9e39bca2ef97260ce4f47d6a44adf690cd0e43e3 GIT binary patch literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^N zSvUz%78)A*`t@s|;Lo2wfn;=a^u2rckWGNAhcmjnyM29qKYjY-4ILfRX3m*AcmDjv%U7;iyJ73D1D7s6e*E_BhY!D}-Q9f(sPnX^ zi(`nz>9>H6h# zE%0Yv%cV4hFU!gWy1RoW&NloKD{o(@U;o6JBgphZ#WZC-N4p;#JAzn_3M`w@CZH_Y z#LVWTbKuU|@Y844^kum5Jzd#y=faNJZ^~aM$_k3k*{3Y`&Z_(HmQeRqU5$4)H-?Iq zpQ^YW`l=)E+4Z=hVDS?PSLz%D7>~IK{B-dYOr7BB+O%}_XQngZ?ac2_vL}Svzt+n8 bvNwjIc&2u75X+}^pkVcM^>bP0l+XkKfRo5H literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/light-grey-disclosure-arrow-down.png b/webui/view/theme/default/images/light-grey-disclosure-arrow-down.png new file mode 100644 index 0000000000000000000000000000000000000000..73e15627ba787e158ff965518901f39c59e61eb4 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)I!3HFqj;YoHDHTr_#}JO_WQ*cwXX;~SJpBLv rKhF&nhervXC9DR9J5+oajpP|#az*j#Y}R%Gs%P+Y^>bP0l+XkK`9~QX literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/listheader.gif b/webui/view/theme/default/images/listheader.gif new file mode 100644 index 0000000000000000000000000000000000000000..ff28d95efc87fac7fb51f9f55fa156c1a5ce1dd8 GIT binary patch literal 470 zcmV;{0V)28P)r=@9*#L@bB*L@RgI3(9h4An3$@ms->f&%*@Qq&CS@@*z@!A>Fev)*Vgg! z^6KmB=<4dv&(G1((DL%~)6&z@)6(AE-QM2a=<4ay($e$v^Uco9-rnBM&d<-!&h75* z^Yirb^YYl&*wWI|*4Eb6*4NI?&fVVK=;`Xv(b3V+(9zJ*l+uPf{ zy}Y)zx992Uo}Qh`$;#m1;MLXD^z`)E+1cmk=Z%bvP#=(E0002dNkl2iWV z5Cq^3S56J<0&;nPL{JWMAA;un-zvLhrPBV(H#I%e7zl=;_$$S|Qp|PEF`Y~&4|>&u z6Z>>5%XS>c)@fm-n0n2Xi32!dVPVVn7Ww#{=t_cM%?g&GZa z1V?gS9trjYuLM286~Pz53&9(~JHZpd4Z$tJC&4wrCBZYnH~DAz0bGMkoraFKzyJUM M07*qoM6N<$f}W2MHUIzs literal 0 HcmV?d00001 diff --git a/webui/view/theme/default/images/notes.png b/webui/view/theme/default/images/notes.png new file mode 100644 index 0000000000000000000000000000000000000000..b3772cbf92fc058f23ec6da9600577b8533842cd GIT binary patch literal 768 zcmV+b1ONPqP)K^XpK&e`Lxmy$|cP0|XXz)UeUZ6hHP5-fx8CBo>XAm}A}te2pmhaP;Dz=ELH zZVG`~Xj$P6q@pO5QVX+SOLx!Nb7rQ0Cfe;{FU`w8Gt77SFT<2l=ss7Y@E_~gg;8c_ z4#R*S2UI{O35XQ!ecDo#K9q?blyJdwi_v|t!{E{cNG;OaI5?Df%w!T$N1>w!-;EnE z#4;S2NW(G&92mNF8A@?jw3kYPX*U#uR06T)gJepRX%cS*0^h~%*3&Ra=?A0?tw?Gr zaOsNNF-k>wKhpV&fUFPR>4X%4aiEnU1G?2N1RVoX_hChf5!+L`0)Zf#`#Zq7`b9Yf z<&*%~Wnfme5m6>JA6x1d{&XNP)O(FUNmEE>F_br)#JXq$24;HkY<3Wz6N^|CT7$av zF*LWF`JF%#u(7EXU@22=E2kVHzZPBNSMV-AMdCI*U%<7J=zDt?&*vx6|LT62|0FQ& zQV9cQlnx`?12a9C{W=ZqI5Y|jr|QpAw6
 
- +
diff --git a/webui/view/theme/default/templates/audit/helper.tpl b/webui/view/theme/default/templates/audit/helper.tpl index 1e6aa1bb..114d744b 100644 --- a/webui/view/theme/default/templates/audit/helper.tpl +++ b/webui/view/theme/default/templates/audit/helper.tpl @@ -3,8 +3,8 @@