############################################## # $Id$ package main; use strict; use warnings; use vars qw($FW_subdir); # Sub-path in URL for extensions, e.g. 95_FLOORPLAN use IO::File; ##################################### sub weblink_Initialize($) { my ($hash) = @_; $hash->{DefFn} = "weblink_Define"; $hash->{AttrList} = "htmlattr"; $hash->{FW_summaryFn} = "weblink_FwFn"; $hash->{FW_detailFn} = "weblink_FwFn"; $hash->{FW_atPageEnd} = 1; } ##################################### sub weblink_Define($$) { my ($hash, $def) = @_; my ($name, $type, $wltype, $link) = split("[ \t]+", $def, 4); my %thash = ( link=>1, image=>1, iframe=>1, htmlCode=>1, cmdList=>1, readings=>1, fileplot=>1, dbplot=>1); if(!$link || !$thash{$wltype}) { return "Usage: define weblink [" . join("|",sort keys %thash) . "] "; } if($wltype eq "fileplot" || $wltype eq "dbplot") { Log3 $name, 1, "Converting weblink $name ($wltype) to SVG"; my $newm = LoadModule("SVG"); return "Cannot load module SVG" if($newm eq "UNDEFINED"); $hash->{TYPE} = "SVG"; $hash->{DEF} = $link; return CallFn($name, "DefFn", $hash, "$name $type $link"); } $hash->{WLTYPE} = $wltype; $hash->{LINK} = $link; $hash->{STATE} = "initialized"; return undef; } ##################################### # FLOORPLAN compat sub FW_showWeblink($$$$) { my ($d,undef,undef,$buttons) = @_; if($buttons !~ m/HASH/) { my %h = (); $buttons = \%h; } FW_pO(weblink_FwFn(undef, $d, "", $buttons)); return $buttons; } ################## sub weblink_FwDetail($@) { my ($d, $text, $nobr)= @_; return "" if(AttrVal($d, "group", "")); my $alias= AttrVal($d, "alias", $d); my $ret = ($nobr ? "" : "
"); $ret .= "$text " if($text); $ret .= FW_pHPlain("detail=$d", $alias) if(!$FW_subdir); $ret .= "
"; return $ret; } sub weblink_FwFn($$$$) { my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash is set for summaryFn. my $hash = $defs{$d}; my $link = $hash->{LINK}; my $wltype = $hash->{WLTYPE}; my $ret = ""; my $attr = AttrVal($d, "htmlattr", ""); if($wltype eq "htmlCode") { $link = AnalyzePerlCommand(undef, $link) if($link =~ m/^{(.*)}$/); $ret = $link; } elsif($wltype eq "link") { $ret = "$d"; # no FW_pH, open extra browser } elsif($wltype eq "image") { $ret = "
" . weblink_FwDetail($d); } elsif($wltype eq "iframe") { $ret = "" . weblink_FwDetail($d); } elsif($wltype eq "cmdList") { my @lines = split(" ", $link); my $row = 1; $ret = ""; $ret .= ""; $ret .= ""; $ret .= "
"; foreach my $line (@lines) { my @args = split(":", $line, 3); $ret .= ""; $ret .= ""; $ret .= ""; } $ret .= "
\"$args[0]\" $args[1]

"; } elsif($wltype eq "readings") { my @params = split(" ", $link); my @devices; my $mapping; my $show_heading = 1; my $show_state = 1; my $show_time = 1; while (@params) { my $param = shift(@params); if( $param eq '*noheading' ) { $show_heading = 0; }elsif( $param eq '*notime' ) { $show_time = 0; } elsif( $param eq '*nostate' ) { $show_state = 0; }elsif( $param =~ m/^{/) { $mapping = eval $param ." ". join( " ", @params ); last; } else { my @device = split(":", $param); if( defined($defs{$device[0]}) ) { push @devices, [@device]; } else { foreach my $d (sort keys %defs) { next if( IsIgnored($d) ); next if( $d !~ m/$device[0]/); push @devices, [$d,$device[1]]; } } } } my $row = 1; $ret .= ""; $ret .= "" if( $show_heading ); $ret .= ""; $ret .= ""; $ret .= "
"; foreach my $device (@devices) { my $h = $defs{@{$device}[0]}; my $regex = @{$device}[1]; my $name = $h->{NAME}; next if( !$h ); foreach my $n (sort keys %{$h->{READINGS}}) { next if( $n =~ m/^\./); next if( $n eq "state" && !$show_state ); next if( defined($regex) && $n !~ m/$regex/); my $val = $h->{READINGS}->{$n}; if(ref($val)) { my ($v, $t) = ($val->{VAL}, $val->{TIME}); $v = FW_htmlEscape($v); $t = "" if(!$t); $ret .= sprintf("", ($row&1)?"odd":"even"); $row++; my $m = $n; $m = $mapping->{$n} if( defined($mapping) && defined($mapping->{$n}) ); $m = $mapping->{$name.".".$n} if( defined($mapping) && defined($mapping->{$name.".".$n}) ); $m =~ s/\$NAME/$name/g; $ret .= "";; $ret .= ""; $ret .= "" if( $show_time ); } } } $ret .= "
$v
$t
"; $ret .= "
"; } return $ret; } 1; =pod =begin html

weblink

=end html =cut