source: trunk/expressoCalendar/js/calendar_functions.js @ 920

Revision 920, 13.4 KB checked in by amuller, 15 years ago (diff)

Ticket #88 - Melhorias na visualização mensal adição d dependencia a calendar

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