source: sandbox/expressoCalendar/js/calendar_functions.js @ 1204

Revision 1204, 13.8 KB checked in by amuller, 15 years ago (diff)

Ticket #88 - Adaptação pro expresso2.0

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