").get(0);
$(newEl).addClass(vArr[0]);
var hidden;
if(elName)
hidden = $('');
$(newEl).append(hidden);
var clicked = function(arg) { var new_val=newEl.getValueFn(arg);
newEl.setValueFn( new_val );
if( cmd )
cmd(new_val);
};
var buttons = [];
var istart = 2;
for( var i = 2; i < (vArr.length-1); i+=ipar ) {
if(!isNaN(parseFloat(vArr[i]))) {
istart = i;
break;
}
}
var iend = vArr.length-ipar;
for( var i = istart+ipar; i < (vArr.length-1); i+=ipar ) {
if(isNaN(parseFloat(vArr[i]))) {
iend = i-ipar;
break;
}
}
var ascd = true;
if(!isNaN(parseFloat(vArr[istart+ipar])) && parseFloat(vArr[istart]) > parseFloat(vArr[istart+ipar]))
ascd = false;
for( var i = 2; i < (vArr.length); i+=ipar ) {
var button = $('').uniqueId();
var label = $('');
buttons.push(button);
$(newEl).append(button);
$(newEl).append(label);
$(button).change(clicked);
// console.log("currVal: "+currVal+", vArr["+i+"]: "+vArr[i]+", is: "+ (currVal == vArr[i]));
if( currVal ) {
// console.log("FW_cmd, i:",i,"ascd:",ascd,"istart:",istart,"iend:",iend);
// console.log("FW_cmd, parseFloat(currVal):", parseFloat(currVal),"i+ipar:",i+ipar,"parseFloat(vArr[i+ipar]):",parseFloat(vArr[i+ipar]),"i:",i,"parseFloat(vArr[i]):",parseFloat(vArr[i]));
if(ascd && i>istart && !isNaN(parseFloat(vArr[i-ipar])) && !isNaN(parseFloat(currVal)) && !isNaN(parseFloat(vArr[i]))){
button.prop("checked", parseFloat(currVal) > parseFloat(vArr[i-ipar]) && parseFloat(currVal) <= parseFloat(vArr[i]));
} else if(!ascd && i parseFloat(vArr[i+ipar]) && parseFloat(currVal) <= parseFloat(vArr[i]));
} else if(ascd && i==istart && !isNaN(parseFloat(currVal)) && !isNaN(parseFloat(vArr[i]))) {
button.prop("checked", parseFloat(currVal) <= parseFloat(vArr[i]));
} else if(!ascd && i==iend && !isNaN(parseFloat(currVal)) && !isNaN(parseFloat(vArr[i]))) {
button.prop("checked", parseFloat(currVal) <= parseFloat(vArr[i]));
} else {
button.prop("checked", currVal == vArr[i]);
}
}
}
$(newEl).buttonset();
$(newEl).find("label").css({"margin":"0","border":"0","border-radius":"4px","background":"inherit"});
$(newEl).find("span").css({"padding":"0.0em 0.3em"})
.attr( "selectcolor",use4icon ? vArr[1] : "");
$(newEl).find("input").each(function(ind,val){
$(val).next().find("span").attr("ischecked",$(val).prop("checked"));
// console.log("input checked("+ind+"): "+$(val).prop("checked"));
});
$(newEl).find("label").each(function(indx,val){
$(val).addClass("iconRadio_widget")
var ico = vArr[indx*ipar+3];
var m = ico.match(/.*@(.*)/);
var uscol = m && m[1] ? m[1] : "none";
if( uscol.match(/^[A-F0-9]{6}$/i))
uscol = "#"+uscol;
if(uscol == 'none')
ico += "@none"; //@none
$(val).find("span").attr( "unselectcolor",uscol);
FW_cmd(FW_root+"?cmd={FW_makeImage('"+ico+"','"+ico+"',':"+indx+": "+(iconclass.length > 0 ? iconclass :'')+"')}&XHR=1",function(data){
data = data.replace(/\n$/,'');
// console.log($(data).attr("class"));
var m = $(data).attr("class").match(/(:\d+?:)/);
var iconr = m && m[1] ? m[1] : "error";
$(newEl).find("label[iconr='"+iconr+"']").each(function(ind,val){
var span = $(val).find("span");
var sc = $(span).attr("selectcolor");
var usc = $(span).attr("unselectcolor") == "none" ? "none" : $(span).attr("unselectcolor");
// console.log($(span).attr("unselectcolor") == "none");
if( usc.match(/^[A-F0-9]{6}$/i))
usc = "#"+usc;
var isc = $(span).attr("ischecked");
// console.log("span usc_"+ind+": "+usc+", sc_"+ind+": "+sc);
// console.log("Fw_cmd checked: "+ind+": "+isc);
if(isc == "true") {
if(sc.length > 0) {
var re1 = new RegExp('fill="'+usc+'"','gi');
var re2 = new RegExp('fill:\\s?"'+usc+'[;\\s]','gi');
// console.log("FW_cmd re1u=",re1+"",", re2u=",re2+"");
data = data.replace(re1,'fill="'+sc+'"')
.replace(re2,'fill:'+sc+';');
// console.log("Fw_cmd sc_ind: "+ind+": "+sc+", isc:"+isc+"\n"+data);
} else {
var re1 = new RegExp('fill="none"','gi');
var re2 = new RegExp('fill:\\s?none[;\\s]','gi');
data = data.replace(re1,'fill=""')
.replace(re2,'fill:; ');
// console.log("Fw_cmd sc_ind: "+ind+": "+sc+", isc:"+isc+"\n"+data);
}
} else {
if(sc.length > 0) {
var re1 = new RegExp('fill="none|'+sc+'"','gi');
var re2 = new RegExp('fill:\\s?(none|"'+sc+')[;\\s]','gi');
// console.log("FW_cmd re1=",re1+"",", re2=",re2+"");
data = data.replace(re1,'fill="'+(usc=="none"?"":usc)+'"')
.replace(re2,'fill:'+(usc=="none"?"":usc)+';');
// console.log("Fw_cmd usc_ind: "+ind+": "+usc+", isc:"+isc+"\n"+data);
} else {
var re1 = new RegExp('fill="none"','gi');
var re2 = new RegExp('fill:\\s?none[;\\s]','gi');
data = data.replace(re1,'fill=""')
.replace(re2,'fill:; ');
// console.log("Fw_cmd usc_ind: "+ind+": "+usc+", isc:"+isc+"\n"+data);
}
}
$(span).addClass("iconRadio_widget").html(data);
});
});
});
if( !currVal )
currVal = ",";
newEl.getValueFn = function(arg) { var new_val="";
for( var i = 0; i < buttons.length; ++i ) {
var button = buttons[i];
var span = button.next().find("span");
var sc = $(span).attr("selectcolor");
var usc = $(span).attr("unselectcolor");
if( usc.match(/^[A-F0-9]{6}$/i))
usc = "#"+usc;
if( $(button).prop("checked") == true) {
if(sc.length > 0) {
var re1 = new RegExp('fill="'+usc+'"','gi');
var re2 = new RegExp('fill:\\s?"'+usc+'[;\\s]','gi');
// console.log("getFn re1u=",re1,", re2u=",re2);
var html = $(span).html().replace(re1,'fill="'+sc+'"')
.replace(re2,'fill:'+sc+';');
// console.log("getFn sc_i:"+i+": "+sc+"\n"+html);
$(span).html(html);
} else {
button.next().css({"background-color":vArr[1]});
}
// console.log("getFn new_val: ",new_val)
if( new_val ) new_val += ',';
new_val += $(button).button( "option", "label")
}
}
if( !new_val ) return ',';
return new_val;
};
newEl.setValueFn = function(arg){ if( !arg ) arg = ',';
if( hidden )
hidden.attr("value", arg);
var istart = 0;
for( var i = 0; i < buttons.length; i++ ) {
if(!isNaN(parseFloat(vArr[i*ipar+2]))) {
istart = i;
break;
}
}
var iend = buttons.length-1;
for( var i = istart+1; i < buttons.length; i++ ) {
if(isNaN(parseFloat(vArr[i*ipar+2]))) {
iend = i-1;
break;
}
}
var ascd = true;
if(!isNaN(parseFloat(vArr[(istart+1)*ipar+2])) && parseFloat(vArr[istart*ipar+2]) > parseFloat(vArr[(istart+1)*ipar+2]))
ascd = false;
for( var i = 0; i < buttons.length; ++i ) {
var button = buttons[i];
var span = button.next().find("span");
var sc = $(span).attr("selectcolor");
var usc = $(span).attr("unselectcolor") == "none" ? "" : $(span).attr("unselectcolor");
if( usc.match(/^[A-F0-9]{6}$/i))
usc = "#"+usc;
// console.log("setFn usc_"+i+": "+usc+": sc_"+i+": "+sc+", arg: "+arg);
// console.log("setFn, i:",i,"ascd:",ascd,"istart:",istart,"iend:",iend);
// console.log("setFn, parseFloat(arg):", parseFloat(arg),"(i+1)*ipar+2:",(i+1)*ipar+2,"parseFloat(vArr[(i+1)*ipar+2]):",parseFloat(vArr[(i+1)*ipar+2]),"i*ipar+2:",i*ipar+2,"parseFloat(vArr[i*ipar+2]):",parseFloat(vArr[i*ipar+2]));
if(ascd && i>istart && !isNaN(parseFloat(vArr[(i-1)*ipar+2])) && !isNaN(parseFloat(arg)) && !isNaN(parseFloat(vArr[i*ipar+2]))){
button.prop("checked", parseFloat(arg) > parseFloat(vArr[(i-1)*ipar+2]) && parseFloat(arg) <= parseFloat(vArr[i*ipar+2]));
} else if(!ascd && i parseFloat(vArr[(i+1)*ipar+2]) && parseFloat(arg) <= parseFloat(vArr[i*ipar+2]));
} else if(ascd && i==istart && !isNaN(parseFloat(arg)) && !isNaN(parseFloat(vArr[i*ipar+2]))) {
button.prop("checked", parseFloat(arg) <= parseFloat(vArr[i*ipar+2]));
} else if(!ascd && i==iend && !isNaN(parseFloat(arg)) && !isNaN(parseFloat(vArr[i*ipar+2]))) {
button.prop("checked", parseFloat(arg) <= parseFloat(vArr[i*ipar+2]));
} else {
button.prop("checked", arg == vArr[i*ipar+2]);
}
if (button.prop("checked") == true){
if(sc.length > 0) {
var re1 = new RegExp('fill="'+usc+'"','gi');
var re2 = new RegExp('fill:\\s?"'+usc+'[;\\s]','gi');
// console.log("setFn re1u=",re1,", re2u=",re2);
var html = $(span).html().replace(re1,'fill="'+sc+'"')
.replace(re2,"fill:"+sc+";");
$(span).html(html);
} else {
button.next().css({"background-color":vArr[1]});
}
} else {
if(sc.length > 0) {
var re1 = new RegExp('fill="'+sc+'"','gi');
var re2 = new RegExp('fill:\\s?"'+sc+'[;\\s]','gi');
// console.log("setFn re1=",re1,", re2=",re2);
var html = $(span).html().replace(re1,'fill="'+usc+'"')
.replace(re2,'fill:'+usc+';');
$(span).html(html);
} else {
button.next().css({"background-color":"inherit"});
}
}
button.button("refresh");
}
};
newEl.setValueFn( currVal );
return newEl;
}
/*
=pod
=begin html
To the icon.* widgets listed below applies:
<color> is specified by a color name or a color number without leading # e.g. FFA500 or orange. Depending on the context @ has to be escaped \@.
<icon> is the icon name.
[class<classname>@] as prefix in front of the second parameter, assigns a css-class to the icons.
Examples for import with raw definition, will be found in FHEMWEB-Widgets
iconRadio,[class<classname>@][use4icon@]<select color>,<value>,<icon>[@<color>][,<value>,<icon>[@<color>]]...
- displays Icons as radio button and returns value if pushed.
<value> return or compare value. If a numerical sequence of <value> is specified, the current value will match the next higher <value>. It is allowed to place non numerical <value> in front of or after the sequence but not in between. The numerical sequence has to be ascendind or descending. Example:iconRadio,808080,closed,control_arrow_down,10,fts_shutter_10,20,fts_shutter_20,30,fts_shutter_30,open,control_arrow_up
<select color> the background color of the selected icon or the icon color if the prefix use4icon@ is used.
The widget contains a CSS-class "iconRadio_widget".
iconButtons,[class<classname>@][use4icon@]<select color>,<value>,<icon>[@<color>][,<value>,<icon>[@<color>]]...
- displays Icons as button bar and returns comma separated values of pushed buttons.
<value> return value.
<select color> the background color of the selected icon or the icon color if the prefix use4icon@ is used.
The widget contains a CSS-class "iconButtons_widget".
iconLabel[,[class<classname>@]<reference value>,[<icon>][@<color>]][,<reference value>,[<icon>][@<color>]]...
- displays states by colorized values, labels and icons, if the current
value fits to the reference value. A state is described by a parameter peer.
The number of peers is arbitrarily. A peer consists of a <reference
value> and an optional display value with an optional color value
<reference value> is a number or a regular expression.
If <icon> is no icon name, the text will be displayed, otherwise
the icon. If nothing is specified, the current value will be displayed.
iconSwitch,[class<classname>@]<reference value>,[<icon>][@<color>][,<reference value>,[<icon>][@<color>]]...
- switches cyclic after actuation to the diplayed state and the actual
value is set to the reference Value. A state is described by a
parameter peer. The number of peers is arbitrarily. A peer consists
of a <reference value> and an optional display value with an
optional color value [<icon>][@<color>].
<reference value> is a number or a string.
If <icon> is no icon name, the text will be displayed, otherwise
the icon. If nothing is specified, the reference value will be displayed.
=end html
=begin html_DE
Für die folgenden icon.* Widgets gilt:
<color> kann ein Farbname oder eine Farbnummer ohne führende # sein, z.B. orange oder FFA500. Abhängig vom Kontext ist @ zu escapen \@.
<icon> ist der Iconname.
[class<classname>@] als Prefix vor dem zweiten Parameter, weist den SVG-Icons eine CSS-Klasse zu.
Beispiele zum Import über Raw definition findet man im FHEM-Wiki unter FHEMWEB-Widgets
iconRadio,[class<classname>@][use4icon@]<select color>,<value>,<icon>[@<color>][,<value>,<icon>[@<color>]]...
- zeigt Icons als Radiobutton an und gibt Value bei Betätigung zurück.
<value> ist der Rückgabe- u.Vergleichswert. Wenn eine numerische Folge von <value> angegeben wird, dann passt der laufende Wert zum nächsten höheren Vergleichswert. Vor und hinter der numerischen Folge dürfen nicht numerische Werte angegeben werden, dazwischen nicht. Die numerische Folge muss auf- oder absteigend sein. Beispiel:iconRadio,808080,zu,control_arrow_down,10,fts_shutter_10,20,fts_shutter_20,30,fts_shutter_30,auf,control_arrow_up
<select color> die Hintergrundfarbe des gewählten Icons oder die Farbe des Icons wenn der Prefix use4icon@ vorangestellt wird.
Das Widget enthält eine CSS-Klasse "iconRadio_widget".
iconButtons,[class<classname>@][use4icon@]<select color>,<value>,<icon>[@<color>][,<value>,<icon>[@<color>]]...
- zeigt Icons als Tastenleiste an und gibt durch Komma getrennte Werte der betätigten Tasten zurück.
<value> ist der Rückgabewert.
<select color> die Hintergrundfarbe des gewählten Icons oder die Farbe des Icons wenn der Prefix use4icon@ vorangestellt wird.
Das Widget enthält eine CSS-Klasse "iconButton_widget".
iconLabel[,[class<classname>@]<reference value>,[<icon>][@<color>]][,<reference value>,[<icon>][@<color>]]...
- zeigt Zustände durch colorierte Werte, Beschriftungen und Icons an, wenn
der aktuelle Wert zum Vergleichswert passt. Ein Zustand wird durch
ein Parameterpaar beschrieben. Es können beliebig viele Paare angegeben
werden. Ein Paar besteht aus einem Vergleichswert <reference
value> und einem optionalen Anzeigewert mit optionaler mit
Farbangabe [,<reference value>,[<icon>][@<color>]].
<reference value> kann eine Zahl oder ein regulärer Ausdruck sein.
Wenn <icon> keinem Iconnamen entspricht, wird der Text angezeigt,
sonst das Icon. Wird <icon> nicht angegeben, wird der aktuelle
Wert angezeigt.
iconSwitch,[class<classname>@]<reference value>,[<icon>][@<color>][,<reference value>,[<icon>][@<color>]]...
- schaltet zyklisch nach jeder Betätigung in den angezeigten
Zustand, dabei wird der aktuelle Wert auf den Vergleichswert
gesetzt. Ein Zustand wird durch ein Parameterpaar beschrieben.
Es können beliebig viele Paare angegeben werden. Ein Paar
besteht aus einem Vergleichswert <reference value> und einem
optionalen Anzeigewert mit optionaler mit Farbangabe [,<reference
value>,[<icon>][@<color>]].
<reference value> kann eine Zahl oder eine Zeichenkette sein.
Wenn <icon> keinem Iconnamen entspricht, wird der Text
angezeigt, sonst das Icon. Wird <icon> nicht angegeben,
wird der Vergleichwert angezeigt.