From 30b152b1947e773a618bc29bfa3b5b505ceeb1d7 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 02 May 2009 10:19:24 -0400
Subject: [PATCH] - Added quick search box menu (#1484304)

---
 skins/default/common.css                 |    9 ++
 CHANGELOG                                |    1 
 skins/default/images/icons/glass.gif     |    0 
 skins/default/mail.css                   |   13 ++++
 program/localization/en_GB/labels.inc    |    2 
 skins/default/templates/mail.html        |   15 ++++
 program/steps/mail/search.inc            |   45 +++++++++------
 skins/default/images/searchfield.gif     |    0 
 program/steps/mail/func.inc              |    1 
 program/localization/en_US/labels.inc    |    2 
 skins/default/templates/addressbook.html |    4 +
 program/localization/pl_PL/labels.inc    |    2 
 skins/default/functions.js               |   50 ++++++++++++++++
 program/js/app.js                        |   15 +++-
 14 files changed, 131 insertions(+), 28 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index da99c7e..84c0726 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG RoundCube Webmail
 ===========================
 
+- Added quick search box menu (#1484304)
 - Fix wrong column sort order icons (#1485823)
 - Updated TinyMCE to 3.2.3 version
 - Fix attachment names encoding when charset isn't specified in attachment part (#1484969)
diff --git a/program/js/app.js b/program/js/app.js
index 8ac0e72..e844403 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -2392,19 +2392,26 @@
     };
 
   // send remote request to search mail or contacts
-  this.qsearch = function(value, addurl)
+  this.qsearch = function(value)
     {
     if (value != '')
       {
-      if (this.message_list)
+      var addurl = '';
+      if (this.message_list) {
         this.message_list.clear();
-      else if (this.contact_list) {
+	if (this.env.search_mods) {
+          var head_arr = new Array();
+          for (var n in this.env.search_mods)
+	    head_arr.push(n);
+	  addurl += '&_headers='+head_arr.join(',');
+          }
+        } else if (this.contact_list) {
         this.contact_list.clear(true);
         this.show_contentframe(false);
         }
 
       if (this.gui_objects.search_filter)
-      addurl = '&_filter=' + this.gui_objects.search_filter.value;
+        addurl += '&_filter=' + this.gui_objects.search_filter.value;
 
       // reset vars
       this.env.current_page = 1;
diff --git a/program/localization/en_GB/labels.inc b/program/localization/en_GB/labels.inc
index fae87c5..da2709c 100644
--- a/program/localization/en_GB/labels.inc
+++ b/program/localization/en_GB/labels.inc
@@ -131,6 +131,8 @@
 $labels['unlimited'] = 'unlimited';
 $labels['quicksearch'] = 'Quick search';
 $labels['resetsearch'] = 'Reset search';
+$labels['searchmod']  = 'Search modifiers';
+$labels['msgtext']  = 'Entire message';
 $labels['openinextwin'] = 'Open in new window';
 $labels['compose'] = 'Compose a message';
 $labels['savemessage'] = 'Save this draft';
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 7f05387..87cb08b 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -161,6 +161,8 @@
 
 $labels['quicksearch']  = 'Quick search';
 $labels['resetsearch']  = 'Reset search';
+$labels['searchmod']  = 'Search modifiers';
+$labels['msgtext']  = 'Entire message';
 
 $labels['openinextwin'] = 'Open in new window';
 
diff --git a/program/localization/pl_PL/labels.inc b/program/localization/pl_PL/labels.inc
index dba23a8..7b8a39d 100644
--- a/program/localization/pl_PL/labels.inc
+++ b/program/localization/pl_PL/labels.inc
@@ -142,6 +142,8 @@
 $labels['unlimited'] = 'bez limitu';
 $labels['quicksearch'] = 'Szybkie wyszukiwanie';
 $labels['resetsearch'] = 'Wyczyść filtr';
+$labels['searchmod']  = 'Parametry wyszukiwania';
+$labels['msgtext']  = 'Cała wiadomość';
 $labels['openinextwin'] = 'Otwórz w nowym oknie';
 $labels['compose'] = 'Utwórz wiadomość';
 $labels['savemessage'] = 'Zapisz kopię roboczą';
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index f0d7d6f..537199c 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -79,6 +79,7 @@
       $OUTPUT->set_env('search_request', $search_request);
       }
     
+      $OUTPUT->set_env('search_mods', $_SESSION['search_mods'] ? $_SESSION['search_mods'] : array('subject'=>'subject'));
       // make sure the message count is refreshed (for default view)
       $IMAP->messagecount($mbox_name, 'ALL', true);
     }
diff --git a/program/steps/mail/search.inc b/program/steps/mail/search.inc
index 95ca67a..8d24460 100644
--- a/program/steps/mail/search.inc
+++ b/program/steps/mail/search.inc
@@ -28,6 +28,7 @@
 $str = get_input_value('_q', RCUBE_INPUT_GET);
 $filter = get_input_value('_filter', RCUBE_INPUT_GET);
 $mbox = get_input_value('_mbox', RCUBE_INPUT_GET);
+$headers = get_input_value('_headers', RCUBE_INPUT_GET);
 $search_request = md5($mbox.$filter.$str);
 
 // add list filter string
@@ -39,47 +40,55 @@
 if (preg_match("/^from:.*/i", $str))
 {
   list(,$srch) = explode(":", $str);
-  $subject = "HEADER FROM";
-  $search = trim($srch);
+  $subject['from'] = "HEADER FROM";
 }
 else if (preg_match("/^to:.*/i", $str))
 {
   list(,$srch) = explode(":", $str);
-  $subject = "HEADER TO";
-  $search = trim($srch);
+  $subject['to'] = "HEADER TO";
 }
 else if (preg_match("/^cc:.*/i", $str))
 {
   list(,$srch) = explode(":", $str);
-  $subject = "HEADER CC";
-  $search = trim($srch);
+  $subject['cc'] = "HEADER CC";
+}
+else if (preg_match("/^bcc:.*/i", $str))
+{
+  list(,$srch) = explode(":", $str);
+  $subject['bcc'] = "HEADER BCC";
 }
 else if (preg_match("/^subject:.*/i", $str))
 {
   list(,$srch) = explode(":", $str);
-  $subject = "HEADER SUBJECT";
-  $search = trim($srch);
+  $subject['subject'] = "HEADER SUBJECT";
 }
 else if (preg_match("/^body:.*/i", $str))
 {
   list(,$srch) = explode(":", $str);
-  $subject = "TEXT";
-  $search = trim($srch);
+  $subject['text'] = "TEXT";
 }
 // search in subject and sender by default
 else if(trim($str))
 {
-  $from = ($mbox == $CONFIG['sent_mbox'] || $mbox == $CONFIG['drafts_mbox']) ? "TO" : "FROM";
-  $subject = array("HEADER SUBJECT", "HEADER $from");
-  $search = trim($str);
+  if ($headers) {
+    $headers = explode(',', $headers);
+    foreach($headers as $header)
+      switch ($header) {
+        case 'text': $subject['text'] = 'TEXT'; break;
+        default: $subject[$header] = 'HEADER '.$header;
+      }
+  } else {
+    $subject['subject'] = 'HEADER SUBJECT';
+  }
 }
 
-if ($subject && !is_array($subject))
-  $search_str .= sprintf(" %s {%d}\r\n%s", $subject, strlen($search), $search);
-else if ($subject) {
-  $search_str .= ' OR';
-  foreach($subject as $sub)
+$search = $srch ? trim($srch) : trim($str);
+
+if ($subject) {
+  $search_str .= str_repeat(' OR', count($subject)-1);
+  foreach ($subject as $sub)
     $search_str .= sprintf(" %s {%d}\r\n%s", $sub, strlen($search), $search);
+  $_SESSION['search_mods'] = $subject;
 }
 
 $search_str = trim($search_str);
diff --git a/skins/default/common.css b/skins/default/common.css
index a019854..b445cd2 100644
--- a/skins/default/common.css
+++ b/skins/default/common.css
@@ -347,7 +347,7 @@
   background: url('images/searchfield.gif') top left no-repeat;
 }
 
-#quicksearchbar a
+#searchreset
 {
   position: absolute;
   top: 3px;
@@ -355,6 +355,13 @@
   text-decoration: none;
 }
 
+#searchmod
+{
+ position: absolute;
+ top: 3px;
+ right: 162px;
+}
+
 #quicksearchbar img
 {
   vertical-align: middle;
diff --git a/skins/default/functions.js b/skins/default/functions.js
index fd6e612..31c4647 100644
--- a/skins/default/functions.js
+++ b/skins/default/functions.js
@@ -121,6 +121,7 @@
 function rcube_mail_ui()
 {
   this.markmenu = $('#markmessagemenu');
+  this.searchmenu = $('#searchmenu');
 }
 
 rcube_mail_ui.prototype = {
@@ -137,16 +138,61 @@
   this.markmenu[show?'show':'hide']();
 },
 
+show_searchmenu: function(show)
+{
+  if (typeof show == 'undefined')
+    show = this.searchmenu.is(':visible') ? false : true;
+
+  var ref = rcube_find_object('searchmod');
+  if (show && ref) {
+    var pos = $(ref).offset();
+    this.searchmenu.css({ left:pos.left, top:(pos.top + ref.offsetHeight + 2)});
+
+    if (rcmail.env.search_mods) {
+      for (var n in rcmail.env.search_mods) {
+        box = rcube_find_object('s_mod_' + n);
+        box.checked = 'checked';
+      }
+    }
+  }
+  this.searchmenu[show?'show':'hide']();
+},
+ 
+set_searchmod: function(elem)
+{
+  if (!rcmail.env.search_mods)
+    rcmail.env.search_mods = new Object();
+  
+  if (!elem.checked)
+    delete(rcmail.env.search_mods[elem.value]);
+  else
+    rcmail.env.search_mods[elem.value] = elem.value;
+},
+
 body_mouseup: function(evt, p)
 {
   if (this.markmenu && this.markmenu.is(':visible') && rcube_event.get_target(evt) != rcube_find_object('markreadbutton'))
     this.show_markmenu(false);
+  else if (this.searchmenu && this.searchmenu.is(':visible') && rcube_event.get_target(evt) != rcube_find_object('searchmod')) {
+    var menu = rcube_find_object('searchmenu');
+    var target = rcube_event.get_target(evt);
+    while (target.parentNode) {
+      if (target.parentNode == menu)
+        return;
+      target = target.parentNode;
+    }
+    this.show_searchmenu(false);
+  }
 },
 
 body_keypress: function(evt, p)
 {
-  if (rcube_event.get_keycode(evt) == 27 && this.markmenu && this.markmenu.is(':visible'))
-    this.show_markmenu(false);
+  if (rcube_event.get_keycode(evt) == 27) {
+    if (this.markmenu && this.markmenu.is(':visible'))
+      this.show_markmenu(false);
+    if (this.searchmenu && this.searchmenu.is(':visible'))
+      this.show_searchmenu(false);
+  }
 }
 
 };
diff --git a/skins/default/images/icons/glass.gif b/skins/default/images/icons/glass.gif
new file mode 100644
index 0000000..9a705b4
--- /dev/null
+++ b/skins/default/images/icons/glass.gif
Binary files differ
diff --git a/skins/default/images/searchfield.gif b/skins/default/images/searchfield.gif
index b1dc938..756a17e 100644
--- a/skins/default/images/searchfield.gif
+++ b/skins/default/images/searchfield.gif
Binary files differ
diff --git a/skins/default/mail.css b/skins/default/mail.css
index 93c63de..00f8ca3 100644
--- a/skins/default/mail.css
+++ b/skins/default/mail.css
@@ -45,7 +45,8 @@
   padding-left: 2px;
 }
 
-#markmessagemenu
+#markmessagemenu,
+#searchmenu
 {
   position: absolute;
   top: 32px;
@@ -58,6 +59,11 @@
   opacity: 0.9;
   filter:alpha(opacity=90);
   z-index: 240;
+}
+
+#searchmenu
+{
+  width: 172px;
 }
 
 ul.toolbarmenu
@@ -89,6 +95,11 @@
   background-color: #ddd;
 }
 
+ul.toolbarmenu li input
+{
+  vertical-align: middle;
+}
+
 #searchfilter
 {
   position: absolute;
diff --git a/skins/default/templates/addressbook.html b/skins/default/templates/addressbook.html
index 431c058..b341172 100644
--- a/skins/default/templates/addressbook.html
+++ b/skins/default/templates/addressbook.html
@@ -41,7 +41,9 @@
 </div>
 
 <div id="quicksearchbar">
-<roundcube:object name="searchform" id="quicksearchbox" /><roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" />
+<roundcube:button name="searchmod" id="searchmod" image="/images/icons/glass.gif" />
+<roundcube:object name="searchform" id="quicksearchbox" />
+<roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" />
 </div>
 
 <roundcube:if condition="count(env:address_sources) &gt; 1" />
diff --git a/skins/default/templates/mail.html b/skins/default/templates/mail.html
index 4e1d7ce..7351446 100644
--- a/skins/default/templates/mail.html
+++ b/skins/default/templates/mail.html
@@ -136,8 +136,21 @@
 </div>
 </div>
 
+<div id="searchmenu">
+  <ul class="toolbarmenu">
+    <li><input type="checkbox" name="s_mods[]" value="subject" id="s_mod_subject" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_subject"><roundcube:label name="subject" /></label></li>
+    <li><input type="checkbox" name="s_mods[]" value="from" id="s_mod_from" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_from"><roundcube:label name="from" /></label></li>
+    <li><input type="checkbox" name="s_mods[]" value="to" id="s_mod_to" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_to"><roundcube:label name="to" /></label></li>
+    <li><input type="checkbox" name="s_mods[]" value="cc" id="s_mod_cc" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_cc"><roundcube:label name="cc" /></label></li>
+    <li><input type="checkbox" name="s_mods[]" value="bcc" id="s_mod_bcc" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_bcc"><roundcube:label name="bcc" /></label></li>
+    <li><input type="checkbox" name="s_mods[]" value="text" id="s_mod_text" onclick="rcmail_ui.set_searchmod(this)" /><label for="s_mod_text"><roundcube:label name="msgtext" /></label></li>
+  </ul>
+</div>
+
 <div id="quicksearchbar">
-<roundcube:object name="searchform" id="quicksearchbox" /><roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" />
+<roundcube:button name="searchmod" id="searchmod" image="/images/icons/glass.gif" onclick="rcmail_ui.show_searchmenu();return false" title="searchmod" />
+<roundcube:object name="searchform" id="quicksearchbox" />
+<roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" />
 </div>
 
 </body>

--
Gitblit v1.9.1