From 17bab62211d2fb71a43e4fa0ccd1dbd732e53ed2 Mon Sep 17 00:00:00 2001
From: phenning <>
Date: Mon, 22 Jan 2018 15:13:17 +0000
Subject: [PATCH] babble.js: Javascript file for Babble

git-svn-id: https://svn.fhem.de/fhem/trunk@15954 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
 fhem/www/pgm2/babble.js | 325 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 325 insertions(+)
 create mode 100644 fhem/www/pgm2/babble.js

diff --git a/fhem/www/pgm2/babble.js b/fhem/www/pgm2/babble.js
new file mode 100644
index 000000000..f577338f2
--- /dev/null
+++ b/fhem/www/pgm2/babble.js
@@ -0,0 +1,325 @@
+//########################################################################################
+// babble.js
+// Version 1.04
+// See 95_Babble for licensing
+//########################################################################################
+//# Prof. Dr. Peter A. Henning
+
+//------------------------------------------------------------------------------------------------------
+// Determine csrfToken
+//------------------------------------------------------------------------------------------------------
+
+var req = new XMLHttpRequest();
+req.open('GET', document.location, false);
+req.send(null);
+var csrfToken = req.getResponseHeader('X-FHEM-csrfToken');
+
+//------------------------------------------------------------------------------------------------------
+// encode Parameters for URL
+//------------------------------------------------------------------------------------------------------
+
+function encodeParm(oldval) {
+    var newval;
+    newval = oldval.replace(/\$/g, '\\%24');
+    newval = newval.replace(/"/g, '%27');
+    newval = newval.replace(/#/g, '%23');
+    newval = newval.replace(/\+/g, '%2B');
+    newval = newval.replace(/&/g, '%26');
+    newval = newval.replace(/'/g, '%27');
+    newval = newval.replace(/=/g, '%3D');
+    newval = newval.replace(/\?/g, '%3F');
+    newval = newval.replace(/\|/g, '%7C');
+    newval = newval.replace(/\s/g, '%20');
+    return newval;
+};
+
+//------------------------------------------------------------------------------------------------------
+// Add and remove places and verbs
+//------------------------------------------------------------------------------------------------------
+
+function reload() {
+    //location.reload()
+}
+
+function dialog1(message) {
+    $('<div></div>').appendTo('body').html('<div><h6>' + message + '</h6></div>').dialog({
+        modal: true, title: 'Babble', zIndex: 10000, autoOpen: true,
+        width: 'auto', resizable: false,
+        buttons: {
+            OK: function () {
+                location.reload();
+                $(this).dialog("close");
+            }
+        },
+        close: function (event, ui) {
+            $(this).remove();
+        }
+    });
+};
+
+function babble_addplace(name) {
+    var place = document.getElementById('b_newplace').value;
+    var location = document.location.pathname;
+    if (location.substr(location.length -1, 1) == '/') {
+        location = location.substr(0, location.length -1);
+    }
+    var url = document.location.protocol + "//" + document.location.host + location;
+    FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Babble_ModPlace("' + name + '","' + encodeParm(place) + '",1)}');
+    dialog1(tt_place + ' ' + place + ' ' + tt_added);
+};
+
+function babble_modplace(name, place, num) {
+    var btn = document.getElementById('b_addplace');
+    var divm = document.getElementById('b_chgplacediv');
+    var fld = document.getElementById('b_newplace');
+    fld.value = place;
+    btn.value = tt_remove;
+    btn.setAttribute("onclick", "babble_remplace('" + name + "','" + place + "'," + num + ")");
+    var btnm = '<input type="button" id="b_canplace" onclick="babble_cancelplace(';
+    btnm += "'" + name + "')";
+    btnm += '" value="' + tt_cancel + '" style="height:20px; width:100px;"/>';
+    divm.innerHTML = btnm;
+};
+
+function babble_remplace(name, place, num) {
+    var location = document.location.pathname;
+    if (location.substr(location.length -1, 1) == '/') {
+        location = location.substr(0, location.length -1);
+    }
+    var url = document.location.protocol + "//" + document.location.host + location;
+    FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Babble_ModPlace("' + name + '",' + num + ',0)}');
+    dialog1(tt_place + ' ' + place + ' ' + tt_removed);
+};
+
+function babble_cancelplace(name) {
+    var btn = document.getElementById('b_addplace');
+    var fld = document.getElementById('b_newplace');
+    var divm = document.getElementById('b_chgplacediv');
+    fld.value = "";
+    btn.value = tt_add;
+    btn.setAttribute("onclick", "babble_addplace('" + name + "')");
+    divm.innerHTML = '';
+}
+
+function babble_addverb(name) {
+    var verbi = document.getElementById('b_newverbi').value;
+    var verbc = document.getElementById('b_newverbc').value;
+    var location = document.location.pathname;
+    if (location.substr(location.length -1, 1) == '/') {
+        location = location.substr(0, location.length -1);
+    }
+    1
+    var url = document.location.protocol + "//" + document.location.host + location;
+    FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Babble_ModVerb("' + name + '","' + verbi + '","' + verbc + '",1)}');
+    dialog1(tt_verb + ' ' + verbi + ' ' + tt_added);
+};
+
+function babble_modverb(name, verbi, verbc, num) {
+    var btna = document.getElementById('b_addverb');
+    var divm = document.getElementById('b_chgverbdiv');
+    var fldi = document.getElementById('b_newverbi');
+    var fldc = document.getElementById('b_newverbc');
+    fldi.value = verbi;
+    fldc.value = verbc;
+    btna.value = tt_remove;
+    btna.setAttribute("onclick", "babble_remverb('" + name + "','" + verbi + "'," + num + ")");
+    var btnm = '<input type="button" id="b_chgverb" onclick="babble_chgverb(';
+    btnm += "'" + name + "'," + num + ")";
+    btnm += '" value="' + tt_modify + '" style="height:20px; width:100px;"/>';
+    var btnm2 = '<input type="button" id="b_canverb" onclick="babble_cancelverb(';
+    btnm2 += "'" + name + "')";
+    btnm2 += '" value="' + tt_cancel + '" style="height:20px; width:100px;"/>';
+    divm.innerHTML = btnm + btnm2;
+};
+function babble_remverb(name, verbi, num) {
+    var location = document.location.pathname;
+    if (location.substr(location.length -1, 1) == '/') {
+        location = location.substr(0, location.length -1);
+    }
+    var url = document.location.protocol + "//" + document.location.host + location;
+    FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Babble_ModVerb("' + name + '",' + num + ',"",0)}');
+    dialog1(tt_verb + ' ' + verbi + ' ' + tt_removed);
+};
+
+function babble_chgverb(name, num) {
+    var verbi = document.getElementById('b_newverbi').value;
+    var verbc = document.getElementById('b_newverbc').value;
+    var location = document.location.pathname;
+    if (location.substr(location.length -1, 1) == '/') {
+        location = location.substr(0, location.length -1);
+    }
+    1
+    var url = document.location.protocol + "//" + document.location.host + location;
+    FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Babble_ModVerb("' + name + '",' + num + ',"' + verbc + '",2)}');
+    dialog1(tt_verb + ' ' + verbi + ' ' + tt_modified);
+};
+
+function babble_cancelverb(name) {
+    var btna = document.getElementById('b_addverb');
+    var divm = document.getElementById('b_chgverbdiv');
+    var fldi = document.getElementById('b_newverbi');
+    var fldc = document.getElementById('b_newverbc');
+    fldi.value = "";
+    fldc.value = "";
+    btna.value = tt_add;
+    btna.setAttribute("onclick", "babble_addverb('" + name + "')");
+    divm.innerHTML = '';
+}
+
+function babble_addrow(name, devx, rowx) {
+    var table = document.getElementById("devstable");
+    var rown = 2;
+    for (i = 0; i < devx-1; i++) {
+        rown += devrows[i];
+    }
+    var row = table.insertRow(rown)
+    devrows[devx -1] = devrows[devx -1] + 1;
+    var cell0 = row.insertCell(0);
+    var cell1 = row.insertCell(1);
+    var cell2 = row.insertCell(2);
+    var cell3 = row.insertCell(3);
+    var cell4 = row.insertCell(4);
+    var cell5 = row.insertCell(5);
+    var cell6 = row.insertCell(6);
+    //copy from existing row if such a row exists
+    cell2.innerHTML = newplace;
+    cell3.innerHTML = newverbs;
+    cell4.innerHTML = newtargs;
+    cell5.innerHTML = newfield;
+}
+
+function babble_remrow(name, devx, rowx) {
+    var table = document.getElementById("devstable");
+    var url = document.location.protocol + "//" + document.location.host + "/fhem";
+    var rown = rowx;
+    var rowdev = 1;
+    for (i = 0; i < devx -1; i++) {
+        rowdev += devrows[i];   
+    }
+    devrows[devx -1] = devrows[devx -1] -1;
+    var bdev = table.rows[rowdev].cells[1].textContent;
+    var place = '';
+    var verb = '';
+    var target = '';
+    var cmd = '';
+    var selector;
+    var selectedanswer;
+    //
+    selector = table.rows[rown].cells[2].getElementsByTagName("select")[0];
+    if( selector ){
+      selectedanswer = selector.selectedIndex;
+      place = selector.getElementsByTagName("option")[selectedanswer].value;
+    }else{
+      place = "none";
+    }
+    //
+    selector = table.rows[rown].cells[3].getElementsByTagName("select")[0];
+    if( selector ){
+      selectedanswer = selector.selectedIndex;
+      verb = selector.getElementsByTagName("option")[selectedanswer].value;
+    }else{
+      verb = "none";
+    }
+    //
+    selector = table.rows[rown].cells[4].getElementsByTagName("select")[0];
+    if( selector ){
+      selectedanswer = selector.selectedIndex;
+      target = selector.getElementsByTagName("option")[selectedanswer].value;
+    }else{
+      target = "none";
+    }
+    //
+    cmd = '{Babble_RemCmd("' + name + '","' + bdev + '","' + place + '","' + verb + '","' + target + '")}';
+    FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=' + cmd);
+    table.deleteRow(rown);
+}
+
+function babble_savedevs(name) {
+    var table = document.getElementById("devstable");
+    var url = document.location.protocol + "//" + document.location.host + "/fhem";
+    for (idev = 1; idev <= devrows.length; idev++) {
+        var rowdev = 1;
+        for (ip = 0; ip < idev -1; ip++) {
+          rowdev += devrows[ip];   
+        }
+        var fhemdev = table.rows[rowdev].cells[0].textContent;
+        var bdev = table.rows[rowdev].cells[1].textContent;
+        var place = '';
+        var verb = '';
+        var target = '';
+        var cmd = '';
+        var selector;
+        var selectedanswer;
+        var field;
+        // Help text
+        field = table.rows[rowdev].cells[3].getElementsByTagName("input")[0];
+        cmd = field.value;
+        cmd = '{Babble_ModHlp("' + name + '","' + bdev + '","' + encodeParm(cmd) + '")}';
+        FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=' + cmd);
+        // Command lines
+        for (j = 1; j < devrows[idev -1]; j++) {
+            //
+            selector = table.rows[rowdev + j].cells[2].getElementsByTagName("select")[0];
+            if( selector ){ 
+              selectedanswer = selector.selectedIndex;
+              place = selector.getElementsByTagName("option")[selectedanswer].value;
+            }else{
+              place = "none";
+            }
+            //
+            selector = table.rows[rowdev + j].cells[3].getElementsByTagName("select")[0];
+            if( selector ){
+              selectedanswer = selector.selectedIndex;
+              verb = selector.getElementsByTagName("option")[selectedanswer].value;
+            }else{
+              verb = "none";
+            }  
+            //
+            selector = table.rows[rowdev + j].cells[4].getElementsByTagName("select")[0];
+            if( selector ){
+              selectedanswer = selector.selectedIndex;
+              target = selector.getElementsByTagName("option")[selectedanswer].value;
+            }else{
+              target = "none"
+            }
+            //
+            field = table.rows[rowdev + j].cells[5].getElementsByTagName("input")[0];
+            cmd = field.value;
+            //
+            cmd = '{Babble_ModCmd("' + name + '","' + bdev + '","' + place + '","' + verb + '","' + target + '","' + encodeParm(cmd) + '")}';
+            FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=' + cmd);
+        }
+    };
+    FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Babble_savename("' + name + '")}');
+}
+
+var httpRequest;
+
+function babble_testit(name) {
+    var sentence = document.getElementById("d_testcommand").value;
+    var exec =  document.getElementById("b_execit").checked;
+    var exflag;
+    if( exec ){
+       exflag=1;
+    }else{
+       exflag=0;
+    }
+    var url = document.location.protocol + "//" + document.location.host + "/fhem";
+    var cmd = '{Babble_TestIt("' + name + '","' + encodeParm(sentence) + '",' + exflag + ')}';
+  
+    httpRequest = new XMLHttpRequest();
+    httpRequest.open("GET", url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=' + cmd, true);
+    httpRequest.onreadystatechange = parse;
+    httpRequest.send(null);
+};
+
+function parse () {
+    if (httpRequest.readyState != 3) {
+        return;
+    }
+    var lines = httpRequest.responseText.split("\n");
+    //Pop the last (maybe empty) line after the last "\n"
+    //We wait until it is complete, i.e. terminated by "\n"
+    lines.pop();
+    document.getElementById("d_testresult").innerHTML = lines[1];
+}
\ No newline at end of file