<?php
include('database.php');
include('types.php');
include('lists.php');
include('common.php');

function ShowList($List, $Column = '', $ParentId = 0)
{
  global $Database, $Types, $Config;

  $Output = '<div>'.$List['Title'].'</div><table class="WideTable"><tr>';
  foreach($List['Items'] as $Item)
  {
    if($Item['VisibleInList'] == 1)
      $Output .= '<th><a href="?OrderColumn='.$Item['Name'].'">'.$Item['TextBefore'].'</a></th>';
  }
  $Output .= '<th>Akce</th></tr>';

  if(($Column != '') and ($ParentId != 0))
    $Where = $Column.'='.$ParentId;
  else $Where = '1';

  // Handle ordering
  if(array_key_exists('OrderColumn', $_GET))
  {
    if($_SESSION['OrderColumn'] == $_GET['OrderColumn']) // Same column => reverse orded
      $_SESSION['OrderDirection'] = ($_SESSION['OrderDirection'] + 1) % 2; 
    if($_SESSION['OrderTable'] != $List['TableName']) // Different table => set ascending order
      $_SESSION['OrderDirection'] = 0;
    $_SESSION['OrderColumn'] = $_GET['OrderColumn'];
    $_SESSION['OrderTable'] = $List['TableName'];
  }
  if(array_key_exists('OrderColumn', $_SESSION) and ($_SESSION['OrderTable'] == $List['TableName']))
  {
    $OrderDirection = array('ASC', 'DESC');
    $Where .= ' ORDER BY `'.$_SESSION['OrderColumn'].'` '.$OrderDirection[$_SESSION['OrderDirection']];
  }

  if(array_key_exists('Page', $_GET)) $Page = $_GET['Page']; else $Page = 0;
  $DbResult = $Database->select($List['TableName'], 'COUNT(*)', $Where);
  //echo($Database->LastQuery);
  $DbRow = $DbResult->fetch_array();
  $TotalItemCount = $DbRow[0];

  $DbResult = $Database->select($List['TableName'], '*', $Where.' LIMIT '.($Page * $Config['Web']['ItemsPerPage']).', '.$Config['Web']['ItemsPerPage']);
  while($DbRow = $DbResult->fetch_array())
  {
    $Output .= '<tr>';
    foreach($List['Items'] as $Index => $Item)
    {
      if($Item['VisibleInList'] == 1)
      {
        $ItemType = explode(':', $Item['Type']);
        $Type = $Types[$ItemType[0]];
        if(count($ItemType) > 1) $Type['Parameter'] = $ItemType[1];
        if(is_callable($Type['ViewHtml'])) $Value = $Type['ViewHtml']($Type, $DbRow[$Index], $List['TableName'], $DbRow['Id']);
        else $Value = $Type['ViewHtml'];
        $Value = str_replace('%value%', $DbRow[$Index], $Value);
        $Output .= '<td>'.$Value.'</td>';
      }
    }
    $Output .= '<td><a href="?Action=ViewItem&amp;TableId='.$List['TableName'].'&amp;ItemId='.$DbRow['Id'].'">Zobrazit</a> <a href="?Action=EditItem&amp;TableId='.$List['TableName'].'&amp;ItemId='.$DbRow['Id'].'">Editovat</a> <a href="?Action=DeleteItem&amp;TableId='.$List['TableName'].'&amp;ItemId='.$DbRow['Id'].'">Smazat</a></td></tr>';
  }
  $Output .= '</table>';
  $Output .= PagesList($Page, $TotalItemCount);
  $Output .= '<a href="?Action=AddItem&amp;TableId='.$List['TableName'].'">Přidat</a>';
  return($Output);
}

function ShowEditItem($List, $Id)
{
  global $Database, $Types;

  $Output = '<form action="?Action=EditItemFinish&amp;ItemId='.$Id.'" method="post"><table class="WideTable">';
  $Output .= '<tr><th>Jméno položky</th><th>Hodnota</th></tr>';
  $DbResult = $Database->select($List['TableName'], '*', 'Id='.$Id);
  while($DbRow = $DbResult->fetch_array())
  {
    foreach($List['Items'] as $Index => $Item)
    {
      $ItemType = explode(':', $Item['Type']);
      if($ItemType[0] != 'PointerOneToMany')
      {
        $Type = $Types[$ItemType[0]];
        if(count($ItemType) > 1) $Type['Parameter'] = $ItemType[1];
        if(is_callable($Type['EditHtml'])) $Value = $Type['EditHtml']($Type, $DbRow[$Index], $List['TableName'], $DbRow['Id']);
        else $Value = $Type['EditHtml'];
        $Value = str_replace('%value%', $DbRow[$Index], $Value);
        $Value = str_replace('%name%', $Index, $Value);
        if($Item['Required'] == 1) $Required = ' *'; else $Required = '';
        $Output .= '<tr><td>'.$Item['TextBefore'].':'.$Required.'</td><td title="'.$Item['Help'].'">'.$Value.'</td></tr>';
      }
    }
  }
  $Output .= '</table><input type="submit" value="Uložit"></form><a href="?">Zpět</a>';
  return($Output);
}

function ShowEditItemFinish($List, $Id)
{
  global $Database, $Types;

  $Values = array();
  foreach($List['Items'] as $Index => $Item)
  {
    $ItemType = explode(':', $Item['Type']);
    if($ItemType[0] != 'PointerOneToMany')
    {
      $Values[$Index] = $_POST[$Index];
    }
  }
  $Database->update($List['TableName'], 'Id='.$Id, $Values);
  //echo($Database->LastQuery);
  $Output = 'Změny uloženy.';
  $Output .= ShowViewItem($List, $Id);
  return($Output);
}

function ShowAddItem($List)
{
  global $Database, $Types;

  $Output = '<form action="?Action=AddItemFinish" method="post"><table class="WideTable">';
  $Output .= '<tr><th>Jméno položky</th><th>Hodnota</th></tr>';

  foreach($List['Items'] as $Index => $Item)
  {
    $ItemType = explode(':', $Item['Type']);
    if($ItemType[0] != 'PointerOneToMany')
    {
      $Type = $Types[$ItemType[0]];
      if(count($ItemType) > 1) $Type['Parameter'] = $ItemType[1];
      if(is_callable($Type['EditHtml'])) $Value = $Type['EditHtml']($Type, $Type['InitValue'], $List['TableName'], 0);
      else $Value = $Type['EditHtml'];
      $Value = str_replace('%value%', $Type['InitValue'], $Value);
      $Value = str_replace('%name%', $Index, $Value);
      if($Item['Required'] == 1) $Required = ' *'; else $Required = '';
      $Output .= '<tr><td>'.$Item['TextBefore'].':'.$Required.'</td><td title="'.$Item['Help'].'">'.$Value.'</td></tr>';
    }
  }
  $Output .= '</table><input type="submit" value="Přidat"></form><a href="?">Zpět</a>';
  return($Output);
}

function ShowAddItemFinish($List)
{
  global $Database, $Types;

  $Values = array();
  foreach($List['Items'] as $Index => $Item)
  {
    $ItemType = explode(':', $Item['Type']);
    if($ItemType[0] != 'PointerOneToMany')
    {
      $Values[$Index] = $_POST[$Index];
    }
  }
  $Database->insert($List['TableName'], $Values);
  //echo($Database->LastQuery);
  $Output = 'Položka přidána';
  $Output .= ShowViewItem($List, $Database->insert_id);
  return($Output);
}

function ShowViewItem($List, $Id)
{
  global $Database, $Types, $Lists;

  $Output = '';
  $DbResult = $Database->select($List['TableName'], '*', 'Id='.$Id);
  while($DbRow = $DbResult->fetch_array())
  {
    $Output = '<table class="WideTable">';
    $Output .= '<tr><th>Jméno položky</th><th>Hodnota</th></tr>';
    foreach($List['Items'] as $Index => $Item)
    {
      $ItemType = explode(':', $Item['Type']);
      if($ItemType[0] != 'PointerOneToMany')
      {
        $Type = $Types[$ItemType[0]];
        if(count($ItemType) > 1) $Type['Parameter'] = $ItemType[1];
        if(is_callable($Type['ViewHtml'])) $Value = $Type['ViewHtml']($Type, $DbRow[$Index], $List['TableName'], $DbRow['Id']);
        else $Value = $Type['ViewHtml'];
        $Value = str_replace('%value%', $DbRow[$Index], $Value);
        $Output .= '<tr><td>'.$Item['TextBefore'].':</td><td title="'.$Item['Help'].'">'.$Value.'</td></tr>';
      }
    }
    $Output .= '</table>';
    $Output .= '<a href="?Action=EditItem&amp;ItemId='.$DbRow['Id'].'">Editovat</a>';
    $Output .= ' <a href="?Action=ShowList&amp;ItemId='.$DbRow['Id'].'">Seznam</a>';
    $Output .= '<div class="line"></div>';

    foreach($List['Items'] as $Index => $Item)
    {
      $ItemType = explode(':', $Item['Type']);
      if($ItemType[0] == 'PointerOneToMany')
      {
        $SubList = $Lists[$ItemType[1]];
        $Output .= ShowList($SubList, $ItemType[2], $DbRow['Id']).'<br /><br />';
      }
    }
  }
  return($Output);
}

function ShowDeleteItem($List, $Id)
{
  global $Database;

  $Database->delete($List['TableName'], 'Id='.$Id);
  $Output = 'Položka smazána.';
  return($Output);
}

function TableList($System)
{
  global $Lists;

  $Type = array('Uživatelské', 'Systémové');
  $Output = '<strong>'.$Type[$System].' seznamy:</strong><br />';
  foreach($Lists as $Index => $List)
  {
    if(($List['System'] == $System) and ($List['VisibleInMenu'] == 1))
      $Output .= '<a href="?Action=ShowList&amp;TableId='.$Index.'">'.$List['Title'].'</a><br />';
  }
  $Output .= '<br />';
  return($Output);
}

function Output()
{
  global $Lists;

  $PermanentVar = array('TableId', 'ItemId', 'ParentTable', 'ParentColumn', 'Action');
  foreach($PermanentVar as $Var)
  {
    if(array_key_exists($Var, $_GET)) $_SESSION[$Var] = $_GET[$Var];
  }

  $Output = '';
  if(array_key_exists('TableId', $_SESSION) and array_key_exists($_SESSION['TableId'], $Lists))
  {
    $List = $Lists[$_SESSION['TableId']];
    if(array_key_exists('Action', $_SESSION))
    {
      switch($_SESSION['Action'])
      {
        case 'EditItem':
          $Output = ShowEditItem($List, $_SESSION['ItemId']);
          break;
        case 'EditItemFinish':
          $Output = ShowEditItemFinish($List, $_SESSION['ItemId']);
          break;
        case 'DeleteItem':
          $Output = ShowDeleteItem($List, $_SESSION['ItemId']);
          break;
        case 'ViewItem':
          $Output = ShowViewItem($List, $_SESSION['ItemId']);
          break;
        case 'AddItem':
           $Output = ShowAddItem($List);
          break;
        case 'AddItemFinish':
          $Output = ShowAddItemFinish($List);
          break;
        case 'ShowList':
        default:
          $Output = ShowList($List);
      }
    } else $Output = ShowList($List);
  }
  return($Output);
}

function LoadListDefinition()
{
  global $Database, $Lists;

  $DbResult = $Database->select('SystemList', '*');
  while($DbRow = $DbResult->fetch_assoc())
  {
    $Items = array();
    $DbResult2 = $Database->select('SystemListItem', '`Name`, `TextBefore`, `TextAfter`, `Type`, `Default`, `Help`, `Required`, `Editable`, `VisibleInList`, `VisibleInPointer`', 'List='.$DbRow['Id']);
    while($DbRow2 = $DbResult2->fetch_assoc())
    {
      $Items[$DbRow2['Name']] = $DbRow2;
    }
    $List = array(
     'TableName' => $DbRow['TableName'],
     'Title' => $DbRow['Title'],
     'System' => $DbRow['System'],
     'VisibleInMenu' => $DbRow['VisibleInMenu'],
     'Items' => $Items,
    );
    $Lists[$List['TableName']] = $List;
  }
}

?>