<?php


// *********************************
// Konfigurace
// *********************************


define('DIRINFO',                 'DirInfo.txt',                          true); // Jméno souboru s informacemi o adresáři
define('PRJINFO',                 'PrjInfo.txt',                          true); // Jméno souboru s informacemi o projektu

define('PERMALINK',               '/PermaLink',                           true); // Začátek cesty s permalinkem (zpracovává mod_rewrite)
define('LISTSCRIPT',              'List',                                 true); // Jméno skriptu v rootu pro výpis
define('WEBSVNSCRIPT',            '/WebSVN/listing.php',                  true); // Cesta k WebSVN skriptu
define('WIKISERVER',              'wiki',                                 true); // Jméno Wiki serveru (co se strčí místo jména stávajícího serveru)

// Cesta k templejtům
define('TEMPLATE_PATH',           'Server/PrjInfo/Templates',             true); // Cesta do adresáře s templejty
define('TEMPLATE_PERMALINK',      TEMPLATE_PATH . '/PermaLink.ihtml',     true); // Zobrazení PermaLinku (přípona jazyka se doplní sama)
define('TEMPLATE_PERMALINK_PATH', TEMPLATE_PATH . '/PermaLinkPath.ihtml', true); // Zobrazení PermaLinku s cestou (přípona jazyka se doplní sama)
define('TEMPLATE_LISTDIR',        TEMPLATE_PATH . '/ListDir.ihtml',       true); // Zobrazení sekce      (přípona jazyka se doplní sama)
define('TEMPLATE_LISTPRJ',        TEMPLATE_PATH . '/ListPrj.ihtml',       true); // Zobrazení projektu   (přípona jazyka se doplní sama)


// *********************************
// Obecné funkce
// *********************************


// Ukončení běhu při chybě
function Error($str)
{
  echo '<b>Ups...<b><br>'.PHP_EOL.$str.PHP_EOL;
  exit;
}


// Vytiskni strukturu s názvem
function print_rx($Nadpis, $Struktura)
{
  print $Nadpis.PHP_EOL;
  print str_pad('', strpos($Nadpis.PHP_EOL, PHP_EOL), '-').PHP_EOL;
  $str=print_r($Struktura, true);
  $str = '  '.str_replace(PHP_EOL, PHP_EOL.'  ', $str);
  print $str.PHP_EOL;
}


// *********************************
// Výroba odkazů
// *********************************


// Ze zadané cesty a pole s názvy souborů slepí HTML odkazy
// na jednotlivé soubory
function CreateFilesLink2($Path, $FileNames, $Glue)
{
  $Path = htmlspecialchars($Path);

  $Glue = " $Glue\n";
  $Result = '';
  foreach($FileNames as $Name)
  {
    $Name = htmlspecialchars($Name);
    $Result .= "<a href=\"$Path/$Name \">$Name</a>" . $Glue;
  }
  $Result=substr($Result, 0, -strlen($Glue));
  return $Result;
}


/*
// Vyrobí HTML odkaz na soubor/adresář/skript
function CreateLinkHTML($Path, $Text, $Title='')
{
  $Path = htmlspecialchars($Path);

  $Title = htmlspecialchars($Title);

  $Link  = '<a href="http://'.$_SERVER['SERVER_NAME'].$FileName.'"';
  if ($Title != '')
    $Link .= "\n".'   title="'.$Title.'"';
  $Link .= '>';
  if (basename($FileName)=='')
    $Link .= '(root)';
  else
    $Link .= basename($FileName);
  $Link .= '</a>';

  return $Link;
  
}
*/

function CreateSVNLink($Path, $Lang, $Title)
// Vytvoří odkaz do WebSVN podle cesty a jazyka
{
  $Path = htmlspecialchars($Path);

  $Link  = '<a href="http://';
  $Link .= $_SERVER['SERVER_NAME'];
  $Link .= WEBSVNSCRIPT;
  $Link .= '?repname=MLAB&amp;path=';
  $Link .= $Path;
  $Link .= '/';
  if ($Lang=='cs')
    $Link .= '&amp;langchoice=Česky';
  else
    $Link .= '&amp;langchoice=English';
  $Link .= '"';
  if ($Title!='')
    $Link .= "\n".'   title="'.htmlspecialchars($Title).'"';
  $Link .= '>WebSVN</a>';

  return $Link;
}


function CreateWikiLink($Name, $Lang, $Title)
// Vytvoří odkaz do Wiki podle jména modulu a jazyka
{
  // Ukousni verzi a revizi modulu (například 01A)
  $Name = preg_replace('/[0-9][0-9][a-z]$/i', '', $Name);
  $Name = htmlspecialchars($Name);

  // Sestav odkaz
  $Link  = '<a href="http://';
  $Link .= preg_replace('/^.+?\./', WIKISERVER.'.', $_SERVER['SERVER_NAME']);
  $Link .= '/doku.php?id='.$Lang.':'.$Name;
  $Link .= '"';

  if ($Title!='')
    $Link .= "\n".'   title="'.htmlspecialchars($Title).'"';
  $Link .= '>Wiki</a>';

  return $Link;
}


function CreatePicturesLink($Path, $Glue, $Alt='', $NoPicture, $Width='')
// Najde na uvedené cestě obrázky, které mají v názvu Small
// a sestaví na ně odkaz. Pokud není žádný obrázek, vytvoří odkaz na obrázek
// v parametru $NoPicture.
{
  // Najdi všechny soubory
  $Files = array();
  foreach (glob($_SERVER['DOCUMENT_ROOT'].$Path.'/*') as $File)
  {
    if (is_file($File))
    {
      // Jen jméno souboru
      $File = substr($File, 1+strlen($_SERVER['DOCUMENT_ROOT'].$Path));

      // TOHLE ASI RADĚJI PŘEZ REGEX

      // Odděl příponu
      $DotPos = strrpos($File, '.');
      $Extension = substr($File, $DotPos+1);
      $BaseName  = substr($File, 0, $DotPos);

      // Vezmi obrázky, které mají ve jméně Small
      if( (strtolower($Extension)=='jpg' or strtolower($Extension)=='png')
          and strpos($BaseName, 'Small')>0 )
      {
        $Files[] = $Path.'/'.$File;
      }
    }
  }

  // V adresáři nejsou žádné vhodné obrázky
  if (count($Files) == 0)
  {
    // Není na co udělat odkaz
    if ($NoPicture=='')
      return '';
    // Přidej odkaz nikam
    $Files[] = $NoPicture;
  }

  // Udělej odkazy na pole souborů
  $Alt  = htmlspecialchars($Alt);
  $Line  = '';
  $FirstGlue = TRUE;
  foreach($Files as $File)
  {
    $File = htmlspecialchars($File);

    if(!$FirstGlue)
      $Line .= ' '.$Glue."\n";
    $FirstGlue = FALSE;

    $Line .= '<a href="'.$File.'">'."\n";
    $Line .= '<img src="'.$File.'"'."\n";
    if($Width!='')
      $Line .= '     width="' . $Width . '"'."\n";
    $Line .= '     alt="'.$Alt.'">'."\n";
    $Line .= '</a>'."\n";
  }

  return $Line;
}

// Vstupem je cesta k souboru v rámci webu (od DOCUMENT_ROOT)
// a volitelně title (zobrazí se při najetí myši na odkaz).
// Vrací řetězec s odkazem
function CreateFileLink($FileName, $Title='')
{
  $FileName = htmlspecialchars($FileName);

  $Link  = '<a href="http://'.$_SERVER['SERVER_NAME'].$FileName.'"';
  if ($Title != '')
    $Link .= "\n".'   title="'.$Title.'"';
  $Link .= '>';
  if (basename($FileName)=='')
    $Link .= '(root)';
  else
    $Link .= basename($FileName);
  $Link .= '</a>';

  return $Link;
}


// Vyrobí odkaz na projekt
// vstupem je cesta k projektu (začíná lomítkem) a volitelně jazyk
function CreateProjectLink($Path, $Lang='')
{
  if($Lang!='')
    $Lang .= '.';
  return 'http://' . $_SERVER["HTTP_HOST"] . $Path . '/' . LISTSCRIPT . '.' .$Lang . 'html';
}


// Provede přesměrování na projekt na zadané cestě (volitelně i s jazykem)
function Redirect($Path, $Lang='')
{
  $NewUrl = CreateProjectLink($Path, $Lang);
  // print "Redirect: $NewUrl<br>";
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: $NewUrl");
  header("Connection: close");
  die();
}


// Provede přesměrování na projekt na zadané cestě (volitelně i s jazykem)
function RedirectToFile($Path)
{
  // print "Redirect: $NewUrl<br>";
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: $Path");
  header("Connection: close");
  die();
}


// Dostává cestu k souboru a jazyk. Zkusí ověřit existenci souboru s doplněným
// zadaným jazykem, dále zkusí angličtinu a nakonec zkusí nemodifikovaný název.
// Vrací jméno souboru s tou variantou, kterou našel.
function LangFile($FileName, $Lang)
{
  // Najdi příponu (poslední tečka)
  $Pos = strrpos($FileName, '.');
  if ($Pos === false)
    return '';
  if ($Pos < strrchr($FileName, '/'))
    return '';

  // Zkus doplnit zadaný jazyk
  $File = substr($FileName, 0, $Pos+1).$Lang.substr($FileName, $Pos);

  if (is_file($File))
    return $File;

  // Zkus doplnit en
  $File = substr($FileName, 0, $Pos+1).'en'.substr($FileName, $Pos);

  if (is_file($File))
    return $File;

  // Zkus soubor tak jak je
  if (is_file($FileName))
    return $FileName;

  // Nic nevyšlo
  return '';
}




// Sestaví odkazy na všechny soubory zadaného jména slepené lepidlem
// Volitelně lze zadat title (zobrazí se při najetí myši na odkaz).
// Cesta se chápe v rámci webu (od DOCUMENT_ROOT).
// Vrací řetězec s odkazy
function CreateFilesLink($Path, $Glue, $Title='')
{
  // Při lepení odřádkujeme aby byl generovaný kód strukturovaný
  $Glue = ' '.$Glue."\n";

  // Pro každou položku
  $Line = '';
  $Ofset = strlen($_SERVER['DOCUMENT_ROOT']);
  foreach (glob($_SERVER['DOCUMENT_ROOT'].$Path, 0) as $DirName)  // GLOB_BRACE???????????
  {
    // Sestav odkaz
    if (is_file($DirName))
      $Line .= $Glue.CreateFileLink(substr($DirName, $Ofset), $Title);
  }

  // Vrať výsledek ale bez lepidla na začátku
  return substr($Line, strlen($Glue));
}


// *********************************
// Zpracování stromu sekcí a projektů
// *********************************


// Vrací true/false na základě validní struktury sekce (adresáře)
// (testuje přítomnost DIRINFO souboru)
function IsDir($Path)
{
  return is_file($_SERVER['DOCUMENT_ROOT'].$Path.'/'.DIRINFO);
}


// Vrací true/false na základě validní struktury projektu
// (testuje přítomnost PRJINFO a pokud není tak heuristiku)
function IsPrj($Path)
{
  // Existuje popisný soubor projektu
  if(is_file($_SERVER['DOCUMENT_ROOT'].$Path.'/'.PRJINFO))
    return true;

  // Není popis projektu, nastupuje heuristika
  if(is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/DOC'))
    return true;
  if(is_dir($_SERVER['DOCUMENT_ROOT'].$Path.'/SCH'))
    return true;

  // Nic nezabralo, není platný projekt
  return false;
}


// Funkce vrací pole obsahující pole Projects a pole Sections
function RecurseDirs($Path)
{
  $Dirs = array();
  $Path = rtrim($Path, '/');
  $Items = glob($_SERVER['DOCUMENT_ROOT'].$Path.'/*', GLOB_ONLYDIR);

  // If not valid directory (vracím prázdný výsledek)
  if(!is_array($Items))
    return $Dirs;

  // Recourse the directory tree (přidávám nalezené adresáře ke konci pole)
  for($i=0; $i<count($Items); $i++)
  {
    if (is_file($Items[$i].'/'.DIRINFO))
    {
      $SubDirs = glob($Items[$i] . '/*', GLOB_ONLYDIR);
      $Items = array_merge($Items, $SubDirs);
    }
  }

  // Remove invalid items (with no DIRINFO/PRJINFO) and Local Path
  $Sections=array();
  $Projects=array();
  $EatLeftChars = strlen($_SERVER['DOCUMENT_ROOT']);
  foreach($Items as $Key => $Data)
  {
    // Remove web path
    $Data = substr($Data, $EatLeftChars);
    if(IsDir($Data))
      $Sections[]=$Data;
    elseif (IsPrj($Data))
      $Projects[]=$Data;
  }

  // Sort Sections
  sort($Sections, SORT_STRING);

  // Sort Projects
  sort($Projects, SORT_STRING);

  // Return combined result
  $All["Projects"] = $Projects;
  $All["Sections"] = $Sections;
  return $All;
}


// *********************************
// Permalinky
// *********************************


// Filtr pro náhradu nepohodlných znaků v permalinku
// Nahrazuje všechny znaky kromě písmen a čísel, odstraní diakritiku
// u českých znaků
function PermaLinkFilter($String)
{
  // Odstraň diakritiku
  $SubstTable = array (
    "ě" => "e", "š" => "s", "č" => "c", "ř" => "r", "ž" => "z", "ý" => "y", "á" => "a",
    "í" => "i", "é" => "e", "ď" => "d", "ť" => "t", "ň" => "n", "ů" => "u", "ú" => "u",
    "Ě" => "E", "Š" => "S", "Č" => "C", "Ř" => "R", "Ž" => "Z", "Ý" => "Y", "Á" => "A",
    "Í" => "I", "É" => "E", "Ď" => "D", "Ť" => "T", "Ň" => "N", "Ů" => "U", "Ú" => "U"
    );
  $String = strtr($String, $SubstTable);

  // Nahraď nepohodlné znaky mínusem
  $String = preg_replace("~[^A-Z0-9]+~ui", "-", $String);

  // Odtsraň duplicity mínusů
  $String = preg_replace("~-+~u", "-", $String);

  // Odstraň počáteční a koncové mínusy
  $String = ltrim(rtrim($String,'-'),'-');

  return $String;
}


// Vrací z cesty platný permalink
// Vstupem je cesta k projektu nebo k sekci, z ní se vrací jen název (poslední část cesty)
function PermaLinkCreateKey($ProjectPath)
{
  // Odstraň cestu
  $PermaLinkKey = basename($ProjectPath);

  // Odstraň nepohodlné znaky
  $PermaLinkKey = PermaLinkFilter($PermaLinkKey);

  // Hotovo
  return $PermaLinkKey;
}


// Zvýrazní jméno projektu (poslední část zadané cesty dá do značky span)
function MarkPath($Path)
{
  $Pos = strrpos($Path, '/');
  if($Pos===false)
    return "<span class='Marked'>".$Path."</span>";
  else
    return substr($Path, 0, $Pos+1)."<span class='Marked'>".substr($Path, $Pos+1)."</span>";
}


// Vytvoří z klíče (upravený název projektu či sekce) celý klikací permalinkový odkaz
// Je-li zadána přídavná cesta tak ji přidá na konec
// ??????????????????????????? k čemu se použije $AditionalPath ?????????????? možná zrušit
function PermaLinkCreateLink($PermaLinkKey, $AditionalPath='')
{
  $AditionalPath = ltrim($AditionalPath, '/');
  $AditionalPath = rtrim($AditionalPath, '/');
  if($AditionalPath!=='')
    $AditionalPath = '/'.$AditionalPath;
  $PermaLinkKey = PermaLinkCreateKey($PermaLinkKey);
  return 'http://'.$_SERVER['HTTP_HOST'].PERMALINK.'/'.$PermaLinkKey.$AditionalPath;
}


// Na základě pole se všemi projekty a sekcemi vytvoří pole permalinků se všemi projekty a sekcemi
function PermaLinkCreateArray($ProjectsArray)
{
  $PermaLinkArray = array();

  foreach($ProjectsArray['Projects'] as $Data)
  {
    $PermaLink = PermaLinkCreateKey($Data);
    $PermaLinkArray[] = array('SortKey' => mb_strtolower($PermaLink), 'PermaLink' => $PermaLink, 'Path' => $Data, 'Type' => 'Project');
  }

  foreach($ProjectsArray['Sections'] as $Data)
  {
    $PermaLink = PermaLinkCreateKey($Data);
    $PermaLinkArray[] = array('SortKey' => mb_strtolower($PermaLink), 'PermaLink' => $PermaLink, 'Path' => $Data, 'Type' => 'Section');
  }

  return $PermaLinkArray;
}


// V zadaném poli odkazů najde klíč a vrátí pole s nalezenými shodami
// (v případě neshody vrací prázdné pole, ignoruje velikost písmen)
function PermaLinkFind($AllPermas, $Key)
{
  $Key = mb_strtolower($Key);
  $Key = PermaLinkFilter($Key);
  $KeyLen = strlen($Key);
  $Result = array();
  if($KeyLen!==0)
  {
    foreach($AllPermas as $Data)
    {
/*
      // Hledej permalinky, které začínají jako zadaný klíč
      if(mb_strtolower(substr($Data['PermaLink'], 0, $KeyLen))===$Key)
        $Result[] = $Data;
*/
      // Hledej permalinky, které obsahují zadaný klíč
      if(strpos(mb_strtolower($Data['PermaLink']), $Key)!==false)
        $Result[] = $Data;
    }
    return $Result;
  }
}
?>