fhemweb_uzsu.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. var version="$Id: fhemweb_uzsu.js 13107 2017-01-16 13:14:31Z justme1968 $";
  2. FW_widgets['uzsuToggle'] = {
  3. createFn:FW_uzsuToggleCreate,
  4. };
  5. FW_widgets['uzsuSelect'] = {
  6. createFn:FW_uzsuSelectCreate,
  7. };
  8. FW_widgets['uzsuSelectRadio'] = {
  9. createFn:FW_uzsuSelectRadioCreate,
  10. };
  11. FW_widgets['uzsuDropDown'] = {
  12. createFn:FW_uzsuDropDownCreate,
  13. };
  14. FW_widgets['uzsuTimerEntry'] = {
  15. createFn:FW_uzsuTimerEntryCreate,
  16. };
  17. FW_widgets['uzsuList'] = {
  18. createFn:FW_uzsuListCreate,
  19. };
  20. FW_widgets['uzsu'] = {
  21. createFn:FW_uzsuCreate,
  22. };
  23. function
  24. FW_uzsuDropDownCreate(elName, devName, vArr, currVal, set, params, cmd)
  25. {
  26. if( 0 ) {
  27. console.log( "elName: "+elName );
  28. console.log( "devName: "+devName );
  29. console.log( "vArr: "+vArr );
  30. console.log( "currVal: "+currVal );
  31. console.log( "set: "+set );
  32. console.log( "params: "+params );
  33. console.log( "cmd: "+cmd );
  34. }
  35. if(!vArr.length || vArr[0] != "uzsuDropDown")
  36. return undefined;
  37. vArr[0] = 'time';
  38. //return FW_createTime(elName, devName, vArr, currVal, set, params, cmd);
  39. var newEl = $("<div style='display:inline-block;margin:2px 4px 2px 0px;'>").get(0);
  40. $(newEl).append( FW_createSelect(elName, devName,
  41. ["select",
  42. "00:00","01:00","02:00","03:00","04:00","05:00","06:00","07:00","08:00","09:00",
  43. "10:00","11:00","12:00","13:00","14:00","15:00","16:00","17:00","18:00","19:00",
  44. "20:00","21:00","22:00","23:00"]
  45. ,currVal, set, params, cmd) );
  46. var select = $(newEl).find("select");
  47. select.selectmenu();
  48. select.selectmenu( "option", "width", "auto" );
  49. select.selectmenu( { change: function( event, data ) {
  50. if( cmd )
  51. cmd(data.item.value);
  52. }
  53. });
  54. newEl.getValueFn = function(arg){ return select.val(); };
  55. newEl.setValueFn = function(arg){
  56. select.val(arg);
  57. select.selectmenu("refresh");
  58. }
  59. //newEl.setValueFn(currVal);
  60. return newEl;
  61. }
  62. function
  63. FW_uzsuSelectCreate(elName, devName, vArr, currVal, set, params, cmd)
  64. {
  65. if( 0 ) {
  66. console.log( "elName: "+elName );
  67. console.log( "devName: "+devName );
  68. console.log( "vArr: "+vArr );
  69. console.log( "currVal: "+currVal );
  70. console.log( "set: "+set );
  71. console.log( "params: "+params );
  72. console.log( "cmd: "+cmd );
  73. }
  74. if(!vArr.length || vArr[0] != "uzsuSelect")
  75. return undefined;
  76. var newEl = $("<div style='display:inline-block;'>").get(0);
  77. $(newEl).addClass(vArr[0]);
  78. var hidden;
  79. if(elName)
  80. hidden = $('<input type="hidden" name="'+elName+'" value="'+currVal+'">');
  81. $(newEl).append(hidden);
  82. var clicked = function(arg) { var new_val=newEl.getValueFn(arg);
  83. newEl.setValueFn( new_val );
  84. if( cmd )
  85. cmd(new_val);
  86. };
  87. var buttons = [];
  88. for( var i = 1; i < vArr.length; ++i ) {
  89. var button = $('<input type="checkbox">').uniqueId();
  90. var label = $('<label for="'+button.attr("id")+'">'+vArr[i]+'</label>');
  91. buttons.push(button);
  92. $(newEl).append(button);
  93. $(newEl).append(label);
  94. $(button).change(clicked);
  95. }
  96. $(newEl).buttonset();
  97. if( !currVal )
  98. currVal = ",";
  99. newEl.getValueFn = function(arg) { var new_val="";
  100. for( var i = 0; i < buttons.length; ++i ) {
  101. var button = buttons[i];
  102. if( $(button).prop("checked") ) {
  103. if( new_val ) new_val += ',';
  104. new_val += $(button).button( "option", "label")
  105. }
  106. }
  107. if( !new_val ) return ',';
  108. return new_val;
  109. };
  110. newEl.setValueFn = function(arg){ if( !arg ) arg = ',';
  111. if( hidden )
  112. hidden.attr("value", arg);
  113. for( var i = 0; i < buttons.length; ++i ) {
  114. var button = buttons[i];
  115. button.prop("checked", arg.match(new RegExp('(^|,)'+vArr[i+1]+'($|,)') ) );
  116. button.button("refresh");
  117. }
  118. };
  119. newEl.setValueFn( currVal );
  120. return newEl;
  121. }
  122. function
  123. FW_uzsuSelectRadioCreate(elName, devName, vArr, currVal, set, params, cmd)
  124. {
  125. if( 0 ) {
  126. console.log( "elName: "+elName );
  127. console.log( "devName: "+devName );
  128. console.log( "vArr: "+vArr );
  129. console.log( "currVal: "+currVal );
  130. console.log( "set: "+set );
  131. console.log( "params: "+params );
  132. console.log( "cmd: "+cmd );
  133. }
  134. if(!vArr.length || vArr[0] != "uzsuSelectRadio")
  135. return undefined;
  136. var newEl = $("<div style='display:inline-block;'>").get(0);
  137. $(newEl).addClass(vArr[0]);
  138. var hidden;
  139. if(elName)
  140. hidden = $('<input type="hidden" name="'+elName+'" value="'+currVal+'">');
  141. $(newEl).append(hidden);
  142. var clicked = function(arg) { var new_val=newEl.getValueFn(arg);
  143. newEl.setValueFn( new_val );
  144. if( cmd )
  145. cmd(new_val);
  146. };
  147. var buttons = [];
  148. for( var i = 1; i < vArr.length; ++i ) {
  149. var button = $('<input type="radio" name="radio">').uniqueId();
  150. var label = $('<label for="'+button.attr("id")+'">'+vArr[i]+'</label>');
  151. buttons.push(button);
  152. $(newEl).append(button);
  153. $(newEl).append(label);
  154. $(button).change(clicked);
  155. if( currVal )
  156. button.prop("checked", currVal == vArr[i] );
  157. }
  158. $(newEl).buttonset();
  159. if( !currVal )
  160. currVal = ",";
  161. newEl.getValueFn = function(arg) { var new_val="";
  162. for( var i = 0; i < buttons.length; ++i ) {
  163. var button = buttons[i];
  164. if( $(button).prop("checked") ) {
  165. if( new_val ) new_val += ',';
  166. new_val += $(button).button( "option", "label")
  167. }
  168. }
  169. if( !new_val ) return ',';
  170. return new_val;
  171. };
  172. newEl.setValueFn = function(arg){ if( !arg ) arg = ',';
  173. if( hidden )
  174. hidden.attr("value", arg);
  175. for( var i = 0; i < buttons.length; ++i ) {
  176. var button = buttons[i];
  177. button.prop("checked", (arg == vArr[i+1]) );
  178. button.button("refresh");
  179. }
  180. };
  181. newEl.setValueFn( currVal );
  182. return newEl;
  183. }
  184. function
  185. FW_uzsuToggleCreate(elName, devName, vArr, currVal, set, params, cmd)
  186. {
  187. if( 0 ) {
  188. console.log( "elName: "+elName );
  189. console.log( "devName: "+devName );
  190. console.log( "vArr: "+vArr );
  191. console.log( "currVal: "+currVal );
  192. console.log( "set: "+set );
  193. console.log( "params: "+params );
  194. console.log( "cmd: "+cmd );
  195. }
  196. if(vArr.length<3 || vArr[0] != "uzsuToggle")
  197. return undefined;
  198. var newEl = $("<div style='display:inline-block;'>").get(0);
  199. $(newEl).addClass(vArr[0]);
  200. var hidden;
  201. if(elName)
  202. hidden = $('<input type="hidden" name="'+elName+'" value="'+currVal+'">');
  203. $(newEl).append(hidden);
  204. var button = $('<input type="checkbox">').uniqueId();
  205. var label = $('<label for="'+button.attr("id")+'"></label>');
  206. $(newEl).append(button);
  207. $(newEl).append(label);
  208. button.button();
  209. $(newEl).change(function(arg) { var new_val = newEl.getValueFn();
  210. newEl.setValueFn( new_val );
  211. if( cmd )
  212. cmd(new_val);
  213. } );
  214. newEl.getValueFn = function(arg){ return button.prop("checked")?vArr[2]:vArr[1]; };
  215. newEl.setValueFn = function(arg){ if( !arg )
  216. arg = vArr[1];
  217. if( hidden )
  218. hidden.attr("value", arg);
  219. button.button( "option", "label", arg);
  220. button.prop("checked", arg.match(new RegExp('(^|,)'+vArr[2]+'($|,)') ) );
  221. button.button("refresh");
  222. };
  223. newEl.setValueFn( currVal );
  224. return newEl;
  225. }
  226. function
  227. FW_uzsuTimerEntryCreate(elName, devName, vArr, currVal, set, params, cmd)
  228. {
  229. if( 0 ) {
  230. console.log( "elName: "+elName );
  231. console.log( "devName: "+devName );
  232. console.log( "vArr: "+vArr );
  233. console.log( "currVal: "+currVal );
  234. console.log( "set: "+set );
  235. console.log( "params: "+params );
  236. console.log( "cmd: "+cmd );
  237. }
  238. if(!vArr.length || vArr[0] != "uzsuTimerEntry")
  239. return undefined;
  240. if( !currVal )
  241. currVal = '';
  242. currVals = currVal.split('|');
  243. if( !currVals[2] );
  244. currVals[2] = "enabled";
  245. var newEl = $("<div style='display:inline-block;'>").get(0);
  246. $(newEl).addClass(vArr[0]);
  247. var hidden;
  248. if(elName)
  249. hidden = $('<input type="hidden" name="'+elName+'" value="'+currVal+'">');
  250. $(newEl).append(hidden);
  251. var changed = function(arg) { $(newEl).change();
  252. if(hidden)
  253. hidden.attr("value", newEl.getValueFn());
  254. if(cmd && newEl.getValueFn)
  255. cmd(newEl.getValueFn())};
  256. var wval;
  257. var wchanged = function(arg) { wval = arg; changed() };
  258. var days = FW_uzsuSelectCreate(undefined, devName+"Days", ["uzsuSelect","Mo","Di","Mi","Do","Fr","Sa","So"],
  259. currVals[0], undefined, params, changed);
  260. $(newEl).append(days); //days.activateFn();
  261. var time = FW_uzsuDropDownCreate(undefined, devName+"Time", ["uzsuDropDown"],
  262. currVals[1], undefined, params, changed);
  263. $(newEl).append(time); //time.activateFn();
  264. var widget;
  265. if( vArr[1] )
  266. {
  267. var vArr = vArr;
  268. var params = vArr.slice(1).join(',').split(',');
  269. var wn = params[0];
  270. if( FW_widgets[wn]
  271. && FW_widgets[wn].createFn ) {
  272. widget = FW_widgets[wn].createFn(elName+'-'+wn, devName+'-'+wn, params,
  273. currVals[3], undefined, undefined, wchanged);
  274. if( widget ) {
  275. if( widget.activateFn )
  276. widget.activateFn();
  277. wval = currVals[3];
  278. if( typeof wval == 'undefined' )
  279. wval = params[1];
  280. if( widget.setValueFn
  281. &&( typeof wval !== 'undefined' ) )
  282. widget.setValueFn(wval);
  283. $(widget).css('margin','0 8px 0 4px');
  284. $(newEl).append(widget)
  285. }
  286. } else {
  287. var button = $('<button>aktion</button>');
  288. button.button();
  289. button.val(wn);
  290. button.css('margin','0 8px 0 4px');
  291. button.css('height','29px');
  292. button.button("disable");
  293. $(newEl).append(button);
  294. }
  295. }
  296. var enabled = FW_uzsuToggleCreate(undefined, devName+"Enabled", ["uzsuToggle","disabled","enabled"],
  297. currVals[2], undefined, params, changed);
  298. $(newEl).append(enabled); //enabled.activateFn();
  299. newEl.getValueFn = function() { var ret = "";
  300. ret += days.getValueFn();
  301. ret += '|';
  302. ret += time.getValueFn();
  303. ret += '|';
  304. ret += enabled.getValueFn();
  305. if( widget
  306. && ( typeof wval !== 'undefined' ) ) {
  307. ret += '|';
  308. ret += wval;
  309. //ret += $(widget).val();
  310. }
  311. return ret;
  312. }
  313. newEl.setValueFn = function(arg){ if( hidden )
  314. hidden.attr("value", arg);
  315. var args = arg.split('|');
  316. days.setValueFn(args[0]);
  317. time.setValueFn(args[1])
  318. enabled.setValueFn(args[2])
  319. wval = args[3];
  320. if( widget && widget.setValueFn
  321. && ( typeof wval !== 'undefined' ) ) {
  322. widget.setValueFn(wval);
  323. }
  324. };
  325. if( currVal )
  326. newEl.setValueFn( currVal );
  327. return newEl;
  328. }
  329. function
  330. FW_uzsuListCreate(elName, devName, vArr, currVal, set, params, cmd)
  331. {
  332. if( 0 ) {
  333. console.log( "elName: "+elName );
  334. console.log( "devName: "+devName );
  335. console.log( "vArr: "+vArr );
  336. console.log( "currVal: "+currVal );
  337. console.log( "set: "+set );
  338. console.log( "params: "+params );
  339. console.log( "cmd: "+cmd );
  340. }
  341. if(!vArr.length || vArr[0] != "uzsuList")
  342. return undefined;
  343. var newEl = $("<div style='display:inline-block;'>").get(0);
  344. $(newEl).addClass(vArr[0]);
  345. var button = $('<button>');
  346. button.addClass("back");
  347. button.button({ icons: { primary: "ui-icon-carat-1-w", }, text: false});
  348. button.css('margin','3px');
  349. button.css('height','18px');
  350. button.hover( function() { $(this).css('background', 'red') }, function() { $(this).css('background', '') });
  351. button.click(function( event ) { event.preventDefault();
  352. var arg = $(this).attr("parent");
  353. FW_cmd(FW_root+"?cmd=get "+devName+" children "+arg+"&XHR=1",children);
  354. });
  355. $(newEl).append(button);
  356. var list = $('<ul>');
  357. list.css('overflow','auto');
  358. list.css('height','250px');
  359. list.css('width','350px');
  360. list.css('margin','0px');
  361. list.css('padding','0px');
  362. list.css('list-style','none');
  363. $(newEl).append(list);
  364. var children = function(data) {
  365. $(list).empty();
  366. var items = data.split(',');
  367. button.attr("parent", items[0]);
  368. for( var i = 1; i < items.length; ++i ) {
  369. var item = $('<li>'+items[i]+'</li>')
  370. item.css('border', '1px solid #ccc');
  371. item.css('background-color', '#222');
  372. item.css('margin', '0.25em');
  373. item.css('padding', '0.5em');
  374. item.hover( function() { $(this).css('background', 'red') }, function() { $(this).css('background', '#222') });
  375. item.click(function( event ) { event.preventDefault();
  376. var arg = $(this).text();
  377. FW_cmd(FW_root+"?cmd=get "+devName+" children "+arg+"&XHR=1",children);
  378. });
  379. $(list).append(item);
  380. }
  381. };
  382. children(currVal);
  383. return newEl;
  384. }
  385. function
  386. FW_uzsuCreate(elName, devName, vArr, currVal, set, params, cmd)
  387. {
  388. if( 0 ) {
  389. console.log( "elName: "+elName );
  390. console.log( "devName: "+devName );
  391. console.log( "vArr: "+vArr );
  392. console.log( "currVal: "+currVal );
  393. console.log( "set: "+set );
  394. console.log( "params: "+params );
  395. console.log( "cmd: "+cmd );
  396. }
  397. if(!vArr.length || vArr[0] != "uzsu")
  398. return undefined;
  399. if( !currVal )
  400. currVal = ",";
  401. var newEl = $("<div style='display:inline-block;'>").get(0);
  402. var hidden;
  403. if(elName)
  404. hidden = $('<input type="hidden" name="'+elName+'" value="'+currVal+'">');
  405. $(newEl).append(hidden);
  406. var toJson = function() { var list = [];
  407. var lines = $(newEl).find(".uzsuSelect");
  408. for( var line = 0; line < lines.length; ++line ) {
  409. var entry = {};
  410. entry['value'] = 'on';
  411. entry['time'] = '10:00';
  412. entry['rrule'] = 'FREQ=WEEKLY;BYDAY='+lines[line].getValueFn();
  413. entry['active'] = true;
  414. list.push(entry);
  415. }
  416. var ret = {};
  417. ret['list'] = list;
  418. ret['active'] = true;
  419. return ret;
  420. }
  421. var changed = function(arg) { var new_val = newEl.getValueFn();
  422. //new_val = JSON.stringify(toJson());
  423. if( hidden )
  424. hidden.attr("value", new_val);
  425. if( cmd )
  426. cmd(new_val);
  427. };
  428. var addLine = function(arg,currVal) {
  429. vArr[0] = 'uzsuTimerEntry';
  430. var entry = FW_uzsuTimerEntryCreate(undefined, devName+"UZSU", vArr,
  431. currVal, undefined, params, changed);
  432. var button = $('<button>');
  433. button.button({ icons: { primary: "ui-icon-plus", }, text: false});
  434. button.css('margin','0 0 0 10px');
  435. button.css('height','29px');
  436. button.click(function( event ) { event.preventDefault();
  437. addLine($(button).parent().index()-(hidden?1:0));
  438. changed();
  439. });
  440. $(entry).append(button);
  441. var button = $('<button>');
  442. button.addClass("trash");
  443. button.button({ icons: { primary: "ui-icon-trash", }, text: false});
  444. button.css('margin','0 0 0 10px');
  445. button.css('height','18px');
  446. button.click(function( event ) { event.preventDefault();
  447. $(button).parent().remove();
  448. if( $(newEl).children().length == 1 )
  449. $(newEl).find(".trash").button("disable");
  450. changed();
  451. });
  452. button.hover( function() { $(this).css('background', 'red') }, function() { $(this).css('background', '') });
  453. $(entry).append(button);
  454. var lines = $(newEl).find(".uzsuTimerEntry");
  455. if( !lines.length )
  456. $(newEl).append(entry);
  457. else
  458. $(entry).insertAfter($(lines[arg]));
  459. if( lines.length == 0 )
  460. $(newEl).find(".trash").button("disable");
  461. else if( lines.length == 1 )
  462. $(newEl).find(".trash").button("enable");
  463. }
  464. addLine(-1);
  465. newEl.getValueFn = function() { var ret = "";
  466. var lines = $(newEl).find(".uzsuTimerEntry");
  467. for( var line = 0; line < lines.length; ++line ) {
  468. if(ret) ret += ' ';
  469. ret += lines[line].getValueFn();
  470. }
  471. return ret;
  472. }
  473. newEl.setValueFn = function(arg){ if( hidden )
  474. hidden.attr("value", arg);
  475. var old_lines = $(newEl).find(".uzsuTimerEntry");
  476. var new_lines = arg.split(' ');
  477. for( var line = 0; line < new_lines.length; ++line ) {
  478. if( line < old_lines.length ) {
  479. old_lines[line].setValueFn(new_lines[line]);
  480. } else {
  481. addLine(line-1, new_lines[line]);
  482. }
  483. }
  484. for( var line = new_lines.length; line < old_lines.length; ++line ) {
  485. $(old_lines[line]).remove();
  486. }
  487. if( new_lines.length == 1 )
  488. $(newEl).find(".trash").button("disable");
  489. };
  490. newEl.setValueFn( currVal );
  491. return newEl;
  492. }