modified check to skip chatt call to be able to log all msg in moderation
[brisk.git] / web / commons.js
index f564eea..4c0ea73 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  brisk - commons.js
  *
- *  Copyright (C) 2006-2008 Matteo Nastasi
+ *  Copyright (C) 2006-2012 Matteo Nastasi
  *                          mailto: nastasi@alternativeoutput.it 
  *                                  matteo.nastasi@milug.org
  *                          web: http://www.alternativeoutput.it
  * 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 = 900;
+var EXIT_BAN_TIME = 3600;
 var cookiepath = "/brisk/";
 
+var BSK_USER_FLAGS = 0;
+var BSK_USER_FLGVL = 1;
+var BSK_USER_NICK  = 2;
+var BSK_USER_SCOL  = 3;
+
 var mlang_commons = { 'imgload_a' : { 'it' : 'Immagine caricate ', 
                                       'en' : 'Loaded images ' },
                       'imgload_b' : { 'it' : '%.', 
@@ -40,11 +43,33 @@ var mlang_commons = { 'imgload_a' : { 'it' : 'Immagine caricate ',
                       'btn_sit'   : { 'it' : 'Mi siedo.',
                                       'en' : 'Sit down.' },
                       'btn_exit'  : { 'it' : 'Esco.',
-                                      'en' : 'Exit.' }
-                      
-                      };
+                                      'en' : 'Exit.' },
+                      'tit_list'  : { '0'  : { 'it' : '',
+                                               'en' : '' },
+                                      '1'  : { 'it' : '(solo aut.)',
+                                               'en' : '(only aut.)' },
+                                      '2'  : { 'it' : '(isolam.to)',
+                                               'en' : '(isolation)' } }
+                    };
+
+function $() {
+    if (arguments.length == 1)
+        return document.getElementById(arguments[0]);
+    else
+        return (arguments[0]).document.getElementById((arguments[1]));
+}
+
+function dec2hex(d, padding)
+{
+    var hex = Number(d).toString(16);
+    padding = typeof (padding) === "undefined" || padding === null ? padding = 2 : padding;
 
-function $(id) { return document.getElementById(id); }
+    while (hex.length < padding) {
+        hex = "0" + hex;
+    }
+
+    return hex;
+}
 
 function getStyle(x,IEstyleProp, MozStyleProp) 
 {
@@ -237,8 +262,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;
@@ -251,7 +278,13 @@ function send_mesg(mesg)
     
     // 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) {
@@ -261,14 +294,29 @@ function send_mesg(mesg)
     }
 }
 
+/*
+  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 = "";
+    var i, collect = "", post_collect = null, is_post = false;
 
     if (arguments.length > 0) {
         for (i = 0 ; i < arguments.length ; i+= 2) {
-            collect += (i == 0 ? "" : "&") + arguments[i] + "=" + encodeURIComponent(arguments[i+1]);
+            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);
@@ -277,9 +325,15 @@ function server_request()
     
     // console.log("server_request:preresp: "+xhr_wr.responseText);
 
-    xhr_wr.open('GET', 'index_wr.php?'+(is_conn ? 'sess='+sess+'&' : '')+collect, false);
+    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(null);
+    xhr_wr.send(post_collect);
     
     if (xhr_wr.responseText != null) {
         // console.log("server_request:resp: "+xhr_wr.responseText);
@@ -322,6 +376,11 @@ function act_chatt(value)
 }
 
 /* Stat: ROOM */
+function act_ping()
+{
+    send_mesg("ping");
+}
+
 function act_sitdown(table)
 {
     send_mesg("sitdown|"+table);
@@ -332,9 +391,9 @@ function act_wakeup()
     send_mesg("wakeup");
 }
 
-function act_splash(date)
+function act_splash()
 {
-    send_mesg("splash|"+date);
+    send_mesg("splash");
 }
 
 function act_help()
@@ -397,6 +456,178 @@ function act_logout(exitlock)
     send_mesg("logout|"+exitlock);
 }
 
+function ModerateItem(item_ar)
+{
+    var tr, td;
+    this.time  = item_ar[0];
+    this.usrid = item_ar[1];
+    this.where = item_ar[2];
+    this.name  = item_ar[3];
+    this.cont  = item_ar[4];
+
+    tr = document.createElement("tr");
+    td = document.createElement("td");
+    td.innerHTML = this.name;
+    tr.appendChild(td);
+    td = document.createElement("td");
+    td.innerHTML = this.cont;
+    tr.appendChild(td);
+
+    this.tr = tr;
+}
+
+ModerateItem.prototype = {
+    time: 0,
+    usrid: 0,
+    where: -1,
+    name: "",
+    cont: "",
+
+    tr: null,
+
+    tr_get: function () {
+        return this.tr;
+    }
+}
+
+function Moderate()
+{
+    this.item = new Array();
+}
+
+Moderate.prototype = {
+    win:  null,
+    table: null,
+    enabled: false,
+    item: null,
+
+    cur: -1,
+
+    disable: function () {
+        if (this.tout) {
+            clearTimeout(this.tout);
+            this.tout = 0;
+        }
+        if (this.win) {
+            this.win.onbeforeunload = null;
+            this.win.close();
+            this.win = null;
+        }
+    },
+
+    activate: function (enable) {
+        if (this.enabled == enable) {
+            return true;
+        }
+        if (enable) {
+            this.disable();
+
+            this.win = window.open("moderation.php", "Moderazione", "width=800,height=600,toolbar=no,location=no,menubar=no,status=no");
+            if (this.win == null) {
+                this.disable();
+                return false;
+            }
+            // to finish initialization we wait for popup page onload event ...
+            this.win_waitonload();
+        }
+        else {
+            this.disable();
+            this.enabled = false;
+        }
+
+    },
+
+    win_waitonload: function () {
+        if (typeof(this.win.is_loaded)  == 'undefined' || this.win.is_loaded != true) {
+            console.log("not ready");
+            this.tout = setTimeout(function (obj) { obj.win_waitonload(); }, 250, this);
+        }
+        else {
+            console.log("ready now!");
+            this.post_onload();
+        }
+    },
+
+    post_onload: function() {
+        var tr, td, remtr;
+
+        this.win.anc = this;
+        this.table = $(this.win, 'moder_tab');
+
+        // for (i = 0 ; i < 3 ; i++) {
+        //     tr = document.createElement("tr");
+        //     for (e = 0 ; e < 2 ; e++) {
+        //         td = document.createElement("td");
+        //         td.innerHTML = "Content "+((i * 2)+e);
+        //         tr.appendChild(td);
+        //     }
+        //     this.table.appendChild(tr);
+        //     if (i == 0) 
+        //         remtr = tr;
+        // }
+        // this.table.removeChild(remtr);
+
+        this.enabled = true;
+    },
+
+    onunload: function() {
+        act_moderate();
+    },
+
+    is_enabled: function() {
+        return (this.enabled);
+    },
+    add: function(item) {
+        var mi;
+
+        console.log(typeof(this.item));
+        mi = new ModerateItem(item);
+        this.item.push(mi);
+
+        this.table.appendChild(mi.tr_get());
+
+    }
+    // send_mesg("moderate|"+(enable ? "false" | "true"));
+
+}
+
+function moderate(enable)
+{
+    return (g_moder.activate(enable));
+}
+
+var g_moder = new Moderate();
+
+function act_moderate()
+{
+    send_mesg("moderate|"+(g_moder.is_enabled() ? "false" : "true"));
+}
+
+
+
+//         // build table with js
+        
+//         g_moder.item = new Array;
+//         g_moder.table = xxx;
+//     }
+//     else {
+//         if (g_moder == null)
+//             return true;
+
+//         if (g_moder.win != null) {
+//             g_moder.win.close();
+//             g_moder.win = null;
+//         }
+
+//         if (g_moder.item != null) {
+//             // TODO CLEANUP
+//             ;
+//         }
+//         g_moder.cur = -1;
+//     }
+// }
+
+
 function act_reloadroom()
 {
     window.onunload = null;
@@ -404,6 +635,7 @@ function act_reloadroom()
     document.location.assign("index.php");
 }
 
+
 function act_shutdown()
 {
     var c = 0;
@@ -417,7 +649,7 @@ function postact_logout()
 {
     // alert("postact_logout");
     try { 
-       xhr_rd.abort();
+       hstm.abort();
     } catch (e) {}
 
     // eraseCookie("sess");
@@ -558,6 +790,11 @@ slowimg.prototype = {
     }
 }
 
+function div_show(div)
+{
+    div.style.top = parseInt((document.body.clientHeight - parseInt(getStyle(div,"height", "height"))) / 2) + document.body.scrollTop;
+    div.style.visibility = "visible";
+}
 
 function notify_ex(st, text, tout, butt, w, h, is_opa, block_time)
 {
@@ -640,7 +877,7 @@ notify_ex.prototype = {
     clo: null,
     clodiv: null, 
     butt: null,
-    tblkid: null, 
+    tblkid: null,
 
     unblock: function()
     {
@@ -674,11 +911,6 @@ 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;
@@ -687,7 +919,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()
 {
@@ -752,6 +1006,32 @@ var chatt_lines_n = 0;
 
 var CHATT_MAXLINES = 40;
 
+function user_decorator(user)
+{
+    var name;
+    var flags = user[BSK_USER_FLAGS];
+    var flags_vlt = user[BSK_USER_FLGVL];
+    if ((flags & 0x03) != 0)
+        name = "<span class='au" + (flags & 0x03) + "'>"+user[BSK_USER_NICK]+"</span>";
+    else
+        name = user[BSK_USER_NICK];
+
+    return (name);
+}
+
+function user_dec_and_state(el)
+{
+    var content = "";
+    var val_el;
+
+    content = user_decorator(el);
+    content += state_add(el[BSK_USER_FLAGS], el[BSK_USER_FLGVL],
+                         (typeof(el[BSK_USER_SCOL]) != 'undefined' ? el[BSK_USER_SCOL] : null));
+    
+    return (content);
+}
+
+
 /* PRO CHATT */
 function chatt_sub(dt,data,str)
 {
@@ -759,39 +1039,34 @@ function chatt_sub(dt,data,str)
     var name;
     var flags;
     var isauth;
-
-    flags = data[0];
-    if (flags & 0x02)
-        name = "<i>"+data[1]+"</i>";
-    else
-        name = data[1];
-    // alert ($("txt").scrollTop + parseInt(getStyle($("txt"),"height", "height")) -  $("txt").scrollHeight);
-
-  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];
+    var bolder = [ (data[BSK_USER_FLAGS] | 1), data[BSK_USER_FLGVL], data[BSK_USER_NICK] ];
+    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];
     }
-    chatt_lines[i] = dt+"<b>"+name+"</b> "+str+ "<br>";
-    $("txt").innerHTML += chatt_lines[i];
-  }
-  else {
-    chatt_lines[chatt_lines_n] = dt+"<b>"+name+"</b> "+str+ "<br>";
-    $("txt").innerHTML += chatt_lines[chatt_lines_n];
-    chatt_lines_n++;
-  }
-  // $("txt").innerHTML;
-
+    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") );
+    
+    if (must_scroll) {
+        $("txt").scrollTop = 10000000;
+    }
+    // alert("scTOP "+$("txt").scrollTop+"  scHEIGHT: "+$("txt").scrollHeight+" HEIGHT: "+getStyle($("txt"),"height", "height") );
 }
 
 /*
@@ -822,54 +1097,20 @@ function eraseCookie(name) {
        createCookie(name,"",-1);
 }
 
-var onunload_times = 0;
-
-
 function onbeforeunload_cb () {
     return("");
 }
 
-function onunload_cb_old () {
-    var u = 0;
-    
-    //    if (nonunload == true)
-    //     return true;
-    
-    if (onunload_times == 0) {
-        // MLANG "    Vuoi veramente abbandonare la briscola ?\n(clicca annulla o cancel se vuoi ricaricare la briscola)"
-       var res = window.confirm(mlang_commons['brileav'][g_lang]);
-       if (res == true) {
-           the_end = true; 
-           act_shutdown();
-           // while (1) 
-           //  u++;
-       }
-       else {
-           try {
-               document.location.href = self.location; //  = self.location;
-                // alert ("passiamo di qui"+self.location);
-                return (false);
-           } catch (e) {
-                // MLANG "Ripristino della briscola fallito, per non perdere la sessione ricaricare la pagina manualmente."
-               alert(mlang_commons['brireco'][g_lang]);
-           }
-       }
-       onunload_times++;
-    }
-    
-    return(false);
-}
-
 function onunload_cb () {
     
-    the_end = true; 
+    if (typeof(hstm) != "undefined")
+        hstm.the_end = true; 
 
     act_shutdown();
     
     return(false);
 }
 
-
 function room_checkspace(emme,tables,inpe)
 {
     nome = "<b>";
@@ -1022,3 +1263,124 @@ function formsub_hilite(obj)
     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:/') {
+        return (url);
+    }
+    else if (url.substring(0,1) == '/') {
+        return (host+url);
+    }
+    else {
+        return (host+path+url);
+    }
+}