<?php 

/*
--------------------------
Класс для работы с файлами
--------------------------
*/
  
CLASS FILE{
  
  /*
  ---------------------------------------
  Загрузка файла
  ---------------------------------------
  */
  
  PUBLIC STATIC FUNCTION UPLOAD($path, $name = 'Выберите файл', $form = 1, $class = 'file-upload', $icon = 'upload') {
    
    GLOBAL $user;
    
    //$path - путь обращения к обработчику
    //$name - описание выгрузки
    //$form - использование собственной формы отправки
    //$class - стиль кнопки
    //$icon - иконка кнопки
    
    ?>
      
    <? IF ($form == 1){ ?>
    <form id="js-form" method="post" enctype="multipart/form-data">
    <? } ?>
      
    <label class='file-label'><span class="<?=$class?>"> 
    <input id="js-file" type="file" name="file" class="file-form" multiple>
    <span><i class="fa fa-<?=$icon?> fa-fw"></i> <?=TEXT_ABSOLUTE(LG($name))?></span>
    </span></label>
      
    <? IF ($form == 1){ ?>  
    </form>
    <? } ?>  
  
    <div id="result"></div>
    
    <script>
      
    $('#js-file').change(function() {
      
      $('#js-form').ajaxSubmit({
        
        xhr: function() {
          
          var xhr = new window.XMLHttpRequest();
          
          xhr.upload.addEventListener("progress", function(evt) {
            if (evt.lengthComputable) {
              var percentComplete = evt.loaded / evt.total;
              percentComplete = parseInt(percentComplete * 100);
              
              var data_progress = "<div class='file-upload-progress'><i class='fa fa-spinner fa-pulse fa-lg fa-fw'></i> <b>Загрузка...</b><br /><br /><div class='file-upload-progress-ind-o'><div class='file-upload-progress-ind' style='width:"+percentComplete+"%;'><span class='file-upload-progress-pr'>"+percentComplete+"%</span></div></div></div>";
              
              $('#result').html(data_progress);
              
              if (percentComplete === 100) {
                
                $('#result').html("<div class='file-upload-progress'><font color='#4BBB62'><i class='fa fa-check fa-lg fa-fw'></i> <b>Успешно загружено</b></font><br /><br /><div class='file-upload-progress-ind-o'><div class='file-upload-progress-ind-green' style='width:100%;'><span class='file-upload-progress-pr'>100%</span></div></div></div>");
              
              }
              
            }
          
          }, false);
          
          return xhr;
        
        },
        type: "POST",
        url: "<?=$path?>",
        target: "#result",
        success: function() {
          
          // После загрузки файла очистим форму
          $('#js-form')[0].reset();
        
        },
        
        error: function() {
          
          $('#result').html("<div class='file-upload-progress'><i class='fa fa-exclamation-triangle fa-fw'></i> Ошибка. Попробуйте ещё раз или проверьте подключение и интернету</div>");
        
        }
      
      });
    
    });
    
    </script>
      
    <?
    
  }
  
  /*
  -------------------------------------------
  Функция отдачи файла на просмотр/скачивание
  -------------------------------------------
  */
  
  PUBLIC STATIC FUNCTION DOWNLOAD($filename, $name, $mimetype='application/octet-stream'){
    
    IF (!FILE_EXISTS($filename)){ DIE('Файл не найден'); }
    
    @OB_END_CLEAN();
    
    $from = 0;
    $size = FILESIZE($filename);
    $to = $size;
    
    IF (ISSET($_SERVER['HTTP_RANGE'])){
      
      IF (PREG_MATCH('#bytes=-([0-9]*)#i', $_SERVER['HTTP_RANGE'], $range)){
        
        $from = $size-$range[1];
        $to = $size;
      
      }ELSEIF (PREG_MATCH('#bytes=([0-9]*)-#i', $_SERVER['HTTP_RANGE'], $range)){
        
        $from = $range[1];
        $to = $size;
      
      }ELSEIF (PREG_MATCH('#bytes=([0-9]*)-([0-9]*)#i', $_SERVER['HTTP_RANGE'], $range)){
        
        $from = $range[1];
        $to = $range[2];
      
      }
      
      HEADER('HTTP/1.1 206 Partial Content');
      
      $cr = 'Content-Range: bytes '.$from .'-'.$to.'/'.$size;
    
    }ELSE{
      
      HEADER('HTTP/1.1 200 Ok');
      
      $etag = MD5($filename);
      $etag = SUBSTR($etag, 0, 8) . '-' . SUBSTR($etag, 8, 7) . '-' . SUBSTR($etag, 15, 8);
      
      HEADER('ETag: "'.$etag.'"');
      HEADER('Accept-Ranges: bytes');
      HEADER('Content-Length: ' .($to-$from));
      IF (ISSET($cr)){ HEADER($cr); }
      HEADER('Connection: close');
      HEADER('Content-Type: ' . $mimetype);
      HEADER('Last-Modified: ' . GMDATE('r', FILEMTIME($filename)));
      HEADER("Last-Modified: ".GMDATE("D, d M Y H:i:s", FILEMTIME($filename))." GMT");
      HEADER("Expires: ".GMDATE("D, d M Y H:i:s", TIME() + 3600)." GMT");
      $f = FOPEN($filename, 'rb');
      
      IF (PREG_MATCH('#^image/#i', $mimetype)){
        
        HEADER('Content-Disposition: filename="'.$name.'";');
        
      }ELSE{
        
        HEADER('Content-Disposition: attachment; filename="'.$name.'";');
        
      }
      
      FSEEK($f, $from, SEEK_SET);
      
      $size = $to;
      $downloaded = 0;
      
      WHILE(!FEOF($f) && !CONNECTION_STATUS() && ($downloaded < $size)){
        
        $block = MIN(1024 * 8, $size - $downloaded);
        ECHO FREAD($f, $block);
        $downloaded += $block;
        FLUSH();
      
      }
      
      FCLOSE($f);
    
    }
    
  }
  
  /*
  ---------------------------------------------------
  Функция задающая соответствие mime типов расширению 
  ---------------------------------------------------
  */
  
  PUBLIC STATIC FUNCTION MIME($ras = NULL){
    
    IF ($ras == NULL){
      
      RETURN 'application/octet-stream';
    
    }ELSE{
      
      $htaccess = FILE(ROOT.'/.htaccess');
      
      FOR ($i = 0; $i < COUNT($htaccess); $i++){
        
        IF (PREG_MATCH('#^AddType#i', TRIM($htaccess[$i]))){
          
          $type = EXPLODE(' ', TRIM($htaccess[$i]));
          $rass = STR_REPLACE('.', NULL, $type[2]);
          $mime[$rass] = $type[1];
        
        }
      
      }
      
      IF (ISSET($mime[$ras])){
        
        RETURN $mime[$ras];
      
      }ELSE{
        
        RETURN 'application/octet-stream';
      
      }
    
    }
    
  }
  
  /*
  -------------------------------
  Функция стиля расширения файла
  Автоопределение
  -------------------------------
  */
  
  PUBLIC STATIC FUNCTION ICONS($ras = NULL, $data = 'big', $width = 55, $height = 55)
  {
    
    //$data - версия иконки которую отдавать. big или small
    //$ras - формат файла
    
    $span = "<span style='position: absolute; top: 54%; left: 0; right: 0; text-align: center; transform: translateY(-50%); color: white;'>";
    
    IF ($ras == 'mp4'){
      
      IF ($data == 'big'){
        
        $file = "<div style='display: inline-block; position: relative; background-color: #3EA9FF; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-film fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
      
      }ELSEIF ($data == 'small'){
        
        $file = "<i class='fa fa-film fa-fw' style='color: #3EA9FF;'></i>";
      
      }
    
    }ELSEIF ($ras == 'mp3'){
      
      IF ($data == 'big'){
        
        $file = "<div style='display: inline-block; position: relative; background-color: #FF8279; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-music fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
      
      }ELSEIF ($data == 'small'){
        
        $file = "<i class='fa fa-music fa-fw' style='color: #FF8279;'></i>";
      
      }
    
    }ELSEIF ($ras == 'png'){
      
      IF ($data == 'big'){
        
        $file = "<div style='display: inline-block; position: relative; background-color: #87AFCF; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-image fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
      
      }ELSEIF ($data == 'small'){
        
        $file = "<i class='fa fa-image fa-fw' style='color: #87AFCF;'></i>";
      
      }
    
    }ELSEIF ($ras == 'gif'){
      
      IF ($data == 'big'){
        
        $file = "<div style='display: inline-block; position: relative; background-color: #D38CCD; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-image fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
      
      }ELSEIF ($data == 'small'){
        
        $file = "<i class='fa fa-image fa-fw' style='color: #D38CCD;'></i>";
      
      }
    
    }ELSEIF ($ras == 'jpg'){
      
      IF ($data == 'big'){
        
        $file = "<div style='display: inline-block; position: relative; background-color: #70C773; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-image fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
      
      }ELSEIF ($data == 'small'){
        
        $file = "<i class='fa fa-image fa-fw' style='color: #70C773;'></i>";
      
      }
    
    }ELSEIF ($ras == 'jpeg'){
      
      IF ($data == 'big'){
        
        $file = "<div style='display: inline-block; position: relative; background-color: #70C773; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-image fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
      
      }ELSEIF ($data == 'small'){
        
        $file = "<i class='fa fa-image fa-fw' style='color: #70C773;'></i>";
      
      }
    
    }ELSEIF ($ras == 'zip'){
      
      IF ($data == 'big'){
        
        $file = "<div style='display: inline-block; position: relative; background-color: #F08F00; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-file-archive-o fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
      
      }ELSEIF ($data == 'small'){
        
        $file = "<i class='fa fa-file-archive-o fa-fw' style='color: #F08F00;'></i>";
      
      }
    
    }ELSEIF ($ras == 'code'){
      
      IF ($data == 'big'){
        
        $file = "<div style='display: inline-block; position: relative; background-color: #316FB6; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-code fa-lg fa-fw'></i><br /><small><b>ACMS</b></small></span></div>";
      
      }ELSEIF ($data == 'small'){
        
        $file = "<i class='fa fa-code fa-fw' style='color: #316FB6;'></i>";
      
      }
    
    }ELSEIF ($ras == 'themes'){
      
      IF ($data == 'big'){
        
        $file = "<div style='display: inline-block; position: relative; background-color: #009DAC; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-object-group fa-lg fa-fw'></i><br /><small><b>".$ras."</b></small></span></div>";
      
      }ELSEIF ($data == 'small'){
        
        $file = "<i class='fa fa-object-group fa-fw' style='color: #009DAC;'></i>";
      
      }  
    
    }ELSE{
      
      IF ($data == 'big'){
        
        $file = "<div style='display: inline-block; position: relative; background-color: #D8C200; width: ".$width."px; height: ".$height."px;'>".$span."<i class='fa fa-file fa-lg fa-fw'></i><br /><small><b>file</b></small></span></div>";
      
      }ELSEIF ($data == 'small'){
        
        $file = "<i class='fa fa-file fa-fw' style='color: #D8C200;'></i>";
      
      }
    
    }
    
    RETURN $file;
  
  }

}
  
?>