sideslide added
[brisk.git] / web / room.js
1 /* 
2    data = [ [ flags, name ],  ... ]
3    
4 */
5
6 function state_add(flags)
7 {
8     var content = "";
9     var st, name = "";
10     var tit = "";
11
12     if ((flags & 0xf00) != 0) {
13         st = flags & 0xf00;
14         switch (st) {
15         case 0x100:
16             name = "st_pau.png";
17             tit = "sono in pausa";
18             break;
19         case 0x200:
20             name = "st_out.png";
21             tit = "sono fuori";
22             break;
23         case 0x300:
24             name = "st_dog.png";
25             tit = "sono a spasso col cane";
26             break;
27         case 0x400:
28             name = "st_eat.png";
29             tit = "sto mangiando";
30             break;
31         case 0x500:
32             name = "st_wrk.png";
33             tit = "sono a lavoro";
34             break;
35         case 0x600:
36             name = "st_smk.png";
37             tit = "sto fumando una sigaretta (e facendomi venire il cancro)";
38             break;
39         case 0x700:
40             name = "st_eye.png";
41             tit = "sono presente!";
42             break;
43         default:
44             break;
45         }
46         if (name != "") {
47             content += '&nbsp;<img title="'+tit+'" class="unbo" src="img/'+name+'">';
48         }
49     }
50
51     return content;
52 }
53
54 var standup_data_old = null;
55
56 // TODO !!
57 // appendChild , removeChild
58
59 function table_add(curtag, td)
60 {
61     var tbody  = null, tr;
62
63     do {
64         // console.log("wt: "+curtag.tagName);
65
66         if (curtag.tagName.toLowerCase() == "div" || 
67             curtag.tagName.toLowerCase() == "table") {
68             curtag = curtag.firstChild;
69         }
70         else if (curtag.tagName.toLowerCase() == "tbody") {
71             tbody = curtag;
72             break;
73         }
74         else
75             curtag = null;
76     } while (curtag != null);
77     
78     curtag = tbody.firstChild;
79     ct = 0;
80     do {
81         if (curtag.tagName.toLowerCase() == "tr") {
82             if (curtag.firstChild != null) {
83                 curtag = curtag.firstChild;
84                 ct++;
85             }
86             else {
87                 curtag.appendChild(td);
88                 return(true);
89             }
90         }
91         else if (curtag.tagName.toLowerCase() == "td") {
92             if (curtag.nextSibling != null) {
93                 curtag = curtag.nextSibling;
94                 ct++;
95             }
96             else {
97                 if (ct < 4) {
98                     curtag.parentNode.appendChild(td);
99                     return (true);
100                 }
101                 else {
102                     ct = 0;
103                     curtag = curtag.parentNode.nextSibling;
104                 }
105             }
106         }
107         else {
108             curtag = curtag.parentNode;
109         }
110
111     } while (curtag != null);
112
113     tr = document.createElement("tr");
114     tr.appendChild(td);
115     tbody.appendChild(tr);
116
117     return (true);
118 }
119
120 function spcs(c1, c2, n)
121 {
122     var ret = "";
123     var i;
124
125     for (i = 0 ; i < n ; i++) {
126         if ((i % 2) == 0)
127             ret += c1;
128         else
129             ret += c2;
130     }
131
132     return (ret);
133 }
134
135
136 function table_walk(curtag)
137 {
138     do {
139         // console.log("wt: "+curtag.tagName);
140         if (curtag.tagName.toLowerCase() == "div" || 
141             curtag.tagName.toLowerCase() == "table" ||
142             curtag.tagName.toLowerCase() == "tbody") {
143             curtag = curtag.firstChild;
144         }
145         else if (curtag.tagName.toLowerCase() == "tr") {
146             if (curtag.firstChild != null)
147                 curtag = curtag.firstChild;
148             else if (curtag.tagName != '')
149                 curtag = curtag.nextSibling;
150             else
151                 curtag = null;
152         }
153         else if (curtag.tagName.toLowerCase() == "td") {
154             if (curtag.nextSibling != null)
155                 curtag = curtag.nextSibling;
156             else {
157                 if (curtag.parentNode.nextSibling != null && curtag.parentNode.nextSibling.tagName != '')
158                     curtag = curtag.parentNode.nextSibling;
159                 else
160                     curtag = null;
161             }
162         }
163         else
164             curtag = null;
165
166     } while (curtag != null && curtag.tagName.toLowerCase() != "td");
167
168     if (1 == 0) {
169         if (curtag == null)
170             alert("outtag == null"); 
171         else
172             alert("outtag: "+curtag.tagName);
173     }
174     return (curtag);
175 }
176
177 function j_stand_tdcont(el)
178 {
179     var content = "";
180
181     if (el[0] & 0x01)
182         content += '<b>';
183     
184     if (el[0] & 0x02)
185         content += '<i>';
186     
187     content += el[1];
188     
189     if (el[0] & 0x02)
190         content += '</i>';
191     
192     if (el[0] & 0x01)
193         content += '</b>';
194             
195     content += state_add(el[0]);
196     
197     return (content);
198 }
199
200 function j_stand_cont(data)
201 {
202     var i;
203     var content;
204     var st = 0, name = "";
205     var curtag, nextag;
206
207     if (standup_data_old == null || data.length < 4) {
208     // if (standup_data_old == null) {
209         
210         content = '<table cols="'+(data.length < 4 ? data.length : 4)+'" class="table_standup">';
211         for (i = 0 ; i < data.length ; i++) {
212             if ((i % 4) == 0)
213                 content += '<tr>';
214             content += '<td id="'+i+'" class="room_standup">';
215             content += j_stand_tdcont(data[i]);
216             content += '</td>';
217             
218             if ((i % 4) == 3)
219                 content += '</tr>';
220         }
221         content += '</table>';
222         
223         $("standup").innerHTML = content;
224
225         // console.log("inizio");
226         // for (i = 0 , curtag = table_walk($("standup")) ; curtag != null ;  curtag = table_walk(curtag), i++ ) {
227         //     console.log("inloop["+i+"]: "+curtag.tagName+"  ID: "+curtag.id);
228         // }
229         // console.log("fine "+i);
230
231         // walktable($("standup"), nextag);
232         // console.log($("standup").firstChild);
233         // console.log($("standup").firstChild.firstChild.firstChild.firstChild);
234
235         // log_walk($("standup"));
236
237         standup_data_old = data;
238     }
239     else {
240         var idx_del, arr_add, idx_mod, arr_mod;
241         var idx_del_n = 0, idx_add_n = 0, idx_mod_n = 0;
242         var i, e;
243         var i_del, i_mod, i_add;
244         var td;
245
246         idx_del = new Array();
247         arr_add = new Array();
248         map_add = new Array();
249         idx_mod = new Array();
250         arr_mod = new Array();
251         map_cur = new Array();
252         
253         // find removed entries
254         for (i = 0 ; i < standup_data_old.length ; i++) {
255             for (e = 0 ; e < data.length ; e++) {
256                 if (standup_data_old[i][1] == data[e][1]) {
257                     break;
258                 }
259             }
260             if (e == data.length) {
261                 idx_del[idx_del_n++] = i;
262                 map_cur[i] = -1;
263             }
264             else {
265                 /* modified entries */
266                 if (standup_data_old[i][0] != data[e][0]) {
267                     arr_mod[idx_mod_n] = data[e];
268                     idx_mod[idx_mod_n++] = i;
269                 }
270                 map_cur[i] = e;
271             }
272         }
273
274         // find new entries
275         for (e = 0 ; e < data.length ; e++) {
276             for (i = 0 ; i < standup_data_old.length ; i++) {
277                 if (data[e][1] == standup_data_old[i][1] ) {
278                     break;
279                 }
280             }
281             if (i == standup_data_old.length) {
282                 // console.log("ADD: "+data[e][1]);
283                 arr_add[idx_add_n]   = data[e];
284                 map_add[idx_add_n++] = e;
285             }
286         }
287         
288         // TODO: qui travaso add in del
289
290         i_del = 0;
291         // alert("del: ["+j_stand_tdcont(standup_data_old[idx_del[i_del]])+"]");
292         for (i = 0 , i_del = 0, i_mod = 0, i_add = 0, curtag = table_walk($("standup")) ; curtag != null ;  curtag = table_walk(curtag), i++ ) {
293             // console.log("cur.id: "+curtag.id);
294
295             // alert("i: "+i+"  tagname: "+curtag.tagName+"  innerHTML: ["+curtag.innerHTML+"]");
296             // console.log("inloop["+i+"]: "+curtag.tagName+"  ID: "+curtag.id);
297             if (curtag.innerHTML == "") {
298                 // console.log("innerHTML == none");
299                 if (i_add < idx_add_n) {
300                     // console.log("  to be new");
301                     // console.log("  add:   CONT:"+j_stand_tdcont(arr_add[i_add]));
302                     curtag.innerHTML = j_stand_tdcont(arr_add[i_add]);
303                     curtag.id = map_add[i_add];
304                     i_add++
305                 }
306             }
307
308             // else if (i_del < idx_del_n && curtag.innerHTML == j_stand_tdcont(standup_data_old[idx_del[i_del]])) {
309             else if (i_del < idx_del_n && curtag.id == idx_del[i_del]) {
310                 // console.log("to be cancel["+i+"]:  ID: "+curtag.id);
311                 if (i_add < idx_add_n) {
312                     // console.log("  to be new");
313                     // console.log("  add:   CONT:"+j_stand_tdcont(arr_add[i_add]));
314                     curtag.innerHTML = j_stand_tdcont(arr_add[i_add]);
315                     curtag.id = map_add[i_add];
316                     i_add++
317                 }
318                 else {
319                     // console.log("  to be del");
320                     curtag.innerHTML = "";
321                     curtag.id = -1;
322                 }
323                 i_del++;
324             }
325             // else if (i_mod < idx_mod_n && curtag.innerHTML == j_stand_tdcont(standup_data_old[idx_mod[i_mod]])) {
326             else if (i_mod < idx_mod_n && curtag.id == idx_mod[i_mod]) {
327                 // console.log("  to be mod");
328                 // console.log("mod: "+idx_mod[i_mod]+ "  CONT:"+j_stand_tdcont(arr_mod[i_mod]));
329                 curtag.innerHTML = j_stand_tdcont(arr_mod[i_mod]);
330                 curtag.id = map_cur[curtag.id];
331                 i_mod++;
332             }
333             else
334                 curtag.id = map_cur[curtag.id];
335         }
336         // console.log("fineloop");
337
338         for (i ; i_add < idx_add_n ; i_add++, i++) {
339             // console.log("ADD: "+i+" arr_add: "+ arr_add[i_add][1]);
340             td = document.createElement("td");
341             td.className = "room_standup";
342             td.id = map_add[i_add];
343             td.innerHTML = j_stand_tdcont(arr_add[i_add]);
344
345             table_add($("standup"), td);
346         }
347
348         standup_data_old = data;
349         return;
350     }
351     // $("esco").innerHTML =  '<input class="button" name="logout" value="Esco." onclick="esco_cb();" type="button">';
352 }
353
354 function esco_cb() {
355     window.onbeforeunload = null; 
356     window.onunload = null; 
357     // nonunload = true; 
358     act_logout();
359  };
360
361
362
363 function j_tab_cont(table_idx, data)
364 {
365     var i;
366     var content = '';
367
368     for (i = 0 ; i < data.length ; i++) {
369         if (data[i][0] & 0x01)
370             content += '<b>';
371
372         if (data[i][0] & 0x02)
373             content += '<i>';
374
375         content += data[i][1];
376         
377         if (data[i][0] & 0x02)
378             content += '</i>';
379
380         if (data[i][0] & 0x01)
381             content += '</b>';
382         content += state_add(data[i][0]);
383
384         content += '<br>';
385     }
386     $("table"+table_idx).innerHTML = content;
387 }
388
389 function j_tab_act_cont(idx, act)
390 {
391     if (act == 'sit') {
392         $("table_act"+idx).innerHTML = '<input type="button" class="button" name="xhenter'+idx+'"  value="Mi siedo." onclick="act_sitdown('+idx+');">';
393     }
394     else if (act == 'sitreser') {
395         // <img class="nobo" title="tavolo riservato agli utenti registrati" style="display: inline; margin-right: 80px;" src="img/okauth.png">
396         $("table_act"+idx).innerHTML = '<input type="button" style="background-repeat: no-repeat; background-position: center; background-image: url(\'img/okauth.png\');" class="button" name="xhenter'+idx+'"  value="Mi siedo." onclick="act_sitdown('+idx+');">';
397     }
398     else if (act == 'wake') {
399         $("table_act"+idx).innerHTML = '<input type="button" class="button" name="xwakeup"  value="Mi alzo." onclick="act_wakeup();">';
400     }
401     else if (act == 'reserved') {
402         $("table_act"+idx).innerHTML = '<img class="nobo" title="tavolo riservato agli utenti registrati" style="margin-right: 20px;" src="img/onlyauth.png">';
403     }
404     else {
405         $("table_act"+idx).innerHTML = '';
406     }
407 }
408
409 function j_login_manager(form)
410 {
411     var token;
412
413     if (form.elements['passid'].value == '')
414         return (true);
415
416     else {
417         // console.log("richiesta token");
418         /* richiede token */
419         token = server_request('mesg', 'getchallenge', 'cli_name', encodeURIComponent(form.elements['nameid'].value));
420         tokens = token.split('|');
421         
422         // console.log('XX token: '+token);
423         // console.log(tokens);
424         if (token == null)
425             return (false);
426
427         token = calcMD5(tokens[1]+calcMD5(form.elements['passid'].value));
428         
429         form.elements['passid_private'].value = token;
430         form.elements['passid'].value = ""; // FIXME da sost con la stessa len di A
431
432         return (true);
433     }
434     
435     return (false);
436 }
437
438 function login_formtext_hilite()
439 {
440     formtext_hilite($("nameid"));
441     formtext_hilite($("passid"));
442     formsub_hilite($("sub"));
443 }
444
445 function login_init()
446 {
447     menu_init();
448     login_formtext_hilite();
449 }
450
451 function warrant_formtext_hilite(form)
452 {
453     /*
454     formtext_hilite($("nameid"));
455     formtext_hilite($("emailid"));
456     formsub_hilite($("subid"));
457     formsub_hilite($("cloid"));
458     */
459     formtext_hilite(form.elements['name']);
460     formtext_hilite(form.elements['email']);
461     formsub_hilite(form.elements['sub']);
462     formsub_hilite(form.elements['clo']);
463 }
464
465 function mesgtoadm_formtext_hilite(form)
466 {
467     /*
468     formtext_hilite($("subjid"));
469     formtext_hilite($("mesgid"));
470     formsub_hilite($("subid"));
471     formsub_hilite($("cloid"));
472     */
473     formtext_hilite(form.elements['subj']);
474     formtext_hilite(form.elements['mesg']);
475     formsub_hilite(form.elements['sub']);
476     formsub_hilite(form.elements['clo']);
477 }
478
479
480 function j_check_email(email)
481 {
482     if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email))
483         return (true);
484     return (false);
485 }
486
487 function j_authbox(form)
488 {
489     var no; 
490
491     do {
492         if (form.elements['realsub'].value == "chiudi") {
493             $('authbox').style.visibility = "hidden";
494             break;
495         }
496
497         if (form.elements['name'].value == '' || j_check_email(form.elements['email'].value) == false) {
498             no = new notify(gst, "<br>I campi user e/o e-mail non sono validi;</br> correggeteli per favore.", 1, "chiudi", 280, 100); 
499             break;
500         }
501
502         // submit the request
503         token = server_request('mesg', 'warranty', 
504                                'cli_name', encodeURIComponent(form.elements['name'].value),
505                                'cli_email', encodeURIComponent(form.elements['email'].value) );
506         if (token == "1") {
507             $('authbox').style.visibility = "hidden";
508             form.elements['name'].value = "";
509             form.elements['email'].value = "";
510             break;
511         }
512     } while (0);
513
514     return (false);
515 }
516
517 function authbox(w, h)
518 {
519     var box;
520
521     box = $('authbox');
522
523     box.style.zIndex = 200;
524     box.style.width  = w+"px";
525     box.style.marginLeft  = -parseInt(w/2)+"px";
526     box.style.height = h+"px";
527     box.style.top = parseInt((document.body.clientHeight - h) / 2) + document.body.scrollTop;
528
529     warrant_formtext_hilite($('auth_form'));
530
531     box.style.visibility = "visible";
532     $("nameid").focus();
533 }
534
535 function j_mesgtoadmbox(form)
536 {
537     var no; 
538
539     do {
540         if (form.elements['realsub'].value == "chiudi") {
541             $('mesgtoadmbox').style.visibility = "hidden";
542             break;
543         }
544
545         if (form.elements['mesg'].value == '' || form.elements['subj'].value == '') {
546             no = new notify(gst, "<br>Il soggetto e il messaggo non possono essere vuoti;</br> correggeteli per favore.", 1, "chiudi", 280, 100); 
547             break;
548         }
549                 
550         // submit the request
551         token = server_request('mesg', 'mesgtoadm', 
552                                'cli_subj', encodeURIComponent(form.elements['subj'].value),
553                                'cli_mesg', encodeURIComponent(form.elements['mesg'].value) );
554         if (token == "1") {
555             $('mesgtoadmbox').style.visibility = "hidden";
556             form.elements['subj'].value = "";
557             form.elements['mesg'].value = "";
558             break;
559         }
560     } while (0);
561
562     return (false);
563 }
564
565 function mesgtoadmbox(w, h)
566 {
567     var box;
568
569     box = $('mesgtoadmbox');
570
571     box.style.zIndex = 200;
572     box.style.width  = w+"px";
573     box.style.marginLeft  = -parseInt(w/2)+"px";
574     box.style.height = h+"px";
575     box.style.top = parseInt((document.body.clientHeight - h) / 2) + document.body.scrollTop;
576
577     mesgtoadm_formtext_hilite($('mesgtoadm_form'));
578
579     box.style.visibility = "visible";
580     $('mesgtoadm_form').elements['subj'].focus();
581 }
582
583 function list_set(what, setco, info)
584 {
585     if (what == 'auth') {
586         $('list_auth').style.color = 'red';
587         $('list_all').style.color = 'black';
588     }
589     else {
590         $('list_auth').style.color = 'black';
591         $('list_all').style.color = 'red';
592     }
593     $('list_info').innerHTML = info;
594     if (setco) {
595         createCookie("CO_list", what, 24*365, cookiepath);
596     }
597 }
598
599 function sideslide(domobj, height, step)
600 {
601     this.st = 'wait';
602     this.twait = 5000;
603
604     this.domobj = domobj;
605     this.height = height;
606     this.step = step;
607
608     this.start();
609 }
610
611 sideslide.prototype = {
612     id: null,
613     st: 'wait',
614     twait: 0,
615     scroll: 0,
616     countdown: 0,
617
618     domobj: null,
619     height: 0,
620     step: 0,
621
622     start: function() {
623         var instant = this;
624         
625         this.st = 'wait';
626         this.id = setTimeout(function () { instant.sideslide_cb(); }, this.twait);
627     },
628
629     sideslide_cb: function() {
630         var instant = this;
631
632         if (this.st == 'wait') {
633             this.st = 'scroll';
634             this.countdown = 10;
635             this.id = setInterval(function () { instant.sideslide_cb(); }, 100);
636         }
637         else if (this.st == 'scroll') {
638             this.scroll += (this.step / 10);
639             if (this.scroll >= this.height - this.step) {
640                 this.scroll = 0;
641             }
642             this.domobj.scrollTop = this.scroll;
643             this.countdown--;
644             if (this.countdown == 0) {
645                 this.stop();
646                 this.st = 'wait';
647                 this.id = setTimeout(function () { instant.sideslide_cb(); }, this.twait);
648             }
649         }
650     },
651
652
653     stop: function() {
654         if (this.id != null) {
655             clearInterval(this.id);
656             this.id = null;
657         }
658     }
659
660 }