[632] | 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; |
---|
[656] | 11 | this.uid = calUid; |
---|
[696] | 12 | this.cat = ''; |
---|
| 13 | this.currentTime = new Date(); |
---|
[632] | 14 | } |
---|
| 15 | |
---|
| 16 | Calendar.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; |
---|
[665] | 33 | } catch (e) {}; |
---|
[632] | 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'); |
---|
[665] | 59 | if (is_ie) |
---|
| 60 | { |
---|
[632] | 61 | closeButton.style.left = '285px'; |
---|
| 62 | closeButton.style.top = '5px'; |
---|
[665] | 63 | } |
---|
| 64 | else |
---|
| 65 | { |
---|
[632] | 66 | closeButton.style.left = '320px'; |
---|
| 67 | closeButton.style.top = '25px'; |
---|
| 68 | } |
---|
| 69 | document.getElementById('dragEventSubject').focus(); |
---|
[920] | 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"); |
---|
[632] | 74 | |
---|
| 75 | |
---|
| 76 | this.lastId = _dragArea.endEvent; |
---|
| 77 | |
---|
| 78 | } |
---|
[696] | 79 | Calendar.prototype.getView = function(idEl, type, viewTime) |
---|
[632] | 80 | { |
---|
[961] | 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); |
---|
[696] | 89 | viewTime = calendar.currentTime.getTime(); |
---|
[961] | 90 | } |
---|
| 91 | |
---|
[696] | 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 | } |
---|
[632] | 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); |
---|
[696] | 107 | calendar.currentTime.setTime(id2timeStamp(document.getElementById('day').firstChild.id)); |
---|
| 108 | var dayMS = (60*60*24*1000); |
---|
[632] | 109 | if (viewType == "Week"){ |
---|
[696] | 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(); |
---|
[632] | 116 | } |
---|
| 117 | if (viewType == "Day"){ |
---|
[696] | 118 | this.previousView = calendar.currentTime.getTime()-dayMS; |
---|
| 119 | this.nextView = calendar.currentTime.getTime()+dayMS; |
---|
[632] | 120 | } |
---|
| 121 | if (viewType == 'Month'){ |
---|
[696] | 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(); |
---|
[632] | 130 | } |
---|
[696] | 131 | document.getElementById("l_date").innerHTML = "<a href=\"javascript:calendar.getView('div_main','"+viewType+"',this.previousView);\">\<\< </a>"; |
---|
[632] | 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") |
---|
[961] | 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>"; |
---|
[696] | 142 | document.getElementById("l_date").innerHTML += "<a href=\"javascript:calendar.getView('div_main','"+viewType+"',this.nextView);\"> \>\></a>"; |
---|
[632] | 143 | |
---|
[665] | 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); |
---|
[632] | 152 | } |
---|
[665] | 153 | XMLTools.__RETURN_MODE__ = 'XML'; |
---|
[696] | 154 | XMLTools.request('$this.uicalendar.getEvents'+type+"&time="+timeStamp2id(calendar.currentTime.getTime())+'&uid='+calendar.uid+'&cat='+calendar.cat, 'GET', getEventsDay); |
---|
[632] | 155 | |
---|
| 156 | }; |
---|
| 157 | |
---|
| 158 | XMLTools.__RETURN_MODE__ = 'XML'; |
---|
| 159 | viewType = type; |
---|
| 160 | screenTable = new Array(); |
---|
[696] | 161 | XMLTools.request('$this.uicalendar.getView'+type+"&time="+timeStamp2id(viewTime)+'&uid='+this.uid, 'GET', handler_getView); |
---|
| 162 | }; |
---|
[632] | 163 | |
---|
[656] | 164 | Calendar.prototype.resetView = function() |
---|
| 165 | { |
---|
| 166 | document.getElementById("div_main").innerHTML = ""; |
---|
| 167 | } |
---|
[632] | 168 | |
---|
| 169 | Calendar.prototype.parseView = function(data,type) |
---|
| 170 | { |
---|
| 171 | var _this = this; |
---|
[748] | 172 | var div = document.getElementById(this.idEl); |
---|
[632] | 173 | try { |
---|
[748] | 174 | var xsl = XMLTools.load('xsl/view'+type+'.xsl?'+ Date.parse(new Date)); |
---|
| 175 | div.innerHTML = xtools.parse(data, xsl); |
---|
[632] | 176 | } |
---|
| 177 | catch(e){ |
---|
| 178 | alert(e); |
---|
| 179 | } |
---|
| 180 | |
---|
[665] | 181 | if (type == 'Week' || type == 'Month') |
---|
| 182 | { |
---|
[632] | 183 | var trWeek = document.getElementById('tr_week'); |
---|
| 184 | for (var i=0; i < trWeek.childNodes.length; i++) |
---|
[748] | 185 | trWeek.childNodes[i].innerHTML = get_lang(trWeek.childNodes[i].innerHTML)+(type=='Week'?" "+id2String((trWeek.childNodes[i].id).substr(8)):""); |
---|
[632] | 186 | } |
---|
| 187 | }; |
---|
| 188 | |
---|
| 189 | |
---|
| 190 | Calendar.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 | } |
---|
| 211 | Calendar.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 | } |
---|
| 224 | Calendar.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 | } |
---|
[665] | 242 | return get_lang("%1 of %2",get_lang(month),(obj.getYear()+1900)); |
---|
[632] | 243 | } |
---|
| 244 | Calendar.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 | } |
---|
| 281 | var calendar = new Calendar(); |
---|
[665] | 282 | |
---|
| 283 | // This array stores the events in table to avoid conflict in screen |
---|
| 284 | var screenTable = new Array(); |
---|
| 285 | var today = new Date(); |
---|
| 286 | var weekDay = today.getDay(); |
---|
| 287 | function 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 = 90+(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 | |
---|
[748] | 332 | var headerElement = document.getElementById('weekday_'+timeStamp2id(eventDiv.childNodes[1].id).substr(0,8)); |
---|
[665] | 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; }; |
---|
[696] | 340 | eventDiv.onclick = function () { calendar.getView('div_main','Day',eventDiv.childNodes[1].id); }; |
---|
[665] | 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"; |
---|
[920] | 347 | eventDiv.style.height = "30px"; |
---|
[961] | 348 | eventDiv.onmouseover = function () { if (this.childNodes[2].length > 20) { this.style.width = "120px"; this.style.height = "auto"; } this.style.zIndex = 2; }; |
---|
[920] | 349 | eventDiv.onmouseout = function () { this.style.height = "30px"; this.style.width = "60px"; this.style.zIndex = 1; }; |
---|
[696] | 350 | eventDiv.onclick = function () { calendar.getView('div_main','Day',eventDiv.childNodes[1].id); }; |
---|
[665] | 351 | eventDiv.style.cursor = "pointer"; |
---|
| 352 | |
---|
| 353 | tdElement.style.height = (tdElement.childNodes.length * 10) + "px"; |
---|
| 354 | |
---|
[920] | 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; |
---|
[665] | 357 | } |
---|
[696] | 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); |
---|
[665] | 368 | |
---|
[696] | 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 | } |
---|
[665] | 387 | } |
---|