babble.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. //########################################################################################
  2. // babble.js
  3. // Version 1.4
  4. // See 95_Babble.pm for licensing
  5. //########################################################################################
  6. //# Prof. Dr. Peter A. Henning
  7. //------------------------------------------------------------------------------------------------------
  8. // Determine csrfToken
  9. //------------------------------------------------------------------------------------------------------
  10. var req = new XMLHttpRequest();
  11. req.open('GET', document.location.href, false);
  12. req.send(null);
  13. var csrfToken = req.getResponseHeader('X-FHEM-csrfToken');
  14. if( csrfToken == null ){
  15. csrfToken = "null";
  16. }
  17. //------------------------------------------------------------------------------------------------------
  18. // encode Parameters for URL
  19. //------------------------------------------------------------------------------------------------------
  20. function encodeParm(oldval) {
  21. var newval;
  22. newval = oldval.replace(/\$/g, '\\%24');
  23. newval = newval.replace(/"/g, '%27');
  24. newval = newval.replace(/#/g, '%23');
  25. newval = newval.replace(/\+/g, '%2B');
  26. newval = newval.replace(/&/g, '%26');
  27. newval = newval.replace(/'/g, '%27');
  28. newval = newval.replace(/=/g, '%3D');
  29. newval = newval.replace(/\?/g, '%3F');
  30. newval = newval.replace(/\|/g, '%7C');
  31. newval = newval.replace(/\s/g, '%20');
  32. return newval;
  33. };
  34. //------------------------------------------------------------------------------------------------------
  35. // Add and remove places and verbs
  36. //------------------------------------------------------------------------------------------------------
  37. function dialog1(message) {
  38. $('<div></div>').appendTo('body').html('<div><h6>' + message + '</h6></div>').dialog({
  39. modal: true, title: 'Babble', zIndex: 10000, autoOpen: true,
  40. width: 'auto', resizable: false,
  41. buttons: {
  42. OK: function () {
  43. location.reload();
  44. $(this).dialog("close");
  45. }
  46. },
  47. close: function (event, ui) {
  48. $(this).remove();
  49. }
  50. });
  51. };
  52. function babble_addplace(name) {
  53. var place = document.getElementById('b_newplace').value;
  54. var location = document.location.pathname;
  55. if (location.substr(location.length -1, 1) == '/') {
  56. location = location.substr(0, location.length -1);
  57. }
  58. var url = document.location.protocol + "//" + document.location.host + location;
  59. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Babble_ModPlace("' + name + '","' + encodeParm(place) + '",1)}');
  60. dialog1(tt_place + ' ' + place + ' ' + tt_added);
  61. };
  62. function babble_modplace(name, place, num) {
  63. var btn = document.getElementById('b_addplace');
  64. var divm = document.getElementById('b_chgplacediv');
  65. var fld = document.getElementById('b_newplace');
  66. fld.value = place;
  67. btn.value = tt_remove;
  68. btn.setAttribute("onclick", "babble_remplace('" + name + "','" + place + "'," + num + ")");
  69. var btnm = '<input type="button" id="b_canplace" onclick="babble_cancelplace(';
  70. btnm += "'" + name + "')";
  71. btnm += '" value="' + tt_cancel + '" style="height:20px; width:100px;"/>';
  72. divm.innerHTML = btnm;
  73. };
  74. function babble_remplace(name, place, num) {
  75. var location = document.location.pathname;
  76. if (location.substr(location.length -1, 1) == '/') {
  77. location = location.substr(0, location.length -1);
  78. }
  79. var url = document.location.protocol + "//" + document.location.host + location;
  80. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Babble_ModPlace("' + name + '",' + num + ',0)}');
  81. dialog1(tt_place + ' ' + place + ' ' + tt_removed);
  82. };
  83. function babble_cancelplace(name) {
  84. var btn = document.getElementById('b_addplace');
  85. var fld = document.getElementById('b_newplace');
  86. var divm = document.getElementById('b_chgplacediv');
  87. fld.value = "";
  88. btn.value = tt_add;
  89. btn.setAttribute("onclick", "babble_addplace('" + name + "')");
  90. divm.innerHTML = '';
  91. }
  92. function babble_addverb(name) {
  93. var verbi = document.getElementById('b_newverbi').value;
  94. var verbc = document.getElementById('b_newverbc').value;
  95. var location = document.location.pathname;
  96. if (location.substr(location.length -1, 1) == '/') {
  97. location = location.substr(0, location.length -1);
  98. }
  99. 1
  100. var url = document.location.protocol + "//" + document.location.host + location;
  101. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Babble_ModVerb("' + name + '","' + verbi + '","' + verbc + '",1)}');
  102. dialog1(tt_verb + ' ' + verbi + ' ' + tt_added);
  103. };
  104. function babble_modverb(name, verbi, verbc, num) {
  105. var btna = document.getElementById('b_addverb');
  106. var divm = document.getElementById('b_chgverbdiv');
  107. var fldi = document.getElementById('b_newverbi');
  108. var fldc = document.getElementById('b_newverbc');
  109. fldi.value = verbi;
  110. fldc.value = verbc;
  111. btna.value = tt_remove;
  112. btna.setAttribute("onclick", "babble_remverb('" + name + "','" + verbi + "'," + num + ")");
  113. var btnm = '<input type="button" id="b_chgverb" onclick="babble_chgverb(';
  114. btnm += "'" + name + "'," + num + ")";
  115. btnm += '" value="' + tt_modify + '" style="height:20px; width:100px;"/>';
  116. var btnm2 = '<input type="button" id="b_canverb" onclick="babble_cancelverb(';
  117. btnm2 += "'" + name + "')";
  118. btnm2 += '" value="' + tt_cancel + '" style="height:20px; width:100px;"/>';
  119. divm.innerHTML = btnm + btnm2;
  120. };
  121. function babble_remverb(name, verbi, num) {
  122. var location = document.location.pathname;
  123. if (location.substr(location.length -1, 1) == '/') {
  124. location = location.substr(0, location.length -1);
  125. }
  126. var url = document.location.protocol + "//" + document.location.host + location;
  127. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Babble_ModVerb("' + name + '",' + num + ',"",0)}');
  128. dialog1(tt_verb + ' ' + verbi + ' ' + tt_removed);
  129. };
  130. function babble_chgverb(name, num) {
  131. var verbi = document.getElementById('b_newverbi').value;
  132. var verbc = document.getElementById('b_newverbc').value;
  133. var location = document.location.pathname;
  134. if (location.substr(location.length -1, 1) == '/') {
  135. location = location.substr(0, location.length -1);
  136. }
  137. 1
  138. var url = document.location.protocol + "//" + document.location.host + location;
  139. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Babble_ModVerb("' + name + '",' + num + ',"' + verbc + '",2)}');
  140. dialog1(tt_verb + ' ' + verbi + ' ' + tt_modified);
  141. };
  142. function babble_cancelverb(name) {
  143. var btna = document.getElementById('b_addverb');
  144. var divm = document.getElementById('b_chgverbdiv');
  145. var fldi = document.getElementById('b_newverbi');
  146. var fldc = document.getElementById('b_newverbc');
  147. fldi.value = "";
  148. fldc.value = "";
  149. btna.value = tt_add;
  150. btna.setAttribute("onclick", "babble_addverb('" + name + "')");
  151. divm.innerHTML = '';
  152. }
  153. function babble_addrow(name, devx, rowx) {
  154. var table = document.getElementById("devstable");
  155. var rown = 2;
  156. for (i = 0; i < devx-1; i++) {
  157. rown += devrows[i];
  158. }
  159. var row = table.insertRow(rown)
  160. devrows[devx -1] = devrows[devx -1] + 1;
  161. var cell0 = row.insertCell(0);
  162. var cell1 = row.insertCell(1);
  163. var cell2 = row.insertCell(2);
  164. var cell3 = row.insertCell(3);
  165. var cell4 = row.insertCell(4);
  166. var cell5 = row.insertCell(5);
  167. var cell6 = row.insertCell(6);
  168. var cell7 = row.insertCell(7);
  169. //copy from existing row if such a row exists
  170. cell2.innerHTML = newplace;
  171. cell3.innerHTML = newverbs;
  172. cell4.innerHTML = newtargs;
  173. cell5.innerHTML = newfield;
  174. cell6.innerHTML = newcheck;
  175. }
  176. function babble_remrow(name, devx, rowx, rowy) {
  177. var table = document.getElementById("devstable");
  178. var url = document.location.protocol + "//" + document.location.host + "/fhem";
  179. var rown = rowx;
  180. var rowdev = 1;
  181. for (i = 0; i < devx -1; i++) {
  182. rowdev += devrows[i];
  183. }
  184. devrows[devx -1] = devrows[devx -1] -1;
  185. var bdev = table.rows[rowdev].cells[1].textContent;
  186. var place = '';
  187. var verb = '';
  188. var target = '';
  189. var cmd = '';
  190. var selector;
  191. var selectedanswer;
  192. //
  193. selector = table.rows[rown].cells[2].getElementsByTagName("select")[0];
  194. if( selector ){
  195. selectedanswer = selector.selectedIndex;
  196. place = selector.getElementsByTagName("option")[selectedanswer].value;
  197. }else{
  198. place = "none";
  199. }
  200. //
  201. selector = table.rows[rown].cells[3].getElementsByTagName("select")[0];
  202. if( selector ){
  203. selectedanswer = selector.selectedIndex;
  204. verb = selector.getElementsByTagName("option")[selectedanswer].value;
  205. }else{
  206. verb = "none";
  207. }
  208. //
  209. selector = table.rows[rown].cells[4].getElementsByTagName("select")[0];
  210. if( selector ){
  211. selectedanswer = selector.selectedIndex;
  212. target = selector.getElementsByTagName("option")[selectedanswer].value;
  213. }else{
  214. target = "none";
  215. }
  216. //
  217. cmd = '{Babble_RemCmd("' + name + '","' + bdev + '","' + place + '","' + verb + '","' + target + '","' + rowy + '")}';
  218. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=' + cmd);
  219. table.deleteRow(rown);
  220. }
  221. function babble_savedevs(name) {
  222. var table = document.getElementById("devstable");
  223. var url = document.location.protocol + "//" + document.location.host + "/fhem";
  224. for (idev = 1; idev <= devrows.length; idev++) {
  225. var rowdev = 1;
  226. for (ip = 0; ip < idev -1; ip++) {
  227. rowdev += devrows[ip];
  228. }
  229. var fhemdev = table.rows[rowdev].cells[0].textContent;
  230. var bdev = table.rows[rowdev].cells[1].textContent;
  231. var place = '';
  232. var verb = '';
  233. var target = '';
  234. var cmd = '';
  235. var selector;
  236. var selectedanswer;
  237. var field;
  238. // Help text
  239. field = table.rows[rowdev].cells[3].getElementsByTagName("input")[0];
  240. cmd = field.value;
  241. cmd = '{Babble_ModHlp("' + name + '","' + bdev + '","' + encodeParm(cmd) + '")}';
  242. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=' + cmd);
  243. // Command lines
  244. for (j = 1; j < devrows[idev -1]; j++) {
  245. //
  246. selector = table.rows[rowdev + j].cells[2].getElementsByTagName("select")[0];
  247. if( selector ){
  248. selectedanswer = selector.selectedIndex;
  249. place = selector.getElementsByTagName("option")[selectedanswer].value;
  250. }else{
  251. place = "none";
  252. }
  253. //
  254. selector = table.rows[rowdev + j].cells[3].getElementsByTagName("select")[0];
  255. if( selector ){
  256. selectedanswer = selector.selectedIndex;
  257. verb = selector.getElementsByTagName("option")[selectedanswer].value;
  258. }else{
  259. verb = "none";
  260. }
  261. //
  262. selector = table.rows[rowdev + j].cells[4].getElementsByTagName("select")[0];
  263. if( selector ){
  264. selectedanswer = selector.selectedIndex;
  265. target = selector.getElementsByTagName("option")[selectedanswer].value;
  266. }else{
  267. target = "none"
  268. }
  269. //
  270. field = table.rows[rowdev + j].cells[5].getElementsByTagName("input")[0];
  271. cmd = field.value;
  272. //
  273. field = table.rows[rowdev + j].cells[6].getElementsByTagName("input")[0];
  274. if( field.checked == true ){
  275. cmd = cmd + ";;$CONFIRM";
  276. }
  277. //
  278. cmd = '{Babble_ModCmd("' + name + '","' + bdev + '","' + place + '","' + verb + '","' + target + '","' + encodeParm(cmd) + '")}';
  279. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=' + cmd);
  280. }
  281. };
  282. FW_cmd(url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '={Babble_savename("' + name + '")}');
  283. }
  284. var httpRequest;
  285. function babble_testit(name) {
  286. var sentence = document.getElementById("d_testcommand").value;
  287. var exec = document.getElementById("b_execit").checked;
  288. var exflag;
  289. if( exec ){
  290. exflag=1;
  291. }else{
  292. exflag=0;
  293. }
  294. var url = document.location.protocol + "//" + document.location.host + "/fhem";
  295. var cmd = '{Babble_DoIt("' + name + '","' + encodeParm(sentence) + '","testit",' + exflag + ')}';
  296. httpRequest = new XMLHttpRequest();
  297. httpRequest.open("GET", url + '?XHR=1&fwcsrf=' + csrfToken + '&cmd.' + name + '=' + cmd, true);
  298. httpRequest.onreadystatechange = parse;
  299. httpRequest.send(null);
  300. };
  301. function parse () {
  302. if (httpRequest.readyState != 3) {
  303. return;
  304. }
  305. var lines = httpRequest.responseText.split("\n");
  306. //Pop the last (maybe empty) line after the last "\n"
  307. //We wait until it is complete, i.e. terminated by "\n"
  308. lines.pop();
  309. document.getElementById("d_testresult").innerHTML = lines[1];
  310. }