<?php


  // Zpracovává odkazy ve formátu http://www.mlab.cz/PermaLink/Projekt/DalšíCesta
  // Skript se volá ze souborů /PermaLink.cs.php a /PermaLink.en.php kde se nastavuje proměnná $Lang
  // První slovo (až po lomítko) za PermaLink se chápe jako jméno modulu/projektu nebo adresáře/sekce.
  // Pokud zadanému jménu odpovídá jediný odkaz, provede se hned přesměrování, jinak se vypíše seznam kandidátů.
  // Pro snadné odkázání lze permanentní odkaz doplnit cestou k adresáři či souboru v rámci projektu.


  define('DISPLAY_ALL_IF_EMPTY' , true);  // Povol zobrazení všech sekcí a projektů když je zadaný prázdný permalink
  define('MAX_DEPTH', 50);                // Maximální hloubka prohledávání adresářů (pojistka proti zacyklené struktuře adresářů)

  require_once('Common.php');           // Modul společných funkcí
  require_once('DirMetadata.php');      // Modul pro načítání informace o adresářích
  require_once('TemplateEngine.php');   // Stroj pro práci s templejty

  // Převezmi odkaz
  if($_REQUEST['PermaLink']!='')
    // Odkaz z formuláře
    $LinkFull = $_REQUEST['PermaLink'];
  else
    // Odkaz z cesty
    $LinkFull = $_SERVER['PATH_INFO'];

  // Decode entities ?
  // $LinkFull=htmlspecialchars_decode($LinkFull);

  // Split PermaLink and aditional Path
  $LinkFull = ltrim($LinkFull, DIRECTORY_SEPARATOR);
  $LinkFull = rtrim($LinkFull, DIRECTORY_SEPARATOR);
  $SeparatorPosition = strpos($LinkFull, DIRECTORY_SEPARATOR);
  if ($SeparatorPosition===false)
  {
    $LinkPath = '';
    $Link     = $LinkFull;
  }
  else
  {
    $LinkPath = substr($LinkFull, $SeparatorPosition+1);
    $Link     = substr($LinkFull, 0, $SeparatorPosition);
  }
  unset($SeparatorPosition);

  // Najdi cíle pro PermaLink
  $PermaLinkArray = array();
  if(DISPLAY_ALL_IF_EMPTY or !($Link===''))
  {
    // Načti seznam všech projektů a sekcí (od začátku)
    $ProjectsAndSections = RecurseDirs('/');

    // Převeď projekty a sekce na permalinky
    $AllPermas = PermaLinkCreateArray($ProjectsAndSections);
    unset($ProjectsAndSections);

    if($LinkFull==='')
    {
      // Prázdný permalink - zkopíruj vše
      $PermaLinkArray = $AllPermas;
    }
    else
    {
      // Najdi zadaný permalink
      $PermaLinkArray = PermaLinkFind($AllPermas, PermaLinkCreateKey($Link));
    }
    unset($AllPermas);
  }
  $PermaLinkCount = count($PermaLinkArray);
  //print_rx('Found Permalinks', $PermaLinkArray);

  // Nalezen právě jeden odkaz bez přídavné cesty - rovnou přesměruj
  if($PermaLinkCount==1 and $LinkPath==='')
    Redirect($PermaLinkArray[0]['Path'], $Lang); // ------------------------------------->>>

  // Setřiď nalezené (třídí primárně podle první položky, což je lowercase verze permalinku)
  sort($PermaLinkArray);

  // ***************************
  // Zpracuj PermaLink bez cesty
  // ***************************
  if ($LinkPath==='')
  {
    // Založ objekt templejtu a načti jej
    $Template = new TemplateEngine();
    $error = $Template->LoadTemplate($_SERVER['DOCUMENT_ROOT'].'/'.TEMPLATE_PERMALINK, $Lang);
    if ($error!='')
      Error($error);

    // Generuj dynamický obsah do proměnných (společná část)
    $Template->SetVariable('InfoThisLink',   $LinkFull            );
    $Template->SetVariable('InfoThisServer', $_SERVER['HTTP_HOST']);

    // Nalezeno více položek - zjisti více informací a vlož je do templejtu
    $Lines = '';
    if($PermaLinkCount>1)
    {
      // Nachystej společné hodnoty z templejtu
      $PictureGlue      = $Template->GetVariable('InfoPictureGlue');
      $PictureAlt       = $Template->GetVariable('InfoPictureAlt');
      $PictureNoPicture = '/'.TEMPLATE_PATH.'/'.$Template->GetVariable('InfoNoPicture');
      // Načti informace o projektu
      $DirInfo = new DirMetadata();
      foreach($PermaLinkArray as $Data)
      {
        // Naplň proměnné pro definici položky
        //   Type / Picture / PermaLink / Path
        $Variables['InfoType']        = $Data['Type'];
        $Variables['InfoPicture']     = CreatePicturesLink($Data['Path'], $PictureGlue, $PictureAlt, $PictureNoPicture);
        $Variables['InfoPermaLink']   = "<a href=\"".PermaLinkCreateLink($Data['PermaLink'])."\">{$Data['PermaLink']}</a>";
        $PathMarked = MarkPath($Data['Path']);
        $Variables['InfoPath']        = "<a href=\"".CreateProjectLink($Data['Path'], $Lang)."\">$PathMarked</a>";
        unset($PathMarked);

        // Zjisti informace o projektu
        if($Data['Type']==="Section")
          $DirInfo->LoadDirInfo($Data['Path'].'/'.DIRINFO, $Lang);
        else
          $DirInfo->LoadDirInfo($Data['Path'].'/'.PRJINFO, $Lang);

        // Vlož všechny zjištěné informace
        foreach($DirInfo->DirData as $Key => $ItemInfo)
          $Variables[$Key] = $ItemInfo;

        // Ošetři chybějící popis
        if($Variables['InfoShortDescription']=='' and $Variables['InfoLongDescription']=='')
          $Variables['InfoShortDescription'] = $Template->GetVariable('InfoNoText');

        // Proveď substituci a střádej výsledek (po položkách)
        $Lines .= $Template->Substitute($Variables, $Template->GetVariable('InfoLine'));

        // Zahoď nalezená data (aby se nepoužily v dalším cyklu)
        unset($Variables);
      }

      // Vlož řádky do templejtu
      $Template->SetVariable('InfoLine', $Lines);
    }
    else
    {
      // Nenalezeno nic (nebo prázdné zadání)
      $Template->SetVariable('InfoLine', $Template->GetVariable('InfoNoData'));
    }

    // Odešli výsledek klientovi
    echo $Template->GetPage();
    return;
  }
  else
  // **************************
  // Zpracuj PermaLink s cestou
  // **************************
  {
    // Založ objekt templejtu a načti jej
    $Template = new TemplateEngine();
    $error = $Template->LoadTemplate($_SERVER['DOCUMENT_ROOT'].'/'.TEMPLATE_PERMALINK_PATH, $Lang);
    if ($error!='')
      Error($error);

    // Generuj dynamický obsah do proměnných (společná část)
    $Template->SetVariable('InfoThisLink',   $LinkFull            );
    $Template->SetVariable('InfoThisServer', $_SERVER['HTTP_HOST']);

    // Načti proměnné z templejtu
    $Glue = $Template->GetVariable('InfoNamesGlue');

    // Prohledej adresáře (nestriktní verze)
    // -------------------------------------
    $FilesPathArray = array();
    $FilesPathCount = 0;

    // Rozděl cestu na dílky
    $LinkPathArray = explode('/', $LinkPath);
    $LinkPathDepth = count($LinkPathArray);
    //print_rx("Path to be found", $LinkPathArray);

    // Cyklus přes všechny nalezené permalinky
    foreach($PermaLinkArray as $Item)
    {
      // Rekurentně procházej atrukturu adresáře
      // Podadresáře přidávej průběžně na konec pole
      // První položka je hloubka zanoření (indexuje $LinkPathArray)
      // Střádej nalezené položky do pole $LinkPathData
      $Dirs = array();
      $Dirs[] = array('Depth'=>0, 'Path'=>$Item['Path']);
      // Omez hloubku procházení adresářů
      for ($i=0; $i<count($Dirs) and $i<MAX_DEPTH; $i++)
      {
        //print "At Depth " . $Dirs[$i]['Depth'] . " Reading Directory " . $Dirs[$i]['Path'] . PHP_EOL;
        //print "Looking for " . $LinkPathArray[$Dirs[$i]['Depth']] . PHP_EOL;
        $GlobFlags = GLOB_NOSORT;
        if ($LinkPathDepth>$Dirs[$i]['Depth']+1)
        {
          // Nejsme ještě u konce cesty - přidej jen adresáře
          $GlobFlags |= GLOB_ONLYDIR;
        }
        // Čti adresáře
        $SubDirs = glob($_SERVER['DOCUMENT_ROOT'].$Dirs[$i]['Path'].DIRECTORY_SEPARATOR.'*', $GlobFlags);
        foreach($SubDirs as $Item)
        {
          // Převeď na cestu od rootu webu
          $CurentName  = basename($Item);
          $CurentPath  = $Dirs[$i]['Path' ];
          $CurentDepth = $Dirs[$i]['Depth'];
          //print "  $CurentName\n";
          // ===> POROVNÁNÍ JE ZDE <===
          if(mb_strtolower(PermaLinkFilter($CurentName))===mb_strtolower(PermaLinkFilter($LinkPathArray[$CurentDepth])))
          {
            //print"  ^----> $CurentDepth : $CurentPath/$CurentName\n";
            // Přidej další adresář do rekurze
            if(is_dir($Item))
            {
              $Dirs[] = array('Depth'=>$CurentDepth+1, 'Path'=>$CurentPath.'/'.$CurentName);
            }
            // Nalezený soubor v adresáři
            if(is_file($Item))
            {
              //print "  ^----> File: $Item\n";
              $FilesPathArray[$Dirs[$i]['Path']][]=$CurentName;
              $FilesPathCount++;
            }
          }
          // V posledním adresáři přidej všechny soubory
          if($CurentDepth>=$LinkPathDepth)
          {
            //print "  Test ".$_SERVER['DOCUMENT_ROOT'].$CurentPath.'/'.$CurentName.PHP_EOL;
            if (is_file($_SERVER['DOCUMENT_ROOT'].$CurentPath.'/'.$CurentName))
            {
              //print "  ^----> File All: $Item\n";
              $FilesPathArray[$CurentPath][]=$CurentName;
              $FilesPathCount++;
            }
          }
        }
        //print("\n");
      }
    }
    //print_rx('Found Files', $FilesPathArray);
    //print "Files Found Count $FilesPathCount\n";

/*
    // Prohledej adresáře a soubory (striktní verze)
    // ---------------------------------------------
    $EatIt = strlen($_SERVER['DOCUMENT_ROOT']);
    foreach($PermaLinkArray as $Item)
    {
      $Path = $_SERVER['DOCUMENT_ROOT'].$Item['Path'].DIRECTORY_SEPARATOR.$LinkPath;
      if (is_file($Path))
      {
        $FilesPathArray[substr(dirname($Path), $EatIt)] = array(basename($Path));
        $FilesPathCount++;
      }
      if (is_dir($Path))
      {
        foreach (scandir($Path) as $DirItem)
        {
          if (is_file($Path.DIRECTORY_SEPARATOR.$DirItem))
          {
            $FilesPathArray[substr($Path, $EatIt)][]=$DirItem;
            $FilesPathCount++;
          }
        }
      }
    }
    print_rx('Nalezene soubory', $FilesPathArray);
    print "$FilesPathCoutn\n";
*/

    // Nalezen právě jeden odkaz na soubor - rovnou přesměruj
    if($FilesPathCount===1)
    {
      reset($FilesPathArray);
      $tmp = current($FilesPathArray);
      $Path = key($FilesPathArray).'/'.$tmp[0];
      RedirectToFile($Path);         // ------------------------------------->>>
    }

    // Nalezeno více položek - zjisti více informací a vlož je do templejtu
    $Lines = '';
    if($FilesPathCount>0)
    {
      foreach($FilesPathArray as $Path=>$FileArray)
      {
        $Variables['InfoName']=CreateFilesLink($Path, '<br>', '');
        $FileNames = '';
        foreach($FileArray as $FileItem)
        {
          $FileNames .= '<br> '.$FileItem;
        }
        $Variables['InfoPath']  = $Path;
        $Variables['InfoNames'] = CreateFilesLink2($Path, $FileArray, $Glue);

        // Proveď substituci a střádej výsledek (po položkách)
        $Lines .= $Template->Substitute($Variables, $Template->GetVariable('InfoLine'));

        // Zahoď nalezená data (aby se nepoužily v dalším cyklu)
        unset($Variables);
      }
      // Vlož řádky do templejtu
      $Template->SetVariable('InfoLine', $Lines);
    }
    else
    {
      // Nenalezeno nic
      $Template->SetVariable('InfoLine', $Template->GetVariable('InfoNoData'));
    }

    // Odešli výsledek klientovi
    echo $Template->GetPage();
    return;
  }

?>