1 | scheduler.templates.calendar_month = scheduler.date.date_to_str("%F %Y");
|
---|
2 | scheduler.templates.calendar_scale_date = scheduler.date.date_to_str("%D");
|
---|
3 | scheduler.templates.calendar_date = scheduler.date.date_to_str("%d");
|
---|
4 |
|
---|
5 |
|
---|
6 | scheduler.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 | };
|
---|
76 | scheduler._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 | };
|
---|
90 | scheduler._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 | };
|
---|
98 | scheduler.markCalendar=function(cal,date,css){
|
---|
99 | this._locateCalendar(cal,date).className+=" "+css;
|
---|
100 | };
|
---|
101 | scheduler.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 | };
|
---|
108 | scheduler._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 | };
|
---|
124 | scheduler.updateCalendar=function(obj,sd){
|
---|
125 | obj.conf.date = sd;
|
---|
126 | this.renderCalendar(obj.conf, obj);
|
---|
127 | };
|
---|
128 | scheduler._mini_cal_arrows = [" ", " "];
|
---|
129 | scheduler._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 | };
|
---|
195 | scheduler.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 | };
|
---|
208 | scheduler.isCalendarVisible=function(){
|
---|
209 | if (this._def_count && parseInt(this._def_count.style.top,10) > 0 )
|
---|
210 | return this._def_count;
|
---|
211 | return false;
|
---|
212 | };
|
---|
213 | scheduler.attachEvent("onTemplatesReady",function(){
|
---|
214 | dhtmlxEvent(document.body, "click", function(){ scheduler.destroyCalendar(); });
|
---|
215 | });
|
---|
216 |
|
---|
217 | scheduler.templates.calendar_time = scheduler.date.date_to_str("%d-%m-%Y");
|
---|
218 |
|
---|
219 | scheduler.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;'> – </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+" </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 | };
|
---|
345 | scheduler.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 | }; |
---|