source: sandbox/2.5.1-evolucao/expressoMail1_2/js/MAQueryConfig.js @ 7447

Revision 7447, 19.2 KB checked in by fernando, 11 years ago (diff)

Ticket #3088 - corrigido na busca avançada as flags de importante e não importante

Line 
1<!--
2/**
3 *MailArchiver Query Config API
4 *
5 *This api is intended to be used with MailArquiver JavaScript API.
6 *Basicly, it is responsable to provide a standard data format conversion
7 *to handle queryes under MailArquiver web services pooling. *
8 *
9 */
10
11
12//MailArchiver Query Config data structure
13var MAQueryConfig = function(){
14  this.lowerIndex = null;
15  this.upperIndex = null;
16  this.from = null;
17  this.to = null;
18  this.cc = null;
19  this.subject = null;
20  this.body = null;
21  this.date = null;
22  this.dateLower = null;
23  this.dateUpper = null; 
24  this.tag = null;
25  this.folder = null;
26  this.folder_recursive = null;
27  this.order = null;
28  this.preview_message = null;
29  this.preview_tooltip = null;
30  this.defaults = null;
31}
32
33//Set up all criteria list received
34MAQueryConfig.prototype.setCriteriaList = function(cl){
35  //window.alert('dumpando setCriteriaList:\n' + print_r(cl));
36  for(var p in cl){
37    //window.alert('p = ' + p + '\ncl = ' + cl + '\ncl[p] = ' + cl[p] + '\np[cl] = ' + p[cl]);
38    //Decode the criteria for search.
39    cl[p] = url_decode_s(cl[p]);
40    if(p.toLowerCase() == 'all')
41      this.setSubject(cl[p]);
42    if(p.toLowerCase() == 'lowerindex')
43      this.setLowerIndex(cl[p]);   
44    if(p.toLowerCase() == 'upperindex')
45      this.setUpperIndex(cl[p]);     
46    if(p.toLowerCase() == 'from')
47      this.setFrom(cl[p]);
48    if(p.toLowerCase() == 'to')
49      this.setTo(cl[p]);
50    if(p.toLowerCase() == 'cc')
51      this.setCc(cl[p]);
52    if(p.toLowerCase() == 'subject')
53      this.setSubject(cl[p]);
54    if(p.toLowerCase() == 'body')
55      this.setBody(cl[p]);
56    if(p.toLowerCase() == 'on')
57      this.setDate('on',cl[p]);
58    if(p.toLowerCase() == 'since')
59      this.setDate('lower',cl[p]); 
60    if(p.toLowerCase() == 'before')
61      this.setDate('upper',cl[p]); 
62    if(p.toLowerCase() == 'flags')
63      this.setTag(cl[p]);
64    if(p.toLowerCase() == 'folder')
65      this.setFolder(cl[p]);
66    if(p.toLowerCase() == 'order')
67      this.setOrder(cl[p]);
68
69    //search tags window criteria mapping
70    if(p.toLowerCase() == 'flagged'){
71        var oexptag = eval('({"contains":"flagged"})');
72        this.setTags(oexptag);       
73    }
74    if(p.toLowerCase() == 'unflagged'){
75        var oexptag = eval('({"contains":"unflagged"})');
76        this.setTags(oexptag);       
77    }   
78    if(p.toLowerCase() == 'seen'){       
79        var oexptag = eval('({"contains":"seen"})');
80        this.setTags(oexptag);               
81    }   
82    if(p.toLowerCase() == 'unseen'){
83        var oexptag = eval('({"contains":"unseen"})');
84        this.setTags(oexptag);               
85    }
86    if(p.toLowerCase() == 'answered'){
87        var oexptag = eval('({"contains":"answered"})');
88        this.setTags(oexptag);               
89    }       
90    if(p.toLowerCase() == 'unanswered'){
91        var oexptag = eval('({"contains":"unanswered"})');
92        this.setTags(oexptag);               
93    }           
94  }
95}
96
97MAQueryConfig.prototype.setDefaults = function(defaults){
98    this.defaults = defaults;
99}
100
101MAQueryConfig.prototype.setExpressoDefaults = function(data_default){
102    //Expresso defaults came from "messages_controller.js": here, we maps
103    //each array entry from messages_list intended to run by our own behavior
104    if(data_default.length != 8)
105        return;
106   //expresso default argument list => new Array(baseFolder,msg_range_begin,emails_per_page,sort_box_type,search_box_type, sort_box_reverse,preview_msg_subject,preview_msg_tip);
107   this.setFolder(data_default[0]);
108   this.setLowerIndex(data_default[1]);
109   this.setUpperIndex(data_default[2]);
110   
111   if (parseInt(data_default[5]) == 0)
112       var oexpor = 'asc';
113   else
114       var oexpor = 'desc';
115   
116   //window.alert('NO MAQueryconfig setExpressoDefaults\n\nbase_folder = ' + data_default[0] + '\nmsg_range_begin = ' + data_default[1] + '\nemails_per_page = ' + data_default[2] + '\nsort_box_type =' + data_default[3].toLowerCase() + '\nsearch_box_type= ' + data_default[4] + '\nsort_box_reverse = ' + data_default[5] + '\npreview_msg_subject = ' + data_default[6] + '\npreview_msg_tip = ' + data_default[7]);
117   
118   //sets tag data filter
119   switch(data_default[4].toLowerCase()){
120    case 'all':
121        var tagtolist_criteria = 'contains';
122        var tagtolist_value = 'all';
123        break;
124    case 'unseen':
125        var tagtolist_criteria = 'contains';
126        var tagtolist_value = 'unseen';
127        break;
128    case 'seen':
129        var tagtolist_criteria = 'contains';
130        var tagtolist_value = 'seen';       
131        break;
132    case 'answered':
133        var tagtolist_criteria = 'contains';
134        var tagtolist_value = 'answered';       
135        break;
136    case 'unanswered':
137        var tagtolist_criteria = 'contains';
138        var tagtolist_value = 'unanswered';       
139        break;       
140    case 'flagged':
141        var tagtolist_criteria = 'contains';
142        var tagtolist_value = 'flagged';       
143        break; 
144    case 'unflagged':
145        var tagtolist_criteria = 'contains';
146        var tagtolist_value = 'unflagged';       
147        break;       
148    default:
149        var tagtolist_criteria = null;
150        var tagtolist_value = null;       
151   }
152
153   //sets TagConfig
154   var oexptag = eval('({"' + tagtolist_criteria + '":"' + tagtolist_value + '"})');
155   this.setTags(oexptag);
156
157
158   //sets order criteria
159   switch(data_default[3].toLowerCase()){
160       case 'sortfrom':
161           var oexpcrt = 'from';
162           break;
163       case 'sortsubject':
164           var oexpcrt = 'subject';
165           break;
166       case 'sortsize':
167           var oexpcrt = 'size';
168           break;
169       default:
170           var oexpcrt = 'date';
171           break;
172   }   
173
174   var oexporder = eval('({"' + oexpcrt + '":"' + oexpor + '"})');
175   this.setOrder(oexporder);
176}
177
178//PharseCriteria receives data to pharse structure format fields from, to, cc and subject
179MAQueryConfig.prototype.pharseCriteria = function(field, data, criteria){
180  //window.alert('pharseCriteria input data:\n\n-> field = ' + field + '\ndata = ' + data + '\ncriteria = ' + criteria);
181  if(!criteria)
182      criteria = 'none';
183 
184  var stdout = '"'+field+'":[';
185  switch (criteria.toLowerCase()){
186      case "equals":
187          stdout += '{"@equals":"'+data+'"},';
188          break;
189      case "equalsic":
190          stdout += '{"@equalsIgnoreCase":"'+data+'"},';
191          break;
192      case "like":
193          stdout += '{"@like":"'+data.like+'"},';
194          break;
195      default:
196          stdout+= '{"@likeIgnoreCase":"'+data+'"},';
197  }
198  stdout = stdout.substr(0,stdout.length-1) + '],';
199  return(stdout);
200}
201
202//setbounds up and down
203MAQueryConfig.prototype.setLowerIndex = function(low){
204  //window.alert('setbounds low = ' + low + ' high = ' + high);
205  this.lowerIndex = '"@lowerIndex":"'+(parseInt(low)-1)+'", ';
206}
207
208MAQueryConfig.prototype.setUpperIndex = function(high){
209  //window.alert('setbounds low = ' + low + ' high = ' + high);
210  this.upperIndex = '"@upperIndex":"'+(parseInt(high))+'", ';
211}
212 
213//From receives a array of structutred data, by the model
214MAQueryConfig.prototype.setFrom = function(data){
215  if(data.length <= 0){
216    this.from = null;
217    return;
218  }
219 
220  //subdata = this.pharseCriteria('from', data);
221  this.from = '"@from":"' + data + '",';
222}
223
224//To receives a array of structutred data, by the model
225MAQueryConfig.prototype.setTo = function(data){
226  if(data.length <= 0){
227    this.to = null;
228    return;
229  }
230
231  //subdata = this.pharseCriteria('to', data);
232  this.to = '"@to":"' + data + '",';
233}
234
235//Cc data
236MAQueryConfig.prototype.setCc = function(data){
237  if(data.length <= 0){
238    this.cc = null;
239    return;
240  }
241
242  //subdata = this.pharseCriteria('cc', data);
243  this.cc = '"@cc":"' + data + '",';
244}
245
246//Subject data
247MAQueryConfig.prototype.setSubject = function(sub){
248  if(sub.length <= 0){
249    this.subject = null;
250    return;
251  }
252
253  //subdata = this.pharseCriteria('subject', sub);
254  this.subject = '"@subject":"' + sub + '",';
255}
256
257//PREGMatch date format
258MAQueryConfig.prototype.validateDate = function (dat){
259 var dateregex = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
260 if (dateregex.test(dat))
261   return true;
262 else
263   return false;
264}
265
266//PREGMatch time format
267MAQueryConfig.prototype.validateTime = function (tim){
268  //var timeregex = /^([1-9]|1[0-2]):[0-5]\d(:[0-5]\d(\.\d{1,3})?)?$/;
269  //var timeregex = /^[0-2][0-9]:[0-5][0-9]:[0-5][0-9]$/;
270  var timeregex = /^\d{1,2}[:]\d{2}([:]\d{2})?$/;
271  if (timeregex.test(tim))
272    return true;
273  else
274    return false;
275}
276
277//toStdDate returns date time as long. Format input:'DD/MM/YYYY HH:MM:SS'
278MAQueryConfig.prototype.toStdDate = function(dt){
279  if (dt.length <= 0)
280    return;
281
282  var date_time_picker = dt.split(" ");
283  var date_part = date_time_picker[0];
284  var time_part = date_time_picker[1];
285
286  //window.alert('date_part = ' + date_time_picker[0] + '\ntime_part = ' + date_time_picker[1]);
287
288  if ((this.validateDate(date_part)) /*&& (this.validateTime(time_part))*/){
289    var date_split = date_part.split("/");
290    var ddd = date_split[1]+'/'+date_split[0]+'/'+date_split[2] + ' ' + (time_part ? time_part : '00:00');
291    var ndate = new Date(ddd);   
292   
293    //window.alert('Date.parse (' + ddd + ') = ' + Date.parse(ndate));
294    return Math.round(ndate.getTime());//(Date.parse());
295  }
296  else
297    return("");
298}
299
300//Date data
301MAQueryConfig.prototype.setDate = function(date_field, date_data){
302  if((!date_field) || (!date_data)){
303    this.date = null;
304    this.dateLower = null;
305    this.dateUppder = null;
306    return;
307  }
308   
309  if(date_field == 'lower'){
310    if(date_data.indexOf('%') != -1)
311        var dt1b = this.pharseStdDate(date_data);
312    else
313        var dt1b = this.toStdDate(date_data);
314    this.dateLower = '"@lowerDate":"'+dt1b+'",';
315  }
316  if(date_field == 'upper'){
317    if(date_data.indexOf('%') != -1)
318        var dt2b = this.pharseStdDate(date_data);
319    else
320        var dt2b = this.toStdDate(date_data);
321    this.dateUpper = '"@upperDate":"'+dt2b+'",';
322  }
323  if(date_field == 'on'){
324    if(date_data.indexOf('%') != -1)
325        var dt3b = this.pharseStdDate(date_data);
326    else
327        var dt3b = this.toStdDate(date_data);
328    this.date = '"@date":"'+dt3b+'",';
329  }
330}
331
332//flags data
333MAQueryConfig.prototype.setTag = function(flaglist){
334  if(flaglist.flags.length <= 0){
335    this.tag = null;
336    return;
337  }
338
339  this.tag = '"flag":[';
340  var flag_data = flaglist.flags.split(',');
341  if(flag_data.length > 0){
342    for(var k=0; k<flag_data.length; k++){
343      this.tag += '{"@value":"'+flag_data[k]+'"},'
344    }
345    this.tag = this.tag.substr(0,this.tag.length-1);
346  }
347  else{
348    this.tag += '{"@value":"'+flaglist.flags+'"},';
349  }
350  this.tag += '],';
351
352}
353
354//Folder data
355MAQueryConfig.prototype.setFolder = function(folderslist){
356  if(folderslist.length <= 0){
357    this.folder = null;
358    return;
359  }
360  this.folder = '"folder":[';
361  if(this.folder_recursive){
362      var pfrec = ', "@recursive":"true"';
363  }
364  else
365      var pfrec = '';
366 
367  if (folderslist.indexOf(',') != -1){
368    var folder_data = folderslist.split(',');
369    if(folder_data.length > 0){
370        for(var k=0; k<folder_data.length; k++){
371            this.folder += '{"@id":"'+folder_data[k]+'"' + pfrec + '},'
372        }
373        this.folder = this.folder.substr(0,this.folder.length-1);
374    }
375    else{
376        this.folder += '{"@id":"'+folderslist+'"' + pfrec + '"}';
377    }
378  }
379  else{
380      this.folder += '{"@id":"' + folderslist +'"' + pfrec + '}';
381  }
382  this.folder += '],';
383}
384
385//Order criteria
386MAQueryConfig.prototype.setOrder = function(order){
387  if(typeof(order) != 'object'){
388    this.order = null;
389    return;
390  }
391
392  this.order = '"order":[';
393  for(var k in order){
394    if(k.toLowerCase().indexOf("date") != -1)
395      this.order += '{"@date":"'+order[k]+'"},';
396    if(k.toLowerCase().indexOf("from") != -1)
397      this.order += '{"@from":"'+order[k]+'"},';
398    if(k.toLowerCase().indexOf("subject") != -1)
399      this.order += '{"@subject":"'+order[k]+'"},';
400    if(k.toLowerCase().indexOf("size") != -1)
401      this.order += '{"@size":"'+order[k]+'"},';
402  }
403  this.order = this.order.substr(0,this.order.length-1) + ']';
404}
405
406//Tags criteria
407MAQueryConfig.prototype.setTags = function(taglist){
408  if(typeof(taglist) != 'object'){
409    this.tag = null;
410    return;
411  }
412  //Adding tag criteria
413  if(taglist.contains == "all"){
414    this.tag = null;
415  } else {
416      this.tag = '"tags":[';
417      //if(get_current_folder().indexOf("local") != "-1"){
418          for(var k in taglist){
419            if(k != null){
420                    this.tag += '{"@contains":"'+taglist[k]+'"}],';
421            }
422          }
423      //}
424  }
425/*
426  if(this.tag != null)
427    this.tag = this.tag.substr(0, this.tag.length-2) + ', ';
428  //Creating tag criteria
429  else
430    this.tag = '"tags":[';
431 
432  for(var k in taglist){
433    if(k != null){
434        if(k.toLowerCase() == "contains"){
435            this.tag += '{"@contains":"'+taglist[k]+'"},';
436        }
437    }
438  }
439  //if no tag data was parametrizided, no one tag data will be returned
440  if(this.tag.length > 8)
441    this.tag = this.tag.substr(0,this.tag.length-1) + '],';
442  else
443    this.tag = null;
444  //if no tag data was parametrizided, no one tag data will be returned
445  */
446}
447
448//Body structrure
449MAQueryConfig.prototype.setBody = function(data){
450/*  if(body_data.length <= 0){
451    this.body = null;
452    return;
453  }
454  this.body = '"body":[';
455  for(var k in body_data){
456    if(k.toLowerCase() == "like")
457      this.body += '{"@like":"'+body_data[k]+'"},';
458    if(k.toLowerCase() == "likeic")
459      this.body += '{"@likeIgnoreCase":"'+body_data[k]+'"},';
460  }
461  this.body = this.body.substr(0,this.body.length-1) + '],';
462  */
463  if(data.length <= 0){
464    this.body = null;
465    return;
466  }
467 
468  //subdata = this.pharseCriteria('from', data);
469  this.body = '"@body":"' + data + '",'; 
470}
471
472MAQueryConfig.prototype.pharseSearchFields = function(fields){
473   if(fields.length <= 0)
474       return;
475   
476   var filters = fields.replace(/^##|##$/g,"").split('##');
477   if(filters.length > 0){
478     var filter_object = '{' ;
479     for(var k=0; k<filters.length; k++){
480       var filter_entry = filters[k].split('<=>');
481       filter_object += filter_entry[0].toLowerCase() + ':"' + filter_entry[1] + '", ';
482     }
483     filter_object = filter_object.substr(0, filter_object.length-2);
484     filter_object += '}';
485     return(filter_object);
486   }
487   else
488       return;
489}
490
491MAQueryConfig.prototype.pharseFolders = function(folderslist){
492    var folder_string_list = "";
493    if (folderslist.length > 1){
494        for(var k=0; k<folderslist.length; k++){
495            var f_criteria = folderslist[k].split("#");
496            var f_name = f_criteria[0];
497            var f_recursive = f_criteria[1];
498            folder_string_list += f_name + ',';
499        }
500        folder_string_list = folder_string_list.substr(0, folder_string_list.length-1) + '#' + f_recursive + ',';
501        folder_string_list = folder_string_list.substr(0, folder_string_list.length-1);
502    }
503    else{
504        folder_string_list = folderslist[0];
505    }
506    //window.alert('pharsefolders return = ' + folder_string_list);
507    return(folder_string_list);
508}
509
510MAQueryConfig.prototype.getLowerIndex = function(){
511  //  (this.lowerIndex != null) ? retdata = this.lowerIndex : retdata = '"@lowerIndex":"0", ';
512    (this.lowerIndex != null) ? retdata = this.lowerIndex : retdata = '';
513    return(retdata);
514}
515
516MAQueryConfig.prototype.getUpperIndex = function(){
517//    (this.upperIndex != null) ? retdata = this.upperIndex : retdata = '"@upperIndex":"' + preferences.max_email_per_page+ '", ';
518    (this.upperIndex != null) ? retdata = this.upperIndex : retdata = '';
519    return(retdata);
520}
521
522MAQueryConfig.prototype.getFrom = function(){
523    (this.from != null) ? retdata = this.from : retdata = "";
524    return(retdata);
525}
526
527MAQueryConfig.prototype.getTo = function(){
528    (this.to != null) ? retdata = this.to : retdata = "";
529    return(retdata);   
530}
531
532MAQueryConfig.prototype.getCc = function(){
533    (this.cc != null) ? retdata = this.cc : retdata = "";
534    return(retdata);   
535}
536
537MAQueryConfig.prototype.getSubject = function(){
538    (this.subject != null) ? retdata = this.subject : retdata = "";
539    return(retdata);   
540}
541
542MAQueryConfig.prototype.getBody = function(){
543    (this.body != null) ? retdata = this.body : retdata = "";
544    return(retdata);   
545}
546
547MAQueryConfig.prototype.getDate = function(){
548    (this.date != null) ? retdata = this.date : retdata = "";
549    return(retdata);   
550}
551
552MAQueryConfig.prototype.getDateLower = function(){
553    (this.dateLower != null) ? retdata = this.dateLower : retdata = "";
554    return(retdata);   
555}
556
557MAQueryConfig.prototype.getDateUpper = function(){
558    (this.dateUpper != null) ? retdata = this.dateUpper : retdata = "";
559    return(retdata);   
560}
561
562MAQueryConfig.prototype.getTag = function(){
563    (this.tag != null) ? retdata = this.tag : retdata = "";
564    return(retdata);   
565}
566
567MAQueryConfig.prototype.getFolder = function(){
568    if (this.folder != null){
569        if (this.folder_recursive){
570            var tmp_root_id = this.folder.substr(this.folder.indexOf("@id")+6, 4);
571            if(tmp_root_id == 'root')
572                retdata = "";
573            else
574                retdata = this.folder;
575        }
576        else
577            retdata = this.folder;
578    }
579    else retdata = "";
580    return(retdata);   
581}
582
583MAQueryConfig.prototype.getOrder = function(){
584    //defaults order criteria is date asc
585    (this.order != null) ? retdata = this.order : retdata = '"order":[{"@date":"desc"}]';
586    return(retdata);   
587}
588
589//Query criteria (core api)
590MAQueryConfig.prototype.query = function(criterialist){
591  //window.alert('MAQueryConfig.query\n\n - > CriteriaList:\n ' + criterialist + '[' + typeof(criterialist) + ']\ndump:\n' + print_r(criterialist));
592
593  if (criterialist){
594    this.setCriteriaList(criterialist);
595  }
596 
597  //window.alert('em qc.query com lower = ' + this.lowerIndex + ' e upper = ' + this.upperIndex);
598  var querystring = '{"query":{';
599  querystring += this.getLowerIndex();
600  querystring += this.getUpperIndex();
601  querystring += this.getDateLower();
602  querystring += this.getDateUpper();
603  querystring += this.getDate(); 
604  querystring += this.getFrom();
605  querystring += this.getTo();
606  querystring += this.getCc();
607  querystring += this.getSubject();
608  querystring += this.getBody();
609  querystring += this.getTag();
610  querystring += this.getFolder();
611  querystring += this.getOrder();
612 
613  var lastchar = querystring.substr(querystring.length-1,querystring.length);
614  if(lastchar == ',')
615      querystring = querystring.substr(0, querystring.length-1);
616 
617  querystring += '}}';
618  //window.alert('queryconfig output\n\n' + querystring);
619  return(querystring);
620}
621
622MAQueryConfig.prototype.reset = function(){
623  this.lowerIndex = null;
624  this.upperIndex = null;
625  this.from = null;
626  this.to = null;
627  this.cc = null;
628  this.subject = null;
629  this.body = null;
630  this.date = null;
631  this.dateLower = null; 
632  this.dateUpper = null; 
633  this.tag = null;
634  this.folder = null;
635  this.order = null;
636  this.preview_message = null;
637  this.preview_tooltip = null;
638  this.defaults = null;   
639}
640
641MAQueryConfig.prototype.pharseStdDate = function(date){
642    var data_decoded = decodeURIComponent(date);
643    var data_array = data_decoded.split("/");
644    var data_day = data_array[0];
645    var data_month = data_array[1];
646    var data_year = data_array[2];
647
648    var date_object = new Date();
649    date_object.setDate(data_day);
650    date_object.setMonth(data_month-1);
651    date_object.setFullYear(data_year);
652   
653    var date_number = date_object.getTime();
654    return(date_number);
655    //return(new String(date_number)+'L');
656}
657-->
Note: See TracBrowser for help on using the repository browser.