<?
if (!defined('KERNEL_PATH')) exit('Fatal error: incorrect call.');
 
require_once(KERNEL_PATH."Model.php");
require_once(KERNEL_PATH."FileControl.php");
 
//FileManager Output Module View
class FileManagerModel extends Model{
 
        var $noscan = array('.', '..');
 
        function FileManagerModel($varcon) {
                $this->varcon=$varcon;
        }
 
        function Init() {
                parent::InitPointers();
                return true;
        }
 
        function getParentFolderId($folder_id) {
                $pref = $this->getPrefix();
                $cnt = $this->getRow($this->query('select parent_id from '.$pref.'filemanager_folders where id='.$folder_id));
                return $cnt['parent_id'];
        }
 
        function isUserHasFolder($folder_id) {
                $pref = $this->getPrefix();
                $cnt = $this->getRow($this->query('select count(*) as cnt from '.$pref.'filemanager_folders where id='.$folder_id));
                return $cnt['cnt'];
        }
 
        function getUserFiles($user_id, $folder_id=-1, $with_folders=false) {
                $pref = $this->getPrefix();
                $rows = array();
 
                $query = $this->query('select id, title, filename, filepath, filetype, size from '.$pref.'filemanager_files where user_id='.$user_id.' and folder_id='.$folder_id.' order by order_pos');
                while($row = $this->getRow($query)) {
                        if($row['size'] > (1 << 20)) { //MBs
                                $row['size_str'] = round($row['size'] / (1 << 20), 2).' Мб';
                        } elseif($row['size'] > (1 << 10)) { //KBs
                                $row['size_str'] = round($row['size'] / (1 << 10), 2).' Кб';
                        } else { //Bytes
                                $row['size_str'] = $row['size'].' байт';
                        }
                        $row['ico'] = $this->getFileIco($row['filetype']);
 
                        $rows[$row['id']] = $row;
                }
 
                return $rows;
        }
 
        function getUserDirectories($user_id) {
                $pref = $this->getPrefix();
 
                $rows = $this->getRows($this->query('select id, parent_id, title, directory, filecount from '.$pref.'filemanager_folders where user_id='.$user_id.' order by order_pos'));
                $rows = $this->sortDirs($rows);
 
                return $rows;
        }
 
        //Unlike comments, dirs tree starts from parent -1
        function sortDirs($dirs, $id=-1, $level=0) {
                $res = array();
                foreach($dirs as $k=>$v) {
                        if($v['parent_id'] == $id) {
                                unset($dirs[$k]);
                                $v['level'] = $level;
                                $v['subdirs'] = 0;
                                $res[$v['id']] = $v;
                                $arr = $this->sortDirs($dirs, $v['id'], $level+1);
                                if(count($arr)) {
                                        foreach($arr as $v2) {
                                                $res[$v2['id']]=$v2;
                                                $res[$v['id']]['subdirs']++;
                                        }
                                }
                        }
                }
                return $res;
        }
 
        //Not for regular use
        function updateFileManager($user_id, $path='') {
                if(!$path) $path = $this->getUserPath($user_id);
                $basepath = '/uploads/users/';
 
                $result = $this->fullScanDir('.'.$basepath.$path);
                $this->storeFileManager($result, $user_id, $basepath.$path);
 
                $set = array('order_pos'=>array('id'));
                $where = array('user_id'=>$user_id);
                $this->simpleUpdate($set, $where, 'filemanager_folders');
                $this->simpleUpdate($set, $where, 'filemanager_files');
        }
 
        //$path if without '.' at beginning
        function storeFileManager($tree, $user_id, $path, $folder_id=-1, $innerpath='') {
                $pref = $this->getPrefix();
 
                foreach(array_keys($tree) as $k) {
                        if(is_array($tree[$k])) {
                                $folder = array(
                                                'user_id'=>$user_id,
                                                'parent_id'=>$folder_id,
                                                'title'=>$k,
                                                'directory'=>$innerpath.'/'.$k,
                                                'date_time'=>$this->timeNow(),
                                                );
                                $id = $this->simpleInsert($folder, 'filemanager_folders');
                                $this->storeFileManager($tree[$k], $user_id, $path, $id, $innerpath.'/'.$k);
                        } elseif ($tree[$k] === true) {
                                $stat = stat('.'.$path.$innerpath.'/'.$k);
                                $file = array(
                                              'title'=>$k,
                                              'user_id'=>$user_id,
                                              'folder_id'=>$folder_id,
                                              'filename'=>$k,
                                              'filepath'=>$innerpath,
                                              'filetype'=>$this->getFiletype($k),
                                              'size'=>$stat[7],
                                              'date_time'=>$this->timeNow(),
                                              );
                                $id = $this->simpleInsert($file, 'filemanager_files');                          
                        }
                }
                return true;
        }
 
        function fullScanDir($path) {
                $dir = dir($path);
                if(!$dir->handle) return 'No handle';
                $result = array();
 
                while(($item = readdir($dir->handle)) !== false) {
                        if(in_array($item, $this->noscan)) continue;
                        if(is_dir($basepath.$path.'/'.$item)) {
                                $result[$item] = $this->fullScanDir($path.'/'.$item);
                        } else {
                                $result[$item] = true;
                        }
                }
                return $result;
        }
 
        function getFileDesc($filetype) {
                switch($filetype) {
                        case 'image': return 'графика';
                        case 'text': return 'документ';
                }
                return 'файл';
        }
 
        function getFileIco($filetype) {
                switch($filetype) {
                        case 'image':
                        case 'text': return 'txt.png';
                }
                return 'txt.png';
        }
 
        function getFiletype($filename) {
                $arr = explode('.', $filename);
                $ext = array_pop($arr);
                switch($ext) {
                        //Text
                        case 'txt': case 'rtf': case'doc': case'docx':
                                return 'text';
 
                        //Graphics
                        case 'jpg': case 'png': case 'gif': case 'bmp': case 'jpeg':
                                return 'image';
                }
                return 'file';
        }
}
 
?>