this.insertDate(c.t, c.v);
break;
+ case 'within':
+ this.insertWithin(c.t, c.v);
+ break;
+
case 'flag':
this.insertFlag(c.v);
break;
this.insertDate(val);
break;
+ case 'within':
+ this.insertWithin(val);
+ break;
+
case 'flag':
this.insertFlag(val);
break;
this.criteria[id] = { t: type, v: data };
},
+ insertWithin: function(id, data)
+ {
+ data = data || { l: '', v: '' };
+
+ var tmp = [
+ new Element('EM').insert(this.getLabel(id)),
+ new Element('INPUT', { type: 'text', size: 8 }).setValue(data.v),
+ $($('within_criteria').cloneNode(true)).writeAttribute({ id: null }).show().setValue(data.l)
+ ];
+ this.criteria[this.insertCriteria(tmp)] = { t: id };
+ },
+
insertFlag: function(id)
{
var tmp = [
data.push(this.criteria[c]);
break;
+ case 'within':
+ this.criteria[c].v = { l: $F($(c).down('SELECT')), v: parseInt($F($(c).down('INPUT')), 10) };
+ data.push(this.criteria[c]);
+ break;
+
case 'flag':
data.push({ t: 'flag', v: this.criteria[c].t });
break;
* array(
* stdClass object {
* 't' => (string) 'Type' - The criteria type
- * Values: header, customhdr, body, text, date, size, flag
+ * Values: header, customhdr, body, text, date, within, size,
+ * flag
* 'v' => (mixed) 'Value' - The data used to build the search
* 'header' - (string) The value to search for in the header
* 'customhdr' - (stdClass object) Contains 2 elements:
* 'm' - (integer) The search month (is 1 less than
* the actual month)
* 'd' - (integer) The search day
+ * 'within' - (stdClass object) Contains 2 elements:
+ * 'l' - (string) The length of time. Either 'y'
+ * (years), 'm' (months), or 'd' (days)
+ * 'v' - (integer) The length of time
* 'size' - (integer) The search size in bytes
* 'flag' - (string) The flag to search for
* 'n' => (boolean) 'Not' - Should we do a not search?
'type' => 'date',
'not' => true
),
+ 'older' => array(
+ 'label' => _("Older Than"),
+ 'type' => 'within',
+ 'not' => true
+ ),
+ 'younger' => array(
+ 'label' => _("Younger Than"),
+ 'type' => 'within',
+ 'not' => true
+ ),
// Displayed in KB, but stored internally in bytes
'size_smaller' => array(
'label' => _("Size (KB) <"),
}
break;
+ case 'customhdr':
+ $text_array[] = sprintf("%s for '%s'", $rule->v->h, ((!empty($rule->n)) ? _("not") . ' ' : '') . $rule->v->s);
+ break;
+
case 'date':
$text_array[] = sprintf("%s '%s'", $searchfields[$field]['label'], strftime("%x", mktime(0, 0, 0, $rule->v->m + 1, $rule->v->d, $rule->v->y)));
break;
- case 'size':
- $text_array[] = $searchfields[$field]['label'] . ' ' . ($rule->v / 1024);
+ case 'within':
+ $text_array[] = sprintf("%s %u %s", $searchfields[$field]['label'], $rule->v->v, $rule->v->l == 'y' ? _("years") : ($rule->v->l == 'm' ? _("months") : _("days")));
break;
- case 'customhdr':
- $text_array[] = sprintf("%s for '%s'", $rule->v->h, ((!empty($rule->n)) ? _("not") . ' ' : '') . $rule->v->s);
+ case 'size':
+ $text_array[] = $searchfields[$field]['label'] . ' ' . ($rule->v / 1024);
break;
default:
}
break;
+ case 'within':
+ /* Limited to day granularity because that is the technical
+ * limit for IMAP servers without 'WITHIN' extension. */
+ if (!empty($rule->v)) {
+ $secs = $rule->v->v * 60 * 60 * 24;
+
+ switch ($rule->v->l) {
+ case 'y':
+ $secs *= 365;
+ break;
+
+ case 'm':
+ $secs *= 30;
+ break;
+ }
+
+ $ob->intervalSearch($secs, $rule->t == 'older' ? Horde_Imap_Client_Search_Query::INTERVAL_OLDER : Horde_Imap_Client_Search_Query::INTERVAL_YOUNGER);
+ $search_array[] = $ob;
+ }
+ break;
+
case 'size':
if (!empty($rule->v)) {
$ob->size(intval($rule->v), $rule->t == 'size_larger');