j_stand_cont refactored from scratch (inertial behavior)
[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 += '<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 formtext_hilite(obj)
439 {
440     obj.className = 'input_text';
441     addEvent(obj, "focus", function () { this.className = 'input_text_hi'; });
442     addEvent(obj, "blur",  function () { this.className = 'input_text'; });
443 }
444
445 function formsub_hilite(obj)
446 {
447     obj.className = 'input_sub';
448     addEvent(obj, "focus", function () { this.className = 'input_sub_hi'; });
449     addEvent(obj, "blur",  function () { this.className = 'input_sub'; });
450 }
451
452 function login_formtext_hilite()
453 {
454     formtext_hilite($("nameid"));
455     formtext_hilite($("passid"));
456     formsub_hilite($("sub"));
457 }
458
459 function login_init()
460 {
461     menu_init();
462     login_formtext_hilite();
463 }
464
465 function warrant_formtext_hilite()
466 {
467     formtext_hilite($("nameid"));
468     formtext_hilite($("emailid"));
469     formsub_hilite($("subid"));
470     formsub_hilite($("cloid"));
471 }
472
473
474 function j_check_email(email)
475 {
476     if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email))
477         return (true);
478     return (false);
479 }
480
481 function j_authbox(form)
482 {
483     var no; 
484
485     if (form.elements['realsub'].value == "chiudi") {
486         $('authbox').style.visibility = "hidden";
487         return (false);
488     }
489
490     if (form.elements['name'].value == '' || j_check_email(form.elements['email'].value) == false)
491         no = new notify(gst, "<br>I campi user e/o e-mail non sono validi;</br> correggeteli per favore.", 1, "chiudi", 280, 100); 
492     else {
493         // submit the request
494         token = server_request('mesg', 'warranty', 
495                                'cli_name', encodeURIComponent(form.elements['name'].value),
496                                'cli_email', encodeURIComponent(form.elements['email'].value) );
497         if (token == "1") {
498             $('authbox').style.visibility = "hidden";
499             form.elements['name'].value = "";
500             form.elements['email'].value = "";
501             return (false);
502         }
503     }
504
505     return (false);
506 }
507
508 function authbox(w, h)
509 {
510     var box;
511
512     box = $('authbox');
513
514     box.style.zIndex = 200;
515     box.style.width  = w+"px";
516     box.style.marginLeft  = -parseInt(w/2)+"px";
517     box.style.height = h+"px";
518     box.style.top = parseInt((document.body.clientHeight - h) / 2) + document.body.scrollTop;
519
520     warrant_formtext_hilite();
521
522     box.style.visibility = "visible";
523     $("nameid").focus();
524 }