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

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

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

Line 
1scheduler.templates.calendar_month =  scheduler.date.date_to_str("%F %Y");
2scheduler.templates.calendar_scale_date =  scheduler.date.date_to_str("%D");
3scheduler.templates.calendar_date =  scheduler.date.date_to_str("%d");
4
5
6scheduler.renderCalendar=function(obj, _prev){
7        var cal = null;
8        var date = obj.date||(new Date());
9        if (typeof date == "string")
10                date = this.templates.api_date(date);   
11               
12        if (!_prev){
13                var cont = obj.container;
14                var pos  = obj.position;
15               
16               
17                if (typeof cont == "string")
18                        cont = document.getElementById(cont);
19       
20                if (typeof pos == "string")
21                        pos = document.getElementById(pos);
22                if (pos && (typeof pos.left == "undefined")){
23                        var tpos = getOffset(pos);
24                        pos = {
25                                top:tpos.top + pos.offsetHeight,
26                                left:tpos.left
27                        };
28                };
29                if (!cont)
30                        cont = scheduler._get_def_cont(pos);
31                       
32                cal = this._render_calendar(cont,date,obj);
33                cal.onclick = function(e){
34                        e = e||event;
35                        var src = e.target||e.srcElement;
36                       
37                        if (src.className.indexOf("dhx_month_head")!=-1){
38                                var pname = src.parentNode.className;
39                                if (pname.indexOf("dhx_after")==-1 && pname.indexOf("dhx_before")==-1) {
40                                        var newdate = scheduler.templates.xml_date(this.getAttribute("date"));
41                                        newdate.setDate(parseInt(src.innerHTML,10));
42                                        scheduler.unmarkCalendar(this);
43                                        scheduler.markCalendar(this,newdate,"dhx_calendar_click");
44                                        this._last_date=newdate;
45                                        if (this.conf.handler) this.conf.handler.call(scheduler, newdate, this);
46                                }
47                        }
48                };
49        } else {
50                cal = this._render_calendar(_prev.parentNode, date, obj, _prev);
51                scheduler.unmarkCalendar(cal);
52        }
53               
54       
55        var start = scheduler.date.month_start(date);
56        var end   = scheduler.date.add(start,1,"month");
57        var evs = this.getEvents(start,end);
58        for (var i=0; i < evs.length; i++){
59                var ev = evs[i];
60                var d = ev.start_date;
61                if (d.valueOf()<start.valueOf())
62                        d = start;
63                while (d<=ev.end_date){
64                        this.markCalendar(cal,d,"dhx_year_event");
65                        d = this.date.add(d,1,"day");
66                        if (d.valueOf()>=end.valueOf())
67                                break;
68                }
69        }
70       
71
72       
73        cal.conf = obj;
74        return cal;
75};
76scheduler._get_def_cont = function(pos){
77        if (!this._def_count){
78                this._def_count = document.createElement("DIV");
79                this._def_count.style.cssText = "position:absolute;z-index:10100;width:251px; height:175px;";
80                this._def_count.onclick = function(e){ (e||event).cancelBubble = true; };
81                document.body.appendChild(this._def_count);
82        }
83               
84        this._def_count.style.left = pos.left+"px";
85        this._def_count.style.top  = pos.top+"px";
86        this._def_count._created = new Date();
87       
88        return this._def_count;
89};
90scheduler._locateCalendar=function(cal,date){
91        var table=cal.childNodes[2].childNodes[0];
92        if (typeof date == "string")
93                date = scheduler.templates.api_date(date);
94               
95        var d  = cal.week_start+date.getDate()-1;
96        return table.rows[Math.floor(d/7)].cells[d%7].firstChild;
97};
98scheduler.markCalendar=function(cal,date,css){
99        this._locateCalendar(cal,date).className+=" "+css;
100};
101scheduler.unmarkCalendar=function(cal,date,css){
102        date=date||cal._last_date;
103        css=css||"dhx_calendar_click";
104        if (!date) return;
105        var el = this._locateCalendar(cal,date);
106        el.className= (el.className||"").replace(RegExp(css,"g"));
107};
108scheduler._week_template=function(width){
109        var summ = (width || 250);
110        var left = 0;
111
112        var week_template = document.createElement("div");
113        var dummy_date = this.date.week_start(new Date());
114        for (var i=0; i<7; i++){
115                this._cols[i]=Math.floor(summ/(7-i));
116                this._render_x_header(i,left,dummy_date,week_template);
117                dummy_date = this.date.add(dummy_date,1,"day");
118                summ-=this._cols[i];
119                left+=this._cols[i];
120        }
121        week_template.lastChild.className+=" dhx_scale_bar_last";
122        return week_template;
123};
124scheduler.updateCalendar=function(obj,sd){
125        obj.conf.date = sd;
126        this.renderCalendar(obj.conf, obj);
127};
128scheduler._mini_cal_arrows = ["&nbsp", "&nbsp"];
129scheduler._render_calendar=function(obj,sd,conf, previous){
130        /*store*/
131                var ts = scheduler.templates;
132                var temp = this._cols; this._cols=[];
133                var temp2 = this._mode; this._mode = "calendar";
134                var temp3 = this._colsS; this._colsS = {height:0};
135                var temp4 = new Date(this._min_date);
136                var temp5 = new Date(this._max_date);
137                var temp6 = new Date(scheduler._date);
138                var temp7 = ts.month_day; ts.month_day=ts.calendar_date;
139               
140       
141        sd = this.date.month_start(sd);
142        var week_template = this._week_template(obj.offsetWidth-1);
143       
144        var d;
145        if (previous)
146                d = previous;
147        else {
148                var d = document.createElement("DIV");
149                d.className="dhx_cal_container dhx_mini_calendar";
150        }
151        d.setAttribute("date",this.templates.xml_format(sd));
152        d.innerHTML="<div class='dhx_year_month'></div><div class='dhx_year_week'>"+week_template.innerHTML+"</div><div class='dhx_year_body'></div>";
153       
154        d.childNodes[0].innerHTML=this.templates.calendar_month(sd);
155        if (conf.navigation){
156        var arrow = document.createElement("DIV");                             
157                arrow.className = "dhx_cal_prev_button";
158                arrow.style.cssText="left:1px;top:2px;position:absolute;";
159                arrow.innerHTML = this._mini_cal_arrows[0];
160                d.firstChild.appendChild(arrow);
161                arrow.onclick=function(){
162                        scheduler.updateCalendar(d, scheduler.date.add(d._date, -1, "month"));
163                };
164               
165                arrow = document.createElement("DIV");
166                arrow.className = "dhx_cal_next_button";
167                arrow.style.cssText="left:auto; right:1px;top:2px;position:absolute;";
168                arrow.innerHTML = this._mini_cal_arrows[1];
169                d.firstChild.appendChild(arrow);
170                arrow.onclick=function(){
171                        scheduler.updateCalendar(d, scheduler.date.add(d._date, 1, "month"));
172                };
173                d._date = new Date(sd);
174        }
175       
176        d.week_start = (sd.getDay()-(this.config.start_on_monday?1:0)+7)%7;
177       
178        var dd = this.date.week_start(sd);
179        this._reset_month_scale(d.childNodes[2],sd,dd);
180       
181        var r=d.childNodes[2].firstChild.rows;
182        for (var k=r.length; k<6; k++) {
183                r[0].parentNode.appendChild(r[0].cloneNode(true));
184                for (var ri=0; ri < r[k].childNodes.length; ri++) {
185                   r[k].childNodes[ri].className = "dhx_after";
186                };
187        }
188       
189        if (!previous)
190                obj.appendChild(d);
191       
192        /*restore*/ this._cols=temp; this._mode = temp2; this._colsS = temp3; this._min_date=temp4; this._max_date=temp5; scheduler._date = temp6; ts.month_day=temp7;
193        return d;
194};
195scheduler.destroyCalendar=function(cal,force){
196        if (!cal && this._def_count && this._def_count.firstChild){
197                if (force || (new Date()).valueOf() - this._def_count._created.valueOf() > 500)
198                        cal  = this._def_count.firstChild;
199        }
200        if (!cal) return;
201        cal.onclick=null;
202        cal.innerHTML="";
203        if (cal.parentNode)
204                cal.parentNode.removeChild(cal);
205        if (this._def_count)
206                this._def_count.style.top = "-1000px";
207};
208scheduler.isCalendarVisible=function(){
209        if (this._def_count && parseInt(this._def_count.style.top,10) > 0 )
210                return this._def_count;
211        return false;
212};
213scheduler.attachEvent("onTemplatesReady",function(){
214        dhtmlxEvent(document.body, "click", function(){ scheduler.destroyCalendar(); });
215});
216
217scheduler.templates.calendar_time = scheduler.date.date_to_str("%d-%m-%Y");
218
219scheduler.form_blocks.calendar_time={
220        render:function(){
221                var html = "<input class='dhx_readonly' type='text' readonly='true'>";
222               
223                var cfg = scheduler.config;
224                var dt = this.date.date_part(new Date());
225                if (cfg.first_hour)
226                        dt.setHours(cfg.first_hour);
227                       
228                html+=" <select>";
229                for (var i=60*cfg.first_hour; i<60*cfg.last_hour; i+=this.config.time_step*1){
230                        var time=this.templates.time_picker(dt);
231                        html+="<option value='"+i+"'>"+time+"</option>";
232                        dt=this.date.add(dt,this.config.time_step,"minute");
233                }
234                html+="</select>";
235               
236                var full_day = scheduler.config.full_day;
237               
238                return "<div style='height:30px; padding-top:0px; font-size:inherit;' class='dhx_cal_lsection dhx_section_time'>"+html+"<span style='font-weight:normal; font-size:10pt;'> &nbsp;&ndash;&nbsp; </span>"+html+"</div>";
239        },
240        set_value:function(node,value,ev){
241       
242                var inputs=node.getElementsByTagName("input"); 
243                var selects=node.getElementsByTagName("select");
244               
245                var _init_once = function(inp,date,number){
246                        inp.onclick = function(){
247                                scheduler.destroyCalendar(null, true);
248                                scheduler.renderCalendar({
249                                        position:inp,
250                                        date:new Date(this._date),
251                                        navigation:true,
252                                        handler:function(new_date){
253                                                inp.value = scheduler.templates.calendar_time(new_date);
254                                                inp._date = new Date(new_date);
255                                                scheduler.destroyCalendar();
256                                                if(scheduler.config.event_duration && number == 0) { //first element = start date
257                                                        _update_minical_select();
258                                                }
259                                        }
260                                });
261                        };
262                };     
263               
264                if(scheduler.config.full_day) {
265                        if (!node._full_day){
266                                node.previousSibling.innerHTML+="<div class='dhx_fullday_checkbox'><label><input type='checkbox' name='full_day' value='true'> "+scheduler.locale.labels.full_day+"&nbsp;</label></input></div>";
267                                node._full_day=true;
268                        }
269                        var input=node.previousSibling.getElementsByTagName("input")[0];
270                       
271                        var isFulldayEvent = (scheduler.date.time_part(ev.start_date)==0 && scheduler.date.time_part(ev.end_date)==0 && ev.end_date.valueOf()-ev.start_date.valueOf() < 2*24*60*60*1000);
272                        input.checked = isFulldayEvent;
273                        for(var i in selects)
274                                selects[i].disabled=input.checked;                     
275                        for(var i=0; i<inputs.length-1; i++)  //last input = checkbox
276                                inputs[i].disabled=input.checked;       
277                               
278                        input.onclick = function(){
279                                if(input.checked == true) {
280                                        var start_date = new Date(ev.start_date);
281                                        var end_date = new Date(ev.end_date);
282
283                                        scheduler.date.date_part(start_date);
284                                        end_date = scheduler.date.add(start_date, 1, "day");           
285                                }
286                               
287                                var start = start_date||ev.start_date;
288                                var end = end_date||ev.end_date;
289                                _attach_action(inputs[0],start);
290                                _attach_action(inputs[1],end);
291                                selects[0].value=start.getHours()*60+start.getMinutes();
292                                selects[1].value=end.getHours()*60+end.getMinutes();   
293                               
294                                for(var i in selects)
295                                        selects[i].disabled=input.checked;
296                                for(var i=0; i<inputs.length-1; i++)  //last input = checkbox
297                                        inputs[i].disabled=input.checked;       
298                               
299                        };
300                };
301               
302                if(scheduler.config.event_duration) {
303                       
304                        function _update_minical_select() {
305                                ev.start_date = scheduler.date.add(inputs[0]._date, selects[0].value, "minute");
306                                ev.end_date.setTime(ev.start_date.getTime() + (scheduler.config.event_duration * 60 * 1000));
307                               
308                                inputs[1].value = scheduler.templates.calendar_time(ev.end_date);
309                                inputs[1]._date = scheduler.date.date_part(new Date(ev.end_date));     
310
311                                selects[1].value=ev.end_date.getHours()*60+ev.end_date.getMinutes();                           
312                        }
313                       
314                        for(var i in selects)
315                                selects[i].onchange = _update_minical_select;
316                }
317       
318                function _attach_action(inp, date, number){
319                        _init_once(inp,date,number);
320                        inp.value = scheduler.templates.calendar_time(date);
321                        inp._date = scheduler.date.date_part(new Date(date));
322                };
323
324                _attach_action(inputs[0],ev.start_date, 0);
325                _attach_action(inputs[1],ev.end_date, 1);
326                _init_once = function(){};
327                       
328                selects[0].value=ev.start_date.getHours()*60+ev.start_date.getMinutes();
329                selects[1].value=ev.end_date.getHours()*60+ev.end_date.getMinutes();
330               
331        },
332        get_value:function(node,ev){
333                var inputs = node.getElementsByTagName("input");
334                var selects = node.getElementsByTagName("select");             
335               
336                ev.start_date = scheduler.date.add(inputs[0]._date, selects[0].value, "minute");
337                ev.end_date = scheduler.date.add(inputs[1]._date, selects[1].value, "minute");
338               
339                if (ev.end_date<=ev.start_date)
340                        ev.end_date=scheduler.date.add(ev.start_date,scheduler.config.time_step,"minute");
341        },
342        focus:function(node){
343        }
344};
345scheduler.linkCalendar=function(calendar, datediff){
346        var action = function(){
347                var date = scheduler._date;
348                var mode = scheduler._mode;
349               
350                var dateNew = new Date(date.valueOf());
351                if (datediff) dateNew = datediff(dateNew);
352                dateNew.setDate(1);
353                scheduler.updateCalendar(calendar, dateNew);
354               
355                if (!datediff){
356                        if (mode == 'day') {
357                                scheduler.markCalendar(calendar,date, "dhx_calendar_click");
358                        } else if (mode == 'week') {
359                                dateNew = scheduler.date.week_start(new Date(date.valueOf()));
360                                for (i = 0; i < 7; i++) {
361                                        var diff = dateNew.getMonth() + dateNew.getYear()*12 - date.getMonth() - date.getYear()*12;
362                                        if (diff && diff>0)
363                                                continue;
364                                        scheduler.markCalendar(calendar, dateNew, "dhx_calendar_click");
365                                        dateNew = scheduler.date.add(dateNew,1,"day");                                 
366                                }
367                        }
368                }
369                return true;
370        };
371       
372        scheduler.attachEvent("onViewChange", action);
373        scheduler.attachEvent("onXLE", action);
374        scheduler.attachEvent("onEventAdded", action);
375        scheduler.attachEvent("onEventChanged", action);
376        scheduler.attachEvent("onAfterEventDelete", action);
377        action();
378};
Note: See TracBrowser for help on using the repository browser.