<?php

function HumanDate(int $Time): string
{
  return date('j.n.Y', $Time);
}

function HumanTime(int $Time): string
{
  return date('H:i:s', $Time);
}

function HumanDateTime(int $Time): string
{
  $Output = HumanDate($Time);
  $Time = HumanTime($Time);
  if ($Time != '00:00:00') $Output .= ' '.$Time;
  return $Output;
}

function Link2(string $URL): string
{
  global $Config;

  return $Config['BaseURL'].$URL;
}

function ProcessURL(): array
{
  if (array_key_exists('REDIRECT_QUERY_STRING', $_SERVER))
    $PathString = $_SERVER['REDIRECT_QUERY_STRING'];
    else $PathString = '';
  if (substr($PathString, -1, 1) == '/') $PathString = substr($PathString, 0, -1);
  $PathItems = explode('/', $PathString);
  if (array_key_exists('REQUEST_URI', $_SERVER) and (strpos($_SERVER['REQUEST_URI'], '?') !== false))
    $_SERVER['QUERY_STRING'] = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], '?') + 1);
    else $_SERVER['QUERY_STRING'] = '';
  parse_str($_SERVER['QUERY_STRING'], $_GET);
  return $PathItems;
}

function GetQueryStringArray(string $QueryString): array
{
  $Result = array();
  $Parts = explode('&', $QueryString);
  foreach ($Parts as $Part)
  {
    if ($Part != '')
    {
      if (!strpos($Part, '=')) $Part .= '=';
      $Item = explode('=', $Part);
      $Result[$Item[0]] = $Item[1];
    }
  }
  return $Result;
}

function SetQueryStringArray(array $QueryStringArray): string
{
  $Parts = array();
  foreach ($QueryStringArray as $Index => $Item)
  {
    if ($Index != 'lvm') $Parts[] = $Index.'='.$Item;
  }
  return implode('&amp;', $Parts);
}

function HumanSize(int $Value): string
{
  global $UnitNames;

  $UnitIndex = 0;
  while ($Value > 1024)
  {
    $Value = round($Value / 1024, 3);
    $UnitIndex++;
  }
  return $Value.' '.$UnitNames[$UnitIndex];
}

function GetPageList(int $TotalCount): array
{
  global $Config;

  $QueryItems = GetQueryStringArray($_SERVER['QUERY_STRING']);

  $ItemPerPage = (int)$Config['ItemsPerPage'];
  $Around = round((int)$Config['VisiblePagingItems'] / 2);
  $Result = '';
  $PageCount = floor($TotalCount / $ItemPerPage) + 1;

  if (!array_key_exists('Page', $_SESSION)) $_SESSION['Page'] = 0;
  if (array_key_exists('page', $_GET)) $_SESSION['Page'] = $_GET['page'] * 1;
  if ($_SESSION['Page'] < 0) $_SESSION['Page'] = 0;
  if ($_SESSION['Page'] >= $PageCount) $_SESSION['Page'] = $PageCount - 1;
  $CurrentPage = $_SESSION['Page'];


  $Result .= 'Počet položek: <strong>'.$TotalCount.'</strong> &nbsp; Stránky: ';

  $Result = '';
  if ($PageCount > 1)
  {
    if ($CurrentPage > 0)
    {
      $QueryItems['page'] = 0;
      $Result.= '<a href="?'.SetQueryStringArray($QueryItems).'">&lt;&lt;</a> ';
      $QueryItems['page'] = ($CurrentPage - 1);
      $Result.= '<a href="?'.SetQueryStringArray($QueryItems).'">&lt;</a> ';
    }
    $PagesMax = $PageCount - 1;
    $PagesMin = 0;
    if ($PagesMax > ($CurrentPage + $Around)) $PagesMax = $CurrentPage + $Around;
    if ($PagesMin < ($CurrentPage - $Around))
    {
      $Result.= ' ... ';
      $PagesMin = $CurrentPage - $Around;
    }
    for ($i = $PagesMin; $i <= $PagesMax; $i++)
    {
      if ($i == $CurrentPage) $Result.= '<strong>'.($i + 1).'</strong> ';
      else {
       $QueryItems['page'] = $i;
       $Result .= '<a href="?'.SetQueryStringArray($QueryItems).'">'.($i + 1).'</a> ';
      }
    }
    if ($PagesMax < ($PageCount - 1)) $Result .= ' ... ';
    if ($CurrentPage < ($PageCount - 1))
    {
      $QueryItems['page'] = ($CurrentPage + 1);
      $Result.= '<a href="?'.SetQueryStringArray($QueryItems).'">&gt;</a> ';
      $QueryItems['page'] = ($PageCount - 1);
      $Result.= '<a href="?'.SetQueryStringArray($QueryItems).'">&gt;&gt;</a>';
    }
  }
  $Result = '<div style="text-align: center">'.$Result.'</div>';
  return array('SQLLimit' => ' LIMIT '.$CurrentPage * $ItemPerPage.', '.$ItemPerPage,
    'Page' => $CurrentPage,
    'Output' => $Result,
  );
}

$OrderDirSQL = array('ASC', 'DESC');
$OrderArrowImage = array('sort_asc.png', 'sort_desc.png');

function GetOrderTableHeader(array $Columns, string $DefaultColumn, int $DefaultOrder = 0): array
{
  global $OrderDirSQL, $OrderArrowImage, $Config;

  if (array_key_exists('OrderCol', $_GET)) $_SESSION['OrderCol'] = $_GET['OrderCol'];
  if (array_key_exists('OrderDir', $_GET) and (array_key_exists($_GET['OrderDir'], $OrderArrowImage)))
    $_SESSION['OrderDir'] = $_GET['OrderDir'];
  if (!array_key_exists('OrderCol', $_SESSION)) $_SESSION['OrderCol'] = $DefaultColumn;
  if (!array_key_exists('OrderDir', $_SESSION)) $_SESSION['OrderDir'] = $DefaultOrder;

  // Check OrderCol
  $Found = false;
  foreach ($Columns as $Column)
  {
    if ($Column['Name'] == $_SESSION['OrderCol'])
    {
      $Found = true;
      break;
    }
  }
  if ($Found == false)
  {
    $_SESSION['OrderCol'] = $DefaultColumn;
    $_SESSION['OrderDir'] = $DefaultOrder;
  }
  // Check OrderDir
  if (($_SESSION['OrderDir'] != 0) and ($_SESSION['OrderDir'] != 1)) $_SESSION['OrderDir'] = 0;

  $Result = '';
  $QueryItems = GetQueryStringArray($_SERVER['QUERY_STRING']);
  foreach ($Columns as $Index => $Column)
  {
    $QueryItems['OrderCol'] = $Column['Name'];
    $QueryItems['OrderDir'] = 1 - $_SESSION['OrderDir'];
    if ($Column['Name'] == $_SESSION['OrderCol']) $ArrowImage = '<img style="vertical-align: middle; border: 0px;" src="'.
      Link2('/images/'.$OrderArrowImage[$_SESSION['OrderDir']]).'" alt="order arrow"/>';
      else $ArrowImage = '';
    if ($Column['Name'] == '') $Result .= '<th>'.$Column['Title'].'</th>';
      else $Result .= '<th><a href="?'.SetQueryStringArray($QueryItems).'">'.$Column['Title'].$ArrowImage.'</a></th>';
  }
  return array(
    'SQL' => ' ORDER BY `'.$_SESSION['OrderCol'].'` '.$OrderDirSQL[$_SESSION['OrderDir']],
    'Output' => '<tr>'.$Result.'</tr>',
    'Column' => $_SESSION['OrderCol'],
    'Direction' => $_SESSION['OrderDir'],
  );
}

function GetMicrotime(): float
{
  list($Usec, $Sec) = explode(' ', microtime());
  return (float)$Usec + (float)$Sec;
}

class Filter
{
  var $Items = array();

  function GetOutput(string $Link): string
  {
    $Output = '';
    foreach ($this->Items as $Item)
    {
      if (($Item['Type'] == 'String') or ($Item['Type'] == 'Enumeration') or ($Item['Type'] == 'Boolean'))
      {
        if (!array_key_exists($Item['Name'], $_SESSION)) $_SESSION[$Item['Name']] = '';
      } else
      if ($Item['Type'] == 'Integer')
      {
        if (!array_key_exists($Item['Name'].'od', $_SESSION)) $_SESSION[$Item['Name'].'od'] = '';
        if (!array_key_exists($Item['Name'].'do', $_SESSION)) $_SESSION[$Item['Name'].'do'] = '';
      }
    }

    if (array_key_exists('lvm', $_GET) and ($_GET['lvm'] == 'seznam'))
    {
      foreach ($this->Items as $Item)
      {
        if ($Item['Type'] == 'String')
        {
          if (array_key_exists($Item['Name'], $_GET) ) $_SESSION[$Item['Name']] = $_GET[$Item['Name']];
        } else
        if (($Item['Type'] == 'Enumeration') or ($Item['Type'] == 'Boolean'))
        {
          if (array_key_exists($Item['Name'], $_GET) ) $_SESSION[$Item['Name']] = $_GET[$Item['Name']];
          if ($_SESSION[$Item['Name']] == '0') $_SESSION[$Item['Name']] = '';
        } else
        if ($Item['Type'] == 'Integer')
        {
          if (array_key_exists($Item['Name'].'od', $_GET) ) $_SESSION[$Item['Name'].'od'] = $_GET[$Item['Name'].'od'];
          if ($_SESSION[$Item['Name'].'od'] == '0') $_SESSION[$Item['Name'].'od'] = '';
          if (array_key_exists($Item['Name'].'do', $_GET) ) $_SESSION[$Item['Name'].'do'] = $_GET[$Item['Name'].'do'];
          if ($_SESSION[$Item['Name'].'do'] == '0') $_SESSION[$Item['Name'].'do'] = '';
        }
      }
    } else
    {
      $Output .= '<script type="text/javascript">function reloadlist(){ $(\'#meetlist\').load(document.URL + \' #meetlist\');}'.
      ' var load_timer = 100;
   var ltimer = null;

   function checkOut(kc, obj)
   {
      if (kc == 13) $(obj).blur();
   }
   function initLTimer(tm)
   {
      if (ltimer) clearTimeout(ltimer);
      ltimer = setTimeout("freloader()", tm);
   }
   function stopLTimer()
   {
      if (ltimer) clearTimeout(ltimer);
      ltimer = null;
   }

   var cf = {};

   function setupc(key,val)
   {
      //console.log(\'setup-control-\' + key + \' = \' + val);
      ';
      $Keys = array();
      foreach ($this->Items as $Item)
      {
        if ($Item['Type'] == 'Integer')
        {
          $Keys[] = 'key == \''.$Item['Name'].'od\'';
          $Keys[] = 'key == \''.$Item['Name'].'do\'';
        }
      }
      if (count($Keys) > 0)
      {
        $Output .= 'if ('.implode(' || ', $Keys).')
        {
          var ccv = $(\'#\' + key).val();
          if (ccv != val) $(\'#\' + key).val(val == 0 ? \'\' : val);
        }
        ';
      }

      $Keys = array();
      foreach ($this->Items as $Item)
      {
        if (($Item['Type'] == 'Enumeration') or ($Item['Type'] == 'Boolean'))
        {
          $Keys[] = 'key == \''.$Item['Name'].'\'';
        }
      }
      if (count($Keys) > 0)
      {
        $Output .= 'if ('.implode(' || ', $Keys).')
        {
           $(\'.c\' + key).removeClass(\'active\');
           $(\'#\' + key + val).addClass(\'active\');
        }
        ';
      }
      $Output .= '
   }

   function upf(key, val, lonreload)
   {
      if (key != \'first\') cf[\'first\'] = 0;
        else st();
      setupc(key, val);
      cf[key] = val;
      if (lonreload) initLTimer(1000);
        else initLTimer(100);
   }

   function freloader()
   {
      ltimer = null;
      var qp = jQuery.param(cf);
      $(\'#list_content\').html(\'\');
      $(\'#list_loading\').show();
      $.get(\''.$Link.'?lvm=seznam&\' + qp, function(data)
      {
        $(\'#list_loading\').hide();
        $(\'#list_content\').html(data);
      });
   }'.
      '</script>
      <div class="table-filter">';
      foreach ($this->Items as $Item)
      {
        if ($Item['Type'] == 'String')
        {
          $Output .= '<div class="filter-num-box">'.
            '<div class="label-box">'.$Item['Title'].'</div>'.
            '<input value="'.$_SESSION[$Item['Name']].'" onkeyup="if (event.keyCode!=9) upf(\''.$Item['Name'].'\',$(this).val(),(event.keyCode==13?0:1)); '.
            '" id="'.$Item['Name'].'" autocomplete="off" type="text"/>'.
            '</div> ';
        } else
        if ($Item['Type'] == 'Boolean')
        {
          $Output .= '<div class="btn-group ma3">';
          $Output .= '<button class="btn btn-filter';
          $Output .= ' c'.$Item['Name'].'" onclick="upf(\''.$Item['Name'].'\',cf.'.$Item['Name'].'?0:1)" id="'.$Item['Name'].'1" data-toggle="tooltip" '.
            'data-placement="top" title="'.$Item['Title'].'"><span>'.$Item['Title'].'</span></button>';
          $Output .= '</div>';
        } else
        if ($Item['Type'] == 'Enumeration')
        {
          $Output .= '<div class="btn-group ma3">'.
            '<div class="label-box">'.$Item['Title'].'</div>';
          foreach ($Item['States'] as $EnumIndex => $EnumItem)
          {
            $Output .= '<button class="btn btn-filter c'.$Item['Name'].' btn-ico" onclick="upf(\''.$Item['Name'].'\','.$EnumIndex.')" id="'.
              $Item['Name'].$EnumIndex.'" data-toggle="tooltip" '.
              'data-placement="top" title="'.$EnumItem.'"><span class="icon-'.$EnumIndex.'"></span></button>';
          }
          $Output .= '</div>';
        } else
        if ($Item['Type'] == 'Integer')
        {
          $Output .= '<div class="filter-num-box">'.
            '<div class="label-box">'.$Item['Title'].'</div>'.
            '<input value="'.$_SESSION[$Item['Name'].'od'].'" onkeyup="if (event.keyCode!=9) upf(\''.$Item['Name'].'od\',$(this).val(),(event.keyCode==13?0:1)); '.
            '" id="'.$Item['Name'].'od" autocomplete="off" type="text"/>'.
            '<div class="label-box">-</div>'.
            '<input value="'.$_SESSION[$Item['Name'].'do'].'" onkeyup="'.
            'if (event.keyCode!=9) upf(\''.$Item['Name'].'do\',$(this).val(),(event.keyCode==13?0:1));" '.
            'id="'.$Item['Name'].'do" autocomplete="off" type="text"/>';
            if (array_key_exists('Units', $Item))
            {
              $Output .= '<div class="label-box">'.$Item['Units'].'</div>';
            }
            $Output .= '</div> ';
        }
      }
      $Output .= '</div>';
    }
    return $Output;
  }

  function GetWhere(Database $Database): string
  {
    $Where = '';
    foreach ($this->Items as $Item)
    {
      if ($Item['DbName'] != '')
      {
        if ($Item['Type'] == 'String')
        {
          if ($_SESSION[$Item['Name']] != '')
            $Where .= ' AND ('.$Item['DbName'].' LIKE "%'.$Database->real_escape_string($_SESSION[$Item['Name']]).'%")';
        } else
        if ($Item['Type'] == 'Boolean')
        {
          if ($_SESSION[$Item['Name']] != '')
            $Where .= ' AND ('.$Item['DbName'].' = '.$Database->real_escape_string($_SESSION[$Item['Name']]).')';
        } else
        if ($Item['Type'] == 'Enumeration')
        {
          if ($_SESSION[$Item['Name']] != '')
            $Where .= ' AND ('.$Item['DbName'].' = '.$Database->real_escape_string($_SESSION[$Item['Name']]).')';
        } else
        if ($Item['Type'] == 'Integer')
        {
          if ($_SESSION[$Item['Name'].'od'] != '')
            $Where .= ' AND ('.$Item['DbName'].' >= '.$Database->real_escape_string($_SESSION[$Item['Name'].'od']).')';
          if ($_SESSION[$Item['Name'].'do'] != '')
            $Where .= ' AND ('.$Item['DbName'].' <= '.$Database->real_escape_string($_SESSION[$Item['Name'].'do']).')';
        }
      }
    }
    if (substr($Where, 0, 4) == ' AND')
      $Where = substr($Where, 4);
    if ($Where == '') $Where = '1';
    return $Where;
  }
}
