<?php

/**
 * Zpracuje url a jednotlivé parametry převede do proměnných filtru, sloupců, stránen a řazení. Pokud parametry v get nejsou, ale jsou v cookies, funkce vytvoří nové url, na které přesměruje.
 * \param array &$filter pole proměnných filtru, které funkce naplní hodnotami z get
 * \param array &$columns pole proměnných sloupců, které funkce naplní hodnotami z get
 * \param array &$pages pole proměnných stránky, které funkce naplní hodnotami z get
 * \param array &$sort pole proměnných řazení, které funkce naplní hodnotami z get  
 * \global array $webdoc pole řídicích proměnných, je očekáváno $webdoc["main_table"] pro určení odlišností filtru, sloupců a řazení pro různé tabulky
 */
function kernel_get_url(&$filter,&$columns,&$pages,&$sort)
{
  global $webdoc;
  $cookie_filter=false;  //indikuje, zda se ma precist filtr z cookie, v pripade, ze neni v get
  $cookie_columns=false;
  
  //zpracovani filtru
  if (!isset($_GET["subpage2"]) || $_GET["subpage2"]=="filter" || $_GET["subpage2"]=="columns" || $_GET["subpage2"]=="export") //pouze u hlavnich tabulek (requirement, product, test, test run)
  {
    switch ($webdoc["main_table"])
    {
      case "requirement":
        $filter_names=array("name","description","comments","created_from","created_to","approved_from","approved_to","active","is_product_specific"); //pole vsech nazvu promennych filtru, ktere jsou typu string
        $filter_arrays=array("creators_id","approvers_id","parents_id","categories_id","dependences_id"); //pole vsech nazvu promennych filtru, ktere jsou typu array        
      break;
      case "product":
        $filter_names=array("name","description","comments","created_from","created_to","approved_from","approved_to"); //pole vsech nazvu promennych filtru, ktere jsou typu string
        $filter_arrays=array("creators_id","approvers_id","parents_id","categories_id"); //pole vsech nazvu promennych filtru, ktere jsou typu array        
      break;
      case "test":
        $filter_names=array("name","created_from","created_to","approved_from","approved_to","acceptance_criteria","comments","terminate_from","terminate_to"); //pole vsech nazvu promennych filtru, ktere jsou typu string
        $filter_arrays=array("creators_id","approvers_id","terminators_id"); //pole vsech nazvu promennych filtru, ktere jsou typu array        
      break;
      case "test_run":
        $filter_names=array("name","created_from","created_to","approved_from","approved_to","tested_from","tested_to","sw_rev","hw_rev","setup","result","duration","description"); //pole vsech nazvu promennych filtru, ktere jsou typu string
        $filter_arrays=array("creators_id","approvers_id","testers_id"); //pole vsech nazvu promennych filtru, ktere jsou typu array        
      break;
    }
    if (!isset($_GET["button_clear"])) //pokud nebylo kliknuto na tlacitko smazat filtr
    {
      $cookie_filter=true;
      foreach ($filter_names as $key => $name) //pruchod pres jednotlive prommenne filtru, ktere jsou typu string
      {
        if (!isset($_GET[$name]) || !is_string($_GET[$name])) continue; //test promenne filtru v get
        $cookie_filter=false; //pokud je alespon jedna promenna filtru v get, nebude se cist z cookie
        $filter[$name]=$_GET[$name]; //prevedeni z $_GET do $filter pro dalsi zpracovani
      }
      foreach ($filter_arrays as $key => $name) //pruchod pres jednotlive prommenne filtru, ktere jsou typu array
      {
        if (!isset($_GET[$name]) || !is_array($_GET[$name])) continue; //test promenne filtru v get
        $arr=array_unique($_GET[$name]); //odstraneni duplicitnich hodnot
        foreach ($arr as $key2 => $id)
        {
          if (!is_numeric($id) || $id!=(int)$id || $id<-2) continue; //hodnota musi byt typu int
          elseif ($_GET["subpage2"]!="filter" && $id<-1) continue; //na strance filtru umoznime nanastavenou hodnotu, jinde vsak ne
          $cookie_filter=false; //pokud je alespon jedna promenna filtru v get, nebude se cist z cookie
          $filter[$name][$key2]=$id; //prevedeni z $_GET do $filter pro dalsi zpracovani
        }
      }
    }
    elseif (isset($_COOKIE["$webdoc[main_table]_filter"])) //kliknuto na clear - vymazani vsech cookies
    {
      foreach ($_COOKIE["$webdoc[main_table]_filter"] as $name => $value)
      {
        if (is_array($value)) foreach ($value as $key => $id) setcookie("$webdoc[main_table]_filter[$name][$key]","",0); // pole id hodnot
        else setcookie("$webdoc[main_table]_filter[$name]","",0); //string hodnota
      }
    }
    if ($cookie_filter && is_array($_COOKIE["$webdoc[main_table]_filter"])) //precteni z cookies v pripade, ze filtr neni v get, cookie filtru je pole
    {
      foreach ($filter_names as $key => $name) //pruchod pres jednotlive prommenne filtru, ktere jsou typu string
      {
        if (!isset($_COOKIE["$webdoc[main_table]_filter"][$name]) || !is_string($_COOKIE["$webdoc[main_table]_filter"][$name])) continue; //test promenne filtru v cookies
        $url_filter.="&$name=".$_COOKIE["$webdoc[main_table]_filter"][$name]; //prevod hodnoty do url
      }
      foreach ($filter_arrays as $key => $name) //pruchod pres jednotlive prommenne filtru, ktere jsou typu array
      {
        if (!isset($_COOKIE["$webdoc[main_table]_filter"][$name]) || !is_array($_COOKIE["$webdoc[main_table]_filter"][$name])) continue; //test promenne filtru v cookies
        $arr=array_unique($_COOKIE["$webdoc[main_table]_filter"][$name]); //odstraneni duplicitnich hodnot
        foreach ($arr as $key2 => $id)
        {
          if (!is_numeric($id) || $id!=(int)$id || $id<-2) continue; //hodnota musi byt typu int
          elseif ($_GET["subpage2"]!="filter" && $id<-1) continue; //na strance filtru umoznime nanastavenou hodnotu, jinde vsak ne
          $url_filter.="&$name"."[$key2]=$id"; //prevod hodnoty do url
        }
      }
    }
  }

  //zpracovani sloupcu
  if (!isset($_GET["subpage2"]) || $_GET["subpage2"]=="filter" || $_GET["subpage2"]=="columns" || $_GET["subpage2"]=="export" || $_GET["subpage2"]=="history") //pouze u hlavnich tabulek a u historie
  {
    $cookie_columns=true;
    switch ($webdoc["main_table"])
    {
      case "requirement": $columns_array=array("name","category","parent","created","creator","approved","approver","active","description","comments","is_product_specific","actions"); break;
      case "product": $columns_array=array("name","category","parent","created","creator","approved","approver","description","comments","actions"); break;
      case "test": $columns_array=array("name","created","creator","approved","approver","acceptance_criteria","comments","terminate","terminator","actions"); break;
      case "test_run": $columns_array=array("name","created","creator","approved","approver","tested","tester","sw_rev","hw_rev","setup","result","duration","description","actions"); break;
    }
    if (is_array($_GET["columns"])) foreach ($_GET["columns"] as $name => $value) //pruchod sloupci v get
    {
      if (!in_array($name,$columns_array)) continue; //kontrola spravne hodnoty v get
      if ($_GET["columns"]["name"]=="1") $columns[$name]="1";
      else $url_columns.="&columns[$name]=1"; //pokud neni nastaven sloupec name, presmeruje se
      $cookie_columns=false; //pokud je alespon jedna promenna sloupce v get, nebude se cist z cookie
    }
    if ($_GET["columns"]["name"]!="1") $url_columns.="&columns[$name]=1"; //sloupec name se zobrazi vzdy
    if ($cookie_columns) //vytvoreni url z cookie a presmerovani v pripade, ze sloupce nejsou v get ani v cookies - vychozi nastaveni sloupcu
    {
      $url_columns="";
      if (is_array($_COOKIE["columns"])) foreach ($_COOKIE["columns"] as $name => $value) //cteni sloupcu z cookies
      {
        if (!in_array($name,$columns_array)) continue; //kontrola spravne hodnoty v cookies
        $url_columns.="&columns[$name]=1";
      }
      if (!$url_columns) $url_columns="&columns[name]=1&columns[actions]=1"; //pokud v cookies nic neni, vychozi nastaveni
      if ($url_columns && !isset($_COOKIE["columns"]["name"])) $url_columns.="&columns[name]=1"; //pokud v cookies neni sloupec name, prida se tam
    }
  }
  
  //zpracovani stranek
  if ($_GET["page"]>0 && $_GET["page"]==(int)$_GET["page"]) $pages["page"]=$_GET["page"]; //cislo aktualni stranky. Nejprve se cte z get, pokud tam neni, tak z cookies, pokud neni ani tam, tak se nastavi napevno
  elseif ($_GET["subpage2"]!="history" && $_COOKIE["$webdoc[main_table]_pages"]["page"]>0 && $_COOKIE["$webdoc[main_table]_pages"]["page"]==(int)$_COOKIE["$webdoc[main_table]_pages"]["page"]) $pages["page"]=$_COOKIE["$webdoc[main_table]_pages"]["page"]; //cteni teto cookie pouze u hlavniho vypisu
  else $pages["page"]=1;
  if ($_GET["records"]>0 && $_GET["records"]==(int)$_GET["records"]) $pages["records"]=$_GET["records"]; //pocet zaznamu zobrazenych na jedne strance
  elseif ($_COOKIE["pages"]["records"]>0 && $_COOKIE["pages"]["records"]==(int)$_COOKIE["pages"]["records"]) $pages["records"]=$_COOKIE["pages"]["records"];
  else $pages["records"]=10;
  if (!isset($_GET["page"]) || $_GET["page"]<1 || $_GET["page"]!=(int)$_GET["page"] || !isset($_GET["records"]) || $_GET["records"]<1 || $_GET["records"]!=(int)$_GET["records"]) //pokud parametry stranek nebyly v get nebo byly neplatne, presmeruje se na nove url, kde parametry stranek budou
  {
    $url_pages.="&page=$pages[page]&records=$pages[records]";
  }
  else $pages["from"]=$pages["records"]*$pages["page"]-$pages["records"]; //poradi zaznamu, od ktereho se ma vypisovat

  //zpracovani razeni
  switch ($webdoc["main_table"])
  {
    //vytvoreni pole vsech moznych parametru razeni, v zavislosti na vypisovane tabulce
    case "requirement_category": case "product_category": $sort_array=array("name","name desc","parent","parent desc","time","time desc","person","person desc","description","description desc"); break;
    case "requirement": $sort_array=array("name","name desc","parent","parent desc","created","created desc","creator","creator desc","approved","approved desc","approver","approver desc","description","description desc","comments","comments desc","category","category desc","active","active desc","is_product_specific","is_product_specific desc"); break;
    case "product": $sort_array=array("name","name desc","parent","parent desc","created","created desc","creator","creator desc","approved","approved desc","approver","approver desc","description","description desc","comments","comments desc","category","category desc"); break;
    case "test": $sort_array=array("name","name desc","created","created desc","creator","creator desc","approved","approved desc","approver","approver desc","comments","comments desc","acceptance_criteria","acceptance_criteria desc","terminate","terminate desc","terminator","terminator desc"); break;
    case "test_run": $sort_array=array("name","name desc","created","created desc","creator","creator desc","approved","approved desc","approver","approver desc","tested","tested desc","tester","tester desc","sw_rev","sw_rev desc","hw_rev","hw_rev desc","setup","setup desc","result","result desc","duration","duration desc","description","description desc"); break;
  }
  if (isset($_GET["sort"]) && is_array($_GET["sort"])) foreach (array_unique($_GET["sort"]) as $key => $name) //pruchod pres parametry razeni v get
  {
    if (in_array($name,$sort_array)) $sort[]=$name; //prevod z get do vlastni promenne $sort, pokud je promenna v get platna
  }
  if (isset($_GET["subpage2"]))
  {
    if ($_GET["subpage2"]=="history") $tmp="_history";
    if ($_GET["subpage2"]=="categories") $tmp="_categories";
  }
  if (!isset($sort) && isset($_COOKIE["sort$tmp"]) && is_array($_COOKIE["sort$tmp"])) foreach (array_unique($_COOKIE["sort$tmp"]) as $key => $name) //precteni razeni z cookies, pokud v get nic neni
  {
    if (in_array($name,$sort_array)) $url_sort.="&sort[]=$name"; //pokud je razeni v cookies a v get neni, presmeruje se na nove get
  }
  if (!isset($sort) && !isset($url_sort)) //pokud razeni neni v get ani v cookies, nastaveni na vychozi razeni podle jmena a nasledne presmerovani
  {
    if ($webdoc["main_table"]=="requirement_category" || $webdoc["main_table"]=="product_category") $url_sort.="&sort[]=time desc";
    $url_sort.="&sort[]=created desc";
  }

  //presmerovani, pokud filtr, sloupce, stranky nebo razeni nebyly v get
  if (isset($url_columns) || isset($url_filter) || isset($url_pages) || isset($url_sort) || isset($_GET["button_change"]))
  {
    $url="./?subpage1=$_GET[subpage1]";
    if (isset($_GET["button_change"])) $url.="&subpage2=filter";
    elseif (isset($_GET["subpage2"])) $url.="&subpage2=$_GET[subpage2]";
    if (isset($_GET["test_id"]) && $webdoc["main_table"]=="test") $url.="&test_id=$_GET[test_id]";
    if (isset($_GET["sequence_id"]) && $webdoc["main_table"]=="test") $url.="&sequence_id=$_GET[sequence_id]";
    if (isset($_GET["test_run_id"]) && $webdoc["main_table"]=="test_run") $url.="&test_run_id=$_GET[test_run_id]";
    if (isset($url_columns)) $url.=$url_columns; else $url.=kernel_create_columns_url($columns);
    if (isset($url_filter)) $url.=$url_filter; else $url.=kernel_create_filter_url($filter);
    if (isset($url_pages)) $url.=$url_pages; else $url.=kernel_create_pages_url($pages);
    if (isset($url_sort)) $url.=$url_sort; else $url.=kernel_create_sort_url($sort);
    header("location: $url"); //presmerovani
    echo database_get_message("continue")." <a href=\"$url\">".database_get_message("here")."</a>."; //zobrazeni hlasky "pokracovat zde", pokud selze presmerovani
    exit;      
  }
}

/**
 * Vytvoří url pro řazení podle jednotlivých sloupců
 * \param array $sort je pole sloupců, podle kterých se má řadit aktuální výpis záznamů
 * \param array &$sort2 je pole, které obsahuje url pro jednotlivé sloupce, pokud by mělo řadit podle nich
 * \param array [$columns] je pole sloupců    
 */
function kernel_create_sort($sort,&$sort2,$columns=NULL)
{
  if ($_GET["subpage2"]=="categories") $columns=array("name","parent","time","person","description"); //pole vsech moznych parametru razeni
  if ($columns) foreach ($columns as $column => $value) //nastaveni odkazu pro trideni pro jednotlive sloupce
  {
    if ($column=="actions") continue;
    $sort2["asc"][$column]="?subpage1=$_GET[subpage1]$sort2[url]&sort[]=$column"; //prvni v poradi je vzdy razeni podle daneho sloupce
    $sort2["desc"][$column]=$sort2["asc"][$column]." desc";
    $i=1;
    foreach ($sort as $key => $name)
    {
      if ($i>4) break;
      if ($name==$column || $name==$column." desc") continue;      
      $i++;
      $sort2["asc"][$column].="&sort[]=$name";
      $sort2["desc"][$column].="&sort[]=$name";
    }
  }
}

/**
 * Naplní pole $pages hodnotami stránek, např. seznamem stránek, sezname počtu příspěvků na stránku, url adresami, apod.
 * \param array &$pages pole s údaji o stránce a s odkazy na další stránkz 
 */
function kernel_create_pages(&$pages)
{
  $pages["pages_total"]=ceil($pages["records_total"]/$pages["records"]); //celkovy pocet stanek
  if ($pages["pages_total"]==0) $pages["pages_total"]=1; //pri nulovem poctu prispevku se nastavi jedna strana
  
  $start=$pages["page"]-3; //pocatecni strana v souvislem vypisu stran
  $stop=$pages["page"]+3; //posledni strana v souvislem vypisu stran
  if ($start<1) $start=1; //nastaveni pocatecni a posledni stranky na seznamu stranek
  if ($stop>$pages["pages_total"]) $stop=$pages["pages_total"];

  for ($i=$start; $i<=$stop; $i++) $pages["list_pages"][]=$i; //seznam nabidnutych stranek, neboli odkazy na dalsi stranky
  if (!is_array($pages["list_pages"]) || !in_array($pages["page"],$pages["list_pages"])) $pages["list_pages"][]=$pages["page"]; //doplneni aktualni stranky do seznamu, pokud tam neni
  if (!is_array($pages["list_pages"]) || !in_array(1,$pages["list_pages"])) $pages["list_pages"][]=1; //doplneni prvni stranky do seznamu, pokud tam neni
  if (!is_array($pages["list_pages"]) || !in_array($pages["pages_total"],$pages["list_pages"])) $pages["list_pages"][]=$pages["pages_total"]; //doplneni posledni stranky do seznamu, pokud tam neni
  sort($pages["list_pages"]); //setrideni seznamu stranek
  
  foreach ($pages["list_pages"] as $key => $page) $pages["list_pages_url"][$key]="?subpage1=$_GET[subpage1]".(isset($_GET["subpage2"])?"&subpage2=$_GET[subpage2]":"")."$pages[url]&records=$pages[records]&page=$page"; //seznam url korespondujici se seznamuem stranek
  $pages["url_page_prev"]="?subpage1=$_GET[subpage1]".(isset($_GET["subpage2"])?"&subpage2=$_GET[subpage2]":"")."$pages[url]&records=$pages[records]&page=".($pages["page"]-1); //url predchozi stranky pro sipky zpet
  $pages["url_page_next"]="?subpage1=$_GET[subpage1]".(isset($_GET["subpage2"])?"&subpage2=$_GET[subpage2]":"")."$pages[url]&records=$pages[records]&page=".($pages["page"]+1); //url dalsi stranky pro sipky vpred
    
  $pages["list_records"]=array(5,10,20,30,50,100,200,500); //seznam nabidnutych poctu prispevku na stranku
  if (!in_array($pages["records"],$pages["list_records"])) $pages["list_records"][]=$pages["records"]; //doplneni aktualni poctu prispevku na stranku do seznamu, pokud tam neni
  sort($pages["list_records"]); //setrideni seznamu

  foreach ($pages["list_records"] as $key => $records) $pages["list_records_url"][$key]="?subpage1=$_GET[subpage1]".(isset($_GET["subpage2"])?"&subpage2=$_GET[subpage2]":"")."$pages[url]&records=$records&page="; //seznam url korespondujici se seznamuem stranek
  $pages["last_list_records"]=$pages["list_records"][count($pages["list_records"])-1]; //posledni hodnota v seznamu, slouzi pro jednoduchou identifikaci v sablone
}

/**
 * Vytvoří url a nastaví cookies podle proměnné řazení $sort
 * \param array $sort proměnné řazení
 * \global array $webdoc pole řídicích proměnných
 * \return string url řazení 
 */
function kernel_create_sort_url(&$sort)
{
  global $webdoc;
  if (isset($_GET["subpage2"]))
  {
    if ($_GET["subpage2"]=="categories") $tmp="_categories";
    if ($_GET["subpage2"]=="history") $tmp="_history";
  }
  //vymazani vsech cookies
  if (is_array($_COOKIE["sort$tmp"])) foreach ($_COOKIE["sort$tmp"] as $key => $name) //vymazani vsech cookies
  {
    setcookie("sort$tmp"."[$key]","",0); //samostatna hodnota
  }
  
  $time=time()+31536000; //cas vyprseni cookies, jeden rok
  $i=0;
  foreach ($sort as $key => $name)
  {
    if ($i>4) break;
    $i++;
    setcookie("sort$tmp"."[$key]","$name",$time);
    $url.="&sort[]=$name";
  }
  return $url;
}

/**
 * Vytvoří url a nastaví cookies podle proměnné stránek $pages
 * \param array $pages pole s parametry stránek
 * \global array $webdoc pole řídicích proměnných
 * \return string url stránky 
 */
function kernel_create_pages_url($pages)
{
  global $webdoc;
  if ($_GET["subpage2"]!="history") setcookie("$webdoc[main_table]_pages[page]","$pages[page]",0); //pro kazdou cast (requirement, product..) je zvlastni cookie, je pouze pro vypis zaznamu (ne historie), cas vyprseni cookie do konce relace
  setcookie("pages[records]","$pages[records]",time()+31536000); //cookie je spolecna pro vsechny casti (requirement, product..) cas vyprseni jeden rok
  return "&page=$pages[page]&records=$pages[records]";
}

/**
 * Vytvoří url a nastaví cookies podle proměnné sloupců $columns
 * \param array $columns pole s parametry sloupců
 * \global array $webdoc pole řídicích proměnných
 * \return string url sloupců 
 */
function kernel_create_columns_url($columns)
{
  global $webdoc;
  $time=time()+31536000; //cas vyprseni cookies, jeden rok
  switch ($webdoc["main_table"])
  {
    case "requirement": $columns_names=array("name","category","parent","created","creator","approved","approver","active","description","comments","is_product_specific","actions"); break;
    case "product": $columns_names=array("name","category","parent","created","creator","approved","approver","description","comments","actions"); break;
    case "test": $columns_names=array("name","created","creator","approved","approver","acceptance_criteria","comments","terminate","terminator","actions"); break;
    case "test_run": $columns_names=array("name","created","creator","approved","approver","tested","tester","sw_rev","hw_rev","setup","result","duration","description","actions"); break;
    default: return;
  }
  $url="";
  foreach ($columns_names as $key => $name)
  {
    if (isset($columns[$name]))
    {
      setcookie("columns[$name]","1",$time);
      $url.="&columns[$name]=1";
    }
    elseif (count($_COOKIE["columns"])>0 && isset($_COOKIE["columns"][$name])) setcookie("columns[$name]","",0);
  }
  return $url;
}

/**
 * Vrátí url s parametry podle nastavení filtru
 * \param array $filter hodnoty filtru
 * \return string url s parametry filtru
 */
function kernel_create_filter_url($filter)
{
  global $webdoc;
  $time=time()+31536000; //cas vyprseni cookies, jeden rok

  //fultextove, casove a bool promenne
  switch ($webdoc["main_table"])
  {
    case "requirement": $filter_names=array("name","description","comments","created_from","created_to","approved_from","approved_to","active","is_product_specific"); break;
    case "product": $filter_names=array("name","description","comments","created_from","created_to","approved_from","approved_to"); break;
    case "test": $filter_names=array("name","created_from","created_to","approved_from","approved_to","acceptance_criteria","comments","terminate_from","terminate_to"); break;
    case "test_run": $filter_names=array("name","created_from","created_to","approved_from","approved_to","tested_from","tested_to","sw_rev","hw_rev","setup","result","duration","description"); break;
    default: return;
  }
  
  if (isset($_COOKIE["$webdoc[main_table]_filter"])) //vymazani vsech cookies
  {
    foreach ($_COOKIE["$webdoc[main_table]_filter"] as $name => $value)
    {
      if (is_array($value)) foreach ($value as $key => $id) setcookie("$webdoc[main_table]_filter[$name][$key]","",0); // pole id hodnot
      else setcookie("$webdoc[main_table]_filter[$name]","",0); //samostatna hodnota
    }
  }
  $url="";
  
  foreach ($filter_names as $key => $name)
  {
    if (strlen($filter[$name])>0)
    {
      $url.="&$name=".$filter[$name];
      setcookie("$webdoc[main_table]_filter[$name]",$filter[$name],$time);
    }
  }
  //id promenne - pruchod id polozek filtru, kterych lze zadat libovolny pocet. $name jmeno polozky filtru (napr. "categories_id"). Je to klic pole $filter (napr. $filter["categories_id"]). $name_key je klic ke jmenu polozky filtru
  
  switch ($webdoc["main_table"])
  {
    case "requirement": $filter_names=array("categories_id","parents_id","creators_id","approvers_id","dependences_id"); break;
    case "product": $filter_names=array("categories_id","parents_id","creators_id","approvers_id"); break;
    case "test": $filter_names=array("creators_id","approvers_id","terminators_id"); break;
    case "test_run": $filter_names=array("creators_id","approvers_id","testers_id"); break;
  }
  
  foreach ($filter_names as $name_key => $name)
  {
    if (is_array($filter[$name])) //test existence polozky (pokud byla zadana)
    {
      $array_id=array_unique($filter[$name]); //ziskani id hodnot polozky filtru a soucasne odstraneni duplicitnich prvku
      foreach ($array_id as $key => $id) //pruchod id hodnotami polozky filtru. $id je jedna id hodnota a $key je klic k id hodnote
      {
        if ($id>=-1 || ($_GET["subpage2"]=="filter" && !isset($_GET["button_filtrate"]) && $id==-2)) $url.="&$name"."[$key]=$id"; //pokud je hodnota id >= -1, vlozi se do url. Pr.: &categories_id[2]=43
        if ($id>=-1) setcookie("$webdoc[main_table]_filter[$name][$key]",$id,$time);
      }
    }
  }

  return $url;
}

/**
 * Kontrola správnosti zadaného data. Využívá se k tomu funkce date_parse, která rozpozná datum v různých formátech. Funkce upravuje datum tak, aby funkce rozpoznala i částečně zadané datum (např. pouze rok). Použití u filtru
 * \param string $date datum a čas v různých formátech
 * \return string upravené datum, pokud bylo korektně zadáno, bool true pokud nebylo zadáno, bool false pokud bylo zadáno nekorektně   
 */
function kernel_date_control($date)
{
  if (!isset($date) || $date=="") return true;
  $date_split=split('[:_ /.-]',$date);

  //pokud byl zadan pouze rok, doplni se mesic. Pokud byl zadan den, dolni se mesic a rok
  if (count($date_split)==1 || (count($date_split)==2 && $date_split[1]=="")) //zadano pouze jedno cislo
  {
    if ($date_split[0]>999) $date.=(count($date_split)==1?"-":"")."0"; //je-li cislo vetsi nez 999, jenda se o rok. jako mesic se doplni nula, aby funkce date_parse spravne rozpoznala, ze byl zadan rok 
    elseif ($date_split[0]>0 && $date_split[0]<32) //je-li cislo v rozmezi 1-31, jedna se o den. doplni se aktualni mesic a rok.
    {
      $date_new1=getdate(); //aktualni cas (timestamp)
      $date_new2=getdate(mktime(0,0,0,$date_new1["mon"],$date_split[0],$date_new1["year"])); //den u aktualniho casu preveden na zacany den
      if ($date_new1["year"]==$date_new2["year"] && $date_new1["mon"]==$date_new2["mon"]) $date.=(count($date_split)==1?".":"").$date_new1["mon"].".".$date_new1["year"]; //porovnani mesice a roku. Pokud sedi, je zadany den korektni vuci aktualnimu datu. Doplni se mesice a rok
    }
  }
  //pokud bylo zadano datum a hodina, doplni se minuta
  elseif (count($date_split)==4 || (count($date_split)==5 && $date_split[4]=="")) //zadano 4 cisla
  {
    $date_new=date_parse($date);
    if ($date_new["year"]>0 && $date_new["month"]>=0 && $date_new["day"]>=0) $date.=(count($date_split)==4?":":"")."0";
  }
  $date_parse=date_parse($date);
  
  if ($date_parse["error_count"]==0 && $date_parse["warning_count"]==0 && $date_parse["year"]>0) return $date;
  return false;
}

/**
 * Nastaví proměnné určující záznam ($sequence_id a $version nebo $category_id) do $webdoc
 * \global array $webdoc pole řídicích proměnných
 * \global object $template šablona  
 */
function kernel_set_variables()
{
  global $webdoc, $template;

  switch ($webdoc["main_table"])
  {
    case "requirement": case "product": case "test": $variable="sequence_id"; break;
    case "requirement_category": case "product_category": $variable="category_id"; break;
    case "test_run": $variable="test_run_id"; break;
  }
  if (!isset($variable)) return false;
  if (isset($_GET[$variable]) && $_GET[$variable]>=0)
  {
    $webdoc[$variable]=(int)$_GET[$variable];
    $_SESSION["$webdoc[main_table]_$variable"]=$webdoc[$variable];
    $template->template_assign($variable,$webdoc[$variable]); //pro zobrazeni odkazu pro vybrany zaznam
  }
  elseif (isset($_SESSION["$webdoc[main_table]_$variable"]) && $_SESSION["$webdoc[main_table]_$variable"]>=0)
  {
    $webdoc[$variable]=$_SESSION["$webdoc[main_table]_$variable"];
    $template->template_assign($variable,$webdoc[$variable]); //pro zobrazeni odkazu pro vybrany zaznam
  }
  if ($variable=="sequence_id" && isset($_GET["version"]))
  {
    $webdoc["version"]=(int)$_GET["version"];
  }
}

/**
 * Otestuje existenci skriptu a načte ho, případně načte hlavní skript nebo not-found skript
 * \param int $sub vnoření (1,2,3)
 * \param int $main jméno hlavního skriptu, který se načte, pokud parametr $_GET["subpage$sub"] neexistuje, tj. načítá se hlavní strana v dané úrovni (např. list.php)
 * \global array $webdoc pole řídicích proměnných, které využívají volané skripty
 * \global object $template šablona       
 */ 
function kernel_require_script($sub,$main)
{
  global $webdoc, $template;
  if (!$webdoc["database_connection"]) return false;
  $url="./"; //url pro pripadne presmerovani
  $dir=""; //slozka, ve ktere je nacitany skript
  for ($i=1; $i<$sub; $i++) //zpracovani parametru $_GET["subpage$i"], kde $i je od 1 do $sub-1 a vytvoreni $url a $dir 
  {
    if (isset($_GET["subpage$i"]))
    {
      $dir.=$_GET["subpage$i"]."/";
      if ($i==1) $url.="?"; else $url.="&";
      $url.="subpage$i=".$_GET["subpage$i"];
    }
    else break;
  }
  $dir="pages/".$dir;

  if (!isset($_GET["subpage$sub"])) //test existence parametru $_GET["subpage$sub"]
  {
    if (is_file("./$dir$main.php")) require "./$dir$main.php"; //pokud neexistuje, nacte se hlavni stranka v danem zanoreni (existuje-li)
    else require "./not-found.php"; //nacteni chybove stranky, pokud skript neexistuje    
  }
  else //pokud parametr existuje
  {
    if ($_GET["subpage$i"]==$main) //test, zda je v $_GET["subpage$sub"] vychozi soubor 
    {
      header("location: $url"); //pokud ano, presmerovani na hlavni skript, ale bez $_GET["subpage$i"] v url
      exit();
    } 
    if (is_file("./".$dir.$_GET["subpage$i"].".php")) require "./".$dir.$_GET["subpage$i"].".php"; //nacteni skriptu, pokud existuje
    else require "./not-found.php"; //nacteni chybove stranky, pokud skript neexistuje
  }
}

?>
