SourceForge.net Logo
March 3, 2009
© GPL
 
ProWikiCenter
Code /
Part5

 
Difference (last change) (no other diffs, normal page display)

Changed: 1c1,2059
Describe the new page here.
[[code]



sub SplitUrlPunct {
my ($url)=@_;
my ($punct);

if($url =~ s/\"\"$//) {
return ($url,"");
}
$punct = "";
if($url =~ /^ news:/) {
($punct) = ($url =~ /([^\+a-zA-Z0-9\/\xc0-\xff]+)$/);
$url =~ s/([^\+a-zA-Z0-9\/\xc0-\xff]+)$//;
} else {
($punct) = ($url =~ /([^a-zA-Z0-9\/\xc0-\xff]+)$/);
$url =~ s/([^a-zA-Z0-9\/\xc0-\xff]+)$//;
}
return ($url, $punct);
}

sub StripUrlPunct {
my ($url)=@_;
my ($junk);

($url, $junk) = SplitUrlPunct($url);
return $url;
}

sub GetBracketUrlIndex {
my ($id)=@_;

if($SaveUrlNum{$id}>0) {
return $SaveUrlNum{$id};
}
$SaveUrlNumIndex++; # Start with 1
$SaveUrlNum{$id} = $SaveUrlNumIndex;
return $SaveUrlNumIndex;
}

sub StoreBracketInterWikiPage {
my ($iwp)=@_;
my ($url,$index,$link);

$url=InterWikiPageRetUrl($iwp);
$index=GetBracketUrlIndex($iwp);
$link=UrlLabelClassTitleTargetRetLink($url,"[$index]",'body');
return StoreRaw($link);
}

sub PageRetLogoDec {
my ($id)=@_;
my ($LogoImage,$header,$action);

if($LogoUrl ne "") {
$LogoImage = "img src='$LogoUrl' alt='[Home]' border='0'";
if(UserHasStatus($NeedStatusAdmin)) {
$action="edit=" . $id;
} else {
$action="action=HomePage";
}
$header = ActionLabelClassIdTargetTitleRetLink($action,"<$LogoImage>","");
}
return $header;
}

sub WikiRetFormSearchMini {
my $ret=FormStart("form search",'');
$ret.=Lu("Search|Suchbegriff|Cherche|Buscar") . ": " . FormText('search','',20);
$ret.=" " . Lu("in|gesucht wird|dans|en") . " " . FormCheck('title',1,Lu('title|im Titel|title|título'));
$ret.=" " . FormCheck("text",1,Lu('text|im Text|text|texto'));
$ret.=FormEnd();
return $ret;
}

sub FormCheckHelper {
my ($p opt,$p hid,$ident,$label,$val,$defval)=@_;
my ($numval);

if($val eq 'on' || $val eq 'off') {
$$p hid .= FormNameValueHidden($ident,$val) . "\n";
} else {
if($val eq '') {
$val=$defval;
}
$numval = ($val>0) ? 1 : 0;
$$p opt .= ' ' . FormCheck($ident,$numval,$label);
}
}

sub ParsRetVal {
my $object=shift;
my $ret;

foreach (@_) {
$ret=RetParam($_);
if($ret ne '') {
goto do ret;
}
}
if($ret eq '') {
$ret= $object;
}
do ret:
return $ret;
}

sub HvnRetVal {
my($h pars,$object,$var1,$var2,$var3,$var4)=@_;
my $ret=$$h pars{$var1};
if($ret eq '') {
$ret=$$h pars{$var2};
if(($ret eq ) && ($var3 ne )) {
$ret=$$h pars{$var3};
if(($ret eq ) && ($var4 ne )) {
$ret=$$h pars{$var4};
}
}
}
if($ret eq '') {
$ret= $object;
}
return $ret;
}

sub HvnRetColor { # hash, default, ...
my $ret=HvnRetVal(@_);
if(substr($ret,0,1) ne '#') {
$ret=ColorDefaultRetCode($ret,$_[1]);
}
return $ret;
}

sub HvnHeight { return HvnRetVal(@_,"Höhe",Unicode("Höhe"),'height'); }
sub HvnWidth { return HvnRetVal(@_,'Breite','width'); }
sub HvnSize { return HvnRetVal(@_,"Größe",Unicode("Größe"),'size'); }
sub HvnSelect { return HvnRetVal(@_,'','select'); }
sub HvnFilter { return HvnRetVal(@_,'','filter'); }

sub WikiRetFormSearch {
my ($h pars)=@_;
my $prompt=HvnRetVal($h pars,LuNbsp('Search for:|Suchen nach:|Chercher :|Buscar:'),'Prompt','prompt');
my $bcol= HvnRetColor($h pars,'#eeeeee','Hintergrund','background');
my $tlen=HvnRetVal($h pars,20,'Feldlänge',Unicode('Feldlänge'),'inputwidth');
my $title=HvnRetVal($h pars,'','Titel','title');
my $text=HvnRetVal($h pars,'','Text','text');
my $word=HvnRetVal($h pars,'','Wort','word');
my $case=HvnRetVal($h pars,'','Case','case');
my $regex=HvnRetVal($h pars,'','Regex','regex');
my $button=HvnRetVal($h pars,'1','Button','button');
my $val;
my ($opt,$hid);

if($tlen<20) {
$tlen=20;
}
FormCheckHelper(\$opt,\$hid,'title',Lu('titles|Titel|titres|títulos'),$title,1);
FormCheckHelper(\$opt,\$hid,'text' ,Lu('texts|Texte|textes|textos'),$text,1);
FormCheckHelper(\$opt,\$hid,'word' ,Lu("words-only|Worte|mots-seulement|Palabras"),$word,0);
FormCheckHelper(\$opt,\$hid,'case' ,Lu('match-case|Groß/klein|respecter-la-casse|considerar-la-caja'),$case,0);
FormCheckHelper(\$opt,\$hid,'regex',Lu('regex|Regex|expressions-régulières'),$regex,0);

$button = ($button) ? FormButton('do',Lu('Search|Suchen|Chercher|Buscar')) : $n1;

my $ret = FormStart("form search",'');
$ret .= FormTableStart();
$ret .= LineRsLsLmCol($prompt,FormText('search','',$tlen),$button,$bcol);
if($opt) {
$ret .= LineRsLsLmCol(LuNbsp('Options:|Optionen:|Options :|Opciones:'),$opt,$n1,$bcol);
}
$ret .= $hid;
$ret .= FormTableEnd();
$ret .= FormEnd();

return $ret;
}

sub HtmlLuft {
my ($width,$height)=@_;
return "<img src='/image/p.gif' border='0' width='$width' height='$height'>";
}

sub ImageRetHtmlBar {
my ($imnam,$width,$height)=@_;
return ImageUrlRetHtmlPlus($imnam,'0',$width,$height);
}

sub FormNameValueHidden {
my ($name,$value)=@_;

$value =~ s/&/&/g;
return "<input type='hidden' name='$name' value='$value' />";
}

sub ColorRetCode {
my ($cnam)=@_;
my $ret= $ColorTabDe{$cnam};
if($ret eq '') {
$ret= $ColorTabEn{$cnam};
}
if($ret eq '') {
$ret= $ColorTabFr{$cnam};
}
return $ret;
}

sub ColorDefaultRetCode {
my ($cnam,$object)=@_;
my $ret=ColorRetCode($cnam);
if($ret eq '') {
$ret=$object;
}
return $ret;
}

$CdmlHash{ASIN}=\&CdmlAsin;
$CdmlHash{asin}=\&CdmlAsin;

sub CdmlAsin {
my($body,$h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.asin.defaults');
my $image=HvnRetVal($h pars," http://images.amazon.com/images/P/\{code\}.01.THUMBZZZ.jpg",'image');
my $url=HvnRetVal($h pars," http://www.amazon.com/exec/obidos/ASIN/\{code\}/\{aid\}",'url');
my $aid=HvnRetVal($h pars,'','aid');
my $title=HvnRetVal($h pars,'','title');
my $asin=HvnRetVal($h pars,$body,'code');
StrStripBoth($asin);
$asin=First($asin,'020171499X'); # default "The Wiki Way"

$url=~ s/\{aid\}/$aid/;
$url=~ s/\{code\}/$asin/;
$image=~ s/\{aid\}/$aid/;
$image=~ s/\{code\}/$asin/;

$$h pars{url}=$url;
$$h pars{image}=$image;
return CdmlLink($title,$h pars);
}

$CdmlHash{Bild}=\&CdmlImage;
$CdmlHash{image}=\&CdmlImage;

sub CdmlImage {
my($body, $h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.image.defaults');
my ($ret,$width,$link,$punkt,$imw,$imh,$tablestyle,$scol,$tbcol,$ipad,$istyle);
my $left flag=1;
my $url=HvnRetVal($h pars,'','URL','url');
my $text=HvnRetVal($h pars,'','Text','text');
my $pos=HvnRetVal($h pars,'links','Position','align');
my $pad=HvnRetVal($h pars,'4','Luft','padding');
my $art=HvnRetVal($h pars,'','Art','type');
my $bcol=HvnRetColor($h pars,'','Hintergrund','background');
my $border=HvnRetVal($h pars,'0','Linienbreite','linewidth');
my $breite=HvnRetVal($h pars,'','Breite','width');
my $abstand=HvnRetVal($h pars,'','Abstand','distance');
my $style=HvnRetVal($h pars,'','Stil','style');
my $imsize=HvnRetVal($h pars,'','Bildformat','imagesize');
my $framecolor=HvnRetColor($h pars,'','Rahmenfarbe','framecolor');
my $framewidth=HvnRetVal($h pars,'','Rahmenbreite','framewidth');
my $linecolor=HvnRetColor($h pars,'','Linienfarbe','linecolor');
my $linewidth=$border; # FIXME ugly
my $ititle=HvnRetVal($h pars,'','Bildtitel','imagetitle');
my $ifont=HvnRetVal($h pars,'','Bildfont','imagefont');

if($url ne && $text eq ) {
$text=$body; StrStripBoth($text);
$body=$url;
}

StrStripBoth($body);
if($body =~ m/$InterWebPattern/) {
$body=InterWikiPageRetUrl($body);
}

if($text eq '') {
$pos=HvnRetVal($h pars,'','Ausrichtung','Position','align');
if($pos =~ m/^r/) {
$style.=" float: right; "
} elsif ($pos =~ m/^l/) {
$style.=" float: left; "
}
if($border>0) {
$style.=" border: solid ${border}px $bcol; background-color:$bcol; "
}
($link,$punkt)=UrlpRetLinkPunct($body,1,$style);
return $link;
}

$text=TextCdmlRetText($text);
TextMarkupImagesLinksParasLists($text,0,1,1,1);
if($breite eq "") {
$width="width='100%'";
} else {
$width="width='$breite'";
}
if($bcol ne "") {
$tbcol=" bgcolor='$bcol'";
}
if($imsize =~ m/(\d+)x(\d+)/) {
$imw=$1; $imh=$2;
}

my $al="left";
if($pos =~ /^r/ ) {
$al="right";
$left flag=0;
}
if($framecolor ne '') {
if($framewidth==0) {
$framewidth=3;
}
$style.=" border: solid ${framewidth}px $framecolor; ";
}
if($linecolor ne '') {
if($linewidth==0) {
$linewidth=1;
}
$tablestyle=" border: solid ${linewidth}px $linecolor; ";
$tablestyle="style='$tablestyle'";
}
$ipad=$pad;
if($ititle ne '') {
$ipad=''
}
my $im=ImageUrlRetHtmlPlus($body,'0',$imw,$imh,$al,$ipad,$style);

if($ititle ne '') {
if($ifont ne '') {
$ititle=TextFontRetHtml($ititle,$ifont);
}
$scol=First($framecolor,$bcol);
if($left flag) {
$istyle.=" margin: 0 ${pad}px 0 0; "; #right
} else {
$istyle.=" margin: 0 0 0 ${pad}px; "; #left
}
$istyle.=" padding: 0 0 ${framewidth}px 0; ";
$im="<table cellspacing='0' border='0' cellpadding='0' bgcolor='$scol' width='1%' align='$al' style='$istyle' ><tr><td width='1%'>$im</td></tr><tr><td width='1%'><center>$ititle</center></td></tr></table>";
}
if(StrEquList($art,'Spalte','column')) {
if($left flag) {
$ret="<table $width cellspacing='0' border='0' $tbcol cellpadding='$pad' $tablestyle><tr><td valign='top'>$im</td><td>$text</td></tr></table>";
} else {
$ret="<table $width cellspacing='0' border='0' valign='top' $tbcol cellpadding='$pad' $tablestyle><tr><td>$text</td><td valign='top'>$im</td></tr></table>";
}
} else {
$ret="<table $width border='0' $tbcol cellspacing='0' cellpadding='$pad' $tablestyle><tr><td>$im$text</td></tr></table>";
}
if(StrEmpty($abstand)) {
$ret="<center>$ret</center>";
} else {
$ret="<table cellspacing='0' cellpadding='0' border='0'><tr><td>" . HtmlLuft($abstand,1) . "</td><td>$ret</td></tr></table>"
}
return $ret;
}

sub WikiRetFormBlog {
my ($id,$form)=@_;
my $editRows = RetParam("editrows", $Def editrows);
my $editCols = RetParam("editcols", $Def editcols);
my ($ret,$h);

$ret .= FormStart("form blog",$id);
$ret .= FormTableStart();
$ret .= FormNameValueHidden("title",$id) . "\n";
$ret .= FormNameValueHidden("form",$form) . "\n";

$h = Lu('Contribution input form|Eingabeformular für Beiträge|Formulaire de Publication|Formulario de publicación');
$ret .= HeaderColSpan($h,$FormTitlebackground,1);

$h = Lu('Heading|Überschrift|En-tête|Título') . ': ' . FormText('summary','',30);
$ret .= LineLm($h,$n1);

$FontDecSuppress=1;
$h = FormTextArea('text','',$editRows,$editCols,1,1);
$ret .= LineLm($h,$n1);
$FontDecSuppress=0;

$h = FormButton('Save',LiSave()) . "$n3(" . LiUser() . ": $UserName)";
$ret .= LineLm($h,$n1);

$ret .= FormTableEnd();
$ret .= FormEnd();

return $ret;
}

sub WordForm {
my ($text,@words)=@_;
$text =~ s/(\%(\d+))/{$words[$2];}/ge;
return $text;
}

sub TextProcess {
my ($text,$process)=@_;

PageContextInit();
my $rule=$PageContext{rule};
my (@arr,@arw);

@arr = split(/[,;]/,$rule);

$arw[0]=$PageCur;
$arw[1]=$PageContext{plural};

$text =~ s/(\$(\d+))/{&WordForm($arr[$2-1],@arw);}/ge;
# $text =~ s/\$/xxx/g;

return $text;
}

sub HashAddPageReRange {
my ($h pages,$page,$minlevel,$maxlevel)=@_;
my $pagelevel=StrFindStrRetCount($page,'/');
my ($key,$keylevel,$push,$re);
$re=($page ne '') ? "$page/" : $page;

PageIndexInit();
foreach $key (keys %PageIndex) {
if($key =~ m#^$re#) {
$keylevel=StrFindStrRetCount($key,'/');
$push=1;
if($keylevel<$pagelevel+$minlevel) {
$push=0;
} elsif($keylevel>$pagelevel+$maxlevel) {
$push=0;
}
if($push) {
$$h pages{$key}++;
}
}
}
}

sub ArrayRandomize {
my ($a arr)=@_;
my ($i,$ind,$h);

for($i=$#$a arr; $i>0; $i--) {
$ind=int(rand($i + 1));
$h=$$a arr[$i];
$$a arr[$i]=$$a arr[$ind];
$$a arr[$ind]=$h;
}
}

sub HashAddPageTypes {
my($h pages,$page,$types)=@_;
my ($type,$serr);

PageIndexInit();
my ($grand,$parent)=PageRetGrandParent($page);
foreach $type (ListSplit($types)) {
if(StrEquList($type,'Selbst','self')) {
$$h pages{$page}++;
} elsif(StrEquList($type,'Kinder','children')) {
HashAddPageReRange($h pages,$page,1,1);
} elsif(StrEquList($type,'Enkel','grandchildren')) {
HashAddPageReRange($h pages,$page,2,2);
} elsif(StrEquList($type,'Nachkommen','descendants')) {
HashAddPageReRange($h pages,$page,1,1000);
} elsif(StrEquList($type,'Kleinfamilie','sfamily')) {
HashAddPageReRange($h pages,$page,0,1);
} elsif(StrEquList($type,'Zweig','branch')) {
do branch:
HashAddPageReRange($h pages,$page,0,1000);
} elsif(StrEquList($type,'Familie','family')) {
HashAddPageReRange($h pages,First($parent,$page),0,1000);
} elsif(StrEquList($type,"Großfamilie",Unicode("Großfamilie"),'xfamily')) {
HashAddPageReRange($h pages,First($grand,$parent,$page),0,1000);
} elsif(StrEquList($type,'*','@')) {
HashAddHash($h pages,\%PageIndex);
} else {
goto do branch;
}
}
return $serr;
}

$CdmlHash{Liste}=\&CdmlList;
$CdmlHash{list}=\&CdmlList;

sub CdmlList {
my($body, $h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.list.defaults');
my $type=HvnRetVal($h pars,'children','Typ','type');
my $vida=HvnRetVal($h pars,'','Vida','vida');
my $title=HvnRetVal($h pars,'','Titel','title');
my $layout=HvnRetVal($h pars,'','Layout','layout');
my $anzahl=HvnRetVal($h pars,0,'Anzahl','count');
my $showdate=HvnRetVal($h pars,'','Datum','date');
my $publish=HvnRetVal($h pars,'','Veröffentlichen',Unicode('Veröffentlichen'),'publish');
my $edit=HvnRetVal($h pars,'','Bearbeiten',"Ändern",Unicode('Ändern'),'edit');
my $filter=HvnRetVal($h pars,'','Filter','filter');
my $select=HvnRetVal($h pars,'','Selektion','select');
my $opt= HvnRetVal($h pars,'','Optionen','options');
my $page=HvnRetVal($h pars,$PageCur,'Seite','page');
my $varlist=HvnRetVal($h pars,'','Variablen','Variable','variables','variable');
my $off=0;
my ($re,@pageinfo,$self,@vars);

my (@pages,$ret,%hinfo,%horder,$pagename,$fnam,$ftim,$ftim2,$info,$pp,%phash);

$body=~s/\s+/ /g;
StrStripBoth($body);
if($body ne '') {
if($varlist eq '') {
$varlist=$body;
$vida=1;
$type=HvnRetVal($h pars,'*','Typ','type');
}
}
@vars=ListSplit($varlist);

HashAddPageTypes(\%phash,$page,$type);
@pages=sort keys %phash;

if($filter ne '') {
@pages=ArrayStrFilterRegex(\@pages,$filter,1);
if($publish ne '') {
@pages=ArrayStrFilterRegex(\@pages,"/Context",1);
}
}
if($select ne '') {
@pages=ArrayStrFilterRegex(\@pages,$select,0);
}
if($vida) {
my $sep=" /// ";
if($VidaCaching) {
@pageinfo=VidaCacheVarsSepRetArrFilterPages(\@vars,$sep,\@pages);
} else {
VidaInitPageArray(\@pages);
@pageinfo=VidaVarsSepRetArr(\@Vida,\@vars,$sep);
}
my %pars=%$h pars;
HashAddArray(\%pars,'separator',$sep);
my $header=join($sep,LiPages(),@vars);
unshift(@pageinfo,$header);
return CdmlTable(join("\n",@pageinfo),\%pars);
}
if($opt =~ m#r#) {
ArrayRandomize(\@pages);
}
if($publish ne '') {
$showdate=1;
}
if($edit ne '') {
$showdate=1;
$hinfo{"column.edit"}=1;
}
if($showdate ne '') {
foreach $pagename (@pages) {
$horder{$pagename}=$ftim=PageRetTime($pagename);
$info=TimeRetText($ftim);
if($edit ne '') {
$hinfo{"edit.$pagename"}=" [[link][url=]] ";
}
if($publish ne '') {
$pp=PageRetPublishPage($pagename);
$ftim2=PageRetTime($pp);
if($ftim2<$ftim) {
$info.=" ".NameStyleRetImageGif('newer');
} else {
$info.=" up-to-date";
}
}
$hinfo{$pagename}=$info;
}
$ret=PageListRetHtml(,$ScriptName,\@pages,\%hinfo,,1,1,$layout,$anzahl,\%horder,1,0,undef,undef,0);
} else {
$ret=PageListRetHtml(,$ScriptName,\@pages,undef,,1,1,$layout,$anzahl,undef,0,0,undef,undef,0);
}
do err:
return $ret;
}

sub HashRetSize {
my ($h hash)=@_;
return int(keys %$h hash);
}

sub HashRetMax {
my ($h hash)=@_;
my ($max,$val);

foreach (keys %$h hash) {
$val=$$h hash{$_};
if($val>$max) {
$max=$val;
}
}
return $max;
}

sub ArrayElementRetInd {
my ($a ar,$el)=@_;
my $ind=0;
foreach (@$a ar) {
if($_ eq $el) {
return $ind;
}
$ind++;
}
return -1;
}

sub TablePageFieldRetSum {
my ($id,$field)=@_;
my $text=PageRetTextFast($id);
my @lines=split("\n",$text);
my $fieldline=shift(@lines);
my @fields=LineRetFields($fieldline);
my $ind=ArrayElementRetInd(\@fields,$field);
my $sum;

# MsgPrint("TPFRS id=$id field=$field fieldline=$fieldline ind=$ind");
if($ind<0) {
return " error ";
}
foreach (@lines) {
$sum += LineIndRetField($_,$ind);
}
return $sum;
}

sub DataRetVal {
my ($var)=@_;
my $ret=$var;
if($var =~ m/vida\.(.*)/) {
$var=$1;
$ret=PageVarRetValDefault($PageCur,$var,$n1);
} elsif($var =~ m#tablesum\.([^.]+)\.([^.]+)# ) {
$ret=TablePageFieldRetSum($1,$2);
}
$ret;
}

$CdmlHash{"Einfügen"}=\&CdmlInsert;
$CdmlHash{Unicode("Einfügen")}=\&CdmlInsert;
$CdmlHash{insert}=\&CdmlInsert;

sub CdmlInsert {
my($body, $h pars)=@_;
my $typ=HvnRetVal($h pars,'','Typ','type');
my $id=HvnRetVal($h pars,'','Seite','page');
my $process=HvnRetVal($h pars,'','Prozess','process');
my $form=HvnRetVal($h pars,'','Formular','form');
my $silent=HvnRetVal($h pars,'','Tolerant','silent');
my $bcol=HvnRetColor($h pars,'','Hintergrund','background');
my $days=HvnRetVal($h pars,7200,'days');
my $detail=HvnRetVal($h pars,0,'detail');
my $months=($days>90)?1:0;
my $ret;
my $es=Lu("Error in insert|Fehler in Einfügung|Erreur en insertion|Error de inserción");
my $var;

if($typ eq 'Datum') {
$ret=TimeRetDay($^T);
} elsif(StrEquList($typ,'Seitenzahl','pagecount')) {
PageIndexInit();
$ret=HashRetSize(\%PageIndex);
} elsif(StrEquList($typ,'Daten','data')) {
$var=$body;
$ret=DataRetVal($var);
} elsif(StrEquList($typ,'Mediendaten','mediadata')) {
$ret=StatCreatePlus(0,1,$months,$days,$detail);
} elsif(StrEquList($typ,"Seitengröße",Unicode("Seitengröße"),"Seitenlänge",Unicode("Seitenlänge"),'pagesize')) {
$ret=PageRetSize(ValDefault($id,$PageCur));
} elsif(StrEquList($typ,'Wortanzahl','wordcount')) {
$ret=PageRetWordCount(ValDefault($id,$PageCur));
} elsif(StrEquList($typ,'Zeichenanzahl','charactercount')) {
$ret=PageRetCharCount(ValDefault($id,$PageCur));
} elsif($typ eq 'ProtId') {
$ProtId=RandomRetStamp();
$ProtId=substr($ProtId,0,6);
$ret=$ProtId;
} elsif(StrEquList($typ,'WebLog','weblog','Blog','blog')) {
$ret=WikiRetFormBlog($PageCur,$form);
} elsif($id ne '') {
if($id =~ m/\$/) {
PageContextInit();
$id =~ s/\$(.*)$/$PageContext{$1}/;
}
if(PageExist($id)) {
$ret=PageRetText($id);
if($process ne '') {
$ret=TextProcess($ret,$process);
}
$ret=TextWikiRetHtmlBasic($ret);
if($bcol ne '') {
$ret="<div style='background:url(/image/bg pergament1.jpg); padding: 10 10 10 10; margin: 10 10 10 10; border: dotted 3px gray;'>$ret</div>";
# $ret="<div style='background:$bcol; padding: 10 10 10 10; margin: 10 10 10 10; border: dotted 3px gray;'>$ret</div>";
# $ret="<table border='0' cellspacing='0' cellpadding='0' width='100%'><tr bgcolor='$bcol'><td>$ret</td></tr></table>";
# TableCvtLineColorWidth($ret,'#000000','90%');
# TableCvtAbstandWidth($ret,'','90%');
}
} elsif($silent eq '') {
$lb1=Lu("Page %PAGENAME% doesn't exist.|Seite %PAGENAME% existiert nicht.|page %PAGENAME% n'existe pas.|página %PAGENAME% no existe.");
MessRepPagename($lb1,$id);
$ret=$es.LiColon().$lb1;
}
} else {
$lb1=Lu("Type %TYPENAME% unknown.|Typ %TYPENAME% unbekannt.|type %TYPENAME% inconnu.|tipo %TYPENAME% desconocido.");
MessRepVar($lb1,"%TYPENAME%",$typ);
$ret=$es.LiColon().$lb1;
}
return $ret;
}

$CdmlHash{Schrift}=\&CdmlFont;
$CdmlHash{font}=\&CdmlFont;

sub FontRetFaceSizeColorBoldItalUdl {
my ($font)=@_;
my ($face,$size,$col,$bold,$ital,$udl,$fmtcol);

($face) = ($font =~ m/^([^@#]*)/ );
($col) = ($font =~ m/#([^@#]*)/ );
($size) = ($font=~ m/@([^@#]*)/ );
if($col ne '') {
$fmtcol=ColorRetCode($col);
if($fmtcol ne '') {
$col=$fmtcol;
} else {
$col="#$col";
}
}
if($size ne '') {
$bold = ($size =~ m/[bBfF]/) ? 1 : 0;
$ital = ($size =~ m/[iIkK]/) ? 1 : 0;
$udl = ($size =~ m/[uU]/) ? 1 : 0;
$size = int($size);
if($size == 0) {
$size='';
}
}

return ($face,$size,$col,$bold,$ital,$udl);
}

sub TextFaceSizeColorBoldItalUdlRetHtml {
my ($text,$face,$size,$color,$bold,$ital,$udl)=@_;
my ($h1,$h2);

if($face ne '') {
$face=" face='$face'";
}
if($size ne '') {
$size=" size='$size'";
}
if($color ne '') {
$color=" color='$color'";
}
if($bold) {
$h1.=""; $h2.="";
}
if($ital) {
$h1.=""; $h2="".$h2;
}
if($udl) {
$h1.=""; $h2="".$h2;
}
return "<font$face$size$color>" . $h1 . $text . $h2 . '</font>';
}

sub TextFontRetHtml {
my ($text,$font)=@_;
my ($face,$size,$col,$bold,$ital,$udl)=FontRetFaceSizeColorBoldItalUdl($font);
return TextFaceSizeColorBoldItalUdlRetHtml($text,$face,$size,$col,$bold,$ital,$udl);
}

sub CdmlFont {
my($body, $h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.font.defaults');
my $face=HvnRetVal($h pars,'','Art','face');
my ($size,$col,$bold,$ital,$udl);

if($face ne '') {
($face,$size,$col,$bold,$ital,$udl)=FontRetFaceSizeColorBoldItalUdl($face);
}
$size=HvnSize($h pars,$size);
$col=HvnRetColor($h pars,$col,'Farbe','color');
TextMarkupImagesLinksParasLists($body,0,1,1,1);
return TextFaceSizeColorBoldItalUdlRetHtml($body,$face,$size,$col,$bold,$ital,$udl);
}

sub PixelRetTwips {
return 15*$_[0];
}

sub RtfRowsRetTable {
my ($rows)=@_;
return "{\\intbl\n" . $rows . "}\n";
}

sub RtfCellsRetRow {
my ($cells,$abstand,$luft)=@_;
my $rabstand=PixelRetTwips($abstand);
my $rluft=PixelRetTwips($luft);
return "\\trowd\\trleft$rabstand\\li$rluft\\ri$rluft\\sb$rluft\\sa$rluft\n" . $cells . "\\row\n";
}

sub RtfCell {
my ($body,$fcol,$width,$bcol,$lwidth,$lcol)=@_;
my $find=RtfColorTabRetInd($fcol);
my $bind=RtfColorTabRetInd($bcol);
my $lind=RtfColorTabRetInd($lcol);
my $lw=PixelRetTwips($lwidth);
my $cwidth=PixelRetTwips($width);

my $ret=
"\\tcelld\n"
."\\clbrdrb\\brdrs\\brdrw$lw\\brdrcf$lind\\clbrdrt\\brdrs\\brdrw$lw\\brdrcf$lind\\clbrdrl\\brdrs\\brdrw$lw\\brdrcf$lind\\clbrdrr\\brdrs\\brdrw$lw\\brdrcf$lind\n"
."\\clcbpat$bind\\cellx$cwidth\\ql {\\f0\\cf$find $body}\\cell\n";
return $ret;
}

sub RtfTextColorTableAbstandWidthColorLinewidthColorLuft {
my ($body,$fcol,$abstand,$width,$bcol,$lwidth,$lcol,$luft)=@_;
my $cells=RtfCell($body,$fcol,$width,$bcol,$lwidth,$lcol);
my $rows=RtfCellsRetRow($cells,$abstand,$luft);
return RtfRowsRetTable($rows);
}

$CdmlHash{Posting}=\&CdmlCode;
$CdmlHash{Code}=\&CdmlCode;
$CdmlHash{posting}=\&CdmlCode;
$CdmlHash{code}=\&CdmlCode;

sub CdmlCode {
my($body, $h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.code.defaults');
my $abstand=HvnRetVal($h pars,50,'Abstand','distance');
my $w=HvnWidth($h pars,400);
my $fcol=HvnRetColor($h pars,'#000066','Farbe','color');
my $bcol=HvnRetColor($h pars,'#e7e7e7','Hintergrund','background');
my $lcol=HvnRetColor($h pars,'#cccccc','Linienfarbe','linecolor');
my $luft=HvnRetVal($h pars,'8','Luft','padding');
my $lwidth=HvnRetVal($h pars,'2','Linienbreite','linewidth');
my $face=HvnRetVal($h pars,'mono','Schriftart','face');
my $lnr=HvnRetVal($h pars,'','Zeilennummer','linenumber');
my $lfmt=HvnRetVal($h pars,'','Zeilennummernformat','linenumberformat');
my ($b2,$line,$ret);

$body =~ tr/\r//d;
StrStripChrBoth($body,"\n");
$body=TextCdmlRetText($body);
if($lnr ne || $lfmt ne ) {
$lnr=int($lnr);
if($lnr==0) {
$lnr=1;
}
if($lfmt eq '') {
$lfmt='%3d: ';
} else {
StrStripBrackets($lfmt,'"','"');
}
foreach $line (split(/\n/,$body)) {
$b2 .= sprintf($lfmt,$lnr++) . $line . "\n";
}
$body=$b2;
}

if($face ne '') {
$face=StrDecorate($face," face='\@'");
}

if($RtfMode) {
$body =~ s#\n*<p>\n*#\\line\n#g;
$body =~ s#\\line\n$##;
$ret="{\\f2\\fs20 $body}";
$ret=RtfTextColorTableAbstandWidthColorLinewidthColorLuft($ret,$fcol,$abstand,$w,$bcol,$lwidth,$lcol,$luft);
return $ret;
}

my $text="<td width=$w><pre style='margin:0 0 0 0;'><font color=$fcol$face>".$body."</font></pre></td>";
my $tb;
$tb .= "<table border='0' cellspacing=0 cellpadding='0' bgcolor='$lcol'><tr><td>";
$tb .= "<table border='0' cellspacing=$lwidth cellpadding='$luft'><tr bgcolor=$bcol>";
$tb .= $text;
$tb .= "</tr></table>";
$tb .= "</td></tr></table>";

$ret="<table cellspacing='0' cellpadding='0' border='0'><tr><td>";
$ret .= HtmlLuft($abstand,1) . "</td><td>$tb</td></tr></table>";
return $ret;
}

sub TextMarkWord {
my($word)=@_;
my($mean,$word2);

$mean=$AltWordSet{$word};
if($mean eq '') {
my $word2=WordTogCase($word);
$mean=$AltWordSet{$word2};
if($mean eq '') {
return $word;
}
}
return "<a href='$ScriptName?$AltWordSource' title='$mean' onmouseover=\"status='$mean'; return true;\" onmouseout=\"status=''; return true;\"><span style='background-color: $AltWordColor'>$word</span></a>";
}

sub PageRetWordHash {
my($id)=@_;
my(@lines,$line,$word,$mean,%hash);
my $fnam = $PageDir . "/" . PageRetDirectory($id) . "/$id.db";

if(!(-f $fnam)) {
return;
}

my $text=PageRetText($id);

if($text =~ m#\[\[Tabelle\](.*)\n\]#s ) {
@lines=split("\n",$1);
foreach $line (@lines) {
($word,$mean)=split(';',$line);
$hash{$word}=$mean;
}
}
return %hash;
}

sub Cover {
my($s,$head,$tail)=@_;
if($s ne '') {
return $head.$s.$tail;
}
return '';
}

sub TableCvtAbstandWidth {
# my($table,$abstand,$width)=@_;
my $abstand=$_[1];
my $width=$_[2];
my $twid=Cover($width," width=");
if($abstand eq '') {
$_[0]="<center>$_[0]</center>";
} else {
$_[0]="<table cellspacing=0 cellpadding='0' border='0' width=100%><tr><td width=1%>" . HtmlLuft($abstand,1) . "</td><td align=left $twid>$_[0]</td></tr></table>";
}
}

sub AltWordInit {
my($lang)=@_;
if($AltWordColor eq '') {
$AltWordColor="#ffddbb";
%BaseWordSet= PageRetWordHash("GrundWortschatz".$lang);
$AltWordSource="ErweiterungsWortschatz".$lang;
%AltWordSet= PageRetWordHash($AltWordSource);
}
}

sub ParsRetHash {
my($pars)=@_;
my (%hash,@ar,$key,$val);

($pars) = ($pars =~ m/^\s*\[(.*)\]\s*$/);
@ar=split(/\]\s*\[/,$pars);
foreach (@ar) {
($key,$val) = ($_ =~ m/^([^=]*)=(.*)/);
$hash{$key}=$val;
}
return %hash;
}

sub ContextVarRetHashDefault {
my($var,$def)=@_;
my $val=ContextVarRetDefault($var,$def);
my %hash=ParsRetHash($val);
return %hash;
}

sub HashAddHashMissing {
my($h pars,$h defaults)=@_;
my $key;

foreach $key (keys %$h defaults) {
if($$h pars{$key} eq '') {
$$h pars{$key}=$$h defaults{$key};
}
}
}

sub HashAddContextDefaultsMissing {
my($h pars,$defname,$defstring)=@_;
my %defaults=ContextVarRetHashDefault($defname,$defstring);
HashAddHashMissing($h pars,\%defaults);
}

$CdmlHash{quote}=\&CdmlQuote;
$CdmlHash{Zitat}=\&CdmlQuote;

sub CdmlQuote {
my($body, $h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.quote.defaults',$CdmlQuoteDefaults);
return CdmlText($body,$h pars);
}

sub TrailInit {
$TrailPage=$_[0];
$TrailName=$_[1];
$TrailSection=$_[2];
}

sub TrailExit {
$TrailPage='';
$TrailSection='';
$TrailName='';
}

$CdmlHash{document}=\&CdmlDocument;
$CdmlHash{Dokument}=\&CdmlDocument;

sub CdmlDocument {
my($body, $h pars)=@_;
my $name= HvnRetVal($h pars,'',"Name",'name');
my $type= HvnRetVal($h pars,'',"Typ",'type');

if($type eq '') {
$$h pars{type}='Tour';
}
HashAddContextDefaultsMissing($h pars,'cdml.document.defaults',$CdmlDocumentDefaults);
return CdmlText($body,$h pars);
}

$CdmlHash{Text}=\&CdmlText;
$CdmlHash{text}=\&CdmlText;

sub CdmlText {
my($body, $h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.text.defaults');
my $abstand= HvnRetVal($h pars,20,'Abstand','distance');
my $bcol= HvnRetColor($h pars,'#f7f7ee','Hintergrund','background');
my $lcol= HvnRetColor($h pars,'#cccccc','Linienfarbe','linecolor');
my $luft= HvnRetVal($h pars,'3','Luft','padding');
my $lwidth= HvnRetVal($h pars,'1','Linienbreite','linewidth');
my $width = HvnWidth($h pars,'');
my $lang= HvnRetVal($h pars,'Englisch','Sprache','language');
my $ar= HvnRetVal($h pars,'l','Ausrichtung','alignment','align');
my $zu= HvnRetVal($h pars,'ja','Zeilenumbruch','wordwrapping');
my $opt= HvnRetVal($h pars,'','Optionen','options');
my $titel= HvnRetVal($h pars,'','Titel','title');
my $ttibg=$TableTitlebackground;
my $tcol=HvnRetColor($h pars,$ttibg,'Titelhintergrund','titlebackground');
my $foot= HvnRetVal($h pars,'',"Fuß",Unicode("Fuß"),'footer');
my $ftcol=HvnRetColor($h pars,$ttibg,"Fußhintergrund",Unicode("Fußhintergrund"),'footerbackground');
my $document= HvnRetVal($h pars,'',"Typ",'type');
my $docflag=($document ne '') ? 1 : 0;
my $name= HvnRetVal($h pars,'',"Name",'name');
my $section=HvnRetVal($h pars,'',"Auswahl",'selection');

my $tfont= HvnRetVal($h pars,'#000066','Schriftart','font');
my $hfont= HvnRetVal($h pars,'','Titelschriftart','titlefont');
my $ffont= HvnRetVal($h pars,'',"Fußschriftart",Unicode("Fußschriftart"),'footerfont');
my $center=($ar =~ m/[cz]/) ? 1 : 0;
my $pre=($zu =~ m/n/)? 1 : 0;

$body =~ tr/\r//d;
StrStripChrBoth($body,"\n");

TextMarkupImagesLinksParasLists($titel,0,1,1,0);
TextMarkupImagesLinksParasLists($foot,0,1,1,0);

$body=TextCdmlRetText($body);
if($docflag) {
if($titel eq '') {
$titel="Inhaltsverzeichnis $document";
}
TrailInit($PageCur,$name,$section);
}
TextMarkupImagesLinksParasLists($body,0,1,1,1);
TrailExit();

if($abstand eq '-') {
if($RtfMode) {
if($width<1) {
$width=0.8*$RtfBodyWidth;
}
$abstand=($RtfBodyWidth-PixelRetTwips($width))/2;
} else {
$abstand='';
}
}

if($RtfMode) {
if($pre) {
$body =~ s#\n*<p>\n*#\\line\n#g;
} else {
$body =~ s#\n*<p>\n*#\n#g;
}
$body =~ s#\\line\n$##;
my $cells=RtfCell($body,'#000066',$width,$bcol,$lwidth,$lcol);
my $rows=RtfCellsRetRow($cells,$abstand,$luft);
return RtfRowsRetTable($rows);
}

AltWordInit($lang);
$body =~ s/([A-ZÄÖÜ]?[a-zäöüß]+)/&TextMarkWord($1)/ge;

my $text=$body;
if($center) {
$text="<center>$text</center>";
}
if($pre) {
$text="<pre>$text</pre>";
}
my $twid=Cover($width," width=");

if($tfont ne '') {
$text=TextFontRetHtml($text,$tfont);
}

$text="<td width=$width>" . $text . "</td>";
my $tb;
$tb .= "<table border='0' cellspacing=0 cellpadding='0' bgcolor=$lcol $twid><tr><td>";
$tb .= "<table border='0' cellspacing=$lwidth cellpadding=$luft width=100%>";

if($titel ne '') {
if($hfont ne '') {
$titel=TextFontRetHtml($titel,$hfont);
}
$tb .= "<tr bgcolor=$tcol><td>$titel</td></tr>";
}
$tb .= "<tr bgcolor=$bcol>$text</tr>";
if($foot ne '') {
if($ffont ne '') {
$foot=TextFontRetHtml($foot,$ffont);
}
$tb .= "<tr bgcolor=$ftcol><td>$foot</td></tr>";
}
$tb .= "</table>";
$tb .= "</td></tr></table>";

my $ret=$tb;
TableCvtAbstandWidth($ret,$abstand,"100%");
return $ret;
}

sub ScriptCodeFrage {
my $ret =<<'#END_OF_SCRIPT_FRAGE';
function SetColorStyleText(qi,color,style,t)
{
document.all['ac_'+qi].style.backgroundColor=color;
document.getElementById('ab_'+qi).style.display=style;
document.all['at_'+qi].innerText=t;
}

function QuestionCheck(frm,qi)
{
els=frm.elements("frage_"+qi);
nok=0;
for(i=0; i<els.length; i++) {
e=els[i];
if((e.value&1)!=((e.checked)?1:0)) {
nok++;
}
}
if(nok) {
SetColorStyleText(qi,"#ff0000",'none',"{NOK}");
} else {
SetColorStyleText(qi,"#00ff00",'none',"{OK}");
}
}

function QuestionCheckVal(frm,qi,val)
{
sbox=document.getElementById("frage_"+qi);
nok=0;
if(sbox.value!=val) {
nok++;
}
if(nok) {
SetColorStyleText(qi,"#ff0000",'none',"{NOK}");
} else {
SetColorStyleText(qi,"#00ff00",'none',"{OK}");
}
}

function AnswerDel(frm,qi)
{
SetColorStyleText(qi,"#ffffff",,);
}
#END_OF_SCRIPT_FRAGE

$ret =~ s/{OK}/&Lu("That's correct!|Richtig!|Exact. Bravo !|¡Exacto!")/ge;
$ret =~ s/{NOK}/&Lu("Sorry, not correct!|Falsch!|Mauvaise Réponse !|¡Falso!")/ge;

return $ret;
}

$CdmlHash{Frage}=\&CdmlQuestion;
$CdmlHash{question}=\&CdmlQuestion;
$CdmlHash{apprendre}=\&CdmlQuestion;

sub CdmlQuestion {
my($body, $h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.question.defaults');
my $text=HvnRetVal($h pars,'','texte','Text','text');
my $pos=HvnRetVal($h pars,'','Position','position');
my $art=HvnRetVal($h pars,'','Art','type');
my $info=HvnRetVal($h pars,'','Info','info');
my $code=HvnRetVal($h pars,'','Code','code');
my $bild=HvnRetVal($h pars,'','Bild','image');
my $ant=HvnRetVal($h pars,'','reponse','Antwort','answer');
my $border=HvnRetVal($h pars,'','lignelargeur','Linienbreite','linewidth');
my $color=HvnRetColor($h pars,$QuizColor,'couleur','Farbe','color');
my ($ret,$bgcol,$fb,$val,$cs,$td but,$pagetext,$qfunc,$qval);
my $ind=0;

if($FrageCount==0) {
$pagetext=PageRetTextFast($PageCur);
$FrageBogenFlag=($pagetext =~ m/\[\[(Auswertung|evaluation)\]/ )? 0 : 1;
}
$fb=$FrageBogenFlag;
if($border eq '') {
if($fb) {
$border=1;
} else {
$border=0;
}
}
if($fb) {
if($ScriptCodeInit==0) {
$ScriptCode.=ScriptCodeFrage();
$ScriptCodeInit++;
}
}
if($FrageCount==0) {
$ret .= FormStart("form evaluation",'');
$ret .= FormNameValueHidden("cur page",$PageCur) . "\n";
}
my $h="" . ($FrageCount+1) . ". ";
$ret .= "<table width='100%' cellpadding='2' border='0' bgcolor='$color'><tr><td><font size=+1>$h$text</font></td></tr></table>";

my $al="'left'";

my $im= HtmlLuft(50,1);
if($info ne "") {
TextMarkupImagesLinksParasLists($info,0,1,1,0);
$im= "<table cellpadding='10' cellspacing='0' bgcolor='#dddddd' border='0'><tr><td><font color='#000066'>$info</font></td></tr></table>";
$im= "<table cellpadding='1' cellspacing='0' bgcolor='#000066' border='0'><tr><td>$im</td></tr></table>";
} elsif($code ne "") {
$code =~ tr/\r//d;
StrStripChrBoth($code,"\n");
TextMarkupImagesLinksParasLists($code,0,0,1,0);
$im= "<table cellpadding=10 cellspacing=0 bgcolor='#dddddd' border='0'><tr><td><pre><font color='#000066'>$code</font></td></pre></tr></table>";
$im= "<table cellpadding=1 cellspacing=0 bgcolor='#000066' border='0'><tr><td>$im</td></tr></table>";
} elsif($bild ne "") {
$im= "<table cellpadding=10><tr><td><img src='$bild' border='0'></td></tr></table>";
}

$body =~ s/\r//sg;
StrStripChrBoth($body,"\n");
TextMarkupImagesLinksParasLists($body,0,1,1,0);

my @lines=split("\n",$body);

my ($line,$fragen,$elem,@ar,$count,$size,$maxlen);

$qfunc="QuestionCheck(this.form,'$FrageCount')";
$qval=1;
foreach $line (@lines) {
$val=$ind;
$cs='';
if($fb) {
$val*=10;

}
if($line =~ s/\[([ x]?)\]//) {
if(StrExist($1)) {
$val++;
}
if($fb) {
$fragen .= "<input type='checkbox' name='frage_$FrageCount' value='$val' onclick=\"AnswerDel(this.form,'$FrageCount')\"> $line";
} else {
# $fragen .= $cgi->checkbox(-name=>"frage_${FrageCount}_$ind", -label=>$line, -checked=>0);
$fragen .= FormCheck("frage_${FrageCount}_$ind",0,$line);
}
} elsif($line =~ s/\(([ .]?)\)//) {
if(StrExist($1)) {
$val++;
}
if($fb) {
$fragen .= "<input type='radio' name='frage_$FrageCount' value='$val' onclick=\"AnswerDel(this.form,'$FrageCount')\"> $line";
} else {
$fragen .= "<input type='radio' name='frage_$FrageCount' value='$ind'> $line";
}
} elsif($line =~ m#\.\.\(([^()]+)\)\.\.# ) {
@ar=split(/\|/,$1);
if($#ar == 0) {
if($fb) {
$elem="<input type='text' id='frage_${FrageCount}' value='' onchange=\"AnswerDel(this.form,'$FrageCount')\" size='20' maxlength='80'>";
} else {
$elem="<input type='text' name='frage_${FrageCount}' value='' size='20' maxlength='80'>";
}
$qval=$ar[0];
} else {
$qval=1;
if($fb) {
$elem="<select id='frage_${FrageCount}' onchange=\"AnswerDel(this.form,'$FrageCount')\" ><option selected value='0'>";
} else {
$elem="<select name='frage_${FrageCount}'><option selected value=''>";
}
$count=1;
foreach (@ar) {
if($_ =~ m/^=/) {
$qval=$count;
$_ =~ s/^=//;
}
if($fb) {
$elem .= "<option value='$count'>$_";
} else {
$elem .= "<option value='$_'>$_";
}
$count++;
}
$elem.="</select>";
}
$elem="<span style='position:relative; left:0px; top:+3px;'>$elem</span>";
$fragen .= "$br0$`$n2$elem$n2$'$br0";
$qfunc="QuestionCheckVal(this.form,'$FrageCount','$qval')";
}

$fragen.=$br;
$ind++;
do next:
}

if($fb) {
my $s check=Lu("Check answer|Kontrollieren|Vérifiez la réponse|Controlar");
$td but="<td ID='ac_$FrageCount' width='30%' align='center'>\n" .
"<span ID='ab_$FrageCount' ><input type='button' onclick=\"$qfunc\" value='$s check'></span>\n" .
"<span ID='at_$FrageCount'></span>\n" .
"</td>\n";
}

$ret .= "<table width='100%' cellpadding='5' border=$border><tr><td width='20%' align='center'>$im</td><td width='50%'>\n$fragen\n</td>$td but</tr></table>";

$FrageCount++;
return $ret;
}

$CdmlHash{'Auswertung'} = \&CdmlEvaluation;
$CdmlHash{'evaluation'} = \&CdmlEvaluation;
sub CdmlEvaluation {
my($body, $h pars)=@_;
my $ret;
my $color=HvnRetColor($h pars,$QuizColor,'colour','Farbe','color');
my $cb=FontDec(&FormButton('eval',Lu("Evaluate...|Auswertung durchführen...|Evaluation...|Evaluación...")));

my $l1=Lu("Evaluation|Auswertung|Evaluation|Evaluatión");
$ret.="<table width='100%' cellpadding='2' border='0' bgcolor='$color'><tr><td><font size='5'>$l1       $cb</font></td></tr></table>";
$ret.=FormEnd();
return $ret;
}

sub LabelNameHrefRetLink {
my ($text,$name,$href)=@_;
return "<a name='$name'></a><a href='$href'>$text</a>";
}

$CdmlHash{Flash}=\&CdmlFlash;
$CdmlHash{flash}=\&CdmlFlash;

sub CdmlFlash {
my($body,$h pars,$jdir)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.flash.defaults');
my $url=HvnRetVal($h pars,'','Url','url');
my $width=HvnWidth($h pars,600);
my $height=HvnHeight($h pars,400);
my $clsid="D27CDB6E-AE6D-11cf-96B8-444553540000";
my $codebase=" http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0";
my $type="application/x-shockwave-flash";
my $pi=" http://www.macromedia.com/go/getflashplayer";
my $ret;

# ../img/examples/swf/soccer.swf
$ret = "<OBJECT classid=\"clsid:$clsid\" codebase=\"$codebase\" WIDTH=\"$width\" HEIGHT=\"$height\">\n";
$ret.= "<PARAM NAME=movie VALUE=\"$url\"><PARAM NAME=quality VALUE=high>\n";
$ret.= "<EMBED src=\"$url\" quality=high WIDTH=\"$width\" HEIGHT=\"$height\" TYPE=\"$type\" PLUGINSPAGE=\"$pi\"></EMBED>\n";
$ret.= "</OBJECT>\n";
return $ret;
}

$CdmlHash{"Fußnote"}=\&CdmlFootnote;
$CdmlHash{Unicode("Fußnote")}=\&CdmlFootnote;
$CdmlHash{footnote}=\&CdmlFootnote;

sub CdmlFootnote {
my($body, $h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.footnote.defaults');
my $ret;

$FootnoteCount++;
push(@FootnoteTab,$body);

$ret = "".LabelNameHrefRetLink("[$FootnoteCount]","fa_$FootnoteCount","#fn_$FootnoteCount")."";
return $ret;
}


sub CdmlJavaDir {
my($body,$h pars,$jdir)=@_;
my $code=HvnRetVal($h pars,'code','Code','code');
my $code2=HvnRetVal($h pars,'','CODE');
my $width=HvnWidth($h pars,100);
my $height=HvnHeight($h pars,100);
my $path=HvnRetVal($h pars,'com.hls','Pfad','path');
my ($key,$val,$CODE);
my $ret;

$body =~ s/\r//sg; # damn shit...
$body =~ s/\"//sg;
StrStripChrBoth($body,"\n");
$body =~ s/\n/|/sg;
if(!StrEmpty($body)) {
$$h pars{"Body"}=$body; # for transfer
}
$CODE="$path.$code.$code.class";
if($code2 ne '') {
$CODE=$code2;
}
$ret = "<APPLET CODE=\"$CODE\" ARCHIVE=\"/$jdir/$code.jar\" WIDTH='$width' HEIGHT='$height'>\n";
foreach $key (keys(%$h pars)) {
if($key ne "Code") {
$val = $$h pars{$key};
$ret .= " <PARAM NAME=$key VALUE=\"$val\">\n";
}
}
$ret .= Lu("Java is not activated in this browser!|Dieser Browser hat Java nicht aktiviert!|Java n'est pas activé dans ce navigateur !|¡Java no está activado!");
$ret .= "</APPLET>";
return $ret;
}

$CdmlHash{JavaTest} = \&CdmlJavaTest;
$CdmlHash{javatest} = \&CdmlJavaTest;
sub CdmlJavaTest {
my($body,$h pars)=@_;
return CdmlJavaDir($body,$h pars,'java2');
}

$CdmlHash{Java}=\&CdmlJava;
$CdmlHash{java}=\&CdmlJava;

sub CdmlJava {
my($body,$h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.java.defaults');
return CdmlJavaDir($body,$h pars,'java');
}

sub TimeRetDayMonthYearWeekday {
my ($ts)=@_;
my (undef,undef,undef,$day,$month,$year,$wday) = TimeRetTimeClient($ts);
$month++;
$year+=1900;
return ($day,$month,$year,$wday)
}

sub YearMonthAdd { # $_[0]=year $_[1]=month $_[2]=inc
$_[1]+=$_[2];
while($_[1]>12) {
$_[0]++; $_[1]-=12;
}
while($_[1]<1) {
$_[0]--; $_[1]+=12;
}
}

sub YearMonthRetWeekday {
my ($year,$month)=@_;
my $ts=TimeAllRetTimeSec($year,$month,1,12,0);
my (undef,undef,undef,$wday)=TimeRetDayMonthYearWeekday($ts);
return $wday;
}

sub RunRetImageBar {
my ($r,$height)=@_;
my ($c,$col);
$c=substr($r,0,1);
if($c eq '1') {
$col="cc3333";
} elsif($c eq '9') {
$col="666666";
} else {
$col="999999";
}
return ImageRetHtmlBar("/pixel/p_$col.gif",length($r),$height);
}

sub StrRetImageBar {
my ($s,$height)=@_;
my ($ret,$i,$c,$c1,$run,$rlen);
my $slen=length($s);

for($i=0; $i<$slen; $i++) {
$c=substr($s,$i,1);
if($c ne $c1) {
if($run ne '') {
$ret.=RunRetImageBar($run,$height);
$run='';
}
}
$run.=$c;
$c1=$c;
}
if($run ne '') {
$ret.=RunRetImageBar($run,$height);
}
return $ret;
}

sub HourMinRetInd {
my ($hour,$min)=@_;
my $ind;

if($hour>24) {
$hour=24;
}
if($hour==24) {
$min=0;
}
if($min>60) {
$min=60;
}
$hour+=$min/60;
$ind=int(2*$hour);
return $ind;
}

sub PageRetDates {
my ($page,$day,$nday)=@_;
my (@ar,$line,$i,$i1,$i2);
my $s=PageRetTextFast($page);
my $cday=$day;
my $h='999999999999000000000000000000000000000000009999';

if($day) {
$ar[0]=$h;
$cday=0;
} else {
for($i=0; $i<=$nday; $i++) {
$ar[$i]=$h;
}
}
foreach $line (split("\n",$s)) {
if($day==0) {
if($line =~ m/^=+\s*(\d+)/) {
if($1<=$nday) {
$cday=$1;
}
}
}
if($line =~ m/\*+\s*(\d+)\d+)\s*-\s*(\d+)\d+)/) {
$i1=HourMinRetInd($1,$2);
$i2=HourMinRetInd($3,$4);
for($i=$i1; $i<=$i2; $i++) {
substr($ar[$cday],$i,1)='1';
}
}
}
return @ar;
}

sub PageYearMonthParsRetCalendar {
my ($page,$year,$month,$h pars)=@_;
my ($ret,$title,$body,$i,$ind,$day,$wday,$nday,$off,$mname,$lines,$cols,$wind,$ccol);
my ($dday,$dpat,$dpage,@dar,$dlen,$tr1,$tr2,$trn,$page2);
my ($cday,$cmonth,$cyear,$cwday) = TimeRetDayMonthYearWeekday($^T);
my $scol=HvnRetVal($h pars,'lightorange','Untertitelhintergrund','subtitlebackground');
my $tcol=HvnRetVal($h pars,'lightblue','Heutehintergrund','todaybackground');
my $wcol=HvnRetVal($h pars,'lightgray','Wochenendehintergrund','weekendbackground');
my $pat=HvnRetVal($h pars,'{page}/{year}{month}#{day}','Linkmuster','linkpattern');
my $opt=HvnRetVal($h pars,'','Optionen','options');
my $trange=HvnRetVal($h pars,'8:00-18:00','Zeitbereich','timerange');
my $sflag= ($opt=~m/s/) ? 1 : 0;
my $bardist=HvnRetVal($h pars,'2','Balkenabstand','bardistance');
my $barheight=HvnRetVal($h pars,4,"Balkenhöhe",Unicode("Balkenhöhe"),'barheight');

if($trange =~ m/\s*(\d+)\d+)\s*-\s*(\d+)\d+)/) {
$tr1=HourMinRetInd($1,$2);
$tr2=HourMinRetInd($3,$4);
} else {
$tr1=HourMinRetInd(8,0);
$tr2=HourMinRetInd(18,0);
}
$trn=$tr2-$tr1+1;

$pat=~ s/\{page\}/$page/;
$pat=~ s/\{year\}/$year/;
$month=sprintf("%02d",$month);
$pat=~ s/\{month\}/$month/;

$nday=YearMonthRetLen($year,$month);
$wday=YearMonthRetWeekday($year,$month);
$off=($wday+6)%7;

if($sflag) {
$dpat=$pat;
$dpat=~ s/#.*//;
if($dpat =~ m/\{day\}/) {
for($day=1; $day<$nday; $day++) {
$dpage=$dpat;
$dpage=~ s/\{day\}/$day/;
($dar[$day])=PageRetDates($dpage,$day,$nday);
}
} else {
@dar=PageRetDates($dpat,0,$nday);
}
}

$mname=MonthName($month-1);
$title="$mname $year\@7c";
for($i=1; $i<=7; $i++) {
if($i>1) {
$body.=",";
}
$body.=DayNameShort($i)."\@c#$scol";
}
$body.="\n"; $lines=0; $cols=0;
for($ind=1; $ind<=42; $ind++) {
$day=$ind-$off;
$wind=$ind%7;
$ccol='';
if($wind==6 || $wind==0) {
$ccol=$wcol;
}
if($year==$cyear && $month==$cmonth && $day==$cday) {
$ccol=$tcol;
}
if($day>0 && $day<=$nday) {
$page2=$pat;
$page2=~ s/\{day\}/$day/;
$body.=ScriptPageRefLabelClassCompleteRetLink($ScriptName,$page2,'',$day,'body',1);

if($sflag) {
$dday=substr($dar[$day],$tr1,$trn);
$dlen=length($dday);
if($dlen) {
$body.=$br0.ImageRetHtmlBar("/pixel/p.gif",$dlen,$bardist);
$body.=$br0.StrRetImageBar($dday,$barheight);
}
}
} else {
$body.=$n1;
if($sflag) {
$body.=$br0.ImageRetHtmlBar("/pixel/p.gif",1,$bardist);
$body.=$br0.ImageRetHtmlBar("/pixel/p.gif",1,$barheight);
}
}
$body.="\@c";
if($ccol ne '') {
$body.="#$ccol";
}
if($wind==0) {
$body.="\n"; $lines++; $cols=0;
} else {
$body.=","; $cols++;
}
}
if($cols) {
$body.="\n"; $lines++;
}
if($lines<6) {
$body.=",\n";
}

$ret=CdmlTable("$title\n$body",$h pars);
return $ret;
}

$CdmlHash{Kalender}=\&CdmlCalendar;
$CdmlHash{calendar}=\&CdmlCalendar;

sub CdmlCalendar {
my($body, $h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.calendar.defaults');
my ($ret,$title,%pars,$key,$inc,$i,@ar,$qflag);
my $page=HvnRetVal($h pars,$PageCur,'Seite','page');
my $count=HvnRetVal($h pars,1,'Anzahl','count');
my $ncol=HvnRetVal($h pars,3,'Spalten','columns');
my ($cday,$cmonth,$cyear,$cwday) = TimeRetDayMonthYearWeekday($^T);
my $year= HvnRetVal($h pars,$cyear,'Jahr','year');
my $abstand=HvnRetVal($h pars,'','Abstand','distance');
my $cpadding=HvnRetVal($h pars,'2','Kalenderluft','calendarpadding');

if($year<100) {
$year+=2000;
}
my $month= HvnRetVal($h pars,$cmonth,'Monat','month');
if(($month eq '0') || ($month =~ m/^[\+\-]/)) {
if($month=~m/q/) {
$qflag++;
}
$inc=int($month); $month=$cmonth;
YearMonthAdd($year,$month,$inc);
if($qflag) {
while($month%3!=1) {
YearMonthAdd($year,$month,-1);
}
}
}

%pars=('separator'=>',','formatseparator'=>'@','titlebackground'=>'orange','titlefont'=>'@4#black','markup'=>0,'textbackground'=>'hellgelb');
foreach $key (%$h pars) {
$pars{$key}=$$h pars{$key};
}
undef $pars{Abstand};
undef $pars{distance};

for($i=0; $i<$count; $i++) {
$ar[$i]=PageYearMonthParsRetCalendar($page,$year,$month,\%pars);
YearMonthAdd($year,$month,1);
}
if($count>1) {
$ret="<table border='0' cellpadding='0' cellspacing=$cpadding width=1%><tr>";
$i=0;
foreach (@ar) {
$ret.="<td>$_</td>";
$i++;
if($count>$ncol) {
if($i>=$ncol) {
$i=0;
$ret.="</tr><tr>";
}
}
}
$ret.="</tr></table>";
} else {
$ret=$ar[0];
}
if($abstand ne '') {
TableCvtAbstandWidth($ret,$abstand,"100%");
}
return $ret;
}

sub TaskTabAddPage {
my ($a ar,$page)=@_;
my $s=PageRetTextFast($page);
my ($line,$task);

foreach $line (split("\n",$s)) {
if($line =~ m/[:*]+\s*(\(.?\))(.*)/) {
$task=join("|","0000",$2,$page,$line);
push(@$a ar,$task);
}
}
}

$CdmlHash{Aufgaben}=\&CdmlTasks;
$CdmlHash{tasks}=\&CdmlTasks;

sub CdmlTasks {
my($body,$h pars)=@_;
my ($ret,%pars,$key,$title,$tbody,@tar,@pages,$page,$i,$gain,$cost,$task,$pri,$proj,$skey);
my $count=HvnRetVal($h pars,50,'Anzahl','count');
my ($cday,$cmonth,$cyear,$cwday) = TimeRetDayMonthYearWeekday($^T);
my $sep="//";

@pages=WikiRetPageList();
foreach $page (@pages) {
if($page =~ m#^$PageCur/#) {
TaskTabAddPage(\@tar,$page);
}
}

$title=Lu("Tasks|Aufgaben").$sep.LiProject().$sep."Pri".$sep.Lu("Gain|Nutzen").$sep.Lu("Costs|Kosten");

LOOP TASK:
foreach $task (sort @tar) {
($skey,$task,$proj,$pri,$gain,$cost)=split(/\|/,$task);
$tbody.=join("//",$task,$proj,$pri,$gain,$cost)."\n";
if(++$i >= $count) {
last LOOP TASK;
}
}

%pars=('formatseparator'=>'@','separator'=>$sep,'titlebackground'=>'lightblue',
'linewidth'=>1,'linecolor'=>'white','padding'=>5,
'markup'=>0,'textbackground'=>'lightgray','distance'=>20
);
foreach $key (%$h pars) {
$pars{$key}=$$h pars{$key};
}
$ret=CdmlTable("$title\n$tbody",\%pars);
return $ret;
}

$CdmlHash{Link}=\&CdmlLink;
$CdmlHash{link}=\&CdmlLink;

sub CdmlLink {
my($body, $h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.link.defaults');
my $url= HvnRetVal($h pars,'','Url','url');
my $target= HvnRetVal($h pars,'','Fenster','window');
my $title= HvnRetVal($h pars,'','Titel','title');
my $par=HvnRetVal($h pars,'','Parameter','parameter');
my ($ret,$hidden);
my $image=HvnRetVal($h pars,'','Bild','image');
my $icon=HvnRetVal($h pars,'','Icon','icon');

if($url eq '') {
return Lu('[link lacks url-parameter]|[Link mit fehlendem Url-Parameter]|[le lien manque un paramètre-url]|[enlace sin URL-parámetro]');
}
if($target ne '') {
if(($target eq 'new') || ($target eq 'neu')) {
$target='_blank';
}
}
if($par ne '') {
my $val = RetParam($par);
$url =~ s/@/$val/g;
}
if($url =~ m/^$UrlPattern$/) {
# url ok
if($ShowHiddenLinks) {
$hidden=" ($url)";
}
} elsif($url =~ m/^ Upload:(.*)$/) {
$url="$UploadUrl/$1";
} elsif($url =~ m/^DiesesWiki:(.*)$/) {
$url="$ScriptUrl?$1";
} elsif($url =~ m/^ThisWiki:(.*)$/) {
$url="$ScriptUrl?$1";
} elsif($url =~ m/^$InterWebPattern$/) {
$url=InterWikiPageRetUrl($url);
} else {
return Lu('[link has an invalid url-parameter]|[Link mit ungültigem Url-Parameter-Wert]|[le lien a un paramètre-url invalide]|[enlace con un parámetro inválido]');
}
if($image ne '') {
$image =~ s/\.(DECLARE)?IMAGE$//;
$body=ImageUrlRetHtml($image);
} elsif ($icon ne '') {
$body=Icon($icon);
}
return UrlLabelClassTitleTargetRetLink($url,$body,'body',$title,$target);
}

sub ValDefault {
my($val,$object)=@_;
if($val eq '') {
return $object;
}
return $val;
}

sub WikiGetPagesAll {
my($a pages)=@_;
my $page;

PageIndexInit();
foreach $page (keys %PageIndex) {
push(@$a pages,$page);
}
}

sub VidaInitPageArray {
my ($a pages)=@_;

if($VidaInit==0) { #FIXME: secure against context switch
VidaAppPageListPlus(\@Vida,$a pages,0,0);
$VidaInit=1;
}
}

sub VidaInitIndex {
my @pages;
WikiGetPagesAll(\@pages);
VidaInitPageArray(\@pages);
}

sub VidaInitPage {
my($id)=@_;
my @pages=($id);
VidaInitPageArray(\@pages);
}

sub VidaHashHashInitVar {
my ($var)=@_;
my ($val,%vida,$fnam,$h cache);

$h cache=$VidaHashHash{$var};
if(!defined($h cache)) {
%vida=();
$h cache=\%vida;
$fnam="$DataDir/vida/$var.lvd";
LogFileGetHash Type($fnam,$h cache);
$VidaHashHash{$var}=$h cache;
}
}

sub VidaCacheVarRetPages {
my ($var)=@_;
VidaHashHashInitVar($var);
my $h cache=$VidaHashHash{$var};
return sort keys %$h cache;
}

sub VidaCachePageVarRetVal {
my ($id,$var)=@_;
my ($val,%vida,$fnam,$h cache);

VidaHashHashInitVar($var);
$h cache=$VidaHashHash{$var};
$val=$$h cache{$id};
return $val;
}

sub PageVarRetVal {
my($id,$var)=@_;
my($val,$fnam,%vida);

if($VidaCaching) {
$val=VidaCachePageVarRetVal($id,$var);
} else {
VidaInitPage($id);
$val=VidaVarRetVal(\@Vida,$var);
}
return $val;
}

sub PageVarRetValDefault {
my($id,$var,$object)=@_;
my $val=PageVarRetVal($id,$var);
return ValDefault($val,$object);
}

$CdmlHash{Anzeige}=\&CdmlDisplay;
$CdmlHash{display}=\&CdmlDisplay;

sub CdmlDisplay {
my($body,$h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.display.defaults');
my $var0=HvnRetVal($h pars,'','Variable','variable');
my $type=HvnRetVal($h pars,'',"Typ",'type');
my $var=substr($var0,1,100);
my $select=HvnSelect($h pars);
my $filter=HvnFilter($h pars);
my ($title,$tbody,$key,$i,@ar,%pars,$val);

InterWebInit();

$title="Variable $var0:";
if($var0 =~ m/%/ ) {
foreach $key (sort keys %$var) {
push(@ar,"$key => $$var{$key}");
}
} elsif($var0 =~ m/@/ ) {
for($i=0; $i<= $#$var; $i++) {
push(@ar,"[$i] = $$var[$i]");
}
} else {
if(!($var0 =~ m/\$/)) {
$var=$var0;
}
if($var =~ m/vida\.(.*)/) {
$var=$1;
$val=PageVarRetValDefault($PageCur,$var,$n1);
} elsif($var =~ m/\./) {
$val=ContextVarRetDefault($var,$n1);
} else {
$val=$$var;
}
push(@ar,$val);
}
if($filter ne '') {
@ar=ArrayStrFilterRegex(\@ar,$filter,1,1);
}
if($select ne '') {
@ar=ArrayStrFilterRegex(\@ar,$select,0,1);
}
if(StrEquList($type,'Text','inline')) {
return join(" ",@ar);
}
$tbody=" ".join("\n ",@ar);
%pars=( 'separator'=>'//@#0815#', 'distance'=>0, 'titlebackground'=>'gelb', 'titlefont'=>'@#black',
'markup'=>0, 'textbackground'=>'hellgelb', 'width'=>300, 'formatseparator'=>'@#7751#');
foreach $key (%$h pars) {
$pars{$key}=$$h pars{$key};
}
return CdmlTable($title."\n".$tbody,\%pars);
}

$CdmlHash{Hotspots}=\&CdmlHotspots;
$CdmlHash{hotspots}=\&CdmlHotspots;
sub CdmlHotspots {
my($body,$h pars)=@_;
HashAddContextDefaultsMissing($h pars,'cdml.hotspots.defaults');
my $anzahl=HvnRetVal($h pars,10,'Anzahl','count');
my $amp=HvnRetVal($h pars,200,'Amplitude','amplitude');
my ($i,@tab,$line,$page,$count,%pars,$scale,$hcount,$im,$wcount);
my ($loop,$text,$age,$key);
my $fnam="$DataDir/hotspots";

if(!(-f $fnam)) {
goto do build;
}
do restart:
@tab=FileSepRetArray($fnam,"\n");

$age=$^T - $tab[0];
my $refage=$HotspotDelta*0.9 + rand($HotspotDelta*0.2);
if($age > $refage) {
do build:
WikiBuildHotspotFile(0);
if($loop<1) {
$loop++;
goto do restart;
}
}

my $deft=Lu("main focus (age: {age} seconds)\@2|Brennpunkte des Interesses (Alter: {age} Sekunden)\@2|principal focus (age : {age} secondes\@2");
my $titel=HvnRetVal($h pars,$deft,"Titel",'title');
$titel =~ s/\{age\}/$age/;

if($anzahl>20) {
$anzahl=20;
}

for($i=1; $i<=$anzahl; $i++) {
$line=$tab[$i];
($page,$count,$wcount)=split(",",$line);
if($i==1) {
$hcount=$count;
}
if($page ne '') {
$im = ImageRetHtmlBar('/pixel/p1rot.gif',int(1+$amp*$wcount/$hcount),12)
. ImageRetHtmlBar('/pixel/p1blau.gif',int(1+$amp*$count/$hcount),12);
if($page =~ m/>$/) {
$anzahl++;
} else {
$text.= "{{$page}},$im\n";
}
}
}
%pars=('Texthintergrund'=>'weiß', 'Abstand' =>'-', 'Formatzeichen'=>'@', 'separator'=>',' );
HashAddHash(\%pars,$h pars);
foreach $key (%$h pars) {
$pars{$key}=$$h pars{$key};
}
$titel =~ s/ / /g ;
return CdmlTable("$titel\n".$text,\%pars);
}

$CdmlHash{Luft} = \&CdmlPadding;
$CdmlHash{padding} = \&CdmlPadding;
sub CdmlPadding {
my($body, $h pars)=@_;
my $width=HvnWidth($h pars,1);
my $height=HvnHeight($h pars,1);
return HtmlLuft($width,$height);
}

]

sub SplitUrlPunct {
  my ($url)=@_;
  my ($punct);

  if($url =~ s/\"\"$//) {
    return ($url,"");
  }
  $punct = "";
  if($url =~ /^news:/) {
     ($punct) = ($url =~ /([^\+a-zA-Z0-9\/\xc0-\xff]+)$/);
     $url =~ s/([^\+a-zA-Z0-9\/\xc0-\xff]+)$//;
  } else {
     ($punct) = ($url =~ /([^a-zA-Z0-9\/\xc0-\xff]+)$/);
     $url =~ s/([^a-zA-Z0-9\/\xc0-\xff]+)$//;
  }
  return ($url, $punct);
}

sub StripUrlPunct {
  my ($url)=@_;
  my ($junk);

  ($url, $junk) = SplitUrlPunct($url);
  return $url;
}

sub GetBracketUrlIndex {
  my ($id)=@_;

  if($SaveUrlNum{$id}>0) {
    return $SaveUrlNum{$id};
  }
  $SaveUrlNumIndex++;  # Start with 1
  $SaveUrlNum{$id} = $SaveUrlNumIndex;
  return $SaveUrlNumIndex;
}

sub StoreBracketInterWikiPage {
  my ($iwp)=@_;
  my ($url,$index,$link);

  $url=InterWikiPageRetUrl($iwp);
  $index=GetBracketUrlIndex($iwp);
  $link=UrlLabelClassTitleTargetRetLink($url,"[$index]",'body');
  return StoreRaw($link);
}

sub PageRetLogoDec {
  my ($id)=@_;
  my ($LogoImage,$header,$action);

  if($LogoUrl ne "") {
    $LogoImage = "img src='$LogoUrl' alt='[Home]' border='0'";
    if(UserHasStatus($NeedStatusAdmin)) {
       $action="edit=" . $id;
    } else {
       $action="action=HomePage";
    }
    $header = ActionLabelClassIdTargetTitleRetLink($action,"<$LogoImage>","");
  }
  return $header;
}

sub WikiRetFormSearchMini {
  my $ret=FormStart("form_search",'');
  $ret.=Lu("Search|Suchbegriff|Cherche|Buscar") . ": " . FormText('search','',20);
  $ret.=" " . Lu("in|gesucht wird|dans|en") . " " . FormCheck('title',1,Lu('title|im Titel|title|título'));
  $ret.=" " . FormCheck("text",1,Lu('text|im Text|text|texto'));
  $ret.=FormEnd();
  return $ret;
}

sub FormCheckHelper {
  my ($p_opt,$p_hid,$ident,$label,$val,$defval)=@_;
  my ($numval);

  if($val eq 'on' || $val eq 'off') {
    $$p_hid .= FormNameValueHidden($ident,$val) . "\n";
  } else {
    if($val eq '') {
      $val=$defval;
    }
    $numval = ($val>0) ? 1 : 0;
    $$p_opt .= ' ' . FormCheck($ident,$numval,$label);
  }
}

sub ParsRetVal {
  my $object=shift;
  my $ret;

  foreach (@_) {
    $ret=RetParam($_);
    if($ret ne '') {
      goto do_ret;
    }
  }
  if($ret eq '') {
    $ret= $object;
  }
do_ret:
  return $ret;
}

sub HvnRetVal {
  my($h_pars,$object,$var1,$var2,$var3,$var4)=@_;
  my $ret=$$h_pars{$var1};
  if($ret eq '') {
    $ret=$$h_pars{$var2};
    if(($ret eq '') && ($var3 ne '')) {
      $ret=$$h_pars{$var3};
      if(($ret eq '') && ($var4 ne '')) {
        $ret=$$h_pars{$var4};
      }
    }
  }
  if($ret eq '') {
    $ret= $object;
  }
  return $ret;
}

sub HvnRetColor { # hash, default, ...
  my $ret=HvnRetVal(@_);
  if(substr($ret,0,1) ne '#') {
    $ret=ColorDefaultRetCode($ret,$_[1]);
  }
  return $ret;
}

sub HvnHeight { return HvnRetVal(@_,"Höhe",Unicode("Höhe"),'height'); }
sub HvnWidth { return HvnRetVal(@_,'Breite','width'); }
sub HvnSize { return HvnRetVal(@_,"Größe",Unicode("Größe"),'size'); }
sub HvnSelect { return HvnRetVal(@_,'','select'); }
sub HvnFilter { return HvnRetVal(@_,'','filter'); }

sub WikiRetFormSearch {
  my ($h_pars)=@_;
  my $prompt=HvnRetVal($h_pars,LuNbsp('Search for:|Suchen nach:|Chercher :|Buscar:'),'Prompt','prompt');
  my $bcol= HvnRetColor($h_pars,'#eeeeee','Hintergrund','background');
  my $tlen=HvnRetVal($h_pars,20,'Feldlänge',Unicode('Feldlänge'),'inputwidth');
  my $title=HvnRetVal($h_pars,'','Titel','title');
  my $text=HvnRetVal($h_pars,'','Text','text');
  my $word=HvnRetVal($h_pars,'','Wort','word');
  my $case=HvnRetVal($h_pars,'','Case','case');
  my $regex=HvnRetVal($h_pars,'','Regex','regex');
  my $button=HvnRetVal($h_pars,'1','Button','button');
  my $val;
  my ($opt,$hid);

  if($tlen<20) {
    $tlen=20;
  }
  FormCheckHelper(\$opt,\$hid,'title',Lu('titles|Titel|titres|títulos'),$title,1);
  FormCheckHelper(\$opt,\$hid,'text' ,Lu('texts|Texte|textes|textos'),$text,1);
  FormCheckHelper(\$opt,\$hid,'word' ,Lu("words-only|Worte|mots-seulement|Palabras"),$word,0);
  FormCheckHelper(\$opt,\$hid,'case' ,Lu('match-case|Groß/klein|respecter-la-casse|considerar-la-caja'),$case,0);
  FormCheckHelper(\$opt,\$hid,'regex',Lu('regex|Regex|expressions-régulières'),$regex,0);

  $button = ($button) ? FormButton('do',Lu('Search|Suchen|Chercher|Buscar')) : $n1;

  my $ret = FormStart("form_search",'');
  $ret .= FormTableStart();
  $ret .= LineRsLsLmCol($prompt,FormText('search','',$tlen),$button,$bcol);
  if($opt) {
    $ret .= LineRsLsLmCol(LuNbsp('Options:|Optionen:|Options :|Opciones:'),$opt,$n1,$bcol);
  }
  $ret .= $hid;
  $ret .= FormTableEnd();
  $ret .= FormEnd();

  return $ret;
}

sub HtmlLuft {
  my ($width,$height)=@_;
  return "<img src='/image/p.gif' border='0' width='$width' height='$height'>";
}

sub ImageRetHtmlBar {
  my ($imnam,$width,$height)=@_;
  return ImageUrlRetHtmlPlus($imnam,'0',$width,$height);
}

sub FormNameValueHidden {
  my ($name,$value)=@_;

  $value =~ s/&/&/g;
  return "<input type='hidden' name='$name' value='$value' />";
}

sub ColorRetCode {
  my ($cnam)=@_;
  my $ret= $ColorTabDe{$cnam};
  if($ret eq '') {
    $ret= $ColorTabEn{$cnam};
  }
  if($ret eq '') {
    $ret= $ColorTabFr{$cnam};
  }
  return $ret;
}

sub ColorDefaultRetCode {
  my ($cnam,$object)=@_;
  my $ret=ColorRetCode($cnam);
  if($ret eq '') {
    $ret=$object;
  }
  return $ret;
}

$CdmlHash{ASIN}=\&CdmlAsin;
$CdmlHash{asin}=\&CdmlAsin;

sub CdmlAsin {
  my($body,$h_pars)=@_;
  HashAddContextDefaultsMissing($h_pars,'cdml.asin.defaults');
  my $image=HvnRetVal($h_pars,"http://images.amazon.com/images/P/\{code\}.01.THUMBZZZ.jpg",'image');
  my $url=HvnRetVal($h_pars,"http://www.amazon.com/exec/obidos/ASIN/\{code\}/\{aid\}",'url');
  my $aid=HvnRetVal($h_pars,'','aid');
  my $title=HvnRetVal($h_pars,'','title');
 my $asin=HvnRetVal($h_pars,$body,'code');
  StrStripBoth($asin);
  $asin=First($asin,'020171499X'); # default "The Wiki Way"

  $url=~ s/\{aid\}/$aid/;
  $url=~ s/\{code\}/$asin/;
  $image=~ s/\{aid\}/$aid/;
  $image=~ s/\{code\}/$asin/;

  $$h_pars{url}=$url;
  $$h_pars{image}=$image;
  return CdmlLink($title,$h_pars);
}

$CdmlHash{Bild}=\&CdmlImage;
$CdmlHash{image}=\&CdmlImage;

sub CdmlImage {
  my($body, $h_pars)=@_;
  HashAddContextDefaultsMissing($h_pars,'cdml.image.defaults');
  my ($ret,$width,$link,$punkt,$imw,$imh,$tablestyle,$scol,$tbcol,$ipad,$istyle);
  my $left_flag=1;
  my $url=HvnRetVal($h_pars,'','URL','url');
  my $text=HvnRetVal($h_pars,'','Text','text');
  my $pos=HvnRetVal($h_pars,'links','Position','align');
  my $pad=HvnRetVal($h_pars,'4','Luft','padding');
  my $art=HvnRetVal($h_pars,'','Art','type');
  my $bcol=HvnRetColor($h_pars,'','Hintergrund','background');
  my $border=HvnRetVal($h_pars,'0','Linienbreite','linewidth');
  my $breite=HvnRetVal($h_pars,'','Breite','width');
  my $abstand=HvnRetVal($h_pars,'','Abstand','distance');
  my $style=HvnRetVal($h_pars,'','Stil','style');
  my $imsize=HvnRetVal($h_pars,'','Bildformat','imagesize');
  my $framecolor=HvnRetColor($h_pars,'','Rahmenfarbe','framecolor');
  my $framewidth=HvnRetVal($h_pars,'','Rahmenbreite','framewidth');
  my $linecolor=HvnRetColor($h_pars,'','Linienfarbe','linecolor');
  my $linewidth=$border; # FIXME ugly
  my $ititle=HvnRetVal($h_pars,'','Bildtitel','imagetitle');
  my $ifont=HvnRetVal($h_pars,'','Bildfont','imagefont');

  if($url ne '' && $text eq '') {
    $text=$body; StrStripBoth($text);
    $body=$url;
  }

  StrStripBoth($body);
  if($body =~ m/$InterWebPattern/) {
    $body=InterWikiPageRetUrl($body);
  }

  if($text eq '') {
    $pos=HvnRetVal($h_pars,'','Ausrichtung','Position','align');
    if($pos =~ m/^r/) {
      $style.=" float: right; "
    } elsif ($pos =~ m/^l/) {
      $style.=" float: left; "
    }
    if($border>0) {
      $style.=" border: solid ${border}px $bcol; background-color:$bcol; "
    }
    ($link,$punkt)=UrlpRetLinkPunct($body,1,$style);
    return $link;
  }

  $text=TextCdmlRetText($text);
  TextMarkupImagesLinksParasLists($text,0,1,1,1);
  if($breite eq "") {
    $width="width='100%'";
  } else {
    $width="width='$breite'";
  }
  if($bcol ne "") {
    $tbcol=" bgcolor='$bcol'";
  }
  if($imsize =~ m/(\d+)x(\d+)/) {
    $imw=$1; $imh=$2;
  }

  my $al="left";
  if($pos =~ /^r/ ) {
    $al="right";
    $left_flag=0;
  }
  if($framecolor ne '') {
    if($framewidth==0) {
      $framewidth=3;
    }
    $style.=" border: solid ${framewidth}px $framecolor; ";
  }
  if($linecolor ne '') {
    if($linewidth==0) {
      $linewidth=1;
    }
    $tablestyle=" border: solid ${linewidth}px $linecolor; ";
    $tablestyle="style='$tablestyle'";
  }
  $ipad=$pad;
  if($ititle ne '') {
    $ipad=''
  }
  my $im=ImageUrlRetHtmlPlus($body,'0',$imw,$imh,$al,$ipad,$style);

  if($ititle ne '') {
    if($ifont ne '') {
      $ititle=TextFontRetHtml($ititle,$ifont);
    }
    $scol=First($framecolor,$bcol);
    if($left_flag) {
      $istyle.=" margin: 0 ${pad}px 0 0; "; #right
    } else {
      $istyle.=" margin: 0 0 0 ${pad}px; "; #left
    }
    $istyle.=" padding: 0 0 ${framewidth}px 0; ";
    $im="<table cellspacing='0' border='0' cellpadding='0' bgcolor='$scol' width='1%' align='$al' style='$istyle' ><tr><td width='1%'>$im</td></tr><tr><td width='1%'><center>$ititle</center></td></tr></table>";
  }
  if(StrEquList($art,'Spalte','column')) {
    if($left_flag) {
      $ret="<table $width cellspacing='0' border='0' $tbcol cellpadding='$pad' $tablestyle><tr><td valign='top'>$im</td><td>$text</td></tr></table>";
    } else {
      $ret="<table $width cellspacing='0' border='0' valign='top' $tbcol cellpadding='$pad' $tablestyle><tr><td>$text</td><td valign='top'>$im</td></tr></table>";
    }
  } else {
    $ret="<table $width border='0' $tbcol cellspacing='0' cellpadding='$pad' $tablestyle><tr><td>$im$text</td></tr></table>";
  }
  if(StrEmpty($abstand)) {
    $ret="<center>$ret</center>";
  } else {
    $ret="<table cellspacing='0' cellpadding='0' border='0'><tr><td>" . HtmlLuft($abstand,1) . "</td><td>$ret</td></tr></table>"
  }
  return $ret;
}

sub WikiRetFormBlog {
  my ($id,$form)=@_;
  my $editRows = RetParam("editrows", $Def_editrows);
  my $editCols = RetParam("editcols", $Def_editcols);
  my ($ret,$h);

  $ret .= FormStart("form_blog",$id);
  $ret .= FormTableStart();
  $ret .= FormNameValueHidden("title",$id) . "\n";
  $ret .= FormNameValueHidden("form",$form) . "\n";

  $h  = Lu('Contribution input form|Eingabeformular für Beiträge|Formulaire de Publication|Formulario de publicación');
  $ret .= HeaderColSpan($h,$FormTitlebackground,1);

  $h = Lu('Heading|Überschrift|En-tête|Título') . ': ' . FormText('summary','',30);
  $ret .= LineLm($h,$n1);

  $FontDecSuppress=1;
  $h = FormTextArea('text','',$editRows,$editCols,1,1);
  $ret .= LineLm($h,$n1);
  $FontDecSuppress=0;

  $h = FormButton('Save',LiSave()) . "$n3(" . LiUser() . ": $UserName)";
  $ret .= LineLm($h,$n1);

  $ret .= FormTableEnd();
  $ret .= FormEnd();

  return $ret;
}

sub WordForm {
  my ($text,@words)=@_;
  $text =~ s/(\%(\d+))/{$words[$2];}/ge;
  return $text;
}

sub TextProcess {
  my ($text,$process)=@_;

  PageContextInit();
  my $rule=$PageContext{rule};
  my (@arr,@arw);

  @arr = split(/[,;]/,$rule);

  $arw[0]=$PageCur;
  $arw[1]=$PageContext{plural};

  $text =~ s/(\$(\d+))/{&WordForm($arr[$2-1],@arw);}/ge;
#  $text =~ s/\$/xxx/g;

  return $text;
}

sub HashAddPageReRange {
  my ($h_pages,$page,$minlevel,$maxlevel)=@_;
  my $pagelevel=StrFindStrRetCount($page,'/');
  my ($key,$keylevel,$push,$re);
  $re=($page ne '') ? "$page/" : $page;

  PageIndexInit();
  foreach $key (keys %PageIndex) {
    if($key =~ m#^$re#) {
      $keylevel=StrFindStrRetCount($key,'/');
      $push=1;
      if($keylevel<$pagelevel+$minlevel) {
        $push=0;
      } elsif($keylevel>$pagelevel+$maxlevel) {
        $push=0;
      }
      if($push) {
        $$h_pages{$key}++;
      }
    }
  }
}

sub ArrayRandomize {
  my ($a_arr)=@_;
  my ($i,$ind,$h);

  for($i=$#$a_arr; $i>0; $i--) {
    $ind=int(rand($i + 1));
    $h=$$a_arr[$i];
    $$a_arr[$i]=$$a_arr[$ind];
    $$a_arr[$ind]=$h;
  }
}

sub HashAddPageTypes {
  my($h_pages,$page,$types)=@_;
  my ($type,$serr);

  PageIndexInit();
  my ($grand,$parent)=PageRetGrandParent($page);
  foreach $type (ListSplit($types)) {
    if(StrEquList($type,'Selbst','self')) {
      $$h_pages{$page}++;
    } elsif(StrEquList($type,'Kinder','children')) {
      HashAddPageReRange($h_pages,$page,1,1);
    } elsif(StrEquList($type,'Enkel','grandchildren')) {
      HashAddPageReRange($h_pages,$page,2,2);
    } elsif(StrEquList($type,'Nachkommen','descendants')) {
      HashAddPageReRange($h_pages,$page,1,1000);
    } elsif(StrEquList($type,'Kleinfamilie','sfamily')) {
      HashAddPageReRange($h_pages,$page,0,1);
    } elsif(StrEquList($type,'Zweig','branch')) {
do_branch:
      HashAddPageReRange($h_pages,$page,0,1000);
    } elsif(StrEquList($type,'Familie','family')) {
      HashAddPageReRange($h_pages,First($parent,$page),0,1000);
    } elsif(StrEquList($type,"Großfamilie",Unicode("Großfamilie"),'xfamily')) {
      HashAddPageReRange($h_pages,First($grand,$parent,$page),0,1000);
    } elsif(StrEquList($type,'*','@')) {
      HashAddHash($h_pages,\%PageIndex);
    } else {
      goto do_branch;
    }
  }
  return $serr;
}

$CdmlHash{Liste}=\&CdmlList;
$CdmlHash{list}=\&CdmlList;

sub CdmlList {
  my($body, $h_pars)=@_;
  HashAddContextDefaultsMissing($h_pars,'cdml.list.defaults');
  my $type=HvnRetVal($h_pars,'children','Typ','type');
  my $vida=HvnRetVal($h_pars,'','Vida','vida');
  my $title=HvnRetVal($h_pars,'','Titel','title');
  my $layout=HvnRetVal($h_pars,'','Layout','layout');
  my $anzahl=HvnRetVal($h_pars,0,'Anzahl','count');
  my $showdate=HvnRetVal($h_pars,'','Datum','date');
  my $publish=HvnRetVal($h_pars,'','Veröffentlichen',Unicode('Veröffentlichen'),'publish');
  my $edit=HvnRetVal($h_pars,'','Bearbeiten',"Ändern",Unicode('Ändern'),'edit');
  my $filter=HvnRetVal($h_pars,'','Filter','filter');
  my $select=HvnRetVal($h_pars,'','Selektion','select');
  my $opt= HvnRetVal($h_pars,'','Optionen','options');
  my $page=HvnRetVal($h_pars,$PageCur,'Seite','page');
  my $varlist=HvnRetVal($h_pars,'','Variablen','Variable','variables','variable');
  my $off=0;
  my ($re,@pageinfo,$self,@vars);

  my (@pages,$ret,%hinfo,%horder,$pagename,$fnam,$ftim,$ftim2,$info,$pp,%phash);

  $body=~s/\s+/ /g;
  StrStripBoth($body);
  if($body ne '') {
    if($varlist eq '') {
      $varlist=$body;
     $vida=1;
      $type=HvnRetVal($h_pars,'*','Typ','type');
    }
  }
  @vars=ListSplit($varlist);

  HashAddPageTypes(\%phash,$page,$type);
  @pages=sort keys %phash;

  if($filter ne '') {
    @pages=ArrayStrFilterRegex(\@pages,$filter,1);
    if($publish ne '') {
      @pages=ArrayStrFilterRegex(\@pages,"/Context",1);
    }
  }
  if($select ne '') {
    @pages=ArrayStrFilterRegex(\@pages,$select,0);
  }
  if($vida) {
    my $sep=" /// ";
    if($VidaCaching) {
      @pageinfo=VidaCacheVarsSepRetArrFilterPages(\@vars,$sep,\@pages);
    } else {
      VidaInitPageArray(\@pages);
      @pageinfo=VidaVarsSepRetArr(\@Vida,\@vars,$sep);
    }
    my %pars=%$h_pars;
    HashAddArray(\%pars,'separator',$sep);
    my $header=join($sep,LiPages(),@vars);
    unshift(@pageinfo,$header);
    return CdmlTable(join("\n",@pageinfo),\%pars);
  }
  if($opt =~ m#r#) {
    ArrayRandomize(\@pages);
  }
  if($publish ne '') {
    $showdate=1;
  }
  if($edit ne '') {
    $showdate=1;
    $hinfo{"column.edit"}=1;
  }
  if($showdate ne '') {
    foreach $pagename (@pages) {
      $horder{$pagename}=$ftim=PageRetTime($pagename);
      $info=TimeRetText($ftim);
      if($edit ne '') {
        $hinfo{"edit.$pagename"}="  ";
      }
      if($publish ne '') {
        $pp=PageRetPublishPage($pagename);
        $ftim2=PageRetTime($pp);
        if($ftim2<$ftim) {
          $info.=" ".NameStyleRetImageGif('newer');
        } else {
          $info.=" up-to-date";
        }
      }
      $hinfo{$pagename}=$info;
    }
    $ret=PageListRetHtml('',$ScriptName,\@pages,\%hinfo,'',1,1,$layout,$anzahl,\%horder,1,0,undef,undef,0);
  } else {
    $ret=PageListRetHtml('',$ScriptName,\@pages,undef,'',1,1,$layout,$anzahl,undef,0,0,undef,undef,0);
  }
do_err:
  return $ret;
}

sub HashRetSize {
  my ($h_hash)=@_;
  return int(keys %$h_hash);
}

sub HashRetMax {
  my ($h_hash)=@_;
  my ($max,$val);

  foreach (keys %$h_hash) {
    $val=$$h_hash{$_};
    if($val>$max) {
      $max=$val;
    }
  }
  return $max;
}

sub ArrayElementRetInd {
  my ($a_ar,$el)=@_;
  my $ind=0;
  foreach (@$a_ar) {
    if($_ eq $el) {
      return $ind;
    }
    $ind++;
  }
  return -1;
}

sub TablePageFieldRetSum {
  my ($id,$field)=@_;
  my $text=PageRetTextFast($id);
  my @lines=split("\n",$text);
  my $fieldline=shift(@lines);
  my @fields=LineRetFields($fieldline);
  my $ind=ArrayElementRetInd(\@fields,$field);
  my $sum;

# MsgPrint("TPFRS id=$id field=$field fieldline=$fieldline ind=$ind");
  if($ind<0) {
    return " error ";
  }
  foreach (@lines) {
    $sum += LineIndRetField($_,$ind);
  }
  return $sum;
}

sub DataRetVal {
  my ($var)=@_;
  my $ret=$var;
  if($var =~ m/vida\.(.*)/) {
    $var=$1;
    $ret=PageVarRetValDefault($PageCur,$var,$n1);
  } elsif($var =~ m#tablesum\.([^.]+)\.([^.]+)# ) {
    $ret=TablePageFieldRetSum($1,$2);
  }
  $ret;
}

$CdmlHash{"Einfügen"}=\&CdmlInsert;
$CdmlHash{Unicode("Einfügen")}=\&CdmlInsert;
$CdmlHash{insert}=\&CdmlInsert;

sub CdmlInsert {
  my($body, $h_pars)=@_;
  my $typ=HvnRetVal($h_pars,'','Typ','type');
  my $id=HvnRetVal($h_pars,'','Seite','page');
  my $process=HvnRetVal($h_pars,'','Prozess','process');
  my $form=HvnRetVal($h_pars,'','Formular','form');
  my $silent=HvnRetVal($h_pars,'','Tolerant','silent');
  my $bcol=HvnRetColor($h_pars,'','Hintergrund','background');
  my $days=HvnRetVal($h_pars,7200,'days');
  my $detail=HvnRetVal($h_pars,0,'detail');
  my $months=($days>90)?1:0;
  my $ret;
  my $es=Lu("Error in insert|Fehler in Einfügung|Erreur en insertion|Error de inserción");
  my $var;

  if($typ eq 'Datum') {
    $ret=TimeRetDay($^T);
  } elsif(StrEquList($typ,'Seitenzahl','pagecount')) {
    PageIndexInit();
    $ret=HashRetSize(\%PageIndex);
  } elsif(StrEquList($typ,'Daten','data')) {
    $var=$body;
    $ret=DataRetVal($var);
  } elsif(StrEquList($typ,'Mediendaten','mediadata')) {
    $ret=StatCreatePlus(0,1,$months,$days,$detail);
  } elsif(StrEquList($typ,"Seitengröße",Unicode("Seitengröße"),"Seitenlänge",Unicode("Seitenlänge"),'pagesize')) {
    $ret=PageRetSize(ValDefault($id,$PageCur));
  } elsif(StrEquList($typ,'Wortanzahl','wordcount')) {
    $ret=PageRetWordCount(ValDefault($id,$PageCur));
  } elsif(StrEquList($typ,'Zeichenanzahl','charactercount')) {
    $ret=PageRetCharCount(ValDefault($id,$PageCur));
  } elsif($typ eq 'ProtId') {
    $ProtId=RandomRetStamp();
    $ProtId=substr($ProtId,0,6);
    $ret=$ProtId;
  } elsif(StrEquList($typ,'WebLog','weblog','Blog','blog')) {
    $ret=WikiRetFormBlog($PageCur,$form);
  } elsif($id ne '') {
    if($id =~ m/\$/) {
      PageContextInit();
      $id =~ s/\$(.*)$/$PageContext{$1}/;
    }
    if(PageExist($id)) {
      $ret=PageRetText($id);
      if($process ne '') {
        $ret=TextProcess($ret,$process);
      }
      $ret=TextWikiRetHtmlBasic($ret);
      if($bcol ne '') {
        $ret="<div style='background:url(/image/bg_pergament1.jpg); padding: 10 10 10 10; margin: 10 10 10 10; border: dotted 3px gray;'>$ret</div>";
#        $ret="<div style='background:$bcol; padding: 10 10 10 10; margin: 10 10 10 10; border: dotted 3px gray;'>$ret</div>";
#        $ret="<table border='0' cellspacing='0' cellpadding='0' width='100%'><tr bgcolor='$bcol'><td>$ret</td></tr></table>";
#        TableCvtLineColorWidth($ret,'#000000','90%');
#        TableCvtAbstandWidth($ret,'','90%');
      }
    } elsif($silent eq '') {
      $lb1=Lu("Page %PAGENAME% doesn't exist.|Seite %PAGENAME% existiert nicht.|page %PAGENAME% n'existe pas.|página %PAGENAME% no existe.");
      MessRepPagename($lb1,$id);
      $ret=$es.LiColon().$lb1;
    }
  } else {
    $lb1=Lu("Type %TYPENAME% unknown.|Typ %TYPENAME% unbekannt.|type %TYPENAME% inconnu.|tipo %TYPENAME% desconocido.");
    MessRepVar($lb1,"%TYPENAME%",$typ);
    $ret=$es.LiColon().$lb1;
  }
  return $ret;
}

$CdmlHash{Schrift}=\&CdmlFont;
$CdmlHash{font}=\&CdmlFont;

sub FontRetFaceSizeColorBoldItalUdl {
  my ($font)=@_;
  my ($face,$size,$col,$bold,$ital,$udl,$fmtcol);

  ($face) = ($font =~ m/^([^@#]*)/ );
  ($col) = ($font =~ m/#([^@#]*)/ );
  ($size) = ($font=~ m/@([^@#]*)/ );
  if($col ne '') {
    $fmtcol=ColorRetCode($col);
    if($fmtcol ne '') {
      $col=$fmtcol;
    } else {
      $col="#$col";
    }
  }
  if($size ne '') {
    $bold = ($size =~ m/[bBfF]/) ? 1 : 0;
    $ital = ($size =~ m/[iIkK]/) ? 1 : 0;
    $udl = ($size =~ m/[uU]/) ? 1 : 0;
    $size = int($size);
    if($size == 0) {
      $size='';
    }
  }

 return ($face,$size,$col,$bold,$ital,$udl);
}

sub TextFaceSizeColorBoldItalUdlRetHtml {
  my ($text,$face,$size,$color,$bold,$ital,$udl)=@_;
  my ($h1,$h2);

  if($face ne '') {
    $face=" face='$face'";
  }
  if($size ne '') {
    $size=" size='$size'";
  }
  if($color ne '') {
    $color=" color='$color'";
  }
  if($bold) {
    $h1.="<b>"; $h2.="</b>";
  }
  if($ital) {
    $h1.="<i>"; $h2="</i>".$h2;
  }
  if($udl) {
    $h1.="<u>"; $h2="</u>".$h2;
  }
  return "<font$face$size$color>" . $h1 . $text . $h2 . '</font>';
}

sub TextFontRetHtml {
  my ($text,$font)=@_;
  my ($face,$size,$col,$bold,$ital,$udl)=FontRetFaceSizeColorBoldItalUdl($font);
  return TextFaceSizeColorBoldItalUdlRetHtml($text,$face,$size,$col,$bold,$ital,$udl);
}

sub CdmlFont {
  my($body, $h_pars)=@_;
  HashAddContextDefaultsMissing($h_pars,'cdml.font.defaults');
  my $face=HvnRetVal($h_pars,'','Art','face');
  my ($size,$col,$bold,$ital,$udl);

  if($face ne '') {
    ($face,$size,$col,$bold,$ital,$udl)=FontRetFaceSizeColorBoldItalUdl($face);
  }
  $size=HvnSize($h_pars,$size);
  $col=HvnRetColor($h_pars,$col,'Farbe','color');
  TextMarkupImagesLinksParasLists($body,0,1,1,1);
  return TextFaceSizeColorBoldItalUdlRetHtml($body,$face,$size,$col,$bold,$ital,$udl);
}

sub PixelRetTwips {
  return 15*$_[0];
}

sub RtfRowsRetTable {
  my ($rows)=@_;
  return "{\\intbl\n" . $rows . "}\n";
}

sub RtfCellsRetRow {
  my ($cells,$abstand,$luft)=@_;
  my $rabstand=PixelRetTwips($abstand);
  my $rluft=PixelRetTwips($luft);
  return "\\trowd\\trleft$rabstand\\li$rluft\\ri$rluft\\sb$rluft\\sa$rluft\n" . $cells . "\\row\n";
}

sub RtfCell {
  my ($body,$fcol,$width,$bcol,$lwidth,$lcol)=@_;
  my $find=RtfColorTabRetInd($fcol);
  my $bind=RtfColorTabRetInd($bcol);
  my $lind=RtfColorTabRetInd($lcol);
  my $lw=PixelRetTwips($lwidth);
  my $cwidth=PixelRetTwips($width);

  my $ret=
   "\\tcelld\n"
  ."\\clbrdrb\\brdrs\\brdrw$lw\\brdrcf$lind\\clbrdrt\\brdrs\\brdrw$lw\\brdrcf$lind\\clbrdrl\\brdrs\\brdrw$lw\\brdrcf$lind\\clbrdrr\\brdrs\\brdrw$lw\\brdrcf$lind\n"
  ."\\clcbpat$bind\\cellx$cwidth\\ql {\\f0\\cf$find $body}\\cell\n";
  return $ret;
}

sub RtfTextColorTableAbstandWidthColorLinewidthColorLuft {
  my ($body,$fcol,$abstand,$width,$bcol,$lwidth,$lcol,$luft)=@_;
  my $cells=RtfCell($body,$fcol,$width,$bcol,$lwidth,$lcol);
  my $rows=RtfCellsRetRow($cells,$abstand,$luft);
  return RtfRowsRetTable($rows);
}

$CdmlHash{Posting}=\&CdmlCode;
$CdmlHash{Code}=\&CdmlCode;
$CdmlHash{posting}=\&CdmlCode;
$CdmlHash{code}=\&CdmlCode;

sub CdmlCode {
  my($body, $h_pars)=@_;
  HashAddContextDefaultsMissing($h_pars,'cdml.code.defaults');
  my $abstand=HvnRetVal($h_pars,50,'Abstand','distance');
  my $w=HvnWidth($h_pars,400);
  my $fcol=HvnRetColor($h_pars,'#000066','Farbe','color');
  my $bcol=HvnRetColor($h_pars,'#e7e7e7','Hintergrund','background');
  my $lcol=HvnRetColor($h_pars,'#cccccc','Linienfarbe','linecolor');
  my $luft=HvnRetVal($h_pars,'8','Luft','padding');
  my $lwidth=HvnRetVal($h_pars,'2','Linienbreite','linewidth');
  my $face=HvnRetVal($h_pars,'mono','Schriftart','face');
  my $lnr=HvnRetVal($h_pars,'','Zeilennummer','linenumber');
  my $lfmt=HvnRetVal($h_pars,'','Zeilennummernformat','linenumberformat');
  my ($b2,$line,$ret);

  $body =~ tr/\r//d;
  StrStripChrBoth($body,"\n");
  $body=TextCdmlRetText($body);
  if($lnr ne '' || $lfmt ne '') {
    $lnr=int($lnr);
    if($lnr==0) {
      $lnr=1;
    }
    if($lfmt eq '') {
      $lfmt='%3d: ';
    } else {
      StrStripBrackets($lfmt,'"','"');
    }
    foreach $line (split(/\n/,$body)) {
      $b2 .= sprintf($lfmt,$lnr++) . $line . "\n";
    }
    $body=$b2;
  }

  if($face ne '') {
    $face=StrDecorate($face," face='\@'");
  }

  if($RtfMode) {
    $body =~ s#\n*<p>\n*#\\line\n#g;
    $body =~ s#\\line\n$##;
    $ret="{\\f2\\fs20 $body}";
    $ret=RtfTextColorTableAbstandWidthColorLinewidthColorLuft($ret,$fcol,$abstand,$w,$bcol,$lwidth,$lcol,$luft);
    return $ret;
  }

  my $text="<td width=$w><pre style='margin:0 0 0 0;'><font color=$fcol$face>".$body."</font></pre></td>";
  my $tb;
  $tb .= "<table border='0' cellspacing=0 cellpadding='0' bgcolor='$lcol'><tr><td>";
  $tb .= "<table border='0' cellspacing=$lwidth cellpadding='$luft'><tr bgcolor=$bcol>";
  $tb .= $text;
  $tb .= "</tr></table>";
  $tb .= "</td></tr></table>";

  $ret="<table cellspacing='0' cellpadding='0' border='0'><tr><td>";
  $ret .= HtmlLuft($abstand,1) . "</td><td>$tb</td></tr></table>";
  return $ret;
}

sub TextMarkWord {
  my($word)=@_;
  my($mean,$word2);

  $mean=$AltWordSet{$word};
  if($mean eq '') {
    my $word2=WordTogCase($word);
    $mean=$AltWordSet{$word2};
    if($mean eq '') {
      return $word;
    }
  }
  return "<a href='$ScriptName?$AltWordSource' title='$mean' onmouseover=\"status='$mean'; return true;\" onmouseout=\"status=''; return true;\"><span style='background-color: $AltWordColor'>$word</span></a>";
}

sub PageRetWordHash {
  my($id)=@_;
  my(@lines,$line,$word,$mean,%hash);
  my $fnam = $PageDir . "/" . PageRetDirectory($id) . "/$id.db";

  if(!(-f $fnam)) {
     return;
  }

  my $text=PageRetText($id);

  if($text =~ m#\[\[Tabelle\](.*)\n\]#s ) {
    @lines=split("\n",$1);
    foreach $line (@lines) {
      ($word,$mean)=split(';',$line);
      $hash{$word}=$mean;
    }
  }
  return %hash;
}

sub Cover {
  my($s,$head,$tail)=@_;
  if($s ne '') {
    return $head.$s.$tail;
  }
  return '';
}

sub TableCvtAbstandWidth {
  # my($table,$abstand,$width)=@_;
  my $abstand=$_[1];
  my $width=$_[2];
  my $twid=Cover($width," width=");
  if($abstand eq '') {
    $_[0]="<center>$_[0]</center>";
  } else {
    $_[0]="<table cellspacing=0 cellpadding='0' border='0' width=100%><tr><td width=1%>" . HtmlLuft($abstand,1) . "</td><td align=left $twid>$_[0]</td></tr></table>";
  }
}

sub AltWordInit {
  my($lang)=@_;
  if($AltWordColor eq '') {
    $AltWordColor="#ffddbb";
    %BaseWordSet= PageRetWordHash("GrundWortschatz".$lang);
    $AltWordSource="ErweiterungsWortschatz".$lang;
    %AltWordSet= PageRetWordHash($AltWordSource);
  }
}

sub ParsRetHash {
  my($pars)=@_;
  my (%hash,@ar,$key,$val);

  ($pars) = ($pars =~ m/^\s*\[(.*)\]\s*$/);
  @ar=split(/\
\s*\[/,$pars);
  foreach (@ar) {
    ($key,$val) = ($_ =~ m/^([^=]*)=(.*)/);
    $hash{$key}=$val;
  }
  return %hash;
}

sub ContextVarRetHashDefault {

  my($var,$def)=@_;
  my $val=ContextVarRetDefault($var,$def);
  my %hash=ParsRetHash($val);
  return %hash;
}

sub HashAddHashMissing {

  my($h pars,$h defaults)=@_;
  my $key;

foreach $key (keys %$h defaults) { if($$h pars{$key} eq '') { $$h pars{$key}=$$h defaults{$key}; } }

}

sub HashAddContextDefaultsMissing {

  my($h pars,$defname,$defstring)=@_;
  my %defaults=ContextVarRetHashDefault($defname,$defstring);
  HashAddHashMissing($h pars,\%defaults);
}

$CdmlHash{quote}=\&CdmlQuote; $CdmlHash{Zitat}=\&CdmlQuote;

sub CdmlQuote {

  my($body, $h pars)=@_;
  HashAddContextDefaultsMissing($h pars,'cdml.quote.defaults',$CdmlQuoteDefaults);
  return CdmlText($body,$h pars);
}

sub TrailInit {

  $TrailPage=$_[0];
  $TrailName=$_[1];
  $TrailSection=$_[2];
}

sub TrailExit {

  $TrailPage='';
  $TrailSection='';
  $TrailName='';
}

$CdmlHash{document}=\&CdmlDocument; $CdmlHash{Dokument}=\&CdmlDocument;

sub CdmlDocument {

  my($body, $h pars)=@_;
  my $name= HvnRetVal($h pars,'',"Name",'name');
  my $type= HvnRetVal($h pars,'',"Typ",'type');

if($type eq '') { $$h pars{type}='Tour'; } HashAddContextDefaultsMissing($h pars,'cdml.document.defaults',$CdmlDocumentDefaults); return CdmlText($body,$h pars);

}

$CdmlHash{Text}=\&CdmlText; $CdmlHash{text}=\&CdmlText;

sub CdmlText {

  my($body, $h pars)=@_;
  HashAddContextDefaultsMissing($h pars,'cdml.text.defaults');
  my $abstand= HvnRetVal($h pars,20,'Abstand','distance');
  my $bcol= HvnRetColor($h pars,'#f7f7ee','Hintergrund','background');
  my $lcol= HvnRetColor($h pars,'#cccccc','Linienfarbe','linecolor');
  my $luft= HvnRetVal($h pars,'3','Luft','padding');
  my $lwidth= HvnRetVal($h pars,'1','Linienbreite','linewidth');
  my $width = HvnWidth($h pars,'');
  my $lang= HvnRetVal($h pars,'Englisch','Sprache','language');
  my $ar= HvnRetVal($h pars,'l','Ausrichtung','alignment','align');
  my $zu= HvnRetVal($h pars,'ja','Zeilenumbruch','wordwrapping');
  my $opt= HvnRetVal($h pars,'','Optionen','options');
  my $titel= HvnRetVal($h pars,'','Titel','title');
  my $ttibg=$TableTitlebackground;
  my $tcol=HvnRetColor($h pars,$ttibg,'Titelhintergrund','titlebackground');
  my $foot= HvnRetVal($h pars,'',"Fuß",Unicode("Fuß"),'footer');
  my $ftcol=HvnRetColor($h pars,$ttibg,"Fußhintergrund",Unicode("Fußhintergrund"),'footerbackground');
  my $document= HvnRetVal($h pars,'',"Typ",'type');
  my $docflag=($document ne '') ? 1 : 0;
  my $name= HvnRetVal($h pars,'',"Name",'name');
  my $section=HvnRetVal($h pars,'',"Auswahl",'selection');

my $tfont= HvnRetVal($h pars,'#000066','Schriftart','font'); my $hfont= HvnRetVal($h pars,'','Titelschriftart','titlefont'); my $ffont= HvnRetVal($h pars,'',"Fußschriftart",Unicode("Fußschriftart"),'footerfont'); my $center=($ar =~ m/[cz]/) ? 1 : 0; my $pre=($zu =~ m/n/)? 1 : 0;

$body =~ tr/\r//d; StrStripChrBoth($body,"\n");

TextMarkupImagesLinksParasLists($titel,0,1,1,0); TextMarkupImagesLinksParasLists($foot,0,1,1,0);

$body=TextCdmlRetText($body); if($docflag) { if($titel eq '') { $titel="Inhaltsverzeichnis $document"; } TrailInit($PageCur,$name,$section); } TextMarkupImagesLinksParasLists($body,0,1,1,1); TrailExit();

if($abstand eq '-') { if($RtfMode) { if($width<1) { $width=0.8*$RtfBodyWidth; } $abstand=($RtfBodyWidth-PixelRetTwips($width))/2; } else { $abstand=''; } }

if($RtfMode) { if($pre) { $body =~ s#\n*<p>\n*#\\line\n#g; } else { $body =~ s#\n*<p>\n*#\n#g; } $body =~ s#\\line\n$##; my $cells=RtfCell($body,'#000066',$width,$bcol,$lwidth,$lcol); my $rows=RtfCellsRetRow($cells,$abstand,$luft); return RtfRowsRetTable($rows); }

AltWordInit($lang); $body =~ s/([A-ZÄÖÜ]?[a-zäöüß]+)/&TextMarkWord($1)/ge;

my $text=$body; if($center) { $text="<center>$text</center>"; } if($pre) { $text="

$text
"; } my $twid=Cover($width," width=");

if($tfont ne '') { $text=TextFontRetHtml($text,$tfont); }

$text="<td width=$width>" . $text . "</td>"; my $tb; $tb .= "<table border='0' cellspacing=0 cellpadding='0' bgcolor=$lcol $twid><tr><td>"; $tb .= "<table border='0' cellspacing=$lwidth cellpadding=$luft width=100%>";

if($titel ne '') { if($hfont ne '') { $titel=TextFontRetHtml($titel,$hfont); } $tb .= "<tr bgcolor=$tcol><td>$titel</td></tr>"; } $tb .= "<tr bgcolor=$bcol>$text</tr>"; if($foot ne '') { if($ffont ne '') { $foot=TextFontRetHtml($foot,$ffont); } $tb .= "<tr bgcolor=$ftcol><td>$foot</td></tr>"; } $tb .= "</table>"; $tb .= "</td></tr></table>";

my $ret=$tb; TableCvtAbstandWidth($ret,$abstand,"100%"); return $ret;

}

sub ScriptCodeFrage {

  my $ret =<<'#END_OF_SCRIPT_FRAGE';
function SetColorStyleText(qi,color,style,t) {
  document.all['ac_'+qi].style.backgroundColor=color;
  document.getElementById('ab_'+qi).style.display=style;
  document.all['at_'+qi].innerText=t;
}

function QuestionCheck(frm,qi) {

  els=frm.elements("frage_"+qi);
  nok=0;
  for(i=0; i<els.length; i++) {
    e=els[i];
    if((e.value&1)!=((e.checked)?1:0)) {
      nok++;
    }
  }
  if(nok) {
    SetColorStyleText(qi,"#ff0000",'none',"{NOK}");
  } else {
    SetColorStyleText(qi,"#00ff00",'none',"{OK}");
  }
}

function QuestionCheckVal(frm,qi,val) {

  sbox=document.getElementById("frage_"+qi);
  nok=0;
  if(sbox.value!=val) {
    nok++;
  }
  if(nok) {
    SetColorStyleText(qi,"#ff0000",'none',"{NOK}");
  } else {
    SetColorStyleText(qi,"#00ff00",'none',"{OK}");
  }
}

function AnswerDel(frm,qi) {

  SetColorStyleText(qi,"#ffffff",,);
}
  1. END_OF_SCRIPT_FRAGE
  $ret =~ s/{OK}/&Lu("That's correct!|Richtig!|Exact. Bravo !|¡Exacto!")/ge;
  $ret =~ s/{NOK}/&Lu("Sorry, not correct!|Falsch!|Mauvaise Réponse !|¡Falso!")/ge;

return $ret;

}

$CdmlHash{Frage}=\&CdmlQuestion; $CdmlHash{question}=\&CdmlQuestion; $CdmlHash{apprendre}=\&CdmlQuestion;

sub CdmlQuestion {

  my($body, $h pars)=@_;
  HashAddContextDefaultsMissing($h pars,'cdml.question.defaults');
  my $text=HvnRetVal($h pars,'','texte','Text','text');
  my $pos=HvnRetVal($h pars,'','Position','position');
  my $art=HvnRetVal($h pars,'','Art','type');
  my $info=HvnRetVal($h pars,'','Info','info');
  my $code=HvnRetVal($h pars,'','Code','code');
  my $bild=HvnRetVal($h pars,'','Bild','image');
  my $ant=HvnRetVal($h pars,'','reponse','Antwort','answer');
  my $border=HvnRetVal($h pars,'','lignelargeur','Linienbreite','linewidth');
  my $color=HvnRetColor($h pars,$QuizColor,'couleur','Farbe','color');
  my ($ret,$bgcol,$fb,$val,$cs,$td but,$pagetext,$qfunc,$qval);
  my $ind=0;

if($FrageCount==0) { $pagetext=PageRetTextFast($PageCur); $FrageBogenFlag=($pagetext =~ m/\[\[(Auswertung|evaluation)\]/ )? 0 : 1; } $fb=$FrageBogenFlag; if($border eq '') { if($fb) { $border=1; } else { $border=0; } } if($fb) { if($ScriptCodeInit==0) { $ScriptCode.=ScriptCodeFrage(); $ScriptCodeInit++; } } if($FrageCount==0) { $ret .= FormStart("form evaluation",''); $ret .= FormNameValueHidden("cur page",$PageCur) . "\n"; } my $h="" . ($FrageCount+1) . ". "; $ret .= "<table width='100%' cellpadding='2' border='0' bgcolor='$color'><tr><td><font size=+1>$h$text</font></td></tr></table>";

my $al="'left'";

my $im= HtmlLuft(50,1); if($info ne "") { TextMarkupImagesLinksParasLists($info,0,1,1,0); $im= "<table cellpadding='10' cellspacing='0' bgcolor='#dddddd' border='0'><tr><td><font color='#000066'>$info</font></td></tr></table>"; $im= "<table cellpadding='1' cellspacing='0' bgcolor='#000066' border='0'><tr><td>$im</td></tr></table>"; } elsif($code ne "") { $code =~ tr/\r//d; StrStripChrBoth($code,"\n"); TextMarkupImagesLinksParasLists($code,0,0,1,0); $im= "<table cellpadding=10 cellspacing=0 bgcolor='#dddddd' border='0'><tr><td>

<font color='#000066'>$code</font></td>
</tr></table>"; $im= "<table cellpadding=1 cellspacing=0 bgcolor='#000066' border='0'><tr><td>$im</td></tr></table>"; } elsif($bild ne "") { $im= "<table cellpadding=10><tr><td><img src='$bild' border='0'></td></tr></table>"; }

$body =~ s/\r//sg; StrStripChrBoth($body,"\n"); TextMarkupImagesLinksParasLists($body,0,1,1,0);

my @lines=split("\n",$body);

my ($line,$fragen,$elem,@ar,$count,$size,$maxlen);

$qfunc="QuestionCheck(this.form,'$FrageCount')"; $qval=1; foreach $line (@lines) { $val=$ind; $cs=''; if($fb) { $val*=10;

} if($line =~ s/\[([ x]?)\]//) { if(StrExist($1)) { $val++; } if($fb) { $fragen .= "<input type='checkbox' name='frage_$FrageCount' value='$val' onclick=\"AnswerDel(this.form,'$FrageCount')\"> $line"; } else {

  1. $fragen .= $cgi->checkbox(-name=>"frage_${FrageCount}_$ind", -label=>$line, -checked=>0);
        $fragen .= FormCheck("frage_${FrageCount}_$ind",0,$line);
      }
    } elsif($line =~ s/\(([ .]?)\)//) {
      if(StrExist($1)) {
        $val++;
      }
      if($fb) {
        $fragen .= "<input type='radio' name='frage_$FrageCount' value='$val' onclick=\"AnswerDel(this.form,'$FrageCount')\"> $line";
      } else {
        $fragen .= "<input type='radio' name='frage_$FrageCount' value='$ind'> $line";
      }
    } elsif($line =~ m#\.\.\(([^()]+)\)\.\.# ) {
      @ar=split(/\|/,$1);
      if($#ar == 0) {
        if($fb) {
          $elem="<input type='text' id='frage_${FrageCount}' value='' onchange=\"AnswerDel(this.form,'$FrageCount')\" size='20' maxlength='80'>";
        } else {
          $elem="<input type='text' name='frage_${FrageCount}' value='' size='20' maxlength='80'>";
        }
        $qval=$ar[0];
      } else {
         $qval=1;
         if($fb) {
           $elem="<select id='frage_${FrageCount}' onchange=\"AnswerDel(this.form,'$FrageCount')\" ><option selected value='0'>";
         } else {
           $elem="<select name='frage_${FrageCount}'><option selected value=''>";
         }
         $count=1;
         foreach (@ar) {
           if($_ =~ m/^=/) {
             $qval=$count;
             $_ =~ s/^=//;
           }
           if($fb) {
             $elem .= "<option value='$count'>$_";
           } else {
             $elem .= "<option value='$_'>$_";
           }
           $count++;
         }
         $elem.="</select>";
      }
      $elem="<span style='position:relative; left:0px; top:+3px;'>$elem</span>";
      $fragen .= "$br0$`$n2$elem$n2$'$br0";
      $qfunc="QuestionCheckVal(this.form,'$FrageCount','$qval')";
    }

$fragen.=$br; $ind++;

do next:
  }

if($fb) { my $s check=Lu("Check answer|Kontrollieren|Vérifiez la réponse|Controlar"); $td but="<td ID='ac_$FrageCount' width='30%' align='center'>\n" . "<span ID='ab_$FrageCount' ><input type='button' onclick=\"$qfunc\" value='$s check'></span>\n" . "<span ID='at_$FrageCount'></span>\n" . "</td>\n"; }

$ret .= "<table width='100%' cellpadding='5' border=$border><tr><td width='20%' align='center'>$im</td><td width='50%'>\n$fragen\n</td>$td but</tr></table>";

$FrageCount++; return $ret;

}

$CdmlHash{'Auswertung'} = \&CdmlEvaluation; $CdmlHash{'evaluation'} = \&CdmlEvaluation; sub CdmlEvaluation {

  my($body, $h pars)=@_;
  my $ret;
  my $color=HvnRetColor($h pars,$QuizColor,'colour','Farbe','color');
  my $cb=FontDec(&FormButton('eval',Lu("Evaluate...|Auswertung durchführen...|Evaluation...|Evaluación...")));

my $l1=Lu("Evaluation|Auswertung|Evaluation|Evaluatión"); $ret.="<table width='100%' cellpadding='2' border='0' bgcolor='$color'><tr><td><font size='5'>$l1       $cb</font></td></tr></table>"; $ret.=FormEnd(); return $ret;

}

sub LabelNameHrefRetLink {

  my ($text,$name,$href)=@_;
  return "<a name='$name'></a><a href='$href'>$text</a>";
}

$CdmlHash{Flash}=\&CdmlFlash; $CdmlHash{flash}=\&CdmlFlash;

sub CdmlFlash {

  my($body,$h pars,$jdir)=@_;
  HashAddContextDefaultsMissing($h pars,'cdml.flash.defaults');
  my $url=HvnRetVal($h pars,'','Url','url');
  my $width=HvnWidth($h pars,600);
  my $height=HvnHeight($h pars,400);
  my $clsid="D27CDB6E-AE6D-11cf-96B8-444553540000";
  my $codebase=" http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0";
  my $type="application/x-shockwave-flash";
  my $pi=" http://www.macromedia.com/go/getflashplayer";
  my $ret;

  1. ../img/examples/swf/soccer.swf
  $ret = "<OBJECT classid=\"clsid:$clsid\" codebase=\"$codebase\" WIDTH=\"$width\" HEIGHT=\"$height\">\n";
  $ret.= "<PARAM NAME=movie VALUE=\"$url\"><PARAM NAME=quality VALUE=high>\n";
  $ret.= "<EMBED src=\"$url\" quality=high WIDTH=\"$width\" HEIGHT=\"$height\" TYPE=\"$type\" PLUGINSPAGE=\"$pi\"></EMBED>\n";
  $ret.= "</OBJECT>\n";
  return $ret;
}

$CdmlHash{"Fußnote"}=\&CdmlFootnote; $CdmlHash{Unicode("Fußnote")}=\&CdmlFootnote; $CdmlHash{footnote}=\&CdmlFootnote;

sub CdmlFootnote {

  my($body, $h pars)=@_;
  HashAddContextDefaultsMissing($h pars,'cdml.footnote.defaults');
  my $ret;

$FootnoteCount++; push(@FootnoteTab,$body);

$ret = "".LabelNameHrefRetLink("[$FootnoteCount]","fa_$FootnoteCount","#fn_$FootnoteCount").""; return $ret;

}

sub CdmlJavaDir {

  my($body,$h pars,$jdir)=@_;
  my $code=HvnRetVal($h pars,'code','Code','code');
  my $code2=HvnRetVal($h pars,'','CODE');
  my $width=HvnWidth($h pars,100);
  my $height=HvnHeight($h pars,100);
  my $path=HvnRetVal($h pars,'com.hls','Pfad','path');
  my ($key,$val,$CODE);
  my $ret;

$body =~ s/\r//sg; # damn shit... $body =~ s/\"//sg; StrStripChrBoth($body,"\n"); $body =~ s/\n/|/sg; if(!StrEmpty($body)) { $$h pars{"Body"}=$body; # for transfer } $CODE="$path.$code.$code.class"; if($code2 ne '') { $CODE=$code2; } $ret = "<APPLET CODE=\"$CODE\" ARCHIVE=\"/$jdir/$code.jar\" WIDTH='$width' HEIGHT='$height'>\n"; foreach $key (keys(%$h pars)) { if($key ne "Code") { $val = $$h pars{$key}; $ret .= " <PARAM NAME=$key VALUE=\"$val\">\n"; } } $ret .= Lu("Java is not activated in this browser!|Dieser Browser hat Java nicht aktiviert!|Java n'est pas activé dans ce navigateur !|¡Java no está activado!"); $ret .= "</APPLET>"; return $ret;

}

$CdmlHash{JavaTest} = \&CdmlJavaTest; $CdmlHash{javatest} = \&CdmlJavaTest; sub CdmlJavaTest {

  my($body,$h pars)=@_;
  return CdmlJavaDir($body,$h pars,'java2');
}

$CdmlHash{Java}=\&CdmlJava; $CdmlHash{java}=\&CdmlJava;

sub CdmlJava {

  my($body,$h pars)=@_;
  HashAddContextDefaultsMissing($h pars,'cdml.java.defaults');
  return CdmlJavaDir($body,$h pars,'java');
}

sub TimeRetDayMonthYearWeekday {

  my ($ts)=@_;
  my (undef,undef,undef,$day,$month,$year,$wday) = TimeRetTimeClient($ts);
  $month++;
  $year+=1900;
  return ($day,$month,$year,$wday)
}

sub YearMonthAdd { # $_[0]=year $_[1]=month $_[2]=inc

  $_[1]+=$_[2];
  while($_[1]>12) {
    $_[0]++; $_[1]-=12;
  }
  while($_[1]<1) {
    $_[0]--; $_[1]+=12;
  }
}

sub YearMonthRetWeekday {

  my ($year,$month)=@_;
  my $ts=TimeAllRetTimeSec($year,$month,1,12,0);
  my (undef,undef,undef,$wday)=TimeRetDayMonthYearWeekday($ts);
  return $wday;
}

sub RunRetImageBar {

  my ($r,$height)=@_;
  my ($c,$col);
  $c=substr($r,0,1);
  if($c eq '1') {
    $col="cc3333";
  } elsif($c eq '9') {
    $col="666666";
  } else {
    $col="999999";
  }
  return ImageRetHtmlBar("/pixel/p_$col.gif",length($r),$height);
}

sub StrRetImageBar {

  my ($s,$height)=@_;
  my ($ret,$i,$c,$c1,$run,$rlen);
  my $slen=length($s);

for($i=0; $i<$slen; $i++) { $c=substr($s,$i,1); if($c ne $c1) { if($run ne '') { $ret.=RunRetImageBar($run,$height); $run=''; } } $run.=$c; $c1=$c; } if($run ne '') { $ret.=RunRetImageBar($run,$height); } return $ret;

}

sub HourMinRetInd {

  my ($hour,$min)=@_;
  my $ind;

if($hour>24) { $hour=24; } if($hour==24) { $min=0; } if($min>60) { $min=60; } $hour+=$min/60; $ind=int(2*$hour); return $ind;

}

sub PageRetDates {

  my ($page,$day,$nday)=@_;
  my (@ar,$line,$i,$i1,$i2);
  my $s=PageRetTextFast($page);
  my $cday=$day;
  my $h='999999999999000000000000000000000000000000009999';

if($day) { $ar[0]=$h; $cday=0; } else { for($i=0; $i<=$nday; $i++) { $ar[$i]=$h; } } foreach $line (split("\n",$s)) { if($day==0) { if($line =~ m/^=+\s*(\d+)/) { if($1<=$nday) { $cday=$1; } } } if($line =~ m/\*+\s*(\d+)\d+)\s*-\s*(\d+)\d+)/) { $i1=HourMinRetInd($1,$2); $i2=HourMinRetInd($3,$4); for($i=$i1; $i<=$i2; $i++) { substr($ar[$cday],$i,1)='1'; } } } return @ar;

}

sub PageYearMonthParsRetCalendar {

  my ($page,$year,$month,$h pars)=@_;
  my ($ret,$title,$body,$i,$ind,$day,$wday,$nday,$off,$mname,$lines,$cols,$wind,$ccol);
  my ($dday,$dpat,$dpage,@dar,$dlen,$tr1,$tr2,$trn,$page2);
  my ($cday,$cmonth,$cyear,$cwday) = TimeRetDayMonthYearWeekday($^T);
  my $scol=HvnRetVal($h pars,'lightorange','Untertitelhintergrund','subtitlebackground');
  my $tcol=HvnRetVal($h pars,'lightblue','Heutehintergrund','todaybackground');
  my $wcol=HvnRetVal($h pars,'lightgray','Wochenendehintergrund','weekendbackground');
  my $pat=HvnRetVal($h pars,'{page}/{year}{month}#{day}','Linkmuster','linkpattern');
  my $opt=HvnRetVal($h pars,'','Optionen','options');
  my $trange=HvnRetVal($h pars,'8:00-18:00','Zeitbereich','timerange');
  my $sflag= ($opt=~m/s/) ? 1 : 0;
  my $bardist=HvnRetVal($h pars,'2','Balkenabstand','bardistance');
  my $barheight=HvnRetVal($h pars,4,"Balkenhöhe",Unicode("Balkenhöhe"),'barheight');

if($trange =~ m/\s*(\d+)\d+)\s*-\s*(\d+)\d+)/) { $tr1=HourMinRetInd($1,$2); $tr2=HourMinRetInd($3,$4); } else { $tr1=HourMinRetInd(8,0); $tr2=HourMinRetInd(18,0); } $trn=$tr2-$tr1+1;

$pat=~ s/\{page\}/$page/; $pat=~ s/\{year\}/$year/; $month=sprintf("%02d",$month); $pat=~ s/\{month\}/$month/;

$nday=YearMonthRetLen($year,$month); $wday=YearMonthRetWeekday($year,$month); $off=($wday+6)%7;

if($sflag) { $dpat=$pat; $dpat=~ s/#.*//; if($dpat =~ m/\{day\}/) { for($day=1; $day<$nday; $day++) { $dpage=$dpat; $dpage=~ s/\{day\}/$day/; ($dar[$day])=PageRetDates($dpage,$day,$nday); } } else { @dar=PageRetDates($dpat,0,$nday); } }

$mname=MonthName($month-1); $title="$mname $year\@7c"; for($i=1; $i<=7; $i++) { if($i>1) { $body.=","; } $body.=DayNameShort($i)."\@c#$scol"; } $body.="\n"; $lines=0; $cols=0; for($ind=1; $ind<=42; $ind++) { $day=$ind-$off; $wind=$ind%7; $ccol=''; if($wind==6 || $wind==0) { $ccol=$wcol; } if($year==$cyear && $month==$cmonth && $day==$cday) { $ccol=$tcol; } if($day>0 && $day<=$nday) { $page2=$pat; $page2=~ s/\{day\}/$day/; $body.=ScriptPageRefLabelClassCompleteRetLink($ScriptName,$page2,'',$day,'body',1);

if($sflag) { $dday=substr($dar[$day],$tr1,$trn); $dlen=length($dday); if($dlen) { $body.=$br0.ImageRetHtmlBar("/pixel/p.gif",$dlen,$bardist); $body.=$br0.StrRetImageBar($dday,$barheight); } } } else { $body.=$n1; if($sflag) { $body.=$br0.ImageRetHtmlBar("/pixel/p.gif",1,$bardist); $body.=$br0.ImageRetHtmlBar("/pixel/p.gif",1,$barheight); } } $body.="\@c"; if($ccol ne '') { $body.="#$ccol"; } if($wind==0) { $body.="\n"; $lines++; $cols=0; } else { $body.=","; $cols++; } } if($cols) { $body.="\n"; $lines++; } if($lines<6) { $body.=",\n"; }

$ret=CdmlTable("$title\n$body",$h pars); return $ret;

}

$CdmlHash{Kalender}=\&CdmlCalendar; $CdmlHash{calendar}=\&CdmlCalendar;

sub CdmlCalendar {

  my($body, $h pars)=@_;
  HashAddContextDefaultsMissing($h pars,'cdml.calendar.defaults');
  my ($ret,$title,%pars,$key,$inc,$i,@ar,$qflag);
  my $page=HvnRetVal($h pars,$PageCur,'Seite','page');
  my $count=HvnRetVal($h pars,1,'Anzahl','count');
  my $ncol=HvnRetVal($h pars,3,'Spalten','columns');
  my ($cday,$cmonth,$cyear,$cwday) = TimeRetDayMonthYearWeekday($^T);
  my $year= HvnRetVal($h pars,$cyear,'Jahr','year');
  my $abstand=HvnRetVal($h pars,'','Abstand','distance');
  my $cpadding=HvnRetVal($h pars,'2','Kalenderluft','calendarpadding');

if($year<100) { $year+=2000; } my $month= HvnRetVal($h pars,$cmonth,'Monat','month'); if(($month eq '0') || ($month =~ m/^[\+\-]/)) { if($month=~m/q/) { $qflag++; } $inc=int($month); $month=$cmonth; YearMonthAdd($year,$month,$inc); if($qflag) { while($month%3!=1) { YearMonthAdd($year,$month,-1); } } }

%pars=('separator'=>',','formatseparator'=>'@','titlebackground'=>'orange','titlefont'=>'@4#black','markup'=>0,'textbackground'=>'hellgelb'); foreach $key (%$h pars) { $pars{$key}=$$h pars{$key}; } undef $pars{Abstand}; undef $pars{distance};

for($i=0; $i<$count; $i++) { $ar[$i]=PageYearMonthParsRetCalendar($page,$year,$month,\%pars); YearMonthAdd($year,$month,1); } if($count>1) { $ret="<table border='0' cellpadding='0' cellspacing=$cpadding width=1%><tr>"; $i=0; foreach (@ar) { $ret.="<td>$_</td>"; $i++; if($count>$ncol) { if($i>=$ncol) { $i=0; $ret.="</tr><tr>"; } } } $ret.="</tr></table>"; } else { $ret=$ar[0]; } if($abstand ne '') { TableCvtAbstandWidth($ret,$abstand,"100%"); } return $ret;

}

sub TaskTabAddPage {

  my ($a ar,$page)=@_;
  my $s=PageRetTextFast($page);
  my ($line,$task);

foreach $line (split("\n",$s)) { if($line =~ m/[:*]+\s*(\(.?\))(.*)/) { $task=join("|","0000",$2,$page,$line); push(@$a ar,$task); } }

}

$CdmlHash{Aufgaben}=\&CdmlTasks; $CdmlHash{tasks}=\&CdmlTasks;

sub CdmlTasks {

  my($body,$h pars)=@_;
  my ($ret,%pars,$key,$title,$tbody,@tar,@pages,$page,$i,$gain,$cost,$task,$pri,$proj,$skey);
  my $count=HvnRetVal($h pars,50,'Anzahl','count');
  my ($cday,$cmonth,$cyear,$cwday) = TimeRetDayMonthYearWeekday($^T);
  my $sep="//";

@pages=WikiRetPageList(); foreach $page (@pages) { if($page =~ m#^$PageCur/#) { TaskTabAddPage(\@tar,$page); } }

$title=Lu("Tasks|Aufgaben").$sep.LiProject().$sep."Pri".$sep.Lu("Gain|Nutzen").$sep.Lu("Costs|Kosten");

LOOP TASK:
  foreach $task (sort @tar) {
    ($skey,$task,$proj,$pri,$gain,$cost)=split(/\|/,$task);
    $tbody.=join("//",$task,$proj,$pri,$gain,$cost)."\n";
    if(++$i >= $count) {
      last LOOP TASK;
    }
  }

%pars=('formatseparator'=>'@','separator'=>$sep,'titlebackground'=>'lightblue', 'linewidth'=>1,'linecolor'=>'white','padding'=>5, 'markup'=>0,'textbackground'=>'lightgray','distance'=>20 ); foreach $key (%$h pars) { $pars{$key}=$$h pars{$key}; } $ret=CdmlTable("$title\n$tbody",\%pars); return $ret;

}

$CdmlHash{Link}=\&CdmlLink; $CdmlHash{link}=\&CdmlLink;

sub CdmlLink {

  my($body, $h pars)=@_;
  HashAddContextDefaultsMissing($h pars,'cdml.link.defaults');
  my $url= HvnRetVal($h pars,'','Url','url');
  my $target= HvnRetVal($h pars,'','Fenster','window');
  my $title= HvnRetVal($h pars,'','Titel','title');
  my $par=HvnRetVal($h pars,'','Parameter','parameter');
  my ($ret,$hidden);
  my $image=HvnRetVal($h pars,'','Bild','image');
  my $icon=HvnRetVal($h pars,'','Icon','icon');

if($url eq '') { return Lu('[link lacks url-parameter]|[Link mit fehlendem Url-Parameter]|[le lien manque un paramètre-url]|[enlace sin URL-parámetro]'); } if($target ne '') { if(($target eq 'new') || ($target eq 'neu')) { $target='_blank'; } } if($par ne '') { my $val = RetParam($par); $url =~ s/@/$val/g; } if($url =~ m/^$UrlPattern$/) { # url ok if($ShowHiddenLinks) { $hidden=" ($url)"; } } elsif($url =~ m/^ Upload:(.*)$/) { $url="$UploadUrl/$1"; } elsif($url =~ m/^DiesesWiki:(.*)$/) { $url="$ScriptUrl?$1"; } elsif($url =~ m/^ThisWiki:(.*)$/) { $url="$ScriptUrl?$1"; } elsif($url =~ m/^$InterWebPattern$/) { $url=InterWikiPageRetUrl($url); } else { return Lu('[link has an invalid url-parameter]|[Link mit ungültigem Url-Parameter-Wert]|[le lien a un paramètre-url invalide]|[enlace con un parámetro inválido]'); } if($image ne '') { $image =~ s/\.(DECLARE)?IMAGE$//; $body=ImageUrlRetHtml($image); } elsif ($icon ne '') { $body=Icon($icon); } return UrlLabelClassTitleTargetRetLink($url,$body,'body',$title,$target);

}

sub ValDefault {

  my($val,$object)=@_;
  if($val eq '') {
    return $object;
  }
  return $val;
}

sub WikiGetPagesAll {

  my($a pages)=@_;
  my $page;

PageIndexInit(); foreach $page (keys %PageIndex) { push(@$a pages,$page); }

}

sub VidaInitPageArray {

  my ($a pages)=@_;

if($VidaInit==0) { #FIXME: secure against context switch VidaAppPageListPlus(\@Vida,$a pages,0,0); $VidaInit=1; }

}

sub VidaInitIndex {

  my @pages;
  WikiGetPagesAll(\@pages);
  VidaInitPageArray(\@pages);
}

sub VidaInitPage {

  my($id)=@_;
  my @pages=($id);
  VidaInitPageArray(\@pages);
}

sub VidaHashHashInitVar {

  my ($var)=@_;
  my ($val,%vida,$fnam,$h cache);

$h cache=$VidaHashHash{$var}; if(!defined($h cache)) { %vida=(); $h cache=\%vida; $fnam="$DataDir/vida/$var.lvd"; LogFileGetHash Type($fnam,$h cache); $VidaHashHash{$var}=$h cache; }

}

sub VidaCacheVarRetPages {

  my ($var)=@_;
  VidaHashHashInitVar($var);
  my $h cache=$VidaHashHash{$var};
  return sort keys %$h cache;
}

sub VidaCachePageVarRetVal {

  my ($id,$var)=@_;
  my ($val,%vida,$fnam,$h cache);

VidaHashHashInitVar($var); $h cache=$VidaHashHash{$var}; $val=$$h cache{$id}; return $val;

}

sub PageVarRetVal {

  my($id,$var)=@_;
  my($val,$fnam,%vida);

if($VidaCaching) { $val=VidaCachePageVarRetVal($id,$var); } else { VidaInitPage($id); $val=VidaVarRetVal(\@Vida,$var); } return $val;

}

sub PageVarRetValDefault {

  my($id,$var,$object)=@_;
  my $val=PageVarRetVal($id,$var);
  return ValDefault($val,$object);
}

$CdmlHash{Anzeige}=\&CdmlDisplay; $CdmlHash{display}=\&CdmlDisplay;

sub CdmlDisplay {

  my($body,$h pars)=@_;
  HashAddContextDefaultsMissing($h pars,'cdml.display.defaults');
  my $var0=HvnRetVal($h pars,'','Variable','variable');
  my $type=HvnRetVal($h pars,'',"Typ",'type');
  my $var=substr($var0,1,100);
  my $select=HvnSelect($h pars);
  my $filter=HvnFilter($h pars);
  my ($title,$tbody,$key,$i,@ar,%pars,$val);

InterWebInit();

$title="Variable $var0:"; if($var0 =~ m/%/ ) { foreach $key (sort keys %$var) { push(@ar,"$key => $$var{$key}"); } } elsif($var0 =~ m/@/ ) { for($i=0; $i<= $#$var; $i++) { push(@ar,"[$i] = $$var[$i]"); } } else { if(!($var0 =~ m/\$/)) { $var=$var0; } if($var =~ m/vida\.(.*)/) { $var=$1; $val=PageVarRetValDefault($PageCur,$var,$n1); } elsif($var =~ m/\./) { $val=ContextVarRetDefault($var,$n1); } else { $val=$$var; } push(@ar,$val); } if($filter ne '') { @ar=ArrayStrFilterRegex(\@ar,$filter,1,1); } if($select ne '') { @ar=ArrayStrFilterRegex(\@ar,$select,0,1); } if(StrEquList($type,'Text','inline')) { return join(" ",@ar); } $tbody=" ".join("\n ",@ar); %pars=( 'separator'=>'//@#0815#', 'distance'=>0, 'titlebackground'=>'gelb', 'titlefont'=>'@#black', 'markup'=>0, 'textbackground'=>'hellgelb', 'width'=>300, 'formatseparator'=>'@#7751#'); foreach $key (%$h pars) { $pars{$key}=$$h pars{$key}; } return CdmlTable($title."\n".$tbody,\%pars);

}

$CdmlHash{Hotspots}=\&CdmlHotspots; $CdmlHash{hotspots}=\&CdmlHotspots; sub CdmlHotspots {

  my($body,$h pars)=@_;
  HashAddContextDefaultsMissing($h pars,'cdml.hotspots.defaults');
  my $anzahl=HvnRetVal($h pars,10,'Anzahl','count');
  my $amp=HvnRetVal($h pars,200,'Amplitude','amplitude');
  my ($i,@tab,$line,$page,$count,%pars,$scale,$hcount,$im,$wcount);
  my ($loop,$text,$age,$key);
  my $fnam="$DataDir/hotspots";

if(!(-f $fnam)) { goto do build; }

do restart:
  @tab=FileSepRetArray($fnam,"\n");

$age=$^T - $tab[0]; my $refage=$HotspotDelta*0.9 + rand($HotspotDelta*0.2); if($age > $refage) {

do build:
    WikiBuildHotspotFile(0);
    if($loop<1) {
      $loop++;
      goto do restart;
    }
  }

my $deft=Lu("main focus (age: {age} seconds)\@2|Brennpunkte des Interesses (Alter: {age} Sekunden)\@2|principal focus (age : {age} secondes\@2"); my $titel=HvnRetVal($h pars,$deft,"Titel",'title'); $titel =~ s/\{age\}/$age/;

if($anzahl>20) { $anzahl=20; }

for($i=1; $i<=$anzahl; $i++) { $line=$tab[$i]; ($page,$count,$wcount)=split(",",$line); if($i==1) { $hcount=$count; } if($page ne '') { $im = ImageRetHtmlBar('/pixel/p1rot.gif',int(1+$amp*$wcount/$hcount),12) . ImageRetHtmlBar('/pixel/p1blau.gif',int(1+$amp*$count/$hcount),12); if($page =~ m/>$/) { $anzahl++; } else { $text.= "{{$page}},$im\n"; } } } %pars=('Texthintergrund'=>'weiß', 'Abstand' =>'-', 'Formatzeichen'=>'@', 'separator'=>',' ); HashAddHash(\%pars,$h pars); foreach $key (%$h pars) { $pars{$key}=$$h pars{$key}; } $titel =~ s/ / /g ; return CdmlTable("$titel\n".$text,\%pars);

}

$CdmlHash{Luft} = \&CdmlPadding; $CdmlHash{padding} = \&CdmlPadding; sub CdmlPadding {

  my($body, $h pars)=@_;
  my $width=HvnWidth($h pars,1);
  my $height=HvnHeight($h pars,1);
  return HtmlLuft($width,$height);
}

]