<?php

class PageTranslationForm extends Page
{
  var $GroupId;
  var $ID;

  function Show(): string
  {
    $this->Title = T('Translation');
    $Action = '';
    if (array_key_exists('action', $_GET)) $Action = $_GET['action'];

    if ($Action == 'delete') $Output = $this->Delete();
      else $Output = $this->ShowForm();
    return $Output;
  }

  function ShowForm(): string
  {
    $User = ModuleUser::Cast($this->System->GetModule('User'))->User;
    $TranslationTree = $this->System->ModuleManager->Modules['Translation']->GetTranslationTree();

    $Output = '';

    $GroupId = LoadGroupIdParameter();
    $this->GroupId = $GroupId;
    $Table = $TranslationTree[$GroupId]['TablePrefix'];
    if (array_key_exists('action', $_GET)) $Action = $_GET['action'];
      else $Action = '';

    $TextID = 0;
    if (TryGetUrlParameterInt('ID', $TextID))
    {
      $this->ID = $TextID;

      $DbResult = $this->Database->query('SELECT * FROM `'.$Table.'` WHERE `ID` = '.$TextID);
      $Line = $DbResult->fetch_assoc();
      if (!$Line)
      {
        $Output .= ShowMessage('Překlad nenalezen.', MESSAGE_CRITICAL);
      } else
      {
        if (Core::Cast($this->System)->Config['OriginalLanguage'] == $Line['Language']){
          $LineAJ = $Line;

          if ($User->Language <> '') $Language = '`Language` = '.$User->Language;
          else $Language = '`Language` != '.Core::Cast($this->System)->Config['OriginalLanguage'];
          $Columns = '';
          foreach ($TranslationTree[$GroupId]['Items'] as $Index => $TextItem)
            $Columns .= ' `Orig`.`'.$TextItem['Column'].'` as `Orig_'.$TextItem['Column'].'`, `Tran`.`'.$TextItem['Column'].'` as `'.$TextItem['Column'].'`,';

          $sql = 'SELECT '.$Columns.' Tran.`Entry` FROM `'.$Table.'` as Tran';
          $join = ' JOIN `'.$Table.'` as `Orig` ON `Orig`.`Language` = 0 AND `Tran`.`Entry` = `Orig`.`Entry` AND `Tran`.`VersionEnd` = `Orig`.`VersionEnd` ';
          $where = ' WHERE '.'( `Tran`.'.$Language.' ) AND '.'(`Tran`.`Entry` = '.$Line['Entry'].') ORDER BY `Tran`.`ModifyTime` DESC';
          $DbResult = $this->Database->query($sql.$join.$where);
          while ($LineSearch = $DbResult->fetch_assoc()) 
          {
            foreach ($TranslationTree[$GroupId]['Items'] as $Index => $TextItem)
            {
              if ($TextItem['Visible'] == 1)
              {
                if (($LineAJ[$TextItem['Column']] <> '') and
                    ($LineSearch[$TextItem['Column']] <> '') and
                    ($LineSearch['Orig_'.$TextItem['Column']] <> $LineSearch[$TextItem['Column']]) and
                    ($LineAJ[$TextItem['Column']] == $Line[$TextItem['Column']])
                  )
                {
                  $Line[$TextItem['Column']] = $LineSearch[$TextItem['Column']];
                }
              }
            }
          }
        } else 
        {
          $DbResult = $this->Database->query('SELECT * FROM `'.$Table.'` WHERE '.
          '(`Language` = '.Core::Cast($this->System)->Config['OriginalLanguage'].') AND '.
          '(`Entry` = '.$Line['Entry'].') AND (`VersionEnd` = '.$Line['VersionEnd'].') LIMIT 1');
          $LineAJ = $DbResult->fetch_assoc();
        }
        if (!$LineAJ)
        {
          $Output .= ShowMessage('Anglický originál k překladu nenalezen.', MESSAGE_CRITICAL);
        } else
        {
          if ($Line['User'] != '')
          {
            $IDUser = $this->Database->query('SELECT * FROM `User` WHERE `ID` = '.$Line['User']);
            $LineUser = $IDUser->fetch_array();
          } else
            $LineUser = array('Name' => '');

          $Output .= T('Group').': <strong>'.$TranslationTree[$GroupId]['Name'].'</strong><br />';

          if (($Line['Language'] <> 0) and ($LineUser['Name'] <> ''))
            $Output .= T('Translated by').': <a href="'.$this->System->Link('/user/?user='.$Line['User']).'"><strong>'.$LineUser['Name'].'</strong></a> dne '.HumanDate($Line['ModifyTime']).'<br />';
          if (($Line['Take'] <> 0) and ($Line['Take'] <> $Line['ID']))
          {
            $DbResult = $this->Database->query('SELECT `Language`,`VersionStart`,`VersionEnd` FROM `'.$Table.'` WHERE `ID` = '.$Line['Take']);
            $Language = $DbResult->fetch_assoc();

            $DbResult = $this->Database->query('SELECT `Name` FROM `Language` WHERE `Id` ='.$Language['Language']);
            $Lang = $DbResult->fetch_assoc();

            $Output .= T('Original text').': <strong>'.
              ' ID <a href="'.$this->System->Link('/form.php?group='.$GroupId.'&amp;ID='.$Line['Take']).'">'.$Line['Take'].'</a></strong>'.
              ' ('.T($Lang['Name']).')'.
              ' <br />';
          }
          $Output .= 'Text: ';
          if ($Line['Language'] <> 0)
          {
            if ($Line['Complete'] == 1) $Output .= ' <b>'.T('Completed').'</b>';
            else $Output .= ' <b>'.T('Stored in unfinished').'</b> ';
          } else $Output .= ' <b>'.T('Original version').'</b> ';

          $Output .= '<br />'.
            T('Version').': <b><a href="'.$this->System->Link('/client-version/?action=item&amp;id='.GetVersionWOWId($Line['VersionStart'])).'">'.GetVersionWOW($Line['VersionStart']).
            '</a> - <a href="'.$this->System->Link('/client-version/?action=item&amp;id='.GetVersionWOWId($Line['VersionEnd'])).'">'.GetVersionWOW($Line['VersionEnd']).'</a></b>'.
            '<br />';

          $DbResult = $this->Database->query('SELECT COUNT(*) FROM `'.$Table.'` WHERE '.
            '(`Entry` = '.$Line['Entry'].')');
          $Version = $DbResult->fetch_row();
          $Version = $Version[0];
          if ($Version > 0)
          {
            $Output .= '<form action="comparison.php" method="get"><a href="'.$this->System->Link('/TranslationList.php?group='.
              $GroupId.'&amp;user=0&amp;state=2&amp;entry='.$Line['Entry'].'&amp;text=').'">'.T('Number of versions').': <strong>'.$Version.'</strong></a>
            <input type="hidden" name="group" value="'.$GroupId.'" />
            <input type="hidden" name="entry" value="'.$Line['Entry'].'" />
            <input type="hidden" name="ID2" value="'.$TextID.'" />';

            if ($User->Licence(LICENCE_USER)) { // allow to compare only to user
              $Output .= '<select onchange="this.form.submit();" name="ID1">
              <option value="-1">'.T('Select text for comparison').'</option>
              <option value="-1">'.T('Show/compare all').'</option>';
              $DataID = $this->Database->query('SELECT *, (SELECT `User`.`Name` AS `UserName` FROM `User` WHERE `User`.`ID` = `'.$Table.'`.`User`) AS `UserName` FROM `'.$Table.'` WHERE (`Entry` = '.$Line['Entry'].') AND (`ID` <> '.$Line['ID'].')');
              while ($Version = $DataID->fetch_array())
              {
                if ($Version['ID'] == $Line['Take']) $Output .= '<option value="'.
                 $Version['ID'].'">'.$Version['ID'].' - '.$Version['User'].' ('.T('taken over').')</option>';
                else
                {
                  if ($Version['Language'] == 0) $Version['UserName'] = T('Original');
                  $Output .= '<option value="'.$Version['ID'].'">'.$Version['ID'].' - '.
                      $Version['UserName'].' ('.GetVersionWOW($Version['VersionStart']).' - '.
                      GetVersionWOW($Version['VersionEnd']).')</option>';
                }
              }
              $Output .= '</select>';
            }
            $Output .= '</form>';
          } else
          {
            $Output .= '<a href="'.$this->System->Link('/TranslationList.php?group='.$GroupId.'&amp;user=0&amp;state=2&amp;entry='.
              $Line['Entry'].'&amp;text=').'">'.T('Number of versions').': <strong>'.$Version.'</strong></a>';
          }

          // Special characters: $B - New line, $N - Name, $C - profession
          if ($User->Licence(LICENCE_USER))
          {
            $Output .= '<form action="'.$this->System->Link('/save.php?group='.$GroupId).'" method="post"><div>';
            // TODO: Remove fixed group id condition
          //  if (($GroupId < 4) or ($GroupId == 10) or ($GroupId == 11))
            $Output .= '<a href="'.$this->System->Link('/dictionary/?action=group&amp;group='.
              $GroupId.'&amp;ID='.$LineAJ['ID']).'" target="_blank"  title="Zobrazit přeložené názvy věci, postav, a herních objektů k tomuto překladu">'.T('Search in names').'</a>';
            $Output .= ' <input type="submit" value="'.T('Store to unfinished').
              '" name="save" title="Klikněte na uložit pro pozdější dokončení překladu" />'.
              '<input type="submit" value="'.T('Finished').'" name="End" title="Klikněte na Dokončeno jesli jsou všechny texty hotové a chcete již publikovat" /> ';
            FollowingTran($TextID, $Table, $GroupId, true);
            FollowingTran($TextID, $Table, $GroupId);
          }

          if ($TranslationTree[$GroupId]['WowheadName'] != '')
            $WowheadLink = '<a href="https://www.wowhead.com/?'.$TranslationTree[$GroupId]['WowheadName'].
              '='.$LineAJ['Entry'].'">'.$LineAJ['Entry'].'</a>';
          else $WowheadLink = $LineAJ['Entry'];

          $Output .= '<input type="hidden" name="entry" value="'.$LineAJ['Entry'].'" />'.
            '<input type="hidden" name="user" value="'.$User->Id.'" />'.
            '<input type="hidden" name="ID" value="'.$TextID.'" />'.
            '<table class="BaseTable">'.
            '<tr>'.
            '<th>'.T('Text number').': '.$WowheadLink.'</th>'.
            '<th>'.T('Not translated').'</th>'.
            '<th>'.T('Translated').'</th>'.
            '</tr>'.
            '<tr>'.
            '<th>'.T('Language').'</th>'.
            '<td>'.T('Original').'</td>'.
            '<td>';
          if ($Line['Language'] <> 0) $Language = $Line['Language'];
          else if ($User->Id != 0)
          {
            $Language = $User->Language;
          } else $Language = 0;
          if ($User->Licence(LICENCE_USER))
          {
            $Output .= WriteLanguages($Language);
          }
          else 
          {
            $DbResult3 = $this->Database->select('Language', '`Id`, `Name`', '(`Enabled` = 1) AND (`Id`='.$Language.')');
            if ($DbResult3->num_rows > 0)
            {
              $Language = $DbResult3->fetch_assoc();
              $Output .= T($Language['Name']);
            }
          }

          $Output .= '</td></tr>';

          // TODO: javascript

          $Output .= '<script src="'.$this->System->Link('/style/jquery.js').'"></script>'.
             '<script>';
          $Output .=    '$(document).ready(function() {';
          foreach ($TranslationTree[$GroupId]['Items'] as $Index => $TextItem)
          {
            $Output .=   '$("#'.$TextItem['Column'].'").load("'.$this->System->Link('/LoadNames.php?ID='.$LineAJ['ID'].'&Column='.$TextItem['Column'].'&GroupId='.$GroupId).'");';
          }

          $Output .= '});'.
            '</script>';

          foreach ($TranslationTree[$GroupId]['Items'] as $Index => $TextItem)          
          {
            if ($TextItem['Visible'] == 1)
            {
              if (($LineAJ[$TextItem['Column']] <> '') or ($Line[$TextItem['Column']] <> ''))
              {
                if (($TextItem['Name'] == 'Text') and (($Table == 'global_strings') or ($Table == 'glue_strings')))
                  $Output .= '<tr><th>'.$LineAJ['ShortCut'].'</th>';
                else $Output .= '<tr><th>'.T($TextItem['Name']).'</th>';
                $Output .= '<td id="'.$TextItem['Column'].'">'.str_replace("\n", '<br/>', htmlspecialchars($LineAJ[$TextItem['Column']])).'</td>
                <td>';
                if ($User->Licence(LICENCE_USER))
                  $Output .= '<textarea rows="8" cols="40" onkeydown="ResizeTextArea(this)" class="textedit" id="'.$TextItem['Column'].'" name="'.$TextItem['Column'].'">';
                $Output .= htmlspecialchars($Line[$TextItem['Column']]);
                if ($User->Licence(LICENCE_USER)) $Output .= '</textarea></td></tr>';
              }
            } else
            {
              $Output .= '<input id="'.$TextItem['Column'].'" name="'.$TextItem['Column'].'" type="hidden" value="'.htmlspecialchars($Line[$TextItem['Column']]).'" />';
            }
          }

          $Output .= '</table></div>';
          if ($User->Licence(LICENCE_USER)) 
          {
            $Output .= '</form>';

            if (isset(Core::Cast($this->System)->Config['Web']['EnableGoogleTranslate']) and
              Core::Cast($this->System)->Config['Web']['EnableGoogleTranslate'])
            {
              $Output .= '<br/><table class="BaseTable">'.
              '<tr><th>'.T('Google translator').':</th><th>'.T('Not translated').'</th><th>'.T('Translated').'</th>';
              foreach ($TranslationTree[$GroupId]['Items'] as $Index => $TextItem)
              {
                if ($TextItem['Visible'] == 1)
                {
                  if ($LineAJ[$TextItem['Column']] <> '')
                  {
                    $Output .= '<tr><td>'.$TextItem['Column'].'</td>'.
                      '<td>'.$LineAJ[$TextItem['Column']].'</td>'.
                      '<td>'.GetTranslateGoogle($this->System, $LineAJ[$TextItem['Column']]).'</td></tr>';
                  }
                }
              }
              $Output .= '</table>';
            }
          }
        }
      }
    } else $Output = ShowMessage('Nebylo zadáno ID.', MESSAGE_CRITICAL);
    return $Output;
  }

  function Delete()
  {
    $User = ModuleUser::Cast($this->System->GetModule('User'))->User;
    $TranslationTree = $this->System->ModuleManager->Modules['Translation']->GetTranslationTree();

    if ($User->Licence(LICENCE_MODERATOR))
    {
      $GroupId = LoadGroupIdParameter();
      $this->GroupId = $GroupId;
      $Table = $TranslationTree[$GroupId]['TablePrefix'];
      $TextID = $_GET['ID'];
      $this->Database->query('DELETE FROM `'.$Table.'` WHERE `ID` = '.$TextID.' AND `Language` <> '.Core::Cast($this->System)->Config['OriginalLanguage']);
      $Output = ShowMessage('Překlad byl smazán.');
      $this->System->ModuleManager->Modules['Log']->WriteLog('Překlad byl smazán! <a href="'.$this->System->Link('/form.php?group='.$this->GroupId.'&amp;ID='.$TextID).'">'.$TextID.'</a>', LOG_TYPE_MODERATOR);
    } else $Output = ShowMessage(T('Access denied'), MESSAGE_CRITICAL);
    return $Output;
  }
}
