confirmation function added to notify_document js function
[brisk.git] / web / commons.js
index 76940cc..6fb210e 100644 (file)
@@ -1,7 +1,10 @@
 /*
  *  brisk - commons.js
  *
- *  Copyright (C) 2006 matteo.nastasi@milug.org
+ *  Copyright (C) 2006-2012 Matteo Nastasi
+ *                          mailto: nastasi@alternativeoutput.it 
+ *                                  matteo.nastasi@milug.org
+ *                          web: http://www.alternativeoutput.it
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * not, write to the Free Software Foundation, Inc, 59 Temple Place -
  * Suite 330, Boston, MA 02111-1307, USA.
  *
- * $Id$
- *
  */
 
 var PLAYERS_N = 3;
-var EXIT_BAN_TIME = 15;
+var EXIT_BAN_TIME = 3600;
+var cookiepath = "/brisk/";
+
+var mlang_commons = { 'imgload_a' : { 'it' : 'Immagini caricate ',
+                                      'en' : 'Loaded images ' },
+                      'imgload_b' : { 'it' : '%.', 
+                                      'en' : '%.' },
+                      'gamleav'   : { 'it' : 'Sei sicuro di volere lasciare questa mano?' ,
+                                      'en' : 'Are you sure to leave this game?' },
+                      'brileav'   : { 'it' : '    Vuoi veramente abbandonare la briscola ?\n(clicca annulla o cancel se vuoi ricaricare la briscola)',
+                                      'en' : '    Are you really sure to leave briscola ?\n(click cancel yo reload it)' },
+                      'brireco'   : { 'it' : 'Ripristino della briscola fallito, per non perdere la sessione ricaricare la pagina manualmente.',
+                                      'en' : 'Recovery of briscola failed, to keep the current session reload the page manually.' },
+                      'btn_sit'   : { 'it' : 'Mi siedo.',
+                                      'en' : 'Sit down.' },
+                      'btn_exit'  : { 'it' : 'Esco.',
+                                      'en' : 'Exit.' },
+                      'tit_list'  : { '0'  : { 'it' : '',
+                                               'en' : '' },
+                                      '1'  : { 'it' : '(solo aut.)',
+                                               'en' : '(only aut.)' },
+                                      '2'  : { 'it' : '(isolam.to)',
+                                               'en' : '(isolation)' } },
+                      'lic_refu'  : { 'it' : 'Rifiutando di sottoscrivere la nuova licenza d\' uso non ti sarà più possibile accedere col tuo utente registrato al sito, sei proprio sicuro di non voler accettare le nuove condizioni d\'uso ?',
+                                      'en' : 'EN Rifiutando di sottoscrivere la nuova licenza d\' uso non ti sarà più possibile accedere col tuo utente registrato al sito, sei proprio sicuro di non voler accettare le nuove condizioni d\'uso ?'
+                                    }
+                    };
 
 function $(id) { return document.getElementById(id); }
 
+function dec2hex(d, padding)
+{
+    var hex = Number(d).toString(16);
+    padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding;
+
+    while (hex.length < padding) {
+        hex = "0" + hex;
+    }
+
+    return hex;
+}
+
+function getStyle(x,IEstyleProp, MozStyleProp) 
+{
+    if (x.currentStyle) {
+       var y = x.currentStyle[IEstyleProp];
+    } else if (window.getComputedStyle) {
+       var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(MozStyleProp);
+    }
+    return y;
+}
+
 /* replacement of setInterval on IE */
 (function(){
     /*if not IE, do nothing*/
@@ -96,38 +145,90 @@ function $(id) { return document.getElementById(id); }
 
 })()
 
+function addEvent(obj,type,fn)
+{
+    if (obj.addEventListener) {
+        obj.addEventListener( type, fn, false);
+    }
+    else if (obj.attachEvent) {
+        obj["e"+type+fn] = fn;
+        obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
+        obj.attachEvent( "on"+type, obj[type+fn] );
+    }
+    else
+        throw new Error("Event registration not supported");
+}
+
+function removeEvent(obj,type,fn)
+{
+    if (obj.removeEventListener) {
+        obj.removeEventListener( type, fn, false );
+    }
+    else if (obj.detachEvent) {
+        obj.detachEvent( "on"+type, obj[type+fn] );
+        obj[type+fn] = null;
+        obj["e"+type+fn] = null;
+    }
+}
+
     // var card_pos = RANGE 0 <= x < cards_ea_n
 
+function show_bigpict(obj, act, x, y)
+{
+   var big, sfx;
+
+   if (arguments.length > 4)
+       sfx = arguments[4];
+   else
+       sfx = '';
+
+   big = $(obj.id+"_big"+sfx);
+   if (act == "over") {
+       big.style.left = obj.offsetLeft + x+"px";
+       big.style.top  = obj.offsetTop  + y+"px";
+       big.style.visibility = "visible";
+       }
+   else {
+       big.style.visibility = "hidden";
+       }
+}
+
 function rnd_int(min, max) {
   return Math.floor(Math.random() * (max - min + 1) + min);
 }
 
 function error_images()
 {
-    alert("GHESEMU!");
+    // alert("GHESEMU!");
+    setTimeout(preload_images, 2000, g_preload_img_arr, g_imgct-1);
 }
 
 function abort_images()
 {
-    alert("ABORTAIMAGES");
+    // alert("ABORTAIMAGES");
+    setTimeout(preload_images, 2000, g_preload_img_arr, g_imgct-1);
 }
 
 function unload_images()
 {
-    alert("ABORTAIMAGES");
+    // alert("ABORTAIMAGES");
+    setTimeout(preload_images, 2000, g_preload_img_arr, g_imgct-1);
 }
 
 function reset_images()
 {
-    alert("ABORTAIMAGES");
+    // alert("ABORTAIMAGES");
+    setTimeout(preload_images, 2000, g_preload_img_arr, g_imgct-1);
 }
 
 function update_images()
 {
-    $("imgct").innerHTML = "Immagini caricate "+g_preload_imgsz_arr[g_imgct]+"%.";
-    if (g_imgct < g_preload_img_arr.length)
-       setTimeout(preload_images, 100, g_preload_img_arr, g_imgct);
-    g_imgct++;
+    // MLANG "Immagine caricate" + g_preload_imgsz_arr[g_imgct] + "%."
+    $("imgct").innerHTML = mlang_commons['imgload_a'][g_lang]+g_preload_imgsz_arr[g_imgct]+"%.";
+    if (g_imgct+1 < g_preload_img_arr.length) {
+        g_imgct++;
+        setTimeout(preload_images, 100, g_preload_img_arr, g_imgct-1);
+    }
     // $("imgct").innerHTML += "U";
 }
 
@@ -154,8 +255,10 @@ function safestatus(a)
 }
 
 function createXMLHttpRequest() {
-    try { return new ActiveXObject("Msxml2.XMLHTTP");    } catch(e) {}
-    try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
+    if (typeof(ActiveXObject) != 'undefined') { // Konqueror complain as unknown object
+        try { return new ActiveXObject("Msxml2.XMLHTTP");    } catch(e) {}
+        try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
+    }
     try { return new XMLHttpRequest();                   } catch(e) {}
     alert("XMLHttpRequest not supported");
     return null;
@@ -164,11 +267,73 @@ function createXMLHttpRequest() {
 function send_mesg(mesg)
 {
     var xhr_wr = createXMLHttpRequest();
-    // xhr_wr.open('GET', 'index_wr.php?sess='+sess+'&mesg='+encodeURIComponent(mesg), true);
-    xhr_wr.open('GET', 'index_wr.php?sess='+sess+'&mesg='+mesg, true);
+    var is_conn = (sess == "not_connected" ? false : true);
+    
+    // alert("xhr_wr: "+xhr_wr+"  is_conn: "+is_conn);
+    xhr_wr.open('GET', 'index_wr.php?'+(is_conn ? 'sess='+sess+'&' : '')+'mesg='+mesg, (is_conn ? true : false));
+    xhr_wr.setRequestHeader("If-Modified-Since", new Date().toUTCString());
     xhr_wr.onreadystatechange = function() { return; };
+    if (typeof(g_debug) == 'number' && g_debug > 0
+        && typeof(console) == 'object' && typeof(console.log) == 'function') {
+            var ldate = new Date();
+            console.log(ldate.getTime()+':MESG:'+mesg);
+    }
     xhr_wr.send(null);
 
+    if (!is_conn) {
+        if (xhr_wr.responseText != null) {
+            eval(xhr_wr.responseText);
+        }
+    }
+}
+
+/*
+  sync request to server
+  server_request([arg0=arg1[, arg2=arg3[, ...]]])
+  if var name == '__POST__' than all other vars will be managed as POST content
+                                 and the call will be a POST
+ */
+function server_request()
+{
+    var xhr_wr = createXMLHttpRequest();
+    var i, collect = "", post_collect = null, is_post = false;
+
+    if (arguments.length > 0) {
+        for (i = 0 ; i < arguments.length ; i+= 2) {
+            if (arguments[i] == "__POST__") {
+                is_post = true;
+                post_collect = "";
+                i -= 1;
+                continue;
+            }
+            if (is_post)
+                post_collect += (post_collect == "" ? "" : "&") + arguments[i] + "=" + encodeURIComponent(arguments[i+1]);
+            else
+                collect += (i == 0 ? "" : "&") + arguments[i] + "=" + encodeURIComponent(arguments[i+1]);
+        }
+    }
+    // alert("Args: "+arguments.length);
+
+    var is_conn = (sess == "not_connected" ? false : true);
+    
+    // console.log("server_request:preresp: "+xhr_wr.responseText);
+
+    if (is_post) {
+        xhr_wr.open('POST', 'index_wr.php?'+(is_conn ? 'sess='+sess+'&' : '')+collect, false);
+        xhr_wr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
+    }
+    else {
+        xhr_wr.open('GET', 'index_wr.php?'+(is_conn ? 'sess='+sess+'&' : '')+collect, false);
+    }
+    xhr_wr.onreadystatechange = function() { return; };
+    xhr_wr.send(post_collect);
+    
+    if (xhr_wr.responseText != null) {
+        // console.log("server_request:resp: "+xhr_wr.responseText);
+        return (xhr_wr.responseText);
+    } 
+    else
+        return (null);
 }
 
 /* Stat: CHAT and TABLE */
@@ -204,6 +369,11 @@ function act_chatt(value)
 }
 
 /* Stat: ROOM */
+function act_ping()
+{
+    send_mesg("ping");
+}
+
 function act_sitdown(table)
 {
     send_mesg("sitdown|"+table);
@@ -214,33 +384,30 @@ function act_wakeup()
     send_mesg("wakeup");
 }
 
-/* Stat: TABLE  Subst: ASTA */
-function act_asta(card,pnt)
+function act_splash()
 {
-    send_mesg("asta|"+card+"|"+pnt);
+    send_mesg("splash");
 }
 
-function act_choose(card)
+function act_help()
 {
-    // alert("sitdown");
-    send_mesg("choose|"+card);
+    send_mesg("help");
 }
 
-/* Stat: TABLE  Subst: GAME */
-function act_play(card,x,y)
+function act_passwdhowto()
 {
-    // alert("sitdown");
-    send_mesg("play|"+card+"|"+x+"|"+y);
+    send_mesg("passwdhowto");
 }
 
-function act_tableinfo()
+function act_mesgtoadm()
 {
-    send_mesg("tableinfo");
+    send_mesg("mesgtoadm");
 }
 
-function act_help()
+function act_tav()
 {
-    send_mesg("help");
+    act_chatt('/tav '+$('txt_in').value); 
+    $('txt_in').value = '';
 }
 
 function act_about()
@@ -248,21 +415,19 @@ function act_about()
     send_mesg("about");
 }
 
-function act_exitlock()
+function act_placing()
 {
-    send_mesg("exitlock");
+    send_mesg("placing");
 }
 
-function safelogout()
+function act_roadmap()
 {
-    var res;
-    
-    if (g_exitlock < 3) 
-       res = window.confirm("Sei sicuro di volere abbandonare la partita?\nATTENZIONE: se esci adesso senza il consenso degli altri giocatori non potrai sederti ai tavoli per "+EXIT_BAN_TIME+" minuti.");    
-    else 
-       res = window.confirm("Sei sicuro di volere abbandonare la partita?");
-    if (res)
-       act_logout(g_exitlock);
+    send_mesg("roadmap");
+}
+
+function act_whysupport()
+{
+    send_mesg("whysupport");
 }
 
 function act_lascio()
@@ -273,8 +438,8 @@ function act_lascio()
 function safelascio()
 {
     var res;
-
-    res = window.confirm("Sei sicuro di volere lasciare questa mano?");
+    // MLANG "Sei sicuro di volere lasciare questa mano?"
+    res = window.confirm(mlang_commons['gamleav'][g_lang]);
     if (res)
        act_lascio();
 }
@@ -284,10 +449,11 @@ function act_logout(exitlock)
     send_mesg("logout|"+exitlock);
 }
 
-function act_reload()
+function act_reloadroom()
 {
     window.onunload = null;
-    document.location.reload();
+    window.onbeforeunload = null;
+    document.location.assign("index.php");
 }
 
 function act_shutdown()
@@ -295,26 +461,53 @@ function act_shutdown()
     var c = 0;
 
     send_mesg("shutdown");
-    while (xhr_wr.readyState != 4)
-       c++;
-}
-
-function act_preout()
-{
-    act_logout();
+    // while (xhr_wr.readyState != 4)
+    // c++;
 }
 
 function postact_logout()
 {
     // alert("postact_logout");
     try { 
-       xhr_rd.abort();
+       hstm.abort();
     } catch (e) {}
 
     // eraseCookie("sess");
     document.location.assign("index.php");
 }
 
+/*
+  type - 'hard' or 'soft'
+  code - if soft: accept (0), refuse (1), after (2)
+         if hard: accept (0), refuse (1)
+ */
+function act_licencemgr(type, code, lice_curr, lice_vers)
+{
+    if (type != "soft" && type != "hard") {
+        return false;
+    }
+    switch (code) {
+    case 0:
+    case 1:
+        send_mesg("licencemgr|"+type+"|"+code+"|"+lice_curr+"|"+lice_vers);
+        break;
+    case 2:
+        break;
+    default:
+        break;
+    }
+    return true;
+}
+
+function lice_confirm(val)
+{
+    if (val == 1) {
+        return (window.confirm(mlang_commons['lic_refu'][g_lang]));
+    }
+
+    return true;
+}
+
 /*
   function slowimg(img,x1,y1,deltat,free,action,srcend)
   img    - image to move
@@ -338,9 +531,11 @@ function sleep(st, delay)
 function slowimg(img,x1,y1,deltat,free,action,srcend) {
     this.img = img;
 
-    this.x0  = parseInt(document.defaultView.getComputedStyle(this.img, "").getPropertyValue("left"));
-    // alert("img.x0 = "+this.x0);
-    this.y0  = parseInt(document.defaultView.getComputedStyle(this.img, "").getPropertyValue("top"));
+    // this.x0  = parseInt(document.defaultView.getComputedStyle(this.img, "").getPropertyValue("left"));
+    this.x0 = parseInt(getStyle(this.img,"left", "left"));
+// alert("img.x0 = "+this.x0);
+    // this.y0  = parseInt(document.defaultView.getComputedStyle(this.img, "").getPropertyValue("top"));
+    this.y0  = parseInt(getStyle(this.img,"top", "top"));
     this.x1  = x1;
     this.y1  = y1;
     this.deltat = deltat;
@@ -379,16 +574,19 @@ slowimg.prototype = {
        this.action = act;
     },
     
+
     settime: function(time) 
     {
-       this.time = time;
-       this.step_n = parseInt(time / this.deltat);
+       this.time = (time < this.deltat ? this.deltat : time);
+       this.step_n = parseInt(this.time / this.deltat);
        this.dx = (this.x1 - this.x0) / this.step_n;
        this.dy = (this.y1 - this.y0) / this.step_n;
-       if (this.step_n * this.deltat == time) {
+       if (this.step_n * this.deltat == this.time) {
            this.step_n--;
        }
-       this.step_free = parseInt(this.step_n * this.free);
+        if (this.free < 1) {
+            this.step_free = parseInt(this.step_n * this.free);
+        }
     },
     
     start: function(st)
@@ -414,7 +612,7 @@ slowimg.prototype = {
            this.step_cur++;
            setTimeout(function(obj){ obj.animate(); }, this.deltat, this);
            if (this.step_cur == this.step_free && this.st != null) {
-               if (this.st != null && this.st.st_loc < this.st.st_loc_new) {
+               if (this.st.st_loc < this.st.st_loc_new) {
                    // alert("QUI1  " + this.step_cur + "  ZZ  "+  this.step_free);
                    this.st.st_loc++;
                    this.st = null;
@@ -427,14 +625,16 @@ slowimg.prototype = {
            // $("logz").innerHTML += "xxxxxxxxxxxxxxxCLEAR<br>";
            var date = new Date();
            // $("logz").innerHTML += "Timestop: " + date + "<br>";
+
+           if (this.action != null) {
+               eval(this.action);
+           }
+
            if (this.st != null && this.st.st_loc < this.st.st_loc_new) {
                // alert("QUI2");
                this.st.st_loc++;
                this.st = null;
            }
-           if (this.action != null) {
-               eval(this.action);
-           }
            if (this.srcend != null) {
                this.img.src = this.srcend;
            }
@@ -442,116 +642,168 @@ slowimg.prototype = {
     }
 }
 
-var asta_xarr = new Array(0,66,132);
+function div_show(div)
+{
+    div.style.top = parseInt((document.body.clientHeight - parseInt(getStyle(div,"height", "height"))) / 2) + document.body.scrollTop;
+    div.style.visibility = "visible";
+}
 
-/* TODO: impostare gli onclick */
-function dispose_asta(idx, pnt, nopoint)
+/*
+  st
+  text
+  tout: if < 0 => infinite
+  butt: [ strings ]
+  w:
+  h:
+  is_opa:
+  block_time:
+  */
+
+function notify_document(st, text, tout, butt, confirm_func, w, h, is_opa, block_time)
 {
-    var i, btn, pass;
-    var btn;
+    var i, clo, clodiv_ctx, clodiv_wai, box;
 
-    for (i = 0 ; i < 10 ; i++) {
-       btn = $("asta"+i);
-       if (i < idx) {
-           btn.src = "img/astapasso"+(pnt >= 0 ? "" : "_ro")+".png";
-           pass = -1;
-       }
-       else {
-           btn.src = "img/asta"+i+(pnt >= 0 ? "" : "_ro")+".png";
-           pass = i;
-       }
-       if (i < 19)
-           btn.style.left = asta_xarr[i % 3];
-       else
-           btn.style.left = asta_xarr[(i+1) % 3];
-       
-       btn.style.top  = parseInt(i / 3) * 50+1;
+    this.st = st;
 
-       if (pnt >= 0) {
-           eval("btn.onclick = function () { act_asta("+pass+",61); }");
-           btn.style.hover_cursor = "pointer";
-       }
-       else {
-           btn.onclick = null;
-           btn.style.hover_cursor = "";
-       }
+    this.ancestor = document.body;
+    this.confirm_func = confirm_func;
+
+    this.st.st_loc_new++;
+
+    clodiv_ctx = document.createElement("div");
+    clodiv_ctx.className = "notify_clo";
+
+    for (i = 0 ; i < butt.length ; i++) {
+        this.input_add(butt[i], i, this.hide, clodiv_ctx);
     }
-    
-    
-    btn = $("astaptdiv");
-    btn.style.left = asta_xarr[i % 3];
-    btn.style.top = parseInt(i / 3) * 50 - 2;
-    // btn.style.visibility  = "visible";
-    
-    btn = $("astapt");
-    var rpnt = (pnt < 0 ? -pnt : pnt);
-    btn.value = (rpnt < 61 ? 61 : (rpnt > 120 ? 120 : rpnt));
-    
-    btn = $("astaptsub");
-    btn.style.left = asta_xarr[i % 3];
-    btn.style.top = 25 + parseInt(i / 3) * 50 - 1;
-    btn.src = "img/astaptsub"+(pnt >= 0 ? "" : "_ro")+".png";
-    // btn.style.visibility  = "visible";
-    if (pnt >= 0) {
-       btn.onclick = function () { act_asta(9,$("astapt").value); };
-       // btn.stylehover.cursor = "pointer";
+
+    if (block_time > 0) {
+        clodiv_wai = document.createElement("div");
+        clodiv_wai.className = "notify_clo";
+
+        this.input_add("leggere, prego.", 0, null, clodiv_wai);
+        this.clodiv = clodiv_wai;
+        this.clodiv_pkg = clodiv_ctx;
+        clodiv_ctx.style.display = 'none';
     }
     else {
-       btn.onclick = null;
-       // btn.stylehover.cursor = "";
+        this.clodiv = clodiv_ctx;
     }
-    
-    i+=1;
-    if (nopoint) {
-       btn = $("astapasso");
-       btn.style.left = asta_xarr[i % 3];
-       btn.style.top = parseInt(i / 3) * 50;
-       btn.src = "img/astapashalf"+(pnt >= 0 ? "" : "_ro")+".png";
-       if (pnt >= 0) {
-           btn.onclick = function () { act_asta(-1,0); };
-           // btn.stylehover.cursor = "pointer";
-       }
-       else {          
-           btn.onclick = null;
-           // btn.stylehover.cursor = "";
-       }
 
-       btn = $("astalascio");
-       btn.style.left = asta_xarr[i % 3];
-       btn.style.top = parseInt(i / 3) * 50 + 24;
-       btn.src = "img/astalascio.png";
-       btn.style.visibility = "visible";
-       btn.onclick = function () { safelascio(); };
-       }
-    else {
-       btn = $("astapasso");
-       btn.style.left = asta_xarr[i % 3];
-       btn.style.top = parseInt(i / 3) * 50;;
-       btn.src = "img/astapasso"+(pnt >= 0 ? "" : "_ro")+".png";
-       if (pnt >= 0) {
-           btn.onclick = function () { act_asta(-1,0); };
-           // btn.stylehover.cursor = "pointer";
-       }
-       else {
-           btn.onclick = null;
-           // btn.stylehover.cursor = "";
-       }
+    cont = document.createElement("div");
+
+    cont.style.borderBottomStyle = "solid";
+    cont.style.borderBottomWidth = "1px";
+    cont.style.borderBottomColor = "gray";
+    cont.style.height = (h - 30)+"px";
+    cont.style.overflow = "auto";
+    cont.innerHTML = text;
+
+    box =  document.createElement("div");
+    if (is_opa)
+        box.className = "notify_opaque";
+    else
+        box.className = "notify";
+
+    box.style.zIndex = 200;
+    box.style.width  = w+"px";
+    box.style.marginLeft  = -parseInt(w/2)+"px";
+    box.style.height = h+"px";
+    box.style.top = parseInt((document.body.clientHeight - h) / 2) + document.body.scrollTop;
+    box.appendChild(cont);
+    box.appendChild(this.clodiv);
+    box.style.visibility = "visible";
+
+    this.notitag = box;
 
-       btn = $("astalascio");
-       btn.style.visibility = "hidden";
-       btn.onclick = null;
+    this.ancestor.appendChild(box);
+
+    if (tout > 0) {
+        this.toutid = setTimeout(function(obj){ obj.unblock(); }, tout, this);
+    }
+
+    if (block_time != 0) {
+        this.tblkid = setTimeout(function(obj){ obj.notitag.removeChild(obj.clodiv); obj.clodiv = obj.clodiv_pkg; obj.clodiv.style.display = '';  obj.notitag.appendChild(obj.clodiv); }, block_time, this);
     }
-    // btn.style.visibility  = "visible";
-    $("asta").style.visibility = "visible";
 }
 
-function hide_asta()
-{
-    $("asta").style.visibility = "hidden"; 
+notify_document.prototype = {
+    ancestor: null,
+    st: null,
+    notitag: null,
+    toutid: null,
+    clo: null,
+
+    clodiv: null,
+    clodiv_pkg: null,
+
+    butt: null,
+    tblkid: null,
+
+    confirm_func: null,
+
+    ret: -1,
+
+    /*
+      s:          button string
+      idx:        button index
+      onclick_cb: name of the onclick callback (with signature f(idx) ) or null
+      anc:        parent dom object
+
+      return new button dom object
+      */
+    input_add: function(s, idx, onclick_cb, anc)
+    {
+        var clo;
+
+        clo = document.createElement("input");
+        clo.type    = "submit";
+        clo.className = "button";
+        clo.style.bottom = "4px";
+        clo.style.margin = "2px";
+        clo.obj     = this;
+        clo.obj_idx = idx;
+        clo.value   = s;
+        if (onclick_cb)
+            clo.onclick = function () { onclick_cb.call(this.obj, this.obj_idx); };
+
+        formsub_hilite(clo);
+        anc.appendChild(clo);
+
+        return (clo);
+    },
+
+    ret_get: function()
+    {
+        // alert("quiz: "+this.rett);
+        return this.ret;
+    },
+
+    unblock: function()
+    {
+       if (this.st.st_loc < this.st.st_loc_new) {
+           this.st.st_loc++;
+       }
+    },
+
+    hide: function(val)
+    {
+        if (this.confirm_func != null) {
+            if (this.confirm_func(val) == false) {
+                return false;
+            }
+        }
+        this.ret = val;
+       clearTimeout(this.toutid);
+       this.ancestor.removeChild(this.notitag);
+       this.unblock();
+    }
 }
 
 
-function notify(st, text, tout, butt, w, h)
+
+
+function notify_ex(st, text, tout, butt, w, h, is_opa, block_time)
 {
     var clo, box;
     var t = this;
@@ -566,20 +818,44 @@ function notify(st, text, tout, butt, w, h)
     clo.type = "submit";
     clo.className = "button";
     clo.style.bottom = "4px";
-    clo.value = butt;
     clo.obj = this;
-    clo.onclick = this.input_hide;
-    
+    if (block_time > 0) {
+        clo.value = "leggere, prego.";
+        this.butt = butt;
+    }
+    else {
+        clo.value = butt;
+        clo.onclick = function () { this.obj.hide() };
+    }
+
     clodiv = document.createElement("div");
     clodiv.className = "notify_clo";
+    this.clo = clo;
+    this.clodiv = clodiv;
+
     clodiv.appendChild(clo);
 
-    box = document.createElement("div");
-    box.className = "notify";
-    box.innerHTML = text;
+    cont = document.createElement("div");
+
+    cont.style.borderBottomStyle = "solid";
+    cont.style.borderBottomWidth = "1px";
+    cont.style.borderBottomColor = "gray";
+    cont.style.height = (h - 30)+"px";
+    cont.style.overflow = "auto";
+    cont.innerHTML = text;
+
+    box =  document.createElement("div");
+    if (is_opa)
+        box.className = "notify_opaque";
+    else
+        box.className = "notify";
+
     box.style.zIndex = 200;
     box.style.width  = w+"px";
+    box.style.marginLeft  = -parseInt(w/2)+"px";
     box.style.height = h+"px";
+    box.style.top = parseInt((document.body.clientHeight - h) / 2) + document.body.scrollTop;
+    box.appendChild(cont);
     box.appendChild(clodiv);
     box.style.visibility = "visible";
 
@@ -588,14 +864,28 @@ function notify(st, text, tout, butt, w, h)
     this.ancestor.appendChild(box);
     
     this.toutid = setTimeout(function(obj){ obj.unblock(); }, tout, this);
+
+    if (block_time != 0) {
+        this.tblkid = setTimeout(function(obj){ obj.clo.value = obj.butt; obj.clo.onclick = function () { this.obj.hide() }; formsub_hilite(obj.clo); obj.clo.focus(); }, block_time, this);
+    }
+    else {
+        formsub_hilite(clo);
+        clo.focus();
+    }
+
 }
 
-notify.prototype = {
+
+notify_ex.prototype = {
     ancestor: null,
     st: null,
     notitag: null,
     toutid: null,
-    
+    clo: null,
+    clodiv: null, 
+    butt: null,
+    tblkid: null,
+
     unblock: function()
     {
        if (this.st.st_loc < this.st.st_loc_new) {
@@ -608,21 +898,26 @@ notify.prototype = {
        clearTimeout(this.toutid);
        this.ancestor.removeChild(this.notitag);
        this.unblock();
-    },
-
-    input_hide: function()
-    {
-       clearTimeout(this.obj.toutid);
-       this.obj.ancestor.removeChild(this.obj.notitag);
-       this.obj.unblock();
     }
 }
+
+
+notify.prototype = notify_ex.prototype;                // Define sub-class
+notify.prototype.constructor = notify;
+notify.baseConstructor = notify_ex;
+notify.superClass = notify_ex.prototype;
+
+function notify(st, text, tout, butt, w, h)
+{
+    notify_ex.call(this, st, text, tout, butt, w, h, false, 0);
+}
        
 
 function $(id) { 
     return document.getElementById(id); 
 }
 
+
 function globst() {
     this.st = -1;
     this.st_loc = -1;
@@ -630,7 +925,29 @@ function globst() {
     this.comms  = new Array;
 }
 
+globst.prototype = {
+    st: -1,
+    st_loc: -1,
+    st_loc_new: -1,
+    comms: null,
+    sleep_hdl: null,
 
+    sleep: function(delay) {
+        st.st_loc_new++;
+
+        if (!this.the_end) {
+            this.sleep_hdl = setTimeout(function(obj){ if (obj.st_loc_new > obj.st_loc) { obj.st_loc++; obj.sleep_hdl = null; }},
+                                       delay, this);
+        }
+    },
+
+    abort: function() {
+        if (this.sleep_hdl != null) {
+            clearTimeout(this.sleep_hdl);
+            this.sleep_hdl = null;
+        }
+    }
+}
 
 function remark_step()
 {
@@ -665,66 +982,15 @@ function remark_off()
 }
 
 
-function choose_seed(card)
+function italizer(ga)
 {
-    var i;
-
-    $("chooseed").style.visibility = "visible";
-    for (i = 0 ; i < 4 ; i++) {
-       $("seed"+i).src = "img/"+i+""+card+".png";
-       seed=$("seed"+i);
-       eval("seed.onclick = function () { act_choose("+i+""+card+"); };");
-    }
-}
-
-function set_names(so,ea,ne,nw,we)
-{
-//    alert("EA: "+ea);
-    $("name").innerHTML = so; 
-    $("name").title = so; 
-    $("name_ea").innerHTML = ea;
-    $("name_ea").title = ea;
-    $("name_ne").innerHTML = ne;
-    $("name_ne").title = ne;
-    $("name_nw").innerHTML = nw;
-    $("name_nw").title = nw;
-    $("name_we").innerHTML = we;
-    $("name_we").title = we;
-
-    return;
+    var pre, pos;
+    if (ga[0] & 2) 
+        return "<i>"+ga[1]+"</i>";
+    else
+        return ga[1];
 }
 
-var astat_suffix = new Array("","_ea","_ne","_nw","_we");
-
-function show_astat(zer,uno,due,tre,qua)
-{
-    var astat = new Array(zer,uno,due,tre,qua);
-
-    for (i = 0 ; i < PLAYERS_N ; i++) {
-       idx = (PLAYERS_N + i - table_pos) % PLAYERS_N;
-
-       if (astat[i] == -2) {
-           $("public"+astat_suffix[idx]).style.visibility = "hidden";
-       }
-       else if (astat[i] == -1) {
-           $("public"+astat_suffix[idx]).style.visibility = "visible";
-           $("pubacard"+astat_suffix[idx]).src = "img/astapasso.png";
-           $("pubapnt"+astat_suffix[idx]).innerHTML = "";
-           $("pubapnt"+astat_suffix[idx]).style.visibility = "hidden";
-       }
-       else if (astat[i] <= 10) {
-           $("public"+astat_suffix[idx]).style.visibility = "visible";
-           $("pubacard"+astat_suffix[idx]).src = "img/asta"+astat[i]+".png";
-           $("pubapnt"+astat_suffix[idx]).style.visibility = "hidden";
-       }
-       else if (astat[i] <= 120) {
-           $("public"+astat_suffix[idx]).style.visibility = "visible";
-           $("pubacard"+astat_suffix[idx]).src = "img/asta9.png";
-           $("pubapnt"+astat_suffix[idx]).style.visibility = "inherit"; // XXX VISIBLE
-           $("pubapnt"+astat_suffix[idx]).innerHTML = astat[i];
-       }
-    }
-}
 
 function exitlock_show(num, islock)
 {
@@ -740,59 +1006,71 @@ var fin = 0;
 
 //    exitlock_show(0, true);
 
-function table_init() {
-    var sux = new Array("", "_ea", "_ne", "_nw", "_we");
 
-    remark_off();
-    $("asta").style.visibility = "hidden";
-    $("caller").style.visibility = "hidden";
-    show_astat(-2,-2,-2,-2,-2);
-    for (i=0 ; i < 8 ; i++) {
-       Drag.init($("card" + i), card_mouseup_cb);
-       for (e = 0 ; e < PLAYERS_N ; e++)
-           $("card"+sux[e]+i).style.visibility = "hidden";
-    }
-    for (i=0 ; i < PLAYERS_N ; i++) {
-       $("takes"+sux[i]).style.visibility = "hidden";
-       }
+var chatt_lines = new Array();
+var chatt_lines_n = 0;
 
-    for (i = 0 ; i < 8 ; i++) {
-       cards_pos[i] = i;
-       cards_ea_pos[i] = i;
-       cards_ne_pos[i] = i;
-       cards_nw_pos[i] = i;
-       cards_we_pos[i] = i;
-    }
+var CHATT_MAXLINES = 40;
+
+function user_decorator(user)
+{
+    var name;
+    var flags = user[0];
+    if ((flags & 0x03) != 0)
+        name = "<span class='au" + (flags & 0x03) + "'>"+user[1]+"</span>";
+    else
+        name = user[1];
 
+    return (name);
 }
-  
 
+function user_dec_and_state(el)
+{
+    var content = "";
+    var val_el;
 
-var chatt_lines = new Array();
-var chatt_lines_n = 0;
+    content = user_decorator(el);
+    content += state_add(el[0],(typeof(el[2]) != 'undefined' ? el[2] : null));
+    
+    return (content);
+}
 
-var CHATT_MAXLINES = 40;
 
 /* PRO CHATT */
-function chatt_sub(name,str)
-{
-  // alert("ARRIVA NAME: "+ name + "  STR:"+str);
-  if (chatt_lines_n == CHATT_MAXLINES) {
-    $("txt").innerHTML = "";
-    for (i = 0 ; i < (CHATT_MAXLINES - 1) ; i++) {
-      chatt_lines[i] = chatt_lines[i+1];
-      $("txt").innerHTML += chatt_lines[i];
-    }
-    chatt_lines[i] = "<b>"+name+"</b> "+str+ "<br>";
-    $("txt").innerHTML += chatt_lines[i];
-  }
-  else {
-    chatt_lines[chatt_lines_n] = "<b>"+name+"</b> "+str+ "<br>";
-    $("txt").innerHTML += chatt_lines[chatt_lines_n];
-    chatt_lines_n++;
-  }
-  $("txt").innerHTML;
-  $("txt").scrollTop = 10000000;
+function chatt_sub(dt,data,str)
+{
+    var must_scroll = false;
+    var name;
+    var flags;
+    var isauth;
+    var bolder = [ (data[0] | 1), data[1] ];
+    name = user_decorator(bolder);
+
+    if ($("txt").scrollTop + parseInt(getStyle($("txt"),"height", "height")) -  $("txt").scrollHeight >= 0)
+        must_scroll = true;
+
+    // alert("ARRIVA NAME: "+ name + "  STR:"+str);
+    if (chatt_lines_n == CHATT_MAXLINES) {
+        $("txt").innerHTML = "";
+        for (i = 0 ; i < (CHATT_MAXLINES - 1) ; i++) {
+            chatt_lines[i] = chatt_lines[i+1];
+            $("txt").innerHTML += chatt_lines[i];
+        }
+        chatt_lines[i] = dt+name+": "+str+ "<br>";
+        $("txt").innerHTML += chatt_lines[i];
+    }
+    else {
+        chatt_lines[chatt_lines_n] = dt+name+": "+str+ "<br>";
+        $("txt").innerHTML += chatt_lines[chatt_lines_n];
+        chatt_lines_n++;
+    }
+    // $("txt").innerHTML;
+
+    
+    if (must_scroll) {
+        $("txt").scrollTop = 10000000;
+    }
+    // alert("scTOP "+$("txt").scrollTop+"  scHEIGHT: "+$("txt").scrollHeight+" HEIGHT: "+getStyle($("txt"),"height", "height") );
 }
 
 /*
@@ -823,33 +1101,20 @@ function eraseCookie(name) {
        createCookie(name,"",-1);
 }
 
-var onunload_times = 0;
-
+function onbeforeunload_cb () {
+    return("");
+}
 
 function onunload_cb () {
-    var u = 0;
-    if (onunload_times == 0) {
-       var res = window.confirm("    Vuoi veramente abbandonare la briscola ?\n(clicca annulla o cancel se vuoi ricaricare la briscola)");
-       if (res == true) {
-           the_end = true; 
-           act_shutdown();
-           while (1) 
-               u++;
-       }
-       else {
-           try {
-               location = self.location;
-           } catch (e) {
-               alert("Ripristino della briscola fallito, per non perdere la sessione ricaricare la pagina manualmente.");
-           }
-       }
-       onunload_times++;
-    }
+    
+    if (typeof(hstm) != "undefined")
+        hstm.the_end = true; 
+
+    act_shutdown();
     
     return(false);
 }
 
-
 function room_checkspace(emme,tables,inpe)
 {
     nome = "<b>";
@@ -863,12 +1128,13 @@ function room_checkspace(emme,tables,inpe)
 
     for (i = 0 ; i < tables ; i++) {
        $("table"+i).innerHTML = alta;
-       $("table_act"+i).innerHTML = "<input type=\"button\" class=\"button\" name=\"xhenter"+i+"\"  value=\"Mi siedo.\" onclick=\"act_sitdown(1);\">";
+        // MLANG Mi siedo.
+       $("table_act"+i).innerHTML = "<input type=\"button\" class=\"button\" name=\"xhenter"+i+"\"  value=\""+mlang_commons['btn_sit'][g_lang]+"\" onclick=\"act_sitdown(1);\">";
        }
 
     stand = "<table class=\"table_standup\"><tbody><tr>";
     for (i = 0 ; i < inpe ; i++) {
-       stand += "<td class=\"td_standup\">"+nome+"</td>";
+       stand += "<td>"+nome+"</td>";
        if ((i+1) % 4 == 0) {
            stand += "</tr><tr>";
        }
@@ -876,18 +1142,249 @@ function room_checkspace(emme,tables,inpe)
     stand += "</tr>";
     $("standup").innerHTML = stand;
 
-    $("esco").innerHTML = "<input name=\"logout\" type=\"button\" value=\"Esco.\" onclick=\"window.onunload = null; act_logout();\" type=\"button\">";
+    // VERIFY: what is this button ?
+    // MLANG Esco.
+    $("esco").innerHTML = "<input class=\"button\" name=\"logout\" type=\"button\" value=\""+mlang_commons['btn_exit'][g_lang]+"\" onclick=\"act_logout();\" type=\"button\">";
+}
+
+function  unescapeHTML(cont) {
+    var div = document.createElement('div');
+    var memo = "";
+    var i;
+
+    div.innerHTML = cont;
+    if (div.childNodes[0]) {
+        if (div.childNodes.length > 1) {
+            if (div.childNodes.toArray)
+                alert("si puo");
+            else {
+                var length = div.childNodes.length, results = new Array(length);
+            while (length--)
+                results[length] = div.childNodes[length];
+                
+            for (i=0 ; i<results.length ; i++)
+               memo = memo + results[i].nodeValue;
+            }
+
+            return (memo);
+        }
+        else {
+            return (div.childNodes[0].nodeValue);
+        }
+    }
+    else {
+        return ('');
+    }
 }
 
 function playsound(tag, sound) {
    // g_withflash is a global var
    if (g_withflash) {
-      alert("PLAYSOUND "+sound);
       $(tag).innerHTML = '<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" '+
 'codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0" id="mysound" WIDTH=1 HEIGHT=1>' +
-'<PARAM NAME="movie" VALUE="playsound.swf"><PARAM NAME="PLAY" VALUE="true"><PARAM NAME="LOOP" VALUE="false">' +
+'<PARAM NAME="movie" VALUE="../playsound.swf"><PARAM NAME="PLAY" VALUE="true"><PARAM NAME="LOOP" VALUE="false">' +
 '<PARAM NAME=FlashVars VALUE="streamUrl='+sound+'">' +
-'<EMBED swliveconnect="true" name="mysound" src="playsound.swf" FlashVars="streamUrl='+sound+'" PLAY="true" LOOP="false" '+
+'<EMBED swliveconnect="true" name="mysound" src="../playsound.swf" FlashVars="streamUrl='+sound+'" PLAY="true" LOOP="false" '+
 ' WIDTH=1 HEIGHT=1 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></OBJECT>';
    }
 }
+
+function topbanner_init()
+{
+    setInterval(topbanner_cb, 666);
+;
+}
+
+function topbanner_cb()
+{
+    var a, b;
+
+    a = $('topbanner').style.backgroundColor;
+    b = $('topbanner').style.borderLeftColor;
+
+    $('topbanner').style.backgroundColor = b;
+    $('topbanner').style.borderColor = a+" "+a+" "+a+" "+a;
+
+    // console.log("A: "+a+"  B: "+b);
+}
+
+function sidebanner_init()
+{
+    setInterval(sidebanner_cb, 666);
+}
+
+function sidebanner2_init()
+{
+    setInterval(sidebanner2_cb, 666);
+}
+
+function sidebanner_cb()
+{
+    var a, b;
+
+    a = $('sidebanner').style.backgroundColor;
+    b = $('sidebanner').style.borderLeftColor;
+
+    $('sidebanner').style.backgroundColor = b;
+    $('sidebanner').style.borderColor = a+" "+a+" "+a+" "+a;
+
+    // console.log("A: "+a+"  B: "+b);
+}
+
+function sidebanner2_cb()
+{
+    var a, b;
+
+    a = $('sidebanner2').style.backgroundColor;
+    b = $('sidebanner2').style.borderLeftColor;
+
+    $('sidebanner2').style.backgroundColor = b;
+    $('sidebanner2').style.borderColor = a+" "+a+" "+a+" "+a;
+
+    // console.log("A: "+a+"  B: "+b);
+}
+
+
+function langtolng(lang)
+{
+    if (lang == "en")
+        return ("-en");
+    else
+        return ("");
+}
+
+function formtext_hilite(obj)
+{
+    obj.className = 'input_text';
+    addEvent(obj, "focus", function () { this.className = 'input_text_hi'; });
+    addEvent(obj, "blur",  function () { this.className = 'input_text'; });
+}
+
+function formsub_hilite(obj)
+{
+    obj.className = 'input_sub';
+    addEvent(obj, "focus", function () { this.className = 'input_sub_hi'; });
+    addEvent(obj, "blur",  function () { this.className = 'input_sub'; });
+}
+
+// return the value of the radio button that is checked
+// return an empty string if none are checked, or
+// there are no radio buttons
+function get_checked_value(radioObj) {
+       if(!radioObj)
+               return "";
+       var radioLength = radioObj.length;
+       if(radioLength == undefined)
+               if(radioObj.checked)
+                       return radioObj.value;
+               else
+                       return "";
+       for(var i = 0; i < radioLength; i++) {
+               if(radioObj[i].checked) {
+                       return radioObj[i].value;
+               }
+       }
+       return "";
+}
+
+// set the radio button with the given value as being checked
+// do nothing if there are no radio buttons
+// if the given value does not exist, all the radio buttons
+// are reset to unchecked
+function set_checked_value(radioObj, newValue) {
+       if(!radioObj)
+               return;
+       var radioLength = radioObj.length;
+       if(radioLength == undefined) {
+               radioObj.checked = (radioObj.value == newValue.toString());
+               return;
+       }
+       for(var i = 0; i < radioLength; i++) {
+               radioObj[i].checked = false;
+               if(radioObj[i].value == newValue.toString()) {
+                       radioObj[i].checked = true;
+               }
+       }
+}
+
+function url_append_arg(url, name, value)
+{
+    var pos, sep, pref, rest;
+
+    if ((pos = url.indexOf('?'+name+'=')) == -1) {
+        pos = url.indexOf('&'+name+'=');
+    }
+    if (pos == -1) {
+        if ((pos = url.indexOf('?')) != -1)
+            sep = '&';
+        else
+            sep = '?';
+
+        return (url+sep+name+"="+encodeURIComponent(value));
+    }
+    else {
+        pref = url.substring(0, pos+1);
+        rest = url.substring(pos+1);
+        // alert("rest: "+rest+"  pos: "+pos);
+        if ((pos = rest.indexOf('&')) != -1) {
+            rest = rest.substring(pos);
+        }
+        else {
+            rest = "";
+        }
+        return (pref+name+"="+encodeURIComponent(value)+rest);
+    }
+}
+
+function url_append_args(url)
+{
+    var i, ret;
+
+    ret = url;
+    for (i = 1 ; i < arguments.length-1 ; i+= 2) {
+        ret = url_append_arg(ret, arguments[i], arguments[i+1]);
+    }
+
+    return (ret);
+}
+
+function url_complete(parent, url)
+{
+    var p, p2, rest;
+    var host = "", path = "";
+
+    // host extraction
+    p = parent.indexOf("://");
+    if (p > -1) {
+        rest = parent.substring(p+3);
+        p2 = rest.indexOf("/");
+        if (p2 > -1) {
+            host = parent.substring(0, p+3+p2);
+            rest = parent.substring(p+3+p2);
+        }
+        else {
+            host = rest;
+            rest = "";
+        }
+    }
+    else {
+        rest = parent;
+    }
+
+    // path extraction
+    p = rest.lastIndexOf("/");
+    if (p > -1) {
+        path = rest.substring(0, p+1);
+    }
+
+    // alert("host: ["+host+"]  path: ["+path+"]");
+    if (url.substring(0,6) == 'http:/' || url.substring(0,7) == 'https:/' || url.substring(0,4) == 'ws:/') {
+        return (url);
+    }
+    else if (url.substring(0,1) == '/') {
+        return (host+url);
+    }
+    else {
+        return (host+path+url);
+    }
+}