<?php

class Export extends Model
{
  var $Id;
  var $AnoNe = array('Ne', 'Ano');
  var $WhereLang;
  var $WhereUsers;
  var $SelectedUsers;
  var $UserNames;
  var $ClientVersion;
  var $OrderByUserList;
  var $TempDir;
  var $SourceDir;

  function Init()
  {
    $this->TempDir = dirname(__FILE__).'/../../'.$this->System->Config['Web']['TempFolder'].'Export/'.$this->Id.'/';
    if(!file_exists($this->TempDir)) mkdir($this->TempDir, 0777, true);
    $this->TempDirRelative = $this->System->Config['Web']['TempFolder'].'Export/'.$this->Id.'/';
    $this->SourceDir = dirname(__FILE__).'/../../'.$this->System->Config['Web']['SourceFolder'];
    $this->SourceDirRelative = $this->System->Config['Web']['SourceFolder'];
    if(!file_exists($this->SourceDir)) mkdir($this->SourceDir, 0777, true);
  }

  function SaveAllUsers() {
    $DbResult = $this->System->Database->query('SELECT * FROM `Export` WHERE `Id`='.$this->Id);
    $Export = $DbResult->fetch_assoc();
    if ($Export['AllUsers']) {
      $DbResult2 = $this->System->Database->query('SELECT ID FROM `User` WHERE `ID` NOT IN(SELECT `User` FROM `ExportUser` WHERE `Export`='.$this->Id.')');
      while($UserLine = $DbResult2->fetch_assoc())
      {
            $Condition = ' WHERE `Export`='.$this->Id.' AND `User`='.$UserLine['ID'];
            $DbResult = $this->System->Database->query('SELECT * FROM `ExportUser` '.$Condition); //,MAX(`Sequence`) as MaxSequence
            if($DbResult->num_rows > 0)
            {
            //  $this->System->Database->query('UPDATE `ExportUser` SET `Sequence`='.$Value.$Condition);
            } else
            {
              $this->System->Database->query('INSERT INTO `ExportUser` (`Export`, `User`, `Sequence`) VALUES ('.$this->Id.', '.$UserLine['ID'].', 0)');
            }
      }

      $this->System->Database->query('SET @I = 0');
      $this->System->Database->query('UPDATE `ExportUser` SET `Sequence` = (@I := @I + 1) WHERE `Export`='.$this->Id.' ORDER BY `Sequence`;');
    }
  }

  function LoadFilters()
  {
    $DbResult = $this->Database->query('SELECT * FROM `Export` WHERE `Id`='.$this->Id);
    if($DbResult->num_rows == 0) throw new Exception('Export '.$this->Id.' neexistuje');
    $this->Export = $DbResult->fetch_assoc();

    // Filter selected users
    $this->UserNames = '';
    $DbResult = $this->Database->query('SELECT `ExportUser`.*, `User`.`Name`, `User`.`ID` FROM `ExportUser` '.
      'LEFT JOIN `User` ON `User`.`ID`=`ExportUser`.`User` '.
      'WHERE `ExportUser`.`Export`='.$this->Id.' ORDER BY `ExportUser`.`Sequence`');
    while($UserLine = $DbResult->fetch_assoc())
    {
      $this->UserNames .= ', '.$UserLine['Name'];
    }
    $this->UserNames = substr($this->UserNames, 2);

    if($this->Export['ClientVersion'] != '')
    {
      $DbResult = $this->Database->query('SELECT * FROM `ClientVersion` WHERE `Id`='.$this->Export['ClientVersion']);
      $this->ClientVersion = $DbResult->fetch_assoc();
    } else $this->ClientVersion = '';
  }

  function BuildQuery($Group, $Version = '')
  {
    global $TranslationTree;
    $this->SaveAllUsers();

    if ($Version <> '')
      $ExportVersion = $Version;
    else
      $ExportVersion = $this->ClientVersion['BuildNumber'];

    $DbResultItem = $this->System->Database->query('SELECT * FROM `ExportGroupItem` WHERE `Export`='.$this->Id);
    while($GroupItem = $DbResultItem->fetch_assoc())
    {
      $GroupItems[$GroupItem['GroupItem']] = 1;
    }
    // Build selected columns
    $Columns = '';
    foreach($TranslationTree[$Group['Id']]['Items'] as $Column) {
      if (!isset($GroupItems[$Column['Id']])) $Columns .= ' `T`.`'.$Column['Column'].'` AS `'.$Column['Column'].'`, ';
    }
  //  $Columns = substr($Columns, 0, -2);


    $Query = 'SELECT * FROM (SELECT '.$Columns.' T.`ID`,T.`Language`,T.`User`,T.`Entry`,T.`VersionEnd`,T.`VersionStart`, `User`.`Name` AS `UserName` FROM `'.$Group['TablePrefix'].'` AS `T`'.
    ' JOIN `ExportUser` ON (`ExportUser`.`User`=`T`.`User`) AND (`ExportUser`.`Export`='.$this->Id.') '.
    ' JOIN `User` ON `User`.`ID`=`T`.`User`'.
    ' JOIN `ExportLanguage` ON (`ExportLanguage`.`Export`='.$this->Id.')'.
    ' WHERE (`Complete` = 1) AND (`VersionStart` <= '.$ExportVersion.') AND (`VersionEnd` >= '.$ExportVersion.')'.
    ' ORDER BY `ExportLanguage`.`Sequence`, `ExportUser`.`Sequence`) AS `TT` GROUP BY `TT`.`Entry`';

    // Build columns for english texts
    $OriginalColumns = '';
    foreach($TranslationTree[$Group['Id']]['Items'] as $Column) {
      $OriginalColumns .= ' `T3`.`'.$Column['Column'].'` AS `En'.$Column['Column'].'`, ';
      if (isset($GroupItems[$Column['Id']]))
        $OriginalColumns .= ' `T3`.`'.$Column['Column'].'` AS `'.$Column['Column'].'`, ';
    }
    $OriginalColumns = substr($OriginalColumns, 0, -2);

    // Expand query for loading english texts
    $Query = 'SELECT `T4`.*, '.$OriginalColumns.' FROM ('.$Query.') AS `T4` '.
    ' LEFT JOIN `'.$Group['TablePrefix'].'` AS `T3` ON (`T3`.`Entry` = `T4`.`Entry`) '.
    'AND (`T3`.`Language` = '.$this->System->Config['OriginalLanguage'].') AND '.
    '(`T3`.`VersionStart` = `T4`.`VersionStart`) AND (`T3`.`VersionEnd` = `T4`.`VersionEnd`)';

    return($Query);
  }

  function NeedGeneration()
  {
    $this->LoadFilters();
    $file = '';
    if ($this->Export['OutputType'] == 10) $file = $this->TempDir.'Instalace_CzechWoW_'.$this->ClientVersion['Version'].'.exe';
    if ($this->Export['OutputType'] == 9) $file = $this->TempDir.'CzWoW_DBC.zip';

    if (file_exists($file))
      $date = date('Y-m-d H:i',(filemtime($file)));
    else return(true);
  // echo $file;

    $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
      'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
    $result = false;
    while($Group = $DbResult->fetch_assoc())
    {
      $Query = 'SELECT * FROM `'.$Group['TablePrefix'].'` AS `T`'.
      ' JOIN `ExportUser` ON (`ExportUser`.`User`=`T`.`User`) AND (`ExportUser`.`Export`='.$this->Id.') '.
      ' JOIN `User` ON `User`.`ID`=`T`.`User`'.
      ' JOIN `ExportLanguage` ON (`ExportLanguage`.`Export`='.$this->Id.')'.
      ' WHERE ( \''.$date.'\' < `T`.`ModifyTime`) AND (`Complete` = 1) AND (`VersionStart` <= '.$this->ClientVersion['BuildNumber'].') AND (`VersionEnd` >= '.$this->ClientVersion['BuildNumber'].')'.
      ' ';

        $DbResult2 = $this->Database->query($Query);
        if ($DbResult2->num_rows > 0) {
          $result = true;
        }
    }
    return($result);
  }

  function ExportToMangosSQL()
  {
    global $TranslationTree;

    $this->LoadFilters();

    $Buffer =
      "-- Generováno projektem wowpreklad.zdechov.net\n".
      "-- ===========================================\n".
      "--\n".
      "-- Web projektu: ".$this->System->Config['Web']['Host'].$this->System->Link('/')."\n".
      "-- Datum exportu: ".date("j.n.Y  H:i:s")."\n".
      "-- Znaková sada: ".$this->System->Config['Database']['Charset']." / ".$this->System->Config['Web']['Charset']."\n".
      "-- Diakritika: ".$this->AnoNe[$this->Export['WithDiacritic']]."\n".
      "-- Vygeneroval uživatel: ".$this->System->User->Name."\n".
      "-- Vzato od uživatelů: ".$this->UserNames."\n".
      "-- Generované tabulky: ";

    $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
      'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
    while($Group = $DbResult->fetch_assoc())
    {
      $Buffer .= $Group['TablePrefix'].', ';
    }
    $Buffer .= "\n\n";

    $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
      'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
    while($Group = $DbResult->fetch_assoc())
    {
      if($Group['MangosTable'] != '')
      {
        $Buffer .= "\n\n-- ".$Group['Name']."\n\n";
        $DbResult2 = $this->Database->query($this->BuildQuery($Group));
        if($DbResult2->num_rows > 0)
        while($Line = $DbResult2->fetch_array())
        {
          $Values = '';
          foreach($TranslationTree[$Group['Id']]['Items'] as $GroupItem)
          if($GroupItem['Column'] != $Group['PrimaryKeyItem']) // Do not update primary key
          {
            if($GroupItem['MangosColumn'] == '') $GroupItem['MangosColumn'] = $GroupItem['Column'];
            $Values .= ', `'.$GroupItem['MangosColumn'].'`="'.addslashes($Line[$GroupItem['Column']]).'"';
          }
          $Values = substr($Values, 2);

          // Get multicolumn index
          $ColumnItems = explode(',', $Group['MangosTableIndex']);
          if(count($ColumnItems) > 1)
          {
            $Where = 'CONCAT(';
            foreach($ColumnItems as $ColumnItem)
              $Where .= '`'.$ColumnItem.'`, "_", ';
            $Where = substr($Where, 0, -7).')';
          } else $Where = '`'.$Group['MangosTableIndex'].'`';
          $Where .= ' = "'.$Line[$Group['PrimaryKeyItem']].'";';

          $Line = 'UPDATE `'.$Group['MangosTable'].'` SET '.$Values.' WHERE '.$Where;
          $Line = str_replace("\n", '\n', $Line);
          $Line = str_replace("\r", '', $Line);
          $Buffer .= $Line."\n";
        }
      }
    }
    if($this->Export['WithDiacritic'] != 1) $Buffer = utf2ascii($Buffer);
    return($Buffer);
  }

  function ExportToAoWoWSQL()
  {
    global $TranslationTree, $AoWoWconf;

    //require_once('../aowow/configs/config.php');

    $Buffer = $this->ExportToMangosSQL();

    /*
    // Data to aowow
    $Database2 = new mysqli($this->System->Config['Database']['Host'],
      $this->System->Config['Database']['User'],
      $this->System->Config['Database']['Password'],
      $this->System->Config['Database']['Database']);
    $Database2->query('SET NAMES '.$this->System->Config['Database']['Charset']);
    $Database2->select_db($AoWoWconf['mangos']['db']);
    $AoWoWTables = array(
      'aowow_resistances' => 'Id',
      'aowow_spelldispeltype' => 'Id',
      'aowow_skill' => 'skillID',
    );
    foreach($AoWoWTables as $AoWoWTable => $IndexColum)
    {
      $Buffer .= '--'.$AoWoWTable.', ';
      $Buffer .= "\n\n";
      $Query = 'SELECT `name`,`'.$IndexColum.'` FROM `'.$AoWoWTable.'`';
      $DbResult = $Database2->query($Query);
      while($Line = $DbResult->fetch_assoc())
      {
        $Ori_text = $Line['name'];
        $DbResult2 = $Database2->query('SELECT `Text` AS `En`,
        (SELECT `Text` FROM `'.$this->System->Config['Database']['Database'].'`.`TextGlobalString` AS `TableTran`
         WHERE `TableEn`.`Entry` = `TableTran`.`Entry` AND (`Complete` = 1) AND '.$this->WhereLang.' AND '.$this->WhereUsers.$this->OrderByUserList.' LIMIT 1) AS `Tran`
         FROM `'.$this->System->Config['Database']['Database'].'`.`TextGlobalString` AS `TableEn` WHERE
          `Text` = "'.addslashes($Ori_text).'" LIMIT 1');
        $Tran = $DbResult2->fetch_assoc();
        //echo ($Line['name'].'='.$Tran['tran']);
        if($Tran['Tran'] == '')
        {
          $DbResult2 = $Database2->query('SELECT `OptionText` AS `En`,
          (SELECT `OptionText` FROM `'.$this->System->Config['Database']['Database'].'`.`TextNPCOption` AS `TableTran`
           WHERE `TableEn`.`Entry` = `TableTran`.`Entry` AND (`Complete` = 1) AND '.$this->WhereLang.'
            AND '.$this->WhereUsers.$this->OrderByUserList.' LIMIT 1) AS `Tran`
          FROM `'.$this->System->Config['Database']['Database'].'`.`TextNPCOption` AS `TableEn` WHERE
            `OptionText` = "'.addslashes($Ori_text).'" LIMIT 1');
          $Tran = $DbResult2->fetch_assoc();
        }

        if($Tran['Tran'] <> '')
          $Buffer .= 'UPDATE `'.$AoWoWTable.'` SET `name` = "'.addslashes($Tran['Tran']).'" WHERE '.$IndexColum.' = '.$Line[$IndexColum].' ;'."\n";
      }
      $Buffer .= "\n\n";
    }
    */
    if($this->Export['WithDiacritic'] != 1) $Buffer = utf2ascii($Buffer);
    return($Buffer);
  }

  function HaveVarible($String1, $String2, $StartChar = '$')
  {
          //Export only if translate have same varible %

    if (strpos($String1,$StartChar) !== false) {

      while ( strpos($String1,$StartChar) !== false) {
          $pos = strpos($String1,$StartChar);
          $String1 = substr($String1,$pos+1);
          $varible = $String1;
          if (strpos($varible,' ')) $varible = substr($varible,0,strpos($varible,' '));
          if (strpos($varible,'.')) $varible = substr($varible,0,strpos($varible,'.'));
          if (strpos($varible,',')) $varible = substr($varible,0,strpos($varible,','));
          if (strpos($varible,'%')) $varible = substr($varible,0,strpos($varible,'%'));
          if (strpos($varible,chr(10))) $varible = substr($varible,0,strpos($varible,chr(10)));
       //   echo $pos.'-'.$varible.'-'.$String1.'-' .$String2.'
        //  ';

          if (false === strpos($String2,$varible)) {
              //  echo $varible;
            return(false);
          }
      }
    }
    return (true);
  }

  function AddProgress($add = 1) {

    $DbResult = $this->System->Database->query('SELECT Progress FROM `ExportTask` WHERE `Export`='.$this->Id);
    $Task = $DbResult->fetch_assoc();
    $per = $Task['Progress']+$add;
    $this->System->Database->query('UPDATE `ExportTask` SET `Progress`='.$per.' WHERE `Export`='.$this->Id);
  }

  function ExportToDBC()
  {
    global $TranslationTree;

    $this->LoadFilters();

    $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
      'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` '.
      'WHERE `ExportGroup`.`Export`='.$this->Id.' AND `Group`.`DBCFileName` != ""');
    $Output = 'Počet generovaných skupin: '.$DbResult->num_rows."\n";
    while($Group = $DbResult->fetch_assoc())
    {
      $this->AddProgress(2);
      $Output .= $Group['Name'].', ';
      if(file_exists($this->SourceDir.$this->ClientVersion['Version'].'/dbc/'.$Group['DBCFileName'].'.dbc'))
      {
        // Load string column index list
        $DbResult2 = $this->Database->query('SELECT * FROM `GroupItem` '.
          'JOIN `GroupItemDBC` ON `GroupItem`.`Id` = `GroupItemDBC`.`GroupItem` AND `GroupItemDBC`.`ClientVersion` = '.$this->ClientVersion['Id'].'  WHERE `GroupItem`.`Group` = '.$Group['Id']);
        $ColumnIndexes = array();
        $ColumnFormat = array();
        while($DbRow = $DbResult2->fetch_assoc())
        {
          $ColumnFormat[$DbRow['ColumnIndex']] = FORMAT_STRING;
          $ColumnIndexes[$DbRow['GroupItem']] = $DbRow['ColumnIndex'];
        }

        // Load all data into lookup table
        $LookupTable = array();
        $DbResult2 = $this->Database->query($this->BuildQuery($Group));
        while($DbRow = $DbResult2->fetch_assoc()) {
          //Export only if translate have same varible %
          $CanExport = true;
          foreach($TranslationTree[$Group['Id']]['Items'] as $Column)  {
            $DbRow[$Column['Column']] = str_replace ( '$ ','$',$DbRow[$Column['Column']]);
            if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']])) {
              $CanExport = false;
              $Output .= ', NE='.$DbRow['ID'];
            }
            if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']])) {
              $CanExport = false;
              $Output .= ', NE='.$DbRow['ID'];
            }
          }

          if ($CanExport)
            $LookupTable[$DbRow[$Group['PrimaryKeyItem']]] = $DbRow;

        }

        // Open original DBC file
        $SourceDBCFile = new DBCFile();
        $SourceDBCFile->OpenFile($this->SourceDir.$this->ClientVersion['Version'].'/dbc/'.$Group['DBCFileName'].'.dbc', $ColumnFormat);

        // Create new DBC file
        if(!file_exists($this->TempDir.'dbc/')) mkdir ($this->TempDir.'dbc/', 0777, true);
        $NewDBCFile = new DBCFile();
        $NewDBCFile->CreateFile($this->TempDir.'dbc/'.$Group['DBCFileName'].'.dbc', $ColumnFormat);
        $NewDBCFile->SetRecordCount($SourceDBCFile->GetRecordCount());
        $NewDBCFile->SetFieldCount($SourceDBCFile->GetFieldCount());
        $NewDBCFile->Commit();

        // Replace translated strings
        $OldProgress = -1;
        $Output .= "\n\r";
        $RowCount = $SourceDBCFile->GetRecordCount();
        $FieldCount = $SourceDBCFile->GetFieldCount();
        for($Row = 0; $Row < $RowCount; $Row++)
        {
          $Line = $SourceDBCFile->GetLine($Row);

          // Get multicolumn index value
          $PrimaryKeyItem = '';
          $ColumnItems = explode(',', $Group['DBCIndex']);
          if(count($ColumnItems) > 1)
          {
            foreach($ColumnItems as $ColumnItem)
              $PrimaryKeyItem .= $Line[$ColumnItem].'_';
            $PrimaryKeyItem = substr($PrimaryKeyItem, 0, -1);
          } else $PrimaryKeyItem = $Line[$Group['DBCIndex']];

          if(array_key_exists($PrimaryKeyItem, $LookupTable))
          {
            // Replace text columns
            $LookupTableItem = $LookupTable[$PrimaryKeyItem];
            foreach($TranslationTree[$Group['Id']]['Items'] as $GroupItem)
            {
              if(array_key_exists($GroupItem['Id'], $ColumnIndexes))
                $Line[$ColumnIndexes[$GroupItem['Id']]] = $LookupTableItem[$GroupItem['Column']];
            }
          }
          $NewDBCFile->SetLine($Row, $Line);

          // Show completion progress
          $Progress = round($Row / $RowCount * 100);
          if($Progress != $OldProgress)
          {
            if (($Group['Id'] == 13) and ($Progress <> 100)) $this->AddProgress(0.01);
            $Output .= $Progress."%\r";
            echo($Output);
            $Output = '';
            $OldProgress = $Progress;
          }
        }
        $NewDBCFile->Commit();
      } else $Output .= ShowMessage('Zdrojový soubor '.$this->SourceDirRelative.$this->ClientVersion['Version'].'/dbc/'.$Group['DBCFileName'].'.dbc'.' nenalezen.'."\n", MESSAGE_CRITICAL);
    }
    $Output .= 'Hotovo <br />';
    return($Output);
  }

  function ExportToLua()
  {
    global $TranslationTree;

    $this->LoadFilters();

    $Output = '';
    if(!file_exists($this->TempDir.'lua/')) mkdir($this->TempDir.'lua/', 0777, true);
    $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id.' AND `Group`.`LuaFileName` != ""');
    while($Group = $DbResult->fetch_assoc())
    {
      $this->AddProgress(1);
    //  $this->AddProgress();
      $Output .= $Group['Name'].'... ';
      $File = new FileStream();
      if (!file_exists($this->SourceDir.$this->ClientVersion['Version'].'/lua/'.$Group['LuaFileName'].'.lua'))
        continue;
      $File->OpenFile($this->SourceDir.$this->ClientVersion['Version'].'/lua/'.$Group['LuaFileName'].'.lua');
      $File2 = new FileStream();
      $File2->CreateFile($this->TempDir.'lua/'.$Group['LuaFileName'].'.lua');

      $LookupTable = array();
      $DbResult2 = $this->Database->query($this->BuildQuery($Group));
      while($DbRow = $DbResult2->fetch_assoc()) {
          $CanExport = true;
          foreach($TranslationTree[$Group['Id']]['Items'] as $Column)  {
          //  if (strpos($DbRow[$Column['Column']],'\\'))
           //   $CanExport = false;
        //    $DbRow[$Column['Column']] = str_replace ( '$ ','$',$DbRow[$Column['Column']]);
         //   $DbRow[$Column['Column']] = $DbRow['En'.$Column['Column']];

            if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']])) {
              if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
              $CanExport = false;
            }
            if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']])) {
              if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
              $CanExport = false;
            }
            if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']],'%')) {
              if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
              $CanExport = false;
            }
            if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']],'%')) {
              if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
              $CanExport = false;
            }
            if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']],'\\')) {
              if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
              $CanExport = false;
            }
            if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']],'\\')) {
              if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
              $CanExport = false;
            }
            if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']],'|')) {
              if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
              $CanExport = false;
            }
            if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']],'|')) {
              if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
              $CanExport = false;
            }
            if (!$this->HaveVarible($DbRow[$Column['Column']],$DbRow['En'.$Column['Column']],chr(10))) {
              if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
              $CanExport = false;
            }
            if (!$this->HaveVarible($DbRow['En'.$Column['Column']],$DbRow[$Column['Column']],chr(10))) {
              if ($CanExport) $Output .= ', NE='.$DbRow['ID'];
              $CanExport = false;
            }
          }

        if ($CanExport)
            $LookupTable[$DbRow['ShortCut']] = $DbRow;
      }

      while(!$File->EOF())
      {
        $Line = $File->ReadLine();
        if(strpos($Line, '=') !== false)
        {
          $LineParts = explode('=', $Line, 2);
          $Value['ShortCut'] = trim($LineParts[0]);
          $Line = trim($LineParts[1]);

          if($Line[0] == '"')
          {
            // Quoted string value
            $Line = substr($Line, 1); // Skip start qoute
            $TempLine = str_replace('\"', '  ', $Line); // Temporary remove slashed quotes
            if (strpos($TempLine, '"')) {
               $Value['Text'] = substr($Line, 0, strpos($TempLine, '"'));
            } else {
               $Value['Text'] = substr($Line, 0, strpos($Line, '"'));
            }
//            $Value['Text'] = str_replace('\n', "\n", $Value['Text']);
//            $Value['Text'] = addslashes(stripslashes($Value['Text']));
            $Line = trim(substr($Line, strpos($TempLine, '"') + 1)); // Skip closing quote and semicolon                                                                  {
          } else
          {
            // Nonstring value
            $Value['Text'] = substr($Line, 0, strpos($Line, ';'));
          }
          $Line = substr($Line, strpos($Line, ';') + 1);
          $Value['Comment'] = addslashes(stripslashes(substr($Line, 3))); // Skip " --"

          if(array_key_exists($Value['ShortCut'], $LookupTable))
          {
            $DbRow = $LookupTable[$Value['ShortCut']];
            $Value['Text'] = $DbRow['Text'];
            //addslashes
            $Value['Text'] = str_replace('"', '\"', $Value['Text']);
            // Escape new line control characters
            $Value['Text'] = str_replace("\n", '\n', $Value['Text']);
            $Value['Text'] = str_replace("\r", '', $Value['Text']);
            $Value['Comment'] = $DbRow['Comment'];
            // Only one line comments allowed
            $Value['Comment'] = str_replace("\n", ' ', $Value['Comment']);
            $Value['Comment'] = str_replace("\r", '', $Value['Comment']);
            //echo('.');
          }
          $NewLine = $Value['ShortCut'].' = "'.$Value['Text'].'";';
          //if($Value['Comment'] != '') $NewLine .= ' -- '.$Value['Comment'];
          $NewLine .= "\r\n";
          $File2->WriteLine($NewLine);
        } else $File2->WriteLine($Line);
      }
      $Output .= 'Hotovo <br/>';
    }
    return($Output);
  }

  function GetReadme() {
    $_GET['ExportId'] = $this->Id;
    $PageExport = new PageExport($this->System);
    $this->LoadFilters();
    $Output = '';
    //generation readme
    $Output .= '<?xml version="1.0" encoding="utf-8"?\>'.
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'.
'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs">'.
'<head>'.
 '<STYLE type="text/css">'.
'.BaseTable {margin: 2px auto 2px auto;border-width: 1px;border-color: black;border-style: solid;border-collapse: collapse;}'.

'.BaseTable tr td{  border-width: 1px;  border-color: black;  border-style: solid;  padding: 2px;  text-align: center;}'.

'.BaseTable tr th{  border-width: 1px;  border-color: black;  border-style: solid;  padding: 2px;  background-color: #F0F0F0;  text-align: center;}'.
 '</STYLE>'.
  '<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />'.
  '<title>Čeština pro WoW</title>'.
'</head><body>'.
'<h1>České WoW - čestina pro klienta hry World of Warcraft</h1>'.

'<table cellspacing="10"><tr><td valign="top">'.

'<p>Texty přebírány z projektu <a href="http://wowpreklad.zdechov.net/">wowpreklad.zdechov.net</a><br>'.
'<a href="http://wowpreklad.zdechov.net/export/?Action=View&ExportId='.$this->Id.'&Tab=0">Export '.$this->Id.'</a></p><br>'.


'<p><strong>Vlastnosti</strong>'.
'<ul>'.
'<li>Požadovaná verze klienta: '.$this->ClientVersion['Version'].'</li>'.
'<li>Datum uvolnění: '.date('d.m.Y h:m',time()).'</li>'.
'<li>Sestaveno automaticky překladovým systémem <a href="http://wowpreklad.zdechov.net/">WoW překlad</a></li>'.
//'<li>Tento soubor se generuje každý den. Pokud se zapojíte do překladu, zítra můžete stáhnout tento soubor znovu včetně svých překladů</li>'.
//'<li>Sestavil: Maron</li>'.
'</ul>'.
'</p>'.
'<br>'.

'<h2>Nejčastější otázky</h2>'.
'<p><strong>Jak mám vyhledávat věci v aukci nebo výpravy na internetu s nainstalovanou češtinou?</strong><br>
Pokud používáte addon, který mění názvy předmětů jenom zdánlivě pro vás, potřebujete pro vyhledávání v aukci zjistit původní anglický název. Tento název zjistíte jednoduše držením klávesy shift a kliknutím na předmět při otevřené aukci, nebo chatu. Vytvořený odkaz v chatu, nebo text v aukci je v původním znění. Stejně zjistíte i název výpravy kliknutím se shift na výpravu v "quest logu".
Pokud jste na serveru s českou lokalizaci (tedy nepoužíváte addon), musíte využít český název pro vyhledávání. Server by měl mít spuštěnou vlastní obdobu databáze wowhead.</p>'.

'<p><strong>Po nainstalování češtiny a spouštění přes soubor WoWlua.exe mi klesl výrazně výkon</strong><br>
Problém může být spojen s použitím integrované grafiky místo herní.</p>'.

'<p><strong>Při spouštění hry přes soubor WoWLua.exe se mi neukládá žádné nastavení addonů a podobně</strong><br>
Problém může být způsoben špatně nastavenými právy u souboru WoWLua.exe. Můžete přenastavit práva, nebo spouštět jako správce.</p>'.

'<p><strong>Po spuštění souboru WoWLua.exe mi píše chybu:</strong><br>
Cannot stream required archive data. Please check the network connection.
Chyba může být způsobena tím, že jste nenainstalovali češtinu do adresáře se hrou.
Nebo jste nainstalovali do jiné verze hry, než je požadovaná. Může se vztahovat i na požadovanou lokalizaci (enUS, enGB)</p>'.

'<p><strong>Po nainstalování češtiny nemám žádné výpravy (questy) česky</strong><br>
Zkontrolujte si v přihlášení, jestli máte povolený addon CzWoW v seznamu addonů.</p>'.

'<p><strong>Addon mi hlásí spoustu chyb.</strong><br>
Chyba může být způsobena kolizí s jinými addony. Vyzkoušejte spuštění hry pouze s addonem CzWoW.</p>'.

'<p><strong>Ve hře se mi špatně zobrazuje diakritika (háčky, čárky)</strong><br>
Chyba je způsobena chybějícími fonty do hry. Potřebné fonty si stáhněte mezi soubory ke stažení.</p>'.

'<p><strong>Mám nainstalovánu češtinu a nejde mi spustit Wow.exe.</strong><br>
Pokud chcete opět spouštět hru přes původní Wow.exe v angličtině, musíte češtinu nejprve odinstalovat ze systému. Především se jedná o soubor Data/enGB/patch-enGB-5.MPQ či Data/enUS/patch-enUS-5.MPQ, který je nutno smazat. U novějších verzí se soubor může jmenovat wow-update-base-50000.MPQ.</p>'.

'<p><strong>Jak mám hru spustit?</strong><br>
Hru musíte spustit přes soubor WowLua.exe v kořenovém adresáři hry.</p>'.

'<p><strong>Mohu použít tuto češtinu na oficiálních serverech?</strong><br>
Ne úplně, protože se vystavujete riziku zablokování vašeho účtu z důvodu použití upravené hry. Na oficiálním serveru lze využít pouze Addon s češtinou CzWoW. Instalační soubor určený pro oficiální servery je už takto přizpůsoben.</p>'.

'</td><td>';

  $Output .= $PageExport->ExportViewStat(' WHERE `DBCFileName` !=\'\' OR `LuaFileName` !=\'\' OR `Group`.`Id` = 1 OR `Group`.`Id` = 2 OR `Group`.`Id` = 3 OR `Group`.`Id` = 16');

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


  '</body></html>';
  return $Output;
}

  function ExportToXML()
  {
    global $TranslationTree;

    $this->LoadFilters();

    $Buffer = '<?xml version="1.0" encoding="utf-8"?>'."\n".
    "<document>\n".
    "  <meta>\n".
    "    <projecturl>".$this->System->Config['Web']['Host'].$this->System->Link('/')."</projecturl>\n".
    "    <time>".date('r')."</time>\n".
    "    <diacritics mode=".'"'.$this->Export['WithDiacritic'].'"'." />\n".
    "    <author>".$this->System->User->Name."</author>\n".
    "    <contributors>\n";
    foreach(explode(',', $this->UserNames) as $UserName)
      $Buffer .= "      <user>".$UserName."</user>\n";
    $Buffer .=
    "    </contributors>\n".
    "  </meta>\n".
    "  <translation>\n";

    $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` '.
      'JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
    while($Group = $DbResult->fetch_assoc())
    {
      if($Group['MangosTable'] == '')
      {
        $Group['MangosTable'] = $Group['TablePrefix'];
        $Group['MangosTableIndex'] = 'entry';
      }
      $Buffer .= '    <group id="'.$Group['Id'].'" name="'.$Group['TablePrefix'].'">'."\n";
      $DbResult2 = $this->Database->query($this->BuildQuery($Group));
      while($Line = $DbResult2->fetch_assoc())
      {
        $Buffer .= '      <item id="'.$Line['Entry'].'" user="'.$Line['UserName'].'">'."\n";
        $Values = '';
        foreach($TranslationTree[$Group['Id']]['Items'] as $GroupItem)
        {
          if($GroupItem['MangosColumn'] == '') $GroupItem['MangosColumn'] = $GroupItem['Column'];
          if($Line[$GroupItem['Column']] != '')
          $Buffer .= '        <text index="'.$GroupItem['Id'].'" name="'.
            $GroupItem['Column'].'">'.addslashes($Line[$GroupItem['Column']]).'</text>'."\n";
        }
        $Buffer .= "      </item>\n";
      }
      $Buffer .= "    </group>\n";
    }
    if($this->Export['WithDiacritic'] != 1) $Buffer = utf2ascii($Buffer);
    $Buffer .= "  </translation>\n".
  "</document>";
    return($Buffer);
  }
}

include_once(dirname(__FILE__).'/Page.php');
include_once(dirname(__FILE__).'/ExportOutput.php');

class ModuleExport extends AppModule
{
  function __construct(System $System)
  {
    parent::__construct($System);
    $this->Name = 'Export';
    $this->Version = '1.0';
    $this->Creator = 'Chronos';
    $this->License = 'GNU/GPL';
    $this->Description = 'Allow parametric export of translated texts to various supported output formats';
    $this->Dependencies = array();
  }

  function DoStart()
  {
    $this->System->RegisterPage('export', 'PageExport');
    $this->System->RegisterMenuItem(array(
      'Title' => 'Exporty',
      'Hint' => 'Zde si můžete stáhnout přeložené texty',
      'Link' => $this->System->Link('/export/'),
      'Permission' => LICENCE_ANONYMOUS,
      'Icon' => '',
    ), 2);
  }
}

