1 | /**********************************************************************
|
---|
2 | * Calendar JavaScript [DOM] v3.11 by Michael Loesler *
|
---|
3 | ************************************************************************
|
---|
4 | * Copyright (C) 2005-09 by Michael Loesler, http//derletztekick.com *
|
---|
5 | * *
|
---|
6 | * *
|
---|
7 | * This program is free software; you can redistribute it and/or modify *
|
---|
8 | * it under the terms of the GNU General Public License as published by *
|
---|
9 | * the Free Software Foundation; either version 3 of the License, or *
|
---|
10 | * (at your option) any later version. *
|
---|
11 | * *
|
---|
12 | * This program is distributed in the hope that it will be useful, *
|
---|
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
---|
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
---|
15 | * GNU General Public License for more details. *
|
---|
16 | * *
|
---|
17 | * You should have received a copy of the GNU General Public License *
|
---|
18 | * along with this program; if not, see <http://www.gnu.org/licenses/> *
|
---|
19 | * or write to the *
|
---|
20 | * Free Software Foundation, Inc., *
|
---|
21 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
---|
22 | * *
|
---|
23 | **********************************************************************/
|
---|
24 | /*
|
---|
25 | function logout()
|
---|
26 | {
|
---|
27 | var xmlHttp = new XMLHttpRequest();
|
---|
28 | xmlHttp.open('POST', "calendar.php?logout=1", true);
|
---|
29 | xmlHttp.onload = function ()
|
---|
30 | {
|
---|
31 | if (xmlHttp.status!=200)
|
---|
32 | {
|
---|
33 | alert("ERROR - HTTP request: "+xmlHttp.statusText+" ["+xmlHttp.status+"]");
|
---|
34 | return;
|
---|
35 | }
|
---|
36 |
|
---|
37 | alert("Logout successful!");
|
---|
38 | };
|
---|
39 |
|
---|
40 | xmlHttp.send();
|
---|
41 | }
|
---|
42 | */
|
---|
43 | function resize()
|
---|
44 | {
|
---|
45 | var table = document.getElementById("table");
|
---|
46 |
|
---|
47 | var W = window.innerWidth;
|
---|
48 | var H = window.innerHeight;
|
---|
49 |
|
---|
50 | table.style.width =W+"px";
|
---|
51 | table.style.height=H+"px";
|
---|
52 | }
|
---|
53 |
|
---|
54 | var institutes= ["Shift", "Debug", "EPFL", "ETHZ", "ISDC", "UNIDO", "UNIGE", "UNIWUE" ];
|
---|
55 |
|
---|
56 | function CalendarJS()
|
---|
57 | {
|
---|
58 | this.now = new Date();
|
---|
59 | this.dayname = ["Mo","Tu","We","Th","Fr","Sa","So"];
|
---|
60 | this.monthname = ["January","February","March","April","May","June","July","August","September","October","November","December"];
|
---|
61 | this.tooltip = ["previous month","next month","current date","last year","next year"];
|
---|
62 | this.monthCell = document.createElement("th");
|
---|
63 | this.tableHead = null;
|
---|
64 | this.tableFoot = null;
|
---|
65 | this.parEl = null;
|
---|
66 |
|
---|
67 | this.init = function( id, initDate )
|
---|
68 | {
|
---|
69 | this.now = initDate ? initDate : new Date();
|
---|
70 | this.date = this.now.getDate();
|
---|
71 | this.month = this.mm = this.now.getMonth();
|
---|
72 | this.year = this.yy = this.now.getFullYear();
|
---|
73 | this.monthCell.appendChild(document.createTextNode( this.monthname[this.mm]+"\u00a0"+this.yy ));
|
---|
74 |
|
---|
75 | this.tableHead = this.createTableHead();
|
---|
76 | this.tableFoot = this.createTableFoot();
|
---|
77 |
|
---|
78 | this.parEl = document.getElementById( id );
|
---|
79 | this.show();
|
---|
80 |
|
---|
81 | if (!initDate)
|
---|
82 | this.checkDate();
|
---|
83 | };
|
---|
84 |
|
---|
85 | this.checkDate = function()
|
---|
86 | {
|
---|
87 | var self = this;
|
---|
88 | var today = new Date();
|
---|
89 |
|
---|
90 | if (this.date != today.getDate())
|
---|
91 | {
|
---|
92 | this.tableHead = this.createTableHead();
|
---|
93 | this.tableFoot = this.createTableFoot();
|
---|
94 |
|
---|
95 | this.date = today.getDate();
|
---|
96 | if (this.mm == this.month && this.yy == this.year)
|
---|
97 | this.switchMonth("current");
|
---|
98 |
|
---|
99 | this.month = today.getMonth();
|
---|
100 | if (this.mm == this.month && this.yy == this.year)
|
---|
101 | this.switchMonth("current");
|
---|
102 |
|
---|
103 | this.year = today.getFullYear();
|
---|
104 | if (this.mm == this.month && this.yy == this.year)
|
---|
105 | this.switchMonth("current");
|
---|
106 | }
|
---|
107 | window.setTimeout(function() { self.checkDate(); }, Math.abs(new Date(this.year, this.month, this.date, 24, 0, 0)-this.now));
|
---|
108 | },
|
---|
109 |
|
---|
110 | this.removeElements = function( Obj )
|
---|
111 | {
|
---|
112 | while( Obj.childNodes.length > 0)
|
---|
113 | Obj.removeChild(Obj.lastChild);
|
---|
114 |
|
---|
115 | return Obj;
|
---|
116 | };
|
---|
117 |
|
---|
118 | this.show = function()
|
---|
119 | {
|
---|
120 | this.parEl = this.removeElements( this.parEl );
|
---|
121 | this.monthCell.firstChild.replaceData(0, this.monthCell.firstChild.nodeValue.length, this.monthname[this.mm]+"\u00a0"+this.yy);
|
---|
122 |
|
---|
123 | var table = document.createElement("table");
|
---|
124 | table.id = "table";
|
---|
125 |
|
---|
126 | this.parEl.appendChild( table );
|
---|
127 |
|
---|
128 | table.appendChild( this.tableHead );
|
---|
129 | table.appendChild( this.tableFoot );
|
---|
130 |
|
---|
131 | table.appendChild( this.createTableBody(window.innerHeight-table.offsetHeight) );
|
---|
132 |
|
---|
133 | resize();
|
---|
134 | };
|
---|
135 |
|
---|
136 | this.createTableFoot = function()
|
---|
137 | {
|
---|
138 | var tfoot = document.createElement("tfoot");
|
---|
139 |
|
---|
140 | var tr = document.createElement("tr");
|
---|
141 | var td = document.createElement("td");
|
---|
142 | td.height = "1%";
|
---|
143 | td.colSpan = 7;
|
---|
144 | td.style.padding="3px 3px";
|
---|
145 | tfoot.appendChild(tr);
|
---|
146 | tr.appendChild(td);
|
---|
147 | var table = document.createElement("table");
|
---|
148 | table.width="100%";
|
---|
149 | td.appendChild(table);
|
---|
150 | tr = document.createElement("tr");
|
---|
151 | table.appendChild(tr);
|
---|
152 | for (var i=0; i<institutes.length; i++)
|
---|
153 | {
|
---|
154 | td = document.createElement("td");
|
---|
155 | td.width=100/institutes.length+"%";
|
---|
156 | td.setAttribute("style", "text-align:center;font-size:1em;border:solid #112A5D 2px;padding:3px 3px;");
|
---|
157 | td.changeUser = this.changeUser;
|
---|
158 | td.onclick = function(e) { this.changeUser(); }
|
---|
159 | td.appendChild(document.createTextNode(institutes[i]));
|
---|
160 | tr.appendChild(td);
|
---|
161 |
|
---|
162 | if (i==0)
|
---|
163 | td.style.backgroundColor = "yellow";
|
---|
164 | }
|
---|
165 | document.getElementById("body").setAttribute("data-user", institutes[0]);
|
---|
166 |
|
---|
167 |
|
---|
168 | tr = document.createElement("tr");
|
---|
169 | td = document.createElement("td");
|
---|
170 | td.colSpan = 7;
|
---|
171 | td.style.paddingLeft = "0px";
|
---|
172 | td.style.paddingTop = "0px";
|
---|
173 | td.height = "1%";
|
---|
174 | var form = document.createElement("form");
|
---|
175 | var input = document.createElement("textarea");
|
---|
176 | input.overflow = "auto";
|
---|
177 | input.wrap = "virtual";
|
---|
178 | input.id = "comment";
|
---|
179 | input.value = "enter comment here";
|
---|
180 | input.style.color = "#888";
|
---|
181 | input.style.width = "100%";
|
---|
182 | input.rows = 5;
|
---|
183 | input.title = "Enter a comment. Click somewhere in the calender to store the comment.";
|
---|
184 | input.onchange = function() { pushComment(); };
|
---|
185 | input.onfocus = function() { if (input.value=="enter comment here" && input.style.color!="black") input.value=""; input.style.color="black"; };
|
---|
186 | input.onblur = function() { input.style.color="#888"; if (input.value=="") input.value="enter comment here"; };
|
---|
187 | form.appendChild(input);
|
---|
188 | td.appendChild( form );
|
---|
189 | tr.appendChild( td );
|
---|
190 | tfoot.appendChild(tr);
|
---|
191 |
|
---|
192 | tr = document.createElement("tr");
|
---|
193 |
|
---|
194 | var td = document.createElement("td");
|
---|
195 | td.height="1%";
|
---|
196 | td.colSpan=7;
|
---|
197 | tr.appendChild(td);
|
---|
198 |
|
---|
199 | var tab = document.createElement("table");
|
---|
200 | var tr2 = document.createElement("tr");
|
---|
201 | tab.width="100%";
|
---|
202 | tab.cellSpacing=0;
|
---|
203 | tab.cellPadding=0;
|
---|
204 | tab.style.borderWidth = 0;
|
---|
205 | tab.style.fontSize = "1.5em";
|
---|
206 | tab.style.marginBottom = "2px";
|
---|
207 | td.appendChild(tab);
|
---|
208 | tab.appendChild(tr2);
|
---|
209 |
|
---|
210 | var tm = this.getCell( "td", this.timeTrigger(), "clock" );
|
---|
211 | tm.style.whiteSpace="nowrap";
|
---|
212 | tm.style.paddingLeft = "0px";
|
---|
213 | tm.style.width="33%";
|
---|
214 | tr2.appendChild( tm );
|
---|
215 |
|
---|
216 | var self = this;
|
---|
217 | window.setInterval(function() { tm.firstChild.nodeValue = self.timeTrigger(); }, 500);
|
---|
218 |
|
---|
219 | var td = document.createElement("td");
|
---|
220 | td.style.width="33%";
|
---|
221 | td.style.textAlign="center";
|
---|
222 | var a = document.createElement("a");
|
---|
223 | a.href = "overview.png";
|
---|
224 | a.style.whiteSpace="nowrap";
|
---|
225 | a.appendChild(document.createTextNode("click here for help"));
|
---|
226 | td.appendChild(a);
|
---|
227 | tr2.appendChild( td );
|
---|
228 |
|
---|
229 | td = this.getCell( "td", "logout", "logout");
|
---|
230 | td.style.width="33%";
|
---|
231 | td.onclick = function(e) { logout(); }
|
---|
232 | td.style.paddingRight = "0px";
|
---|
233 | tr2.appendChild( td );
|
---|
234 |
|
---|
235 | tfoot.appendChild( tr );
|
---|
236 |
|
---|
237 | return tfoot;
|
---|
238 | }
|
---|
239 |
|
---|
240 | this.createTableHead = function()
|
---|
241 | {
|
---|
242 | var thead = document.createElement("thead");
|
---|
243 | thead.style.height="1%";
|
---|
244 | var tr = document.createElement("tr");
|
---|
245 | var th = this.getCell( "th", "\u00AB", "prev_month" );
|
---|
246 |
|
---|
247 | th.rowSpan = 2;
|
---|
248 | th.Instanz = this;
|
---|
249 | th.onclick = function() { this.Instanz.switchMonth("prev"); };
|
---|
250 | th.title = this.tooltip[0];
|
---|
251 |
|
---|
252 | try { th.style.cursor = "pointer"; } catch(e){ th.style.cursor = "hand"; }
|
---|
253 | tr.appendChild( th );
|
---|
254 |
|
---|
255 | this.monthCell.Instanz = this;
|
---|
256 | this.monthCell.rowSpan = 2;
|
---|
257 | this.monthCell.colSpan = 4;
|
---|
258 | this.monthCell.onclick = function() { this.Instanz.switchMonth("current"); };
|
---|
259 | this.monthCell.title = this.tooltip[2];
|
---|
260 |
|
---|
261 | try { this.monthCell.style.cursor = "pointer"; } catch(e){ this.monthCell.style.cursor = "hand"; }
|
---|
262 | tr.appendChild( this.monthCell );
|
---|
263 |
|
---|
264 | th = this.getCell( "th", "\u00BB", "next_month" );
|
---|
265 | th.rowSpan = 2;
|
---|
266 | th.Instanz = this;
|
---|
267 | th.onclick = function() { this.Instanz.switchMonth("next"); };
|
---|
268 | th.title = this.tooltip[1];
|
---|
269 |
|
---|
270 | try { th.style.cursor = "pointer"; } catch(e){ th.style.cursor = "hand"; }
|
---|
271 | tr.appendChild( th );
|
---|
272 |
|
---|
273 | th = this.getCell( "th", "\u02c4", "prev_year" );
|
---|
274 | th.Instanz = this;
|
---|
275 | th.onclick = function() { this.Instanz.switchMonth("prev_year"); };
|
---|
276 | th.title = this.tooltip[3];
|
---|
277 |
|
---|
278 | try { th.style.cursor = "pointer"; } catch(e){ th.style.cursor = "hand"; }
|
---|
279 | tr.appendChild( th );
|
---|
280 |
|
---|
281 | thead.appendChild( tr );
|
---|
282 |
|
---|
283 | tr = document.createElement("tr");
|
---|
284 | th = this.getCell( "th", "\u02c5", "next_year" );
|
---|
285 | th.Instanz = this;
|
---|
286 | th.onclick = function() { this.Instanz.switchMonth("next_year"); };
|
---|
287 | th.title = this.tooltip[4];
|
---|
288 |
|
---|
289 | try { th.style.cursor = "pointer"; } catch(e){ th.style.cursor = "hand"; }
|
---|
290 | tr.appendChild( th );
|
---|
291 |
|
---|
292 | thead.appendChild( tr );
|
---|
293 |
|
---|
294 | tr = document.createElement('tr');
|
---|
295 | for (var i=0; i<this.dayname.length; i++)
|
---|
296 | {
|
---|
297 | var th = this.getCell("th", this.dayname[i], "weekday" );
|
---|
298 | th.width=100/7+"%";
|
---|
299 | tr.appendChild( th );
|
---|
300 | }
|
---|
301 |
|
---|
302 | thead.appendChild( tr );
|
---|
303 |
|
---|
304 | return thead;
|
---|
305 | },
|
---|
306 |
|
---|
307 | this.createTableBody = function(height)
|
---|
308 | {
|
---|
309 | var dayspermonth = [31,28,31,30,31,30,31,31,30,31,30,31];
|
---|
310 | var sevendaysaweek = 0;
|
---|
311 | var begin = new Date(this.yy, this.mm, 1);
|
---|
312 | var firstday = begin.getDay()-1;
|
---|
313 | if (firstday < 0)
|
---|
314 | firstday = 6;
|
---|
315 | if ((this.yy%4==0) && ((this.yy%100!=0) || (this.yy%400==0)))
|
---|
316 | dayspermonth[1] = 29;
|
---|
317 |
|
---|
318 | var tbody = document.createElement("tbody");
|
---|
319 | var tr = document.createElement('tr');
|
---|
320 |
|
---|
321 | tbody.height="100%";
|
---|
322 |
|
---|
323 | var height="";//"20%";//100/8+"%";
|
---|
324 |
|
---|
325 | if (firstday == 0)
|
---|
326 | {
|
---|
327 | for (var i=0; i<this.dayname.length; i++)
|
---|
328 | {
|
---|
329 | var prevMonth = (this.mm == 0)?11:this.mm-1;
|
---|
330 | var td = this.getCell( "td", dayspermonth[prevMonth]-6+i, "last_month" );
|
---|
331 | td.style.height=height;
|
---|
332 | tr.appendChild( td );
|
---|
333 | }
|
---|
334 | tbody.appendChild( tr );
|
---|
335 | tr = document.createElement('tr');
|
---|
336 | }
|
---|
337 |
|
---|
338 | for (var i=0; i<firstday; i++, sevendaysaweek++)
|
---|
339 | {
|
---|
340 | var prevMonth = (this.mm == 0)?11:this.mm-1;
|
---|
341 | var td = this.getCell( "td", dayspermonth[prevMonth]-firstday+i+1, "last_month" );
|
---|
342 | td.style.height=height;
|
---|
343 | tr.appendChild( td );
|
---|
344 | }
|
---|
345 |
|
---|
346 | for (var i=1; i<=dayspermonth[this.mm]; i++, sevendaysaweek++)
|
---|
347 | {
|
---|
348 | if (this.dayname.length == sevendaysaweek)
|
---|
349 | {
|
---|
350 | tbody.appendChild( tr );
|
---|
351 | tr = document.createElement('tr');
|
---|
352 | sevendaysaweek = 0;
|
---|
353 | }
|
---|
354 |
|
---|
355 | var td = null;
|
---|
356 | if (i==this.date && this.mm==this.month && this.yy==this.year && (sevendaysaweek == 5 || sevendaysaweek == 6))
|
---|
357 | td = this.getCell( "td", i, "today weekend" );
|
---|
358 | else
|
---|
359 | if (i==this.date && this.mm==this.month && this.yy==this.year)
|
---|
360 | td = this.getCell( "td", i, "today" );
|
---|
361 | else
|
---|
362 | if (sevendaysaweek == 5 || sevendaysaweek == 6)
|
---|
363 | td = this.getCell( "td", i, "weekend" );
|
---|
364 | else
|
---|
365 | td = this.getCell( "td", i, null);
|
---|
366 |
|
---|
367 | td.setDate = this.setDate;
|
---|
368 | td.chooseDate = this.chooseDate;
|
---|
369 | td.dd = i;
|
---|
370 | td.mm = this.mm;
|
---|
371 | td.yy = this.yy;
|
---|
372 | td.id = this.mm+"-"+i;
|
---|
373 | td.title = "Click to select this date.";
|
---|
374 |
|
---|
375 | td.style.height=height;
|
---|
376 |
|
---|
377 | td.onclick = function(e) {
|
---|
378 | this.chooseDate();
|
---|
379 | };
|
---|
380 |
|
---|
381 | var tab = document.createElement("table");
|
---|
382 | tab.width="100%";
|
---|
383 | tab.style.border = 0;
|
---|
384 | tab.style.padding = 0;
|
---|
385 | tab.style.margin = 0;
|
---|
386 | tab.style.fontSize = "1.5em";
|
---|
387 | tab.style.backgroundColor = "transparent";
|
---|
388 | var tr0 = document.createElement("tr");
|
---|
389 | var td0 = document.createElement("td");
|
---|
390 | var td1 = document.createElement("td");
|
---|
391 | td0.style.textAlign = "left";
|
---|
392 | td1.style.textAlign = "right";
|
---|
393 | td1.style.textWeight= "normal";
|
---|
394 | td0.style.color = "lightgray";
|
---|
395 | td0.style.border=0;
|
---|
396 | td1.style.border=0;
|
---|
397 | td0.style.padding=0;
|
---|
398 | td1.style.padding=0;
|
---|
399 | tab.appendChild(tr0);
|
---|
400 | tr0.appendChild(td0);
|
---|
401 | tr0.appendChild(td1);
|
---|
402 | //td0.appendChild(document.createTextNode(txt));
|
---|
403 |
|
---|
404 | td1.appendChild(td.firstChild);
|
---|
405 | td.appendChild(tab);
|
---|
406 |
|
---|
407 | var IP = this.getMoonPhase(this.yy, this.mm, i);
|
---|
408 | var str = this.getMoonPhaseStr(IP);
|
---|
409 | var phase = 100-Math.abs(IP-0.5)*200;
|
---|
410 | var txt = parseInt(phase+0.5,10)+"%";
|
---|
411 | if (phase>50)
|
---|
412 | td0.style.color = "gray";
|
---|
413 | if (phase<3.4)
|
---|
414 | {
|
---|
415 | txt = "o";
|
---|
416 | td0.style.textWeight = "bolder";
|
---|
417 | td0.style.fontSize = "0.7em";
|
---|
418 | td0.style.color = "darkgreen";
|
---|
419 | }
|
---|
420 | if (phase>96.6)
|
---|
421 | {
|
---|
422 | txt = "•";
|
---|
423 | td0.style.textWeight = "bolder";
|
---|
424 | td0.style.fontSize = "0.8em";
|
---|
425 | td0.style.color = "darkred";
|
---|
426 | }
|
---|
427 | tab.title = str;
|
---|
428 | td0.innerHTML = txt;
|
---|
429 |
|
---|
430 | var sp = document.createElement("span");
|
---|
431 | sp.appendChild(document.createTextNode("*"));
|
---|
432 | sp.style.color="darkred";
|
---|
433 | sp.style.display="none";
|
---|
434 | td1.appendChild(sp);
|
---|
435 |
|
---|
436 |
|
---|
437 | tr.appendChild( td );
|
---|
438 | }
|
---|
439 |
|
---|
440 | var daysNextMonth = 1;
|
---|
441 | for (var i=sevendaysaweek; i<this.dayname.length; i++)
|
---|
442 | tr.appendChild( this.getCell( "td", daysNextMonth++, "next_month" ) );
|
---|
443 |
|
---|
444 | tbody.appendChild( tr );
|
---|
445 |
|
---|
446 | while (tbody.getElementsByTagName("tr").length<6) {
|
---|
447 | tr = document.createElement('tr');
|
---|
448 | for (var i=0; i<this.dayname.length; i++)
|
---|
449 | {
|
---|
450 | var td = this.getCell( "td", daysNextMonth++, "next_month" );
|
---|
451 | td.style.height=height;
|
---|
452 | tr.appendChild( td );
|
---|
453 | }
|
---|
454 | tbody.appendChild( tr );
|
---|
455 | }
|
---|
456 |
|
---|
457 | requestAll(this.yy, this.mm);
|
---|
458 | requestAllComments(this.yy, this.mm);
|
---|
459 | if (this.year==this.yy && this.month==this.mm)
|
---|
460 | requestComment(this.year, this.month, this.date);
|
---|
461 | else
|
---|
462 | {
|
---|
463 | var c = document.getElementById("comment");
|
---|
464 | c.color="#888";
|
---|
465 | c.value="enter comment here";
|
---|
466 | }
|
---|
467 |
|
---|
468 | return tbody;
|
---|
469 | };
|
---|
470 |
|
---|
471 | this.getCalendarWeek = function(j,m,t)
|
---|
472 | {
|
---|
473 | var cwDate = this.now;
|
---|
474 | if (!t)
|
---|
475 | {
|
---|
476 | j = cwDate.getFullYear();
|
---|
477 | m = cwDate.getMonth();
|
---|
478 | t = cwDate.getDate();
|
---|
479 | }
|
---|
480 | cwDate = new Date(j,m,t);
|
---|
481 |
|
---|
482 | var doDat = new Date(cwDate.getTime() + (3-((cwDate.getDay()+6) % 7)) * 86400000);
|
---|
483 | cwYear = doDat.getFullYear();
|
---|
484 |
|
---|
485 | var doCW = new Date(new Date(cwYear,0,4).getTime() + (3-((new Date(cwYear,0,4).getDay()+6) % 7)) * 86400000);
|
---|
486 | cw = Math.floor(1.5+(doDat.getTime()-doCW.getTime())/86400000/7);
|
---|
487 | return cw;
|
---|
488 | };
|
---|
489 |
|
---|
490 | function request(td)
|
---|
491 | {
|
---|
492 | var user = document.getElementById("body").getAttribute("data-user");
|
---|
493 | var uri = "calendar.php?toggle&y="+td.yy+"&m="+td.mm+"&d="+td.dd;
|
---|
494 | if (user!="Shift" && user!="Debug")
|
---|
495 | uri += "&u="+user;
|
---|
496 | else
|
---|
497 | uri += "&x="+(user=="Debug"?1:0);
|
---|
498 |
|
---|
499 | var xmlHttp = new XMLHttpRequest();
|
---|
500 | xmlHttp.open('POST', uri, true);
|
---|
501 | xmlHttp.onload = function ()
|
---|
502 | {
|
---|
503 | if (xmlHttp.status!=200)
|
---|
504 | {
|
---|
505 | alert("ERROR - HTTP request: "+xmlHttp.statusText+" ["+xmlHttp.status+"]");
|
---|
506 | return;
|
---|
507 | }
|
---|
508 |
|
---|
509 | var lines = xmlHttp.responseText.split('\n');
|
---|
510 | if (lines.length==0)
|
---|
511 | return;
|
---|
512 |
|
---|
513 | while (td.childNodes.length>1)
|
---|
514 | td.removeChild(td.lastChild);
|
---|
515 |
|
---|
516 | for (var i=0; i<lines.length; i++)
|
---|
517 | {
|
---|
518 | var x = lines[i].split('\t');
|
---|
519 | if (x.length!=3)
|
---|
520 | continue;
|
---|
521 |
|
---|
522 | var div = document.createElement("div");
|
---|
523 | div.style.fontWeight="normal";
|
---|
524 | div.appendChild(document.createTextNode(x[2]=="1"?'('+x[1]+')':x[1]));
|
---|
525 | td.appendChild(div);
|
---|
526 |
|
---|
527 | for (var j=0; j<institutes.length; j++)
|
---|
528 | if (x[1]==institutes[j])
|
---|
529 | {
|
---|
530 | div.className += " institute";
|
---|
531 | break;
|
---|
532 | }
|
---|
533 | }
|
---|
534 |
|
---|
535 | if (td.childNodes.length>1)
|
---|
536 | td.className += " enabled";
|
---|
537 | else
|
---|
538 | td.className = td.className.replace(/enabled/g, "");
|
---|
539 | };
|
---|
540 |
|
---|
541 | xmlHttp.send();
|
---|
542 | }
|
---|
543 |
|
---|
544 | function logout()
|
---|
545 | {
|
---|
546 | var xmlHttp = new XMLHttpRequest();
|
---|
547 | xmlHttp.open('POST', "calendar.php?logout", true);
|
---|
548 | xmlHttp.onload = function ()
|
---|
549 | {
|
---|
550 | if (xmlHttp.status!=401)
|
---|
551 | {
|
---|
552 | alert("ERROR - HTTP request: "+xmlHttp.statusText+" ["+xmlHttp.status+"]");
|
---|
553 | return;
|
---|
554 | }
|
---|
555 |
|
---|
556 | alert(xmlHttp.statusText);
|
---|
557 | };
|
---|
558 |
|
---|
559 | xmlHttp.send();
|
---|
560 | }
|
---|
561 |
|
---|
562 | function pushComment()
|
---|
563 | {
|
---|
564 | var c = document.getElementById("comment");
|
---|
565 |
|
---|
566 | var y = c.getAttribute("data-y");
|
---|
567 | var m = c.getAttribute("data-m");
|
---|
568 | var d = c.getAttribute("data-d");
|
---|
569 | var v = c.value;
|
---|
570 |
|
---|
571 | var uri = "calendar.php?y="+y+"&m="+m+"&d="+d+"&c="+encodeURIComponent(v);
|
---|
572 |
|
---|
573 | var xmlHttp = new XMLHttpRequest();
|
---|
574 | xmlHttp.open('POST', uri, true);
|
---|
575 | xmlHttp.onload = function()
|
---|
576 | {
|
---|
577 | if (xmlHttp.status!=200)
|
---|
578 | {
|
---|
579 | alert("ERROR - HTTP request: "+xmlHttp.statusText+" ["+xmlHttp.status+"]");
|
---|
580 | return;
|
---|
581 | }
|
---|
582 |
|
---|
583 | alert("Comment inserted successfully.");
|
---|
584 |
|
---|
585 | var td = document.getElementById(m+"-"+d);
|
---|
586 | var sp = td.firstChild.firstChild.lastChild.lastChild;
|
---|
587 | if (v=="")
|
---|
588 | {
|
---|
589 | sp.style.display="none";
|
---|
590 | td.title="Click to select this date.";
|
---|
591 | }
|
---|
592 | else
|
---|
593 | {
|
---|
594 | sp.style.display="";
|
---|
595 | td.title=v;
|
---|
596 | }
|
---|
597 |
|
---|
598 | };
|
---|
599 |
|
---|
600 | xmlHttp.send();
|
---|
601 | }
|
---|
602 |
|
---|
603 | function requestComment(yy, mm, dd)
|
---|
604 | {
|
---|
605 | var c = document.getElementById("comment");
|
---|
606 |
|
---|
607 | var y = c.getAttribute("data-y");
|
---|
608 | var m = c.getAttribute("data-m");
|
---|
609 | var d = c.getAttribute("data-d");
|
---|
610 |
|
---|
611 | if (y==yy && m==mm && d==dd)
|
---|
612 | return;
|
---|
613 |
|
---|
614 | var uri = "calendar.php?comment&y="+yy+"&m="+mm+"&d="+dd;
|
---|
615 | var xmlHttp = new XMLHttpRequest();
|
---|
616 | xmlHttp.open('POST', uri, true);
|
---|
617 | xmlHttp.onload = function ()
|
---|
618 | {
|
---|
619 | if (xmlHttp.status!=200)
|
---|
620 | {
|
---|
621 | alert("ERROR - HTTP request: "+xmlHttp.statusText+" ["+xmlHttp.status+"]");
|
---|
622 | return;
|
---|
623 | }
|
---|
624 |
|
---|
625 | var td = document.getElementById(mm+"-"+dd);
|
---|
626 | var sp = td.firstChild.firstChild.lastChild.lastChild;
|
---|
627 |
|
---|
628 | if (sp!=undefined)
|
---|
629 | {
|
---|
630 | c.color="#888";
|
---|
631 | if (xmlHttp.responseText=="")
|
---|
632 | {
|
---|
633 | c.value="enter comment here";
|
---|
634 | sp.style.display="none";
|
---|
635 | td.title="";
|
---|
636 | }
|
---|
637 | else
|
---|
638 | {
|
---|
639 | c.value = xmlHttp.responseText;
|
---|
640 | sp.style.display="";
|
---|
641 | td.title=xmlHttp.responseText;
|
---|
642 | }
|
---|
643 | }
|
---|
644 |
|
---|
645 | c.setAttribute("data-y", yy);
|
---|
646 | c.setAttribute("data-m", mm);
|
---|
647 | c.setAttribute("data-d", dd);
|
---|
648 | };
|
---|
649 |
|
---|
650 | xmlHttp.send();
|
---|
651 | }
|
---|
652 |
|
---|
653 | var xmlReqAll = null;
|
---|
654 | function requestAll(yy, mm)
|
---|
655 | {
|
---|
656 | if (xmlReqAll)
|
---|
657 | xmlReqAll.abort();
|
---|
658 |
|
---|
659 | var uri = "calendar.php?y="+yy+"&m="+mm;
|
---|
660 |
|
---|
661 | xmlReqAll = new XMLHttpRequest();
|
---|
662 | xmlReqAll.open('POST', uri, true);
|
---|
663 | xmlReqAll.onload = function ()
|
---|
664 | {
|
---|
665 | if (xmlReqAll.status!=200)
|
---|
666 | {
|
---|
667 | alert("ERROR - HTTP request: "+xmlReqAll.statusText+" ["+xmlReqAll.status+"]");
|
---|
668 | return;
|
---|
669 | }
|
---|
670 |
|
---|
671 | var lines = xmlReqAll.responseText.split('\n');
|
---|
672 | if (lines.length==0)
|
---|
673 | return;
|
---|
674 |
|
---|
675 | for (var i=0; i<lines.length; i++)
|
---|
676 | {
|
---|
677 | var x = lines[i].split('\t');
|
---|
678 | if (x.length!=3)
|
---|
679 | continue;
|
---|
680 |
|
---|
681 | var td = document.getElementById(mm+"-"+x[0]);
|
---|
682 |
|
---|
683 | var div = document.createElement("div");
|
---|
684 | div.style.fontWeight="normal";
|
---|
685 | div.appendChild(document.createTextNode(x[2]=="1"?'('+x[1]+')':x[1]));
|
---|
686 | td.appendChild(div);
|
---|
687 |
|
---|
688 | for (var j=0; j<institutes.length; j++)
|
---|
689 | if (x[1]==institutes[j])
|
---|
690 | {
|
---|
691 | div.className += " institute";
|
---|
692 | break;
|
---|
693 | }
|
---|
694 |
|
---|
695 | td.className += " enabled";
|
---|
696 | }
|
---|
697 | };
|
---|
698 |
|
---|
699 | xmlReqAll.send();
|
---|
700 | }
|
---|
701 |
|
---|
702 | var xmlReqCom = null;
|
---|
703 | function requestAllComments(yy, mm)
|
---|
704 | {
|
---|
705 | if (xmlReqCom)
|
---|
706 | xmlReqCom.abort();
|
---|
707 |
|
---|
708 | var uri = "calendar.php?comment&y="+yy+"&m="+mm;
|
---|
709 | xmlReqCom = new XMLHttpRequest();
|
---|
710 | xmlReqCom.open('POST', uri, true);
|
---|
711 | xmlReqCom.onload = function ()
|
---|
712 | {
|
---|
713 | if (xmlReqCom.status!=200)
|
---|
714 | {
|
---|
715 | alert("ERROR - HTTP request: "+xmlReqCom.statusText+" ["+xmlReqCom.status+"]");
|
---|
716 | return;
|
---|
717 | }
|
---|
718 |
|
---|
719 | if (xmlReqCom.responseText<4)
|
---|
720 | return;
|
---|
721 |
|
---|
722 | var pos = 6;
|
---|
723 |
|
---|
724 | while (pos<xmlReqCom.responseText.length)
|
---|
725 | {
|
---|
726 | var len = parseInt(xmlReqCom.responseText.substr(pos-6, 4), 10);
|
---|
727 | var dd = parseInt(xmlReqCom.responseText.substr(pos-2, 2), 10);
|
---|
728 | var com = xmlReqCom.responseText.substr(pos, len);
|
---|
729 | pos += len+6;
|
---|
730 |
|
---|
731 | if (com!="")
|
---|
732 | {
|
---|
733 | var td = document.getElementById(mm+"-"+dd);
|
---|
734 | var sp = td.firstChild.firstChild.lastChild.lastChild;
|
---|
735 | sp.style.display="";
|
---|
736 | td.title=com;
|
---|
737 | }
|
---|
738 | }
|
---|
739 | };
|
---|
740 |
|
---|
741 | xmlReqCom.send();
|
---|
742 | }
|
---|
743 |
|
---|
744 | this.setDate = function()
|
---|
745 | {
|
---|
746 | request(this);
|
---|
747 | };
|
---|
748 |
|
---|
749 | this.changeUser = function()
|
---|
750 | {
|
---|
751 | var sib = this.nextSibling;
|
---|
752 | while (sib)
|
---|
753 | {
|
---|
754 | sib.style.backgroundColor = "";
|
---|
755 | sib = sib.nextSibling;
|
---|
756 | }
|
---|
757 |
|
---|
758 | sib = this.previousSibling;
|
---|
759 | while (sib)
|
---|
760 | {
|
---|
761 | sib.style.backgroundColor = "";
|
---|
762 | sib = sib.previousSibling;
|
---|
763 | }
|
---|
764 |
|
---|
765 | this.style.backgroundColor = "yellow";
|
---|
766 |
|
---|
767 | document.getElementById("body").setAttribute("data-user", this.firstChild.textContent);
|
---|
768 | };
|
---|
769 |
|
---|
770 | this.chooseDate = function()
|
---|
771 | {
|
---|
772 | while (document.getElementsByClassName("choosen")[0])
|
---|
773 | {
|
---|
774 | var e = document.getElementsByClassName("choosen")[0];
|
---|
775 | e.title = "Click to select this date.";
|
---|
776 | e.className = e.className.replace(/choosen/g, "");
|
---|
777 | e.onclick = function() {
|
---|
778 | this.chooseDate();
|
---|
779 | };
|
---|
780 | }
|
---|
781 |
|
---|
782 | this.className += " choosen";
|
---|
783 | this.title = "Click again to add or remove your name.";
|
---|
784 |
|
---|
785 | requestComment(this.yy, this.mm, this.dd);
|
---|
786 |
|
---|
787 | this.onclick = function() {
|
---|
788 | this.setDate();
|
---|
789 | };
|
---|
790 | };
|
---|
791 |
|
---|
792 | this.timeTrigger = function()
|
---|
793 | {
|
---|
794 | var now = new Date();
|
---|
795 | var ss = (now.getSeconds()<10)?"0"+now.getSeconds():now.getSeconds();
|
---|
796 | var mm = (now.getMinutes()<10)?"0"+now.getMinutes():now.getMinutes();
|
---|
797 | var hh = (now.getHours() <10)?"0"+now.getHours() :now.getHours();
|
---|
798 |
|
---|
799 | var kw = "KW" + this.getCalendarWeek(this.year, this.month, this.date);
|
---|
800 | var str = hh+":"+mm+":"+ss+"\u00a0["+kw+"]";
|
---|
801 | return str;
|
---|
802 | };
|
---|
803 |
|
---|
804 | this.getCell = function(tag, str, cssClass)
|
---|
805 | {
|
---|
806 | var El = document.createElement( tag );
|
---|
807 | El.appendChild(document.createTextNode( str ));
|
---|
808 | if (cssClass != null)
|
---|
809 | El.className = cssClass;
|
---|
810 | return El;
|
---|
811 | },
|
---|
812 |
|
---|
813 | this.switchMonth = function( s )
|
---|
814 | {
|
---|
815 | switch (s)
|
---|
816 | {
|
---|
817 | case "prev":
|
---|
818 | this.yy = (this.mm == 0) ? this.yy-1 : this.yy;
|
---|
819 | this.mm = (this.mm == 0) ? 11 : this.mm-1;
|
---|
820 | break;
|
---|
821 |
|
---|
822 | case "next":
|
---|
823 | this.yy = (this.mm == 11) ? this.yy+1 : this.yy;
|
---|
824 | this.mm = (this.mm == 11) ? 0 : this.mm+1;
|
---|
825 | break;
|
---|
826 |
|
---|
827 | case "prev_year":
|
---|
828 | this.yy = this.yy-1;
|
---|
829 | break;
|
---|
830 |
|
---|
831 | case "next_year":
|
---|
832 | this.yy = this.yy+1;
|
---|
833 | break;
|
---|
834 |
|
---|
835 | case "current":
|
---|
836 | this.yy = this.year;
|
---|
837 | this.mm = this.month;
|
---|
838 | break;
|
---|
839 | }
|
---|
840 | this.show();
|
---|
841 | }
|
---|
842 |
|
---|
843 | this.getMoonPhase = function(Y, M, D)
|
---|
844 | {
|
---|
845 | // M=0..11 --> 1..12
|
---|
846 | M += 1;
|
---|
847 |
|
---|
848 | // calculate the Julian date at 12h UT
|
---|
849 | var YY = Y - Math.floor( ( 12 - M ) / 10 );
|
---|
850 | var MM = ( M + 9 ) % 12;
|
---|
851 |
|
---|
852 | var K1 = Math.floor( 365.25 * ( YY + 4712 ) );
|
---|
853 | var K2 = Math.floor( 30.6 * MM + 0.5 );
|
---|
854 | var K3 = Math.floor( Math.floor( ( YY / 100 ) + 49 ) * 0.75 ) - 38;
|
---|
855 |
|
---|
856 | var JD = K1 + K2 + D + 59; // for dates in Julian calendar
|
---|
857 | if ( JD > 2299160 ) // for Gregorian calendar
|
---|
858 | JD = JD - K3;
|
---|
859 |
|
---|
860 | // calculate moon's age in days
|
---|
861 | var IP = ( ( JD - 2451550.1 ) / 29.530588853 ) % 1;
|
---|
862 |
|
---|
863 | return IP;
|
---|
864 |
|
---|
865 | // Moon's age
|
---|
866 | //var AG = IP*29.53;
|
---|
867 | }
|
---|
868 |
|
---|
869 | this.getMoonPhaseStr = function(IP)
|
---|
870 | {
|
---|
871 | var phase = " ("+(100-Math.abs(IP-0.5)*200).toPrecision(2)+"%)";
|
---|
872 |
|
---|
873 | if (IP*16 < 1) return "New moon" + phase;
|
---|
874 | if (IP*16 < 3) return "Evening crescent" + phase;
|
---|
875 | if (IP*16 < 5) return "First quarter" + phase;
|
---|
876 | if (IP*16 < 7) return "Waxing gibbous" + phase;
|
---|
877 | if (IP*16 < 9) return "Full moon" + phase;
|
---|
878 | if (IP*16 <11) return "Waning gibbous" + phase;
|
---|
879 | if (IP*16 <13) return "Last quarter" + phase;
|
---|
880 | if (IP*16 <15) return "Morning crescent" + phase;
|
---|
881 |
|
---|
882 | return "New moon"+phase;
|
---|
883 | }
|
---|
884 | }
|
---|
885 |
|
---|
886 | var DOMContentLoaded = false;
|
---|
887 | function addContentLoadListener (func)
|
---|
888 | {
|
---|
889 | if (document.addEventListener)
|
---|
890 | {
|
---|
891 | var DOMContentLoadFunction = function ()
|
---|
892 | {
|
---|
893 | window.DOMContentLoaded = true;
|
---|
894 | func();
|
---|
895 | };
|
---|
896 |
|
---|
897 | document.addEventListener("DOMContentLoaded", DOMContentLoadFunction, false);
|
---|
898 | }
|
---|
899 |
|
---|
900 | var oldfunc = (window.onload || new Function());
|
---|
901 |
|
---|
902 | window.onload = function ()
|
---|
903 | {
|
---|
904 | if (!window.DOMContentLoaded)
|
---|
905 | {
|
---|
906 | oldfunc();
|
---|
907 | func();
|
---|
908 | }
|
---|
909 | };
|
---|
910 | }
|
---|
911 |
|
---|
912 | addContentLoadListener( function() {
|
---|
913 | new CalendarJS().init("calendar");
|
---|
914 | //new CalendarJS().init("calendar", new Date(2009, 1, 15));
|
---|
915 | } ); |
---|