<?php

class Control
{
  var $Name;

  function Show()
  {
    return('');
  }
}

class Table
{
  function GetCell($Y, $X)
  {
    return('');
  }

  function BeginRead()
  {
  }

  function EndRead()
  {
  }

  function RowsCount()
  {
    return(0);
  }
}

class TableMemory extends Table
{
  var $Cells;

  function GetCell($Y, $X)
  {
    return($this->Cells[$Y][$X]);
  }

  function RowsCount()
  {
    return(count($this->Cells));
  }
}

class TableSQL extends Table
{
  var $Query;
  var $Database;
  var $Cells;

  function GetCell($Y, $X)
  {
    return($this->Cells[$Y][$X]);
  }

  function BeginRead()
  {
    $this->Cells = array();
    $DbResult = $this->Database->query($this->Query);
    while($DbRow = $DbResult->fetch_row())
    {
      $this->Cells[] = $DbRow;
    }
  }

  function EndRead()
  {
    $this->Cells = array();
  }

  function RowsCount()
  {
    return(count($this->Cells));
  }
}

class TableColumn
{
  var $Name;
  var $Title;
}

class VisualTable extends Control
{
  var $Cells;
  var $Columns;
  var $OrderSQL;
  var $OrderColumn;
  var $OrderDirection;
  var $OrderArrowImage;
  var $DefaultColumn;
  var $DefaultOrder;
  var $Table;
  var $Style;

  function __construct(System $System)
  {
    $this->Columns = array();
    $this->Table = new TableMemory();
    $this->OrderDirSQL = array('ASC', 'DESC');
    $this->OrderArrowImage = array($System->Link('/images/sort_asc.png'),
      $System->Link('/images/sort_desc.png'));
    $this->DefaultOrder = 0;
    $this->Style = 'BaseTable';
  }

  function SetColumns($Columns)
  {
    $this->Columns = array();
    foreach($Columns as $Column)
    {
      $NewCol = new TableColumn();
      $NewCol->Name = $Column['Name'];
      $NewCol->Title = $Column['Title'];
      $this->Columns[] = $NewCol;
    }
    if(count($this->Columns) > 0)
      $this->DefaultColumn = $this->Columns[0]->Name;
      else $this->DefaultColumn = '';
  }

  function Show()
  {
    $Output = '<table class="'.$this->Style.'">';
    $Output .= $this->GetOrderHeader();
    $this->Table->BeginRead();
    for($Y = 0; $Y < $this->Table->RowsCount(); $Y++)
    {
      $Output .= '<tr>';

      for($X = 0; $X < count($this->Columns); $X++)
      {
        $Cell = $this->Table->GetCell($Y, $X);
        if($Cell == '') $Output .= '<td>&nbsp;</td>';
          else $Output .= '<td>'.$Cell.'</td>';
      }
      $Output .= '</tr>';
    }
    $this->Table->EndRead();
    $Output .= '</table>';
    return($Output);
  }

  function GetOrderHeader()
  {
    if(array_key_exists('OrderCol', $_GET)) $_SESSION['OrderCol'] = $_GET['OrderCol'];
    if(array_key_exists('OrderDir', $_GET)) $_SESSION['OrderDir'] = $_GET['OrderDir'];
    if(!array_key_exists('OrderCol', $_SESSION)) $_SESSION['OrderCol'] = $this->DefaultColumn;
    if(!array_key_exists('OrderDir', $_SESSION)) $_SESSION['OrderDir'] = $this->DefaultOrder;

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

    $Result = '';
    $QueryItems = GetQueryStringArray($_SERVER['QUERY_STRING']);
    foreach($this->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="'.$this->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>';
    }
    $this->OrderSQL = ' ORDER BY `'.$_SESSION['OrderCol'].'` '.$this->OrderDirSQL[$_SESSION['OrderDir']];
    $this->OrderColumn = $_SESSION['OrderCol'];
    $this->OrderDirection = $_SESSION['OrderDir'];

    return('<tr>'.$Result.'</tr>');
  }
}
