+ cluck if !defined $width || !defined $height;
+ return ($W->{"have_style"} ? "style=\"border:0;width:${width}px;height:${height}px\"" : "border=\"0\"")
+ ." width=\"$width\" height=\"$height\"";
+}
+
+sub negotiate_variant (%)
+{
+my(%args)=@_;
+
+ my @fields=("id","qs","content-type","encoding","charset","lang","size");
+ return [ map(($args{$_}),@fields) ];
+}
+
+# Input: $self is required!
+# Input: Put the fallback variant as the first one.
+# Returns: always only scalar!
+sub Negotiate_choose($$)
+{
+my($self,$variants)=@_;
+
+ my $best=HTTP::Negotiate::choose($variants,
+ # Do not: $W->{"r"}
+ # to prevent: Can't locate object method "scan" via package "Apache2::RequestRec" at HTTP/Negotiate.pm line 84.
+ # Do not: $W->{"r"}->headers_in()
+ # to prevent: Can't locate object method "scan" via package "APR::Table" at HTTP/Negotiate.pm line 84.
+ # Do not: HTTP::Headers->new($W->{"r"}->headers_in());
+ # to prevent empty result or even: Odd number of elements in anonymous hash
+ HTTP::Headers->new(%{$W->{"r"}->headers_in()}));
+ $best||=$variants->[0][0]; # $variants->[0]{"id"}; &HTTP::Negotiate::choose failed?
+ return $best;
+}
+
+my @img_variants=(
+ { "id"=>"png","qs"=>0.9,"content-type"=>"image/png" },
+ { "id"=>"gif","qs"=>0.7,"content-type"=>"image/gif" },
+ );
+my $img_variants_re='[.](?:'.join('|',"jpeg",map(($_->{"id"}),@img_variants)).')$';
+
+# Returns: ($path_web,$path_abs_disk)
+# URI path segments support ignored here. Where it is used? (';' path segment options)
+sub _img_src($%)
+{
+my($in,%args)=@_;
+
+ cluck if !uri_is_local $in;
+ my $uri=in_to_uri_abs $in;
+ my $path_abs_disk=path_abs_disk $uri,%args,"uri_as_in"=>1;
+
+ # Known image extension?
+ return path_web($uri,%args,"uri_as_in"=>1),$path_abs_disk if $uri->path()=~m#$img_variants_re#o;
+
+ my @nego_variants;
+ for my $var (@img_variants) {
+ my $path_abs_disk_variant=$path_abs_disk.".".$var->{"id"};
+ __PACKAGE__->make_file($path_abs_disk_variant);
+ push @nego_variants,negotiate_variant(
+ %$var,
+ "size"=>(stat $path_abs_disk_variant)[7],
+ );
+ }
+ my $ext=__PACKAGE__->Negotiate_choose(\@nego_variants);
+
+ $uri->path($uri->path().".$ext");
+ return path_web($uri,%args,"uri_as_in"=>1),path_abs_disk($uri,%args,"uri_as_in"=>1);
+}
+
+# $args{"attr"}
+sub img ($$%)
+{
+my($in,$alt,%args)=@_;
+
+ my($path_web,$path_abs_disk)=_img_src($in,%args);
+ my($width,$height)=Image::Size::imgsize($path_abs_disk);
+ $alt=~s/<[^>]*>//g;
+ $alt=escapeHTML($alt);
+ my $content="<img src=\"".uri_escaped($path_web)."\" alt=\"$alt\" title=\"$alt\" ".img_size($width,$height)
+ .(!$args{"attr"} ? "" : " ".$args{"attr"})." />";
+ do { return a_href((_img_src($_))[0],$content,"uri_as_in"=>1) if $_; } for $args{"a_href_img"};
+ do { return a_href $_,$content if $_; } for $args{"a_href"};
+ return $content;