source: sandbox/2.3-MailArchiver/calendar/js/dhtmlx/sources/recurring.js @ 6779

Revision 6779, 17.7 KB checked in by rafaelraymundo, 12 years ago (diff)

Ticket #2946 - Liberado Expresso(branch 2.3) integrado ao MailArchiver?.

Line 
1scheduler.form_blocks["recurring"]={
2        render:function(sns){
3                return scheduler.__recurring_template;
4        },
5        set_value:function(node,value,ev){
6                var ds = {start:ev.start_date, end:ev._end_date};
7                var str_date=scheduler.date.str_to_date(scheduler.config.repeat_date);
8                        var date_str=scheduler.date.date_to_str(scheduler.config.repeat_date);
9
10                var top = node.getElementsByTagName("FORM")[0];
11                var els = [];
12                function register_els(inps){
13                        for (var i=0; i<inps.length; i++){
14                                var inp = inps[i];
15                                if (inp.type=="checkbox" || inp.type=="radio"){
16                                        if (!els[inp.name])
17                                                els[inp.name]=[];
18                                        els[inp.name].push(inp);
19                                } else
20                                        els[inp.name]=inp;
21                        }
22                }
23                register_els(top.getElementsByTagName("INPUT"));
24                register_els(top.getElementsByTagName("SELECT"));
25               
26                var $ = function(a){ return document.getElementById(a); };
27                function get_radio_value(name){
28                        var col = els[name];
29                        for (var i=0; i<col.length; i++)
30                                if (col[i].checked) return col[i].value;
31                }
32                function change_current_view(){
33                        $("dhx_repeat_day").style.display="none";
34                        $("dhx_repeat_week").style.display="none";
35                        $("dhx_repeat_month").style.display="none";
36                        $("dhx_repeat_year").style.display="none";
37                        $("dhx_repeat_"+this.value).style.display="block";
38                }
39               
40                function get_repeat_code(dates){
41                        var code = [get_radio_value("repeat")];
42                        get_rcode[code[0]](code,dates);
43                       
44                        while (code.length < 5) code.push("");
45                        var repeat = "";
46                        if (els["end"][0].checked){
47                                dates.end = new Date(9999,1,1);
48                                repeat = "no";
49                        }
50                        else if (els["end"][2].checked){
51                                dates.end = str_date(els["date_of_end"].value);
52                        }
53                        else {
54                                scheduler.transpose_type(code.join("_"));
55                                repeat=Math.max(1,els["occurences_count"].value);
56                                var transp = ((code[0]=="week" && code[4] && code[4].toString().indexOf(scheduler.config.start_on_monday?1:0)==-1)?1:0);
57                                dates.end = scheduler.date.add(new Date(dates.start),repeat+transp,code.join("_"));
58                        }
59                               
60                        return code.join("_")+"#"+repeat;
61                }
62                var get_rcode={
63                        month:function(code,dates){
64                                if (get_radio_value("month_type")=="d"){
65                                        code.push(Math.max(1,els["month_count"].value));
66                                        dates.start.setDate(els["month_day"].value);
67                                } else {
68                                        code.push(Math.max(1,els["month_count2"].value));
69                                        code.push(els["month_day2"].value);     
70                                        code.push(Math.max(1,els["month_week2"].value));
71                                        dates.start.setDate(1);
72                                }
73                                dates._start = true;
74                        },
75                        week:function(code,dates){
76                                code.push(Math.max(1,els["week_count"].value));
77                                code.push("");code.push("");
78                                var t = [];
79                                var col = els["week_day"];
80                                for (var i=0; i < col.length; i++) {
81                                        if (col[i].checked) t.push(col[i].value);
82                                }
83                                if (!t.length)
84                                        t.push(dates.start.getDay());
85                                       
86                                dates.start=scheduler.date.week_start(dates.start);
87                                dates._start = true;
88                               
89                                code.push(t.sort().join(","));
90                         },
91                         day:function(code){
92                                if (get_radio_value("day_type")=="d"){
93                                        code.push(Math.max(1,els["day_count"].value));
94                                } else {
95                                        code.push("week");code.push(1);code.push("");code.push("");code.push("1,2,3,4,5");
96                                        code.splice(0,1);
97                                }
98                         },
99                         year:function(code,dates){
100                                if (get_radio_value("year_type")=="d"){
101                                        code.push("1");
102                                        dates.start.setMonth(0);
103                                        dates.start.setDate(els["year_day"].value);
104                                        dates.start.setMonth(els["year_month"].value);
105                                       
106                                } else {
107                                        code.push("1");
108                                        code.push(els["year_day2"].value);
109                                        code.push(els["year_week2"].value);
110                                        dates.start.setDate(1);
111                                        dates.start.setMonth(els["year_month2"].value);
112                                }
113                                dates._start = true;
114                        }       
115                };
116                var set_rcode={
117                        week:function(code,dates){
118                                els["week_count"].value=code[1];
119                                var col = els["week_day"];
120                                var t = code[4].split(","); var d ={};
121                                for (var i=0; i < t.length; i++) d[t[i]]=true;
122                                for (var i=0; i < col.length; i++)
123                                        col[i].checked = (!!d[col[i].value]);
124                                },
125                        month:function(code,dates){
126                                if (code[2]==""){
127                                        els["month_type"][0].checked=true;
128                                        els["month_count"].value=code[1];
129                                        els["month_day"].value=dates.start.getDate();
130                                } else {
131                                        els["month_type"][1].checked=true;
132                                        els["month_count2"].value=code[1];
133                                        els["month_week2"].value=code[3];
134                                        els["month_day2"].value=code[2];
135                                }
136                                },
137                        day:function(code,dates){
138                                els["day_type"][0].checked=true;
139                                els["day_count"].value=code[1];
140                                },
141                        year:function(code,dates){
142                                if (code[2]==""){
143                                        els["year_type"][0].checked=true;
144                                        els["year_day"].value=dates.start.getDate();
145                                        els["year_month"].value=dates.start.getMonth();
146                                } else {
147                                        els["year_type"][1].checked=true;
148                                        els["year_week2"].value=code[3];
149                                        els["year_day2"].value=code[2];
150                                        els["year_month2"].value=dates.start.getMonth();
151                                }
152                        }
153                };
154                function set_repeat_code(code,dates){
155                        var data = code.split("#");
156                        code = data[0].split("_");
157                        set_rcode[code[0]](code,dates);
158                        var e = els["repeat"][({day:0, week:1, month:2, year:3})[code[0]]];
159                        switch(data[1]){
160                                case "no":
161                                        els["end"][0].checked=true;
162                                        break;
163                                case "":
164                                        els["end"][2].checked=true;
165                                        els["date_of_end"].value=date_str(dates.end);
166                                        break;
167                                default:
168                                        els["end"][1].checked=true;
169                                        els["occurences_count"].value=data[1];
170                                        break;
171                        }
172                                       
173                        e.checked=true;
174                        e.onclick();
175                }
176
177                for (var i=0; i<top.elements.length; i++){
178                        var el = top.elements[i];
179                        switch(el.name){
180                                case "repeat":
181                                        el.onclick = change_current_view;
182                                        break;
183                        }
184                }
185                scheduler.form_blocks["recurring"].set_value=function(node,value,ev){
186                        node.open=!ev.rec_type;
187                        if (ev.event_pid && ev.event_pid!="0") node.blocked=true;
188                        else node.blocked=false;
189                       
190                        ds.start = ev.start_date;
191                        ds.end = ev._end_date;
192                       
193                        scheduler.form_blocks["recurring"].button_click(0,node.previousSibling.firstChild.firstChild,node,node);
194                        if (value)
195                                set_repeat_code(value,ds);
196                       
197                };
198                scheduler.form_blocks["recurring"].get_value=function(node,ev){
199                        if (node.open){
200                                ev.rec_type=get_repeat_code(ds);
201                                if (ds._start){
202                                        ev._start_date = ev.start_date = ds.start;
203                                        ds._start=false;
204                                } else
205                                        ev._start_date = null;
206                                       
207                                ev._end_date = ev.end_date = ds.end;
208                                ev.rec_pattern = ev.rec_type.split("#")[0];
209                        } else {
210                                ev.rec_type= ev.rec_pattern = "";
211                                ev._end_date = ev.end_date;
212                        }
213                        return ev.rec_type;
214                };
215                scheduler.form_blocks["recurring"].set_value(node,value,ev);
216        },
217        get_value:function(node,ev){
218        },
219        focus:function(node){
220        },
221        button_click:function(index,el, section, cont){
222                if (!cont.open && !cont.blocked){
223                        cont.style.height="115px";
224                        el.style.backgroundPosition="-5px 0px";
225                        el.nextSibling.innerHTML = scheduler.locale.labels.button_recurring_open;
226                } else {
227                        cont.style.height="0px";
228                        el.style.backgroundPosition="-5px 20px";
229                        el.nextSibling.innerHTML = scheduler.locale.labels.button_recurring;
230                }
231                cont.open=!cont.open;
232               
233                scheduler.setLightboxSize();
234        }
235};
236
237
238//problem may occur if we will have two repeating events in the same moment of time
239scheduler._rec_markers = {};
240scheduler._rec_markers_pull = {};
241scheduler._add_rec_marker = function(ev,time){
242        ev._pid_time = time;
243        this._rec_markers[ev.id] = ev;
244        if (!this._rec_markers_pull[ev.event_pid]) this._rec_markers_pull[ev.event_pid] = {};
245        this._rec_markers_pull[ev.event_pid][time]=ev;
246};
247scheduler._get_rec_marker = function(time, id){
248        var ch = this._rec_markers_pull[id];
249        if (ch) return ch[time];
250        return null;     
251};
252scheduler._get_rec_markers = function(id){
253        return (this._rec_markers_pull[id]||[]);       
254};
255scheduler._rec_temp = [];
256scheduler.attachEvent("onEventLoading",function(ev){
257        if (ev.event_pid!=0)
258                scheduler._add_rec_marker(ev,ev.event_length*1000);
259        if (ev.rec_type)
260                ev.rec_pattern = ev.rec_type.split("#")[0];
261        return true;
262});
263scheduler.attachEvent("onEventIdChange",function(id,new_id){
264        if (this._ignore_call) return;
265        this._ignore_call = true;
266       
267        for (var i=0; i<this._rec_temp.length; i++){
268                var tev = this._rec_temp[i];
269                if (tev.event_pid == id){
270                        tev.event_pid = new_id;
271                        this.changeEventId(tev.id,new_id+"#"+tev.id.split("#")[1]);
272                }
273        }
274       
275        delete this._ignore_call;
276});
277scheduler.attachEvent("onBeforeEventDelete",function(id){
278        var ev = this.getEvent(id);
279        if (id.toString().indexOf("#")!=-1) {
280                var id = id.split("#");
281                var nid = this.uid();
282               
283                var nev = this._copy_event(ev);
284                nev.id = nid;
285                nev.event_pid = id[0];
286                nev.event_length = id[1];
287                nev.rec_type = nev.rec_pattern = "none";
288                this.addEvent(nev);
289               
290                this._add_rec_marker(this.getEvent(nid), id[1]*1000);
291        } else {
292                if (ev.rec_type)
293                        this._roll_back_dates(ev);
294                var sub = this._get_rec_markers(id);
295                for (var i in sub)
296                        this.deleteEvent(sub[i].id,true);               
297        }
298        return true;
299});
300
301scheduler.attachEvent("onEventChanged",function(id){
302        if (this._loading) return true;
303       
304        var ev = this.getEvent(id);
305        if (id.toString().indexOf("#")!=-1) {
306                var id = id.split("#");
307                var nid = this.uid();
308                this._not_render=true;
309               
310                var nev = this._copy_event(ev);
311                nev.id = nid;
312                nev.event_pid = id[0];
313                nev.event_length=id[1];
314                nev.rec_type = nev.rec_pattern = "";
315                this.addEvent(nev);
316               
317                this._not_render=false;
318                this._add_rec_marker(this.getEvent(nid),id[1]*1000);
319        } else{
320                if (ev.rec_type)
321                        this._roll_back_dates(ev);
322                var sub = this._get_rec_markers(id);
323                for (var i in sub) {
324                        delete this._rec_markers[sub[i].id];
325                        this.deleteEvent(sub[i].id,true);               
326                };
327                delete this._rec_markers_pull[id];
328               
329                this._select_id = null; //remove selectin , because now was can have complex-ids
330        }
331        return true;
332});
333scheduler.attachEvent("onEventAdded",function(id){
334        if (!this._loading){
335                var ev = this.getEvent(id);     
336                if (ev.rec_type && !ev.event_length )
337                        this._roll_back_dates(ev);
338        }
339        return true;
340});
341scheduler.attachEvent("onEventCreated",function(id){
342        var ev = this.getEvent(id);
343        if (!ev.rec_type)
344                ev.rec_type = ev.rec_pattern = "";
345        return true;
346});
347scheduler.attachEvent("onEventCancel",function(id){
348        var ev = this.getEvent(id);     
349        if (ev.rec_type){
350                this._roll_back_dates(ev);
351                // a bit expensive, but we need to be sure that event re-rendered, because view can be corrupted by resize , during edit process
352                this.render_view_data(ev.id);
353        }
354});
355scheduler._roll_back_dates=function(ev){
356        ev.event_length = (ev.end_date.valueOf() - ev.start_date.valueOf())/1000;
357        ev.end_date = ev._end_date;
358        if (ev._start_date){
359                ev.start_date.setMonth(0);
360                ev.start_date.setDate(ev._start_date.getDate());
361                ev.start_date.setMonth(ev._start_date.getMonth());
362                ev.start_date.setFullYear(ev._start_date.getFullYear());
363               
364        }
365};
366
367
368scheduler.validId=function(id){
369        return id.toString().indexOf("#")==-1;
370};
371
372
373scheduler.showLightbox_rec=scheduler.showLightbox;
374scheduler.showLightbox=function(id){
375        var pid=this.getEvent(id).event_pid;
376        if (id.toString().indexOf("#")!=-1)
377                pid = id.split("#")[0];
378        if (!pid || pid == 0 || (!this.locale.labels.confirm_recurring || !confirm(this.locale.labels.confirm_recurring))) return this.showLightbox_rec(id);
379        pid = this.getEvent(pid);
380        pid._end_date = pid.end_date;
381        pid.end_date = new Date(pid.start_date.valueOf()+pid.event_length*1000);
382        return this.showLightbox_rec(pid.id);
383};
384scheduler.get_visible_events_rec = scheduler.get_visible_events;
385scheduler.get_visible_events=function(){
386        for (var i=0; i<this._rec_temp.length; i++)
387                delete this._events[this._rec_temp[i].id];
388        this._rec_temp = [];
389       
390        var stack = this.get_visible_events_rec();
391        var out=[];
392        for (var i=0; i<stack.length; i++){
393                if (stack[i].rec_type){
394                        //deleted element of serie
395                        if (stack[i].rec_pattern != "none")
396                                this.repeat_date(stack[i],out);
397                }
398                else out.push(stack[i]);
399        }
400        return out;
401};
402
403(function(){
404var old = scheduler.is_one_day_event;
405scheduler.is_one_day_event=function(ev){
406        if (ev.rec_type) return true;
407        return old.call(this,ev);
408};
409})();
410
411scheduler.transponse_size={
412        day:1, week:7, month:1, year:12
413};
414scheduler.date.day_week=function(sd,day,week){
415        sd.setDate(1);
416        week = (week-1)*7;
417        var cday = sd.getDay();
418        var nday=day*1+week-cday+1;
419        sd.setDate(nday<=week?(nday+7):nday);
420};
421scheduler.transpose_day_week=function(sd,list,cor,size,cor2){
422        var cday = (sd.getDay()||(scheduler.config.start_on_monday?7:0))-cor;
423        for (var i=0; i < list.length; i++) {
424                if (list[i]>cday)
425                        return sd.setDate(sd.getDate()+list[i]*1-cday-(size?cor:cor2));
426        }
427        this.transpose_day_week(sd,list,cor+size,null,cor);
428};     
429scheduler.transpose_type = function(type){
430        var f = "transpose_"+type;
431        if (!this.date[f]) {
432                var str = type.split("_");
433                var day = 60*60*24*1000;
434                var gf = "add_"+type;
435                var step = this.transponse_size[str[0]]*str[1];
436               
437                if (str[0]=="day" || str[0]=="week"){
438                        var days = null;
439                        if (str[4]){
440                                days=str[4].split(",");
441                                if (scheduler.config.start_on_monday){
442                                        for (var i=0; i < days.length; i++)
443                                                days[i]=(days[i]*1)||7;
444                                        days.sort();
445                                }
446                        }
447                       
448                       
449                        this.date[f] = function(nd,td){
450                                var delta = Math.floor((td.valueOf()-nd.valueOf())/(day*step));
451                                if (delta>0)
452                                        nd.setDate(nd.getDate()+delta*step);
453                                if (days)
454                                                scheduler.transpose_day_week(nd,days,1,step);
455                        };
456                        this.date[gf] = function(sd,inc){
457                                var nd =  new Date(sd.valueOf());
458                                if (days){
459                                        for (var count=0; count < inc; count++)
460                                                scheduler.transpose_day_week(nd,days,0,step);   
461                                } else
462                                        nd.setDate(nd.getDate()+inc*step);
463                               
464                                return nd;
465                        };
466                }
467                else if (str[0]=="month" || str[0]=="year"){
468                        this.date[f] = function(nd,td){
469                                var delta = Math.ceil(((td.getFullYear()*12+td.getMonth()*1)-(nd.getFullYear()*12+nd.getMonth()*1))/(step));
470                                if (delta>=0)
471                                        nd.setMonth(nd.getMonth()+delta*step);
472                                if (str[3])
473                                        scheduler.date.day_week(nd,str[2],str[3]);
474                        };
475                        this.date[gf] = function(sd,inc){
476                                var nd =  new Date(sd.valueOf());
477                                nd.setMonth(nd.getMonth()+inc*step);
478                                if (str[3])
479                                        scheduler.date.day_week(nd,str[2],str[3]);
480                                return nd;
481                        };
482                }
483        }
484};
485scheduler.repeat_date=function(ev,stack,non_render,from,to){
486        from = from||this._min_date;
487        to = to||this._max_date;
488       
489        var td = new Date(ev.start_date.valueOf());
490        if (!ev.rec_pattern && ev.rec_type)
491                ev.rec_pattern = ev.rec_type.split("#")[0];
492               
493        this.transpose_type(ev.rec_pattern);
494        scheduler.date["transpose_"+ev.rec_pattern](td, from);
495        while (td<ev.start_date || (td.valueOf()+ev.event_length*1000)<=from.valueOf())
496                td = this.date.add(td,1,ev.rec_pattern);
497        while (td < to && td < ev.end_date){
498                var ch = this._get_rec_marker(td.valueOf(),ev.id);
499                if (!ch) { //not changed element of serie
500                        var ted = new Date(td.valueOf()+ev.event_length*1000);
501                        var copy=this._copy_event(ev);
502                        //copy._timed = ev._timed;
503                        copy.start_date = td;
504                        copy.event_pid = ev.id;
505                        copy.id = ev.id+"#"+Math.ceil(td.valueOf()/1000);
506                        copy.end_date = ted;
507                       
508                        var shift = copy.start_date.getTimezoneOffset() - copy.end_date.getTimezoneOffset();
509                        if (shift){
510                                if (shift>0)
511                                        copy.end_date = new Date(td.valueOf()+ev.event_length*1000-shift*60*1000);
512                                else {
513                                        copy.end_date = new Date(copy.end_date.valueOf() + shift*60*1000);
514                                }
515                        }
516                                                       
517                        copy._timed=this.is_one_day_event(copy);
518                       
519                        if (!copy._timed && !this._table_view && !this.config.multi_day) return;
520                        stack.push(copy);
521                       
522                        if(!non_render){
523                                this._events[copy.id] = copy;
524                                this._rec_temp.push(copy);
525                        }
526                       
527                } else
528                        if (non_render) stack.push(ch);
529                       
530                td = this.date.add(td,1,ev.rec_pattern);
531        }               
532};
533
534scheduler.getRecDates = function(id, max){
535        var ev = typeof id == "object" ? id : scheduler.getEvent(id);
536        var count = 0;
537        var result = [];
538        max = max || 1000;
539       
540       
541        var td = new Date(ev.start_date.valueOf());
542        var from = new Date(td.valueOf());
543       
544        if(!ev.rec_type) {
545                return [ { start_date: ev.start_date, end_date: ev.end_date } ];
546        }
547        this.transpose_type(ev.rec_pattern);
548        scheduler.date["transpose_"+ev.rec_pattern](td, from);
549       
550        while (td<ev.start_date || (td.valueOf()+ev.event_length*1000)<=from.valueOf())
551                td = this.date.add(td,1,ev.rec_pattern);
552        while (td < ev.end_date){
553                var ch = this._get_rec_marker(td.valueOf(),ev.id);
554                if (!ch){ //not changed element of serie
555                        var ted = new Date(td.valueOf()+ev.event_length*1000);
556                        var sed = new Date(td);
557                        result.push({start_date:sed, end_date:ted});
558                        td = this.date.add(td,1,ev.rec_pattern);
559                        count++;
560                }
561                if (count == max) break;
562        }
563        return result;
564};
565scheduler.getEvents = function(from,to){
566        var result = [];
567        for (var a in this._events){
568                var ev = this._events[a];
569                if (ev && ev.start_date<to && ev.end_date>from){
570                        if (ev.rec_pattern){
571                                if (ev.rec_pattern=="none") continue;                           
572                                var sev = [];
573                                this.repeat_date(ev,sev,true,from,to);
574                                for (var i=0; i < sev.length; i++)
575                                        if (!sev[i].rec_pattern && sev[i].start_date<to && sev[i].end_date>from)
576                                                result.push(sev[i]);
577                        } else if (!ev.event_pid || ev.event_pid==0){
578                                result.push(ev);
579                        }
580                }
581        }
582        return result;
583};
584
585scheduler.config.repeat_date="%m.%d.%Y";
586scheduler.config.lightbox.sections=[   
587        {name:"description", height:130, map_to:"text", type:"textarea" , focus:true},
588        {name:"recurring", height:115, type:"recurring", map_to:"rec_type", button:"recurring"},
589        {name:"time", height:72, type:"time", map_to:"auto"}
590];
591//drop secondary attributes
592scheduler._copy_dummy=function(ev){
593        this.start_date=new Date(this.start_date);
594        this.end_date=new Date(this.end_date);
595        this.event_length=this.event_pid=this.rec_pattern=this.rec_type=this._timed=null;
596};
Note: See TracBrowser for help on using the repository browser.