fhemweb_iconButtons.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. FW_version["fhemweb_iconButtons.js"] = "$Id: fhemweb_iconButtons.js 15872 2018-01-13 16:32:12Z Ellert $";
  2. FW_widgets['iconButtons'] = {
  3. createFn:FW_iconButtonsCreate,
  4. };
  5. /********* iconButtons *********/
  6. function
  7. FW_iconButtonsCreate(elName, devName, vArr, currVal, set, params, cmd)
  8. {
  9. if( 0 ) {
  10. console.log( "elName: "+elName );
  11. console.log( "devName: "+devName );
  12. console.log( "vArr: "+vArr );
  13. console.log( "currVal: "+currVal );
  14. console.log( "set: "+set );
  15. console.log( "params: "+params );
  16. console.log( "cmd: "+cmd );
  17. }
  18. if(!vArr.length || vArr[0] != "iconButtons")
  19. return undefined;
  20. var ipar = 2;
  21. var iconclass = "";
  22. if(vArr[1].match(/class.*?@/)) {
  23. var m = vArr[1].match(/class(.*?)@/);
  24. iconclass = m && m[1] ? m[1] : "";
  25. vArr[1] = vArr[1].replace(/class.*?@/,"");
  26. }
  27. var use4icon = false;
  28. if(vArr[1].match(/^use4icon@|^@/)) {
  29. use4icon = true;
  30. vArr[1] = vArr[1].replace(/^use4icon@|^@/,"");
  31. }
  32. if( vArr[1].match(/^[A-F0-9]{6}$/i))
  33. vArr[1] = "#"+vArr[1];
  34. var newEl = $("<div style='display:inline-block;'>").get(0);
  35. $(newEl).addClass(vArr[0]);
  36. var hidden;
  37. if(elName)
  38. hidden = $('<input type="hidden" name="'+elName+'" value="'+currVal+'">');
  39. $(newEl).append(hidden);
  40. var clicked = function(arg) { var new_val=newEl.getValueFn(arg);
  41. newEl.setValueFn( new_val );
  42. if( cmd )
  43. cmd(new_val);
  44. };
  45. var buttons = [];
  46. for( var i = 2; i < (vArr.length); i+=ipar ) {
  47. var button = $('<input type="checkbox">').uniqueId();
  48. var label = $('<label for="'+button.attr("id")+'" iconr=":'+((i-2)/ipar)+':" name="'+vArr[i+1]+'" title="'+vArr[i]+'" >'+vArr[i]+'</label>');
  49. buttons.push(button);
  50. $(newEl).append(button);
  51. $(newEl).append(label);
  52. $(button).change(clicked);
  53. if( currVal )
  54. button.prop("checked", currVal.match(new RegExp('(^|,)'+vArr[i]+'($|,)') ) );
  55. }
  56. $(newEl).buttonset();
  57. $(newEl).find("label").css({"margin":"0","border":"0","border-radius":"4px","background":"inherit"});
  58. $(newEl).find("span").css({"padding":"0.0em 0.3em"})
  59. .attr( "selectcolor",use4icon ? vArr[1] : "");
  60. $(newEl).find("input").each(function(ind,val){
  61. $(val).next().find("span").attr("ischecked",$(val).prop("checked"));
  62. });
  63. $(newEl).find("Label").each(function(ind,val){
  64. $(val).addClass("iconButtons_widget")
  65. var ico = vArr[ind*ipar+3];
  66. var m = ico.match(/.*@(.*)/);
  67. var uscol = m && m[1] ? m[1] : "none";
  68. if( uscol.match(/^[A-F0-9]{6}$/i))
  69. uscol = "#"+uscol;
  70. if(uscol == 'none')
  71. ico += "@none";
  72. $(val).find("span").attr( "unselectcolor",uscol);
  73. FW_cmd(FW_root+"?cmd={FW_makeImage('"+ico+"','"+ico+"',':"+ind+": "+(iconclass.length > 0 ? iconclass :'')+"')}&XHR=1",function(data){
  74. data = data.replace(/\n$/,'');
  75. var m = $(data).attr("class").match(/(:\d+?:)/);
  76. var iconr = m && m[1] ? m[1] : "error";
  77. $(newEl).find("label[iconr='"+iconr+"']").each(function(ind,val){
  78. var span = $(val).find("span");
  79. var sc = $(span).attr("selectcolor");
  80. var usc = $(span).attr("unselectcolor") == "none" ? "none" : $(span).attr("unselectcolor");
  81. if( usc.match(/^[A-F0-9]{6}$/i))
  82. usc = "#"+usc;
  83. var isc = $(span).attr("ischecked");
  84. if(isc == "true") {
  85. if(sc.length > 0) {
  86. var re1 = new RegExp('fill="'+usc+'"','gi');
  87. var re2 = new RegExp('fill:\\s?"'+usc+'[;\\s]','gi');
  88. data = data.replace(re1,'fill="'+sc+'"')
  89. .replace(re2,'fill:'+sc+';');
  90. } else {
  91. var re1 = new RegExp('fill="none"','gi');
  92. var re2 = new RegExp('fill:\\s?none[;\\s]','gi');
  93. data = data.replace(re1,'fill=""')
  94. .replace(re2,'fill:; ');
  95. }
  96. } else {
  97. if(sc.length > 0) {
  98. var re1 = new RegExp('fill="none|'+sc+'"','gi');
  99. var re2 = new RegExp('fill:\\s?(none|"'+sc+')[;\\s]','gi');
  100. data = data.replace(re1,'fill="'+(usc=="none"?"":usc)+'"')
  101. .replace(re2,'fill:'+(usc=="none"?"":usc)+';');
  102. } else {
  103. var re1 = new RegExp('fill="none"','gi');
  104. var re2 = new RegExp('fill:\\s?none[;\\s]','gi');
  105. data = data.replace(re1,'fill=""')
  106. .replace(re2,'fill:; ');
  107. }
  108. }
  109. $(span).addClass("iconButtons_widget").html(data);
  110. });
  111. });
  112. });
  113. if( !currVal )
  114. currVal = ",";
  115. newEl.getValueFn = function(arg) { var new_val="";
  116. for( var i = 0; i < buttons.length; ++i ) {
  117. var button = buttons[i];
  118. var span = button.next().find("span");
  119. var sc = $(span).attr("selectcolor");
  120. var usc = $(span).attr("unselectcolor");
  121. if( usc.match(/^[A-F0-9]{6}$/i))
  122. usc = "#"+usc;
  123. if( $(button).prop("checked") ) {
  124. if(sc.length > 0) {
  125. var re1 = new RegExp('fill="'+usc+'"','gi');
  126. var re2 = new RegExp('fill:\\s?"'+usc+'[;\\s]','gi');
  127. var html = $(span).html().replace(re1,'fill="'+sc+'"')
  128. .replace(re2,'fill:'+sc+';');
  129. $(span).html(html);
  130. } else {
  131. button.next().css({"background-color":vArr[1]});
  132. }
  133. if( new_val ) new_val += ',';
  134. new_val += $(button).button( "option", "label")
  135. }
  136. }
  137. if( !new_val ) return ',';
  138. return new_val;
  139. };
  140. newEl.setValueFn = function(arg){ if( !arg ) arg = ',';
  141. if( hidden )
  142. hidden.attr("value", arg);
  143. for( var i = 0; i < buttons.length; ++i ) {
  144. var button = buttons[i];
  145. var span = button.next().find("span");
  146. var sc = $(span).attr("selectcolor");
  147. var usc = $(span).attr("unselectcolor") == "none" ? "" : $(span).attr("unselectcolor");
  148. if( usc.match(/^[A-F0-9]{6}$/i))
  149. usc = "#"+usc;
  150. button.prop("checked", arg.match(new RegExp('(^|,)'+vArr[i*ipar+2]+'($|,)') ) );
  151. if (button.prop("checked")==true){
  152. if(sc.length > 0) {
  153. var re1 = new RegExp('fill="'+usc+'"','gi');
  154. var re2 = new RegExp('fill:\\s?"'+usc+'[;\\s]','gi');
  155. var html = $(span).html().replace(re1,'fill="'+sc+'"')
  156. .replace(re2,"fill:"+sc+";");
  157. $(span).html(html);
  158. } else {
  159. button.next().css({"background-color":vArr[1]});
  160. }
  161. } else {
  162. if(sc.length > 0) {
  163. var re1 = new RegExp('fill="'+sc+'"','gi');
  164. var re2 = new RegExp('fill:\\s?"'+sc+'[;\\s]','gi');
  165. var html = $(span).html().replace(re1,'fill="'+usc+'"')
  166. .replace(re2,'fill:'+usc+';');
  167. $(span).html(html);
  168. } else {
  169. button.next().css({"background-color":"inherit"});
  170. }
  171. }
  172. button.button("refresh");
  173. }
  174. };
  175. newEl.setValueFn( currVal );
  176. return newEl;
  177. }
  178. /*
  179. =pod
  180. =begin html
  181. =end html
  182. =begin html_DE
  183. =end html_DE
  184. =cut
  185. */