Update search javascript
authorMichael M Slusarz <slusarz@curecanti.org>
Tue, 10 Feb 2009 05:19:43 +0000 (22:19 -0700)
committerMichael M Slusarz <slusarz@curecanti.org>
Tue, 10 Feb 2009 05:19:43 +0000 (22:19 -0700)
imp/js/search.js
imp/js/src/search.js
imp/search.php
imp/templates/search/search.html

index a8395d5..a33e8b5 100644 (file)
@@ -1 +1 @@
-function toggleAll(a){$("search").getInputs(null,"search_folders[]").each(function(b){b.checked=a})}function dateCheck(b){var a=$("search_"+b+"_month"),c=$("search_"+b+"_day"),e=$("search_"+b+"_year");if(a.selectedIndex==0){a.selectedIndex=search_month}if(c.selectedIndex==0){c.selectedIndex=search_day}if(e.value==""){e.value=search_year}}function formCheck(){if(not_search&&(!$("preselected_folders")||!$F("preselected_folders"))){if(!Form.getInputs("search",null,"search_folders[]").detect(function(a){return a.checked})){alert(IMP.text.search_select);return false}}$("actionID").setValue("do_search");return true}function search_reset(){$("actionID").setValue("reset_search");$("search").submit();return true}function saveCache(){$("edit_query").setValue($F("save_cache"));$("search").submit()}function delete_field(a){$("delete_field_id").setValue(a);$("actionID").setValue("delete_field");$("search").submit();return true}function show_subscribed(a){$("show_subscribed_only").setValue(a);$("search").submit();return false};
\ No newline at end of file
+var ImpSearch={_toggleAll:function(a){$("search").getInputs(null,"search_folders[]").each(function(b){b.checked=a})},_dateCheck:function(b){var a=$("search_"+b+"_month"),c=$("search_"+b+"_day"),e=$("search_"+b+"_year");if(a.selectedIndex==0){a.selectedIndex=this.search_date.m}if(c.selectedIndex==0){c.selectedIndex=this.search_date.d}if(e.value==""){e.value=this.search_date.y}},_formCheck:function(){if(this.not_search&&(!$("preselected_folders")||!$F("preselected_folders"))){if(!Form.getInputs("search",null,"search_folders[]").detect(function(a){return a.checked})){alert(IMP.text.search_select);return}}$("actionID").setValue("do_search")},_reset:function(){$("actionID").setValue("reset_search");$("search").submit()},_saveCache:function(){$("edit_query").setValue($F("save_cache"));$("search").submit()},_deleteField:function(a){$("delete_field_id").setValue(a);$("actionID").setValue("delete_field");$("search").submit()},_showSubscribed:function(a){$("show_subscribed_only").setValue(a);$("search").submit()},changeHandler:function(a){var b=a.element().readAttribute("id");switch(b){case"save_cache":this._saveCache();break;default:if(b.startsWith("field_")){$("search").submit()}else{if(b.startsWith("search_date_")){this._dateCheck("on")}}break}},clickHandler:function(b){var a=b.element();if(a.hasClassName("searchSubmit")){this._formCheck()}else{if(a.hasClassName("searchReset")){this._reset()}else{if(a.hasClassName("searchDelete")){this._deleteField(a.readAttribute("fid"))}else{switch(a.readAttribute("id")){case"link_sel_all":this._toggleAll(true);break;case"link_sel_none":this._toggleAll(false);break;case"link_sub":this._showSubscribed(this.inverse_sub);break;case"search_match_and":case"search_match_or":if($("field_1")){$("search").submit()}break}}}}}};document.observe("change",ImpSearch.changeHandler.bind(ImpSearch));document.observe("click",ImpSearch.clickHandler.bind(ImpSearch));
\ No newline at end of file
index 0a27ec5..bcbe57e 100644 (file)
 /**
- * Provides the javascript for the search.php script
+ * Provides the javascript for the search.php script (standard view).
  *
  * See the enclosed file COPYING for license information (GPL). If you
  * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
  */
 
-function toggleAll(checked)
-{
-    $('search').getInputs(null, 'search_folders[]').each(function(e) {
-        e.checked = checked;
-    });
-}
+var ImpSearch = {
+    // The following variables are defined in search.php:
+    //   inverse_sub, not_search, search_date
 
-function dateCheck(field)
-{
-    var m = $('search_' + field + '_month'), d = $('search_' + field + '_day'), y = $('search_' + field + '_year');
+    _toggleAll: function(checked)
+    {
+        $('search').getInputs(null, 'search_folders[]').each(function(e) {
+            e.checked = checked;
+        });
+    },
 
-    if (m.selectedIndex == 0) {
-        m.selectedIndex = search_month;
-    }
+    _dateCheck: function(field)
+    {
+        var m = $('search_' + field + '_month'),
+            d = $('search_' + field + '_day'),
+            y = $('search_' + field + '_year');
 
-    if (d.selectedIndex == 0) {
-        d.selectedIndex = search_day;
-    }
+        if (m.selectedIndex == 0) {
+            m.selectedIndex = this.search_date.m;
+        }
 
-    if (y.value == "") {
-        y.value = search_year;
-    }
-}
-
-function formCheck()
-{
-    if (not_search &&
-        (!$('preselected_folders') || !$F('preselected_folders'))) {
-        if (!Form.getInputs('search', null, 'search_folders[]').detect(function(e) { return e.checked; })) {
-            alert(IMP.text.search_select);
-            return false;
+        if (d.selectedIndex == 0) {
+            d.selectedIndex = this.search_date.d;
+        }
+
+        if (y.value == "") {
+            y.value = this.search_date.y;
+        }
+    },
+
+    _formCheck: function()
+    {
+        if (this.not_search &&
+            (!$('preselected_folders') || !$F('preselected_folders'))) {
+            if (!Form.getInputs('search', null, 'search_folders[]').detect(function(e) { return e.checked; })) {
+                alert(IMP.text.search_select);
+                return;
+            }
+        }
+
+        $('actionID').setValue('do_search');
+    },
+
+    _reset: function()
+    {
+        $('actionID').setValue('reset_search');
+        $('search').submit();
+    },
+
+    _saveCache: function()
+    {
+        $('edit_query').setValue($F('save_cache'));
+        $('search').submit();
+    },
+
+    _deleteField: function(i)
+    {
+        $('delete_field_id').setValue(i);
+        $('actionID').setValue('delete_field');
+        $('search').submit();
+    },
+
+    _showSubscribed: function(i)
+    {
+        $('show_subscribed_only').setValue(i);
+        $('search').submit();
+    },
+
+    changeHandler: function(e)
+    {
+        var id = e.element().readAttribute('id');
+
+        switch (id) {
+        case 'save_cache':
+            this._saveCache();
+            break;
+
+        default:
+            if (id.startsWith('field_')) {
+                $('search').submit();
+            } else if (id.startsWith('search_date_')) {
+                this._dateCheck('on');
+            }
+            break;
+        }
+    },
+
+    clickHandler: function(e)
+    {
+        var elt = e.element();
+
+        if (elt.hasClassName('searchSubmit')) {
+            this._formCheck();
+        } else if (elt.hasClassName('searchReset')) {
+            this._reset();
+        } else if (elt.hasClassName('searchDelete')) {
+            this._deleteField(elt.readAttribute('fid'));
+        } else {
+            switch (elt.readAttribute('id')) {
+            case 'link_sel_all':
+                this._toggleAll(true);
+                break;
+
+            case 'link_sel_none':
+                this._toggleAll(false);
+                break;
+
+            case 'link_sub':
+                this._showSubscribed(this.inverse_sub);
+                break;
+
+            case 'search_match_and':
+            case 'search_match_or':
+                if ($('field_1')) {
+                    $('search').submit();
+                }
+                break;
+            }
         }
     }
 
-    $('actionID').setValue('do_search');
-    return true;
-}
-
-function search_reset()
-{
-    $('actionID').setValue('reset_search');
-    $('search').submit();
-    return true;
-}
-
-function saveCache()
-{
-    $('edit_query').setValue($F('save_cache'));
-    $('search').submit();
-}
-
-function delete_field(i)
-{
-    $('delete_field_id').setValue(i);
-    $('actionID').setValue('delete_field');
-    $('search').submit();
-    return true;
-}
-
-function show_subscribed(i)
-{
-    $('show_subscribed_only').setValue(i);
-    $('search').submit();
-    return false
-}
+};
+
+document.observe('change', ImpSearch.changeHandler.bind(ImpSearch));
+document.observe('click', ImpSearch.clickHandler.bind(ImpSearch));
index cde4248..7529acf 100644 (file)
@@ -26,6 +26,8 @@ $search_mailbox = Util::getFormData('search_mailbox');
 
 $imp_search_fields = $imp_search->searchFields();
 
+$charset = NLS::getCharset();
+
 /* Get URL parameter data. */
 $search = array();
 if (Util::getFormData('no_match')) {
@@ -155,7 +157,6 @@ if (!$edit_query_vfolder) {
     }
 }
 $t->set('search_help', Help::link('imp', 'search'));
-$t->set('field_end', $search['field_end'] > 0);
 $t->set('match_or', $search['match'] == 'or');
 $t->set('label_or', Horde::label('search_match_or', _("Match Any Query")));
 $t->set('match_and', ($search['match'] == null) || ($search['match'] == 'and'));
@@ -213,7 +214,7 @@ for ($i = 0; $i <= $search['field_end']; $i++) {
             $fields[$i]['s_fields'][$curr]['sel'] = true;
             if (in_array($imp_search_fields[$curr]['type'], array(IMP_Search::HEADER, IMP_Search::BODY, IMP_Search::TEXT, IMP_Search::SIZE))) {
                 $fields[$i]['search_text'] = true;
-                $fields[$i]['search_text_val'] = (!empty($search['text'][$i])) ? @htmlspecialchars($search['text'][$i], ENT_COMPAT, NLS::getCharset()) : null;
+                $fields[$i]['search_text_val'] = (!empty($search['text'][$i])) ? @htmlspecialchars($search['text'][$i], ENT_COMPAT, $charset) : null;
                 if ($retrieve_search &&
                     ($imp_search_fields[$curr]['type'] == IMP_Search::SIZE)) {
                     $fields[$i]['search_text_val'] /= 1024;
@@ -291,7 +292,7 @@ $t->set('mbox', htmlspecialchars($search['mbox']));
 $t->set('virtualfolder', $_SESSION['imp']['protocol'] != 'pop');
 if ($t->get('virtualfolder')) {
     $t->set('save_vfolder', !empty($search['save_vfolder']));
-    $t->set('vfolder_label', !empty($search['vfolder_label']) ? htmlspecialchars($search['vfolder_label'], ENT_COMPAT, NLS::getCharset()) : null);
+    $t->set('vfolder_label', !empty($search['vfolder_label']) ? htmlspecialchars($search['vfolder_label'], ENT_COMPAT, $charset) : null);
 }
 
 if (empty($search['mbox'])) {
@@ -332,17 +333,17 @@ if (empty($search['mbox'])) {
 }
 
 $title = _("Message Search");
-Horde::addScriptFile('stripe.js', 'horde', true);
 Horde::addScriptFile('prototype.js', 'horde', true);
+Horde::addScriptFile('stripe.js', 'horde', true);
 Horde::addScriptFile('search.js', 'imp', true);
 require IMP_TEMPLATES . '/common-header.inc';
 IMP::menu();
 IMP::status();
+
 IMP::addInlineScript(array(
-    'var search_month = \'' . date('m') . '\'',
-    'var search_day = \'' . date('d') . '\'',
-    'var search_year = \'' . date('Y') . '\'',
-    'var not_search = ' . intval(empty($search['mbox'])),
+    'ImpSearch.search_date = ' . Horde_Serialize::serialize(array('m' => date('m'), 'd' => date('d'), 'y' => date('Y')), SERIALIZE_JSON, $charset),
+    'ImpSearch.not_search = ' . intval(empty($search['mbox'])),
+    'ImpSearch.inverse_sub = ' . intval($t->get('inverse_subscribe')),
 ));
 echo $t->fetch(IMP_TEMPLATES . '/search/search.html');
 require $registry->get('templates', 'horde') . '/common-footer.inc';
index 2fd9aaf..d97beac 100644 (file)
@@ -22,8 +22,8 @@
 </h1>
 
 <div>
- <input type="submit" class="button" value="<if:edit_query_vfolder><gettext>Save</gettext><else:edit_query_vfolder><gettext>Submit</gettext></else:edit_query_vfolder></if:edit_query_vfolder>" onclick="return formCheck();" />
- <input type="button" class="button" value="<gettext>Reset</gettext>" onclick="return search_reset();" />
+ <input type="submit" class="button searchSubmit" value="<if:edit_query_vfolder><gettext>Save</gettext><else:edit_query_vfolder><gettext>Submit</gettext></else:edit_query_vfolder></if:edit_query_vfolder>" />
+ <input type="button" class="button searchReset" value="<gettext>Reset</gettext>" />
 </div>
 
 <if:saved_searches>
@@ -33,7 +33,7 @@
 
 <div class="item">
  <label for="save_cache" class="hidden"><gettext>Recent Searches:</gettext></label>
- <select id="save_cache" name="save_cache" onchange="saveCache();">
+ <select id="save_cache" name="save_cache">
   <option value=""><gettext>Recent Searches:</gettext></option>
 <loop:saved_searches>
   <option value="<tag:saved_searches.val />"><tag:saved_searches.text /></option>
@@ -47,9 +47,9 @@
 </div>
 
 <div class="item">
- <input type="radio" class="checkbox" name="search_match" id="search_match_or" value="or"<if:field_end> onchange="$('search').submit();return true;" onclick="$('search').submit();return true;"</if:field_end><if:match_or> checked="checked"</if:match_or> />
+ <input type="radio" class="checkbox" name="search_match" id="search_match_or" value="or"<if:match_or> checked="checked"</if:match_or> />
  <em><tag:label_or /></em>
- <input type="radio" class="checkbox" name="search_match" id="search_match_and" value="and"<if:field_end> onchange="$('search').submit();return true;" onclick="$('search').submit();return true;"</if:field_end><if:match_and> checked="checked"</if:match_and> />
+ <input type="radio" class="checkbox" name="search_match" id="search_match_and" value="and"<if:match_and> checked="checked"</if:match_and> />
  <em><tag:label_and /></em>
 
 <table class="item" cellspacing="0">
@@ -63,7 +63,7 @@
 </else:fields.first></if:fields.first>
   <td>
    <label for="field_<tag:fields.i />" class="hidden"><gettext>Select a field</gettext></label>
-   <select onchange="$('search').submit();return true;" name="field[<tag:fields.i />]" id="field_<tag:fields.i />">
+   <select name="field[<tag:fields.i />]" id="field_<tag:fields.i />">
 <if:fields.last>
     <option value=""><gettext>Select a field</gettext></option>
     <option value="" disabled="disabled">- - - - - - - - -</option>
 </loop:fields.month>
    </select>
    <label for="search_date_<tag:fields.i />_day" class="hidden"><gettext>Day</gettext></label>
-   <select id="search_date_<tag:fields.i />_day" name="search_date[<tag:fields.i />][day]" onchange="dateCheck('on')">
+   <select id="search_date_<tag:fields.i />_day" name="search_date[<tag:fields.i />][day]">
 <loop:fields.day>
     <option value="<tag:fields.day.val />" <if:fields.day.sel>selected="selected" </if:fields.day.sel>><tag:fields.day.val /></option>
 </loop:fields.day>
    </select>
    <label for="search_date_<tag:fields.i />_year" class="hidden"><gettext>Year</gettext></label>
-   <select id="search_date_<tag:fields.i />_year" name="search_date[<tag:fields.i />][year]" onchange="dateCheck('on')">
+   <select id="search_date_<tag:fields.i />_year" name="search_date[<tag:fields.i />][year]">
 <loop:fields.year>
     <option value="<tag:fields.year.val />" <if:fields.year.sel>selected="selected"</if:fields.year.sel>><tag:fields.year.val /></option>
 </loop:fields.year>
   <td>&nbsp;</td>
 </if:fields.i>
 <else:fields.last>
-  <td><input type="image" class="image" src="<tag:delete_img />" onclick="return delete_field(<tag:fields.i />);" value="<tag:remove />" /></td>
+  <td><input type="image" class="image searchDelete" fid="<tag:fields.i />" src="<tag:delete_img />" value="<tag:remove />" /></td>
 </else:fields.last></if:fields.last>
  </tr>
 </loop:fields>
 </div>
 
 <div class="item">
- <a href="#" onclick="toggleAll(true); return false;"><gettext>Select all</gettext></a> |
- <a href="#" onclick="toggleAll(false); return false;"><gettext>Select none</gettext></a>
+ <a id="link_sel_all" href="#"><gettext>Select all</gettext></a> |
+ <a id="link_sel_none" href="#"><gettext>Select none</gettext></a>
 <if:subscribe>
- | <a href="#" onclick="return show_subscribed('<tag:inverse_subscribe />');"><if:inverse_subscribe><gettext>Show Only Subscribed Folders</gettext><else:inverse_subscribe><gettext>Show All Folders</gettext></else:inverse_subscribe></if:inverse_subscribe></a>
+ | <a id="link_sub" href="#"><if:inverse_subscribe><gettext>Show Only Subscribed Folders</gettext><else:inverse_subscribe><gettext>Show All Folders</gettext></else:inverse_subscribe></if:inverse_subscribe></a>
 </if:subscribe>
 </div>
 
 </if:virtualfolder>
 
 <div>
- <input type="submit" class="button" value="<if:edit_query_vfolder><gettext>Save</gettext><else:edit_query_vfolder><gettext>Submit</gettext></else:edit_query_vfolder></if:edit_query_vfolder>" onclick="return formCheck();" />
- <input type="button" class="button" value="<gettext>Reset</gettext>" onclick="return search_reset();" />
+ <input type="submit" class="button searchSubmit" value="<if:edit_query_vfolder><gettext>Save</gettext><else:edit_query_vfolder><gettext>Submit</gettext></else:edit_query_vfolder></if:edit_query_vfolder>" />
+ <input type="button" class="button searchReset" value="<gettext>Reset</gettext>" />
 </div>
 </form>