<?php
//
// in this file are most of the functions that build my pages
//

/*

    This file was written by Thorsten Gunkel <tgunkel-lists@tgunkel.de> to create
    most pages of <url:http://www.tgunkel.de>.
    Copyright (C) 2003-2010 Thorsten Gunkel

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation version 2 of the License.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

*/


// import other functions
require_once("small_helpers.php");
require_once(
"page_ids.php");

require_once(
"text.de.php");
require_once(
"text.en.php");
require_once(
"text.fr.php");

// take a string, reduze line breaks and add spaces after each line
function get_pp_paragraph($text,$spacenr)
{
  
$text=get_fixed_line_break($text);
  
$text=get_spaces($spacenr).replace_line_break($text,"\n".get_spaces($spacenr));
  
$text.="\n";
  
$text=replace_pos1($text);
  return 
$text;
}

// take a file with path and tell me how to travel back
function calc_backpfad($zielpfad)
{
  
// replace abc/ with ../
  
return preg_replace('/[^\/]*\//'"../"$zielpfad);
}

// replace '_REPLACE_LANG_' with $lang
function replace_lang($text,$lang)
{
   return 
preg_replace('/_REPLACE_LANG_/'$lang$text);
}

/** Expects a string and if you are currently replacing or not
 *  Reads untils replacing mode should change
 *  Returns string until then
 *  Parameter $text will contains rest of your string (which still needs parsing) *  Parameter $replace_on will contain mode you should use after the current string
 *
 * _REPLACE_OFF_ disables this, _REPLACE_ON_ turns it back on
 */
function get_replace_on_off(&$text, &$replace_on)
{

 if (
$replace_on==true)
   {
     
$tmp_res=explode('_REPLACE_OFF_'$text2);
     if(
count($tmp_res)>0)
        
$result=$tmp_res[0];
     else
        
$result='';

     if(
count($tmp_res)>1)
        
$text=$tmp_res[1];
     else
        
$text='';

     if (
$text!=''$replace_on=false;
   }
 else if(
$replace_on==false)
   {
     
$tmp_res explode('_REPLACE_ON_'$text2);
     if(
count($tmp_res)>0)
        
$result=$tmp_res[0];
     else
        
$result='';

     if(
count($tmp_res)>1)
        
$text=$tmp_res[1];
     else
        
$text='';

     if (
$text!=''$replace_on=true;     
   }
 return 
$result;
}

// replace '/_REPLACE_BACKPFAD_/' with $backpfad (path back to /)
function replace_backpfad($text,$backpfad)
{
   return 
preg_replace('/_REPLACE_BACKPFAD_/'$backpfad$text);
}

// replace '/_REPLACE_THISPAGE_/' with $backpfad (path back to /) + provided path + page
function replace_thispage($text,$backpfad,$newpath,$file_dest)
{
   return 
preg_replace('/_REPLACE_THISPAGE_/'$backpfad.$newpath.$file_dest$text);
}

// replace '/_REPLACE_HEREPFAD_/' with $backpfad (path back to /) + provided path
function replace_herepfad($text,$backpfad,$newpath)
{
   return 
preg_replace('/_REPLACE_HEREPFAD_/'$backpfad.$newpath$text);
}

// replace '/^     _REPLACE_POS1_/' with ''
function replace_pos1($text)
{
   
$text=preg_replace("/\n\ *_REPLACE_POS1_/""\n"$text);
   
$text=preg_replace("/\ *_REPLACE_POS1_/""\n"$text);
   return 
$text;
}

// replace '_INSERT_FILE_"FILENAME"' with the content of FILENAME
function replace_incfile($text,$oldname,$sprache,$backpfad,&$replace_on,$path2page,$file_dest)
{
  
// replace '_INSERT_FILE_"DATEINAME"_'
  
$matchpretxt='_INSERT_FILE_"'$matchmidtxt='[^"]*'$matchpsttxt='"_';
  
$matchtxt=$matchpretxt.$matchmidtxt.$matchpsttxt;
  if (
ereg($matchtxt$text$treffer))
    {
      
$datein=$treffer[0];
      
$datein=ereg_replace($matchpretxt,'',$datein);
      
$datein=ereg_replace($matchpsttxt,'',$datein);
      
$datein=get_pathoffile($oldname).$datein;
      
$newtxt=read_file($datein,$sprache,$backpfad,$replace_on$path2page$file_dest);
      
$newtxt="\n".$newtxt;
      
$text=ereg_replace($matchtxt,$newtxt,$text);
    }
  return 
$text;
}

// get attribute to set the language for an (html) element
function get_lang_attr($lang)
{
 switch (
$lang)
   {
   case 
'en':
     return 
' lang="en" xml:lang="en"';
     break;
   case 
'de':
     return 
' lang="de" xml:lang="de"';
     break;
   case 
'fr':
     return 
' lang="fr" xml:lang="fr"';
     break;
   }
}

// insert html header
function show_header_pre($meatstr,$titel,$backpfad,$lang,$id,$title_addon)
{
 echo 
'<?xml version="1.0" encoding="utf-8"?>',"\n";
 echo 
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',"\n";
 echo 
'  <html xmlns="http://www.w3.org/1999/xhtml"';
 echo 
get_lang_attr($lang);
 echo 
'>',"\n";

 echo 
'    <head>',"\n";

 
// insert used language
 
switch ($lang)
   {
   case 
'en':
     echo 
'      <meta http-equiv="Content-Language" content="en" />',"\n";
     break;
   case 
'de':
     echo 
'      <meta http-equiv="Content-Language" content="de" />',"\n";
     break;
   case 
'fr':
     echo 
'      <meta http-equiv="Content-Language" content="fr" />',"\n";
     break;
   }
 
// insert meta lines
 
if ((count($meatstr)>1) || ($meatstr!=''))
   {
     for (
$i1=0$i1<count($meatstr); $i1++)
       {
         echo 
'      ',get_fixed_line_break($meatstr[$i1]),"\n";
       }
   }

 
// build title
 
foreach($title_addon as $tmp_title_add)
   {
     
$titel.=' :: '.$tmp_title_add;
   }

 echo 
'      <title>',$titel,'</title>',"\n";
 echo 
'      <link rel="SHORTCUT ICON"                      href="',$backpfad,'favicon.ico" />',"\n";
 echo 
'      <link rel="stylesheet" type="text/css"         href="',$backpfad,'lay_main.css" />',"\n";
 echo 
"\n";
 echo 
'      <!-- Extra style sheet for old and broken IEs-->',"\n";
 echo 
'      <!--[if lt IE 7]>',"\n";
 echo 
'      <link rel="stylesheet" type="text/css"         href="',$backpfad,'lay_main_ie6andbelow.css" />',"\n";
 echo 
'      <![endif]-->',"\n";
 echo 
"\n";
 echo 
'      <!--[if IE 7]>',"\n";
 echo 
'      <link rel="stylesheet" type="text/css"         href="',$backpfad,'lay_main_ie7.css" />',"\n";
 echo 
'      <![endif]-->',"\n";
 echo 
"\n";
 echo 
'    </head>',"\n";
 echo 
'  <body>',"\n";

 echo 
'  <!-- Page-ID: ',$id,' -->',"\n";
 echo 
'  <div id="Seite">',"\n";
 echo 
"\n"
}

// insert html header
function show_header_post()
{
  
//echo '  </div>',"\n";
  
echo '  </div>',"\n";
  echo 
'  <!-- Seitenende -->',"\n";
  echo 
'  </body>',"\n";
  echo 
'</html>',"\n";
}



// build the above half of my page
function show_oben_pre()
{
 echo 
'        <!-- oben -->',"\n";
 echo 
'        <div id="Main_Oben">',"\n";
}

// build the above half of my page
function show_oben_post()
{
 echo 
'        </div>',"\n";
 echo 
'        <!-- oben -->',"\n";
 echo 
"\n";
}

// build the content of the above half of my page
function show_oben_inhalt($inhalt_oben_text)
 {
   echo 
get_pp_paragraph($inhalt_oben_text,8+1);
 }

// this function saves the table of contents and returns it if asked
// in_val=level of entry  in_txt=describing text  in_link=link to destination
function access_inhalt($mode,$in_val,$in_txt,$in_link)
{
  static 
$inhaltsvz=array();
  switch (
$mode)
    {
    
// Return the content
    
case "get_val":
      
$ergb=$inhaltsvz;
      break;
    
// HTML Link Target
    
case "get_htmltarget":
      
$ergb='<h'.$in_val.'>'.'<a href="#h'.$in_val.'-'.access_inhalt("get_autlnk","","",$in_link).'" name="h'.$in_val.'-'.access_inhalt("get_autlnk","","",$in_link).'" id="h'.$in_val.'-'.access_inhalt("get_autlnk","","",$in_link).'">'.$in_txt.'</a>'.'</h'.$in_val.'>';
      break;
    
// HTML Link (without target)
    
case "get_htmllink":
      
$ergb='<a href="#h'.$in_val.'-'.$in_link.'">'.$in_txt.'</a>';
      break;
    
// Update the content
    
case "update_val":
      
$in_link=access_inhalt("get_autlnk","","",$in_link);
      
$tmp_val=array($in_val,strip_tags($in_txt),$in_link);
      
$inhaltsvz[]=$tmp_val;
      
$ergb='';
      break;
    
// Return autogenerated link-target
    
case "get_autlnk":
      
// 1. Remove all tags, then replace everything but standard letters and numbers with '_'
      
$ergb=preg_replace("/[^A-Za-z0-9\_\-]/","_",strip_tags($in_link));
      break;
    
// reset content
    
case "reset":
      unset (
$inhaltsvz);
      
$inhaltsvz=array();
      
$ergb='';
      break;
    default:
      
$ergb='';
      exit(
"Invalid Parameter for access_inhalt");
    }
  return 
$ergb;
}

// show a flag
function get_flag_image($backpfad$lang)
 {
   switch(
$lang)
   {
    case    
'de':
     return 
'<img src="'.$backpfad.'logos/flagge_de" alt="Deutsch"           title="Deutsch"           />';
    break;
    case    
'en':
     return 
'<img src="'.$backpfad.'logos/flagge_en" alt="English"           title="English"           />';
    break;
    case    
'fr':
     return 
'<img src="'.$backpfad.'logos/flagge_fr" alt="Fran&ccedil;ais"   title="Fran&ccedil;ais"   />';
    break;
    default:
     return 
'<img src="'.$backpfad.'logos/flagge_xx" alt="FIXME broken lang" title="FIXME broken lang" />';
    break;
   }
 }

function 
get_Kopf_pre()
{
  echo 
'      <!-- KopfEintrag -->'."\n";
  echo 
'      <div class="KopfEintrag">'."\n";
}

function 
get_Kopf_post()
{
  echo 
'      </div>'."\n";
  echo 
'      <!-- KopfEintrag -->'."\n";
}

// Get a list of all links to jump to on the local site
function getSprungNavigation($sprache$indent)
{
 global 
$extra_text;
 echo 
$indent.'<div class="JumpToBox">'."\n";
 echo 
$indent.$extra_text[$sprache][0]."\n";

 
$ankerliste=access_inhalt('get_val',null,null,null);
 if (
count($ankerliste)>0)
 {
  echo 
$indent.' <ul>'."\n";
  foreach(
$ankerliste as $x)
  {
    echo 
$indent.'  <li class="JumpToBoxEntry';
    if(
$x[0]>=&& $x[0]<=3) echo $x[0];
    else echo 
'4p';
    echo 
'">';
    echo 
access_inhalt('get_htmllink',$x[0],$x[1],$x[2]);
    echo 
'</li>'."\n";
  }
  echo 
$indent.' </ul>'."\n";
 }
 echo 
$indent.'</div>'."\n";
}

function 
getFeedbackForm($sprache$indent$id$backpfad$zielpfad$destname)
{
 global 
$extra_text;

 
get_Kopf_pre();
 echo 
$indent.'<div class="FeedbackBox">'."\n";
 echo 
$indent.' '.$extra_text[$sprache][1].': '."\n";

 echo 
$indent.' '.'<form action="',$backpfad,'vote/vote.php" method="post">'."\n";
 echo 
$indent.'  '.'<div>'."\n";

 echo 
$indent.'   '.'<fieldset>'."\n";
 echo 
$indent.'    '.'<legend>'.$extra_text[$sprache][2].'</legend>'."\n";
 echo 
$indent.'    '.'<input type="radio" name="wahlstring" value="3,"                   /><img class="imgnobrd" src="',$backpfad,'vote/vote.php?mode=getpic&amp;voteid=',$id,'&amp;wahlstring=3," alt="vote3" /> '.$extra_text[$sprache][3].'<br />'."\n";
 echo 
$indent.'    '.'<input type="radio" name="wahlstring" value="2," checked="checked" /><img class="imgnobrd" src="',$backpfad,'vote/vote.php?mode=getpic&amp;voteid=',$id,'&amp;wahlstring=2," alt="vote2" /> '.$extra_text[$sprache][4].'<br />'."\n";
 echo 
$indent.'    '.'<input type="radio" name="wahlstring" value="1,"                   /><img class="imgnobrd" src="',$backpfad,'vote/vote.php?mode=getpic&amp;voteid=',$id,'&amp;wahlstring=1," alt="vote1" /> '.$extra_text[$sprache][5].'<br />'."\n";
 echo 
$indent.'   '.'</fieldset>'."\n";

 echo 
$indent.'   '.$extra_text[$sprache][6].'<br />'."\n";
 echo 
$indent.'   '.'<textarea name="f_comment" cols="50" rows="5"></textarea><br />'."\n";

 echo 
$indent.'   '.$extra_text[$sprache][7].'<br />'."\n";
 echo 
$indent.'   '.'<input name="f_email" type="text" value="" size="25" maxlength="40" /><br />'."\n";

 echo 
$indent.'   '.$extra_text[$sprache][8].'<br />'."\n";
 echo 
$indent.'   '.'<input name="f_name" type="text" value="" size="20" maxlength="50" /><br />'."\n";

 echo 
$indent.'   '.'<input type="hidden" name="mode" value="newvote" />';
 echo 
$indent.'   '.'<input type="hidden" name="voteid" value="',$id,'" />';
 echo 
$indent.'   '.'<input type="hidden" name="destfile" value="',$zielpfad.replace_lang($destname,$sprache),'" />';
 echo 
$indent.'   '.'<span class="venusfalle">Do <em>not change</em> this: <input type="text"   name="url"      size="10" maxlength="250" value="http://"/></span>';
 echo 
$indent.'   '.'<input type="submit" value="'.$extra_text[$sprache][9].'" />'."\n";
 echo 
$indent.'  '.'</div>'."\n";
 echo 
$indent.' '.'</form>',"\n";

 echo 
$indent.' '.'<img src="'.$backpfad.'logos/thumbsUpDown" alt="Feedback" />'."\n";

 echo 
$indent.'</div>'."\n";
 
get_Kopf_post();
}

// Navigation box at the top of the page
function show_top_navi($sprache,$backpfad,$destname,$id,$impressum)
{
  echo 
'     <!-- Die obere Leiste -->',"\n";
  echo 
'     <div id="Kopfleiste">',"\n";

  
$zielpfad=get_id_dir_dst($id);

  
get_Kopf_pre();
  
// Links to different language versions
  
switch ($sprache)
    {
    case 
'en':
      if (
get_id_lang_included($id,"de")) { echo '        <a class="Navi_Sprachen_passiv" href="'.$backpfad.$zielpfad.replace_lang($destname,"de").'"'.get_lang_attr('de').' hreflang="de" >'.get_flag_image($backpfad,'de').'</a>'."\n";          }
      if (
get_id_lang_included($id,"en")) { echo '        <a id="Navi_Sprachen_aktiv"     href="'.$backpfad.$zielpfad.replace_lang($destname,"en").'"'.'>'.get_flag_image($backpfad,'en').'</a>'."\n";                                    }
      if (
get_id_lang_included($id,"fr")) { echo '        <a class="Navi_Sprachen_passiv" href="'.$backpfad.$zielpfad.replace_lang($destname,"fr").'"'.get_lang_attr('fr').' hreflang="fr" >'.get_flag_image($backpfad,'fr').'</a>'."\n";  }
      break;
    case 
'de':
      if (
get_id_lang_included($id,"de")) { echo '        <a id="Navi_Sprachen_aktiv"     href="'.$backpfad.$zielpfad.replace_lang($destname,"de").'"'.'>'.get_flag_image($backpfad,'de').'</a>'."\n";                                    }
      if (
get_id_lang_included($id,"en")) { echo '        <a class="Navi_Sprachen_passiv" href="'.$backpfad.$zielpfad.replace_lang($destname,"en").'"'.get_lang_attr('en').' hreflang="en" >'.get_flag_image($backpfad,'en').'</a>'."\n";          }
      if (
get_id_lang_included($id,"fr")) { echo '        <a class="Navi_Sprachen_passiv" href="'.$backpfad.$zielpfad.replace_lang($destname,"fr").'"'.get_lang_attr('fr').' hreflang="fr" >'.get_flag_image($backpfad,'fr').'</a>'."\n";  }
      break;
    case 
'fr':
      if (
get_id_lang_included($id,"de")) { echo '        <a class="Navi_Sprachen_passiv" href="'.$backpfad.$zielpfad.replace_lang($destname,"de").'"'.get_lang_attr('de').' hreflang="de" >'.get_flag_image($backpfad,'de').'</a>'."\n"; }
      if (
get_id_lang_included($id,"en")) { echo '        <a class="Navi_Sprachen_passiv" href="'.$backpfad.$zielpfad.replace_lang($destname,"en").'"'.get_lang_attr('en').' hreflang="en" >'.get_flag_image($backpfad,'en').'</a>'."\n"; }
      if (
get_id_lang_included($id,"fr")) { echo '        <a id="Navi_Sprachen_aktiv"     href="'.$backpfad.$zielpfad.replace_lang($destname,"fr").'"'.'>'.get_flag_image($backpfad,'fr').'</a>'."\n";                   }
      break;    
    }
  
get_Kopf_post();

  
// Anker Navigation
  
get_Kopf_pre();
  
getSprungNavigation($sprache'       ');
  
get_Kopf_post();

  
// Impressum
  
get_Kopf_pre();
  echo 
'      <a href="';
  echo 
get_complete_path2file_from_id2id($id,'impressum',$sprache);
  echo 
'">';
  echo 
get_title('impressum',$sprache,$backpfad);
  echo 
'</a>';
  echo 
"\n";
  
get_Kopf_post();

  
// Feedback
  
getFeedbackForm($sprache'       '$id$backpfad,$zielpfad$destname);


  
// Suche
  
get_Kopf_pre();
  echo 
'       ';
  switch (
$sprache)
  {
   case 
'de': echo 'Suchen';       break;
   case 
'fr': echo 'Recherche';    break;
   case 
'en':
   default:
              echo 
'Search';       break;
  }
  echo 
"\n";
  echo 
'       '.'<form style="display:inline;" method="get" action="http://www.google.com/search">'."\n";
  echo 
'       '.'  <div style="display:inline;">'."\n";
  echo 
'       '.' <input type="hidden" name="ie" value="UTF-8" />'."\n";
  echo 
'       '.' <input type="hidden" name="oe" value="UTF-8" />'."\n";
  echo 
'       '.' <input type="text"   name="q"    size="15" maxlength="255" value="" />'."\n";
  echo 
'       '.' <input type="hidden" name="sitesearch"     value="tgunkel.de" />'."\n";
  echo 
'       '.' <input type="hidden" name="domains"        value="tgunkel.de" />'."\n";
  echo 
'       '.' <input type="submit" name="btnG"           value="ok" />'."\n";
  echo 
'       '.' </div>'."\n";
  echo 
'       '.'</form>'."\n";
  
get_Kopf_post();

  echo 
'     <br />'."\n";
  echo 
'    </div>'."\n";
  echo 
'    <!-- Ende die obere Leiste -->'."\n";
  echo 
"\n";
}

// does this group has more entries than your id?
function group_has_other_entries($id_from_group$group)
{
 
// for all ids ...
 
foreach(get_data_page_ids() as $page_id => $page_data)
 {
  
// is this another id ...
  
if($id_from_group!=$page_id)
  {
   
// in the same group ...
   
$cur_group=$page_data['group'];
   do
   {
    if(
$cur_group==$group)
    {
      return 
true;
    }
    
$cur_group=get_group_parent($cur_group);
   } while(
$cur_group!='');
  }
 }
 return 
false;
}

function 
show_nav_subtree_element_open($id$isGroup$startid$related_groups$indent$sprache$group$backpfad)
{
  echo 
$indent.'<li>';

  if(
$isGroup)
  {
    
$lClass=(in_array($group$related_groups)) ? "NavDirAct" "NavDirInAct";
  }
  else
  {    
    
$lClass=($id==$startid) ? 'NavPagAct' 'NavPagInAct';
  }

  
$no_content=get_no_content($id);
  
$link_tag=(!$no_content) ? 'a' 'span';

  if (
get_id_lang_included($id$sprache))
  {
    echo 
'<'.$link_tag.' ';
    echo 
'class="'.$lClass.'" ';
    if(!
$no_content) echo 'href="'.get_complete_path2file_from_id2id($startid,$id,$sprache).'"';
    echo 
'>';
    echo 
get_title($id,$sprache,$backpfad);
    echo 
'</'.$link_tag.'>';
  }
  else
  {
    
$i=0;
    foreach(
get_id_lang($id) as $cur_lang)
    {
     
// Put the following in an extra line so it's easy to skip for the spell checker
     
if($i>0) echo '<br />';
     echo 
"\n".'<span class="ForeignLang_'.$cur_lang.'">';
     echo 
'<'.$link_tag.' class="'.$lClass.'"';
     if(!
$no_content) echo ' href="'.get_complete_path2file_from_id2id($startid,$id,$cur_lang).'"';
     echo 
'>';
     echo 
get_flag_image($backpfad,$cur_lang);
     echo 
get_title($id,$cur_lang,$backpfad).'</'.$link_tag.'>';
     echo 
'</span>';
     
$i++;
    }
    echo 
"\n";

  }

  if(
$isGroup && group_has_other_entries($id$group))
  {
    echo 
"\n".$indent.'  '.'<ul>'."\n";
  }
}

function 
show_nav_subtree_element_close($id$isGroup$startid$related_groups$indent$sprache$group$backpfad)
{
  if(
$isGroup && group_has_other_entries($id$group))
  {
    echo 
$indent.'  '.'</ul>'."\n".$indent;
  }
  echo 
'</li>'."\n";
}

// Make navigation box for one subgroup
function show_nav_subtree($group$startid$related_groups$indent$sprache$backpfad)
{
  
$def_id=get_default_id_for_group($group);

  
show_nav_subtree_element_open($def_idtrue$startid$related_groups$indent$sprache$group$backpfad);

  foreach(
get_id_groupmembers($group) as $i)
  {
    if(
$i<>$def_id)
    {
      
show_nav_subtree_element_open($ifalse$startid$related_groups$indent.'   '$sprache$group$backpfad);
      
show_nav_subtree_element_close($ifalse$startid$related_groups$indent.'   '$sprache$group$backpfad);
    }
  }
  foreach(
get_group_childs($group) as $group_child)
  {
    
show_nav_subtree($group_child$startid$related_groups$indent.'   '$sprache$backpfad);
  }

  
show_nav_subtree_element_close($def_idtrue$startid$related_groups$indent$sprache$group$backpfad);
}

// Make navigation box
function show_navispalte($sprache,$backpfad,$destname,$id,$impressum,$no_content)
{
  global 
$extra_text;
  
$indent='        ';
  echo 
$indent.'<!-- NavLeiste -->'."\n";
  echo 
$indent.'<div id="NavLeiste">'."\n";
  echo 
$indent;
  echo 
access_inhalt("get_htmltarget",2,$extra_text[$sprache][10],'sitewidenavigation');

  echo 
$indent.' '.'<ul>'."\n";

  
$groups_we_are_related_to=array();

  
// get group of our page id
  
$cur_group=get_id_group($id);

  
// walk back to the top
  
while(true)
  {
    if(
$cur_group!='')
    {
      
$groups_we_are_related_to[]=$cur_group;
    }
    
$next_group=get_group_parent($cur_group);
    if(
$next_group=='') break;
    
$cur_group=$next_group;
  }

  
show_nav_subtree($cur_group$id$groups_we_are_related_to$indent.'  ',$sprache$backpfad);

  echo 
$indent.' '.'</ul>'."\n";

  echo 
$indent.'</div>'."\n";
  echo 
$indent.'<!-- Ende NavLeiste -->'."\n"."\n";
}

// takes current id and id you want to go, returns complete filename/url to it
function get_complete_path2file_from_id2id($cur_id,$dest_id,$lang)
{
  
$ergb='';
  
// Are both IDs on the same page?
  
$cur_site=get_id_site($cur_id);
  
$dest_site=get_id_site($dest_id);
  if (
$cur_site==$dest_site)
    {
      
$ergb.=calc_backpfad(get_id_dir_dst($cur_id),$lang);;
    }
  else
    {
      
$ergb.=get_site_url_pre($dest_site);
    }
  
$ergb.=get_id_dir_dst($dest_id);
  
$ergb.=replace_lang(get_id_file_dst($dest_id),$lang);
  return 
$ergb;
}

// show navigation from the viewpoint of id
function show_navigation($viewer_id,$lang,$backpfad)
{
  
show_navigation_rec("head",$viewer_id,$lang,$backpfad);
}

// show navigation for all ids of the current group and inspect recursivly the child-groups
function show_navigation_rec($group,$viewer_id,$lang,$backpfad)
{
  
$depth=get_group_depth($group);

  
// force depth to a sane value
  
if ($depth<0$depth=0;
  if (
$depth>5$depth=5;
  
$depth=(int)($depth);

  
// indent source-code
  
$pre_strg=""; for ($i1=0$i1<$depth$i1++) { $pre_strg.=" "; }

  
// Print Groupheader
  
echo $pre_strg,'         <!-- Navigation Header -->',"\n";

  
// Show group header
  
if (get_id_group($viewer_id)==$group)
    {
      
// our viewer_id is in this group
      
echo $pre_strg,'         <div id="Navigation_Mitte_cur_title"';
    }
  else
    {
      if (!
get_is_group_child_of_group(get_id_group($viewer_id),$group))
        {
          echo 
$pre_strg,'         <div class="Navigation_Mitte_other_title"';
        }
      else
        {
          echo 
$pre_strg,'         <div class="Navigation_Mitte_other_title_focused"';
        }
    }
  echo 
' style="padding-left:',$depth/2,'em;">',"\n";

  
// Show 
  
if ($group=='head')
    {
      echo 
'           '.'<h2>';
      switch (
$lang)
        {
        case 
'de':
          echo 
'Inhalt';
          break;
        case 
'en':
          echo 
'Contents';
          break;
        case 
'fr':
          echo 
'Contenu';
          break;          
        }
      echo 
'</h2>'."\n";
    }

  
// each group has a default site which we will link here:
  // linkname==groupname, linkdestination=defaultsite
  // (only if the user does not already view this page)
  
$group_default_id=get_default_id_for_group($group);
  if (
$viewer_id!=$group_default_id)
    {
      
//echo '           '.'<a href="'.$backpfad.get_id_dir_dst($group_default_id).replace_lang(get_id_file_dst($group_default_id),$lang).'">'.get_group_desc($group,$lang).'</a>',"\n";
      
echo '           '.'<a href="';
      echo 
get_complete_path2file_from_id2id($viewer_id,$group_default_id,$lang);
      echo 
'">';
      echo 
get_group_desc($group,$lang,$viewer_id);
      echo 
'</a>',"\n";
    }
  else
    echo 
'           '.get_group_desc($group,$lang,$viewer_id),"\n";

  echo 
$pre_strg,'         </div>',"\n";
  echo 
$pre_strg,'         <!-- Navigation Header -->',"\n";
  echo 
"\n";

  
// get all elements of this group
  
foreach( get_id_groupmembers($group,$lang) as $cur_id )
    {
      
// display all ids (if not the curent one) as a link
      
if ($viewer_id==$cur_id)
        {
          echo 
$pre_strg,'          <!-- Navigation Item -->',"\n";
          echo 
$pre_strg,'          <div id="Navigation_Mitte_cur_inhalt"';
          echo 
' style="padding-left:',($depth/2)+1,'em;">',"\n";
          
show_navigation_thispage();
          echo 
$pre_strg,'          </div>',"\n";
          echo 
$pre_strg,'          <!-- Navigation Item -->',"\n";
        }
      else
        {
          
// if this id isn't the defaultsite for any group (and therefore already linked) link it
          
if (!get_is_a_default_id_for_a_group($cur_id))
            {
              
// Hide entries if the viewer id is in an other group then the current group and all it'parents
              
$tmp_show_group_details=false;
              
$tmp_check_group=get_id_group($cur_id);
              
$tmp_test_group=get_id_group($viewer_id);

              
// compare viewer id's group with current group and it's parents
              
while ($tmp_test_group!='' && $tmp_show_group_details==false)
                {
                  if (
$tmp_test_group==$tmp_check_group$tmp_show_group_details=true;
                  if (
$tmp_test_group=='head')
                    { 
$tmp_test_group=''; }
                  else
                    { 
$tmp_test_group=get_group_parent($tmp_test_group); }
                }

              
// show detailed version with groups are related
              
if ($tmp_show_group_details)
                {
                  echo 
$pre_strg,'          <!-- Navigation Item -->',"\n";
                  echo 
$pre_strg,'          <div class="';
                   if (!
get_is_group_child_of_group(get_id_group($viewer_id),$group))
                     {
                       echo 
'Navigation_Mitte_other_inhalt';
                     }
                   else
                     {
                       echo 
'Navigation_Mitte_other_inhalt_focused';
                     }
                  echo 
'"';
                  echo 
' style="padding-left:',($depth/2)+1,'em;">',"\n";
                  
// is this id available in this language?
                  
if (get_id_lang_included($cur_id,$lang))
                    {
                      echo 
$pre_strg,'           ','<a href="';
                      
//echo $backpfad.get_id_dir_dst($cur_id).replace_lang(get_id_file_dst($cur_id),$lang)
                      
echo get_complete_path2file_from_id2id($viewer_id,$cur_id,$lang);
                      echo 
'">';
                      echo 
get_title($cur_id,$lang,$backpfad), '</a>',"\n";
                    }
                  
// if not list alternative languages
                  
else
                    {
                      echo 
$pre_strg,'           ',"<i>";
                      switch (
$lang)
                        {
                        case 
'en':
                          echo 
"(only in other languages)";
                          break;
                        case 
'de':
                          echo 
"(nur in anderen Sprachen)";
                          break;
                        case 
'fr':
                          echo 
"(seulement en diffent langues)";
                          break;
                        }
                      echo 
"</i>";
                      foreach(
get_id_lang($cur_id) as $cur_lang)
                        {
                          echo 
"<br />";
                          echo 
$cur_lang,': ';
                          
// Put the following in an extra line so it's easy to skip for the spell checker
                          
echo "\n".'<span class="ForeignLang_'.$cur_lang.'">';
                          echo 
'<a href="';
                          echo 
get_complete_path2file_from_id2id($viewer_id,$cur_id,$cur_lang);
                          echo 
'">',get_title($cur_id,$cur_lang,$backpfad), '</a>';
                          echo 
'</span>'."\n";
                        }
                      echo 
"\n";
                    }
                  echo 
$pre_strg,'          </div>',"\n";
                  echo 
$pre_strg,'          <!-- Navigation Item -->',"\n";
                }
            }
        }
    }
  
  
// do the same for all child-groups
  
foreach( get_group_childs($group,$lang) as $grp_id )
    {
      
show_navigation_rec($grp_id,$viewer_id,$lang,$backpfad);
    }
}


// build everything but the Navi
function show_NichtNavi_pre($no_content)
{
  echo 
'    <!-- Alles ausser der oberen Leiste -->'."\n";
  echo 
'    <div id="NichtKopf';
  if (
$no_content) echo '_nocontent';
  echo 
'">'."\n";
  echo 
"\n";
}

// build everything but the Navi
function show_NichtNavi_post()
{
  echo 
'    </div>'."\n";
  echo 
'    <!-- Ende: Nicht Kopf -->'."\n";
}

// build the below half of my page
function show_main_pre()
{
   echo 
'      <!-- Hauptspalte  -->',"\n";
   echo 
'      <div id="Main">',"\n";
   echo 
"\n";
}

// build the below half of my page
function show_main_post()
{
  echo 
'      </div>',"\n";
  echo 
'      <!-- Hauptspalte  -->',"\n";
  echo 
"\n";
}


// build the content of the below half of my page (expect each entry in the array to be an paragraph)
function show_main_inhalt($inhalt_main_text)
 {
   echo 
'        <!-- TheRealContent -->'."\n";
   echo 
'        <div id="TheRealContent">'."\n";
   foreach(
$inhalt_main_text as $text)
    {
      
show_main_inhalt_pre('        ');
      echo 
get_pp_paragraph($text,9);
      
show_main_inhalt_post('        ');
    }
   echo 
'        </div>'."\n";
   echo 
'        <!-- TheRealContent -->'."\n";

 }

// get the lastmodified field
function get_pp_local_lastmod($datei,$lang)
{
  
$ret='<div class="datumskasten" title="';
  switch (
$lang)
    {
    case 
'en':
      
$ret.='Last modified ';
      break;
    case 
'de':
      
$ret.='Letzte Änderung ';
      break;
    case 
'fr':
      
$ret.='Dernière modification ';
      break;
    } 
  
$ret.=get_nameoffile($datei).'">';
  
$ret.=access_lastmod("get_pp_int","local","","");
  
$ret.='</div>'."\n";
  return 
$ret;
}

/* write cache with for file modifications to the hard disk for the next run
 */
function writeFileModificationTime($cacheFile$fileModificationTime)
{
  
/* sort array by keys before writing to file so it is easier to track changes
   * in the file
   */
  
ksort($fileModificationTime);

  
// move index into the array
  
$array2write=array();
  foreach(
$fileModificationTime as $filename=>$dataarray)
  {
    
$dataarray[]=$filename;
    
$array2write[]=$dataarray;
  }

  
$handle fopen($cacheFile'w');
  foreach (
$array2write as $oneFileModificationTime)
  {
    
// fputcsv for the poor man
    
$str2write='';
    foreach(
$oneFileModificationTime as $column)
      {
        if(
$str2write!=""$str2write.='|';
        
$str2write.='"'.$column.'"';
      }
    
fwrite ($handle$str2write."\n");
  }
  
fclose($handle);
}

/* read cache with file modifications from the lasr run from the hard disk
 */
function readFileModificationTime($fileModificationTime$cacheFile)
{
  if(!isset(
$fileModificationTime)) $fileModificationTime=array();

  if(
file_exists($cacheFile))
  {
    
$handle fopen($cacheFile"r");

    while (
$data fgetcsv($handle10000'|''"'))
    {
      if(
count($data)>=3)
        {
          
$md5=$data[0];
          
$mtime=$data[1];
          
$filename=$data[2];

          
$fileModificationTime[$filename]=array('md5'=>$md5'mtime'=>$mtime);
        }
    }
    
fclose($handle);
  }
  return 
$fileModificationTime;
}

/* This method returns the date where the given file has changed
 * In order to prevent a changed file modification time without
 * real changes in the content of the file, we cache the last known
 * content of a file (via md5sum) and the file modification at that 
 * point. We will deliver this file modification time unless the 
 * content changes.
 * @param $currentpath   Path we client is started
 * @param $localfilename Path + filename of the file you like to have
 * @return file modification time when file changed the last time
 */
function getCachedFileModificationTime($filename)
{
  global 
$fileModificationTime;

  
$filename=unifyPath($filename);

  
$file_md5=md5_file($filename);
  
$file_mtime=filemtime($filename);
 
  
// for dynamic pages this may be null?
  
if($fileModificationTime==null || !is_array($fileModificationTime))
  {
   
$fileModificationTime=array();
  }

  
// check the cache
  
if(in_array($filename$fileModificationTime))
  {
   
$cacheHit=$fileModificationTime[$filename];
   if(
is_array($cacheHit) && ($cacheHit['md5']==$file_md5))
    {
      
/* the file is with the current md5 in the cache,
       * deliver old modification time (which might be older than the
       * current modification time). This hiddes null changes to a file
       * to the file modification time
       */
      
return $cacheHit['mtime'];
    }
  }
      
/* Either we do not have the file in the cache or it really has changed.
       * Store the new file modification time anyway and return it.
       */
      
$fileModificationTime[$filename]=array('md5'=>$file_md5,
                                             
'mtime'=>$file_mtime);
      return 
$file_mtime;
}

// this functions saves two lastmodified values
// global: value for a complete page, local: value for a paragraph
function access_lastmod($mode,$chooser,$other_val,$fname)
{
  static 
$maxtime_g=0;  // lastchanged for whole file
  
static $maxtime_l=0;  // lastchanged for one paragraph

  
switch ($mode)
    {
    
// Return the maximum time saved since last reset
    
case "get_int_val":
      if (
$chooser=="local"$ergb=$maxtime_l;
      elseif (
$chooser=="global"$ergb=$maxtime_g;
      break;
    
// Return the maximum time saved since last reset in pretty print
    
case "get_pp_int":
      if (
$chooser=="local"$val=$maxtime_l;
      elseif (
$chooser=="global"$val=$maxtime_g;
      if ((
$val==0) || ($val==""))
        { 
$ergb="???"; }
      else
        { 
$ergb=date("d-m-Y H.i",$val);    }
      break;
    
// Return a pretty print version of the time provided as parameter
    
case "get_pp_ext":
      
$val=$other_val;
      if ((
$val==0) || ($val==""))
        { 
$ergb="???"; }
      else
        { 
$ergb=date("d-m-Y H.i",$val); }
      break;
    
// reset maxtime to 0
    
case "reset":
      if (
$chooser=="local")
        
$maxtime_l=0;
      elseif (
$chooser="global")
        {
          
$maxtime_g=0;
          
// Global reset should (really?) reset local one
          
$maxtime_l=0;
        }
      
$ergb='';
      break;
    
// Return the time of the provided file
    
case "get_ext_val":
       if (
$fname!="")
         {
           
//$ergb=filemtime($fname);
                   
$ergb=getCachedFileModificationTime($fname);
         }
       else 
$ergb='';
       break;
    
// Get time of provided file and save if it is lager than all previous
    
case "update":
      if (
$fname!="")
        {
          
//$tmptime=filemtime($fname);
                  
$tmptime=getCachedFileModificationTime($fname);
          if (
$chooser=="local")
            {
              if (
$tmptime>$maxtime_l$maxtime_l=$tmptime;
              
// Local changes influence global also
              
if ($tmptime>$maxtime_g$maxtime_g=$tmptime;
            }
          elseif (
$chooser=="global")
            {
              if (
$tmptime>$maxtime_g$maxtime_g=$tmptime;
            }
        }
      
$ergb='';
      break;

      
// Get time of provided file and save if it is lager than all previous
    
case "update_with_extval":
      
$tmptime=$other_val;
      if (
$chooser=="local")
        {
          if (
$tmptime>$maxtime_l$maxtime_l=$tmptime;
          
// Local changes influence global also
          
if ($tmptime>$maxtime_g$maxtime_g=$tmptime;
        }
      elseif (
$chooser=="global")
        {
          if (
$tmptime>$maxtime_g$maxtime_g=$tmptime;
        }
      
$ergb='';
      break; 

    default:
      
$ergb='';
      exit(
"Invalid Parameter for access_lastmod");
    }
  return 
$ergb;
}

// build the below right half of my page
function show_unten_pre()
{
  echo 
'   <!-- Unten -->',"\n";
  echo 
'   <div id="Unten">',"\n";
  echo 
'    <!-- Fusszeile -->',"\n";
  echo 
'    <div id="Fusszeile">',"\n";
  
}

// build the below right half of my page
function show_unten_post()
{
  echo 
'    <!-- Fusszeile -->',"\n";
  echo 
'    </div>',"\n";
  echo 
'   <!-- Unten -->',"\n";
  echo 
'   </div>',"\n";
  echo 
"\n";
}

// build the content of the below right half of my page
function show_unten_inhalt($zielpfad,$destname,$sprache,$backpfad,$id)
{
  switch (
$sprache)
    {
    case 
'en':
      echo 
'          <a href="http://www.php.net"><img class="imgnobrd" src="',$backpfad,'logos/php-power-white" alt="Powered by PHP" title="This site uses PHP" /></a>',"\n";
      echo 
'          <a href="http://www.xemacs.org/About/created.html"><img class="imgnobrd" src="',$backpfad,'logos/cbxSmall.jpg" alt="Created with Xemacs" title="This page is writen with Xemacs" /></a>',"\n";
      if (
$id=='blog') echo '          <a href="http://feedvalidator.org/check.cgi?url=http://www.tgunkel.de/blog/rss.en.php"><img class="imgnobrd" src="',$backpfad,'logos/valid-rss" alt="Valid rss 2.0!" title="Validate my RSS feed" /></a>'."\n";
      echo 
'          <a href="http://validator.w3.org/check/referer"><img class="imgnobrd" src="',$backpfad,'logos/valid-xhtml10" alt="Valid XHTML 1.0!" title="Does this site validate XHTML 1.0 Strict?" /></a>',"\n";
      echo 
'          <a href="http://jigsaw.w3.org/css-validator/check/referer"><img class="imgnobrd" src="',$backpfad,'logos/valid-css" alt="Valid CSS!" title="Does this Site uses valid CSS?" /></a>',"\n";
      break;
    case 
'de':
      echo 
'          <a href="http://www.php.net"><img class="imgnobrd" src="',$backpfad,'logos/php-power-white" alt="Powered by PHP" title="Diese Seite benutzt PHP" /></a>',"\n";
      echo 
'          <a href="http://www.xemacs.org/About/created.html"><img class="imgnobrd" src="',$backpfad,'logos/cbxSmall.jpg" alt="Created with Xemacs" title="Diese Seite wird mit Xemacs geschrieben" /></a>',"\n";
      if (
$id=='blog') echo '          <a href="http://feedvalidator.org/check.cgi?url=http://www.tgunkel.de/blog/rss.de.php"><img class="imgnobrd" src="',$backpfad,'logos/valid-rss" alt="Valid rss 2.0!" title="Validate my RSS feed" /></a>'."\n";
      echo 
'          <a href="http://validator.w3.org/check/referer"><img class="imgnobrd" src="',$backpfad,'logos/valid-xhtml10" alt="Valid XHTML 1.0!" title="Enthält diese Seite wirklich fehlerfreies XHTML 1.0?" /></a>',"\n";
      echo 
'          <a href="http://jigsaw.w3.org/css-validator/check/referer"><img class="imgnobrd" src="',$backpfad,'logos/valid-css" alt="Valid CSS!" title="Enthält diese Seite wirklich fehlerfreie CSS?" /></a>',"\n";
      break;
    case 
'fr':
      echo 
'          <a href="http://www.php.net"><img class="imgnobrd" alt="Powered by PHP" title="Ce site utilise PHP" src="',$backpfad,'logos/php-power-white" /></a>',"\n";
      echo 
'          <a href="http://www.xemacs.org/About/created.html"><img class="imgnobrd" src="',$backpfad,'logos/cbxSmall.jpg" alt="Created with Xemacs" title="Ce site est &eacute;crit avec Xemacs" /></a>',"\n";
      if (
$id=='blog') echo '          <a href="http://feedvalidator.org/check.cgi?url=http://www.tgunkel.de/blog/rss.fr.php"><img class="imgnobrd" src="',$backpfad,'logos/valid-rss" alt="Valid rss 2.0!" title="Validate my RSS feed" /></a>'."\n";
      echo 
'          <a href="http://validator.w3.org/check/referer"><img class="imgnobrd" src="',$backpfad,'logos/valid-xhtml10" alt="Valid XHTML 1.0!" title="Ce site contient valide XHTML 1.0?" /></a>',"\n";
      echo 
'          <a href="http://jigsaw.w3.org/css-validator/check/referer"><img class="imgnobrd" src="',$backpfad,'logos/valid-css" alt="Valid CSS!" title="Ce site contient valid CSS?"/></a>',"\n";
      break;
    }
}

// build a paragraph
function show_main_inhalt_pre($leer)
{
  echo 
$leer,'<!-- Inhalt -->',"\n";
  echo 
$leer,'<div class="Main_Inhalt">',"\n";
}

// build a paragraph
function show_main_inhalt_post($leer)
{
  echo 
$leer,'</div>',"\n";
  echo 
$leer,'<!-- Inhalt -->',"\n";
  echo 
"\n";
}

/**
 * Each line I read must be processed, this function should do this
 *
 * @param $line Line to process
 * @return Processed line
 */
function process_read_line($line$backpfad$sprache$name, &$replace_on$path2page$file_dest)
{
 
$result='';
 
// there may be special keywords to prevent text replacement. Split strings at these words
 
$rest_text=$line;
 while (
$rest_text!="")
   {
     
$old_replace_on=$replace_on;
     
$line=get_replace_on_off($rest_text$replace_on);
     
$line replace_line_break($line"");
     
// only replace if last string as the replace_on variable true
     
if ($old_replace_on)
       {
         
$line replace_backpfad($line$backpfad);
         
$line replace_herepfad($line$backpfad$path2page);
         
$line replace_thispage($line$backpfad$path2page$file_dest);
         
$line replace_lang    ($line$sprache);
         if (
$name!=''$line replace_incfile ($line,$name,$sprache,$backpfad,$replace_on,$path2page,$file_dest);
       }
     
$result.=$line;
   }
 return 
$result;
}

/**
 * This will feed an array, element by element to process_read_line
 *
 * @param $lines Array to process
 * @return Processed array
 */
function process_array_with_read_lines($lines$backpfad$sprache$name, &$replace_on$path2page$file_dest)
{
  for(
$i=0$i<count($lines); $i++)
    {
      
$lines[$i]=process_read_line($lines[$i], $backpfad$sprache$name$replace_on$path2page$file_dest);
    }
 return 
$lines;
}

// read textfile and build a page paragraph of it
function read_file($name,$sprache,$backpfad, &$replace_on$path2page$file_dest)
{
  
$out_text="";
  
// get lastmodified value for textfile
  
access_lastmod("update","local","",$name);
  
// Ist das die neuste Aenderung fuer die gesamte Datei?
  
access_lastmod("update","global","",$name);
  
$fp = @fopen($name"r");
  if(!
$fp)
  {
    echo 
"Error file '".$fname."' while in: '".getcwd()."' backpfad was: '".$backpfad."'";
  }
  else
  {
  while (
$line fgets($fp8192))
    {
      
$line=process_read_line($line$backpfad$sprache$name$replace_on$path2page$file_dest);

      
// FIXME: headings that do not start the line are ignored
      // find headings and make the table of content entries
      
if (preg_match("/^\ *<h\d>.*<\/h\d>$/"$line))
    {
      
// save leading spaces
      
$line_e=preg_replace("/[^\ ].*$/","",$line);
      
// remove leading spaces
      
$line=preg_replace("/^\ */","",$line);
      
// get titel
      
$line_h=preg_replace("/^<h\d>/","",$line);
      
$line_h=preg_replace("/<\/h\d>$/","",$line_h);
      
// get titel nr
      
$line_n=preg_replace("/^<h/","",$line);
      
$line_n=preg_replace("/>.*/","",$line_n);
      
// build table of contents
      
$out_text.=$line_e.access_inhalt("get_htmltarget",$line_n,$line_h,$line_h);
      
access_inhalt("update_val",$line_n,$line_h,$line_h);
    }
      else
    {
      
$out_text.=$line;
    }
      
// restore line-break at end of lines
      
if (!preg_match("/>$/"$line))
    {
      
$out_text.='<br />';
    }
      
$out_text.="\n";
    }
  }
  
fclose($fp);
  return 
$out_text;
}

// take all relevant text files to build a page and read them into an array
function get_main_inhalt($dateien,$sprache,$backpfad,&$replace_on,$path2page,$file_dest)
  { 
    
//Array mit allen Inhalten
    
$inhalt_main_text=array();
    
// Alle Dateien auslesen
    
$anz count($dateien);
    for (
$i=3$i<$anz$i++)
      {
    
// Fehlt eine Uebersetztung oder normales auslesen
    
if ($dateien[$i][0]!="")
      {
        
access_lastmod("reset","local","","");
        
$inhalt_main_text[]=read_file($dateien[$i][0], $sprache$backpfad$replace_on$path2page,$file_dest).'          '.get_pp_local_lastmod($dateien[$i][0],$sprache);
      }
    else
      {
        switch (
$sprache)
          {
          case 
'en':
        
$inhalt_main_text[]="          This text is not yet available in this language.\n";
        break;
          case 
'de':
        
$inhalt_main_text[]="          Dieser Text ist in dieser Sprache noch nicht verfügbar\n";
        break;
          case 
'fr':
        
$inhalt_main_text[]="          Ce texte n'est pas disponible dans ce langue\n";
        break;
          }
      }
      }
    return 
$inhalt_main_text;
  }

// Extract Page Title
function get_title($id,$lang,$backpfad)
{
  if (!
get_is_valid_id($id)) { exit("Unknow page ID!"); } else
    {
      
$fname=$backpfad.'../'.get_id_dir_src($id).replace_lang('titel._REPLACE_LANG_.txt',$lang);
      if (
$fp = @fopen($fname"r"))
      {
        
$ergb fgets($fp1024);
        
fclose($fp);
        
$ferror=false;
      }
      else
      {
        
$ferror=true;
      }
      if (!isset(
$ergb) || ($ergb=="") || $ferror)
       {
        echo 
"Error reading title from: '".$fname."' while in: '".getcwd()."' backpfad was: '".$backpfad."'";
        exit();
       }
      
$ergb=replace_line_break($ergb,"");
      return 
$ergb;
    }
}

// take a directory and return the files we need from it
function liste_datei($startpfad$sprache)
{
  
$dateien=array();
  
  
// get all files
  
$tmp_all_liste=array();
  
$tmp_hit_liste=array();
  
$dp opendir($startpfad);
  while(
$tmp_file readdir($dp))
    {
      
// files with body text
      
if (preg_match ("/body_\d\d\...\.txt$/"$tmp_file))
    {
      
// match language?
      
if (preg_match ("/body_\d\d\.$sprache\.txt/"$tmp_file))
        {
          
// add it to the list
          
$tmp_hit_liste[]=$tmp_file;
        }
      
// save all body numbers that are available
      
$tmp_file=(preg_replace ("/body_/"""$tmp_file));
      
$tmp_file=(preg_replace ("/\..*/",  ""$tmp_file));
      
$tmp_all_liste[]=$tmp_file;
    }
    }
  
closedir($dp);
  
sort($tmp_all_liste);
  
sort($tmp_hit_liste);
  
  
// add files for meta, title and header to the body list (they have to exist)
  
$datei=array();
  
$datei[0]=$startpfad."meta.".$sprache.".txt";  $dateien[]=$datei;
  
$datei[0]=$startpfad."titel.".$sprache.".txt"$dateien[]=$datei;
  
$datei[0]=$startpfad."head.".$sprache.".txt";  $dateien[]=$datei;
  
  
// now list all file numbers
  
$i1=0$i2=0;
  while (
$i1<count($tmp_all_liste))
    {
      
// numbers may exists multiple times, just skip them (list ist sorted)
      
if (($i1==0) || ($tmp_all_liste[$i1]!=$tmp_all_liste[($i1)-1]))
    {
      
// check if the current number is also in the list of files for our language
      
if (($i2<count($tmp_hit_liste)) && (preg_match ("/$tmp_all_liste[$i1]/"$tmp_hit_liste[$i2])))
        {
          
// finally add the current file to the return list
          
$datei[0]=$startpfad.$tmp_hit_liste[$i2];
           
$i2++;
        }
      else
        {
          
// the current number is missing four our language, add an emtpy entry to rember this
          
$datei[0]='';
        }
      
$dateien[]=$datei;
    }
      
$i1++;
    }
  return 
$dateien;
}

// Extracts q value of HTTP_ACCEPT header
function php_as_html_or_xhtm_get_q_val($type,$string,$old_val)
{
 if (
preg_match('/^'.$type.'$/'$string))
   {
     
$ergb=1;
   }
 else
   {
     if (
preg_match('/^'.$type.';q=\d+.\d+$/'$string))
       {
         
$ergb=preg_replace('/^'.$type.';q=(\d+.\d+)$/''\1'$string);
       }
     else
       {
         
$ergb=0;
       }
   }
 if (
$old_val<$ergb)
   return 
$ergb;
 else
   return 
$old_val;
}

// Send html or xhtml header
function php_as_html_or_xhtm()
{
  
$accepts_html=0;
  
$accepts_xhtml=0;
  
$accepts_xml=0;
  if (
array_key_exists('SERVER_PROTOCOL'$_SERVER))
    {
      if (
$_SERVER['SERVER_PROTOCOL']=='HTTP/1.1')
        {
          if (
array_key_exists('HTTP_ACCEPT'$_SERVER))
            {
              if (isset(
$_SERVER['HTTP_ACCEPT']))
                {
                  
// HTTP/1.1 Header, client sent HTTP_ACCEPT header, parse it
                  
$accepts=array();
                  
$accepts=explode (','$_SERVER['HTTP_ACCEPT']);
                  
// the client accepts something, store how much he likes it
                  
for ($i1=0$i1<count($accepts); $i1++)
                    {
                      
$accepts_html=php_as_html_or_xhtm_get_q_val('text\/html',$accepts[$i1],$accepts_html);
                      
$accepts_xhtml=php_as_html_or_xhtm_get_q_val('application\/xhtml\+xml',$accepts[$i1],$accepts_xhtml);
                      
$accepts_xml=php_as_html_or_xhtm_get_q_val('application\/xml',$accepts[$i1],$accepts_xml);
                    }
                }
            }
        }
    }

  
// the client prefers xml or html ... (html is default)
  
if ((max($accepts_xml,$accepts_xhtml)>$accepts_html) && ($accepts_html>=0))
    {
      
header('Content-Type: application/xhtml+xml; charset=utf-8');
      
header('Vary: Negotiate,Accept');
    }
  else
    {
      
header('Content-Type: text/html; charset=utf-8');
      
header('Vary: Negotiate,Accept');
    }
}

// the main function for dynamic pages, get an id, a language and if we are a mirror; dynamic page provides text so we can build a page
function create_site_dynamic($id,$lang,$is_mirror,$oben_text,$inhalt_main_text,$metastr,$title_addon,$no_content)
{
  if (!
get_is_valid_id($id)) { exit("Illegal page id requested."); }
  if (!
get_id_lang_included($id,$lang)) { exit("Language is not supported for this id."); };

  
// on startup replace mode is on
  
$replace_on=true;

  
// Client already has newest version?
  
use_cache(access_lastmod("get_int_val","global","",""));

  
// Send html or xhtml header
  
php_as_html_or_xhtm();

  
$destpath=get_id_dir_dst($id);
  
$backpfad=calc_backpfad($destpath,$lang);
  
$destname=get_id_file_dst($id);


  
$title=get_title($id,$lang,$backpfad);


  
// Add lines from meta/header file
  
$meta_fname='../'.calc_backpfad(get_id_dir_dst($id)).get_id_dir_src($id).replace_lang('meta._REPLACE_LANG_.txt',$lang);
  
$tmp_old_error_level=error_reporting(0);
  if (
$fp = @fopen($meta_fname"r"))
    {
      
error_reporting($tmp_old_error_level);
      while (
$line fgets($fp1024))
        {
          
$metastr[]=$line;
        }
      
fclose($fp);
    }
  else 
error_reporting($tmp_old_error_level);


  
// process lines like I would do in the static case
  
$oben_text=process_read_line($oben_text,                           $backpfad$lang'',$replace_onget_id_dir_dst($id), get_id_file_dst($id) );
  
$inhalt_main_text=process_array_with_read_lines($inhalt_main_text$backpfad$lang'',$replace_onget_id_dir_dst($id), get_id_file_dst($id));


  
show_header_pre($metastr,$title,$backpfad,$lang,$id,$title_addon);

  
show_top_navi($lang,$backpfad,$destname,$id,get_id_do_impres($id));

  
show_NichtNavi_pre($no_content);

  
show_main_pre();
    
  if (!
$no_content)
    {
      
show_oben_pre();
      
show_oben_inhalt($oben_text);
      
show_oben_post();
    }

  
show_navispalte($lang,$backpfad,$destname,$id,get_id_do_impres($id),$no_content);

  if (!
$no_content)
    {
      
show_main_inhalt($inhalt_main_text);
    }
      
  
show_main_post();
  
  
show_unten_pre();
  
show_unten_inhalt($destpath,$destname,$lang,$backpfad,$id);
  
show_unten_post();

  
show_NichtNavi_post();

  
show_header_post();

}


// the main function for static pages, get an id, a language and if we are a mirror; build a page
function create_site_static($id,$sprache,$is_mirror)
{
  if (!
get_is_valid_id($id)) { exit("Illegal page id requested."); }
  if (!
get_id_lang_included($id,$sprache)) { exit("Language is not supported for this id."); };

  
// on startup replace mode is on
  
$replace_on=true;

  
// where the created files will be saved; this is our point of view
  
$zielpfad=get_id_dir_dst($id);

  
// how to travel back to the startpath
  
$backpfad=calc_backpfad($zielpfad);
  
// where we will find the sources for this page
  
$startpfad='../'.$backpfad.get_id_dir_src($id);

  
// change the current directory to the destpath
  
if (!chdir("../".get_site_dir_pre(get_id_site($id)).$zielpfad)) { exit("Could not chdir to zielpfad"); }

  
// get cached file modification times
  
$fileModificationCacheFile=$backpfad.'../_build/'.'fileModificationCache.csv';
  global 
$fileModificationTime;
  
$fileModificationTime=readFileModificationTime($fileModificationTime$fileModificationCacheFile);

  
// how files are named
  
$destname=get_id_file_dst($id);
  
  
// space left for an imprint?
  
if (get_id_do_impres($id)) { $impressum=1; } else { $impressum=0; }

  
// get the source files
  
$dateien=liste_datei($startpfad$sprache);

  
// reset the table of contents
  
access_inhalt("reset","","","");

  
// reset time of last modification
  
access_lastmod("reset","global","","");

 
// get last modification time of meta sources
 
access_lastmod("update","global","",$dateien[0][0]);
 
// read meta
 
$meta_lines = array();
 
$fp = @fopen($dateien[0][0], "r");
 while (
$line fgets($fp1024))
   {
     
$meta_lines[]=$line;
   }
 
fclose($fp);
 
 
// extract title
 
$titel=get_title($id,$sprache,$backpfad);
 
 
// now we can display the header
 
show_header_pre($meta_lines,$titel,$backpfad,$sprache,$id,array());

 
// new paragraph, new local modification time
 
access_lastmod("reset","local","","");
 
// update global modification time for head paragraph
 
access_lastmod("update","global","",$dateien[2][0]);

 
$oben_text=read_file($dateien[2][0],$sprache,$backpfad,$replace_on,$zielpfad,$destname);
 
$oben_text.=get_pp_local_lastmod($dateien[2][0],$sprache);

 
// read all the content of the below mid half in an array, each line a paragraph
 
$inhalt_main_text=get_main_inhalt($dateien,$sprache,$backpfad,$replace_on,$zielpfad,$destname);

 
show_top_navi($sprache,$backpfad,$destname,$id,$impressum);

 
show_NichtNavi_pre(get_no_content($id));

 
show_main_pre();

 if (!
get_no_content($id))
   {
     
show_oben_pre();
     
show_oben_inhalt($oben_text);
     
show_oben_post();
   }

 
show_navispalte($sprache,$backpfad,$destname,$id,$impressum,get_no_content($id));

 if (!
get_no_content($id))
   {
     
show_main_inhalt($inhalt_main_text);
   }

 
show_main_post();

 
show_unten_pre();
 
show_unten_inhalt($zielpfad,$destname,$sprache,$backpfad,$id);
 
show_unten_post();

 
show_NichtNavi_post();

 
show_header_post();

  
// write cached file modification times
  
writeFileModificationTime($fileModificationCacheFile$fileModificationTime);
}

?>