1 | var viewType; |
---|
2 | var todayDate = new Date(); |
---|
3 | |
---|
4 | function Calendar() |
---|
5 | { |
---|
6 | this.idEl; |
---|
7 | this.lastId; |
---|
8 | this.colorCellSelected = "LIGHTYELLOW"; |
---|
9 | this.nextView; |
---|
10 | this.previousView; |
---|
11 | this.uid = calUid; |
---|
12 | } |
---|
13 | |
---|
14 | Calendar.prototype.dialog = function() { |
---|
15 | var divAddDialog = document.getElementById("divAddDialog"); |
---|
16 | if (_dragArea.initEvent > _dragArea.endEvent){ |
---|
17 | var temp = _dragArea.initEvent; |
---|
18 | _dragArea.initEvent = _dragArea.endEvent; |
---|
19 | _dragArea.endEvent = temp; |
---|
20 | } |
---|
21 | |
---|
22 | if(divAddDialog && divAddDialog.style.display != "none"){ |
---|
23 | divAddDialog.style.display = "none"; |
---|
24 | for (var hour = parseInt(_dragArea.initEvent); hour <= parseInt(_dragArea.endEvent);(hour%100 == 30)?hour+=70:hour+=30) |
---|
25 | try { document.getElementById(hour).style.background = ""; } catch (e) { break; }; |
---|
26 | _dragArea.initEvent = null; |
---|
27 | _dragArea.endEvent = null; |
---|
28 | try { |
---|
29 | document.getElementById("div_main").style.opacity = 1; |
---|
30 | document.getElementById("div_main").filters.alpha.opacity=100; |
---|
31 | } catch (e) {}; |
---|
32 | return true; |
---|
33 | } |
---|
34 | |
---|
35 | var cell = document.getElementById(_dragArea.endEvent); |
---|
36 | try { |
---|
37 | document.getElementById("div_main").style.opacity = 0.5; |
---|
38 | document.getElementById("div_main").filters.alpha.opacity=50; |
---|
39 | } catch (e) {}; |
---|
40 | |
---|
41 | var data = '<text><date>'+calendar.parseDate(id2timeStamp(_dragArea.initEvent))+'</date><time>'+ calendar.parseTime(_dragArea.initEvent,_dragArea.endEvent)+'</time></text>'; |
---|
42 | var xsl = XMLTools.load('xsl/addDialog.xsl?'+ Date.parse(new Date)); |
---|
43 | |
---|
44 | if(!divAddDialog) { |
---|
45 | divAddDialog = document.createElement("DIV"); |
---|
46 | divAddDialog.id = 'divAddDialog'; |
---|
47 | divAddDialog.style.zIndex = "10"; |
---|
48 | divAddDialog.style.position = "absolute"; |
---|
49 | divAddDialog.style.display = "none"; |
---|
50 | document.body.appendChild(divAddDialog); |
---|
51 | } |
---|
52 | divAddDialog.style.left = "300px"; //cell.offsetLeft + document.body.scrollLeft; |
---|
53 | divAddDialog.style.top = "200px"; //cell.offsetTop - 100 + document.getElementById('div_main').offsetTop; |
---|
54 | divAddDialog.style.display = "block"; |
---|
55 | divAddDialog.innerHTML = xtools.parse(data, xsl); |
---|
56 | var closeButton = document.getElementById('closeDialog'); |
---|
57 | if (is_ie) |
---|
58 | { |
---|
59 | closeButton.style.left = '285px'; |
---|
60 | closeButton.style.top = '5px'; |
---|
61 | } |
---|
62 | else |
---|
63 | { |
---|
64 | closeButton.style.left = '320px'; |
---|
65 | closeButton.style.top = '25px'; |
---|
66 | } |
---|
67 | document.getElementById('dragEventSubject').focus(); |
---|
68 | document.getElementById('addEventLink').innerHTML = get_lang("Add this event"); |
---|
69 | document.getElementById('addDetailsLink').innerHTML = get_lang("Add with details"); |
---|
70 | |
---|
71 | |
---|
72 | this.lastId = _dragArea.endEvent; |
---|
73 | |
---|
74 | } |
---|
75 | Calendar.prototype.getView = function(idEl, type, data) |
---|
76 | { |
---|
77 | this.idEl = idEl; |
---|
78 | var _this = this; |
---|
79 | this.lastId = null; |
---|
80 | |
---|
81 | var handler_getView = function(XMLdata) |
---|
82 | { |
---|
83 | _this.parseView(XMLdata,type); |
---|
84 | |
---|
85 | if (viewType == "Week"){ |
---|
86 | var Today = new Date; |
---|
87 | Today.setTime(id2timeStamp(document.getElementById('day').firstChild.id)); |
---|
88 | var lastWeek = new Date; |
---|
89 | lastWeek.setTime(Today.getTime()-(60*60*24*7*1000)); |
---|
90 | this.previousView = (lastWeek.getYear()+1900)+normDec(lastWeek.getDate()-7)+normDec(lastWeek.getMonth()+1); |
---|
91 | Today.setTime(Today.getTime()+(60*60*24*8*1000)); |
---|
92 | this.nextView = (Today.getYear()+1900)+normDec(Today.getDate())+normDec(Today.getMonth()+1); |
---|
93 | } |
---|
94 | if (viewType == "Day"){ |
---|
95 | var Today = new Date; |
---|
96 | Today.setTime(id2timeStamp(document.getElementById('day').firstChild.id)); |
---|
97 | this.previousView = (Today.getYear()+1900)+normDec(Today.getDate()-1)+normDec(Today.getMonth()+1); |
---|
98 | Today.setDate(Today.getDate()+1); |
---|
99 | this.nextView = (Today.getYear()+1900)+normDec(Today.getDate())+normDec(Today.getMonth()+1); |
---|
100 | } |
---|
101 | if (viewType == 'Month'){ |
---|
102 | var Today = new Date; |
---|
103 | Today.setTime(id2timeStamp(document.getElementById('day').firstChild.id)); |
---|
104 | this.previousView = (Today.getYear()+1900)+normDec(Today.getDate())+normDec(Today.getMonth()); |
---|
105 | Today.setMonth(Today.getMonth()+1); |
---|
106 | this.nextView = (Today.getYear()+1900)+normDec(Today.getDate())+normDec(Today.getMonth()+1); |
---|
107 | } |
---|
108 | document.getElementById("l_date").innerHTML = "<a href=\"javascript:calendar.getView('div_main','"+viewType+"','&time='+this.previousView);\">\<\< </a>"; |
---|
109 | if (viewType == "Week") |
---|
110 | document.getElementById("l_date").innerHTML += calendar.parseWeek(id2timeStamp(document.getElementById('day').firstChild.id)); |
---|
111 | if (viewType == "Day") |
---|
112 | document.getElementById("l_date").innerHTML += calendar.parseDate(id2timeStamp(document.getElementById('day').firstChild.id)); |
---|
113 | if (viewType == "Month") |
---|
114 | document.getElementById("l_date").innerHTML += calendar.parseMonth(id2timeStamp(document.getElementById('day').firstChild.id)); |
---|
115 | document.getElementById("l_date").innerHTML += "<a href=\"javascript:calendar.getView('div_main','"+viewType+"','&time='+this.nextView);\"> \>\></a>"; |
---|
116 | |
---|
117 | var getEventsDay = function (data) |
---|
118 | { |
---|
119 | var xsl = XMLTools.load('xsl/events'+type+'.xsl'); |
---|
120 | var div = document.getElementById('div_main'); |
---|
121 | div.innerHTML += xtools.parse(data, xsl); |
---|
122 | var events = document.getElementById('returnEvents'); |
---|
123 | while(typeof(events.firstChild.id) == 'string') |
---|
124 | createEventDiv(events.firstChild); |
---|
125 | } |
---|
126 | XMLTools.__RETURN_MODE__ = 'XML'; |
---|
127 | XMLTools.request('$this.uicalendar.getEvents'+type+(data?data:'')+'&uid='+calendar.uid, 'GET', getEventsDay); |
---|
128 | |
---|
129 | }; |
---|
130 | |
---|
131 | XMLTools.__RETURN_MODE__ = 'XML'; |
---|
132 | viewType = type; |
---|
133 | screenTable = new Array(); |
---|
134 | XMLTools.request('$this.uicalendar.getView'+type+(data?data:'')+'&uid='+this.uid, 'GET', handler_getView); |
---|
135 | }; |
---|
136 | |
---|
137 | Calendar.prototype.resetView = function() |
---|
138 | { |
---|
139 | document.getElementById("div_main").innerHTML = ""; |
---|
140 | } |
---|
141 | |
---|
142 | Calendar.prototype.parseView = function(data,type) |
---|
143 | { |
---|
144 | var _this = this; |
---|
145 | try { |
---|
146 | var xsl = XMLTools.load('xsl/view'+type+'.xsl?'+ Date.parse(new Date)); |
---|
147 | var div = document.getElementById(this.idEl); |
---|
148 | div.innerHTML = xtools.parse(data, xsl); |
---|
149 | document.getElementById('divAppbox').style.height = "100%"; |
---|
150 | } |
---|
151 | catch(e){ |
---|
152 | alert(e); |
---|
153 | } |
---|
154 | |
---|
155 | if (type == 'Week' || type == 'Month') |
---|
156 | { |
---|
157 | var trWeek = document.getElementById('tr_week'); |
---|
158 | for (var i=0; i < trWeek.childNodes.length; i++) |
---|
159 | trWeek.childNodes[i].innerHTML = get_lang(trWeek.childNodes[i].innerHTML); |
---|
160 | } |
---|
161 | }; |
---|
162 | |
---|
163 | |
---|
164 | Calendar.prototype.parseTime = function (first, last) { |
---|
165 | |
---|
166 | var hour = first.substring(8,10); |
---|
167 | var minute = first.substring(10,12); |
---|
168 | var startHour = hour+":"+minute; |
---|
169 | |
---|
170 | if(last && first != last) { |
---|
171 | hour = last.substring(8,10); |
---|
172 | minute = last.substring(10,12); |
---|
173 | } |
---|
174 | |
---|
175 | if(minute == "30") { |
---|
176 | hour = parseInt(hour,10); |
---|
177 | hour = normDec(hour+1); |
---|
178 | minute = "00"; |
---|
179 | } |
---|
180 | else { |
---|
181 | minute = "30"; |
---|
182 | } |
---|
183 | return startHour+ " - "+ hour+":"+minute; |
---|
184 | } |
---|
185 | Calendar.prototype.parseWeek = function (timeStamp) { |
---|
186 | dateObj=new Date(); |
---|
187 | dateObj.setTime(timeStamp); |
---|
188 | Year=dateObj.getYear(); |
---|
189 | if (Year < 70) { Year=Year*1+2000; } |
---|
190 | if (Year < 1900) { Year=Year*1+1900; } |
---|
191 | Then=new Date(Year, 0, 1); |
---|
192 | Then_Day=Then.getDay(); |
---|
193 | Diff=dateObj*1-Then*1; |
---|
194 | Days=Math.floor(Diff/(1000*60*60*24)+(1/24)); |
---|
195 | Week=Math.floor((Days+Then_Day)/7)+1; |
---|
196 | return get_lang("Week Number %1 of %2",Week,Year); |
---|
197 | } |
---|
198 | Calendar.prototype.parseMonth = function (timeStamp) { |
---|
199 | obj=new Date(); |
---|
200 | obj.setTime(timeStamp); |
---|
201 | switch(obj.getMonth()) { |
---|
202 | case 0: month = "January"; break; |
---|
203 | case 1: month = "February"; break; |
---|
204 | case 2: month = "March"; break; |
---|
205 | case 3: month = "April"; break; |
---|
206 | case 4: month = "May"; break; |
---|
207 | case 5: month = "June"; break; |
---|
208 | case 6: month = "July"; break; |
---|
209 | case 7: month = "August"; break; |
---|
210 | case 8: month = "September"; break; |
---|
211 | case 9: month = "October"; break; |
---|
212 | case 10: month = "November"; break; |
---|
213 | case 11: month = "December"; break; |
---|
214 | default: month = ""; break; |
---|
215 | } |
---|
216 | return get_lang("%1 of %2",get_lang(month),(obj.getYear()+1900)); |
---|
217 | } |
---|
218 | Calendar.prototype.parseDate = function (timeStamp) { |
---|
219 | var obj = new Date(); |
---|
220 | obj.setTime(timeStamp); |
---|
221 | |
---|
222 | var day; |
---|
223 | switch(obj.getDay()) { |
---|
224 | case 0: day = "Sunday"; break; |
---|
225 | case 1: day = "Monday"; break; |
---|
226 | case 2: day = "Tuesday"; break; |
---|
227 | case 3: day = "Wednesday"; break; |
---|
228 | case 4: day = "Thursday"; break; |
---|
229 | case 5: day = "Friday"; break; |
---|
230 | case 6: day = "Saturday"; break; |
---|
231 | default: day = ""; break; |
---|
232 | } |
---|
233 | |
---|
234 | var month; |
---|
235 | switch(obj.getMonth()) { |
---|
236 | case 0: month = "January"; break; |
---|
237 | case 1: month = "February"; break; |
---|
238 | case 2: month = "March"; break; |
---|
239 | case 3: month = "April"; break; |
---|
240 | case 4: month = "May"; break; |
---|
241 | case 5: month = "June"; break; |
---|
242 | case 6: month = "July"; break; |
---|
243 | case 7: month = "August"; break; |
---|
244 | case 8: month = "September"; break; |
---|
245 | case 9: month = "October"; break; |
---|
246 | case 10: month = "November"; break; |
---|
247 | case 11: month = "December"; break; |
---|
248 | default: month = ""; break; |
---|
249 | } |
---|
250 | |
---|
251 | year = (is_ie?parseInt(obj.getYear()):parseInt(obj.getYear())+1900); |
---|
252 | |
---|
253 | return get_lang(day)+", "+obj.getDate()+" "+get_lang("of")+" "+get_lang(month)+" "+get_lang("of")+" "+year; // FIXME USE FORMAT DATE AS PREFERENCE |
---|
254 | } |
---|
255 | var calendar = new Calendar(); |
---|
256 | |
---|
257 | // This array stores the events in table to avoid conflict in screen |
---|
258 | var screenTable = new Array(); |
---|
259 | var today = new Date(); |
---|
260 | var weekDay = today.getDay(); |
---|
261 | function createEventDiv(eventDiv){ |
---|
262 | eventDiv.className = "event_div"; |
---|
263 | eventDiv.style.height = parseInt(eventDiv.childNodes[1].id-eventDiv.childNodes[0].id)/120000+"px"; |
---|
264 | var end_ = timeStamp2id(eventDiv.childNodes[1].id).substr(8); |
---|
265 | var start_ = parseInt(timeStamp2id(eventDiv.childNodes[0].id).substr(8),10); |
---|
266 | if (viewType == "Day"){ |
---|
267 | if (!screenTable[weekDay]) |
---|
268 | screenTable[weekDay] = new Array(); |
---|
269 | eventDiv.style.width = "190px"; |
---|
270 | |
---|
271 | currentPos = 1; |
---|
272 | for (var hour = parseInt(start_,10); hour < parseInt(end_,10);(hour%100 == 30)?hour+=70:hour+=30){ |
---|
273 | if (!screenTable[weekDay][hour]) |
---|
274 | screenTable[weekDay][hour] = 0; |
---|
275 | |
---|
276 | if (currentPos <= screenTable[weekDay][hour]) |
---|
277 | currentPos = screenTable[weekDay][hour]+1; |
---|
278 | } |
---|
279 | for (var hour = parseInt(start_,10); hour < parseInt(end_,10);(hour%100 == 30)?hour+=70:hour+=30) |
---|
280 | screenTable[weekDay][hour] = currentPos; |
---|
281 | eventDiv.style.left = 90+(205*(currentPos-1)) + "px" ; |
---|
282 | eventDiv.onmouseover = function(){ createButtons(eventDiv); }; |
---|
283 | eventDiv.onmouseout = function(){ removeButtons(eventDiv); }; |
---|
284 | var resizeDiv = document.createElement('DIV'); |
---|
285 | resizeDiv.id = "resize_" + eventDiv.id; |
---|
286 | resizeDiv.className = 'resize_div'; |
---|
287 | resizeDiv.onmousedown = function() { resizeEvent(eventDiv); }; |
---|
288 | eventDiv.appendChild(resizeDiv); |
---|
289 | } |
---|
290 | if (viewType == "Week"){ |
---|
291 | var tempDate = new Date; |
---|
292 | tempDate.setTime(eventDiv.childNodes[1].id); |
---|
293 | if (!screenTable[tempDate.getDay()]) |
---|
294 | screenTable[tempDate.getDay()] = new Array(); |
---|
295 | currentPos = 1; |
---|
296 | if (!screenTable[tempDate.getDay()][start_]) |
---|
297 | screenTable[tempDate.getDay()][start_] = 0; |
---|
298 | |
---|
299 | if (currentPos <= screenTable[tempDate.getDay()][start_]) |
---|
300 | currentPos = screenTable[tempDate.getDay()][start_]+1; |
---|
301 | screenTable[tempDate.getDay()][start_] = currentPos; |
---|
302 | |
---|
303 | var widthValue = 100; |
---|
304 | eventDiv.style.width = widthValue+"px"; |
---|
305 | |
---|
306 | var headerElement = document.getElementById('weekHeader_'+timeStamp2id(eventDiv.childNodes[1].id).substr(0,8)); |
---|
307 | if (currentPos > 1) |
---|
308 | eventDiv.style.left = (10+(tempDate.getDay()*122)+(widthValue*currentPos))+"px"; |
---|
309 | headerElement.style.width = (widthValue*currentPos)+"px"; |
---|
310 | eventDiv.style.height = "20px"; |
---|
311 | eventDiv.style.cursor = "pointer"; |
---|
312 | eventDiv.onmouseover = function () { this.style.height = "auto"; this.style.zIndex = 2;}; |
---|
313 | eventDiv.onmouseout = function () { this.style.height = "20px"; this.style.zIndex = 1; }; |
---|
314 | eventDiv.onclick = function () { calendar.getView('div_main','Day','&time='+timeStamp2id(eventDiv.childNodes[1].id).substr(0,8)); }; |
---|
315 | } |
---|
316 | |
---|
317 | var tdElement = document.getElementById(timeStamp2id(eventDiv.childNodes[0].id)); |
---|
318 | |
---|
319 | if (viewType == "Month"){ |
---|
320 | var tdElement = document.getElementById(timeStamp2id(eventDiv.childNodes[0].id).substr(0,8)+'0000'); |
---|
321 | eventDiv.style.width = "60px"; |
---|
322 | eventDiv.style.height = "15px"; |
---|
323 | eventDiv.onmouseover = function () { if (this.childNodes[2].length > 9) this.style.width = "auto"; this.style.zIndex = 2; }; |
---|
324 | eventDiv.onmouseout = function () { this.style.width = "60px"; this.style.zIndex = 1; }; |
---|
325 | eventDiv.onclick = function () { calendar.getView('div_main','Day','&time='+timeStamp2id(eventDiv.childNodes[1].id).substr(0,8)); }; |
---|
326 | eventDiv.style.cursor = "pointer"; |
---|
327 | |
---|
328 | tdElement.style.height = (tdElement.childNodes.length * 10) + "px"; |
---|
329 | |
---|
330 | if (tdElement.childNodes.length > 3) |
---|
331 | eventDiv.style.margin = "20 0 0 "+(20+(tdElement.childNodes.length-4)*25); |
---|
332 | else |
---|
333 | eventDiv.style.margin = "0 0 0 "+(20+(tdElement.childNodes.length-1)*25); |
---|
334 | } |
---|
335 | |
---|
336 | eventDiv.style.top = (tdElement.offsetTop + 160) + "px"; |
---|
337 | tdElement.appendChild(eventDiv); |
---|
338 | } |
---|
339 | |
---|
340 | |
---|