<?php
class S
{
  static public function generate_webp_image($file, $compression_quality = 85)
  {
    if ( strpos( $file, 'thumb/' ) !== false )
    {
      $file_tmp = explode( '/', $file );

      $width = $file_tmp[1];
      if ( empty( $width ) and $width !== '0' )
        $width = 500;

      $height = $file_tmp[2];
      if ( empty( $height ) and $height !== '0' )
        $height = 500;

      for ( $i = 0; $i <= 2; $i++ )
        unset( $file_tmp[$i] );

      $img_src = implode( '/', $file_tmp );

      $crop_w   = $_GET['c_w'];
      $crop_h   = $_GET['c_h'];

      $img_md5    = md5( $img_src . $height . $width . $crop_h . $crop_w );
      $file  = 'thumbs/' . $img_md5[0] . '/' . $img_md5[1] . '/' . $img_md5[2] . '/' . $img_md5;
    }

    if (!file_exists($file))
      return false;

    $output_file = 'cache/' . $file . '.webp';
    if (file_exists($output_file))
      return $output_file;

    $file_type = mime_content_type( $file );

    if (function_exists('imagewebp'))
    {
      switch ($file_type)
      {
        case 'image/jpeg':
          $image = imagecreatefromjpeg($file);
          break;

        case 'image/png':
          $image = imagecreatefrompng($file);
          imagepalettetotruecolor($image);
          imagealphablending($image, true);
          imagesavealpha($image, true);
          break;

        case 'image/gif':
          $image = imagecreatefromgif($file);
          break;

        default:
          return false;
      }

      $dir = dirname($output_file);
      if (!is_dir($dir))
        mkdir($dir, 0755, true);

      $result = imagewebp($image, $output_file, $compression_quality);
      if (false === $result)
        return false;

      imagedestroy($image);

      return $output_file;
    }
    elseif (class_exists('Imagick'))
    {
      $dir = dirname($output_file);
      if (!is_dir($dir))
        mkdir($dir, 0755, true);

      $image = new \Imagick();
      $image->readImage($file);

      if ($file_type === 'png')
      {
        $image->setImageFormat('webp');
        $image->setImageCompressionQuality($compression_quality);
        $image->setOption('webp:lossless', 'true');
      }

      $image->writeImage($output_file);
      return $output_file;
    }

    return false;
  }

  static public function is_array_fix($value)
  {
    if (is_array($value) and count($value))
      return true;
    return false;
  }

  public static function suAppendHtmlById(&$s, $sId, $sHtml, &$oDoc = null)
  {
    return \S::suSetHtmlElementById($oDoc, $s, $sId, $sHtml, true, false);
  }

  public static function suInsertHtmlById(&$s, $sId, $sHtml, &$oDoc = null)
  {
    return \S::suSetHtmlElementById($oDoc, $s, $sId, $sHtml, false, true);
  }

  public static function suAddHtmlBeforeById(&$s, $sId, $sHtml, &$oDoc = null)
  {
    return \S::suSetHtmlElementById($oDoc, $s, $sId, $sHtml, false, true, true);
  }

  public static function suAddHtmlAfterById(&$s, $sId, $sHtml, &$oDoc = null)
  {
    return \S::suSetHtmlElementById($oDoc, $s, $sId, $sHtml, true, false, true);
  }

  public static function suSetHtmlById(&$s, $sId, $sHtml, &$oDoc = null)
  {
    return \S::suSetHtmlElementById($oDoc, $s, $sId, $sHtml, true, true);
  }

  public static function suReplaceHtmlElementById(&$s, $sId, $sHtml, &$oDoc = null)
  {
    return \S::suSetHtmlElementById($oDoc, $s, $sId, $sHtml, false, false);
  }

  public static function suRemoveHtmlElementById(&$s, $sId, &$oDoc = null)
  {
    return \S::suSetHtmlElementById($oDoc, $s, $sId, null, false, false);
  }

  public static function suSetHtmlElementById(&$oDoc, &$s, $sId, $sHtml, $bAppend = false, $bInsert = false, $bAddToOuter = false)
  {
    if (\S::suIsValidString($s) && \S::suIsValidString($sId))
    {
      $bCreate = true;
      if (is_object($oDoc))
      {
        if (!($oDoc instanceof DOMDocument))
        {
          return false;
        }
        $bCreate = false;
      }

      if ($bCreate)
      {
        $oDoc = new DOMDocument();
      }

      libxml_use_internal_errors(true);
      $oDoc->loadHTML($s, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
      libxml_use_internal_errors(false);
      $oNode = $oDoc->getElementById($sId);

      if (is_object($oNode))
      {
        $bReplaceOuter = (!$bAppend && !$bInsert);

        $sId = uniqid('SHEBI-');
        $aId = array("<!-- $sId -->", "<!--$sId-->");

        if ($bReplaceOuter)
        {
          if (\S::suIsValidString($sHtml))
          {
            $oNode->parentNode->replaceChild($oDoc->createComment($sId), $oNode);
            $s = $oDoc->saveHtml();
            $s = str_replace($aId, $sHtml, $oDoc->saveHtml());
          }
          else
          {
            $oNode->parentNode->removeChild($oNode);
            $s = $oDoc->saveHtml();
          }
          return true;
        }

        $bReplaceInner = ($bAppend && $bInsert);
        $sThis = null;

        if (!$bReplaceInner)
        {
          $sThis = $oDoc->saveHTML($oNode);
          $sThis = ($bInsert ? $sHtml : '') . ($bAddToOuter ? $sThis : (substr($sThis, strpos($sThis, '>') + 1, - (strlen($oNode->nodeName) + 3)))) . ($bAppend ? $sHtml : '');
        }

        if (!$bReplaceInner && $bAddToOuter)
        {
          $oNode->parentNode->replaceChild($oDoc->createComment($sId), $oNode);
          $sId = &$aId;
        }
        else
        {
          $oNode->nodeValue = $sId;
        }

        $s = str_replace($sId, $bReplaceInner ? $sHtml : $sThis, $oDoc->saveHtml());
        return true;
      }
    }
    return false;
  }

  public static function suIsValidString(&$s, &$iLen = null, $minLen = null, $maxLen = null)
  {
    if (!is_string($s) || !isset($s{
      0}))
    {
      return false;
    }

    if ($iLen !== null)
    {
      $iLen = strlen($s);
    }

    return (($minLen === null ? true : ($minLen > 0 && isset($s{
      $minLen - 1}))) &&
      $maxLen === null ? true : ($maxLen >= $minLen && !isset($s{
        $maxLen})));
  }

  public static function log_db_error($db_tmp, $debug)
  {
    global $settings;

    if ($settings['mysql_debug'])
    {
      $out .= date('Y-m-d H:i:s') . PHP_EOL;
      $out .= $db_tmp->error()[2] . PHP_EOL;
      $out .= $db_tmp->last() . PHP_EOL;
      $out .= $debug[0]['file'] . ' | ' . $debug[0]['line'] . PHP_EOL;
      $out .= '--------------------------------------------------------------------------------------------' . PHP_EOL;

      if (!is_dir('logs'))
        mkdir('logs', 0755, true);

      $content = file_get_contents('logs/' . date('Y-m-d') . '.txt');
      $content = $out . $content;
      file_put_contents('logs/' . date('Y-m-d') . '.txt', $content);
      die('Blad bazy danych.');
    }
  }

  public static function lang($text)
  {
    global $lang;
    return $lang[$text] ? $lang[$text] : 'LANG-' . $text;
  }

  public static function cache_read($path)
  {
    $f      = fopen($path, 'r');
    $buffer = '';
    while (!feof($f))
    {
      $buffer .= fread($f, 2048);
    }
    fclose($f);
    return $buffer;
  }

  public static function cache_write($cache_url, $cache_file, $html)
  {
    $dir = md5($cache_url);
    $dir = 'cache/' . $dir[0] . '/' . $dir[1] . '/';

    if (!is_dir($dir))
      mkdir($dir, 0755, true);

    $f      = fopen($cache_file, 'w');
    fwrite($f, $html, strlen($html));
    fclose($f);
    return true;
  }

  public static function cache_file_url($cache_url)
  {
    $cache = md5($cache_url);
    return 'cache/' . $cache{
      1} . '/' . $cache{
      2} . '/' . $cache;
  }

  public static function date_diff($data1, $data2, $rodz = '60')
  {
    $data1 = date('Y-m-d H:i:s', strtotime($data1));
    $data2 = date('Y-m-d H:i:s', strtotime($data2));

    $d1_t   = explode(' ', $data1);
    $d1_tt   = explode('-', $d1_t[0]);
    $rok1   = $d1_tt[0];
    $mc1    = $d1_tt[1];
    $d1     = $d1_tt[2];
    $d1_tt   = explode(':', $d1_t[1]);
    $g1     = $d1_tt[0];
    $m1     = $d1_tt[1];
    $s1     = $d1_tt[2];

    $d2_t   = explode(' ', $data2);
    $d2_tt   = explode('-', $d2_t[0]);
    $rok2   = $d2_tt[0];
    $mc2    = $d2_tt[1];
    $d2     = $d2_tt[2];
    $d2_tt   = explode(':', $d2_t[1]);
    $g2     = $d2_tt[0];
    $m2     = $d2_tt[1];
    $s2     = $d2_tt[2];

    $lt   = mktime($g2, $m2, $s2, $mc2, $d2, $rok2);
    $st   = mktime($g1, $m1, $s1, $mc1, $d1, $rok1);

    return round(($lt - $st) / $rodz);
  }

  public static function is_token_valid($token)
  {
    if (!empty($_SESSION['tokens'][$token]))
    {
      unset($_SESSION['tokens'][$token]);
      return true;
    }
    return false;
  }

  public static function get_token()
  {
    $token = sha1(mt_rand());
    if (!isset($_SESSION['tokens']))
      $_SESSION['tokens'] = [$token => 1];
    else
      $_SESSION['tokens'][$token] = 1;
    return $token;
  }

  public static function get_domain($url)
  {
    $parseUrl = parse_url(trim($url));
    return trim($parseUrl[host] ? str_replace('www.', '', $parseUrl[host]) : str_replace('www.', '', array_shift(explode('/', $parseUrl[path], 2))));
  }

  public static function get_domain_url($url)
  {
    global $settings;

    $settings['link_version'] ? $www = 'www.' : $www = '';
    $settings['ssl'] == true ? $domain_prefix = 'https' : $domain_prefix = 'http';
    return $domain_prefix . '://' . $www . \S::get_domain($url);
  }

  public static function max_db_value($table, $column)
  {
    global $mdb;
    $results = $mdb->query('SELECT MAX(' . $column . ') FROM ' . $table)->fetchAll();
    return $results[0][0];
  }

  public static function shuffle_assoc($list)
  {
    if (!is_array($list))
      return $list;

    $keys         = array_keys($list);
    shuffle($keys);
    $random       = array();
    foreach ($keys as $key)
      $random[$key] = $list[$key];
    return $random;
  }

  public static function escape($value)
  {
    $return = '';
    for ($i = 0; $i < strlen($value); ++$i)
    {
      $char   = $value[$i];
      $ord    = ord($char);
      if ($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
        $return .= $char;
      else
        $return .= '\\x' . dechex($ord);
    }
    return $return;
  }

  public static function is_bot()
  {
    $bots  = ["Slurp", "Scooter", "URL_Spider_SQL", "Googlebot", "Firefly", "WebBug", "WebFindBot", "crawler", "appie", "msnbot", "InfoSeek", "FAST", "Spade", "NationalDirectory"];
    $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
    foreach ($bots as $bot)
      if (stripos($agent, $bot) !== false)
        return true;
    return false;
  }

  public static function months()
  {
    return array(1 => 'Styczeń', 2 => 'Luty', 3 => 'Marzec', 4 => 'Kwiecień', 5 => 'Maj', 6 => 'Czerwiec', 7 => 'Lipiec', 8 => 'Sierpień', 9 => 'Wrzesień', 10 => 'Październik', 11 => 'Listopad', 12 => 'Grudzień');
  }

  public static function months_short()
  {
    return [1 => 'sty', 2 => 'lut', 3 => 'mar', 4 => 'kwi', 5 => 'maj', 6 => 'cze', 7 => 'lip', 8 => 'sie', 9 => 'wrz', 10 => 'paź', 11 => 'lis', 12 => 'gru'];
  }

  public static function chmod_r($path, $chmod = 0755)
  {
    $dir = new DirectoryIterator($path);
    foreach ($dir as $item)
    {
      chmod($item->getPathname(), $chmod);
      if ($item->isDir() && !$item->isDot())
        self::chmod_r($item->getPathname());
    }
  }

  public static function rrmdir($dir)
  {
    if (is_dir($dir))
    {
      $files = scandir($dir);
      foreach ($files as $file)
        if ($file != "." && $file != "..")
          \S::rrmdir("$dir/$file");
      rmdir($dir);
    }
    else if (file_exists($dir))
      unlink($dir);
  }

  public static function rcopy($src, $dst)
  {
    if (is_dir($src))
    {
      mkdir($dst, 0755);
      $files = scandir($src);
      foreach ($files as $file)
        if ($file != "." && $file != "..")
          \S::rcopy("$src/$file", "$dst/$file");
    }
    else if (file_exists($src))
      copy($src, $dst);

    \S::rrmdir($src);
  }

  public static function is_mobile()
  {
    $detect = new \Mobile_Detect;
    return $detect->isMobile();
  }

  public static function get_new_version()
  {
    global $settings;

    if ($version = \S::get_session('new-version'))
      return $version;

    $versions = file_get_contents('http://www.cmspro.project-dc.pl/updates/versions.php?key=' . $settings['update_key']);
    $versions = explode(PHP_EOL, $versions);
    $version  = str_replace(',', '.', max($versions));

    \S::set_session('new-version', $version);

    return $version;
  }

  public static function get_version()
  {
    return str_replace(',', '.', @file_get_contents('../libraries/version.ini'));
  }

  public static function pre($data, $type = '')
  {
    $data = str_replace('Array
      (', '', $data);
    $data = str_replace(')', '', $data);

    echo '<pre';
    if ($type == 'error')
      echo ' style="color: #cc0000;" ';
    else if ($type == 'info')
      echo ' style="color: #2c539e;" ';
    else
      echo ' style="color: #8fc400;" ';
    echo '>' . print_r($data, true) . '</pre>';
  }

  public static function json_to_array($json)
  {
    $values_tmp = json_decode($json, true);

    if (is_array($values_tmp))
      foreach ($values_tmp as $val)
      {
        if (isset($values[$val['name']]))
        {
          if (is_array($values[$val['name']]))
            $values[$val['name']][] = $val['value'];
          else
            $values[$val['name']]   = array($values[$val['name']], $val['value']);
        }
        else
          $values[$val['name']] = $val['value'];
      }
    return $values;
  }

  public static function set_session($var, $val)
  {
    $_SESSION[$var] = $val;
  }

  public static function get_session($var)
  {
    return $_SESSION[$var];
  }

  public static function delete_session($var)
  {
    unset($_SESSION[$var]);
  }

  public static function get($var, $strip_tags = false)
  {
    if (isset($_POST[$var]))
    {
      if (is_string($_POST[$var]))
      {
        if ($strip_tags)
          return trim(strip_tags($_POST[$var]));
        else
          return trim($_POST[$var]);
      }
      else
        return $_POST[$var];
    }
    else
    {
      if (isset($_GET[$var]))
      {
        if (is_string($_GET[$var]))
        {
          if ($strip_tags)
            return trim(strip_tags($_GET[$var]));
          else
            return trim($_GET[$var]);
        }
        else
          return $_GET[$var];
      }
    }
  }

  public static function set_message($text)
  {
    self::set_session('message', $text);
  }

  public static function alert($text, $class = 'alert-success')
  {
    self::set_session('alert', $text);
    self::set_session('alert-class', $class);
  }

  static public function get_language_domain($lang_id)
  {
    global $mdb;

    $settings = \front\factory\Settings::settings_details();
    $default_domain = \admin\factory\Languages::default_domain();
    $settings['link_version'] ? $www = 'www.' : $www = '';

    $domain = $mdb->get('pp_langs', 'domain', ['id' => $lang_id]);
    if (!$domain)
    {
      if ($default_domain)
        return $www . $default_domain;
      else
        return $www . preg_replace('#^(http(s)?://)?w{3}\.#', '$1', $_SERVER['SERVER_NAME']);
    }
    else
    {
      return $www . $domain;
    }
  }

  public static function htacces($dir = '../')
  {
    global $mdb;

    $settings           = \front\factory\Settings::settings_details();
    $default_domain     = \admin\factory\Languages::default_domain();
    $available_domains  = \admin\factory\Languages::available_domains();

    $settings['link_version'] ? $www = 'www.' : $www = '';

    $settings['ssl'] == true ? $domain_prefix = 'https' : $domain_prefix = 'http';

    $default_domain ? $url = $default_domain : $url = preg_replace('#^(http(s)?://)?w{3}\.#', '$1', $_SERVER['SERVER_NAME']);

    $robots = 'User-agent: *' . PHP_EOL;
    $robots .= 'Allow: /' . PHP_EOL;

    unlink('../sitemap.xml');
    if (is_array($available_domains) and !empty($available_domains))
    {
      foreach ($available_domains as $domain)
      {
        $site_map[$domain['domain']] = '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
        $site_map[$domain['domain']] .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . PHP_EOL;
        $site_map[$domain['domain']] .= '<url>' . PHP_EOL;
        $site_map[$domain['domain']] .= '<loc>' . $domain_prefix . '://' . $www . $domain['domain'] . '</loc>' . PHP_EOL;
        $site_map[$domain['domain']] .= '<lastmod>' . date('Y-m-d') . '</lastmod>' . PHP_EOL;
        $site_map[$domain['domain']] .= '<changefreq>daily</changefreq>' . PHP_EOL;
        $site_map[$domain['domain']] .= '<priority>1</priority>' . PHP_EOL;
        $site_map[$domain['domain']] .= '</url>' . PHP_EOL;
      }
    }
    else
    {
      $site_map[$url] = '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
      $site_map[$url] .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . PHP_EOL;
      $site_map[$url] .= '<url>' . PHP_EOL;
      $site_map[$url] .= '<loc>' . $domain_prefix . '://' . $www . $url . '</loc>' . PHP_EOL;
      $site_map[$url] .= '<lastmod>' . date('Y-m-d') . '</lastmod>' . PHP_EOL;
      $site_map[$url] .= '<changefreq>daily</changefreq>' . PHP_EOL;
      $site_map[$url] .= '<priority>1</priority>' . PHP_EOL;
      $site_map[$url] .= '</url>' . PHP_EOL;
    }

    $htaccess_data = file_get_contents($dir . 'libraries/htaccess.conf');

    /* cache */
    if ($settings['htaccess_cache'])
    {
      $htaccess_data = str_replace(
        '{HTACCESS_CACHE}',
        '<IfModule mod_deflate.c>' . PHP_EOL
          . 'AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript' . PHP_EOL
          . '</IfModule>' . PHP_EOL
          . '<IfModule mod_expires.c>' . PHP_EOL
          . 'ExpiresActive on' . PHP_EOL
          . 'ExpiresDefault "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType text/css "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType application/json "access plus 0 seconds"' . PHP_EOL
          . 'ExpiresByType application/xml "access plus 0 seconds"' . PHP_EOL
          . 'ExpiresByType text/xml "access plus 0 seconds"' . PHP_EOL
          . 'ExpiresByType image/x-icon "access plus 1 week"' . PHP_EOL
          . 'ExpiresByType text/x-component "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType text/html "access plus 0 seconds"' . PHP_EOL
          . 'ExpiresByType application/javascript "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"' . PHP_EOL
          . 'ExpiresByType text/cache-manifest "access plus 0 seconds"' . PHP_EOL
          . 'ExpiresByType audio/ogg "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType image/gif "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType image/jpeg "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType image/webp "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType image/png "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType video/mp4 "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType video/ogg "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType video/webm "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType application/atom+xml "access plus 1 hour"' . PHP_EOL
          . 'ExpiresByType application/rss+xml "access plus 1 hour"' . PHP_EOL
          . 'ExpiresByType application/font-woff "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType application/vnd.ms-fontobject "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType application/x-font-ttf "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType font/opentype "access plus 1 year"' . PHP_EOL
          . 'ExpiresByType image/svg+xml "access plus 1 year"' . PHP_EOL
          . '</IfModule>',
        $htaccess_data
      );
    }
    else
    {
      $htaccess_data = str_replace(
        '{HTACCESS_CACHE}',
        '<IfModule mod_headers.c>' . PHP_EOL
          . 'Header set Cache-Control "no-cache, no-store, must-revalidate"' . PHP_EOL
          . 'Header set Pragma "no-cache"' . PHP_EOL
          . 'Header set Expires 0' . PHP_EOL
          . '</IfModule>',
        $htaccess_data
      );
    }

    /* języki w domenie głównej */
    $results = $mdb->select('pp_langs', ['id'], ['AND' => ['status' => 1, 'domain' => null], 'ORDER' => ['o' => 'ASC']]);
    if (is_array($results)) foreach ($results as $row)
    {
      $htaccess_data .= PHP_EOL . 'RewriteRule ^' . $row['id'] . '/$ index.php?a=change_language&id=' . $row['id'] . ' [L]';
    }

    $htaccess_data .= PHP_EOL;

    $results = $mdb->select('pp_langs', ['id', 'start', 'domain', 'main_domain'], ['status' => 1, 'ORDER' => ['o' => 'ASC']]);
    if (is_array($results)) foreach ($results as $row)
    {
      $row['domain'] ? $url_tmp = $row['domain'] : $url_tmp = $url;

      !$row['start'] ? $language_link = $row['id'] . '/' : $language_link = '';

      $results2 = $mdb->select(
        'pp_pages_langs',
        ['[><]pp_pages' => ['page_id' => 'id']],
        ['seo_link', 'title', 'page_id', 'noindex', 'start', 'page_type'],
        ['AND' => ['status' => 1, 'lang_id' => $row['id'], 'block_direct_access' => 0], 'ORDER' => ['start' => 'DESC', 'o' => 'ASC']]
      );
      if (is_array($results2)) foreach ($results2 as $row2)
      {
        if ($row2['title'])
        {
          /* sitemap.xml */
          if ($row2['page_type'] != 3 and !$row2['noindex'])
          {
            $site_map[$url_tmp] .= '<url>' . PHP_EOL;

            if ($row2['seo_link'])
            {
              if ($settings['links_structure'])
                $seo = \admin\factory\Pages::google_url_preview($row2['page_id'], $row2['title'], $row[id], 0, 0, $row2['seo_link'], $language_link);
              else
                $seo = $language_link . \S::seo($row2['seo_link']);

              $site_map[$url_tmp] .= '<loc>' . $domain_prefix . '://' . $www . $url_tmp . '/' . $seo . '</loc>' . PHP_EOL;
            }
            else
            {
              if ($settings['links_structure'])
                $seo = \admin\factory\Pages::google_url_preview($row2['page_id'], $row2['title'], $row['id'], 0, 0, $row2['seo_link'], $language_link);
              else
                $seo = $language_link . 's-' . $row2['page_id'] . '-' . \S::seo($row2['title']);

              $site_map[$url_tmp] .= '<loc>' . $domain_prefix . '://' . $www . $url_tmp . '/' . $seo . '</loc>' . PHP_EOL;
            }

            $site_map[$url_tmp] .= '<lastmod>' . date('Y-m-d') . '</lastmod>' . PHP_EOL;
            $site_map[$url_tmp] .= '<changefreq>daily</changefreq>' . PHP_EOL;

            $row['start'] ? $priority = 1 : $priority = 0.8;

            $site_map[$url_tmp] .= '<priority>' . $priority . '</priority>' . PHP_EOL;
            $site_map[$url_tmp] .= '</url>' . PHP_EOL;
          }

          /* robotx.txt */
          if ($row2['noindex'] and $row2['page_type'] != 3)
          {
            $robots .= 'User-agent: GoogleBot' . PHP_EOL;

            if ($row2['seo_link'])
            {
              if ($settings['links_structure'])
                $seo = \admin\factory\Pages::google_url_preview($row2['page_id'], $row2['title'], $row[id], 0, 0, $row2['seo_link'], $language_link);
              else
                $seo = $language_link . \S::seo($row2['seo_link']);

              $robots .= 'Disallow: /' . $seo . '$' . PHP_EOL;
              $robots .= 'Disallow: /' . $seo . '/s/*' . PHP_EOL;
            }
            else
            {
              if ($settings['links_structure'])
                $seo = \admin\factory\Pages::google_url_preview($row2['page_id'], $row2['title'], $row['id'], 0, 0, $row2['seo_link'], $language_link);
              else
                $seo = $language_link . 's-' . $row2['page_id'] . '-' . \S::seo($row2['title']);

              $robots .= 'Disallow: /' . $seo . '$' . PHP_EOL;
              $robots .= 'Disallow: /' . $seo . '/s/*$' . PHP_EOL;
            }
          }

          /* htaccess */
          if ($row2['page_type'] != 3)
          {
            if ($row['start'] and $row2['start'])
            {
              $htaccess_data .= PHP_EOL . 'RewriteRule ^$ index.php?a=page&id=' . $row2['page_id'] . '&lang=' . $row['id'] . '&%{QUERY_STRING} [L]' . PHP_EOL;

              if ($row2['seo_link'])
              {
                $htaccess_data .= PHP_EOL . 'RewriteCond %{REQUEST_URI} ^/' . \S::seo($row2['seo_link']) . '$';
                $htaccess_data .= PHP_EOL . 'RewriteRule ^(.*)$ ' . $domain_prefix . '://' . $www . $url_tmp . '/' . $language_link . ' [R=301,L]';

                $htaccess_data .= PHP_EOL . 'RewriteCond %{REQUEST_URI} ^/' . \S::seo($row2['seo_link']) . '/s/1$';
                $htaccess_data .= PHP_EOL . 'RewriteRule ^(.*)$ ' . $domain_prefix . '://' . $www . $url_tmp . '/' . $language_link . ' [R=301,L]';
              }
              else
              {
                $htaccess_data .= PHP_EOL . 'RewriteCond %{REQUEST_URI} ^/s-' . $row2['page_id'] . '-' . \S::seo($row2['title']) . '$';
                $htaccess_data .= PHP_EOL . 'RewriteRule ^(.*)$ ' . $domain_prefix . '://' . $www . $url_tmp . '/' . $language_link . ' [R=301,L]';

                $htaccess_data .= PHP_EOL . 'RewriteCond %{REQUEST_URI} ^/s-' . $row2['page_id'] . '-' . \S::seo($row2['title']) . '-s-1$';
                $htaccess_data .= PHP_EOL . 'RewriteRule ^(.*)$ ' . $domain_prefix . '://' . $www . $url_tmp . '/' . $language_link . ' [R=301,L]';
              }

              $htaccess_data .= PHP_EOL . 'RewriteCond %{REQUEST_URI} "^/$"';
              $htaccess_data .= PHP_EOL . 'RewriteRule ^$ index.php?a=page&id=' . $row2['page_id'] . '&lang=' . $row['id'] . ' [L]';

              $htaccess_data .= PHP_EOL;
            }

            if ($row2['seo_link'])
            {
              if ($settings['links_structure'])
                $seo = \admin\factory\Pages::google_url_preview($row2['page_id'], $row2['title'], $row[id], 0, 0, $row2['seo_link'], $language_link);
              else
                $seo = $language_link . \S::seo($row2['seo_link']);

              $htaccess_data .= PHP_EOL . 'RewriteRule ^' . $seo . '(|/)$ index.php?a=page&id=' . $row2['page_id'] . '&lang=' . $row['id'] . '&%{QUERY_STRING} [L]';
              $htaccess_data .= PHP_EOL . 'RewriteRule ^' . $seo . '/s/1(|/)$ ' . $seo . ' [R=301,L]';
              $htaccess_data .= PHP_EOL . 'RewriteRule ^' . $seo . '/s/([0-9]+)(|/)$ index.php?a=page&id=' . $row2['page_id'] . '&lang=' . $row['id'] . '&bs=$1&%{QUERY_STRING} [L]';
            }
            else
            {
              if ($settings['links_structure'])
                $seo = \admin\factory\Pages::google_url_preview($row2['page_id'], $row2['title'], $row['id'], 0, 0, $row2['seo_link'], $language_link);
              else
                $seo = $language_link . 's-' . $row2['page_id'] . '-' . \S::seo($row2['title']);

              $htaccess_data .= PHP_EOL . 'RewriteRule ^' . $seo . '(|/)$ index.php?a=page&id=' . $row2['page_id'] . '&lang=' . $row['id'] . '&%{QUERY_STRING} [L]';
              $htaccess_data .= PHP_EOL . 'RewriteRule ^' . $seo . '/s/1(|/)$ ' . $seo . ' [R=301,L]';
              $htaccess_data .= PHP_EOL . 'RewriteRule ^' . $seo . '/s/([0-9]+)(|/)$ index.php?a=page&id=' . $row2['page_id'] . '&lang=' . $row['id'] . '&bs=$1&%{QUERY_STRING} [L]';
            }
            $htaccess_data .= PHP_EOL;
          }
        }
      }

      $results2 = $mdb->select(
        'pp_articles_langs',
        ['[><]pp_articles' => ['article_id' => 'id']],
        ['seo_link', 'title', 'article_id', 'noindex', 'copy_from', 'block_direct_access'],
        ['AND' => ['status' => 1, 'lang_id' => $row['id']]]
      );
      if (is_array($results2)) foreach ($results2 as $row2)
      {
        $domain = \S::get_language_domain($row['id']);

        if ($row2['copy_from'] != null)
        {
          $results_tmp = $mdb->get(
            'pp_articles_langs',
            [
              'seo_link',
              'title'
            ],
            [
              'AND' => [
                'article_id' => $row2['article_id'],
                'lang_id' => $row2['copy_from']
              ]
            ]
          );
          $row2['seo_link'] = $results_tmp['seo_link'];
          $row2['title'] = $results_tmp['title'];
        }

        /* sitemap */
        if (!$row2['block_direct_access'] and $row2['title'])
        {
          $site_map[$url_tmp] .= '<url>' . PHP_EOL;
          if ($row2['seo_link'])
            $site_map[$url_tmp] .= '<loc>' . $domain_prefix . '://' . $www . $url_tmp . '/' . $language_link . \S::seo($row2['seo_link']) . '</loc>' . PHP_EOL;
          else
            $site_map[$url_tmp] .= '<loc>' . $domain_prefix . '://' . $www . $url_tmp . '/' . $language_link . 'a-' . $row2['article_id'] . '-' . self::seo($row2['title']) . '</loc>' . PHP_EOL;
          $site_map[$url_tmp] .= '<lastmod>' . date('Y-m-d') . '</lastmod>' . PHP_EOL;
          $site_map[$url_tmp] .= '<changefreq>daily</changefreq>' . PHP_EOL;
          $site_map[$url_tmp] .= '<priority>0.6</priority>' . PHP_EOL;
          $site_map[$url_tmp] .= '</url>' . PHP_EOL;
        }

        /* robots.txt */
        if ($row2['noindex'])
        {
          $robots .= 'User-agent: GoogleBot' . PHP_EOL;
          if ($row2['seo_link'])
            $robots .= 'Disallow: /' . $row2['seo_link'] . '$' . PHP_EOL;
          else
            $robots .= 'Disallow: /a-' . $row2['article_id'] . '-' . self::seo($row2['title']) . '$' . PHP_EOL;
        }

        if (!$row2['block_direct_access'])
        {
          if ($row2['seo_link'])
          {
            $htaccess_data .= PHP_EOL . 'RewriteRule ^' . $language_link . \S::seo($row2['seo_link']) . '(|/)$ index.php?article=' . $row2['article_id'] . '&lang=' . $row['id'] . '&%{QUERY_STRING} [L]';
          }
          else if ($row2['title'] != null)
          {
            $htaccess_data .= PHP_EOL . 'RewriteRule ^' . $language_link . 'a-' . $row2['article_id'] . '-' . \S::seo($row2['title']) . '(|/)$ index.php?article=' . $row2['article_id'] . '&lang=' . $row['id'] . '&%{QUERY_STRING} [L]';
          }
          $htaccess_data .= PHP_EOL;
        }
      }
    }

    $results = $mdb->query('SELECT '
      . 'name, tag_id '
      . 'FROM '
      . 'pp_tags AS pt '
      . 'INNER JOIN '
      . 'pp_articles_tags AS pat ON pat.tag_id = pt.id '
      . 'GROUP BY '
      . 'tag_id')->fetchAll();
    if (is_array($results) and !empty($results)) foreach ($results as $row)
    {
      $htaccess_data .= PHP_EOL . 'RewriteCond %{QUERY_STRING} !=""';
      $htaccess_data .= PHP_EOL . 'RewriteRule tag/' . \S::seo( $row['name'] ) . '(|/) %{REQUEST_URI}? [R=301,L]';
      $htaccess_data .= PHP_EOL . 'RewriteRule ^tag/' . \S::seo( $row['name'] ) . '(|/)$ index.php?tag=' . $row['tag_id'] . ' [L]';
    }

    $results = $mdb->get('pp_settings', 'value', ['param' => 'htaccess']);
    if ($results)
      $htaccess_data .= PHP_EOL . $results;

    if (file_exists('../libraries/htaccess.ini'))
      $htaccess_data .= PHP_EOL . file_get_contents('../libraries/htaccess.ini');

    $results = $mdb->get('pp_settings', 'value', ['param' => 'robots']);
    if ($results)
      $robots .= PHP_EOL . $results;

    if (is_array($available_domains) and !empty($available_domains))
    {
      foreach ($available_domains as $domain)
        $site_map[$domain['domain']] .= '</urlset>';
    }
    else
      $site_map[$url] .= '</urlset>';

    if ( $settings['ssl'] )
    {
      if ( $settings['link_version'] )
      {
        $redirect = 'RewriteCond %{HTTP_HOST} !^www\.' . PHP_EOL
                    . 'RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=permanent]' . PHP_EOL
                    . 'RewriteCond %{SERVER_PORT} !=443' . PHP_EOL
                    . 'RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=permanent]' . PHP_EOL;

        if ( !$settings['url_version'] )
          $redirect .= '## Remove trailing slash' . PHP_EOL
                    . 'RewriteCond %{REQUEST_FILENAME} !-d [NC]' . PHP_EOL
                    . 'RewriteCond %{REQUEST_URI} !^/admin/(.*) [NC]' . PHP_EOL
                    . 'RewriteRule ^(.*)/$ https://%{HTTP_HOST}/$1 [L,R=301]';
        else
          $redirect .= '## Add trailing slash' . PHP_EOL
                    . 'RewriteCond %{REQUEST_URI} !(/$|\.)' . PHP_EOL
                    . 'RewriteCond %{REQUEST_URI} !^/admin/(.*) [NC]' . PHP_EOL
                    . 'RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]';

        $htaccess_data = str_replace( '{REDIRECT}', $redirect, $htaccess_data );
      }
      else
      {
        $redirect = 'RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]' . PHP_EOL
                    . 'RewriteRule ^(.*)$ https://%1/$1 [R=301,L]' . PHP_EOL
                    . 'RewriteCond %{SERVER_PORT} !=443' . PHP_EOL
                    . 'RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=permanent]' . PHP_EOL;

        if ( !$settings['url_version'] )
          $redirect .= '## Remove trailing slash' . PHP_EOL
                    . 'RewriteCond %{REQUEST_FILENAME} !-d [NC]' . PHP_EOL
                    . 'RewriteCond %{REQUEST_URI} !^/admin/(.*) [NC]' . PHP_EOL
                    . 'RewriteRule ^(.*)/$ https://%{HTTP_HOST}/$1 [L,R=301]';
        else
          $redirect .= '## Add trailing slash' . PHP_EOL
                    . 'RewriteCond %{REQUEST_URI} !(/$|\.)' . PHP_EOL
                    . 'RewriteCond %{REQUEST_URI} !^/admin/(.*) [NC]' . PHP_EOL
                    . 'RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]';

        $htaccess_data = str_replace( '{REDIRECT}', $redirect, $htaccess_data );
      }
    }
    else
    {
      if ($settings['link_version'])
      {
        $redirect = 'RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]' . PHP_EOL
                  . 'RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=permanent]' . PHP_EOL
                  . 'RewriteCond %{SERVER_PORT} =443' . PHP_EOL
                  . 'RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=permanent]' . PHP_EOL;

        if ( !$settings['url_version'] )
          $redirect .= '## Remove trailing slash' . PHP_EOL
                    . 'RewriteCond %{REQUEST_FILENAME} !-d [NC]' . PHP_EOL
                    . 'RewriteCond %{REQUEST_URI} !^/admin/(.*) [NC]' . PHP_EOL
                    . 'RewriteRule ^(.*)/$ http://%{HTTP_HOST}/$1 [L,R=301]';
        else
          $redirect .= '## Add trailing slash' . PHP_EOL
                    . 'RewriteCond %{REQUEST_URI} !(/$|\.)' . PHP_EOL
                    . 'RewriteCond %{REQUEST_URI} !^/admin/(.*) [NC]' . PHP_EOL
                    . 'RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]';

        $htaccess_data = str_replace( '{REDIRECT}', $redirect, $htaccess_data );
      }
      else
      {
        $redirect = 'RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]' . PHP_EOL
                  . 'RewriteRule ^(.*)$ http://%1/$1 [R=301,L]' . PHP_EOL
                  . 'RewriteCond %{SERVER_PORT} =443' . PHP_EOL
                  . 'RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=permanent]' . PHP_EOL;

        if ( !$settings['url_version'] )
          $redirect .= '## Remove trailing slash' . PHP_EOL
                    . 'RewriteCond %{REQUEST_FILENAME} !-d [NC]' . PHP_EOL
                    . 'RewriteCond %{REQUEST_URI} !^/admin/(.*) [NC]' . PHP_EOL
                    . 'RewriteRule ^(.*)/$ http://%{HTTP_HOST}/$1 [L,R=301]';
        else
          $redirect .= '## Add trailing slash' . PHP_EOL
                    . 'RewriteCond %{REQUEST_URI} !(/$|\.)' . PHP_EOL
                    . 'RewriteCond %{REQUEST_URI} !^/admin/(.*) [NC]' . PHP_EOL
                    . 'RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]';

        $htaccess_data = str_replace( '{REDIRECT}', $redirect, $htaccess_data );
      }
    }

    $additional_classes = file_get_contents('../libraries/additional-classes.ini');
    $additional_classes = explode(PHP_EOL, $additional_classes);
    $additional_classes = array_filter($additional_classes);
    if (is_array($additional_classes) and !empty($additional_classes))
    {
      foreach ($additional_classes as $class)
      {
        $classes .= 'RewriteCond %{REQUEST_URI} ^/' . trim($class) . '/(.*) [NC]' . PHP_EOL;
        $classes .= 'RewriteRule ^([^/]*)/([^/]*)(|/([^/]*))$ index.php?module=$1&action=$2&$4 [L]' . PHP_EOL;
      }
    }
    $htaccess_data = str_replace('{ADDITIONAL_CLASSES}', $classes, $htaccess_data);

    /* pozostałe linki */
    $htaccess_data .= PHP_EOL;
    $htaccess_data .= 'RewriteRule ^newsletter/signin$ index.php?module=newsletter&action=signin [L]' . PHP_EOL;
    $htaccess_data .= 'RewriteRule ^newsletter/confirm/hash=(.*)$ index.php?module=newsletter&action=confirm&hash=$1 [L]' . PHP_EOL;
    $htaccess_data .= 'RewriteRule ^newsletter/unsubscribe/hash=(.*)$ index.php?module=newsletter&action=unsubscribe&hash=$1 [L]' . PHP_EOL;

    /* pixieset */
    $results = $mdb->select('pp_articles', 'id', ['pixieset' => 1]);
    if (is_array($results) and count($results))
    {
      $pixieset = 'RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?' . $url_tmp . ' [NC]' . PHP_EOL;
      $pixieset .= 'RewriteCond %{REQUEST_URI} ^(';
      foreach ($results as $row)
      {
        $pixieset .= '/upload/article_images/article_' . $row . '/';
        if ($row != end($results))
          $pixieset .= '|';
      }
      $pixieset .= ') [NC]' . PHP_EOL . 'RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]' . PHP_EOL;

      $htaccess_data = str_replace('{PIXIESET]', $pixieset, $htaccess_data);
    }
    else
    {
      $htaccess_data = str_replace('{PIXIESET]', '', $htaccess_data);
    }

    $fp = fopen($dir . '.htaccess', 'w');
    fwrite($fp, $htaccess_data);
    fclose($fp);

    $class = '\admin\factory\Sitemap';
    $action = 'sitemap';

    if (class_exists($class) and method_exists(new $class, $action))
      $site_map = call_user_func_array(array($class, $action), array($site_map, $available_domains, $domain_prefix, $www, $url));

    if (is_array($available_domains) and !empty($available_domains))
    {
      foreach ($available_domains as $domain)
      {
        $fp = fopen($dir . 'sitemap_' . \S::seo($domain['domain']) . '.xml', 'w');
        fwrite($fp, $site_map[$domain['domain']]);
        fclose($fp);
      }
    }
    else
    {
      $fp = fopen($dir . 'sitemap.xml', 'w');
      fwrite($fp, $site_map[$url]);
      fclose($fp);
    }

    $fp = fopen($dir . 'robots.txt', 'w');
    fwrite($fp, $robots);
    fclose($fp);
  }

  public static function seo( $val, $delete_rhombs = false )
  {
    $array_rep1 = array('*', '_', ' ', '+', '"', "'", '?', '-', ',', '!', '~', '<', '>', '@', '#', '$', '%', '^', '&', '*' . '(', ')' . '-', '=', '\\', '|', '[', ']', ':', '(', ')');
    $array_rep2 = array('-', '-', '-', '-', '', '', '', '-', '-', '', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '', '-', '-', '-', '-', '-', '-', '-', '-');
    $val = self::noPl($val);
    $val = str_replace($array_rep1, $array_rep2, $val);
    if ($delete_rhombs)
      $val = str_replace('/', '', $val);

    $val = strtolower($val);
    $val = preg_replace('/(-){2,}/', '-', $val);
    $val = ltrim($val, '-');
    $val = rtrim($val, '-');
    return $val;
  }

  public static function noPL($string)
  {
    $chars = array( // Decompositions for Latin-1 Supplement chr(195).chr(128)=> 'A', chr(195).chr(129) => 'A',
      chr(195) . chr(130) => 'A', chr(195) . chr(131) => 'A',
      chr(195) . chr(132) => 'A', chr(195) . chr(133) => 'A',
      chr(195) . chr(135) => 'C', chr(195) . chr(136) => 'E',
      chr(195) . chr(137) => 'E', chr(195) . chr(138) => 'E',
      chr(195) . chr(139) => 'E', chr(195) . chr(140) => 'I',
      chr(195) . chr(141) => 'I', chr(195) . chr(142) => 'I',
      chr(195) . chr(143) => 'I', chr(195) . chr(145) => 'N',
      chr(195) . chr(146) => 'O', chr(195) . chr(147) => 'O',
      chr(195) . chr(148) => 'O', chr(195) . chr(149) => 'O',
      chr(195) . chr(150) => 'O', chr(195) . chr(153) => 'U',
      chr(195) . chr(154) => 'U', chr(195) . chr(155) => 'U',
      chr(195) . chr(156) => 'U', chr(195) . chr(157) => 'Y',
      chr(195) . chr(159) => 's', chr(195) . chr(160) => 'a',
      chr(195) . chr(161) => 'a', chr(195) . chr(162) => 'a',
      chr(195) . chr(163) => 'a', chr(195) . chr(164) => 'a',
      chr(195) . chr(165) => 'a', chr(195) . chr(167) => 'c',
      chr(195) . chr(168) => 'e', chr(195) . chr(169) => 'e',
      chr(195) . chr(170) => 'e', chr(195) . chr(171) => 'e',
      chr(195) . chr(172) => 'i', chr(195) . chr(173) => 'i',
      chr(195) . chr(174) => 'i', chr(195) . chr(175) => 'i',
      chr(195) . chr(177) => 'n', chr(195) . chr(178) => 'o',
      chr(195) . chr(179) => 'o', chr(195) . chr(180) => 'o',
      chr(195) . chr(181) => 'o', chr(195) . chr(182) => 'o',
      chr(195) . chr(182) => 'o', chr(195) . chr(185) => 'u',
      chr(195) . chr(186) => 'u', chr(195) . chr(187) => 'u',
      chr(195) . chr(188) => 'u', chr(195) . chr(189) => 'y',
      chr(195) . chr(191) => 'y',
      // Decompositions for Latin Extended-A
      chr(196) . chr(128) => 'A', chr(196) . chr(129) => 'a',
      chr(196) . chr(130) => 'A', chr(196) . chr(131) => 'a',
      chr(196) . chr(132) => 'A', chr(196) . chr(133) => 'a',
      chr(196) . chr(134) => 'C', chr(196) . chr(135) => 'c',
      chr(196) . chr(136) => 'C', chr(196) . chr(137) => 'c',
      chr(196) . chr(138) => 'C', chr(196) . chr(139) => 'c',
      chr(196) . chr(140) => 'C', chr(196) . chr(141) => 'c',
      chr(196) . chr(142) => 'D', chr(196) . chr(143) => 'd',
      chr(196) . chr(144) => 'D', chr(196) . chr(145) => 'd',
      chr(196) . chr(146) => 'E', chr(196) . chr(147) => 'e',
      chr(196) . chr(148) => 'E', chr(196) . chr(149) => 'e',
      chr(196) . chr(150) => 'E', chr(196) . chr(151) => 'e',
      chr(196) . chr(152) => 'E', chr(196) . chr(153) => 'e',
      chr(196) . chr(154) => 'E', chr(196) . chr(155) => 'e',
      chr(196) . chr(156) => 'G', chr(196) . chr(157) => 'g',
      chr(196) . chr(158) => 'G', chr(196) . chr(159) => 'g',
      chr(196) . chr(160) => 'G', chr(196) . chr(161) => 'g',
      chr(196) . chr(162) => 'G', chr(196) . chr(163) => 'g',
      chr(196) . chr(164) => 'H', chr(196) . chr(165) => 'h',
      chr(196) . chr(166) => 'H', chr(196) . chr(167) => 'h',
      chr(196) . chr(168) => 'I', chr(196) . chr(169) => 'i',
      chr(196) . chr(170) => 'I', chr(196) . chr(171) => 'i',
      chr(196) . chr(172) => 'I', chr(196) . chr(173) => 'i',
      chr(196) . chr(174) => 'I', chr(196) . chr(175) => 'i',
      chr(196) . chr(176) => 'I', chr(196) . chr(177) => 'i',
      chr(196) . chr(178) => 'IJ', chr(196) . chr(179) => 'ij',
      chr(196) . chr(180) => 'J', chr(196) . chr(181) => 'j',
      chr(196) . chr(182) => 'K', chr(196) . chr(183) => 'k',
      chr(196) . chr(184) => 'k', chr(196) . chr(185) => 'L',
      chr(196) . chr(186) => 'l', chr(196) . chr(187) => 'L',
      chr(196) . chr(188) => 'l', chr(196) . chr(189) => 'L',
      chr(196) . chr(190) => 'l', chr(196) . chr(191) => 'L',
      chr(197) . chr(128) => 'l', chr(197) . chr(129) => 'L',
      chr(197) . chr(130) => 'l', chr(197) . chr(131) => 'N',
      chr(197) . chr(132) => 'n', chr(197) . chr(133) => 'N',
      chr(197) . chr(134) => 'n', chr(197) . chr(135) => 'N',
      chr(197) . chr(136) => 'n', chr(197) . chr(137) => 'N',
      chr(197) . chr(138) => 'n', chr(197) . chr(139) => 'N',
      chr(197) . chr(140) => 'O', chr(197) . chr(141) => 'o',
      chr(197) . chr(142) => 'O', chr(197) . chr(143) => 'o',
      chr(197) . chr(144) => 'O', chr(197) . chr(145) => 'o',
      chr(197) . chr(146) => 'OE', chr(197) . chr(147) => 'oe',
      chr(197) . chr(148) => 'R', chr(197) . chr(149) => 'r',
      chr(197) . chr(150) => 'R', chr(197) . chr(151) => 'r',
      chr(197) . chr(152) => 'R', chr(197) . chr(153) => 'r',
      chr(197) . chr(154) => 'S', chr(197) . chr(155) => 's',
      chr(197) . chr(156) => 'S', chr(197) . chr(157) => 's',
      chr(197) . chr(158) => 'S', chr(197) . chr(159) => 's',
      chr(197) . chr(160) => 'S', chr(197) . chr(161) => 's',
      chr(197) . chr(162) => 'T', chr(197) . chr(163) => 't',
      chr(197) . chr(164) => 'T', chr(197) . chr(165) => 't',
      chr(197) . chr(166) => 'T', chr(197) . chr(167) => 't',
      chr(197) . chr(168) => 'U', chr(197) . chr(169) => 'u',
      chr(197) . chr(170) => 'U', chr(197) . chr(171) => 'u',
      chr(197) . chr(172) => 'U', chr(197) . chr(173) => 'u',
      chr(197) . chr(174) => 'U', chr(197) . chr(175) => 'u',
      chr(197) . chr(176) => 'U', chr(197) . chr(177) => 'u',
      chr(197) . chr(178) => 'U', chr(197) . chr(179) => 'u',
      chr(197) . chr(180) => 'W', chr(197) . chr(181) => 'w',
      chr(197) . chr(182) => 'Y', chr(197) . chr(183) => 'y',
      chr(197) . chr(184) => 'Y', chr(197) . chr(185) => 'Z',
      chr(197) . chr(186) => 'z', chr(197) . chr(187) => 'Z',
      chr(197) . chr(188) => 'z', chr(197) . chr(189) => 'Z',
      chr(197) . chr(190) => 'z', chr(197) . chr(191) => 's'
    );

    $string = strtr($string, $chars);

    $table = array(
      "А" => "a", "Б" => "b", "В" => "v", "Г" => "g", "Д" => "d",
      "Е" => "e", "Ё" => "yo", "Ж" => "zh", "З" => "z", "И" => "i",
      "Й" => "j", "К" => "k", "Л" => "l", "М" => "m", "Н" => "n",
      "О" => "o", "П" => "p", "Р" => "r", "С" => "s", "Т" => "t",
      "У" => "u", "Ф" => "f", "Х" => "kh", "Ц" => "ts", "Ч" => "ch",
      "Ш" => "sh", "Щ" => "sch", "Ъ" => "", "Ы" => "y", "Ь" => "",
      "Э" => "e", "Ю" => "yu", "Я" => "ya", "а" => "a", "б" => "b",
      "в" => "v", "г" => "g", "д" => "d", "е" => "e", "ё" => "yo",
      "ж" => "zh", "з" => "z", "и" => "i", "й" => "j", "к" => "k",
      "л" => "l", "м" => "m", "н" => "n", "о" => "o", "п" => "p",
      "р" => "r", "с" => "s", "т" => "t", "у" => "u", "ф" => "f",
      "х" => "kh", "ц" => "ts", "ч" => "ch", "ш" => "sh", "щ" => "sch",
      "ъ" => "", "ы" => "y", "ь" => "", "э" => "e", "ю" => "yu",
      "я" => "ya", " " => "-", "." => "", "," => "",
      ":" => "", ";" => "", "—" => "", "–" => "-"
    );

    $string = strtr($string, $table);

    return $string;
  }

  public static function delete_cache()
  {
    \S::delete_dir('../cache/');
    \S::delete_dir('../temp/');
    \S::delete_dir('temp/');
  }

  public static function delete_dir($dir)
  {
    if (is_file($dir))
      return @unlink($dir);

    else if (is_dir($dir))
    {
      $scan = glob(rtrim($dir, '/') . '/*');

      if (is_array($scan))
        foreach ($scan as $index => $path)
          self::delete_dir($path);

      if (is_dir($dir) && self::is_empty_dir($dir) and $dir != '../temp/')
        return @rmdir($dir);
    }
  }

  public static function is_empty_dir($dir)
  {
    return (($files = @scandir($dir)) && count($files) <= 2);
  }
  public static function email_check($email)
  {
    return filter_var($email, FILTER_VALIDATE_EMAIL);
  }
  public static function send_email($email, $subject, $text, $replay = '', $file = '')
  {
    global $settings;
    if (file_exists('libraries/phpmailer/class.phpmailer.php')) require_once 'libraries/phpmailer/class.phpmailer.php';
    if (file_exists('libraries/phpmailer/class.smtp.php')) require_once 'libraries/phpmailer/class.smtp.php';
    if (file_exists('../libraries/phpmailer/class.phpmailer.php')) require_once '../libraries/phpmailer/class.phpmailer.php';
    if (file_exists('../libraries/phpmailer/class.smtp.php')) require_once '../libraries/phpmailer/class.smtp.php';
    if ($email and $subject)
    {
      $mail = new PHPMailer();
      $mail->IsSMTP();
      $mail->SMTPAuth = true;
      $mail->Host = $settings['email_host'];
      $mail->Port = $settings['email_port'];
      $mail->Username = $settings['email_login'];
      $mail->Password = $settings['email_password'];
      $mail->CharSet = "UTF-8";
      $mail->SMTPOptions = array(
        'ssl' => array(
          'verify_peer' => false,
          'verify_peer_name' => false,
          'allow_self_signed' => true
        )
      );

      if (self::email_check($replay))
      {
        $mail->AddReplyTo($replay, $replay);
        $mail->SetFrom($settings['contact_email'], $settings['contact_email']);
      }
      else
      {
        $mail->AddReplyTo($settings['contact_email'], $settings['firm_name']);
        $mail->SetFrom($settings['contact_email'], $settings['firm_name']);
      }

      $mail->AddAddress($email, '');
      $mail->Subject = $subject;
      $mail->Body = $text;
      if (is_array($file))
      {
        foreach ($file as $file_tmp)
        {
          if (file_exists($file_tmp))
            $mail->AddAttachment($file_tmp);
        }
      }
      else
      {
        if (file_exists($file))
          $mail->AddAttachment($file);
      }
      $mail->IsHTML(true);
      return $mail->Send();
    }
    return false;
  }
}
