diff --git a/.gitignore b/.gitignore
index c6271318..0796bb9b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,6 @@
 /nbproject/private/
 nbproject/
 node_modules/
+.idea/
+
+/fackpath/*
diff --git a/bridges/php-local/LocalBridge/FileManagerApi.php b/bridges/php-local/LocalBridge/FileManagerApi.php
index af893ba7..6fdc8d50 100644
--- a/bridges/php-local/LocalBridge/FileManagerApi.php
+++ b/bridges/php-local/LocalBridge/FileManagerApi.php
@@ -5,483 +5,516 @@
  * File Manager API Class
  *
  * Made for PHP Local filesystem bridge for angular-filemanager to handle file manipulations
- * @author       Jakub Ďuraš <jakub@duras.me> 
+ * @author       Jakub Ďuraš <jakub@duras.me>
  */
 class FileManagerApi
 {
-    private $basePath = null;
+  private $basePath = null;
 
-    private $translate;
+  private $translate;
 
-    public function __construct($basePath = null, $lang = 'en', $muteErrors = true)
-    {
-        if ($muteErrors) {
-            ini_set('display_errors', 0);
-        }
+  public function __construct($basePath = null, $lang = 'en', $muteErrors = true) {
+    if ($muteErrors) {
+      ini_set('display_errors', 0);
+    }
+
+    $this->basePath = $basePath ?: dirname(__DIR__);
+    $this->translate = new Translate($lang);
+  }
+
+  public function postHandler($query, $request, $files) {
+    $t = $this->translate;
+
+    // Probably file upload
+    if (!isset($request['action']) && (isset($_SERVER["CONTENT_TYPE"]) && strpos($_SERVER["CONTENT_TYPE"], 'multipart/form-data') !== false)) {
+      $uploaded = $this->uploadAction($request['destination'], $files);
+      if ($uploaded === true) {
+        $response = $this->simpleSuccessResponse();
+      } else {
+        $response = $this->simpleErrorResponse($t->upload_failed);
+      }
 
-        $this->basePath = $basePath ?: dirname(__DIR__);
-        $this->translate = new Translate($lang);
+      return $response;
     }
 
-    public function postHandler($query, $request, $files)
-    {
-        $t = $this->translate;
-        
-        // Probably file upload
-        if (!isset($request['action']) && (isset($_SERVER["CONTENT_TYPE"]) && strpos($_SERVER["CONTENT_TYPE"], 'multipart/form-data') !== false)) {
-            $uploaded = $this->uploadAction($request['destination'], $files);
-            if ($uploaded === true) {
-                $response = $this->simpleSuccessResponse();
-            } else {
-                $response = $this->simpleErrorResponse($t->upload_failed);
-            }
-
-            return $response;
+    switch ($request['action']) {
+      case 'list':
+        $list = $this->listAction($request['path']);
+
+        if (!is_array($list)) {
+          $response = $this->simpleErrorResponse($t->listing_filed);
+        } else {
+          $response = new Response();
+          $response->setData([
+            'result' => $list
+          ]);
+        }
+        break;
+
+      case 'rename':
+        $renamed = $this->renameAction($request['item'], $request['newItemPath']);
+        if ($renamed === true) {
+          $response = $this->simpleSuccessResponse();
+        } elseif ($renamed === 'notfound') {
+          $response = $this->simpleErrorResponse($t->file_not_found);
+        } else {
+          $response = $this->simpleErrorResponse($t->renaming_failed);
         }
+        break;
 
-        switch ($request['action']) {
-            case 'list':
-                $list = $this->listAction($request['path']);
-
-                if (!is_array($list)) {
-                    $response = $this->simpleErrorResponse($t->listing_filed);
-                } else {
-                    $response = new Response();
-                    $response->setData([
-                        'result' => $list
-                    ]);
-                }
-                break;
-
-            case 'rename':
-                $renamed = $this->renameAction($request['item'], $request['newItemPath']);
-                if ($renamed === true) {
-                    $response = $this->simpleSuccessResponse();
-                } elseif ($renamed === 'notfound'){
-                    $response = $this->simpleErrorResponse($t->file_not_found);
-                } else {
-                    $response = $this->simpleErrorResponse($t->renaming_failed);
-                }
-                break;
-
-            case 'move':
-                $moved = $this->moveAction($request['items'], $request['newPath']);
-                if ($moved === true) {
-                    $response = $this->simpleSuccessResponse();
-                } else {
-                    $response = $this->simpleErrorResponse($t->moving_failed);
-                }
-                break;
-
-            case 'copy':
-                $copied = $this->copyAction($request['items'], $request['newPath']);
-                if ($copied === true) {
-                    $response = $this->simpleSuccessResponse();
-                } else {
-                    $response = $this->simpleErrorResponse($t->copying_failed);
-                }
-                break;
-
-            case 'remove':
-                $removed = $this->removeAction($request['items']);
-                if ($removed === true) {
-                    $response = $this->simpleSuccessResponse();
-                } elseif ($removed === 'notempty') {
-                    $response = $this->simpleErrorResponse($t->removing_failed_directory_not_empty);
-                } else {
-                    $response = $this->simpleErrorResponse($t->removing_failed);
-                }
-                break;
-
-            case 'edit':
-                $edited = $this->editAction($request['item'], $request['content']);
-                if ($edited !== false) {
-                    $response = $this->simpleSuccessResponse();
-                } else {
-                    $response = $this->simpleErrorResponse($t->saving_failed);
-                }
-                break;
-
-            case 'getContent':
-                $content = $this->getContentAction($request['item']);
-                if ($content !== false) {
-                    $response = new Response();
-                    $response->setData([
-                        'result' => $content
-                    ]);
-                } else {
-                    $response = $this->simpleErrorResponse($t->file_not_found);
-                }
-                break;
-
-            case 'createFolder':
-                $created = $this->createFolderAction($request['newPath']);
-                if ($created === true) {
-                    $response = $this->simpleSuccessResponse();
-                } elseif ($created === 'exists') {
-                    $response = $this->simpleErrorResponse($t->folder_already_exists);
-                } else {
-                    $response = $this->simpleErrorResponse($t->folder_creation_failed);
-                }
-                break;
-
-            case 'changePermissions':
-                $changed = $this->changePermissionsAction($request['items'], $request['perms'], $request['recursive']);
-                if ($changed === true) {
-                    $response = $this->simpleSuccessResponse();
-                } elseif ($changed === 'missing') {
-                    $response = $this->simpleErrorResponse($t->file_not_found);
-                } else {
-                    $response = $this->simpleErrorResponse($t->permissions_change_failed);
-                }
-                break;
-
-            case 'compress':
-                $compressed = $this->compressAction($request['items'], $request['destination'], $request['compressedFilename']);
-                if ($compressed === true) {
-                    $response = $this->simpleSuccessResponse();
-                } else {
-                    $response = $this->simpleErrorResponse($t->compression_failed);
-                }
-                break;
-
-            case 'extract':
-                $extracted = $this->extractAction($request['destination'], $request['item'], $request['folderName']);
-                if ($extracted === true) {
-                    $response = $this->simpleSuccessResponse();
-                } elseif ($extracted === 'unsupported') {
-                    $response = $this->simpleErrorResponse($t->archive_opening_failed);
-                } else {
-                    $response = $this->simpleErrorResponse($t->extraction_failed);
-                }
-                break;
-            
-            default:
-                $response = $this->simpleErrorResponse($t->function_not_implemented);
-                break;
+      case 'move':
+        $moved = $this->moveAction($request['items'], $request['newPath']);
+        if ($moved === true) {
+          $response = $this->simpleSuccessResponse();
+        } else {
+          $response = $this->simpleErrorResponse($t->moving_failed);
         }
+        break;
 
-        return $response;
-    }
+      case 'copy':
+        $copied = $this->copyAction($request['items'], $request['newPath']);
+        if ($copied === true) {
+          $response = $this->simpleSuccessResponse();
+        } else {
+          $response = $this->simpleErrorResponse($t->copying_failed);
+        }
+        break;
+
+      case 'remove':
+        $removed = $this->removeAction($request['items']);
+        if ($removed === true) {
+          $response = $this->simpleSuccessResponse();
+        } elseif ($removed === 'notempty') {
+          $response = $this->simpleErrorResponse($t->removing_failed_directory_not_empty);
+        } else {
+          $response = $this->simpleErrorResponse($t->removing_failed);
+        }
+        break;
 
-    public function getHandler($queries)
-    {
-        $t = $this->translate;
-        
-        switch ($queries['action']) {
-            case 'download':
-                $downloaded = $this->downloadAction($queries['path']);
-                if ($downloaded === true) {
-                    exit;
-                } else {
-                    $response = $this->simpleErrorResponse($t->file_not_found);
-                }
-                
-                break;
-            
-            default:
-                $response = $this->simpleErrorResponse($t->function_not_implemented);
-                break;
+      case 'edit':
+        $edited = $this->editAction($request['item'], $request['content']);
+        if ($edited !== false) {
+          $response = $this->simpleSuccessResponse();
+        } else {
+          $response = $this->simpleErrorResponse($t->saving_failed);
         }
+        break;
+
+      case 'getContent':
+        $content = $this->getContentAction($request['item']);
+        if ($content !== false) {
+          $response = new Response();
+          $response->setData([
+            'result' => $content
+          ]);
+        } else {
+          $response = $this->simpleErrorResponse($t->file_not_found);
+        }
+        break;
+
+      case 'createFolder':
+        $created = $this->createFolderAction($request['newPath']);
+        if ($created === true) {
+          $response = $this->simpleSuccessResponse();
+        } elseif ($created === 'exists') {
+          $response = $this->simpleErrorResponse($t->folder_already_exists);
+        } else {
+          $response = $this->simpleErrorResponse($t->folder_creation_failed);
+        }
+        break;
+
+      case 'changePermissions':
+        $changed = $this->changePermissionsAction($request['items'], $request['perms'], $request['recursive']);
+        if ($changed === true) {
+          $response = $this->simpleSuccessResponse();
+        } elseif ($changed === 'missing') {
+          $response = $this->simpleErrorResponse($t->file_not_found);
+        } else {
+          $response = $this->simpleErrorResponse($t->permissions_change_failed);
+        }
+        break;
+
+      case 'compress':
+        $compressed = $this->compressAction($request['items'], $request['destination'], $request['compressedFilename']);
+        if ($compressed === true) {
+          $response = $this->simpleSuccessResponse();
+        } else {
+          $response = $this->simpleErrorResponse($t->compression_failed);
+        }
+        break;
+
+      case 'extract':
+        $extracted = $this->extractAction($request['destination'], $request['item'], $request['folderName']);
+        if ($extracted === true) {
+          $response = $this->simpleSuccessResponse();
+        } elseif ($extracted === 'unsupported') {
+          $response = $this->simpleErrorResponse($t->archive_opening_failed);
+        } else {
+          $response = $this->simpleErrorResponse($t->extraction_failed);
+        }
+        break;
 
-        return $response;
+      default:
+        $response = $this->simpleErrorResponse($t->function_not_implemented);
+        break;
     }
 
-    private function downloadAction($path)
-    {
-        $file_name = basename($path);
-        $path = $this->basePath . $path;
+    return $response;
+  }
 
-        if (! file_exists($path)) {
-            return false;
+  public function getHandler($queries) {
+    $t = $this->translate;
+
+    switch ($queries['action']) {
+      case 'download':
+        $downloaded = $this->downloadAction($queries['path']);
+        if ($downloaded === true) {
+          exit;
+        } else {
+          $response = $this->simpleErrorResponse($t->file_not_found);
         }
 
-        $finfo = finfo_open(FILEINFO_MIME_TYPE);
-        $mime_type = finfo_file($finfo, $path);
-        finfo_close($finfo);
+        break;
 
-        if (ob_get_level()) ob_end_clean();
+      default:
+        $response = $this->simpleErrorResponse($t->function_not_implemented);
+        break;
+    }
 
-        header("Content-Disposition: attachment; filename=\"$file_name\"");
-        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
-        header("Content-Type: $mime_type");
-        header('Pragma: public');
-        header('Content-Length: ' . filesize($path));
-        readfile($path);
+    return $response;
+  }
 
-        return true;
-    }
+  private function downloadAction($path) {
+    $file_name = sbasename($path);
+    $path = $this->basePath . iconv('UTF-8', SYSTEM_coding, $path);
 
-    private function uploadAction($path, $files)
-    {
-        $path = $this->basePath . $path;
-
-        foreach ($_FILES as $file) {
-            $uploaded = move_uploaded_file(
-                $file['tmp_name'], 
-                rtrim($path, '/') . '/' . $file['name']
-            );
-            if ($uploaded === false) {
-                return false;
-            }
-        }
+    if (!file_exists($path)) {
+      return false;
+    }
 
-        return true;
-    }    
-
-    private function listAction($path)
-    {
-        $files = glob($this->basePath . rtrim($path, '/') . '/*');
-
-        $files = array_map(function($file){
-            $date = new \DateTime('@' . filemtime($file));
-            return [
-                'name' => utf8_encode(basename($file)),
-                'rights' => $this->parsePerms(fileperms($file)),
-                'size' => filesize($file),
-                'date' => $date->format('Y-m-d H:i:s'),
-                'type' => is_dir($file) ? 'dir' : 'file'
-            ];
-        }, $files);
-
-        return $files;
+    $finfo = finfo_open(FILEINFO_MIME_TYPE);
+    $mime_type = finfo_file($finfo, $path);
+    finfo_close($finfo);
+
+    if (ob_get_level()) ob_end_clean();
+
+    header("Content-Disposition: attachment; filename=\"$file_name\"");
+    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
+    header("Content-Type: $mime_type");
+    header('Pragma: public');
+    header('Content-Length: ' . getFilesize($path));
+    readfile($path);
+
+    return true;
+  }
+
+  private function uploadAction($path, $files) {
+    $path = $this->basePath . iconv('UTF-8', SYSTEM_coding, $path);
+
+    foreach ($_FILES as $file) {
+      $uploaded = move_uploaded_file(
+        $file['tmp_name'],
+        rtrim($path, '/') . '/' . $file['name']
+      );
+      if ($uploaded === false) {
+        return false;
+      }
     }
 
-    private function renameAction($oldPath, $newPath)
-    {
-        $oldPath = $this->basePath . $oldPath;
-        $newPath = $this->basePath . $newPath;
+    return true;
+  }
 
-        if (! file_exists($oldPath)) {
-            return 'notfound';
-        }
+  private function listAction($path) {
+    $files = [];
+    $filesDir = [];
 
-        return rename($oldPath, $newPath);
+    $path = iconv('UTF-8', SYSTEM_coding, $path);
+    $current_path = $this->basePath . rtrim($path, '/');
+
+    if (!$handle = @opendir($current_path)) {
+      return 'cannotopen';
+    } else {
+      while (false !== ($file = readdir($handle))) {
+        if ($file != "." && $file != "..") {
+          $filesDir[] = $file;
+        }
+      }
+      closedir($handle);
+      unset($file, $handle);
+
+      // By default
+      // Sorting files by name ('default' or 'NAME_DESC' cases from $this->config['options']['fileSorting']
+      natcasesort($filesDir);
+
+      foreach ($filesDir as $file) {
+        $files[] = [
+          'name' => iconv(mb_detect_encoding($file, array('ASCII', 'UTF-8', 'GB2312', 'GBK', 'BIG5')), 'UTF-8', $file),
+          'type' => is_dir($current_path . DIRECTORY_SEPARATOR . $file) ? 'dir' : 'file',
+          'rights' => $this->parsePerms(fileperms($current_path . DIRECTORY_SEPARATOR . $file)),
+          'size' => getFilesize($current_path . DIRECTORY_SEPARATOR . $file),
+          'date' => date('Y-m-d H:i:s', filemtime($current_path . DIRECTORY_SEPARATOR . $file))
+        ];
+      }
+      unset($file);
     }
 
-    private function moveAction($oldPaths, $newPath)
-    {
-        $newPath = $this->basePath . rtrim($newPath, '/') . '/';
+    $files = $this->sortFiles($files);
 
-        foreach ($oldPaths as $oldPath) {
-            if (! file_exists($this->basePath . $oldPath)) {
-                return false;
-            }
+    return $files;
+  }
 
-            $renamed = rename($this->basePath . $oldPath, $newPath . basename($oldPath));
-            if ($renamed === false) {
-                return false;
-            }
-        }
+  private function renameAction($oldPath, $newPath) {
+    $oldPath = $this->basePath . iconv('UTF-8', SYSTEM_coding, $oldPath);
+    $newPath = $this->basePath . iconv('UTF-8', SYSTEM_coding, $newPath);
 
-        return true;
+    if (!file_exists($oldPath)) {
+      return 'notfound';
     }
 
-    private function copyAction($oldPaths, $newPath)
-    {
-        $newPath = $this->basePath . rtrim($newPath, '/') . '/';
-
-        foreach ($oldPaths as $oldPath) {
-            if (! file_exists($this->basePath . $oldPath)) {
-                return false;
-            }
-
-            $copied = copy(
-                $this->basePath . $oldPath, 
-                $newPath . basename($oldPath)
-            );
-            if ($copied === false) {
-                return false; 
-            }
-        }
+    return rename($oldPath, $newPath);
+  }
 
-        return true;
-    }
+  private function moveAction($oldPaths, $newPath) {
+    $newPath = $this->basePath . iconv('UTF-8', SYSTEM_coding, $newPath) . '/';
 
-    private function removeAction($paths)
-    {
-        foreach ($paths as $path) {
-            $path = $this->basePath . $path;
-
-            if (is_dir($path)) {
-                $dirEmpty = (new \FilesystemIterator($path))->valid();
-
-                if ($dirEmpty) {
-                    return 'notempty';
-                } else {
-                    $removed = rmdir($path);
-                }
-            } else {
-                $removed = unlink($path);
-            }
-
-            if ($removed === false) {
-                return false;
-            }
-        }
+    foreach ($oldPaths as $oldPath) {
+      $oldPath = iconv('UTF-8', SYSTEM_coding, $oldPath);
+      if (!file_exists($this->basePath . $oldPath)) {
+        return false;
+      }
 
-        return true;
+      $renamed = rename($this->basePath . $oldPath, $newPath . sbasename($oldPath));
+      if ($renamed === false) {
+        return false;
+      }
     }
 
-    private function editAction($path, $content)
-    {
-        $path = $this->basePath . $path;
-        return file_put_contents($path, $content);
+    return true;
+  }
+
+  private function copyAction($oldPaths, $newPath) {
+    $newPath = $this->basePath . iconv('UTF-8', SYSTEM_coding, $newPath) . '/';
+
+    foreach ($oldPaths as $oldPath) {
+      $oldPath = iconv('UTF-8', SYSTEM_coding, $oldPath);
+      if (!file_exists($this->basePath . $oldPath)) {
+        return false;
+      }
+
+      $copied = copy(
+        $this->basePath . $oldPath,
+        $newPath . sbasename($oldPath)
+      );
+      if ($copied === false) {
+        return false;
+      }
     }
 
-    private function getContentAction($path)
-    {
-        $path = $this->basePath . $path;
+    return true;
+  }
 
-        if (! file_exists($path)) {
-            return false;
+  private function removeAction($paths) {
+    foreach ($paths as $path) {
+      $path = $this->basePath . iconv('UTF-8', SYSTEM_coding, $path);
+
+      if (is_dir($path)) {
+        $dirEmpty = (new \FilesystemIterator($path))->valid();
+
+        if ($dirEmpty) {
+          return 'notempty';
+        } else {
+          $removed = rmdir($path);
         }
+      } else {
+        $removed = unlink($path);
+      }
 
-        return file_get_contents($path);
+      if ($removed === false) {
+        return false;
+      }
     }
 
-    private function createFolderAction($path)
-    {
-        $path = $this->basePath . $path;
+    return true;
+  }
 
-        if (file_exists($path) && is_dir($path)) {
-            return 'exists';
-        }
+  private function editAction($path, $content) {
+    $path = $this->basePath . iconv('UTF-8', SYSTEM_coding, $path);
+    return file_put_contents($path, $content);
+  }
 
-        return mkdir($path);
-    }
+  private function getContentAction($path) {
+    $path = $this->basePath . iconv('UTF-8', SYSTEM_coding, $path);
 
-    private function changePermissionsAction($paths, $permissions, $recursive)
-    {
-        foreach ($paths as $path) {
-            if (!file_exists($this->basePath . $path)) return 'missing';
-
-            if (is_dir($path) && $recursive === true) {
-                $iterator = new RecursiveIteratorIterator(
-                    new RecursiveDirectoryIterator($path), 
-                    RecursiveIteratorIterator::SELF_FIRST
-                );
-
-                foreach($iterator as $item) {
-                    $changed = chmod($this->basePath . $item, octdec($permissions));
-                    
-                    if ($changed === false) {
-                        return false;
-                    }
-                }
-            }
-
-            return chmod($this->basePath . $path, octdec($permissions));
-        }
+    if (!file_exists($path)) {
+      return false;
     }
 
-    private function compressAction($paths, $destination, $archiveName)
-    {
-        $archivePath = $this->basePath . $destination . $archiveName;
+    $content = file_get_contents($path);
+    $content = iconv(mb_detect_encoding(urldecode($content), array('ASCII', 'UTF-8', 'GB2312', 'GBK', 'BIG5')), 'UTF-8', urldecode($content));
 
-        $zip = new ZipArchive();
-        if ($zip->open($archivePath, ZipArchive::CREATE) !== true) {
-            return false;
-        }
+    return $content;
+  }
 
-        foreach ($paths as $path) {
-            $zip->addFile($this->basePath . $path, basename($path));
-        }
+  private function createFolderAction($path) {
+    $path = $this->basePath . iconv('UTF-8', SYSTEM_coding, $path);
 
-        return $zip->close();
+    if (file_exists($path) && is_dir($path)) {
+      return 'exists';
     }
 
-    private function extractAction($destination, $archivePath, $folderName)
-    {
-        $archivePath = $this->basePath . $archivePath;
-        $folderPath = $this->basePath . rtrim($destination, '/') . '/' . $folderName;
+    return mkdir($path);
+  }
+
+  private function changePermissionsAction($paths, $permissions, $recursive) {
+    foreach ($paths as $path) {
+      $path = iconv('UTF-8', SYSTEM_coding, $path);
+      if (!file_exists($this->basePath . $path)) return 'missing';
+
+      if (is_dir($path) && $recursive === true) {
+        $iterator = new RecursiveIteratorIterator(
+          new RecursiveDirectoryIterator($path),
+          RecursiveIteratorIterator::SELF_FIRST
+        );
 
-        $zip = new ZipArchive;
-        if ($zip->open($archivePath) === false) {
-            return 'unsupported';
+        foreach ($iterator as $item) {
+          $item = iconv('UTF-8', SYSTEM_coding, $item);
+          $changed = chmod($this->basePath . $item, octdec($permissions));
+
+          if ($changed === false) {
+            return false;
+          }
         }
+      }
 
-        mkdir($folderPath);
-        $zip->extractTo($folderPath);
-        return $zip->close();
+      return chmod($this->basePath . $path, octdec($permissions));
     }
+  }
 
-    private function simpleSuccessResponse()
-    {
-        $response = new Response();
-        $response->setData([
-            'result' => [
-                'success' => true
-            ]
-        ]);
+  private function compressAction($paths, $destination, $archiveName) {
+    return 'pass';
+    $destination = iconv('UTF-8', SYSTEM_coding, $destination);
+    $archiveName = iconv('UTF-8', SYSTEM_coding, $archiveName);
+    $archivePath = $this->basePath . $destination . $archiveName;
 
-        return $response;
+    $zip = new ZipArchive();
+    if ($zip->open($archivePath, ZipArchive::CREATE) !== true) {
+      return false;
     }
 
-    private function simpleErrorResponse($message)
-    {
-        $response = new Response();
-        $response
-            ->setStatus(500, 'Internal Server Error')
-             ->setData([
-                  'result' => [
-                    'success' => false,
-                    'error' => $message
-                 ]
-            ]);
-
-        return $response;
+    foreach ($paths as $path) {
+      $path = iconv('UTF-8', SYSTEM_coding, $path);
+      $zip->addFile($this->basePath . $path, basename($path));
     }
 
-    private function parsePerms($perms)
-    {
-        if (($perms & 0xC000) == 0xC000) {
-            // Socket
-            $info = 's';
-        } elseif (($perms & 0xA000) == 0xA000) {
-            // Symbolic Link
-            $info = 'l';
-        } elseif (($perms & 0x8000) == 0x8000) {
-            // Regular
-            $info = '-';
-        } elseif (($perms & 0x6000) == 0x6000) {
-            // Block special
-            $info = 'b';
-        } elseif (($perms & 0x4000) == 0x4000) {
-            // Directory
-            $info = 'd';
-        } elseif (($perms & 0x2000) == 0x2000) {
-            // Character special
-            $info = 'c';
-        } elseif (($perms & 0x1000) == 0x1000) {
-            // FIFO pipe
-            $info = 'p';
-        } else {
-            // Unknown
-            $info = 'u';
-        }
+    return $zip->close();
+  }
 
-        // Owner
-        $info .= (($perms & 0x0100) ? 'r' : '-');
-        $info .= (($perms & 0x0080) ? 'w' : '-');
-        $info .= (($perms & 0x0040) ?
-                    (($perms & 0x0800) ? 's' : 'x' ) :
-                    (($perms & 0x0800) ? 'S' : '-'));
-
-        // Group
-        $info .= (($perms & 0x0020) ? 'r' : '-');
-        $info .= (($perms & 0x0010) ? 'w' : '-');
-        $info .= (($perms & 0x0008) ?
-                    (($perms & 0x0400) ? 's' : 'x' ) :
-                    (($perms & 0x0400) ? 'S' : '-'));
-
-        // World
-        $info .= (($perms & 0x0004) ? 'r' : '-');
-        $info .= (($perms & 0x0002) ? 'w' : '-');
-        $info .= (($perms & 0x0001) ?
-                    (($perms & 0x0200) ? 't' : 'x' ) :
-                    (($perms & 0x0200) ? 'T' : '-'));
-
-        return $info;
+  private function extractAction($destination, $archivePath, $folderName) {
+    return 'pass';
+    $archivePath = $this->basePath . iconv('UTF-8', SYSTEM_coding, $archivePath);
+    $folderPath = $this->basePath . rtrim(iconv('UTF-8', SYSTEM_coding, $destination), '/') . '/' . $folderName;
+
+    $zip = new ZipArchive;
+    if ($zip->open($archivePath) === false) {
+      return 'unsupported';
+    }
+
+    mkdir($folderPath);
+    $zip->extractTo($folderPath);
+    return $zip->close();
+  }
+
+  private function simpleSuccessResponse() {
+    $response = new Response();
+    $response->setData([
+      'result' => [
+        'success' => true
+      ]
+    ]);
+
+    return $response;
+  }
+
+  private function simpleErrorResponse($message) {
+    $response = new Response();
+    $response
+      ->setStatus(500, 'Internal Server Error')
+      ->setData([
+        'result' => [
+          'success' => false,
+          'error' => $message
+        ]
+      ]);
+
+    return $response;
+  }
+
+  private function parsePerms($perms) {
+    if (($perms & 0xC000) == 0xC000) {
+      // Socket
+      $info = 's';
+    } elseif (($perms & 0xA000) == 0xA000) {
+      // Symbolic Link
+      $info = 'l';
+    } elseif (($perms & 0x8000) == 0x8000) {
+      // Regular
+      $info = '-';
+    } elseif (($perms & 0x6000) == 0x6000) {
+      // Block special
+      $info = 'b';
+    } elseif (($perms & 0x4000) == 0x4000) {
+      // Directory
+      $info = 'd';
+    } elseif (($perms & 0x2000) == 0x2000) {
+      // Character special
+      $info = 'c';
+    } elseif (($perms & 0x1000) == 0x1000) {
+      // FIFO pipe
+      $info = 'p';
+    } else {
+      // Unknown
+      $info = 'u';
+    }
+
+    // Owner
+    $info .= (($perms & 0x0100) ? 'r' : '-');
+    $info .= (($perms & 0x0080) ? 'w' : '-');
+    $info .= (($perms & 0x0040) ?
+      (($perms & 0x0800) ? 's' : 'x') :
+      (($perms & 0x0800) ? 'S' : '-'));
+
+    // Group
+    $info .= (($perms & 0x0020) ? 'r' : '-');
+    $info .= (($perms & 0x0010) ? 'w' : '-');
+    $info .= (($perms & 0x0008) ?
+      (($perms & 0x0400) ? 's' : 'x') :
+      (($perms & 0x0400) ? 'S' : '-'));
+
+    // World
+    $info .= (($perms & 0x0004) ? 'r' : '-');
+    $info .= (($perms & 0x0002) ? 'w' : '-');
+    $info .= (($perms & 0x0001) ?
+      (($perms & 0x0200) ? 't' : 'x') :
+      (($perms & 0x0200) ? 'T' : '-'));
+
+    return $info;
+  }
+
+  private function sortFiles($array) {
+    $a = [];
+    $b = [];
+
+    foreach ($array as $key => $item) {
+      if (strcmp($item['type'], 'dir') == 0) {
+        $a[$key] = $item;
+      } else {
+        $b[$key] = $item;
+      }
     }
+
+    $array = array_merge($a, $b);
+
+    return $array;
+
+  }
 }
diff --git a/bridges/php-local/index.php b/bridges/php-local/index.php
index ca628c86..24f2a025 100644
--- a/bridges/php-local/index.php
+++ b/bridges/php-local/index.php
@@ -1,21 +1,52 @@
 <?php
 namespace AngularFilemanager\LocalBridge;
 
+date_default_timezone_set('Asia/Shanghai');
+define('SYSTEM_coding', 'GBK');
+
 /**
  *  PHP Local filesystem bridge for angular-filemanager
- *  
- *  @author Jakub Ďuraš <jakub@duras.me>
- *  @version 0.1.0
+ *
+ * @author Jakub Ďuraš <jakub@duras.me>
+ * @version 0.1.0
  */
 include 'LocalBridge/Response.php';
 include 'LocalBridge/Rest.php';
 include 'LocalBridge/Translate.php';
 include 'LocalBridge/FileManagerApi.php';
 
+//default path
+$base_path = preg_replace(['/\\\\+/', '/\/+/'], ['\\\\', '/'], realpath('../../fackpath'));
+
 //Takes two arguments - base path without last slash (default: '$currentDirectory/../files'); language (default: 'en'); mute_errors (default: true, will call ini_set('display_errors', 0))
-$fileManagerApi = new FileManagerApi();
+$fileManagerApi = new FileManagerApi($base_path);
 
 $rest = new Rest();
 $rest->post([$fileManagerApi, 'postHandler'])
-     ->get([$fileManagerApi, 'getHandler'])
-     ->handle();
\ No newline at end of file
+  ->get([$fileManagerApi, 'getHandler'])
+  ->handle();
+
+function sbasename($filename) {
+  return preg_replace('/^.*[\\\\\\/]/', '', $filename);
+}
+
+function getFilesize($file) {
+  $size = filesize($file);
+  if ($size < 0) {
+    if ((strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')) {
+      exec('for %I in ("' . $file . '") do @echo %~zI', $output);
+      $size = $output[0];
+    } else {
+      $size = trim(`stat -c%s $file`);
+    }
+  }
+  return $size;
+}
+
+function debugLog($msg) {
+  $handle = fopen('debug_log.txt', 'a');
+  fwrite($handle, sprintf("%s : ", date('Y-m-d H:i:s')));
+  fwrite($handle, "\r\n");
+  fwrite($handle, $msg . "\r\n\r\n");
+  fclose($handle);
+}
diff --git a/bridges/php-local/lang/zh.json b/bridges/php-local/lang/zh.json
new file mode 100644
index 00000000..09d9746d
--- /dev/null
+++ b/bridges/php-local/lang/zh.json
@@ -0,0 +1,18 @@
+{
+	"function_not_implemented": "功能未实现",
+	"file_not_found": "没有找到文件",
+	"listing_filed": "获取列表失败",
+	"moving_failed": "移动失败",
+	"renaming_failed": "重命名失败",
+	"copying_failed": "复制失败",
+	"removing_failed": "删除失败",
+	"removing_failed_directory_not_empty": "删除失败,您正要删除的文件夹不是空的",
+	"saving_failed": "保存失败",
+	"folder_already_exists": "文件夹已存在",
+	"folder_creation_failed": "新建文件夹失败",
+	"permissions_change_failed": "修改权限失败",
+	"compression_failed": "压缩失败",
+	"archive_opening_failed": "无法打开压缩包,有错误或不支持",
+	"extraction_failed": "解压缩失败",
+	"upload_failed": "上传失败"
+}
\ No newline at end of file
diff --git a/dist/angular-filemanager.min.js b/dist/angular-filemanager.min.js
index b6fc3add..70e7844d 100644
--- a/dist/angular-filemanager.min.js
+++ b/dist/angular-filemanager.min.js
@@ -1,4 +1,4 @@
-!function(e,r,n){"use strict";r.module("FileManagerApp",["pascalprecht.translate","ngFileUpload"]),n(e.document).on("shown.bs.modal",".modal",function(){e.setTimeout(function(){n("[autofocus]",this).focus()}.bind(this),100)}),n(e.document).on("click",function(){n("#context-menu").hide()}),n(e.document).on("contextmenu",'.main-navigation .table-files tr.item-list:has("td"), .item-list',function(r){var i=n("#context-menu");r.pageX>=e.innerWidth-i.width()&&(r.pageX-=i.width()),r.pageY>=e.innerHeight-i.height()&&(r.pageY-=i.height()),i.hide().css({left:r.pageX,top:r.pageY}).appendTo("body").show(),r.preventDefault()}),Array.prototype.find||(Array.prototype.find=function(e){if(null==this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof e)throw new TypeError("predicate must be a function");for(var r,n=Object(this),i=n.length>>>0,a=arguments[1],t=0;i>t;t++)if(r=n[t],e.call(a,r,t,n))return r})}(window,angular,jQuery),function(e,r){"use strict";e.module("FileManagerApp").controller("FileManagerCtrl",["$scope","$rootScope","$window","$translate","fileManagerConfig","item","fileNavigator","apiMiddleware",function(e,n,i,a,t,o,s,l){var d=i.localStorage;e.config=t,e.reverse=!1,e.predicate=["model.type","model.name"],e.order=function(r){e.reverse=e.predicate[1]===r?!e.reverse:!1,e.predicate[1]=r},e.query="",e.fileNavigator=new s,e.apiMiddleware=new l,e.uploadFileList=[],e.viewTemplate=d.getItem("viewTemplate")||"main-icons.html",e.fileList=[],e.temps=[],e.$watch("temps",function(){e.singleSelection()?e.temp=e.singleSelection():(e.temp=new o({rights:644}),e.temp.multiple=!0),e.temp.revert()}),e.fileNavigator.onRefresh=function(){e.temps=[],e.query="",n.selectedModalPath=e.fileNavigator.currentPath},e.setTemplate=function(r){d.setItem("viewTemplate",r),e.viewTemplate=r},e.changeLanguage=function(e){return e?(d.setItem("language",e),a.use(e)):void a.use(d.getItem("language")||t.defaultLang)},e.isSelected=function(r){return-1!==e.temps.indexOf(r)},e.selectOrUnselect=function(r,n){var i=e.temps.indexOf(r),a=n&&3==n.which;if(n&&n.target.hasAttribute("prevent"))return void(e.temps=[]);if(!(!r||a&&e.isSelected(r))){if(n&&n.shiftKey&&!a){var t=e.fileList,o=t.indexOf(r),s=e.temps[0],l=t.indexOf(s),d=void 0;if(s&&t.indexOf(s)<o){for(e.temps=[];o>=l;)d=t[l],!e.isSelected(d)&&e.temps.push(d),l++;return}if(s&&t.indexOf(s)>o){for(e.temps=[];l>=o;)d=t[l],!e.isSelected(d)&&e.temps.push(d),l--;return}}return n&&!a&&(n.ctrlKey||n.metaKey)?void(e.isSelected(r)?e.temps.splice(i,1):e.temps.push(r)):void(e.temps=[r])}},e.singleSelection=function(){return 1===e.temps.length&&e.temps[0]},e.totalSelecteds=function(){return{total:e.temps.length}},e.selectionHas=function(r){return e.temps.find(function(e){return e&&e.model.type===r})},e.prepareNewFolder=function(){var r=new o(null,e.fileNavigator.currentPath);return e.temps=[r],r},e.smartClick=function(r){var n=e.config.allowedActions.pickFiles;if(r.isFolder())return e.fileNavigator.folderClick(r);if("function"==typeof e.config.pickCallback&&n){var i=e.config.pickCallback(r.model);if(i===!0)return}return r.isImage()?e.config.previewImagesInModal?e.openImagePreview(r):e.apiMiddleware.download(r,!0):r.isEditable()?e.openEditItem(r):void 0},e.openImagePreview=function(){var r=e.singleSelection();e.apiMiddleware.apiHandler.inprocess=!0,e.modal("imagepreview",null,!0).find("#imagepreview-target").attr("src",e.apiMiddleware.getUrl(r)).unbind("load error").on("load error",function(){e.apiMiddleware.apiHandler.inprocess=!1,e.$apply()})},e.openEditItem=function(){var r=e.singleSelection();e.apiMiddleware.getContent(r).then(function(e){r.tempModel.content=r.model.content=e.result}),e.modal("edit")},e.modal=function(n,i,a){var t=r("#"+n);return t.modal(i?"hide":"show"),e.apiMiddleware.apiHandler.error="",e.apiMiddleware.apiHandler.asyncSuccess=!1,a?t:!0},e.modalWithPathSelector=function(r){return n.selectedModalPath=e.fileNavigator.currentPath,e.modal(r)},e.isInThisPath=function(r){var n=e.fileNavigator.currentPath.join("/")+"/";return-1!==n.indexOf(r+"/")},e.edit=function(){e.apiMiddleware.edit(e.singleSelection()).then(function(){e.modal("edit",!0)})},e.changePermissions=function(){e.apiMiddleware.changePermissions(e.temps,e.temp).then(function(){e.modal("changepermissions",!0)})},e.download=function(){var r=e.singleSelection();if(!e.selectionHas("dir"))return r?e.apiMiddleware.download(r):e.apiMiddleware.downloadMultiple(e.temps)},e.copy=function(){var r=e.singleSelection();if(r){var i=r.tempModel.name.trim(),t=e.fileNavigator.fileNameExists(i);if(t&&c(r))return e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1;if(!i)return e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1}e.apiMiddleware.copy(e.temps,n.selectedModalPath).then(function(){e.fileNavigator.refresh(),e.modal("copy",!0)})},e.compress=function(){var r=e.temp.tempModel.name.trim(),i=e.fileNavigator.fileNameExists(r);return i&&c(e.temp)?(e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1):r?void e.apiMiddleware.compress(e.temps,r,n.selectedModalPath).then(function(){return e.fileNavigator.refresh(),e.config.compressAsync?void(e.apiMiddleware.apiHandler.asyncSuccess=!0):e.modal("compress",!0)},function(){e.apiMiddleware.apiHandler.asyncSuccess=!1}):(e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1)},e.extract=function(){var r=e.temp,i=e.temp.tempModel.name.trim(),t=e.fileNavigator.fileNameExists(i);return t&&c(e.temp)?(e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1):i?void e.apiMiddleware.extract(r,i,n.selectedModalPath).then(function(){return e.fileNavigator.refresh(),e.config.extractAsync?void(e.apiMiddleware.apiHandler.asyncSuccess=!0):e.modal("extract",!0)},function(){e.apiMiddleware.apiHandler.asyncSuccess=!1}):(e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1)},e.remove=function(){e.apiMiddleware.remove(e.temps).then(function(){e.fileNavigator.refresh(),e.modal("remove",!0)})},e.move=function(){var r=e.singleSelection()||e.temps[0];return r&&c(r)?(e.apiMiddleware.apiHandler.error=a.instant("error_cannot_move_same_path"),!1):void e.apiMiddleware.move(e.temps,n.selectedModalPath).then(function(){e.fileNavigator.refresh(),e.modal("move",!0)})},e.rename=function(){var r=e.singleSelection(),n=r.tempModel.name,i=r.tempModel.path.join("")===r.model.path.join("");return!n||i&&e.fileNavigator.fileNameExists(n)?(e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1):void e.apiMiddleware.rename(r).then(function(){e.fileNavigator.refresh(),e.modal("rename",!0)})},e.createFolder=function(){var r=e.singleSelection(),n=r.tempModel.name;return!n||e.fileNavigator.fileNameExists(n)?e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"):void e.apiMiddleware.createFolder(r).then(function(){e.fileNavigator.refresh(),e.modal("newfolder",!0)})},e.addForUpload=function(r){e.uploadFileList=e.uploadFileList.concat(r),e.modal("uploadfile")},e.removeFromUpload=function(r){e.uploadFileList.splice(r,1)},e.uploadFiles=function(){e.apiMiddleware.upload(e.uploadFileList,e.fileNavigator.currentPath).then(function(){e.fileNavigator.refresh(),e.uploadFileList=[],e.modal("uploadfile",!0)},function(r){var n=r.result&&r.result.error||a.instant("error_uploading_files");e.apiMiddleware.apiHandler.error=n})};var c=function(e){var r=n.selectedModalPath.join(""),i=e&&e.model.path.join("");return i===r},p=function(e){var r=i.location.search.substr(1).split("&").filter(function(r){return e===r.split("=")[0]});return r[0]&&r[0].split("=")[1]||void 0};e.changeLanguage(p("lang")),e.isWindows="Windows"===p("server"),e.fileNavigator.refresh()}])}(angular,jQuery),function(e){"use strict";e.module("FileManagerApp").controller("ModalFileManagerCtrl",["$scope","$rootScope","fileNavigator",function(e,r,n){e.reverse=!1,e.predicate=["model.type","model.name"],e.fileNavigator=new n,r.selectedModalPath=[],e.order=function(r){e.reverse=e.predicate[1]===r?!e.reverse:!1,e.predicate[1]=r},e.select=function(n){r.selectedModalPath=n.model.fullPath().split("/"),e.modal("selector",!0)},e.selectCurrent=function(){r.selectedModalPath=e.fileNavigator.currentPath,e.modal("selector",!0)},e.selectedFilesAreChildOfPath=function(r){var n=r.model.fullPath();return e.temps.find(function(e){var r=e.model.fullPath();return n==r?!0:void 0})},r.openNavigator=function(r){e.fileNavigator.currentPath=r,e.fileNavigator.refresh(),e.modal("selector")},r.getSelectedPath=function(){var n=r.selectedModalPath.filter(Boolean),i="/"+n.join("/");return e.singleSelection()&&!e.singleSelection().isFolder()&&(i+="/"+e.singleSelection().tempModel.name),i.replace(/\/\//,"/")}}])}(angular),function(e){"use strict";var r=e.module("FileManagerApp");r.directive("angularFilemanager",["$parse","fileManagerConfig",function(e,r){return{restrict:"EA",templateUrl:r.tplPath+"/main.html"}}]),r.directive("ngFile",["$parse",function(e){return{restrict:"A",link:function(r,n,i){var a=e(i.ngFile),t=a.assign;n.bind("change",function(){r.$apply(function(){t(r,n[0].files)})})}}}]),r.directive("ngRightClick",["$parse",function(e){return function(r,n,i){var a=e(i.ngRightClick);n.bind("contextmenu",function(e){r.$apply(function(){e.preventDefault(),a(r,{$event:e})})})}}])}(angular),function(e){"use strict";e.module("FileManagerApp").service("chmod",function(){var e=function(e){if(this.owner=this.getRwxObj(),this.group=this.getRwxObj(),this.others=this.getRwxObj(),e){var r=isNaN(e)?this.convertfromCode(e):this.convertfromOctal(e);if(!r)throw new Error("Invalid chmod input data (%s)".replace("%s",e));this.owner=r.owner,this.group=r.group,this.others=r.others}};return e.prototype.toOctal=function(e,r){var n=[];return["owner","group","others"].forEach(function(e,r){n[r]=this[e].read&&this.octalValues.read||0,n[r]+=this[e].write&&this.octalValues.write||0,n[r]+=this[e].exec&&this.octalValues.exec||0}.bind(this)),(e||"")+n.join("")+(r||"")},e.prototype.toCode=function(e,r){var n=[];return["owner","group","others"].forEach(function(e,r){n[r]=this[e].read&&this.codeValues.read||"-",n[r]+=this[e].write&&this.codeValues.write||"-",n[r]+=this[e].exec&&this.codeValues.exec||"-"}.bind(this)),(e||"")+n.join("")+(r||"")},e.prototype.getRwxObj=function(){return{read:!1,write:!1,exec:!1}},e.prototype.octalValues={read:4,write:2,exec:1},e.prototype.codeValues={read:"r",write:"w",exec:"x"},e.prototype.convertfromCode=function(e){if(e=(""+e).replace(/\s/g,""),e=10===e.length?e.substr(1):e,/^[-rwxts]{9}$/.test(e)){var r=[],n=e.match(/.{1,3}/g);for(var i in n){var a=this.getRwxObj();a.read=/r/.test(n[i]),a.write=/w/.test(n[i]),a.exec=/x|t/.test(n[i]),r.push(a)}return{owner:r[0],group:r[1],others:r[2]}}},e.prototype.convertfromOctal=function(e){if(e=(""+e).replace(/\s/g,""),e=4===e.length?e.substr(1):e,/^[0-7]{3}$/.test(e)){var r=[],n=e.match(/.{1}/g);for(var i in n){var a=this.getRwxObj();a.read=/[4567]/.test(n[i]),a.write=/[2367]/.test(n[i]),a.exec=/[1357]/.test(n[i]),r.push(a)}return{owner:r[0],group:r[1],others:r[2]}}},e})}(angular),function(e){"use strict";e.module("FileManagerApp").factory("item",["fileManagerConfig","chmod",function(r,n){var i=function(r,i){function a(e){var r=(e||"").toString().split(/[- :]/);return new Date(r[0],r[1]-1,r[2],r[3],r[4],r[5])}var t={name:r&&r.name||"",path:i||[],type:r&&r.type||"file",size:r&&parseInt(r.size||0),date:a(r&&r.date),perms:new n(r&&r.rights),content:r&&r.content||"",recursive:!1,fullPath:function(){var e=this.path.filter(Boolean);return("/"+e.join("/")+"/"+this.name).replace(/\/\//,"/")}};this.error="",this.processing=!1,this.model=e.copy(t),this.tempModel=e.copy(t)};return i.prototype.update=function(){e.extend(this.model,e.copy(this.tempModel))},i.prototype.revert=function(){e.extend(this.tempModel,e.copy(this.model)),this.error=""},i.prototype.isFolder=function(){return"dir"===this.model.type},i.prototype.isEditable=function(){return!this.isFolder()&&r.isEditableFilePattern.test(this.model.name)},i.prototype.isImage=function(){return r.isImageFilePattern.test(this.model.name)},i.prototype.isCompressible=function(){return this.isFolder()},i.prototype.isExtractable=function(){return!this.isFolder()&&r.isExtractableFilePattern.test(this.model.name)},i.prototype.isSelectable=function(){return this.isFolder()&&r.allowedActions.pickFolders||!this.isFolder()&&r.allowedActions.pickFiles},i}])}(angular),function(e){"use strict";e.module("FileManagerApp").provider("fileManagerConfig",function(){var r={appName:"angular-filemanager v1.5",defaultLang:"en",listUrl:"bridges/php/handler.php",uploadUrl:"bridges/php/handler.php",renameUrl:"bridges/php/handler.php",copyUrl:"bridges/php/handler.php",moveUrl:"bridges/php/handler.php",removeUrl:"bridges/php/handler.php",editUrl:"bridges/php/handler.php",getContentUrl:"bridges/php/handler.php",createFolderUrl:"bridges/php/handler.php",downloadFileUrl:"bridges/php/handler.php",downloadMultipleUrl:"bridges/php/handler.php",compressUrl:"bridges/php/handler.php",extractUrl:"bridges/php/handler.php",permissionsUrl:"bridges/php/handler.php",basePath:"/",searchForm:!0,sidebar:!0,breadcrumb:!0,allowedActions:{upload:!0,rename:!0,move:!0,copy:!0,edit:!0,changePermissions:!0,compress:!0,compressChooseName:!0,extract:!0,download:!0,downloadMultiple:!0,preview:!0,remove:!0,createFolder:!0,pickFiles:!1,pickFolders:!1},multipleDownloadFileName:"angular-filemanager.zip",filterFileExtensions:[],showExtensionIcons:!0,showSizeForDirectories:!1,useBinarySizePrefixes:!1,downloadFilesByAjax:!0,previewImagesInModal:!0,enablePermissionsRecursive:!0,compressAsync:!1,extractAsync:!1,pickCallback:null,isEditableFilePattern:/\.(txt|diff?|patch|svg|asc|cnf|cfg|conf|html?|.html|cfm|cgi|aspx?|ini|pl|py|md|css|cs|js|jsp|log|htaccess|htpasswd|gitignore|gitattributes|env|json|atom|eml|rss|markdown|sql|xml|xslt?|sh|rb|as|bat|cmd|cob|for|ftn|frm|frx|inc|lisp|scm|coffee|php[3-6]?|java|c|cbl|go|h|scala|vb|tmpl|lock|go|yml|yaml|tsv|lst)$/i,isImageFilePattern:/\.(jpe?g|gif|bmp|png|svg|tiff?)$/i,isExtractableFilePattern:/\.(gz|tar|rar|g?zip)$/i,tplPath:"src/templates"};return{$get:function(){return r},set:function(n){e.extend(r,n)}}})}(angular),function(e){"use strict";e.module("FileManagerApp").config(["$translateProvider",function(e){e.useSanitizeValueStrategy(null),e.translations("en",{filemanager:"File Manager",language:"Language",english:"English",spanish:"Spanish",portuguese:"Portuguese",french:"French",german:"German",hebrew:"Hebrew",italian:"Italian",slovak:"Slovak",chinese:"Chinese",russian:"Russian",ukrainian:"Ukrainian",turkish:"Turkish",persian:"Persian",polish:"Polish",confirm:"Confirm",cancel:"Cancel",close:"Close",upload_files:"Upload files",files_will_uploaded_to:"Files will be uploaded to",select_files:"Select files",uploading:"Uploading",permissions:"Permissions",select_destination_folder:"Select the destination folder",source:"Source",destination:"Destination",copy_file:"Copy file",sure_to_delete:"Are you sure to delete",change_name_move:"Change name / move",enter_new_name_for:"Enter new name for",extract_item:"Extract item",extraction_started:"Extraction started in a background process",compression_started:"Compression started in a background process",enter_folder_name_for_extraction:"Enter the folder name for the extraction of",enter_file_name_for_compression:"Enter the file name for the compression of",toggle_fullscreen:"Toggle fullscreen",edit_file:"Edit file",file_content:"File content",loading:"Loading",search:"Search",create_folder:"Create folder",create:"Create",folder_name:"Folder name",upload:"Upload",change_permissions:"Change permissions",change:"Change",details:"Details",icons:"Icons",list:"List",name:"Name",size:"Size",actions:"Actions",date:"Date",selection:"Selection",no_files_in_folder:"No files in this folder",no_folders_in_folder:"This folder not contains children folders",select_this:"Select this",go_back:"Go back",wait:"Wait",move:"Move",download:"Download",view_item:"View item",remove:"Delete",edit:"Edit",copy:"Copy",rename:"Rename",extract:"Extract",compress:"Compress",error_invalid_filename:"Invalid filename or already exists, specify another name",error_modifying:"An error occurred modifying the file",error_deleting:"An error occurred deleting the file or folder",error_renaming:"An error occurred renaming the file",error_copying:"An error occurred copying the file",error_compressing:"An error occurred compressing the file or folder",error_extracting:"An error occurred extracting the file",error_creating_folder:"An error occurred creating the folder",error_getting_content:"An error occurred getting the content of the file",error_changing_perms:"An error occurred changing the permissions of the file",error_uploading_files:"An error occurred uploading files",sure_to_start_compression_with:"Are you sure to compress",owner:"Owner",group:"Group",others:"Others",read:"Read",write:"Write",exec:"Exec",original:"Original",changes:"Changes",recursive:"Recursive",preview:"Item preview",open:"Open",these_elements:"these {{total}} elements",new_folder:"New folder",download_as_zip:"Download as ZIP"}),e.translations("he",{filemanager:"מנהל קבצים",language:"שפה",english:"אנגלית",spanish:"ספרדית",portuguese:"פורטוגזית",french:"צרפתית",german:"גרמנית",hebrew:"עברי",italian:"איטלקי",slovak:"סלובקי",chinese:"סִינִית",russian:"רוּסִי",ukrainian:"אוקראיני",turkish:"טורקי",persian:"פַּרסִית",polish:"פולני",confirm:"אשר",cancel:"בטל",close:"סגור",upload_files:"העלה קבצים",files_will_uploaded_to:"הקבצים יעלו ל",select_files:"בחר קבצים",uploading:"מעלה",permissions:"הרשאות",select_destination_folder:"בחר תיקיית יעד",source:"מקור",destination:"יעד",copy_file:"העתק קובץ",sure_to_delete:"האם אתה בטוח שברצונך למחוק",change_name_move:"שנה שם / הזז",enter_new_name_for:"הקלד שם חדש עבור",extract_item:"חלץ פריט",extraction_started:"תהליך החילוץ מתבצע ברקע",compression_started:"תהליך הכיווץ מתבצע ברקע",enter_folder_name_for_extraction:"הקלד שם תיקייה לחילוץ עבור",enter_file_name_for_compression:"הזן את שם הקובץ עבור הדחיסה של",toggle_fullscreen:"הפעל/בטל מסך מלא",edit_file:"ערוך קובץ",file_content:"תוכן הקובץ",loading:"טוען",search:"חפש",create_folder:"צור תיקייה",create:"צור",folder_name:"שם תיקייה",upload:"העלה",change_permissions:"שנה הרשאות",change:"שנה",details:"פרטים",icons:"סמלים",list:"רשימה",name:"שם",size:"גודל",actions:"פעולות",date:"תאריך",selection:"בְּחִירָה",no_files_in_folder:"אין קבצים בתיקייה זו",no_folders_in_folder:"התיקייה הזו אינה כוללת תתי תיקיות",select_this:"בחר את זה",go_back:"חזור אחורה",wait:"חכה",move:"הזז",download:"הורד",view_item:"הצג פריט",remove:"מחק",edit:"ערוך",copy:"העתק",rename:"שנה שם",extract:"חלץ",compress:"כווץ",error_invalid_filename:"שם קובץ אינו תקין או קיים, ציין שם קובץ אחר",error_modifying:"התרחשה שגיאה בעת שינוי הקובץ",error_deleting:"התרחשה שגיאה בעת מחיקת הקובץ או התיקייה",error_renaming:"התרחשה שגיאה בעת שינוי שם הקובץ",error_copying:"התרחשה שגיאה בעת העתקת הקובץ",error_compressing:"התרחשה שגיאה בעת כיווץ הקובץ או התיקייה",error_extracting:"התרחשה שגיאה בעת חילוץ הקובץ או התיקייה",error_creating_folder:"התרחשה שגיאה בעת יצירת התיקייה",error_getting_content:"התרחשה שגיאה בעת בקשת תוכן הקובץ",error_changing_perms:"התרחשה שגיאה בעת שינוי הרשאות הקובץ",error_uploading_files:"התרחשה שגיאה בעת העלאת הקבצים",sure_to_start_compression_with:"האם אתה בטוח שברצונך לכווץ",owner:"בעלים",group:"קבוצה",others:"אחרים",read:"קריאה",write:"כתיבה",exec:"הרצה",original:"מקורי",changes:"שינויים",recursive:"רקורסיה",preview:"הצגת פריט",open:"פתח",new_folder:"תיקיה חדשה",download_as_zip:"להוריד כמו"}),e.translations("pt",{filemanager:"Gerenciador de arquivos",language:"Língua",english:"Inglês",spanish:"Espanhol",portuguese:"Portugues",french:"Francês",german:"Alemão",hebrew:"Hebraico",italian:"Italiano",slovak:"Eslovaco",chinese:"Chinês",russian:"Russo",ukrainian:"Ucraniano",turkish:"Turco",persian:"Persa",polish:"Polonês",confirm:"Confirmar",cancel:"Cancelar",close:"Fechar",upload_files:"Carregar arquivos",files_will_uploaded_to:"Os arquivos serão enviados para",select_files:"Selecione os arquivos",uploading:"Carregar",permissions:"Autorizações",select_destination_folder:"Selecione a pasta de destino",source:"Origem",destination:"Destino",copy_file:"Copiar arquivo",sure_to_delete:"Tem certeza de que deseja apagar",change_name_move:"Renomear / mudança",enter_new_name_for:"Digite o novo nome para",extract_item:"Extrair arquivo",extraction_started:"A extração começou em um processo em segundo plano",compression_started:"A compressão começou em um processo em segundo plano",enter_folder_name_for_extraction:"Digite o nome da pasta para a extração de",enter_file_name_for_compression:"Digite o nome do arquivo para a compressão de",toggle_fullscreen:"Ativar/desativar tela cheia",edit_file:"Editar arquivo",file_content:"Conteúdo do arquivo",loading:"Carregando",search:"Localizar",create_folder:"Criar Pasta",create:"Criar",folder_name:"Nome da pasta",upload:"Fazer",change_permissions:"Alterar permissões",change:"Alterar",details:"Detalhes",icons:"Icones",list:"Lista",name:"Nome",size:"Tamanho",actions:"Ações",date:"Data",selection:"Seleção",no_files_in_folder:"Não há arquivos nesta pasta",no_folders_in_folder:"Esta pasta não contém subpastas",select_this:"Selecione esta",go_back:"Voltar",wait:"Espere",move:"Mover",download:"Baixar",view_item:"Veja o arquivo",remove:"Excluir",edit:"Editar",copy:"Copiar",rename:"Renomear",extract:"Extrair",compress:"Comprimir",error_invalid_filename:"Nome do arquivo inválido ou nome de arquivo já existe, especifique outro nome",error_modifying:"Ocorreu um erro ao modificar o arquivo",error_deleting:"Ocorreu um erro ao excluir o arquivo ou pasta",error_renaming:"Ocorreu um erro ao mudar o nome do arquivo",error_copying:"Ocorreu um erro ao copiar o arquivo",error_compressing:"Ocorreu um erro ao comprimir o arquivo ou pasta",error_extracting:"Ocorreu um erro ao extrair o arquivo",error_creating_folder:"Ocorreu um erro ao criar a pasta",error_getting_content:"Ocorreu um erro ao obter o conteúdo do arquivo",error_changing_perms:"Ocorreu um erro ao alterar as permissões do arquivo",error_uploading_files:"Ocorreu um erro upload de arquivos",sure_to_start_compression_with:"Tem certeza que deseja comprimir",owner:"Proprietário",group:"Grupo",others:"Outros",read:"Leitura",write:"Escrita ",exec:"Execução",original:"Original",changes:"Mudanças",recursive:"Recursiva",preview:"Visualização",open:"Abrir",these_elements:"estes {{total}} elements",new_folder:"Nova pasta",download_as_zip:"Download como ZIP"}),e.translations("es",{filemanager:"Administrador de archivos",language:"Idioma",english:"Ingles",spanish:"Español",portuguese:"Portugues",french:"Francés",german:"Alemán",hebrew:"Hebreo",italian:"Italiano",slovak:"Eslovaco",chinese:"Chino",russian:"Ruso",ukrainian:"Ucraniano",turkish:"Turco",persian:"Persa",polish:"Polaco",confirm:"Confirmar",cancel:"Cancelar",close:"Cerrar",upload_files:"Subir archivos",files_will_uploaded_to:"Los archivos seran subidos a",select_files:"Seleccione los archivos",uploading:"Subiendo",permissions:"Permisos",select_destination_folder:"Seleccione la carpeta de destino",source:"Origen",destination:"Destino",copy_file:"Copiar archivo",sure_to_delete:"Esta seguro que desea eliminar",change_name_move:"Renombrar / mover",enter_new_name_for:"Ingrese el nuevo nombre para",extract_item:"Extraer archivo",extraction_started:"La extraccion ha comenzado en un proceso de segundo plano",compression_started:"La compresion ha comenzado en un proceso de segundo plano",enter_folder_name_for_extraction:"Ingrese el nombre de la carpeta para la extraccion de",enter_file_name_for_compression:"Ingrese el nombre del archivo para la compresion de",toggle_fullscreen:"Activar/Desactivar pantalla completa",edit_file:"Editar archivo",file_content:"Contenido del archivo",loading:"Cargando",search:"Buscar",create_folder:"Crear carpeta",create:"Crear",folder_name:"Nombre de la carpeta",upload:"Subir",change_permissions:"Cambiar permisos",change:"Cambiar",details:"Detalles",icons:"Iconos",list:"Lista",name:"Nombre",size:"Tamaño",actions:"Acciones",date:"Fecha",selection:"Selección",no_files_in_folder:"No hay archivos en esta carpeta",no_folders_in_folder:"Esta carpeta no contiene sub-carpetas",select_this:"Seleccionar esta",go_back:"Volver",wait:"Espere",move:"Mover",download:"Descargar",view_item:"Ver archivo",remove:"Eliminar",edit:"Editar",copy:"Copiar",rename:"Renombrar",extract:"Extraer",compress:"Comprimir",error_invalid_filename:"El nombre del archivo es invalido o ya existe",error_modifying:"Ocurrio un error al intentar modificar el archivo",error_deleting:"Ocurrio un error al intentar eliminar el archivo",error_renaming:"Ocurrio un error al intentar renombrar el archivo",error_copying:"Ocurrio un error al intentar copiar el archivo",error_compressing:"Ocurrio un error al intentar comprimir el archivo",error_extracting:"Ocurrio un error al intentar extraer el archivo",error_creating_folder:"Ocurrio un error al intentar crear la carpeta",error_getting_content:"Ocurrio un error al obtener el contenido del archivo",error_changing_perms:"Ocurrio un error al cambiar los permisos del archivo",error_uploading_files:"Ocurrio un error al subir archivos",sure_to_start_compression_with:"Esta seguro que desea comprimir",owner:"Propietario",group:"Grupo",others:"Otros",read:"Lectura",write:"Escritura",exec:"Ejecucion",original:"Original",changes:"Cambios",recursive:"Recursivo",preview:"Vista previa",open:"Abrir",these_elements:"estos {{total}} elementos",new_folder:"Nueva carpeta",download_as_zip:"Descargar como ZIP"}),e.translations("fr",{filemanager:"Gestionnaire de fichier",language:"Langue",english:"Anglais",spanish:"Espagnol",portuguese:"Portugais",french:"Français",german:"Allemand",hebrew:"Hébreu",italian:"Italien",slovak:"Slovaque",chinese:"Chinois",russian:"Russe",ukrainian:"Ukrainien",turkish:"Turc",persian:"Persan",polish:"Polonais",confirm:"Confirmer",cancel:"Annuler",close:"Fermer",upload_files:"Télécharger des fichiers",files_will_uploaded_to:"Les fichiers seront uploadé dans",select_files:"Sélectionnez les fichiers",uploading:"Upload en cours",permissions:"Permissions",select_destination_folder:"Sélectionné le dossier de destination",source:"Source",destination:"Destination",copy_file:"Copier le fichier",sure_to_delete:"Êtes-vous sûr de vouloir supprimer",change_name_move:"Renommer / Déplacer",enter_new_name_for:"Entrer le nouveau nom pour",extract_item:"Extraires les éléments",extraction_started:"L'extraction a démarré en tâche de fond",compression_started:"La compression a démarré en tâche de fond",enter_folder_name_for_extraction:"Entrer le nom du dossier pour l'extraction de",enter_file_name_for_compression:"Entrez le nom de fichier pour la compression de",toggle_fullscreen:"Basculer en plein écran",edit_file:"Éditer le fichier",file_content:"Contenu du fichier",loading:"Chargement en cours",search:"Recherche",create_folder:"Créer un dossier",create:"Créer",folder_name:"Nom du dossier",upload:"Upload",change_permissions:"Changer les permissions",change:"Changer",details:"Details",icons:"Icons",list:"Liste",name:"Nom",size:"Taille",actions:"Actions",date:"Date",selection:"Sélection",no_files_in_folder:"Aucun fichier dans ce dossier",no_folders_in_folder:"Ce dossier ne contiens pas de dossier",select_this:"Sélectionner",go_back:"Retour",wait:"Patienter",move:"Déplacer",download:"Télécharger",view_item:"Voir l'élément",remove:"Supprimer",edit:"Éditer",copy:"Copier",rename:"Renommer",extract:"Extraire",compress:"Compresser",error_invalid_filename:"Nom de fichier invalide ou déjà existant, merci de spécifier un autre nom",error_modifying:"Une erreur est survenue pendant la modification du fichier",error_deleting:"Une erreur est survenue pendant la suppression du fichier ou du dossier",error_renaming:"Une erreur est survenue pendant le renommage du fichier",error_copying:"Une erreur est survenue pendant la copie du fichier",error_compressing:"Une erreur est survenue pendant la compression du fichier ou du dossier",error_extracting:"Une erreur est survenue pendant l'extraction du fichier",error_creating_folder:"Une erreur est survenue pendant la création du dossier",error_getting_content:"Une erreur est survenue pendant la récupération du contenu du fichier",error_changing_perms:"Une erreur est survenue pendant le changement des permissions du fichier",error_uploading_files:"Une erreur est survenue pendant l'upload des fichiers",sure_to_start_compression_with:"Êtes-vous sûre de vouloir compresser",owner:"Propriétaire",group:"Groupe",others:"Autres",read:"Lecture",write:"Écriture",exec:"Éxécution",original:"Original",changes:"Modifications",recursive:"Récursif",preview:"Aperçu",open:"Ouvrir",these_elements:"ces {{total}} éléments",new_folder:"Nouveau dossier",download_as_zip:"Télécharger comme ZIP"}),e.translations("de",{filemanager:"Dateimanager",language:"Sprache",english:"Englisch",spanish:"Spanisch",portuguese:"Portugiesisch",french:"Französisch",german:"Deutsch",hebrew:"Hebräisch",italian:"Italienisch",slovak:"Slowakisch",chinese:"Chinesisch",russian:"Russisch",ukrainian:"Ukrainisch",turkish:"Türkisch",persian:"Persisch",polish:"Polnisch",confirm:"Bestätigen",cancel:"Abbrechen",close:"Schließen",upload_files:"Hochladen von Dateien",files_will_uploaded_to:"Dateien werden hochgeladen nach",select_files:"Wählen Sie die Dateien",uploading:"Lade hoch",permissions:"Berechtigungen",select_destination_folder:"Wählen Sie einen Zielordner",source:"Quelle",destination:"Ziel",copy_file:"Datei kopieren",sure_to_delete:"Sind Sie sicher, dass Sie die Datei löschen möchten?",change_name_move:"Namen ändern / verschieben",enter_new_name_for:"Geben Sie den neuen Namen ein für",extract_item:"Archiv entpacken",extraction_started:"Entpacken hat im Hintergrund begonnen",compression_started:"Komprimierung hat im Hintergrund begonnen",enter_folder_name_for_extraction:"Geben Sie den Verzeichnisnamen für die Entpackung an von",enter_file_name_for_compression:"Geben Sie den Dateinamen für die Kompression an von",toggle_fullscreen:"Vollbild umschalten",edit_file:"Datei bearbeiten",file_content:"Dateiinhalt",loading:"Lade",search:"Suche",create_folder:"Ordner erstellen",create:"Erstellen",folder_name:"Verzeichnisname",upload:"Hochladen",change_permissions:"Berechtigungen ändern",change:"Ändern",details:"Details",icons:"Symbolansicht",list:"Listenansicht",name:"Name",size:"Größe",actions:"Aktionen",date:"Datum",selection:"Auswahl",no_files_in_folder:"Keine Dateien in diesem Ordner",no_folders_in_folder:"Dieser Ordner enthält keine Unterordner",select_this:"Auswählen",go_back:"Zurück",wait:"Warte",move:"Verschieben",download:"Herunterladen",view_item:"Datei ansehen",remove:"Löschen",edit:"Bearbeiten",copy:"Kopieren",rename:"Umbenennen",extract:"Entpacken",compress:"Komprimieren",error_invalid_filename:"Ungültiger Dateiname oder existiert bereits",error_modifying:"Beim Bearbeiten der Datei ist ein Fehler aufgetreten",error_deleting:"Beim Löschen der Datei oder des Ordners ist ein Fehler aufgetreten",error_renaming:"Beim Umbennenen der Datei ist ein Fehler aufgetreten",error_copying:"Beim Kopieren der Datei ist ein Fehler aufgetreten",error_compressing:"Beim Komprimieren der Datei oder des Ordners ist ein Fehler aufgetreten",error_extracting:"Beim Entpacken der Datei ist ein Fehler aufgetreten",error_creating_folder:"Beim Erstellen des Ordners ist ein Fehler aufgetreten",error_getting_content:"Beim Laden des Dateiinhalts ist ein Fehler aufgetreten",error_changing_perms:"Beim Ändern der Dateiberechtigungen ist ein Fehler aufgetreten",error_uploading_files:"Beim Hochladen der Dateien ist ein Fehler aufgetreten",sure_to_start_compression_with:"Möchten Sie die Datei wirklich komprimieren?",owner:"Besitzer",group:"Gruppe",others:"Andere",read:"Lesen",write:"Schreiben",exec:"Ausführen",original:"Original",changes:"Änderungen",recursive:"Rekursiv",preview:"Dateivorschau",open:"Öffnen",these_elements:"diese {{total}} elemente",
-new_folder:"Neuer ordner",download_as_zip:"Download als ZIP"}),e.translations("sk",{filemanager:"Správca súborov",language:"Jazyk",english:"Angličtina",spanish:"Španielčina",portuguese:"Portugalčina",french:"Francúzština",german:"Nemčina",hebrew:"Hebrejčina",italian:"Italština",slovak:"Slovenčina",chinese:"Čínština",russian:"Ruský",ukrainian:"Ukrajinský",turkish:"Turecký",persian:"Perzský",polish:"Poľský",confirm:"Potvrdiť",cancel:"Zrušiť",close:"Zavrieť",upload_files:"Nahrávať súbory",files_will_uploaded_to:"Súbory budú nahrané do",select_files:"Vybrať súbory",uploading:"Nahrávanie",permissions:"Oprávnenia",select_destination_folder:"Vyberte cieľový príečinok",source:"Zdroj",destination:"Cieľ",copy_file:"Kopírovať súbor",sure_to_delete:"Ste si istý, že chcete vymazať",change_name_move:"Premenovať / Premiestniť",enter_new_name_for:"Zadajte nové meno pre",extract_item:"Rozbaliť položku",extraction_started:"Rozbaľovanie začalo v procese na pozadí",compression_started:"Kompresia začala v procese na pzoadí",enter_folder_name_for_extraction:"Zadajte názov priečinka na rozbalenie",enter_file_name_for_compression:"Zadajte názov súboru pre kompresiu",toggle_fullscreen:"Prepnúť režim na celú obrazovku",edit_file:"Upraviť súbor",file_content:"Obsah súboru",loading:"Načítavanie",search:"Hľadať",create_folder:"Vytvoriť priečinok",create:"Vytvoriť",folder_name:"Názov priećinka",upload:"Nahrať",change_permissions:"Zmeniť oprávnenia",change:"Zmeniť",details:"Podrobnosti",icons:"Ikony",list:"Zoznam",name:"Meno",size:"Veľkosť",actions:"Akcie",date:"Dátum",selection:"Výber",no_files_in_folder:"V tom to priečinku nie sú žiadne súbory",no_folders_in_folder:"Tento priečinok neobsahuje žiadne ďalšie priećinky",select_this:"Vybrať tento",go_back:"Ísť späť",wait:"Počkajte",move:"Presunúť",download:"Stiahnuť",view_item:"Zobraziť položku",remove:"Vymazať",edit:"Upraviť",copy:"Kopírovať",rename:"Premenovať",extract:"Rozbaliť",compress:"Komprimovať",error_invalid_filename:"Neplatné alebo duplicitné meno súboru, vyberte iné meno",error_modifying:"Vyskytla sa chyba pri upravovaní súboru",error_deleting:"Vyskytla sa chyba pri mazaní súboru alebo priečinku",error_renaming:"Vyskytla sa chyba pri premenovaní súboru",error_copying:"Vyskytla sa chyba pri kopírovaní súboru",error_compressing:"Vyskytla sa chyba pri komprimovaní súboru alebo priečinka",error_extracting:"Vyskytla sa chyba pri rozbaľovaní súboru",error_creating_folder:"Vyskytla sa chyba pri vytváraní priečinku",error_getting_content:"Vyskytla sa chyba pri získavaní obsahu súboru",error_changing_perms:"Vyskytla sa chyba pri zmene oprávnení súboru",error_uploading_files:"Vyskytla sa chyba pri nahrávaní súborov",sure_to_start_compression_with:"Ste si istý, že chcete komprimovať",owner:"Vlastník",group:"Skupina",others:"Ostatní",read:"Čítanie",write:"Zapisovanie",exec:"Spúštanie",original:"Originál",changes:"Zmeny",recursive:"Rekurzívne",preview:"Náhľad položky",open:"Otvoriť",these_elements:"týchto {{total}} prvkov",new_folder:"Nový priečinok",download_as_zip:"Stiahnuť ako ZIP"}),e.translations("zh",{filemanager:"文档管理器",language:"语言",english:"英语",spanish:"西班牙语",portuguese:"葡萄牙语",french:"法语",german:"德语",hebrew:"希伯来语",italian:"意大利",slovak:"斯洛伐克语",chinese:"中文",russian:"俄語",ukrainian:"烏克蘭",turkish:"土耳其",persian:"波斯語",polish:"波兰语",confirm:"确定",cancel:"取消",close:"关闭",upload_files:"上传文件",files_will_uploaded_to:"文件将上传到",select_files:"选择文件",uploading:"上传中",permissions:"权限",select_destination_folder:"选择目标文件",source:"源自",destination:"目的地",copy_file:"复制文件",sure_to_delete:"确定要删除?",change_name_move:"改名或移动?",enter_new_name_for:"输入新的名称",extract_item:"解压",extraction_started:"解压已经在后台开始",compression_started:"压缩已经在后台开始",enter_folder_name_for_extraction:"输入解压的目标文件夹",enter_file_name_for_compression:"输入要压缩的文件名",toggle_fullscreen:"切换全屏",edit_file:"编辑文件",file_content:"文件内容",loading:"加载中",search:"搜索",create_folder:"创建文件夹",create:"创建",folder_name:"文件夹名称",upload:"上传",change_permissions:"修改权限",change:"修改",details:"详细信息",icons:"图标",list:"列表",name:"名称",size:"尺寸",actions:"操作",date:"日期",selection:"选择",no_files_in_folder:"此文件夹没有文件",no_folders_in_folder:"此文件夹不包含子文件夹",select_this:"选择此文件",go_back:"后退",wait:"等待",move:"移动",download:"下载",view_item:"查看子项",remove:"删除",edit:"编辑",copy:"复制",rename:"重命名",extract:"解压",compress:"压缩",error_invalid_filename:"非法文件名或文件已经存在, 请指定其它名称",error_modifying:"修改文件出错",error_deleting:"删除文件或文件夹出错",error_renaming:"重命名文件出错",error_copying:"复制文件出错",error_compressing:"压缩文件或文件夹出错",error_extracting:"解压文件出错",error_creating_folder:"创建文件夹出错",error_getting_content:"获取文件内容出错",error_changing_perms:"修改文件权限出错",error_uploading_files:"上传文件出错",sure_to_start_compression_with:"确定要压缩?",owner:"拥有者",group:"群组",others:"其他",read:"读取",write:"写入",exec:"执行",original:"原始",changes:"变化",recursive:"递归",preview:"成员预览",open:"打开",these_elements:"共 {{total}} 个",new_folder:"新文件夹",download_as_zip:"下载的ZIP"}),e.translations("ru",{filemanager:"Файловый менеджер",language:"Язык",english:"Английский",spanish:"Испанский",portuguese:"Португальский",french:"Французкий",german:"Немецкий",hebrew:"Хинди",italian:"итальянский",slovak:"Словацкий",chinese:"Китайский",russian:"русский",ukrainian:"украинец",turkish:"турецкий",persian:"персидский",polish:"Польский",confirm:"Подьвердить",cancel:"Отменить",close:"Закрыть",upload_files:"Загрузка файлов",files_will_uploaded_to:"Файлы будут загружены в: ",select_files:"Выберите файлы",uploading:"Загрузка",permissions:"Разрешения",select_destination_folder:"Выберите папку назначения",source:"Источкик",destination:"Цель",copy_file:"Скопировать файл",sure_to_delete:"Действительно удалить?",change_name_move:"Переименовать / переместить",enter_new_name_for:"Новое имя для",extract_item:"Извлечь",extraction_started:"Извлечение начато",compression_started:"Сжатие начато",enter_folder_name_for_extraction:"Извлечь в укананную папку",enter_file_name_for_compression:"Введите имя архива",toggle_fullscreen:"На весь экран",edit_file:"Редактировать",file_content:"Содержимое файла",loading:"Загрузка",search:"Поиск",create_folder:"Создать папку",create:"Создать",folder_name:"Имя папки",upload:"Загрузить",change_permissions:"Изменить разрешения",change:"Изменить",details:"Свойства",icons:"Иконки",list:"Список",name:"Имя",size:"Размер",actions:"Действия",date:"Дата",selection:"выбор",no_files_in_folder:"Пустая папка",no_folders_in_folder:"Пустая папка",select_this:"Выбрать",go_back:"Назад",wait:"Подождите",move:"Переместить",download:"Скачать",view_item:"Отобразить содержимое",remove:"Удалить",edit:"Редактировать",copy:"Скопировать",rename:"Переименовать",extract:"Извлечь",compress:"Сжать",error_invalid_filename:"Имя неверное или уже существует, выберите другое",error_modifying:"Произошла ошибка при модифицировании файла",error_deleting:"Произошла ошибка при удалении",error_renaming:"Произошла ошибка при переименовании файла",error_copying:"Произошла ошибка при копировании файла",error_compressing:"Произошла ошибка при сжатии",error_extracting:"Произошла ошибка при извлечении",error_creating_folder:"Произошла ошибка при создании папки",error_getting_content:"Произошла ошибка при получении содержимого",error_changing_perms:"Произошла ошибка при изменении разрешений",error_uploading_files:"Произошла ошибка при загрузке",sure_to_start_compression_with:"Действительно сжать",owner:"Владелец",group:"Группа",others:"Другие",read:"Чтение",write:"Запись",exec:"Выполнение",original:"По-умолчанию",changes:"Изменения",recursive:"Рекурсивно",preview:"Просмотр",open:"Открыть",these_elements:"всего {{total}} елементов",new_folder:"Новая папка",download_as_zip:"Download as ZIP"}),e.translations("ua",{filemanager:"Файловий менеджер",language:"Мова",english:"Англійська",spanish:"Іспанська",portuguese:"Португальська",french:"Французька",german:"Німецька",hebrew:"Хінді",italian:"італійський",slovak:"Словацька",chinese:"Китайська",russian:"російський",ukrainian:"український",turkish:"турецька",persian:"перський",polish:"Польська",confirm:"Підтвердити",cancel:"Відмінити",close:"Закрити",upload_files:"Завантаження файлів",files_will_uploaded_to:"Файли будуть завантажені у: ",select_files:"Виберіть файли",uploading:"Завантаження",permissions:"Дозволи",select_destination_folder:"Виберіть папку призначення",source:"Джерело",destination:"Ціль",copy_file:"Скопіювати файл",sure_to_delete:"Дійсно удалить?",change_name_move:"Перейменувати / перемістити",enter_new_name_for:"Нове ім'я для",extract_item:"Извлечь",extraction_started:"Извлечение начато",compression_started:"Архівацію почато",enter_folder_name_for_extraction:"Извлечь в укананную папку",enter_file_name_for_compression:"Введите имя архива",toggle_fullscreen:"На весь экран",edit_file:"Редагувати",file_content:"Вміст файлу",loading:"Завантаження",search:"Пошук",create_folder:"Створити папку",create:"Створити",folder_name:"Ім'я  папки",upload:"Завантижити",change_permissions:"Змінити дозволи",change:"Редагувати",details:"Властивості",icons:"Іконки",list:"Список",name:"Ім'я",size:"Розмір",actions:"Дії",date:"Дата",selection:"вибір",no_files_in_folder:"Пуста папка",no_folders_in_folder:"Пуста папка",select_this:"Выбрати",go_back:"Назад",wait:"Зачекайте",move:"Перемістити",download:"Скачати",view_item:"Показати вміст",remove:"Видалити",edit:"Редагувати",copy:"Копіювати",rename:"Переіменувати",extract:"Розархівувати",compress:"Архівувати",error_invalid_filename:"Ім'я певірне або вже існує, виберіть інше",error_modifying:"Виникла помилка при редагуванні файлу",error_deleting:"Виникла помилка при видаленні",error_renaming:"Виникла помилка при зміні імені файлу",error_copying:"Виникла помилка при коміюванні файлу",error_compressing:"Виникла помилка при стисненні",error_extracting:"Виникла помилка при розархівації",error_creating_folder:"Виникла помилка при створенні папки",error_getting_content:"Виникла помилка при отриманні вмісту",error_changing_perms:"Виникла помилка при зміні дозволів",error_uploading_files:"Виникла помилка при завантаженні",sure_to_start_compression_with:"Дійсно стиснути",owner:"Власник",group:"Група",others:"Інші",read:"Читання",write:"Запис",exec:"Виконання",original:"За замовчуванням",changes:"Зміни",recursive:"Рекурсивно",preview:"Перегляд",open:"Відкрити",these_elements:"усього {{total}} елементів",new_folder:"Нова папка",download_as_zip:"Download as ZIP"}),e.translations("tr",{filemanager:"Dosya Yöneticisi",language:"Dil",english:"İngilizce",spanish:"İspanyolca",portuguese:"Portekizce",french:"Fransızca",german:"Almanca",hebrew:"İbranice",italian:"İtalyanca",slovak:"Slovakça",chinese:"Çince",russian:"Rusça",ukrainian:"Ukraynaca",turkish:"Türkçe",persian:"Farsça",polish:"Lehçe",confirm:"Onayla",cancel:"İptal Et",close:"Kapat",upload_files:"Dosya yükle",files_will_uploaded_to:"Dosyalar yüklenecektir.",select_files:"Dosya Seç",uploading:"Yükleniyor",permissions:"İzinler",select_destination_folder:"Hedef klasör seçin",source:"Kaynak",destination:"Hedef",copy_file:"Dosyayı kopyala",sure_to_delete:"Silmek istediğinden emin misin",change_name_move:"İsmini değiştir / taşı",enter_new_name_for:"Yeni ad girin",extract_item:"Dosya çıkar",extraction_started:"Çıkarma işlemi arkaplanda devam ediyor",compression_started:"Sıkıştırma işlemi arkaplanda başladı",enter_folder_name_for_extraction:"Çıkarılması için klasör adı girin",enter_file_name_for_compression:"Sıkıştırılması için dosya adı girin",toggle_fullscreen:"Tam ekran moduna geç",edit_file:"Dosyayı düzenle",file_content:"Dosya içeriği",loading:"Yükleniyor",search:"Ara",create_folder:"Klasör oluştur",create:"Oluştur",folder_name:"Klasör adı",upload:"Yükle",change_permissions:"İzinleri değiştir",change:"Değiştir",details:"Detaylar",icons:"simgeler",list:"Liste",name:"Adı",size:"Boyutu",actions:"İşlemler",date:"Tarih",selection:"Seçim",no_files_in_folder:"Klasörde hiç dosya yok",no_folders_in_folder:"Bu klasör alt klasör içermez",select_this:"Bunu seç",go_back:"Geri git",wait:"Bekle",move:"Taşı",download:"İndir",view_item:"Dosyayı görüntüle",remove:"Sil",edit:"Düzenle",copy:"Kopyala",rename:"Yeniden Adlandır",extract:"Çıkart",compress:"Sıkıştır",error_invalid_filename:"Geçersiz dosya adı, bu dosya adına sahip dosya mevcut",error_modifying:"Dosya düzenlenirken bir hata oluştu",error_deleting:"Klasör veya dosya silinirken bir hata oluştu",error_renaming:"Dosya yeniden adlandırılırken bir hata oluştu",error_copying:"Dosya kopyalanırken bir hata oluştu",error_compressing:"Dosya veya klasör sıkıştırılırken bir hata oluştu",error_extracting:"Çıkartılırken bir hata oluştu",error_creating_folder:"Klasör oluşturulurken bir hata oluştu",error_getting_content:"Dosya detayları alınırken bir hata oluştu",error_changing_perms:"Dosyanın izini değiştirilirken bir hata oluştu",error_uploading_files:"Dosyalar yüklenirken bir hata oluştu",sure_to_start_compression_with:"Sıkıştırmak istediğinden emin misin",owner:"Sahip",group:"Grup",others:"Diğerleri",read:"Okuma",write:"Yazma",exec:"Gerçekleştir",original:"Orjinal",changes:"Değişiklikler",recursive:"Yinemeli",preview:"Dosyayı önizle",open:"Aç",these_elements:"{{total}} eleman",new_folder:"Yeni Klasör",download_as_zip:"ZIP olarak indir"}),e.translations("fa",{filemanager:"مدیریت فایل ها",language:"زبان",english:"انگلیسی",spanish:"اسپانیایی",portuguese:"پرتغالی",french:"فرانسه",german:"آلمانی",hebrew:"عبری",italian:"ایتالیایی",slovak:"اسلواک",chinese:"چینی",russian:"روسی",ukrainian:"اوکراینی",turkish:"ترکی",persian:"فارسی",polish:"لهستانی",confirm:"تایید",cancel:"رد",close:"بستن",upload_files:"آپلود فایل",files_will_uploaded_to:"فایل ها آپلود می شوند به",select_files:"انتخاب فایل ها",uploading:"در حال آپلود",permissions:"مجوز ها",select_destination_folder:"پوشه مقصد را انتخاب کنید",source:"مبدا",destination:"مقصد",copy_file:"کپی فایل",sure_to_delete:"مطمين هستید می خواهید حذف کنید؟",change_name_move:"تغییر نام و جابجایی",enter_new_name_for:"نام جدیدی وارد کنید برای",extract_item:"خارج کردن از حالت فشرده",extraction_started:"یک پروسه در پس زمینه شروع به خارج کردن از حالت فشرده کرد",compression_started:"یک پروسه در پس زمینه شروع به فشرده سازی کرد",enter_folder_name_for_extraction:"نام پوشه مقصد برای خارج کردن از حالت فشرده را وارد کنید",enter_file_name_for_compression:"نام پوشه مقصد برای فشرده سازی را وارد کنید",toggle_fullscreen:"تعویض حالت تمام صفحه",edit_file:"ویرایش",file_content:"محتویات",loading:"در حال بارگذاری",search:"جستجو",create_folder:"پوشه جدید",create:"ساختن",folder_name:"نام پوشه",upload:"آپلود",change_permissions:"تغییر مجوز ها",change:"تغییر",details:"جزییات",icons:"آیکون ها",list:"لیست",name:"نام",size:"سایز",actions:"اعمال",date:"تاریخ",selection:"انتخاب",no_files_in_folder:"هیچ فایلی در این پوشه نیست",no_folders_in_folder:"هیچ پوشه ای داخل این پوشه قرار ندارد",select_this:"انتخاب",go_back:"بازگشت",wait:"منتظر بمانید",move:"جابجایی",download:"دانلود",view_item:"مشاهده این مورد",remove:"حذف",edit:"ویرایش",copy:"کپی",rename:"تغییر نام",extract:"خروج از حالت فشرده",compress:"فشرده سازی",error_invalid_filename:"نام فایل مورد درست نیست و یا قبلا استفاده شده است، لطفا نام دیگری وارد کنید",error_modifying:"در هنگام تغییر فایل خطایی پیش آمد",error_deleting:"در هنگام حذف فایل خطایی پیش آمد",error_renaming:"در هنگام تغییر نام فایل خطایی پیش آمد",error_copying:"در هنگام کپی کردن فایل خطایی پیش آمد",error_compressing:"در هنگام فشرده سازی فایل خطایی پیش آمد",error_extracting:"در هنگام خارک کردن فایل از حالت فشرده خطایی پیش آمد",error_creating_folder:"در هنگام ساخت پوشه خطایی پیش امد",error_getting_content:"در هنگام بارگذاری محتویات فایل خطایی رخ داد",error_changing_perms:"در هنگام تغییر مجوز های فایل خطایی رخ داد",error_uploading_files:"در آپلود فایل خطایی رخ داد",sure_to_start_compression_with:"مطمئن هستید فشرده سازی انجام شد؟",owner:"مالک فایل",group:"گروه",others:"دیگران",read:"خواندن",write:"نوشتن",exec:"اجرا کردن",original:"اصلی",changes:"تغییرات",recursive:"بازگشتی",preview:"پیش نمایش",open:"باز کردن",these_elements:"تعداد {{total}} مورد",new_folder:"پوشه جدید",download_as_zip:"به عنوان فایل فشرده دانلود شود"}),e.translations("pl",{filemanager:"Menadżer plików",language:"Język",english:"Angielski",spanish:"Hiszpański",portuguese:"Portugalski",french:"Francuski",german:"Niemiecki",hebrew:"Hebrajski",italian:"Włoski",slovak:"Słowacki",chinese:"Chiński",russian:"Rosyjski",ukrainian:"Ukraiński",turkish:"Turecki",persian:"Perski",polish:"Polski",confirm:"Potwierdź",cancel:"Anuluj",close:"Zamknij",upload_files:"Wgraj pliki",files_will_uploaded_to:"Pliki będą umieszczone w katalogu",select_files:"Wybierz pliki",uploading:"Ładowanie",permissions:"Uprawnienia",select_destination_folder:"Wybierz folder docelowy",source:"Źródło",destination:"Cel",copy_file:"Kopiuj plik",sure_to_delete:"Jesteś pewien, że chcesz skasować",change_name_move:"Zmień nazwę / przenieś",enter_new_name_for:"Wpisz nową nazwę dla",extract_item:"Rozpakuj element",extraction_started:"Rozpakowywanie rozpoczęło się w tle",compression_started:"Kompresowanie rozpoczęło się w tle",enter_folder_name_for_extraction:"Wpisz nazwę folderu do rozpakowania",enter_file_name_for_compression:"Wpisz nazwę folderu do skompresowania",toggle_fullscreen:"Tryb pełnoekranowy",edit_file:"Edytuj plik",file_content:"Zawartość pliku",loading:"Ładowanie",search:"Szukaj",create_folder:"Stwórz folder",create:"Utwórz",folder_name:"Nazwa folderu",upload:"Wgraj",change_permissions:"Zmień uprawnienia",change:"Zmień",details:"Szczegóły",icons:"Ikony",list:"Lista",name:"Nazwa",size:"Rozmiar",actions:"Akcje",date:"Data",selection:"Zaznaczone",no_files_in_folder:"Brak plików w tym folderze",no_folders_in_folder:"Ten folder nie zawiera podfolderów",select_this:"Wybierz ten",go_back:"W górę",wait:"Wait",move:"Przenieś",download:"Pobierz",view_item:"Wyświetl",remove:"Usuń",edit:"Edycja",copy:"Kopiuj",rename:"Zmień nazwę",extract:"Rozpakuj",compress:"Skompresuj",error_invalid_filename:"Błędna nazwa pliku lub plik o takiej nazwie już istnieje, proszę użyć innej nazwy",error_modifying:"Wystąpił błąd podczas modyfikowania pliku",error_deleting:"Wystąpił błąd podczas usuwania pliku lub folderu",error_renaming:"Wystąpił błąd podczas zmiany nazwy pliku",error_copying:"Wystąpił błąd podczas kopiowania pliku",error_compressing:"Wystąpił błąd podczas kompresowania pliku lub folderu",error_extracting:"Wystąpił błąd podczas rozpakowywania pliku",error_creating_folder:"Wystąpił błąd podczas tworzenia nowego folderu",error_getting_content:"Wystąpił błąd podczas pobierania zawartości pliku",error_changing_perms:"Wystąpił błąd podczas zmiany uprawnień pliku",error_uploading_files:"Wystąpił błąd podczas wgrywania plików",sure_to_start_compression_with:"Jesteś pewien, że chcesz skompresować",owner:"Właściciel",group:"Grupa",others:"Inni",read:"Odczyt",write:"Zapis",exec:"Wykonywanie",original:"Oryginał",changes:"Zmiany",recursive:"Rekursywnie",preview:"Podgląd elementu",open:"Otwórz",these_elements:"te {{total}} elementy?",new_folder:"Nowy folder",download_as_zip:"Pobierz jako ZIP"}),e.translations("it",{filemanager:"Gestore File",language:"Lingua",english:"Inglese",spanish:"Spagnolo",portuguese:"Portoghese",french:"Francese",german:"Tedesco",hebrew:"Ebraico",slovak:"Slovacco",chinese:"Cinese",russian:"Russo",ukrainian:"Ucraino",turkish:"Turco",persian:"Persiano",polish:"Polacco",confirm:"Conferma",cancel:"Annulla",close:"Chiudi",upload_files:"Carica files",files_will_uploaded_to:"I files saranno caricati in",select_files:"Seleziona i files",uploading:"Trasferimento",permissions:"Permessi",select_destination_folder:"Select carterlla di destinazione",source:"Sorgente",destination:"Destinazione",copy_file:"Copia file",sure_to_delete:"Sicuro di voler eliminare",change_name_move:"Rinomina / sposta",enter_new_name_for:"Inserisci nuovo nome per",extract_item:"Estrai elemento",extraction_started:"Decompressione avviata da un processo in background",compression_started:"Compressione avviata da un processo in background",enter_folder_name_for_extraction:"Inserisci nome cartella per l'estrazione di",enter_file_name_for_compression:"Inserisci nome file per la compressione di",toggle_fullscreen:"Passa a schermo intero",edit_file:"Modifica file",file_content:"Contenuto del file",loading:"Caricamento",search:"Cerca",create_folder:"Crea cartella",create:"Crea",folder_name:"Nome cartella",upload:"Upload",change_permissions:"Modifica permessi",change:"Modifica",details:"Dettagli",icons:"Icone",list:"Lista",name:"Nome",size:"Dimensione",actions:"Azioni",date:"Data",selection:"Selezione",no_files_in_folder:"Nessun file nella cartella",no_folders_in_folder:"Questa cartella non contiene altre cartelle",select_this:"Seleziona questo",go_back:"Indietro",wait:"Attendere",move:"Sposta",download:"Scarica",view_item:"Visualizza elemento",remove:"Elimina",edit:"Modifica",copy:"Copia",rename:"Rinomina",extract:"Estrai",compress:"Comprimi",error_invalid_filename:"Nome file non valido o già esistente, specificarne un'altro",error_modifying:"Errore durante la modifica del file",error_deleting:"Errore durante l'eliminazione del file o della cartella",error_renaming:"Errore durante la rinomina del file",error_copying:"Errore durante la copia del file",error_compressing:"Errore durante la compressione del file o della cartella",error_extracting:"Errore durante l'estrazione del file",error_creating_folder:"Errore nella creazione della cartella",error_getting_content:"Errore nel recupero del contenuto del file",error_changing_perms:"Errore durante la modifica dei permessi del file",error_uploading_files:"Errore durante il trasferimento dei files",sure_to_start_compression_with:"Sicuro di voler comprimere",owner:"Proprietario",group:"Gruppo",others:"Altri",read:"Lettura",write:"Scrittura",exec:"Esecuzione",original:"Originario",changes:"Cambiamenti",recursive:"Ricorsivo",preview:"Anteprima",open:"Apri",these_elements:"questi {{total}} elementi",new_folder:"Nuova cartella",download_as_zip:"Scarica come file ZIP"})}])}(angular),function(e){"use strict";var r=e.module("FileManagerApp");r.filter("strLimit",["$filter",function(e){return function(r,n,i){return r.length<=n?r:e("limitTo")(r,n)+(i||"...")}}]),r.filter("fileExtension",["$filter",function(e){return function(r){return/\./.test(r)&&e("strLimit")(r.split(".").pop(),3,"..")||""}}]),r.filter("formatDate",["$filter",function(){return function(e){return e instanceof Date?e.toISOString().substring(0,19).replace("T"," "):(e.toLocaleString||e.toString).apply(e)}}]),r.filter("humanReadableFileSize",["$filter","fileManagerConfig",function(e,r){var n=[" kB"," MB"," GB"," TB","PB","EB","ZB","YB"],i=["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"];return function(e){var a=-1,t=e;do t/=1024,a++;while(t>1024);var o=r.useBinarySizePrefixes?i[a]:n[a];return Math.max(t,.1).toFixed(1)+" "+o}}])}(angular),function(e,r){"use strict";e.module("FileManagerApp").service("apiHandler",["$http","$q","$window","$translate","Upload",function(e,n,i,a,t){e.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";var o=function(){this.inprocess=!1,this.asyncSuccess=!1,this.error=""};return o.prototype.deferredHandler=function(e,r,n,i){return e&&"object"==typeof e||(this.error="Error %s - Bridge response error, please check the API docs or this ajax response.".replace("%s",n)),404==n&&(this.error="Error 404 - Backend bridge is not working, please check the ajax response."),e.result&&e.result.error&&(this.error=e.result.error),!this.error&&e.error&&(this.error=e.error.message),!this.error&&i&&(this.error=i),this.error?r.reject(e):r.resolve(e)},o.prototype.list=function(r,i,a,t){var o=this,s=a||o.deferredHandler,l=n.defer(),d={action:"list",path:i,fileExtensions:t&&t.length?t:void 0};return o.inprocess=!0,o.error="",e.post(r,d).success(function(e,r){s(e,l,r)}).error(function(e,r){s(e,l,r,"Unknown error listing, check the response")})["finally"](function(){o.inprocess=!1}),l.promise},o.prototype.copy=function(r,i,t,o){var s=this,l=n.defer(),d={action:"copy",items:i,newPath:t};return o&&1===i.length&&(d.singleFilename=o),s.inprocess=!0,s.error="",e.post(r,d).success(function(e,r){s.deferredHandler(e,l,r)}).error(function(e,r){s.deferredHandler(e,l,r,a.instant("error_copying"))})["finally"](function(){s.inprocess=!1}),l.promise},o.prototype.move=function(r,i,t){var o=this,s=n.defer(),l={action:"move",items:i,newPath:t};return o.inprocess=!0,o.error="",e.post(r,l).success(function(e,r){o.deferredHandler(e,s,r)}).error(function(e,r){o.deferredHandler(e,s,r,a.instant("error_moving"))})["finally"](function(){o.inprocess=!1}),s.promise},o.prototype.remove=function(r,i){var t=this,o=n.defer(),s={action:"remove",items:i};return t.inprocess=!0,t.error="",e.post(r,s).success(function(e,r){t.deferredHandler(e,o,r)}).error(function(e,r){t.deferredHandler(e,o,r,a.instant("error_deleting"))})["finally"](function(){t.inprocess=!1}),o.promise},o.prototype.upload=function(e,r,i){var a=this,o=n.defer();a.inprocess=!0,a.progress=0,a.error="";for(var s={destination:r},l=0;l<i.length;l++)s["file-"+l]=i[l];return i&&i.length&&t.upload({url:e,data:s}).then(function(e){a.deferredHandler(e.data,o,e.status)},function(e){a.deferredHandler(e.data,o,e.status,"Unknown error uploading files")},function(e){a.progress=Math.min(100,parseInt(100*e.loaded/e.total))-1})["finally"](function(){a.inprocess=!1,a.progress=0}),o.promise},o.prototype.getContent=function(r,i){var t=this,o=n.defer(),s={action:"getContent",item:i};return t.inprocess=!0,t.error="",e.post(r,s).success(function(e,r){t.deferredHandler(e,o,r)}).error(function(e,r){t.deferredHandler(e,o,r,a.instant("error_getting_content"))})["finally"](function(){t.inprocess=!1}),o.promise},o.prototype.edit=function(r,i,t){var o=this,s=n.defer(),l={action:"edit",item:i,content:t};return o.inprocess=!0,o.error="",e.post(r,l).success(function(e,r){o.deferredHandler(e,s,r)}).error(function(e,r){o.deferredHandler(e,s,r,a.instant("error_modifying"))})["finally"](function(){o.inprocess=!1}),s.promise},o.prototype.rename=function(r,i,t){var o=this,s=n.defer(),l={action:"rename",item:i,newItemPath:t};return o.inprocess=!0,o.error="",e.post(r,l).success(function(e,r){o.deferredHandler(e,s,r)}).error(function(e,r){o.deferredHandler(e,s,r,a.instant("error_renaming"))})["finally"](function(){o.inprocess=!1}),s.promise},o.prototype.getUrl=function(e,n){var i={action:"download",path:n};return n&&[e,r.param(i)].join("?")},o.prototype.download=function(r,t,o,s,l){var d=this,c=this.getUrl(r,t);if(!s||l||!i.saveAs)return!i.saveAs&&i.console.log("Your browser dont support ajax download, downloading by default"),!!i.open(c,"_blank","");var p=n.defer();return d.inprocess=!0,e.get(c).success(function(e){var r=new i.Blob([e]);p.resolve(e),i.saveAs(r,o)}).error(function(e,r){d.deferredHandler(e,p,r,a.instant("error_downloading"))})["finally"](function(){d.inprocess=!1}),p.promise},o.prototype.downloadMultiple=function(t,o,s,l,d){var c=this,p=n.defer(),m={action:"downloadMultiple",items:o,toFilename:s},u=[t,r.param(m)].join("?");return l&&!d&&i.saveAs?(c.inprocess=!0,e.get(t).success(function(e){var r=new i.Blob([e]);p.resolve(e),i.saveAs(r,s)}).error(function(e,r){c.deferredHandler(e,p,r,a.instant("error_downloading"))})["finally"](function(){c.inprocess=!1}),p.promise):(!i.saveAs&&i.console.log("Your browser dont support ajax download, downloading by default"),!!i.open(u,"_blank",""))},o.prototype.compress=function(r,i,t,o){var s=this,l=n.defer(),d={action:"compress",items:i,destination:o,compressedFilename:t};return s.inprocess=!0,s.error="",e.post(r,d).success(function(e,r){s.deferredHandler(e,l,r)}).error(function(e,r){s.deferredHandler(e,l,r,a.instant("error_compressing"))})["finally"](function(){s.inprocess=!1}),l.promise},o.prototype.extract=function(r,i,t,o){var s=this,l=n.defer(),d={action:"extract",item:i,destination:o,folderName:t};return s.inprocess=!0,s.error="",e.post(r,d).success(function(e,r){s.deferredHandler(e,l,r)}).error(function(e,r){s.deferredHandler(e,l,r,a.instant("error_extracting"))})["finally"](function(){s.inprocess=!1}),l.promise},o.prototype.changePermissions=function(r,i,t,o,s){var l=this,d=n.defer(),c={action:"changePermissions",items:i,perms:t,permsCode:o,recursive:!!s};return l.inprocess=!0,l.error="",e.post(r,c).success(function(e,r){l.deferredHandler(e,d,r)}).error(function(e,r){l.deferredHandler(e,d,r,a.instant("error_changing_perms"))})["finally"](function(){l.inprocess=!1}),d.promise},o.prototype.createFolder=function(r,i){var t=this,o=n.defer(),s={action:"createFolder",newPath:i};return t.inprocess=!0,t.error="",e.post(r,s).success(function(e,r){t.deferredHandler(e,o,r)}).error(function(e,r){t.deferredHandler(e,o,r,a.instant("error_creating_folder"))})["finally"](function(){t.inprocess=!1}),o.promise},o}])}(angular,jQuery),function(e){"use strict";e.module("FileManagerApp").service("apiMiddleware",["$window","fileManagerConfig","apiHandler",function(e,r,n){var i=function(){this.apiHandler=new n};return i.prototype.getPath=function(e){return"/"+e.join("/")},i.prototype.getFileList=function(e){return(e||[]).map(function(e){return e&&e.model.fullPath()})},i.prototype.getFilePath=function(e){return e&&e.model.fullPath()},i.prototype.list=function(e,n){return this.apiHandler.list(r.listUrl,this.getPath(e),n)},i.prototype.copy=function(e,n){var i=this.getFileList(e),a=1===i.length?e[0].tempModel.name:void 0;return this.apiHandler.copy(r.copyUrl,i,this.getPath(n),a)},i.prototype.move=function(e,n){var i=this.getFileList(e);return this.apiHandler.move(r.moveUrl,i,this.getPath(n))},i.prototype.remove=function(e){var n=this.getFileList(e);return this.apiHandler.remove(r.removeUrl,n)},i.prototype.upload=function(n,i){if(!e.FormData)throw new Error("Unsupported browser version");var a=this.getPath(i);return this.apiHandler.upload(r.uploadUrl,a,n)},i.prototype.getContent=function(e){var n=this.getFilePath(e);return this.apiHandler.getContent(r.getContentUrl,n)},i.prototype.edit=function(e){var n=this.getFilePath(e);return this.apiHandler.edit(r.editUrl,n,e.tempModel.content)},i.prototype.rename=function(e){var n=this.getFilePath(e),i=e.tempModel.fullPath();return this.apiHandler.rename(r.renameUrl,n,i)},i.prototype.getUrl=function(e){var n=this.getFilePath(e);return this.apiHandler.getUrl(r.downloadFileUrl,n)},i.prototype.download=function(e,n){var i=this.getFilePath(e),a=e.model.name;return e.isFolder()?void 0:this.apiHandler.download(r.downloadFileUrl,i,a,r.downloadFilesByAjax,n)},i.prototype.downloadMultiple=function(e,n){var i=this.getFileList(e),a=(new Date).getTime().toString().substr(8,13),t=a+"-"+r.multipleDownloadFileName;return this.apiHandler.downloadMultiple(r.downloadMultipleUrl,i,t,r.downloadFilesByAjax,n)},i.prototype.compress=function(e,n,i){var a=this.getFileList(e);return this.apiHandler.compress(r.compressUrl,a,n,this.getPath(i))},i.prototype.extract=function(e,n,i){var a=this.getFilePath(e);return this.apiHandler.extract(r.extractUrl,a,n,this.getPath(i))},i.prototype.changePermissions=function(e,n){var i=this.getFileList(e),a=n.tempModel.perms.toCode(),t=n.tempModel.perms.toOctal(),o=!!n.tempModel.recursive;return this.apiHandler.changePermissions(r.permissionsUrl,i,a,t,o)},i.prototype.createFolder=function(e){var n=e.tempModel.fullPath();return this.apiHandler.createFolder(r.createFolderUrl,n)},i}])}(angular),function(e){"use strict";e.module("FileManagerApp").service("fileNavigator",["apiMiddleware","fileManagerConfig","item",function(e,r,n){var i=function(){this.apiMiddleware=new e,this.requesting=!1,this.fileList=[],this.currentPath=this.getBasePath(),this.history=[],this.error="",this.onRefresh=function(){}};return i.prototype.getBasePath=function(){var e=(r.basePath||"").replace(/^\//,"");return e.trim()?e.split("/"):[]},i.prototype.deferredHandler=function(e,r,n,i){return e&&"object"==typeof e||(this.error="Error %s - Bridge response error, please check the API docs or this ajax response.".replace("%s",n)),404==n&&(this.error="Error 404 - Backend bridge is not working, please check the ajax response."),200==n&&(this.error=null),!this.error&&e.result&&e.result.error&&(this.error=e.result.error),!this.error&&e.error&&(this.error=e.error.message),
-!this.error&&i&&(this.error=i),this.error?r.reject(e):r.resolve(e)},i.prototype.list=function(){return this.apiMiddleware.list(this.currentPath,this.deferredHandler.bind(this))},i.prototype.refresh=function(){var e=this;e.currentPath.length||(e.currentPath=this.getBasePath());var r=e.currentPath.join("/");return e.requesting=!0,e.fileList=[],e.list().then(function(i){e.fileList=(i.result||[]).map(function(r){return new n(r,e.currentPath)}),e.buildTree(r),e.onRefresh()})["finally"](function(){e.requesting=!1})},i.prototype.buildTree=function(e){function r(e,n,i){var a=i?i+"/"+n.model.name:n.model.name;if(e.name&&e.name.trim()&&0!==i.trim().indexOf(e.name)&&(e.nodes=[]),e.name!==i)e.nodes.forEach(function(e){r(e,n,i)});else{for(var t in e.nodes)if(e.nodes[t].name===a)return;e.nodes.push({item:n,name:a,nodes:[]})}e.nodes=e.nodes.sort(function(e,r){return e.name.toLowerCase()<r.name.toLowerCase()?-1:e.name.toLowerCase()===r.name.toLowerCase()?0:1})}function i(e,r){r.push(e);for(var n in e.nodes)i(e.nodes[n],r)}function a(e,r){return e.filter(function(e){return e.name===r})[0]}var t=[],o={};!this.history.length&&this.history.push({name:this.getBasePath()[0]||"",nodes:[]}),i(this.history[0],t),o=a(t,e),o&&(o.nodes=[]);for(var s in this.fileList){var l=this.fileList[s];l instanceof n&&l.isFolder()&&r(this.history[0],l,e)}},i.prototype.folderClick=function(e){this.currentPath=[],e&&e.isFolder()&&(this.currentPath=e.model.fullPath().split("/").splice(1)),this.refresh()},i.prototype.upDir=function(){this.currentPath[0]&&(this.currentPath=this.currentPath.slice(0,-1),this.refresh())},i.prototype.goTo=function(e){this.currentPath=this.currentPath.slice(0,e+1),this.refresh()},i.prototype.fileNameExists=function(e){return this.fileList.find(function(r){return e&&r.model.name.trim()===e.trim()})},i.prototype.listHasFolders=function(){return this.fileList.find(function(e){return"dir"===e.model.type})},i.prototype.getCurrentFolderName=function(){return this.currentPath.slice(-1)[0]||"/"},i}])}(angular),angular.module("FileManagerApp").run(["$templateCache",function(e){e.put("src/templates/current-folder-breadcrumb.html",'<ol class="breadcrumb">\r\n    <li>\r\n        <a href="" ng-click="fileNavigator.goTo(-1)">\r\n            {{ config.appName }}\r\n        </a>\r\n    </li>\r\n    <li ng-repeat="(key, dir) in fileNavigator.currentPath track by key" ng-class="{\'active\':$last}" class="animated fast fadeIn">\r\n        <a href="" ng-show="!$last" ng-click="fileNavigator.goTo(key)">\r\n            {{dir | strLimit : 8}}\r\n        </a>\r\n        <span ng-show="$last">\r\n            {{dir | strLimit : 12}}\r\n        </span>\r\n    </li>\r\n</ol>'),e.put("src/templates/item-context-menu.html",'<div id="context-menu" class="dropdown clearfix animated fast fadeIn">\r\n    <ul class="dropdown-menu dropdown-right-click" role="menu" aria-labelledby="dropdownMenu" ng-show="temps.length">\r\n\r\n        <li ng-show="singleSelection() && singleSelection().isFolder()">\r\n            <a href="" tabindex="-1" ng-click="smartClick(singleSelection())">\r\n                <i class="glyphicon glyphicon-folder-open"></i> {{\'open\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.pickCallback && singleSelection() && singleSelection().isSelectable()">\r\n            <a href="" tabindex="-1" ng-click="config.pickCallback(singleSelection().model)">\r\n                <i class="glyphicon glyphicon-hand-up"></i> {{\'select_this\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.download && !selectionHas(\'dir\') && singleSelection()">\r\n            <a href="" tabindex="-1" ng-click="download()">\r\n                <i class="glyphicon glyphicon-cloud-download"></i> {{\'download\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.downloadMultiple && !selectionHas(\'dir\') && !singleSelection()">\r\n            <a href="" tabindex="-1" ng-click="download()">\r\n                <i class="glyphicon glyphicon-cloud-download"></i> {{\'download_as_zip\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.preview && singleSelection().isImage() && singleSelection()">\r\n            <a href="" tabindex="-1" ng-click="openImagePreview()">\r\n                <i class="glyphicon glyphicon-picture"></i> {{\'view_item\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.rename && singleSelection()">\r\n            <a href="" tabindex="-1" ng-click="modal(\'rename\')">\r\n                <i class="glyphicon glyphicon-edit"></i> {{\'rename\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.move">\r\n            <a href="" tabindex="-1" ng-click="modalWithPathSelector(\'move\')">\r\n                <i class="glyphicon glyphicon-arrow-right"></i> {{\'move\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.copy && !selectionHas(\'dir\')">\r\n            <a href="" tabindex="-1" ng-click="modalWithPathSelector(\'copy\')">\r\n                <i class="glyphicon glyphicon-log-out"></i> {{\'copy\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.edit && singleSelection() && singleSelection().isEditable()">\r\n            <a href="" tabindex="-1" ng-click="openEditItem()">\r\n                <i class="glyphicon glyphicon-pencil"></i> {{\'edit\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.changePermissions">\r\n            <a href="" tabindex="-1" ng-click="modal(\'changepermissions\')">\r\n                <i class="glyphicon glyphicon-lock"></i> {{\'permissions\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.compress && (!singleSelection() || selectionHas(\'dir\'))">\r\n            <a href="" tabindex="-1" ng-click="modal(\'compress\')">\r\n                <i class="glyphicon glyphicon-compressed"></i> {{\'compress\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.extract && singleSelection() && singleSelection().isExtractable()">\r\n            <a href="" tabindex="-1" ng-click="modal(\'extract\')">\r\n                <i class="glyphicon glyphicon-export"></i> {{\'extract\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li class="divider" ng-show="config.allowedActions.remove"></li>\r\n        \r\n        <li ng-show="config.allowedActions.remove">\r\n            <a href="" tabindex="-1" ng-click="modal(\'remove\')">\r\n                <i class="glyphicon glyphicon-trash"></i> {{\'remove\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n    </ul>\r\n\r\n    <ul class="dropdown-menu dropdown-right-click" role="menu" aria-labelledby="dropdownMenu" ng-show="!temps.length">\r\n        <li ng-show="config.allowedActions.createFolder">\r\n            <a href="" tabindex="-1" ng-click="modal(\'newfolder\') && prepareNewFolder()">\r\n                <i class="glyphicon glyphicon-plus"></i> {{\'new_folder\' | translate}}\r\n            </a>\r\n        </li>\r\n        <li ng-show="config.allowedActions.upload">\r\n            <a href="" tabindex="-1" ng-click="modal(\'uploadfile\')">\r\n                <i class="glyphicon glyphicon-cloud-upload"></i> {{\'upload_files\' | translate}}\r\n            </a>\r\n        </li>\r\n    </ul>\r\n</div>'),e.put("src/templates/main-icons.html",'<div class="iconset noselect">\r\n    <div class="item-list clearfix" ng-click="selectOrUnselect(null, $event)" ng-right-click="selectOrUnselect(null, $event)" prevent="true">\r\n        <div class="col-120" ng-repeat="item in $parent.fileList = (fileNavigator.fileList | filter: {model:{name: query}})" ng-show="!fileNavigator.requesting && !fileNavigator.error">\r\n            <a href="" class="thumbnail text-center" ng-click="selectOrUnselect(item, $event)" ng-dblclick="smartClick(item)" ng-right-click="selectOrUnselect(item, $event)" title="{{item.model.name}} ({{item.model.size | humanReadableFileSize}})" ng-class="{selected: isSelected(item)}">\r\n                <div class="item-icon">\r\n                    <i class="glyphicon glyphicon-folder-open" ng-show="item.model.type === \'dir\'"></i>\r\n                    <i class="glyphicon glyphicon-file" data-ext="{{ item.model.name | fileExtension }}" ng-show="item.model.type === \'file\'" ng-class="{\'item-extension\': config.showExtensionIcons}"></i>\r\n                </div>\r\n                {{item.model.name | strLimit : 11 }}\r\n            </a>\r\n        </div>\r\n    </div>\r\n\r\n    <div ng-show="fileNavigator.requesting">\r\n        <div ng-include="config.tplPath + \'/spinner.html\'"></div>\r\n    </div>\r\n\r\n    <div class="alert alert-warning" ng-show="!fileNavigator.requesting && fileNavigator.fileList.length < 1 && !fileNavigator.error">\r\n        {{"no_files_in_folder" | translate}}...\r\n    </div>\r\n    \r\n    <div class="alert alert-danger" ng-show="!fileNavigator.requesting && fileNavigator.error">\r\n        {{ fileNavigator.error }}\r\n    </div>\r\n</div>'),e.put("src/templates/main-table-modal.html",'<table class="table table-condensed table-modal-condensed mb0">\r\n    <thead>\r\n        <tr>\r\n            <th>\r\n                <a href="" ng-click="order(\'model.name\')">\r\n                    {{"name" | translate}}\r\n                    <span class="sortorder" ng-show="predicate[1] === \'model.name\'" ng-class="{reverse:reverse}"></span>\r\n                </a>\r\n            </th>\r\n            <th class="text-right"></th>\r\n        </tr>\r\n    </thead>\r\n    <tbody class="file-item">\r\n        <tr ng-show="fileNavigator.requesting">\r\n            <td colspan="2">\r\n                <div ng-include="config.tplPath + \'/spinner.html\'"></div>\r\n            </td>\r\n        </tr>\r\n        <tr ng-show="!fileNavigator.requesting && !fileNavigator.listHasFolders() && !fileNavigator.error">\r\n            <td>\r\n                {{"no_folders_in_folder" | translate}}...\r\n            </td>\r\n            <td class="text-right">\r\n                <button class="btn btn-sm btn-default" ng-click="fileNavigator.upDir()">{{"go_back" | translate}}</button>\r\n            </td>\r\n        </tr>\r\n        <tr ng-show="!fileNavigator.requesting && fileNavigator.error">\r\n            <td colspan="2">\r\n                {{ fileNavigator.error }}\r\n            </td>\r\n        </tr>\r\n        <tr ng-repeat="item in fileNavigator.fileList | orderBy:predicate:reverse" ng-show="!fileNavigator.requesting && item.model.type === \'dir\'" ng-if="!selectedFilesAreChildOfPath(item)">\r\n            <td>\r\n                <a href="" ng-click="fileNavigator.folderClick(item)" title="{{item.model.name}} ({{item.model.size | humanReadableFileSize}})">\r\n                    <i class="glyphicon glyphicon-folder-close"></i>\r\n                    {{item.model.name | strLimit : 32}}\r\n                </a>\r\n            </td>\r\n            <td class="text-right">\r\n                <button class="btn btn-sm btn-default" ng-click="select(item)">\r\n                    <i class="glyphicon glyphicon-hand-up"></i> {{"select_this" | translate}}\r\n                </button>\r\n            </td>\r\n        </tr>\r\n    </tbody>\r\n</table>'),e.put("src/templates/main-table.html",'<table class="table mb0 table-files noselect">\r\n    <thead>\r\n        <tr>\r\n            <th>\r\n                <a href="" ng-click="order(\'model.name\')">\r\n                    {{"name" | translate}}\r\n                    <span class="sortorder" ng-show="predicate[1] === \'model.name\'" ng-class="{reverse:reverse}"></span>\r\n                </a>\r\n            </th>\r\n            <th class="hidden-xs" ng-hide="config.hideSize">\r\n                <a href="" ng-click="order(\'model.size\')">\r\n                    {{"size" | translate}}\r\n                    <span class="sortorder" ng-show="predicate[1] === \'model.size\'" ng-class="{reverse:reverse}"></span>\r\n                </a>\r\n            </th>\r\n            <th class="hidden-sm hidden-xs" ng-hide="config.hideDate">\r\n                <a href="" ng-click="order(\'model.date\')">\r\n                    {{"date" | translate}}\r\n                    <span class="sortorder" ng-show="predicate[1] === \'model.date\'" ng-class="{reverse:reverse}"></span>\r\n                </a>\r\n            </th>\r\n            <th class="hidden-sm hidden-xs" ng-hide="config.hidePermissions">\r\n                <a href="" ng-click="order(\'model.permissions\')">\r\n                    {{"permissions" | translate}}\r\n                    <span class="sortorder" ng-show="predicate[1] === \'model.permissions\'" ng-class="{reverse:reverse}"></span>\r\n                </a>\r\n            </th>\r\n        </tr>\r\n    </thead>\r\n    <tbody class="file-item">\r\n        <tr ng-show="fileNavigator.requesting">\r\n            <td colspan="5">\r\n                <div ng-include="config.tplPath + \'/spinner.html\'"></div>\r\n            </td>\r\n        </tr>\r\n        <tr ng-show="!fileNavigator.requesting &amp;&amp; fileNavigator.fileList.length < 1 &amp;&amp; !fileNavigator.error">\r\n            <td colspan="5">\r\n                {{"no_files_in_folder" | translate}}...\r\n            </td>\r\n        </tr>\r\n        <tr ng-show="!fileNavigator.requesting &amp;&amp; fileNavigator.error">\r\n            <td colspan="5">\r\n                {{ fileNavigator.error }}\r\n            </td>\r\n        </tr>\r\n        <tr class="item-list" ng-repeat="item in $parent.fileList = (fileNavigator.fileList | filter: {model:{name: query}} | orderBy:predicate:reverse)" ng-show="!fileNavigator.requesting" ng-click="selectOrUnselect(item, $event)" ng-dblclick="smartClick(item)" ng-right-click="selectOrUnselect(item, $event)" ng-class="{selected: isSelected(item)}">\r\n            <td>\r\n                <a href="" title="{{item.model.name}} ({{item.model.size | humanReadableFileSize}})">\r\n                    <i class="glyphicon glyphicon-folder-close" ng-show="item.model.type === \'dir\'"></i>\r\n                    <i class="glyphicon glyphicon-file" ng-show="item.model.type === \'file\'"></i>\r\n                    {{item.model.name | strLimit : 64}}\r\n                </a>\r\n            </td>\r\n            <td class="hidden-xs">\r\n                <span ng-show="item.model.type !== \'dir\' || config.showSizeForDirectories">\r\n                    {{item.model.size | humanReadableFileSize}}\r\n                </span>\r\n            </td>\r\n            <td class="hidden-sm hidden-xs" ng-hide="config.hideDate">\r\n                {{item.model.date | formatDate }}\r\n            </td>\r\n            <td class="hidden-sm hidden-xs" ng-hide="config.hidePermissions">\r\n                {{item.model.perms.toCode(item.model.type === \'dir\'?\'d\':\'-\')}}\r\n            </td>\r\n        </tr>\r\n    </tbody>\r\n</table>\r\n'),e.put("src/templates/main.html",'<div ng-controller="FileManagerCtrl" ngf-drop="addForUpload($files)" ngf-drag-over-class="\'upload-dragover\'" ngf-multiple="true">\r\n    <div ng-include="config.tplPath + \'/navbar.html\'"></div>\r\n\r\n    <div class="container-fluid">\r\n        <div class="row">\r\n\r\n            <div class="col-sm-4 col-md-3 sidebar file-tree animated slow fadeIn" ng-include="config.tplPath + \'/sidebar.html\'" ng-show="config.sidebar &amp;&amp; fileNavigator.history[0]">\r\n            </div>\r\n\r\n            <div class="main" ng-class="config.sidebar &amp;&amp; fileNavigator.history[0] &amp;&amp; \'col-sm-8 col-md-9\'">\r\n                <div ng-include="config.tplPath + \'/\' + viewTemplate" class="main-navigation clearfix"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <div ng-include="config.tplPath + \'/modals.html\'"></div>\r\n    <div ng-include="config.tplPath + \'/item-context-menu.html\'"></div>\r\n</div>\r\n'),e.put("src/templates/modals.html",'<div class="modal animated fadeIn" id="imagepreview">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n      <div class="modal-header">\r\n        <button type="button" class="close" data-dismiss="modal">\r\n            <span aria-hidden="true">&times;</span>\r\n            <span class="sr-only">{{"close" | translate}}</span>\r\n        </button>\r\n        <h4 class="modal-title">{{"preview" | translate}}</h4>\r\n      </div>\r\n      <div class="modal-body">\r\n        <div class="text-center">\r\n          <img id="imagepreview-target" class="preview" alt="{{singleSelection().model.name}}" ng-class="{\'loading\': apiMiddleware.apiHandler.inprocess}">\r\n          <span class="label label-warning" ng-show="apiMiddleware.apiHandler.inprocess">{{\'loading\' | translate}} ...</span>\r\n        </div>\r\n        <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n      </div>\r\n      <div class="modal-footer">\r\n        <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="remove">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n    <form ng-submit="remove()">\r\n      <div class="modal-header">\r\n        <button type="button" class="close" data-dismiss="modal">\r\n            <span aria-hidden="true">&times;</span>\r\n            <span class="sr-only">{{"close" | translate}}</span>\r\n        </button>\r\n        <h4 class="modal-title">{{"confirm" | translate}}</h4>\r\n      </div>\r\n      <div class="modal-body">\r\n        {{\'sure_to_delete\' | translate}} <span ng-include data-src="\'selected-files-msg\'"></span>\r\n\r\n        <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n      </div>\r\n      <div class="modal-footer">\r\n        <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n        <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess" autofocus="autofocus">{{"remove" | translate}}</button>\r\n      </div>\r\n      </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="move">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="move()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'move\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <div ng-include data-src="\'path-selector\'" class="clearfix"></div>\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n              <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'move\' | translate}}</button>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n\r\n<div class="modal animated fadeIn" id="rename">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="rename()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'rename\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <label class="radio">{{\'enter_new_name_for\' | translate}} <b>{{singleSelection() && singleSelection().model.name}}</b></label>\r\n              <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\r\n\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n              <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'rename\' | translate}}</button>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="copy">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="copy()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'copy_file\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <div ng-show="singleSelection()">\r\n                <label class="radio">{{\'enter_new_name_for\' | translate}} <b>{{singleSelection().model.name}}</b></label>\r\n                <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\r\n              </div>\r\n\r\n              <div ng-include data-src="\'path-selector\'" class="clearfix"></div>\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n              <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"copy" | translate}}</button>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="compress">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="compress()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'compress\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <div class="label label-success error-msg">{{\'compression_started\' | translate}}</div>\r\n              </div>\r\n              <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <div ng-hide="config.allowedActions.compressChooseName">\r\n                    {{\'sure_to_start_compression_with\' | translate}} <b>{{singleSelection().model.name}}</b> ?\r\n                  </div>\r\n                  <div ng-show="config.allowedActions.compressChooseName">\r\n                    <label class="radio">\r\n                      {{\'enter_file_name_for_compression\' | translate}}\r\n                      <span ng-include data-src="\'selected-files-msg\'"></span>\r\n                    </label>\r\n                    <input class="form-control" ng-model="temp.tempModel.name" autofocus="autofocus">\r\n                  </div>\r\n              </div>\r\n\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n              </div>\r\n              <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n                  <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'compress\' | translate}}</button>\r\n              </div>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="extract" ng-init="singleSelection().emptyName()">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="extract()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'extract_item\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <div class="label label-success error-msg">{{\'extraction_started\' | translate}}</div>\r\n              </div>\r\n              <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <label class="radio">{{\'enter_folder_name_for_extraction\' | translate}} <b>{{singleSelection().model.name}}</b></label>\r\n                  <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\r\n              </div>\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n              </div>\r\n              <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n                  <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'extract\' | translate}}</button>\r\n              </div>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="edit" ng-class="{\'modal-fullscreen\': fullscreen}">\r\n  <div class="modal-dialog modal-lg">\r\n    <div class="modal-content">\r\n        <form ng-submit="edit()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <button type="button" class="close fullscreen" ng-click="fullscreen=!fullscreen">\r\n                  <i class="glyphicon glyphicon-fullscreen"></i>\r\n                  <span class="sr-only">{{\'toggle_fullscreen\' | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'edit_file\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n                <label class="radio bold">{{ singleSelection().model.fullPath() }}</label>\r\n                <span class="label label-warning" ng-show="apiMiddleware.apiHandler.inprocess">{{\'loading\' | translate}} ...</span>\r\n                <textarea class="form-control code" ng-model="singleSelection().tempModel.content" ng-show="!apiMiddleware.apiHandler.inprocess" autofocus="autofocus"></textarea>\r\n                <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'close\' | translate}}</button>\r\n              <button type="submit" class="btn btn-primary" ng-show="config.allowedActions.edit" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'edit\' | translate}}</button>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="newfolder">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="createFolder()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'new_folder\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <label class="radio">{{\'folder_name\' | translate}}</label>\r\n              <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n              <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'create\' | translate}}</button>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="uploadfile">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="uploadFiles()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{"upload_files" | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <label class="radio">\r\n                {{"files_will_uploaded_to" | translate}} \r\n                <b>/{{fileNavigator.currentPath.join(\'/\')}}</b>\r\n              </label>\r\n              <button class="btn btn-default btn-block" ngf-select="$parent.addForUpload($files)" ngf-multiple="true">\r\n                {{"select_files" | translate}}\r\n              </button>\r\n              \r\n              <div class="upload-list">\r\n                <ul class="list-group">\r\n                  <li class="list-group-item" ng-repeat="(index, uploadFile) in $parent.uploadFileList">\r\n                    <button class="btn btn-sm btn-danger pull-right" ng-click="$parent.removeFromUpload(index)">\r\n                        &times;\r\n                    </button>\r\n                    <h5 class="list-group-item-heading">{{uploadFile.name}}</h5>\r\n                    <p class="list-group-item-text">{{uploadFile.size | humanReadableFileSize}}</p>\r\n                  </li>\r\n                </ul>\r\n                <div ng-show="apiMiddleware.apiHandler.inprocess">\r\n                  <em>{{"uploading" | translate}}... {{apiMiddleware.apiHandler.progress}}%</em>\r\n                  <div class="progress mb0">\r\n                    <div class="progress-bar active" role="progressbar" aria-valuenow="{{apiMiddleware.apiHandler.progress}}" aria-valuemin="0" aria-valuemax="100" style="width: {{apiMiddleware.apiHandler.progress}}%"></div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <div>\r\n                  <button type="button" class="btn btn-default" data-dismiss="modal">{{"cancel" | translate}}</button>\r\n                  <button type="submit" class="btn btn-primary" ng-disabled="!$parent.uploadFileList.length || apiMiddleware.apiHandler.inprocess">{{\'upload\' | translate}}</button>\r\n              </div>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="changepermissions">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="changePermissions()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'change_permissions\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <table class="table mb0">\r\n                  <thead>\r\n                      <tr>\r\n                          <th>{{\'permissions\' | translate}}</th>\r\n                          <th class="col-xs-1 text-center">{{\'read\' | translate}}</th>\r\n                          <th class="col-xs-1 text-center">{{\'write\' | translate}}</th>\r\n                          <th class="col-xs-1 text-center">{{\'exec\' | translate}}</th>\r\n                      </tr>\r\n                  </thead>\r\n                  <tbody>\r\n                      <tr ng-repeat="(permTypeKey, permTypeValue) in temp.tempModel.perms">\r\n                          <td>{{permTypeKey | translate}}</td>\r\n                          <td ng-repeat="(permKey, permValue) in permTypeValue" class="col-xs-1 text-center" ng-click="main()">\r\n                              <label class="col-xs-12">\r\n                                <input type="checkbox" ng-model="temp.tempModel.perms[permTypeKey][permKey]">\r\n                              </label>\r\n                          </td>\r\n                      </tr>\r\n                </tbody>\r\n              </table>\r\n              <div class="checkbox" ng-show="config.enablePermissionsRecursive && selectionHas(\'dir\')">\r\n                <label>\r\n                  <input type="checkbox" ng-model="temp.tempModel.recursive"> {{\'recursive\' | translate}}\r\n                </label>\r\n              </div>\r\n              <div class="clearfix mt10">\r\n                  <span class="label label-primary pull-left" ng-hide="temp.multiple">\r\n                    {{\'original\' | translate}}: \r\n                    {{temp.model.perms.toCode(selectionHas(\'dir\') ? \'d\':\'-\')}} \r\n                    ({{temp.model.perms.toOctal()}})\r\n                  </span>\r\n                  <span class="label label-primary pull-right">\r\n                    {{\'changes\' | translate}}: \r\n                    {{temp.tempModel.perms.toCode(selectionHas(\'dir\') ? \'d\':\'-\')}} \r\n                    ({{temp.tempModel.perms.toOctal()}})\r\n                  </span>\r\n              </div>\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <button type="button" class="btn btn-default" data-dismiss="modal">{{"cancel" | translate}}</button>\r\n              <button type="submit" class="btn btn-primary" ng-disabled="">{{\'change\' | translate}}</button>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="selector" ng-controller="ModalFileManagerCtrl">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n      <div class="modal-header">\r\n        <button type="button" class="close" data-dismiss="modal">\r\n            <span aria-hidden="true">&times;</span>\r\n            <span class="sr-only">{{"close" | translate}}</span>\r\n        </button>\r\n        <h4 class="modal-title">{{"select_destination_folder" | translate}}</h4>\r\n      </div>\r\n      <div class="modal-body">\r\n        <div>\r\n            <div ng-include="config.tplPath + \'/current-folder-breadcrumb.html\'"></div>\r\n            <div ng-include="config.tplPath + \'/main-table-modal.html\'"></div>\r\n            <hr />\r\n            <button class="btn btn-sm btn-default" ng-click="selectCurrent()">\r\n                <i class="glyphicon"></i> {{"select_this" | translate}}\r\n            </button>\r\n        </div>\r\n      </div>\r\n      <div class="modal-footer">\r\n        <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<script type="text/ng-template" id="path-selector">\r\n  <div class="panel panel-primary mt10 mb0">\r\n    <div class="panel-body">\r\n        <div class="detail-sources">\r\n          <div class="like-code mr5"><b>{{"selection" | translate}}:</b>\r\n            <span ng-include="\'selected-files-msg\'"></span>\r\n          </div>\r\n        </div>\r\n        <div class="detail-sources">\r\n          <div class="like-code mr5">\r\n            <b>{{"destination" | translate}}:</b> {{ getSelectedPath() }}\r\n          </div>\r\n          <a href="" class="label label-primary" ng-click="openNavigator(fileNavigator.currentPath)">\r\n            {{\'change\' | translate}}\r\n          </a>\r\n        </div>\r\n    </div>\r\n  </div>\r\n</script>\r\n\r\n<script type="text/ng-template" id="error-bar">\r\n  <div class="label label-danger error-msg pull-left animated fadeIn" ng-show="apiMiddleware.apiHandler.error">\r\n    <i class="glyphicon glyphicon-remove-circle"></i>\r\n    <span>{{apiMiddleware.apiHandler.error}}</span>\r\n  </div>\r\n</script>\r\n\r\n<script type="text/ng-template" id="selected-files-msg">\r\n  <span ng-show="temps.length == 1">\r\n    {{singleSelection().model.name}}\r\n  </span>\r\n  <span ng-show="temps.length > 1">\r\n    {{\'these_elements\' | translate:totalSelecteds()}}\r\n    <a href="" class="label label-primary" ng-click="showDetails = !showDetails">\r\n      {{showDetails ? \'-\' : \'+\'}} {{\'details\' | translate}}\r\n    </a>\r\n  </span>\r\n  <div ng-show="temps.length > 1 &amp;&amp; showDetails">\r\n    <ul class="selected-file-details">\r\n      <li ng-repeat="tempItem in temps">\r\n        <b>{{tempItem.model.name}}</b>\r\n      </li>\r\n    </ul>\r\n  </div>\r\n</script>\r\n'),
-e.put("src/templates/navbar.html",'<nav class="navbar navbar-inverse">\r\n    <div class="container-fluid">\r\n        <div class="row">\r\n            <div class="col-sm-9 col-md-10 hidden-xs">\r\n                <div ng-show="!config.breadcrumb">\r\n                    <a class="navbar-brand hidden-xs ng-binding" href="">angular-filemanager</a>\r\n                </div>\r\n                <div ng-include="config.tplPath + \'/current-folder-breadcrumb.html\'" ng-show="config.breadcrumb">\r\n                </div>\r\n            </div>\r\n            <div class="col-sm-3 col-md-2">\r\n                <div class="navbar-collapse">\r\n                    <div class="navbar-form navbar-right text-right">\r\n                        <div class="pull-left visible-xs" ng-if="fileNavigator.currentPath.length">\r\n                            <button class="btn btn-primary btn-flat" ng-click="fileNavigator.upDir()">\r\n                                <i class="glyphicon glyphicon-chevron-left"></i>\r\n                            </button>\r\n                            {{fileNavigator.getCurrentFolderName() | strLimit : 12}}\r\n                        </div>\r\n                        <div class="btn-group">\r\n                            <button class="btn btn-flat btn-sm dropdown-toggle" type="button" id="dropDownMenuSearch" data-toggle="dropdown" aria-expanded="true">\r\n                                <i class="glyphicon glyphicon-search mr2"></i>\r\n                            </button>\r\n                            <div class="dropdown-menu animated fast fadeIn pull-right" role="menu" aria-labelledby="dropDownMenuLang">\r\n                                <input type="text" class="form-control" ng-show="config.searchForm" placeholder="{{\'search\' | translate}}..." ng-model="$parent.query">\r\n                            </div>\r\n                        </div>\r\n\r\n                        <button class="btn btn-flat btn-sm" ng-click="$parent.setTemplate(\'main-icons.html\')" ng-show="$parent.viewTemplate !==\'main-icons.html\'" title="{{\'icons\' | translate}}">\r\n                            <i class="glyphicon glyphicon-th-large"></i>\r\n                        </button>\r\n\r\n                        <button class="btn btn-flat btn-sm" ng-click="$parent.setTemplate(\'main-table.html\')" ng-show="$parent.viewTemplate !==\'main-table.html\'" title="{{\'list\' | translate}}">\r\n                            <i class="glyphicon glyphicon-th-list"></i>\r\n                        </button>\r\n\r\n                        <div class="btn-group">\r\n                            <button class="btn btn-flat btn-sm dropdown-toggle" type="button" id="dropDownMenuLang" data-toggle="dropdown" aria-expanded="true">\r\n                                <i class="glyphicon glyphicon-globe mr2"></i>\r\n                            </button>\r\n\r\n                            <ul class="dropdown-menu scrollable-menu animated fast fadeIn pull-right" role="menu" aria-labelledby="dropDownMenuLang">\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'en\')">{{"english" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'zh\')">{{"chinese" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'es\')">{{"spanish" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'pt\')">{{"portuguese" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'fr\')">{{"french" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'de\')">{{"german" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'he\')">{{"hebrew" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'it\')">{{"italian" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'sk\')">{{"slovak" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'ru\')">{{"russian" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'ua\')">{{"ukrainian" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'tr\')">{{"turkish" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'fa\')">{{"persian" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'pl\')">{{"polish" | translate}}</a></li>\r\n                            </ul>\r\n                        </div>\r\n\r\n                        <div class="btn-group">\r\n                            <button class="btn btn-flat btn-sm dropdown-toggle" type="button" id="more" data-toggle="dropdown" aria-expanded="true">\r\n                                <i class="glyphicon glyphicon-option-vertical"></i>\r\n                            </button>\r\n\r\n                            <ul class="dropdown-menu scrollable-menu animated fast fadeIn pull-right" role="menu" aria-labelledby="more">\r\n                                <li role="presentation" ng-show="config.allowedActions.createFolder" ng-click="modal(\'newfolder\') && prepareNewFolder()">\r\n                                    <a href="" role="menuitem" tabindex="-1">\r\n                                        <i class="glyphicon glyphicon-plus"></i> {{"new_folder" | translate}}\r\n                                    </a>\r\n                                </li>\r\n                                <li role="presentation" ng-show="config.allowedActions.upload" ng-click="modal(\'uploadfile\')">\r\n                                    <a href="" role="menuitem" tabindex="-1">\r\n                                        <i class="glyphicon glyphicon-cloud-upload"></i> {{"upload_files" | translate}}\r\n                                    </a>\r\n                                </li>\r\n                            </ul>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</nav>\r\n'),e.put("src/templates/sidebar.html",'<ul class="nav nav-sidebar file-tree-root">\r\n    <li ng-repeat="item in fileNavigator.history" ng-include="\'folder-branch-item\'" ng-class="{\'active\': item.name == fileNavigator.currentPath.join(\'/\')}"></li>\r\n</ul>\r\n\r\n<script type="text/ng-template" id="folder-branch-item">\r\n    <a href="" ng-click="fileNavigator.folderClick(item.item)" class="animated fast fadeInDown">\r\n\r\n        <span class="point">\r\n            <i class="glyphicon glyphicon-chevron-down" ng-show="isInThisPath(item.name)"></i>\r\n            <i class="glyphicon glyphicon-chevron-right" ng-show="!isInThisPath(item.name)"></i>\r\n        </span>\r\n\r\n        <i class="glyphicon glyphicon-folder-open mr2" ng-show="isInThisPath(item.name)"></i>\r\n        <i class="glyphicon glyphicon-folder-close mr2" ng-show="!isInThisPath(item.name)"></i>\r\n        {{ (item.name.split(\'/\').pop() || fileNavigator.getBasePath().join(\'/\') || \'/\') | strLimit : 30 }}\r\n    </a>\r\n    <ul class="nav nav-sidebar">\r\n        <li ng-repeat="item in item.nodes" ng-include="\'folder-branch-item\'" ng-class="{\'active\': item.name == fileNavigator.currentPath.join(\'/\')}"></li>\r\n    </ul>\r\n</script>'),e.put("src/templates/spinner.html",'<div class="spinner-wrapper col-xs-12">\r\n    <svg class="spinner-container" style="width:65px;height:65px" viewBox="0 0 44 44">\r\n        <circle class="path" cx="22" cy="22" r="20" fill="none" stroke-width="4"></circle>\r\n    </svg>\r\n</div>')}]);
\ No newline at end of file
+!function(e,r,n){"use strict";r.module("FileManagerApp",["pascalprecht.translate","ngFileUpload"]),n(e.document).on("shown.bs.modal",".modal",function(){e.setTimeout(function(){n("[autofocus]",this).focus()}.bind(this),100)}),n(e.document).on("click",function(){n("#context-menu").hide()}),n(e.document).on("contextmenu",'.main-navigation .table-files tr.item-list:has("td"), .item-list',function(r){var i=n("#context-menu");r.pageX>=e.innerWidth-i.width()&&(r.pageX-=i.width()),r.pageY>=e.innerHeight-i.height()&&(r.pageY-=i.height()),i.hide().css({left:r.pageX,top:r.pageY}).appendTo("body").show(),r.preventDefault()}),Array.prototype.find||(Array.prototype.find=function(e){if(null==this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof e)throw new TypeError("predicate must be a function");for(var r,n=Object(this),i=n.length>>>0,a=arguments[1],t=0;t<i;t++)if(r=n[t],e.call(a,r,t,n))return r})}(window,angular,jQuery),function(e,r){"use strict";e.module("FileManagerApp").controller("FileManagerCtrl",["$scope","$rootScope","$window","$translate","fileManagerConfig","item","fileNavigator","apiMiddleware",function(e,n,i,a,t,o,s,l){var d=i.localStorage;e.config=t,e.reverse=!1,e.predicate=["model.type","model.name"],e.order=function(r){e.reverse=e.predicate[1]===r&&!e.reverse,e.predicate[1]=r},e.query="",e.fileNavigator=new s,e.apiMiddleware=new l,e.uploadFileList=[],e.viewTemplate=d.getItem("viewTemplate")||"main-icons.html",e.fileList=[],e.temps=[],e.$watch("temps",function(){e.singleSelection()?e.temp=e.singleSelection():(e.temp=new o({rights:644}),e.temp.multiple=!0),e.temp.revert()}),e.fileNavigator.onRefresh=function(){e.temps=[],e.query="",n.selectedModalPath=e.fileNavigator.currentPath},e.setTemplate=function(r){d.setItem("viewTemplate",r),e.viewTemplate=r},e.changeLanguage=function(e){return e?(d.setItem("language",e),a.use(e)):void a.use(d.getItem("language")||t.defaultLang)},e.isSelected=function(r){return e.temps.indexOf(r)!==-1},e.selectOrUnselect=function(r,n){var i=e.temps.indexOf(r),a=n&&3==n.which;if(n&&n.target.hasAttribute("prevent"))return void(e.temps=[]);if(!(!r||a&&e.isSelected(r))){if(n&&n.shiftKey&&!a){var t=e.fileList,o=t.indexOf(r),s=e.temps[0],l=t.indexOf(s),d=void 0;if(s&&t.indexOf(s)<o){for(e.temps=[];l<=o;)d=t[l],!e.isSelected(d)&&e.temps.push(d),l++;return}if(s&&t.indexOf(s)>o){for(e.temps=[];l>=o;)d=t[l],!e.isSelected(d)&&e.temps.push(d),l--;return}}return n&&!a&&(n.ctrlKey||n.metaKey)?void(e.isSelected(r)?e.temps.splice(i,1):e.temps.push(r)):void(e.temps=[r])}},e.singleSelection=function(){return 1===e.temps.length&&e.temps[0]},e.totalSelecteds=function(){return{total:e.temps.length}},e.selectionHas=function(r){return e.temps.find(function(e){return e&&e.model.type===r})},e.prepareNewFolder=function(){var r=new o(null,e.fileNavigator.currentPath);return e.temps=[r],r},e.smartClick=function(r){var n=e.config.allowedActions.pickFiles;if(r.isFolder())return e.fileNavigator.folderClick(r);if("function"==typeof e.config.pickCallback&&n){var i=e.config.pickCallback(r.model);if(i===!0)return}return r.isImage()?e.config.previewImagesInModal?e.openImagePreview(r):e.apiMiddleware.download(r,!0):r.isEditable()?e.openEditItem(r):void 0},e.openImagePreview=function(){var r=e.singleSelection();e.apiMiddleware.apiHandler.inprocess=!0,e.modal("imagepreview",null,!0).find("#imagepreview-target").attr("src",e.apiMiddleware.getUrl(r)).unbind("load error").on("load error",function(){e.apiMiddleware.apiHandler.inprocess=!1,e.$apply()})},e.openDwonloadLink=function(){var r=e.singleSelection();e.modal("downloadlink",null,!0).find("#downloadlink-target").val(window.location.href+""+e.apiMiddleware.getUrl(r)).on("focus",function(){this.select()})},e.openEditItem=function(){var r=e.singleSelection();e.apiMiddleware.getContent(r).then(function(e){r.tempModel.content=r.model.content=e.result}),e.modal("edit")},e.modal=function(n,i,a){var t=r("#"+n);return t.modal(i?"hide":"show"),e.apiMiddleware.apiHandler.error="",e.apiMiddleware.apiHandler.asyncSuccess=!1,!a||t},e.modalWithPathSelector=function(r){return n.selectedModalPath=e.fileNavigator.currentPath,e.modal(r)},e.isInThisPath=function(r){var n=e.fileNavigator.currentPath.join("/")+"/";return n.indexOf(r+"/")!==-1},e.edit=function(){e.apiMiddleware.edit(e.singleSelection()).then(function(){e.modal("edit",!0)})},e.changePermissions=function(){e.apiMiddleware.changePermissions(e.temps,e.temp).then(function(){e.modal("changepermissions",!0)})},e.download=function(){var r=e.singleSelection();if(!e.selectionHas("dir"))return r?e.apiMiddleware.download(r):e.apiMiddleware.downloadMultiple(e.temps)},e.copy=function(){var r=e.singleSelection();if(r){var i=r.tempModel.name.trim(),t=e.fileNavigator.fileNameExists(i);if(t&&c(r))return e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1;if(!i)return e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1}e.apiMiddleware.copy(e.temps,n.selectedModalPath).then(function(){e.fileNavigator.refresh(),e.modal("copy",!0)})},e.compress=function(){var r=e.temp.tempModel.name.trim(),i=e.fileNavigator.fileNameExists(r);return i&&c(e.temp)?(e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1):r?void e.apiMiddleware.compress(e.temps,r,n.selectedModalPath).then(function(){return e.fileNavigator.refresh(),e.config.compressAsync?void(e.apiMiddleware.apiHandler.asyncSuccess=!0):e.modal("compress",!0)},function(){e.apiMiddleware.apiHandler.asyncSuccess=!1}):(e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1)},e.extract=function(){var r=e.temp,i=e.temp.tempModel.name.trim(),t=e.fileNavigator.fileNameExists(i);return t&&c(e.temp)?(e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1):i?void e.apiMiddleware.extract(r,i,n.selectedModalPath).then(function(){return e.fileNavigator.refresh(),e.config.extractAsync?void(e.apiMiddleware.apiHandler.asyncSuccess=!0):e.modal("extract",!0)},function(){e.apiMiddleware.apiHandler.asyncSuccess=!1}):(e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1)},e.remove=function(){e.apiMiddleware.remove(e.temps).then(function(){e.fileNavigator.refresh(),e.modal("remove",!0)})},e.move=function(){var r=e.singleSelection()||e.temps[0];return r&&c(r)?(e.apiMiddleware.apiHandler.error=a.instant("error_cannot_move_same_path"),!1):void e.apiMiddleware.move(e.temps,n.selectedModalPath).then(function(){e.fileNavigator.refresh(),e.modal("move",!0)})},e.rename=function(){var r=e.singleSelection(),n=r.tempModel.name,i=r.tempModel.path.join("")===r.model.path.join("");return!n||i&&e.fileNavigator.fileNameExists(n)?(e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"),!1):void e.apiMiddleware.rename(r).then(function(){e.fileNavigator.refresh(),e.modal("rename",!0)})},e.createFolder=function(){var r=e.singleSelection(),n=r.tempModel.name;return!n||e.fileNavigator.fileNameExists(n)?e.apiMiddleware.apiHandler.error=a.instant("error_invalid_filename"):void e.apiMiddleware.createFolder(r).then(function(){e.fileNavigator.refresh(),e.modal("newfolder",!0)})},e.addForUpload=function(r){e.uploadFileList=e.uploadFileList.concat(r),e.modal("uploadfile")},e.removeFromUpload=function(r){e.uploadFileList.splice(r,1)},e.uploadFiles=function(){e.apiMiddleware.upload(e.uploadFileList,e.fileNavigator.currentPath).then(function(){e.fileNavigator.refresh(),e.uploadFileList=[],e.modal("uploadfile",!0)},function(r){var n=r.result&&r.result.error||a.instant("error_uploading_files");e.apiMiddleware.apiHandler.error=n})};var c=function(e){var r=n.selectedModalPath.join(""),i=e&&e.model.path.join("");return i===r},p=function(e){var r=i.location.search.substr(1).split("&").filter(function(r){return e===r.split("=")[0]});return r[0]&&r[0].split("=")[1]||void 0};e.changeLanguage(p("lang")),e.isWindows="Windows"===p("server"),e.fileNavigator.refresh()}])}(angular,jQuery),function(e){"use strict";e.module("FileManagerApp").controller("ModalFileManagerCtrl",["$scope","$rootScope","fileNavigator",function(e,r,n){e.reverse=!1,e.predicate=["model.type","model.name"],e.fileNavigator=new n,r.selectedModalPath=[],e.order=function(r){e.reverse=e.predicate[1]===r&&!e.reverse,e.predicate[1]=r},e.select=function(n){r.selectedModalPath=n.model.fullPath().split("/").filter(Boolean),e.modal("selector",!0)},e.selectCurrent=function(){r.selectedModalPath=e.fileNavigator.currentPath,e.modal("selector",!0)},e.selectedFilesAreChildOfPath=function(r){var n=r.model.fullPath();return e.temps.find(function(e){var r=e.model.fullPath();if(n==r)return!0})},r.openNavigator=function(r){e.fileNavigator.currentPath=r,e.fileNavigator.refresh(),e.modal("selector")},r.getSelectedPath=function(){var n=r.selectedModalPath.filter(Boolean),i="/"+n.join("/");return e.singleSelection()&&!e.singleSelection().isFolder()&&(i+="/"+e.singleSelection().tempModel.name),i.replace(/\/\//,"/")}}])}(angular),function(e){"use strict";var r=e.module("FileManagerApp");r.directive("angularFilemanager",["$parse","fileManagerConfig",function(e,r){return{restrict:"EA",templateUrl:r.tplPath+"/main.html"}}]),r.directive("ngFile",["$parse",function(e){return{restrict:"A",link:function(r,n,i){var a=e(i.ngFile),t=a.assign;n.bind("change",function(){r.$apply(function(){t(r,n[0].files)})})}}}]),r.directive("ngRightClick",["$parse",function(e){return function(r,n,i){var a=e(i.ngRightClick);n.bind("contextmenu",function(e){r.$apply(function(){e.preventDefault(),a(r,{$event:e})})})}}])}(angular),function(e){"use strict";e.module("FileManagerApp").service("chmod",function(){var e=function(e){if(this.owner=this.getRwxObj(),this.group=this.getRwxObj(),this.others=this.getRwxObj(),e){var r=isNaN(e)?this.convertfromCode(e):this.convertfromOctal(e);if(!r)throw new Error("Invalid chmod input data (%s)".replace("%s",e));this.owner=r.owner,this.group=r.group,this.others=r.others}};return e.prototype.toOctal=function(e,r){var n=[];return["owner","group","others"].forEach(function(e,r){n[r]=this[e].read&&this.octalValues.read||0,n[r]+=this[e].write&&this.octalValues.write||0,n[r]+=this[e].exec&&this.octalValues.exec||0}.bind(this)),(e||"")+n.join("")+(r||"")},e.prototype.toCode=function(e,r){var n=[];return["owner","group","others"].forEach(function(e,r){n[r]=this[e].read&&this.codeValues.read||"-",n[r]+=this[e].write&&this.codeValues.write||"-",n[r]+=this[e].exec&&this.codeValues.exec||"-"}.bind(this)),(e||"")+n.join("")+(r||"")},e.prototype.getRwxObj=function(){return{read:!1,write:!1,exec:!1}},e.prototype.octalValues={read:4,write:2,exec:1},e.prototype.codeValues={read:"r",write:"w",exec:"x"},e.prototype.convertfromCode=function(e){if(e=(""+e).replace(/\s/g,""),e=10===e.length?e.substr(1):e,/^[-rwxts]{9}$/.test(e)){var r=[],n=e.match(/.{1,3}/g);for(var i in n){var a=this.getRwxObj();a.read=/r/.test(n[i]),a.write=/w/.test(n[i]),a.exec=/x|t/.test(n[i]),r.push(a)}return{owner:r[0],group:r[1],others:r[2]}}},e.prototype.convertfromOctal=function(e){if(e=(""+e).replace(/\s/g,""),e=4===e.length?e.substr(1):e,/^[0-7]{3}$/.test(e)){var r=[],n=e.match(/.{1}/g);for(var i in n){var a=this.getRwxObj();a.read=/[4567]/.test(n[i]),a.write=/[2367]/.test(n[i]),a.exec=/[1357]/.test(n[i]),r.push(a)}return{owner:r[0],group:r[1],others:r[2]}}},e})}(angular),function(e){"use strict";e.module("FileManagerApp").factory("item",["fileManagerConfig","chmod",function(r,n){var i=function(r,i){function a(e){var r=(e||"").toString().split(/[- :]/);return new Date(r[0],r[1]-1,r[2],r[3],r[4],r[5])}var t={name:r&&r.name||"",path:i||[],type:r&&r.type||"file",size:r&&parseInt(r.size||0),date:a(r&&r.date),perms:new n(r&&r.rights),content:r&&r.content||"",recursive:!1,fullPath:function(){var e=this.path.filter(Boolean);return("/"+e.join("/")+"/"+this.name).replace(/\/\//,"/")}};this.error="",this.processing=!1,this.model=e.copy(t),this.tempModel=e.copy(t)};return i.prototype.update=function(){e.extend(this.model,e.copy(this.tempModel))},i.prototype.revert=function(){e.extend(this.tempModel,e.copy(this.model)),this.error=""},i.prototype.isFolder=function(){return"dir"===this.model.type},i.prototype.isEditable=function(){return!this.isFolder()&&r.isEditableFilePattern.test(this.model.name)},i.prototype.isImage=function(){return r.isImageFilePattern.test(this.model.name)},i.prototype.isCompressible=function(){return this.isFolder()},i.prototype.isExtractable=function(){return!this.isFolder()&&r.isExtractableFilePattern.test(this.model.name)},i.prototype.isSelectable=function(){return this.isFolder()&&r.allowedActions.pickFolders||!this.isFolder()&&r.allowedActions.pickFiles},i}])}(angular),function(e){"use strict";var r=e.module("FileManagerApp");r.filter("strLimit",["$filter",function(e){return function(r,n,i){return r.length<=n?r:e("limitTo")(r,n)+(i||"...")}}]),r.filter("fileExtension",["$filter",function(e){return function(r){return/\./.test(r)&&e("strLimit")(r.split(".").pop(),3,"..")||""}}]),r.filter("formatDate",["$filter",function(){return function(e){return e instanceof Date?e.toISOString().substring(0,19).replace("T"," "):(e.toLocaleString||e.toString).apply(e)}}]),r.filter("humanReadableFileSize",["$filter","fileManagerConfig",function(e,r){var n=[" kB"," MB"," GB"," TB","PB","EB","ZB","YB"],i=["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"];return function(e){var a=-1,t=e;do t/=1024,a++;while(t>1024);var o=r.useBinarySizePrefixes?i[a]:n[a];return Math.max(t,.1).toFixed(1)+" "+o}}])}(angular),function(e){"use strict";e.module("FileManagerApp").provider("fileManagerConfig",function(){var r={appName:"angular-filemanager v1.5",defaultLang:"en",listUrl:"bridges/php/handler.php",uploadUrl:"bridges/php/handler.php",renameUrl:"bridges/php/handler.php",copyUrl:"bridges/php/handler.php",moveUrl:"bridges/php/handler.php",removeUrl:"bridges/php/handler.php",editUrl:"bridges/php/handler.php",getContentUrl:"bridges/php/handler.php",createFolderUrl:"bridges/php/handler.php",downloadFileUrl:"bridges/php/handler.php",downloadMultipleUrl:"bridges/php/handler.php",compressUrl:"bridges/php/handler.php",extractUrl:"bridges/php/handler.php",permissionsUrl:"bridges/php/handler.php",basePath:"/",searchForm:!0,sidebar:!0,breadcrumb:!0,allowedActions:{upload:!0,rename:!0,move:!0,copy:!0,edit:!0,changePermissions:!0,compress:!0,compressChooseName:!0,extract:!0,download:!0,downloadMultiple:!0,preview:!0,remove:!0,createFolder:!0,pickFiles:!1,pickFolders:!1},multipleDownloadFileName:"angular-filemanager.zip",filterFileExtensions:[],showExtensionIcons:!0,showSizeForDirectories:!1,useBinarySizePrefixes:!1,downloadFilesByAjax:!0,previewImagesInModal:!0,enablePermissionsRecursive:!0,compressAsync:!1,extractAsync:!1,pickCallback:null,isEditableFilePattern:/\.(txt|diff?|patch|svg|asc|cnf|cfg|conf|html?|.html|cfm|cgi|aspx?|ini|pl|py|md|css|cs|js|jsp|log|htaccess|htpasswd|gitignore|gitattributes|env|json|atom|eml|rss|markdown|sql|xml|xslt?|sh|rb|as|bat|cmd|cob|for|ftn|frm|frx|inc|lisp|scm|coffee|php[3-6]?|java|c|cbl|go|h|scala|vb|tmpl|lock|go|yml|yaml|tsv|lst)$/i,isImageFilePattern:/\.(jpe?g|gif|bmp|png|svg|tiff?)$/i,isExtractableFilePattern:/\.(gz|tar|rar|g?zip)$/i,tplPath:"src/templates"};return{$get:function(){return r},set:function(n){e.extend(r,n)}}})}(angular),function(e){"use strict";e.module("FileManagerApp").config(["$translateProvider",function(e){e.useSanitizeValueStrategy(null),e.translations("en",{filemanager:"File Manager",language:"Language",english:"English",spanish:"Spanish",portuguese:"Portuguese",french:"French",german:"German",hebrew:"Hebrew",italian:"Italian",slovak:"Slovak",chinese:"Chinese",russian:"Russian",ukrainian:"Ukrainian",turkish:"Turkish",persian:"Persian",polish:"Polish",confirm:"Confirm",cancel:"Cancel",close:"Close",upload_files:"Upload files",files_will_uploaded_to:"Files will be uploaded to",select_files:"Select files",uploading:"Uploading",permissions:"Permissions",select_destination_folder:"Select the destination folder",source:"Source",destination:"Destination",copy_file:"Copy file",sure_to_delete:"Are you sure to delete",change_name_move:"Change name / move",enter_new_name_for:"Enter new name for",extract_item:"Extract item",extraction_started:"Extraction started in a background process",compression_started:"Compression started in a background process",enter_folder_name_for_extraction:"Enter the folder name for the extraction of",enter_file_name_for_compression:"Enter the file name for the compression of",toggle_fullscreen:"Toggle fullscreen",edit_file:"Edit file",file_content:"File content",loading:"Loading",search:"Search",create_folder:"Create folder",create:"Create",folder_name:"Folder name",upload:"Upload",change_permissions:"Change permissions",change:"Change",details:"Details",icons:"Icons",list:"List",name:"Name",size:"Size",actions:"Actions",date:"Date",selection:"Selection",no_files_in_folder:"No files in this folder",no_folders_in_folder:"This folder not contains children folders",select_this:"Select this",go_back:"Go back",wait:"Wait",move:"Move",download:"Download",downloadlink:"View download link",view_item:"View item",remove:"Delete",edit:"Edit",copy:"Copy",rename:"Rename",extract:"Extract",compress:"Compress",error_invalid_filename:"Invalid filename or already exists, specify another name",error_modifying:"An error occurred modifying the file",error_deleting:"An error occurred deleting the file or folder",error_renaming:"An error occurred renaming the file",error_copying:"An error occurred copying the file",error_compressing:"An error occurred compressing the file or folder",error_extracting:"An error occurred extracting the file",error_creating_folder:"An error occurred creating the folder",error_getting_content:"An error occurred getting the content of the file",error_changing_perms:"An error occurred changing the permissions of the file",error_uploading_files:"An error occurred uploading files",sure_to_start_compression_with:"Are you sure to compress",owner:"Owner",group:"Group",others:"Others",read:"Read",write:"Write",exec:"Exec",original:"Original",changes:"Changes",recursive:"Recursive",preview:"Item preview",open:"Open",these_elements:"these {{total}} elements",new_folder:"New folder",download_as_zip:"Download as ZIP"}),e.translations("he",{filemanager:"מנהל קבצים",language:"שפה",english:"אנגלית",spanish:"ספרדית",portuguese:"פורטוגזית",french:"צרפתית",german:"גרמנית",hebrew:"עברי",italian:"איטלקי",slovak:"סלובקי",chinese:"סִינִית",russian:"רוּסִי",ukrainian:"אוקראיני",turkish:"טורקי",persian:"פַּרסִית",polish:"פולני",confirm:"אשר",cancel:"בטל",close:"סגור",upload_files:"העלה קבצים",files_will_uploaded_to:"הקבצים יעלו ל",select_files:"בחר קבצים",uploading:"מעלה",permissions:"הרשאות",select_destination_folder:"בחר תיקיית יעד",source:"מקור",destination:"יעד",copy_file:"העתק קובץ",sure_to_delete:"האם אתה בטוח שברצונך למחוק",change_name_move:"שנה שם / הזז",enter_new_name_for:"הקלד שם חדש עבור",extract_item:"חלץ פריט",extraction_started:"תהליך החילוץ מתבצע ברקע",compression_started:"תהליך הכיווץ מתבצע ברקע",enter_folder_name_for_extraction:"הקלד שם תיקייה לחילוץ עבור",enter_file_name_for_compression:"הזן את שם הקובץ עבור הדחיסה של",toggle_fullscreen:"הפעל/בטל מסך מלא",edit_file:"ערוך קובץ",file_content:"תוכן הקובץ",loading:"טוען",search:"חפש",create_folder:"צור תיקייה",create:"צור",folder_name:"שם תיקייה",upload:"העלה",change_permissions:"שנה הרשאות",change:"שנה",details:"פרטים",icons:"סמלים",list:"רשימה",name:"שם",size:"גודל",actions:"פעולות",date:"תאריך",selection:"בְּחִירָה",no_files_in_folder:"אין קבצים בתיקייה זו",no_folders_in_folder:"התיקייה הזו אינה כוללת תתי תיקיות",select_this:"בחר את זה",go_back:"חזור אחורה",wait:"חכה",move:"הזז",download:"הורד",view_item:"הצג פריט",remove:"מחק",edit:"ערוך",copy:"העתק",rename:"שנה שם",extract:"חלץ",compress:"כווץ",error_invalid_filename:"שם קובץ אינו תקין או קיים, ציין שם קובץ אחר",error_modifying:"התרחשה שגיאה בעת שינוי הקובץ",error_deleting:"התרחשה שגיאה בעת מחיקת הקובץ או התיקייה",error_renaming:"התרחשה שגיאה בעת שינוי שם הקובץ",error_copying:"התרחשה שגיאה בעת העתקת הקובץ",error_compressing:"התרחשה שגיאה בעת כיווץ הקובץ או התיקייה",error_extracting:"התרחשה שגיאה בעת חילוץ הקובץ או התיקייה",error_creating_folder:"התרחשה שגיאה בעת יצירת התיקייה",error_getting_content:"התרחשה שגיאה בעת בקשת תוכן הקובץ",error_changing_perms:"התרחשה שגיאה בעת שינוי הרשאות הקובץ",error_uploading_files:"התרחשה שגיאה בעת העלאת הקבצים",sure_to_start_compression_with:"האם אתה בטוח שברצונך לכווץ",owner:"בעלים",group:"קבוצה",others:"אחרים",read:"קריאה",write:"כתיבה",exec:"הרצה",original:"מקורי",changes:"שינויים",recursive:"רקורסיה",preview:"הצגת פריט",open:"פתח",new_folder:"תיקיה חדשה",download_as_zip:"להוריד כמו"}),e.translations("pt",{filemanager:"Gerenciador de arquivos",language:"Língua",english:"Inglês",spanish:"Espanhol",portuguese:"Portugues",french:"Francês",german:"Alemão",hebrew:"Hebraico",italian:"Italiano",slovak:"Eslovaco",chinese:"Chinês",russian:"Russo",ukrainian:"Ucraniano",turkish:"Turco",persian:"Persa",polish:"Polonês",confirm:"Confirmar",cancel:"Cancelar",close:"Fechar",upload_files:"Carregar arquivos",files_will_uploaded_to:"Os arquivos serão enviados para",select_files:"Selecione os arquivos",uploading:"Carregar",permissions:"Autorizações",select_destination_folder:"Selecione a pasta de destino",source:"Origem",destination:"Destino",copy_file:"Copiar arquivo",sure_to_delete:"Tem certeza de que deseja apagar",change_name_move:"Renomear / mudança",enter_new_name_for:"Digite o novo nome para",extract_item:"Extrair arquivo",extraction_started:"A extração começou em um processo em segundo plano",compression_started:"A compressão começou em um processo em segundo plano",enter_folder_name_for_extraction:"Digite o nome da pasta para a extração de",enter_file_name_for_compression:"Digite o nome do arquivo para a compressão de",toggle_fullscreen:"Ativar/desativar tela cheia",edit_file:"Editar arquivo",file_content:"Conteúdo do arquivo",loading:"Carregando",search:"Localizar",create_folder:"Criar Pasta",create:"Criar",folder_name:"Nome da pasta",upload:"Fazer",change_permissions:"Alterar permissões",change:"Alterar",details:"Detalhes",icons:"Icones",list:"Lista",name:"Nome",size:"Tamanho",actions:"Ações",date:"Data",selection:"Seleção",no_files_in_folder:"Não há arquivos nesta pasta",no_folders_in_folder:"Esta pasta não contém subpastas",select_this:"Selecione esta",go_back:"Voltar",wait:"Espere",move:"Mover",download:"Baixar",view_item:"Veja o arquivo",remove:"Excluir",edit:"Editar",copy:"Copiar",rename:"Renomear",extract:"Extrair",compress:"Comprimir",error_invalid_filename:"Nome do arquivo inválido ou nome de arquivo já existe, especifique outro nome",error_modifying:"Ocorreu um erro ao modificar o arquivo",error_deleting:"Ocorreu um erro ao excluir o arquivo ou pasta",error_renaming:"Ocorreu um erro ao mudar o nome do arquivo",error_copying:"Ocorreu um erro ao copiar o arquivo",error_compressing:"Ocorreu um erro ao comprimir o arquivo ou pasta",error_extracting:"Ocorreu um erro ao extrair o arquivo",error_creating_folder:"Ocorreu um erro ao criar a pasta",error_getting_content:"Ocorreu um erro ao obter o conteúdo do arquivo",error_changing_perms:"Ocorreu um erro ao alterar as permissões do arquivo",error_uploading_files:"Ocorreu um erro upload de arquivos",sure_to_start_compression_with:"Tem certeza que deseja comprimir",owner:"Proprietário",group:"Grupo",others:"Outros",read:"Leitura",write:"Escrita ",exec:"Execução",original:"Original",changes:"Mudanças",recursive:"Recursiva",preview:"Visualização",open:"Abrir",these_elements:"estes {{total}} elements",new_folder:"Nova pasta",download_as_zip:"Download como ZIP"}),e.translations("es",{filemanager:"Administrador de archivos",language:"Idioma",english:"Ingles",spanish:"Español",portuguese:"Portugues",french:"Francés",german:"Alemán",hebrew:"Hebreo",italian:"Italiano",slovak:"Eslovaco",chinese:"Chino",russian:"Ruso",ukrainian:"Ucraniano",turkish:"Turco",persian:"Persa",polish:"Polaco",confirm:"Confirmar",cancel:"Cancelar",close:"Cerrar",upload_files:"Subir archivos",files_will_uploaded_to:"Los archivos seran subidos a",select_files:"Seleccione los archivos",uploading:"Subiendo",permissions:"Permisos",select_destination_folder:"Seleccione la carpeta de destino",source:"Origen",destination:"Destino",copy_file:"Copiar archivo",sure_to_delete:"Esta seguro que desea eliminar",change_name_move:"Renombrar / mover",enter_new_name_for:"Ingrese el nuevo nombre para",extract_item:"Extraer archivo",extraction_started:"La extraccion ha comenzado en un proceso de segundo plano",compression_started:"La compresion ha comenzado en un proceso de segundo plano",enter_folder_name_for_extraction:"Ingrese el nombre de la carpeta para la extraccion de",enter_file_name_for_compression:"Ingrese el nombre del archivo para la compresion de",toggle_fullscreen:"Activar/Desactivar pantalla completa",edit_file:"Editar archivo",file_content:"Contenido del archivo",loading:"Cargando",search:"Buscar",create_folder:"Crear carpeta",create:"Crear",folder_name:"Nombre de la carpeta",upload:"Subir",change_permissions:"Cambiar permisos",change:"Cambiar",details:"Detalles",icons:"Iconos",list:"Lista",name:"Nombre",size:"Tamaño",actions:"Acciones",date:"Fecha",selection:"Selección",no_files_in_folder:"No hay archivos en esta carpeta",no_folders_in_folder:"Esta carpeta no contiene sub-carpetas",select_this:"Seleccionar esta",go_back:"Volver",wait:"Espere",move:"Mover",download:"Descargar",view_item:"Ver archivo",remove:"Eliminar",edit:"Editar",copy:"Copiar",rename:"Renombrar",extract:"Extraer",compress:"Comprimir",error_invalid_filename:"El nombre del archivo es invalido o ya existe",error_modifying:"Ocurrio un error al intentar modificar el archivo",error_deleting:"Ocurrio un error al intentar eliminar el archivo",error_renaming:"Ocurrio un error al intentar renombrar el archivo",error_copying:"Ocurrio un error al intentar copiar el archivo",error_compressing:"Ocurrio un error al intentar comprimir el archivo",error_extracting:"Ocurrio un error al intentar extraer el archivo",error_creating_folder:"Ocurrio un error al intentar crear la carpeta",error_getting_content:"Ocurrio un error al obtener el contenido del archivo",error_changing_perms:"Ocurrio un error al cambiar los permisos del archivo",error_uploading_files:"Ocurrio un error al subir archivos",sure_to_start_compression_with:"Esta seguro que desea comprimir",owner:"Propietario",group:"Grupo",others:"Otros",read:"Lectura",write:"Escritura",exec:"Ejecucion",original:"Original",changes:"Cambios",recursive:"Recursivo",preview:"Vista previa",open:"Abrir",these_elements:"estos {{total}} elementos",new_folder:"Nueva carpeta",download_as_zip:"Descargar como ZIP"}),e.translations("fr",{filemanager:"Gestionnaire de fichier",language:"Langue",english:"Anglais",spanish:"Espagnol",portuguese:"Portugais",french:"Français",german:"Allemand",hebrew:"Hébreu",italian:"Italien",slovak:"Slovaque",chinese:"Chinois",russian:"Russe",ukrainian:"Ukrainien",turkish:"Turc",persian:"Persan",polish:"Polonais",confirm:"Confirmer",cancel:"Annuler",close:"Fermer",upload_files:"Télécharger des fichiers",files_will_uploaded_to:"Les fichiers seront uploadé dans",select_files:"Sélectionnez les fichiers",uploading:"Upload en cours",permissions:"Permissions",select_destination_folder:"Sélectionné le dossier de destination",source:"Source",destination:"Destination",copy_file:"Copier le fichier",sure_to_delete:"Êtes-vous sûr de vouloir supprimer",change_name_move:"Renommer / Déplacer",enter_new_name_for:"Entrer le nouveau nom pour",extract_item:"Extraires les éléments",extraction_started:"L'extraction a démarré en tâche de fond",compression_started:"La compression a démarré en tâche de fond",enter_folder_name_for_extraction:"Entrer le nom du dossier pour l'extraction de",enter_file_name_for_compression:"Entrez le nom de fichier pour la compression de",toggle_fullscreen:"Basculer en plein écran",edit_file:"Éditer le fichier",file_content:"Contenu du fichier",loading:"Chargement en cours",search:"Recherche",create_folder:"Créer un dossier",create:"Créer",folder_name:"Nom du dossier",upload:"Upload",change_permissions:"Changer les permissions",change:"Changer",details:"Details",icons:"Icons",list:"Liste",name:"Nom",size:"Taille",actions:"Actions",date:"Date",selection:"Sélection",no_files_in_folder:"Aucun fichier dans ce dossier",no_folders_in_folder:"Ce dossier ne contiens pas de dossier",select_this:"Sélectionner",go_back:"Retour",wait:"Patienter",move:"Déplacer",download:"Télécharger",view_item:"Voir l'élément",remove:"Supprimer",edit:"Éditer",copy:"Copier",rename:"Renommer",extract:"Extraire",compress:"Compresser",error_invalid_filename:"Nom de fichier invalide ou déjà existant, merci de spécifier un autre nom",error_modifying:"Une erreur est survenue pendant la modification du fichier",error_deleting:"Une erreur est survenue pendant la suppression du fichier ou du dossier",error_renaming:"Une erreur est survenue pendant le renommage du fichier",error_copying:"Une erreur est survenue pendant la copie du fichier",error_compressing:"Une erreur est survenue pendant la compression du fichier ou du dossier",error_extracting:"Une erreur est survenue pendant l'extraction du fichier",error_creating_folder:"Une erreur est survenue pendant la création du dossier",error_getting_content:"Une erreur est survenue pendant la récupération du contenu du fichier",error_changing_perms:"Une erreur est survenue pendant le changement des permissions du fichier",error_uploading_files:"Une erreur est survenue pendant l'upload des fichiers",sure_to_start_compression_with:"Êtes-vous sûre de vouloir compresser",owner:"Propriétaire",group:"Groupe",others:"Autres",read:"Lecture",write:"Écriture",exec:"Éxécution",original:"Original",changes:"Modifications",recursive:"Récursif",preview:"Aperçu",open:"Ouvrir",these_elements:"ces {{total}} éléments",new_folder:"Nouveau dossier",download_as_zip:"Télécharger comme ZIP"}),e.translations("de",{filemanager:"Dateimanager",language:"Sprache",english:"Englisch",spanish:"Spanisch",portuguese:"Portugiesisch",french:"Französisch",german:"Deutsch",hebrew:"Hebräisch",italian:"Italienisch",slovak:"Slowakisch",chinese:"Chinesisch",russian:"Russisch",ukrainian:"Ukrainisch",turkish:"Türkisch",persian:"Persisch",polish:"Polnisch",confirm:"Bestätigen",cancel:"Abbrechen",close:"Schließen",upload_files:"Hochladen von Dateien",files_will_uploaded_to:"Dateien werden hochgeladen nach",select_files:"Wählen Sie die Dateien",uploading:"Lade hoch",permissions:"Berechtigungen",select_destination_folder:"Wählen Sie einen Zielordner",source:"Quelle",destination:"Ziel",copy_file:"Datei kopieren",sure_to_delete:"Sind Sie sicher, dass Sie die Datei löschen möchten?",change_name_move:"Namen ändern / verschieben",enter_new_name_for:"Geben Sie den neuen Namen ein für",extract_item:"Archiv entpacken",extraction_started:"Entpacken hat im Hintergrund begonnen",compression_started:"Komprimierung hat im Hintergrund begonnen",enter_folder_name_for_extraction:"Geben Sie den Verzeichnisnamen für die Entpackung an von",enter_file_name_for_compression:"Geben Sie den Dateinamen für die Kompression an von",toggle_fullscreen:"Vollbild umschalten",edit_file:"Datei bearbeiten",file_content:"Dateiinhalt",loading:"Lade",search:"Suche",create_folder:"Ordner erstellen",create:"Erstellen",folder_name:"Verzeichnisname",upload:"Hochladen",change_permissions:"Berechtigungen ändern",change:"Ändern",details:"Details",icons:"Symbolansicht",list:"Listenansicht",name:"Name",size:"Größe",actions:"Aktionen",date:"Datum",selection:"Auswahl",no_files_in_folder:"Keine Dateien in diesem Ordner",no_folders_in_folder:"Dieser Ordner enthält keine Unterordner",select_this:"Auswählen",go_back:"Zurück",wait:"Warte",move:"Verschieben",download:"Herunterladen",view_item:"Datei ansehen",remove:"Löschen",edit:"Bearbeiten",copy:"Kopieren",rename:"Umbenennen",extract:"Entpacken",compress:"Komprimieren",error_invalid_filename:"Ungültiger Dateiname oder existiert bereits",
+error_modifying:"Beim Bearbeiten der Datei ist ein Fehler aufgetreten",error_deleting:"Beim Löschen der Datei oder des Ordners ist ein Fehler aufgetreten",error_renaming:"Beim Umbennenen der Datei ist ein Fehler aufgetreten",error_copying:"Beim Kopieren der Datei ist ein Fehler aufgetreten",error_compressing:"Beim Komprimieren der Datei oder des Ordners ist ein Fehler aufgetreten",error_extracting:"Beim Entpacken der Datei ist ein Fehler aufgetreten",error_creating_folder:"Beim Erstellen des Ordners ist ein Fehler aufgetreten",error_getting_content:"Beim Laden des Dateiinhalts ist ein Fehler aufgetreten",error_changing_perms:"Beim Ändern der Dateiberechtigungen ist ein Fehler aufgetreten",error_uploading_files:"Beim Hochladen der Dateien ist ein Fehler aufgetreten",sure_to_start_compression_with:"Möchten Sie die Datei wirklich komprimieren?",owner:"Besitzer",group:"Gruppe",others:"Andere",read:"Lesen",write:"Schreiben",exec:"Ausführen",original:"Original",changes:"Änderungen",recursive:"Rekursiv",preview:"Dateivorschau",open:"Öffnen",these_elements:"diese {{total}} elemente",new_folder:"Neuer ordner",download_as_zip:"Download als ZIP"}),e.translations("sk",{filemanager:"Správca súborov",language:"Jazyk",english:"Angličtina",spanish:"Španielčina",portuguese:"Portugalčina",french:"Francúzština",german:"Nemčina",hebrew:"Hebrejčina",italian:"Italština",slovak:"Slovenčina",chinese:"Čínština",russian:"Ruský",ukrainian:"Ukrajinský",turkish:"Turecký",persian:"Perzský",polish:"Poľský",confirm:"Potvrdiť",cancel:"Zrušiť",close:"Zavrieť",upload_files:"Nahrávať súbory",files_will_uploaded_to:"Súbory budú nahrané do",select_files:"Vybrať súbory",uploading:"Nahrávanie",permissions:"Oprávnenia",select_destination_folder:"Vyberte cieľový príečinok",source:"Zdroj",destination:"Cieľ",copy_file:"Kopírovať súbor",sure_to_delete:"Ste si istý, že chcete vymazať",change_name_move:"Premenovať / Premiestniť",enter_new_name_for:"Zadajte nové meno pre",extract_item:"Rozbaliť položku",extraction_started:"Rozbaľovanie začalo v procese na pozadí",compression_started:"Kompresia začala v procese na pzoadí",enter_folder_name_for_extraction:"Zadajte názov priečinka na rozbalenie",enter_file_name_for_compression:"Zadajte názov súboru pre kompresiu",toggle_fullscreen:"Prepnúť režim na celú obrazovku",edit_file:"Upraviť súbor",file_content:"Obsah súboru",loading:"Načítavanie",search:"Hľadať",create_folder:"Vytvoriť priečinok",create:"Vytvoriť",folder_name:"Názov priećinka",upload:"Nahrať",change_permissions:"Zmeniť oprávnenia",change:"Zmeniť",details:"Podrobnosti",icons:"Ikony",list:"Zoznam",name:"Meno",size:"Veľkosť",actions:"Akcie",date:"Dátum",selection:"Výber",no_files_in_folder:"V tom to priečinku nie sú žiadne súbory",no_folders_in_folder:"Tento priečinok neobsahuje žiadne ďalšie priećinky",select_this:"Vybrať tento",go_back:"Ísť späť",wait:"Počkajte",move:"Presunúť",download:"Stiahnuť",view_item:"Zobraziť položku",remove:"Vymazať",edit:"Upraviť",copy:"Kopírovať",rename:"Premenovať",extract:"Rozbaliť",compress:"Komprimovať",error_invalid_filename:"Neplatné alebo duplicitné meno súboru, vyberte iné meno",error_modifying:"Vyskytla sa chyba pri upravovaní súboru",error_deleting:"Vyskytla sa chyba pri mazaní súboru alebo priečinku",error_renaming:"Vyskytla sa chyba pri premenovaní súboru",error_copying:"Vyskytla sa chyba pri kopírovaní súboru",error_compressing:"Vyskytla sa chyba pri komprimovaní súboru alebo priečinka",error_extracting:"Vyskytla sa chyba pri rozbaľovaní súboru",error_creating_folder:"Vyskytla sa chyba pri vytváraní priečinku",error_getting_content:"Vyskytla sa chyba pri získavaní obsahu súboru",error_changing_perms:"Vyskytla sa chyba pri zmene oprávnení súboru",error_uploading_files:"Vyskytla sa chyba pri nahrávaní súborov",sure_to_start_compression_with:"Ste si istý, že chcete komprimovať",owner:"Vlastník",group:"Skupina",others:"Ostatní",read:"Čítanie",write:"Zapisovanie",exec:"Spúštanie",original:"Originál",changes:"Zmeny",recursive:"Rekurzívne",preview:"Náhľad položky",open:"Otvoriť",these_elements:"týchto {{total}} prvkov",new_folder:"Nový priečinok",download_as_zip:"Stiahnuť ako ZIP"}),e.translations("zh",{filemanager:"文档管理器",language:"语言",english:"英语",spanish:"西班牙语",portuguese:"葡萄牙语",french:"法语",german:"德语",hebrew:"希伯来语",italian:"意大利",slovak:"斯洛伐克语",chinese:"中文",russian:"俄語",ukrainian:"烏克蘭",turkish:"土耳其",persian:"波斯語",polish:"波兰语",confirm:"确定",cancel:"取消",close:"关闭",upload_files:"上传文件",files_will_uploaded_to:"文件将上传到",select_files:"选择文件",uploading:"上传中",permissions:"权限",select_destination_folder:"选择目标文件",source:"源自",destination:"目的地",copy_file:"复制文件",sure_to_delete:"确定要删除?",change_name_move:"改名或移动?",enter_new_name_for:"输入新的名称",extract_item:"解压",extraction_started:"解压已经在后台开始",compression_started:"压缩已经在后台开始",enter_folder_name_for_extraction:"输入解压的目标文件夹",enter_file_name_for_compression:"输入要压缩的文件名",toggle_fullscreen:"切换全屏",edit_file:"编辑文件",file_content:"文件内容",loading:"加载中",search:"搜索",create_folder:"创建文件夹",create:"创建",folder_name:"文件夹名称",upload:"上传",change_permissions:"修改权限",change:"修改",details:"详细信息",icons:"图标",list:"列表",name:"名称",size:"尺寸",actions:"操作",date:"日期",selection:"选择",no_files_in_folder:"此文件夹没有文件",no_folders_in_folder:"此文件夹不包含子文件夹",select_this:"选择此文件",go_back:"后退",wait:"等待",move:"移动",download:"下载",downloadlink:"显示下载链接",view_item:"查看子项",remove:"删除",edit:"编辑",copy:"复制",rename:"重命名",extract:"解压",compress:"压缩",error_invalid_filename:"非法文件名或文件已经存在, 请指定其它名称",error_modifying:"修改文件出错",error_deleting:"删除文件或文件夹出错",error_renaming:"重命名文件出错",error_copying:"复制文件出错",error_compressing:"压缩文件或文件夹出错",error_extracting:"解压文件出错",error_creating_folder:"创建文件夹出错",error_getting_content:"获取文件内容出错",error_changing_perms:"修改文件权限出错",error_uploading_files:"上传文件出错",sure_to_start_compression_with:"确定要压缩?",owner:"拥有者",group:"群组",others:"其他",read:"读取",write:"写入",exec:"执行",original:"原始",changes:"变化",recursive:"递归",preview:"成员预览",open:"打开",these_elements:"共 {{total}} 个",new_folder:"新文件夹",download_as_zip:"下载的ZIP"}),e.translations("ru",{filemanager:"Файловый менеджер",language:"Язык",english:"Английский",spanish:"Испанский",portuguese:"Португальский",french:"Французкий",german:"Немецкий",hebrew:"Хинди",italian:"итальянский",slovak:"Словацкий",chinese:"Китайский",russian:"русский",ukrainian:"украинец",turkish:"турецкий",persian:"персидский",polish:"Польский",confirm:"Подьвердить",cancel:"Отменить",close:"Закрыть",upload_files:"Загрузка файлов",files_will_uploaded_to:"Файлы будут загружены в: ",select_files:"Выберите файлы",uploading:"Загрузка",permissions:"Разрешения",select_destination_folder:"Выберите папку назначения",source:"Источкик",destination:"Цель",copy_file:"Скопировать файл",sure_to_delete:"Действительно удалить?",change_name_move:"Переименовать / переместить",enter_new_name_for:"Новое имя для",extract_item:"Извлечь",extraction_started:"Извлечение начато",compression_started:"Сжатие начато",enter_folder_name_for_extraction:"Извлечь в укананную папку",enter_file_name_for_compression:"Введите имя архива",toggle_fullscreen:"На весь экран",edit_file:"Редактировать",file_content:"Содержимое файла",loading:"Загрузка",search:"Поиск",create_folder:"Создать папку",create:"Создать",folder_name:"Имя папки",upload:"Загрузить",change_permissions:"Изменить разрешения",change:"Изменить",details:"Свойства",icons:"Иконки",list:"Список",name:"Имя",size:"Размер",actions:"Действия",date:"Дата",selection:"выбор",no_files_in_folder:"Пустая папка",no_folders_in_folder:"Пустая папка",select_this:"Выбрать",go_back:"Назад",wait:"Подождите",move:"Переместить",download:"Скачать",view_item:"Отобразить содержимое",remove:"Удалить",edit:"Редактировать",copy:"Скопировать",rename:"Переименовать",extract:"Извлечь",compress:"Сжать",error_invalid_filename:"Имя неверное или уже существует, выберите другое",error_modifying:"Произошла ошибка при модифицировании файла",error_deleting:"Произошла ошибка при удалении",error_renaming:"Произошла ошибка при переименовании файла",error_copying:"Произошла ошибка при копировании файла",error_compressing:"Произошла ошибка при сжатии",error_extracting:"Произошла ошибка при извлечении",error_creating_folder:"Произошла ошибка при создании папки",error_getting_content:"Произошла ошибка при получении содержимого",error_changing_perms:"Произошла ошибка при изменении разрешений",error_uploading_files:"Произошла ошибка при загрузке",sure_to_start_compression_with:"Действительно сжать",owner:"Владелец",group:"Группа",others:"Другие",read:"Чтение",write:"Запись",exec:"Выполнение",original:"По-умолчанию",changes:"Изменения",recursive:"Рекурсивно",preview:"Просмотр",open:"Открыть",these_elements:"всего {{total}} елементов",new_folder:"Новая папка",download_as_zip:"Download as ZIP"}),e.translations("ua",{filemanager:"Файловий менеджер",language:"Мова",english:"Англійська",spanish:"Іспанська",portuguese:"Португальська",french:"Французька",german:"Німецька",hebrew:"Хінді",italian:"італійський",slovak:"Словацька",chinese:"Китайська",russian:"російський",ukrainian:"український",turkish:"турецька",persian:"перський",polish:"Польська",confirm:"Підтвердити",cancel:"Відмінити",close:"Закрити",upload_files:"Завантаження файлів",files_will_uploaded_to:"Файли будуть завантажені у: ",select_files:"Виберіть файли",uploading:"Завантаження",permissions:"Дозволи",select_destination_folder:"Виберіть папку призначення",source:"Джерело",destination:"Ціль",copy_file:"Скопіювати файл",sure_to_delete:"Дійсно удалить?",change_name_move:"Перейменувати / перемістити",enter_new_name_for:"Нове ім'я для",extract_item:"Извлечь",extraction_started:"Извлечение начато",compression_started:"Архівацію почато",enter_folder_name_for_extraction:"Извлечь в укананную папку",enter_file_name_for_compression:"Введите имя архива",toggle_fullscreen:"На весь экран",edit_file:"Редагувати",file_content:"Вміст файлу",loading:"Завантаження",search:"Пошук",create_folder:"Створити папку",create:"Створити",folder_name:"Ім'я  папки",upload:"Завантижити",change_permissions:"Змінити дозволи",change:"Редагувати",details:"Властивості",icons:"Іконки",list:"Список",name:"Ім'я",size:"Розмір",actions:"Дії",date:"Дата",selection:"вибір",no_files_in_folder:"Пуста папка",no_folders_in_folder:"Пуста папка",select_this:"Выбрати",go_back:"Назад",wait:"Зачекайте",move:"Перемістити",download:"Скачати",view_item:"Показати вміст",remove:"Видалити",edit:"Редагувати",copy:"Копіювати",rename:"Переіменувати",extract:"Розархівувати",compress:"Архівувати",error_invalid_filename:"Ім'я певірне або вже існує, виберіть інше",error_modifying:"Виникла помилка при редагуванні файлу",error_deleting:"Виникла помилка при видаленні",error_renaming:"Виникла помилка при зміні імені файлу",error_copying:"Виникла помилка при коміюванні файлу",error_compressing:"Виникла помилка при стисненні",error_extracting:"Виникла помилка при розархівації",error_creating_folder:"Виникла помилка при створенні папки",error_getting_content:"Виникла помилка при отриманні вмісту",error_changing_perms:"Виникла помилка при зміні дозволів",error_uploading_files:"Виникла помилка при завантаженні",sure_to_start_compression_with:"Дійсно стиснути",owner:"Власник",group:"Група",others:"Інші",read:"Читання",write:"Запис",exec:"Виконання",original:"За замовчуванням",changes:"Зміни",recursive:"Рекурсивно",preview:"Перегляд",open:"Відкрити",these_elements:"усього {{total}} елементів",new_folder:"Нова папка",download_as_zip:"Download as ZIP"}),e.translations("tr",{filemanager:"Dosya Yöneticisi",language:"Dil",english:"İngilizce",spanish:"İspanyolca",portuguese:"Portekizce",french:"Fransızca",german:"Almanca",hebrew:"İbranice",italian:"İtalyanca",slovak:"Slovakça",chinese:"Çince",russian:"Rusça",ukrainian:"Ukraynaca",turkish:"Türkçe",persian:"Farsça",polish:"Lehçe",confirm:"Onayla",cancel:"İptal Et",close:"Kapat",upload_files:"Dosya yükle",files_will_uploaded_to:"Dosyalar yüklenecektir.",select_files:"Dosya Seç",uploading:"Yükleniyor",permissions:"İzinler",select_destination_folder:"Hedef klasör seçin",source:"Kaynak",destination:"Hedef",copy_file:"Dosyayı kopyala",sure_to_delete:"Silmek istediğinden emin misin",change_name_move:"İsmini değiştir / taşı",enter_new_name_for:"Yeni ad girin",extract_item:"Dosya çıkar",extraction_started:"Çıkarma işlemi arkaplanda devam ediyor",compression_started:"Sıkıştırma işlemi arkaplanda başladı",enter_folder_name_for_extraction:"Çıkarılması için klasör adı girin",enter_file_name_for_compression:"Sıkıştırılması için dosya adı girin",toggle_fullscreen:"Tam ekran moduna geç",edit_file:"Dosyayı düzenle",file_content:"Dosya içeriği",loading:"Yükleniyor",search:"Ara",create_folder:"Klasör oluştur",create:"Oluştur",folder_name:"Klasör adı",upload:"Yükle",change_permissions:"İzinleri değiştir",change:"Değiştir",details:"Detaylar",icons:"simgeler",list:"Liste",name:"Adı",size:"Boyutu",actions:"İşlemler",date:"Tarih",selection:"Seçim",no_files_in_folder:"Klasörde hiç dosya yok",no_folders_in_folder:"Bu klasör alt klasör içermez",select_this:"Bunu seç",go_back:"Geri git",wait:"Bekle",move:"Taşı",download:"İndir",view_item:"Dosyayı görüntüle",remove:"Sil",edit:"Düzenle",copy:"Kopyala",rename:"Yeniden Adlandır",extract:"Çıkart",compress:"Sıkıştır",error_invalid_filename:"Geçersiz dosya adı, bu dosya adına sahip dosya mevcut",error_modifying:"Dosya düzenlenirken bir hata oluştu",error_deleting:"Klasör veya dosya silinirken bir hata oluştu",error_renaming:"Dosya yeniden adlandırılırken bir hata oluştu",error_copying:"Dosya kopyalanırken bir hata oluştu",error_compressing:"Dosya veya klasör sıkıştırılırken bir hata oluştu",error_extracting:"Çıkartılırken bir hata oluştu",error_creating_folder:"Klasör oluşturulurken bir hata oluştu",error_getting_content:"Dosya detayları alınırken bir hata oluştu",error_changing_perms:"Dosyanın izini değiştirilirken bir hata oluştu",error_uploading_files:"Dosyalar yüklenirken bir hata oluştu",sure_to_start_compression_with:"Sıkıştırmak istediğinden emin misin",owner:"Sahip",group:"Grup",others:"Diğerleri",read:"Okuma",write:"Yazma",exec:"Gerçekleştir",original:"Orjinal",changes:"Değişiklikler",recursive:"Yinemeli",preview:"Dosyayı önizle",open:"Aç",these_elements:"{{total}} eleman",new_folder:"Yeni Klasör",download_as_zip:"ZIP olarak indir"}),e.translations("fa",{filemanager:"مدیریت فایل ها",language:"زبان",english:"انگلیسی",spanish:"اسپانیایی",portuguese:"پرتغالی",french:"فرانسه",german:"آلمانی",hebrew:"عبری",italian:"ایتالیایی",slovak:"اسلواک",chinese:"چینی",russian:"روسی",ukrainian:"اوکراینی",turkish:"ترکی",persian:"فارسی",polish:"لهستانی",confirm:"تایید",cancel:"رد",close:"بستن",upload_files:"آپلود فایل",files_will_uploaded_to:"فایل ها آپلود می شوند به",select_files:"انتخاب فایل ها",uploading:"در حال آپلود",permissions:"مجوز ها",select_destination_folder:"پوشه مقصد را انتخاب کنید",source:"مبدا",destination:"مقصد",copy_file:"کپی فایل",sure_to_delete:"مطمين هستید می خواهید حذف کنید؟",change_name_move:"تغییر نام و جابجایی",enter_new_name_for:"نام جدیدی وارد کنید برای",extract_item:"خارج کردن از حالت فشرده",extraction_started:"یک پروسه در پس زمینه شروع به خارج کردن از حالت فشرده کرد",compression_started:"یک پروسه در پس زمینه شروع به فشرده سازی کرد",enter_folder_name_for_extraction:"نام پوشه مقصد برای خارج کردن از حالت فشرده را وارد کنید",enter_file_name_for_compression:"نام پوشه مقصد برای فشرده سازی را وارد کنید",toggle_fullscreen:"تعویض حالت تمام صفحه",edit_file:"ویرایش",file_content:"محتویات",loading:"در حال بارگذاری",search:"جستجو",create_folder:"پوشه جدید",create:"ساختن",folder_name:"نام پوشه",upload:"آپلود",change_permissions:"تغییر مجوز ها",change:"تغییر",details:"جزییات",icons:"آیکون ها",list:"لیست",name:"نام",size:"سایز",actions:"اعمال",date:"تاریخ",selection:"انتخاب",no_files_in_folder:"هیچ فایلی در این پوشه نیست",no_folders_in_folder:"هیچ پوشه ای داخل این پوشه قرار ندارد",select_this:"انتخاب",go_back:"بازگشت",wait:"منتظر بمانید",move:"جابجایی",download:"دانلود",view_item:"مشاهده این مورد",remove:"حذف",edit:"ویرایش",copy:"کپی",rename:"تغییر نام",extract:"خروج از حالت فشرده",compress:"فشرده سازی",error_invalid_filename:"نام فایل مورد درست نیست و یا قبلا استفاده شده است، لطفا نام دیگری وارد کنید",error_modifying:"در هنگام تغییر فایل خطایی پیش آمد",error_deleting:"در هنگام حذف فایل خطایی پیش آمد",error_renaming:"در هنگام تغییر نام فایل خطایی پیش آمد",error_copying:"در هنگام کپی کردن فایل خطایی پیش آمد",error_compressing:"در هنگام فشرده سازی فایل خطایی پیش آمد",error_extracting:"در هنگام خارک کردن فایل از حالت فشرده خطایی پیش آمد",error_creating_folder:"در هنگام ساخت پوشه خطایی پیش امد",error_getting_content:"در هنگام بارگذاری محتویات فایل خطایی رخ داد",error_changing_perms:"در هنگام تغییر مجوز های فایل خطایی رخ داد",error_uploading_files:"در آپلود فایل خطایی رخ داد",sure_to_start_compression_with:"مطمئن هستید فشرده سازی انجام شد؟",owner:"مالک فایل",group:"گروه",others:"دیگران",read:"خواندن",write:"نوشتن",exec:"اجرا کردن",original:"اصلی",changes:"تغییرات",recursive:"بازگشتی",preview:"پیش نمایش",open:"باز کردن",these_elements:"تعداد {{total}} مورد",new_folder:"پوشه جدید",download_as_zip:"به عنوان فایل فشرده دانلود شود"}),e.translations("pl",{filemanager:"Menadżer plików",language:"Język",english:"Angielski",spanish:"Hiszpański",portuguese:"Portugalski",french:"Francuski",german:"Niemiecki",hebrew:"Hebrajski",italian:"Włoski",slovak:"Słowacki",chinese:"Chiński",russian:"Rosyjski",ukrainian:"Ukraiński",turkish:"Turecki",persian:"Perski",polish:"Polski",confirm:"Potwierdź",cancel:"Anuluj",close:"Zamknij",upload_files:"Wgraj pliki",files_will_uploaded_to:"Pliki będą umieszczone w katalogu",select_files:"Wybierz pliki",uploading:"Ładowanie",permissions:"Uprawnienia",select_destination_folder:"Wybierz folder docelowy",source:"Źródło",destination:"Cel",copy_file:"Kopiuj plik",sure_to_delete:"Jesteś pewien, że chcesz skasować",change_name_move:"Zmień nazwę / przenieś",enter_new_name_for:"Wpisz nową nazwę dla",extract_item:"Rozpakuj element",extraction_started:"Rozpakowywanie rozpoczęło się w tle",compression_started:"Kompresowanie rozpoczęło się w tle",enter_folder_name_for_extraction:"Wpisz nazwę folderu do rozpakowania",enter_file_name_for_compression:"Wpisz nazwę folderu do skompresowania",toggle_fullscreen:"Tryb pełnoekranowy",edit_file:"Edytuj plik",file_content:"Zawartość pliku",loading:"Ładowanie",search:"Szukaj",create_folder:"Stwórz folder",create:"Utwórz",folder_name:"Nazwa folderu",upload:"Wgraj",change_permissions:"Zmień uprawnienia",change:"Zmień",details:"Szczegóły",icons:"Ikony",list:"Lista",name:"Nazwa",size:"Rozmiar",actions:"Akcje",date:"Data",selection:"Zaznaczone",no_files_in_folder:"Brak plików w tym folderze",no_folders_in_folder:"Ten folder nie zawiera podfolderów",select_this:"Wybierz ten",go_back:"W górę",wait:"Wait",move:"Przenieś",download:"Pobierz",view_item:"Wyświetl",remove:"Usuń",edit:"Edycja",copy:"Kopiuj",rename:"Zmień nazwę",extract:"Rozpakuj",compress:"Skompresuj",error_invalid_filename:"Błędna nazwa pliku lub plik o takiej nazwie już istnieje, proszę użyć innej nazwy",error_modifying:"Wystąpił błąd podczas modyfikowania pliku",error_deleting:"Wystąpił błąd podczas usuwania pliku lub folderu",error_renaming:"Wystąpił błąd podczas zmiany nazwy pliku",error_copying:"Wystąpił błąd podczas kopiowania pliku",error_compressing:"Wystąpił błąd podczas kompresowania pliku lub folderu",error_extracting:"Wystąpił błąd podczas rozpakowywania pliku",error_creating_folder:"Wystąpił błąd podczas tworzenia nowego folderu",error_getting_content:"Wystąpił błąd podczas pobierania zawartości pliku",error_changing_perms:"Wystąpił błąd podczas zmiany uprawnień pliku",error_uploading_files:"Wystąpił błąd podczas wgrywania plików",sure_to_start_compression_with:"Jesteś pewien, że chcesz skompresować",owner:"Właściciel",group:"Grupa",others:"Inni",read:"Odczyt",write:"Zapis",exec:"Wykonywanie",original:"Oryginał",changes:"Zmiany",recursive:"Rekursywnie",preview:"Podgląd elementu",open:"Otwórz",these_elements:"te {{total}} elementy?",new_folder:"Nowy folder",download_as_zip:"Pobierz jako ZIP"}),e.translations("it",{filemanager:"Gestore File",language:"Lingua",english:"Inglese",spanish:"Spagnolo",portuguese:"Portoghese",french:"Francese",german:"Tedesco",hebrew:"Ebraico",slovak:"Slovacco",chinese:"Cinese",russian:"Russo",ukrainian:"Ucraino",turkish:"Turco",persian:"Persiano",polish:"Polacco",confirm:"Conferma",cancel:"Annulla",close:"Chiudi",upload_files:"Carica files",files_will_uploaded_to:"I files saranno caricati in",select_files:"Seleziona i files",uploading:"Trasferimento",permissions:"Permessi",select_destination_folder:"Select carterlla di destinazione",source:"Sorgente",destination:"Destinazione",copy_file:"Copia file",sure_to_delete:"Sicuro di voler eliminare",change_name_move:"Rinomina / sposta",enter_new_name_for:"Inserisci nuovo nome per",extract_item:"Estrai elemento",extraction_started:"Decompressione avviata da un processo in background",compression_started:"Compressione avviata da un processo in background",enter_folder_name_for_extraction:"Inserisci nome cartella per l'estrazione di",enter_file_name_for_compression:"Inserisci nome file per la compressione di",toggle_fullscreen:"Passa a schermo intero",edit_file:"Modifica file",file_content:"Contenuto del file",loading:"Caricamento",search:"Cerca",create_folder:"Crea cartella",create:"Crea",folder_name:"Nome cartella",upload:"Upload",change_permissions:"Modifica permessi",change:"Modifica",details:"Dettagli",icons:"Icone",list:"Lista",name:"Nome",size:"Dimensione",actions:"Azioni",date:"Data",selection:"Selezione",no_files_in_folder:"Nessun file nella cartella",no_folders_in_folder:"Questa cartella non contiene altre cartelle",select_this:"Seleziona questo",go_back:"Indietro",wait:"Attendere",move:"Sposta",download:"Scarica",view_item:"Visualizza elemento",remove:"Elimina",edit:"Modifica",copy:"Copia",rename:"Rinomina",extract:"Estrai",compress:"Comprimi",error_invalid_filename:"Nome file non valido o già esistente, specificarne un'altro",error_modifying:"Errore durante la modifica del file",error_deleting:"Errore durante l'eliminazione del file o della cartella",error_renaming:"Errore durante la rinomina del file",error_copying:"Errore durante la copia del file",error_compressing:"Errore durante la compressione del file o della cartella",error_extracting:"Errore durante l'estrazione del file",error_creating_folder:"Errore nella creazione della cartella",error_getting_content:"Errore nel recupero del contenuto del file",error_changing_perms:"Errore durante la modifica dei permessi del file",error_uploading_files:"Errore durante il trasferimento dei files",sure_to_start_compression_with:"Sicuro di voler comprimere",owner:"Proprietario",group:"Gruppo",others:"Altri",read:"Lettura",write:"Scrittura",exec:"Esecuzione",original:"Originario",changes:"Cambiamenti",recursive:"Ricorsivo",preview:"Anteprima",open:"Apri",these_elements:"questi {{total}} elementi",new_folder:"Nuova cartella",download_as_zip:"Scarica come file ZIP"})}])}(angular),function(e,r){"use strict";e.module("FileManagerApp").service("apiHandler",["$http","$q","$window","$translate","Upload",function(e,n,i,a,t){e.defaults.headers.common["X-Requested-With"]="XMLHttpRequest";var o=function(){this.inprocess=!1,this.asyncSuccess=!1,this.error=""};return o.prototype.deferredHandler=function(e,r,n,i){return e&&"object"==typeof e||(this.error="Error %s - Bridge response error, please check the API docs or this ajax response.".replace("%s",n)),404==n&&(this.error="Error 404 - Backend bridge is not working, please check the ajax response."),e.result&&e.result.error&&(this.error=e.result.error),!this.error&&e.error&&(this.error=e.error.message),!this.error&&i&&(this.error=i),this.error?r.reject(e):r.resolve(e)},o.prototype.list=function(r,i,a,t){var o=this,s=a||o.deferredHandler,l=n.defer(),d={action:"list",path:i,fileExtensions:t&&t.length?t:void 0};return o.inprocess=!0,o.error="",e.post(r,d).success(function(e,r){s(e,l,r)}).error(function(e,r){s(e,l,r,"Unknown error listing, check the response")})["finally"](function(){o.inprocess=!1}),l.promise},o.prototype.copy=function(r,i,t,o){var s=this,l=n.defer(),d={action:"copy",items:i,newPath:t};return o&&1===i.length&&(d.singleFilename=o),s.inprocess=!0,s.error="",e.post(r,d).success(function(e,r){s.deferredHandler(e,l,r)}).error(function(e,r){s.deferredHandler(e,l,r,a.instant("error_copying"))})["finally"](function(){s.inprocess=!1}),l.promise},o.prototype.move=function(r,i,t){var o=this,s=n.defer(),l={action:"move",items:i,newPath:t};return o.inprocess=!0,o.error="",e.post(r,l).success(function(e,r){o.deferredHandler(e,s,r)}).error(function(e,r){o.deferredHandler(e,s,r,a.instant("error_moving"))})["finally"](function(){o.inprocess=!1}),s.promise},o.prototype.remove=function(r,i){var t=this,o=n.defer(),s={action:"remove",items:i};return t.inprocess=!0,t.error="",e.post(r,s).success(function(e,r){t.deferredHandler(e,o,r)}).error(function(e,r){t.deferredHandler(e,o,r,a.instant("error_deleting"))})["finally"](function(){t.inprocess=!1}),o.promise},o.prototype.upload=function(e,r,i){var a=this,o=n.defer();a.inprocess=!0,a.progress=0,a.error="";for(var s={destination:r},l=0;l<i.length;l++)s["file-"+l]=i[l];return i&&i.length&&t.upload({url:e,data:s}).then(function(e){a.deferredHandler(e.data,o,e.status)},function(e){a.deferredHandler(e.data,o,e.status,"Unknown error uploading files")},function(e){a.progress=Math.min(100,parseInt(100*e.loaded/e.total))-1})["finally"](function(){a.inprocess=!1,a.progress=0}),o.promise},o.prototype.getContent=function(r,i){var t=this,o=n.defer(),s={action:"getContent",item:i};return t.inprocess=!0,t.error="",e.post(r,s).success(function(e,r){t.deferredHandler(e,o,r)}).error(function(e,r){t.deferredHandler(e,o,r,a.instant("error_getting_content"))})["finally"](function(){t.inprocess=!1}),o.promise},o.prototype.edit=function(r,i,t){var o=this,s=n.defer(),l={action:"edit",item:i,content:t};return o.inprocess=!0,o.error="",e.post(r,l).success(function(e,r){o.deferredHandler(e,s,r)}).error(function(e,r){o.deferredHandler(e,s,r,a.instant("error_modifying"))})["finally"](function(){o.inprocess=!1}),s.promise},o.prototype.rename=function(r,i,t){var o=this,s=n.defer(),l={action:"rename",item:i,newItemPath:t};return o.inprocess=!0,o.error="",e.post(r,l).success(function(e,r){o.deferredHandler(e,s,r)}).error(function(e,r){o.deferredHandler(e,s,r,a.instant("error_renaming"))})["finally"](function(){o.inprocess=!1}),s.promise},o.prototype.getUrl=function(e,n){var i={action:"download",path:n};return n&&[e,r.param(i)].join("?")},o.prototype.download=function(r,t,o,s,l){var d=this,c=this.getUrl(r,t);if(!s||l||!i.saveAs)return!i.saveAs&&i.console.log("Your browser dont support ajax download, downloading by default"),!!i.open(c,"_blank","");var p=n.defer();return d.inprocess=!0,e.get(c).success(function(e){var r=new i.Blob([e]);p.resolve(e),i.saveAs(r,o)}).error(function(e,r){d.deferredHandler(e,p,r,a.instant("error_downloading"))})["finally"](function(){d.inprocess=!1}),p.promise},o.prototype.downloadMultiple=function(t,o,s,l,d){var c=this,p=n.defer(),m={action:"downloadMultiple",items:o,toFilename:s},u=[t,r.param(m)].join("?");return l&&!d&&i.saveAs?(c.inprocess=!0,e.get(t).success(function(e){var r=new i.Blob([e]);p.resolve(e),i.saveAs(r,s)}).error(function(e,r){c.deferredHandler(e,p,r,a.instant("error_downloading"))})["finally"](function(){c.inprocess=!1}),p.promise):(!i.saveAs&&i.console.log("Your browser dont support ajax download, downloading by default"),!!i.open(u,"_blank",""))},o.prototype.compress=function(r,i,t,o){var s=this,l=n.defer(),d={action:"compress",items:i,destination:o,compressedFilename:t};return s.inprocess=!0,s.error="",e.post(r,d).success(function(e,r){s.deferredHandler(e,l,r)}).error(function(e,r){s.deferredHandler(e,l,r,a.instant("error_compressing"))})["finally"](function(){s.inprocess=!1}),l.promise},o.prototype.extract=function(r,i,t,o){var s=this,l=n.defer(),d={action:"extract",item:i,destination:o,folderName:t};return s.inprocess=!0,s.error="",e.post(r,d).success(function(e,r){s.deferredHandler(e,l,r)}).error(function(e,r){s.deferredHandler(e,l,r,a.instant("error_extracting"))})["finally"](function(){s.inprocess=!1}),l.promise},o.prototype.changePermissions=function(r,i,t,o,s){var l=this,d=n.defer(),c={action:"changePermissions",items:i,perms:t,permsCode:o,recursive:!!s};return l.inprocess=!0,l.error="",e.post(r,c).success(function(e,r){l.deferredHandler(e,d,r)}).error(function(e,r){l.deferredHandler(e,d,r,a.instant("error_changing_perms"))})["finally"](function(){l.inprocess=!1}),d.promise},o.prototype.createFolder=function(r,i){var t=this,o=n.defer(),s={action:"createFolder",newPath:i};return t.inprocess=!0,t.error="",e.post(r,s).success(function(e,r){t.deferredHandler(e,o,r)}).error(function(e,r){t.deferredHandler(e,o,r,a.instant("error_creating_folder"))})["finally"](function(){t.inprocess=!1}),o.promise},o}])}(angular,jQuery),function(e){"use strict";e.module("FileManagerApp").service("apiMiddleware",["$window","fileManagerConfig","apiHandler",function(e,r,n){var i=function(){this.apiHandler=new n};return i.prototype.getPath=function(e){return"/"+e.join("/")},i.prototype.getFileList=function(e){return(e||[]).map(function(e){return e&&e.model.fullPath()})},i.prototype.getFilePath=function(e){return e&&e.model.fullPath()},i.prototype.list=function(e,n){return this.apiHandler.list(r.listUrl,this.getPath(e),n)},i.prototype.copy=function(e,n){var i=this.getFileList(e),a=1===i.length?e[0].tempModel.name:void 0;return this.apiHandler.copy(r.copyUrl,i,this.getPath(n),a)},i.prototype.move=function(e,n){var i=this.getFileList(e);return this.apiHandler.move(r.moveUrl,i,this.getPath(n))},i.prototype.remove=function(e){var n=this.getFileList(e);return this.apiHandler.remove(r.removeUrl,n)},i.prototype.upload=function(n,i){if(!e.FormData)throw new Error("Unsupported browser version");var a=this.getPath(i);return this.apiHandler.upload(r.uploadUrl,a,n)},i.prototype.getContent=function(e){var n=this.getFilePath(e);return this.apiHandler.getContent(r.getContentUrl,n)},i.prototype.edit=function(e){var n=this.getFilePath(e);return this.apiHandler.edit(r.editUrl,n,e.tempModel.content)},i.prototype.rename=function(e){var n=this.getFilePath(e),i=e.tempModel.fullPath();return this.apiHandler.rename(r.renameUrl,n,i)},i.prototype.getUrl=function(e){var n=this.getFilePath(e);return this.apiHandler.getUrl(r.downloadFileUrl,n)},i.prototype.download=function(e,n){var i=this.getFilePath(e),a=e.model.name;if(!e.isFolder())return this.apiHandler.download(r.downloadFileUrl,i,a,r.downloadFilesByAjax,n)},i.prototype.downloadMultiple=function(e,n){var i=this.getFileList(e),a=(new Date).getTime().toString().substr(8,13),t=a+"-"+r.multipleDownloadFileName;return this.apiHandler.downloadMultiple(r.downloadMultipleUrl,i,t,r.downloadFilesByAjax,n)},i.prototype.compress=function(e,n,i){var a=this.getFileList(e);return this.apiHandler.compress(r.compressUrl,a,n,this.getPath(i))},i.prototype.extract=function(e,n,i){var a=this.getFilePath(e);return this.apiHandler.extract(r.extractUrl,a,n,this.getPath(i))},i.prototype.changePermissions=function(e,n){var i=this.getFileList(e),a=n.tempModel.perms.toCode(),t=n.tempModel.perms.toOctal(),o=!!n.tempModel.recursive;return this.apiHandler.changePermissions(r.permissionsUrl,i,a,t,o)},i.prototype.createFolder=function(e){var n=e.tempModel.fullPath();return this.apiHandler.createFolder(r.createFolderUrl,n)},i}])}(angular),function(e){"use strict";e.module("FileManagerApp").service("fileNavigator",["apiMiddleware","fileManagerConfig","item",function(e,r,n){var i=function(){this.apiMiddleware=new e,this.requesting=!1,this.fileList=[],this.currentPath=this.getBasePath(),this.history=[],this.error="",this.onRefresh=function(){}};return i.prototype.getBasePath=function(){var e=(r.basePath||"").replace(/^\//,"");return e.trim()?e.split("/"):[]},i.prototype.deferredHandler=function(e,r,n,i){return e&&"object"==typeof e||(this.error="Error %s - Bridge response error, please check the API docs or this ajax response.".replace("%s",n)),
+404==n&&(this.error="Error 404 - Backend bridge is not working, please check the ajax response."),200==n&&(this.error=null),!this.error&&e.result&&e.result.error&&(this.error=e.result.error),!this.error&&e.error&&(this.error=e.error.message),!this.error&&i&&(this.error=i),this.error?r.reject(e):r.resolve(e)},i.prototype.list=function(){return this.apiMiddleware.list(this.currentPath,this.deferredHandler.bind(this))},i.prototype.refresh=function(){var e=this;e.currentPath.length||(e.currentPath=this.getBasePath());var r=e.currentPath.join("/");return e.requesting=!0,e.fileList=[],e.list().then(function(i){e.fileList=(i.result||[]).map(function(r){return new n(r,e.currentPath)}),e.buildTree(r),e.onRefresh()})["finally"](function(){e.requesting=!1})},i.prototype.buildTree=function(e){function r(e,n,i){var a=i?i+"/"+n.model.name:n.model.name;if(e.name&&e.name.trim()&&0!==i.trim().indexOf(e.name)&&(e.nodes=[]),e.name!==i)e.nodes.forEach(function(e){r(e,n,i)});else{for(var t in e.nodes)if(e.nodes[t].name===a)return;e.nodes.push({item:n,name:a,nodes:[]})}e.nodes=e.nodes.sort(function(e,r){return e.name.toLowerCase()<r.name.toLowerCase()?-1:e.name.toLowerCase()===r.name.toLowerCase()?0:1})}function i(e,r){r.push(e);for(var n in e.nodes)i(e.nodes[n],r)}function a(e,r){return e.filter(function(e){return e.name===r})[0]}var t=[],o={};!this.history.length&&this.history.push({name:this.getBasePath()[0]||"",nodes:[]}),i(this.history[0],t),o=a(t,e),o&&(o.nodes=[]);for(var s in this.fileList){var l=this.fileList[s];l instanceof n&&l.isFolder()&&r(this.history[0],l,e)}},i.prototype.folderClick=function(e){this.currentPath=[],e&&e.isFolder()&&(this.currentPath=e.model.fullPath().split("/").splice(1)),this.refresh()},i.prototype.upDir=function(){this.currentPath[0]&&(this.currentPath=this.currentPath.slice(0,-1),this.refresh())},i.prototype.goTo=function(e){this.currentPath=this.currentPath.slice(0,e+1),this.refresh()},i.prototype.fileNameExists=function(e){return this.fileList.find(function(r){return e&&r.model.name.trim()===e.trim()})},i.prototype.listHasFolders=function(){return this.fileList.find(function(e){return"dir"===e.model.type})},i.prototype.getCurrentFolderName=function(){return this.currentPath.slice(-1)[0]||"/"},i}])}(angular),angular.module("FileManagerApp").run(["$templateCache",function(e){e.put("src/templates/current-folder-breadcrumb.html",'<ol class="breadcrumb">\r\n    <li>\r\n        <a href="" ng-click="fileNavigator.goTo(-1)">\r\n            {{ config.appName }}\r\n        </a>\r\n    </li>\r\n    <li ng-repeat="(key, dir) in fileNavigator.currentPath track by key" ng-class="{\'active\':$last}" class="animated fast fadeIn">\r\n        <a href="" ng-show="!$last" ng-click="fileNavigator.goTo(key)">\r\n            {{dir | strLimit : 8}}\r\n        </a>\r\n        <span ng-show="$last">\r\n            {{dir | strLimit : 12}}\r\n        </span>\r\n    </li>\r\n</ol>'),e.put("src/templates/item-context-menu.html",'<div id="context-menu" class="dropdown clearfix animated fast fadeIn">\r\n    <ul class="dropdown-menu dropdown-right-click" role="menu" aria-labelledby="dropdownMenu" ng-show="temps.length">\r\n\r\n        <li ng-show="singleSelection() && singleSelection().isFolder()">\r\n            <a href="" tabindex="-1" ng-click="smartClick(singleSelection())">\r\n                <i class="glyphicon glyphicon-folder-open"></i> {{\'open\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.pickCallback && singleSelection() && singleSelection().isSelectable()">\r\n            <a href="" tabindex="-1" ng-click="config.pickCallback(singleSelection().model)">\r\n                <i class="glyphicon glyphicon-hand-up"></i> {{\'select_this\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.download && !selectionHas(\'dir\') && singleSelection()">\r\n            <a href="" tabindex="-1" ng-click="download()">\r\n                <i class="glyphicon glyphicon-cloud-download"></i> {{\'download\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.downloadMultiple && !selectionHas(\'dir\') && !singleSelection()">\r\n            <a href="" tabindex="-1" ng-click="download()">\r\n                <i class="glyphicon glyphicon-cloud-download"></i> {{\'download_as_zip\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.download && !selectionHas(\'dir\') && singleSelection()">\r\n            <a href="" tabindex="-1" ng-click="openDwonloadLink()">\r\n                <i class="glyphicon glyphicon-cloud-download"></i> {{\'downloadlink\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.preview && singleSelection().isImage() && singleSelection()">\r\n            <a href="" tabindex="-1" ng-click="openImagePreview()">\r\n                <i class="glyphicon glyphicon-picture"></i> {{\'view_item\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.rename && singleSelection()">\r\n            <a href="" tabindex="-1" ng-click="modal(\'rename\')">\r\n                <i class="glyphicon glyphicon-edit"></i> {{\'rename\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.move">\r\n            <a href="" tabindex="-1" ng-click="modalWithPathSelector(\'move\')">\r\n                <i class="glyphicon glyphicon-arrow-right"></i> {{\'move\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.copy && !selectionHas(\'dir\')">\r\n            <a href="" tabindex="-1" ng-click="modalWithPathSelector(\'copy\')">\r\n                <i class="glyphicon glyphicon-log-out"></i> {{\'copy\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.edit && singleSelection() && singleSelection().isEditable()">\r\n            <a href="" tabindex="-1" ng-click="openEditItem()">\r\n                <i class="glyphicon glyphicon-pencil"></i> {{\'edit\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.changePermissions">\r\n            <a href="" tabindex="-1" ng-click="modal(\'changepermissions\')">\r\n                <i class="glyphicon glyphicon-lock"></i> {{\'permissions\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.compress && (!singleSelection() || selectionHas(\'dir\'))">\r\n            <a href="" tabindex="-1" ng-click="modal(\'compress\')">\r\n                <i class="glyphicon glyphicon-compressed"></i> {{\'compress\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li ng-show="config.allowedActions.extract && singleSelection() && singleSelection().isExtractable()">\r\n            <a href="" tabindex="-1" ng-click="modal(\'extract\')">\r\n                <i class="glyphicon glyphicon-export"></i> {{\'extract\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n        <li class="divider" ng-show="config.allowedActions.remove"></li>\r\n        \r\n        <li ng-show="config.allowedActions.remove">\r\n            <a href="" tabindex="-1" ng-click="modal(\'remove\')">\r\n                <i class="glyphicon glyphicon-trash"></i> {{\'remove\' | translate}}\r\n            </a>\r\n        </li>\r\n\r\n    </ul>\r\n\r\n    <ul class="dropdown-menu dropdown-right-click" role="menu" aria-labelledby="dropdownMenu" ng-show="!temps.length">\r\n        <li ng-show="config.allowedActions.createFolder">\r\n            <a href="" tabindex="-1" ng-click="modal(\'newfolder\') && prepareNewFolder()">\r\n                <i class="glyphicon glyphicon-plus"></i> {{\'new_folder\' | translate}}\r\n            </a>\r\n        </li>\r\n        <li ng-show="config.allowedActions.upload">\r\n            <a href="" tabindex="-1" ng-click="modal(\'uploadfile\')">\r\n                <i class="glyphicon glyphicon-cloud-upload"></i> {{\'upload_files\' | translate}}\r\n            </a>\r\n        </li>\r\n    </ul>\r\n</div>'),e.put("src/templates/main-icons.html",'<div class="iconset noselect">\r\n    <div class="item-list clearfix" ng-click="selectOrUnselect(null, $event)" ng-right-click="selectOrUnselect(null, $event)" prevent="true">\r\n        <div class="col-120" ng-repeat="item in $parent.fileList = (fileNavigator.fileList | filter: {model:{name: query}})" ng-show="!fileNavigator.requesting && !fileNavigator.error">\r\n            <a href="" class="thumbnail text-center" ng-click="selectOrUnselect(item, $event)" ng-dblclick="smartClick(item)" ng-right-click="selectOrUnselect(item, $event)" title="{{item.model.name}} ({{item.model.size | humanReadableFileSize}})" ng-class="{selected: isSelected(item)}">\r\n                <div class="item-icon">\r\n                    <i class="glyphicon glyphicon-folder-open" ng-show="item.model.type === \'dir\'"></i>\r\n                    <i class="glyphicon glyphicon-file" data-ext="{{ item.model.name | fileExtension }}" ng-show="item.model.type === \'file\'" ng-class="{\'item-extension\': config.showExtensionIcons}"></i>\r\n                </div>\r\n                {{item.model.name | strLimit : 11 }}\r\n            </a>\r\n        </div>\r\n    </div>\r\n\r\n    <div ng-show="fileNavigator.requesting">\r\n        <div ng-include="config.tplPath + \'/spinner.html\'"></div>\r\n    </div>\r\n\r\n    <div class="alert alert-warning" ng-show="!fileNavigator.requesting && fileNavigator.fileList.length < 1 && !fileNavigator.error">\r\n        {{"no_files_in_folder" | translate}}...\r\n    </div>\r\n    \r\n    <div class="alert alert-danger" ng-show="!fileNavigator.requesting && fileNavigator.error">\r\n        {{ fileNavigator.error }}\r\n    </div>\r\n</div>'),e.put("src/templates/main-table-modal.html",'<table class="table table-condensed table-modal-condensed mb0">\r\n    <thead>\r\n        <tr>\r\n            <th>\r\n                <a href="" ng-click="order(\'model.name\')">\r\n                    {{"name" | translate}}\r\n                    <span class="sortorder" ng-show="predicate[1] === \'model.name\'" ng-class="{reverse:reverse}"></span>\r\n                </a>\r\n            </th>\r\n            <th class="text-right"></th>\r\n        </tr>\r\n    </thead>\r\n    <tbody class="file-item">\r\n        <tr ng-show="fileNavigator.requesting">\r\n            <td colspan="2">\r\n                <div ng-include="config.tplPath + \'/spinner.html\'"></div>\r\n            </td>\r\n        </tr>\r\n        <tr ng-show="!fileNavigator.requesting && !fileNavigator.listHasFolders() && !fileNavigator.error">\r\n            <td>\r\n                {{"no_folders_in_folder" | translate}}...\r\n            </td>\r\n            <td class="text-right">\r\n                <button class="btn btn-sm btn-default" ng-click="fileNavigator.upDir()">{{"go_back" | translate}}</button>\r\n            </td>\r\n        </tr>\r\n        <tr ng-show="!fileNavigator.requesting && fileNavigator.error">\r\n            <td colspan="2">\r\n                {{ fileNavigator.error }}\r\n            </td>\r\n        </tr>\r\n        <tr ng-repeat="item in fileNavigator.fileList | orderBy:predicate:reverse" ng-show="!fileNavigator.requesting && item.model.type === \'dir\'" ng-if="!selectedFilesAreChildOfPath(item)">\r\n            <td>\r\n                <a href="" ng-click="fileNavigator.folderClick(item)" title="{{item.model.name}} ({{item.model.size | humanReadableFileSize}})">\r\n                    <i class="glyphicon glyphicon-folder-close"></i>\r\n                    {{item.model.name | strLimit : 32}}\r\n                </a>\r\n            </td>\r\n            <td class="text-right">\r\n                <button class="btn btn-sm btn-default" ng-click="select(item)">\r\n                    <i class="glyphicon glyphicon-hand-up"></i> {{"select_this" | translate}}\r\n                </button>\r\n            </td>\r\n        </tr>\r\n    </tbody>\r\n</table>'),e.put("src/templates/main-table.html",'<table class="table mb0 table-files noselect">\r\n    <thead>\r\n        <tr>\r\n            <th>\r\n                <a href="" ng-click="order(\'model.name\')">\r\n                    {{"name" | translate}}\r\n                    <span class="sortorder" ng-show="predicate[1] === \'model.name\'" ng-class="{reverse:reverse}"></span>\r\n                </a>\r\n            </th>\r\n            <th class="hidden-xs" ng-hide="config.hideSize">\r\n                <a href="" ng-click="order(\'model.size\')">\r\n                    {{"size" | translate}}\r\n                    <span class="sortorder" ng-show="predicate[1] === \'model.size\'" ng-class="{reverse:reverse}"></span>\r\n                </a>\r\n            </th>\r\n            <th class="hidden-sm hidden-xs" ng-hide="config.hideDate">\r\n                <a href="" ng-click="order(\'model.date\')">\r\n                    {{"date" | translate}}\r\n                    <span class="sortorder" ng-show="predicate[1] === \'model.date\'" ng-class="{reverse:reverse}"></span>\r\n                </a>\r\n            </th>\r\n            <th class="hidden-sm hidden-xs" ng-hide="config.hidePermissions">\r\n                <a href="" ng-click="order(\'model.permissions\')">\r\n                    {{"permissions" | translate}}\r\n                    <span class="sortorder" ng-show="predicate[1] === \'model.permissions\'" ng-class="{reverse:reverse}"></span>\r\n                </a>\r\n            </th>\r\n        </tr>\r\n    </thead>\r\n    <tbody class="file-item">\r\n        <tr ng-show="fileNavigator.requesting">\r\n            <td colspan="5">\r\n                <div ng-include="config.tplPath + \'/spinner.html\'"></div>\r\n            </td>\r\n        </tr>\r\n        <tr ng-show="!fileNavigator.requesting &amp;&amp; fileNavigator.fileList.length < 1 &amp;&amp; !fileNavigator.error">\r\n            <td colspan="5">\r\n                {{"no_files_in_folder" | translate}}...\r\n            </td>\r\n        </tr>\r\n        <tr ng-show="!fileNavigator.requesting &amp;&amp; fileNavigator.error">\r\n            <td colspan="5">\r\n                {{ fileNavigator.error }}\r\n            </td>\r\n        </tr>\r\n        <tr class="item-list" ng-repeat="item in $parent.fileList = (fileNavigator.fileList | filter: {model:{name: query}} | orderBy:predicate:reverse)" ng-show="!fileNavigator.requesting" ng-click="selectOrUnselect(item, $event)" ng-dblclick="smartClick(item)" ng-right-click="selectOrUnselect(item, $event)" ng-class="{selected: isSelected(item)}">\r\n            <td>\r\n                <a href="" title="{{item.model.name}} ({{item.model.size | humanReadableFileSize}})">\r\n                    <i class="glyphicon glyphicon-folder-close" ng-show="item.model.type === \'dir\'"></i>\r\n                    <i class="glyphicon glyphicon-file" ng-show="item.model.type === \'file\'"></i>\r\n                    {{item.model.name | strLimit : 64}}\r\n                </a>\r\n            </td>\r\n            <td class="hidden-xs">\r\n                <span ng-show="item.model.type !== \'dir\' || config.showSizeForDirectories">\r\n                    {{item.model.size | humanReadableFileSize}}\r\n                </span>\r\n            </td>\r\n            <td class="hidden-sm hidden-xs" ng-hide="config.hideDate">\r\n                {{item.model.date | formatDate }}\r\n            </td>\r\n            <td class="hidden-sm hidden-xs" ng-hide="config.hidePermissions">\r\n                {{item.model.perms.toCode(item.model.type === \'dir\'?\'d\':\'-\')}}\r\n            </td>\r\n        </tr>\r\n    </tbody>\r\n</table>\r\n'),e.put("src/templates/main.html",'<div ng-controller="FileManagerCtrl" ngf-drop="addForUpload($files)" ngf-drag-over-class="\'upload-dragover\'" ngf-multiple="true">\r\n    <div ng-include="config.tplPath + \'/navbar.html\'"></div>\r\n\r\n    <div class="container-fluid">\r\n        <div class="row">\r\n\r\n            <div class="col-sm-4 col-md-3 sidebar file-tree animated slow fadeIn" ng-include="config.tplPath + \'/sidebar.html\'" ng-show="config.sidebar &amp;&amp; fileNavigator.history[0]">\r\n            </div>\r\n\r\n            <div class="main" ng-class="config.sidebar &amp;&amp; fileNavigator.history[0] &amp;&amp; \'col-sm-8 col-md-9\'">\r\n                <div ng-include="config.tplPath + \'/\' + viewTemplate" class="main-navigation clearfix"></div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <div ng-include="config.tplPath + \'/modals.html\'"></div>\r\n    <div ng-include="config.tplPath + \'/item-context-menu.html\'"></div>\r\n</div>\r\n'),e.put("src/templates/modals.html",'<div class="modal animated fadeIn" id="imagepreview">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n      <div class="modal-header">\r\n        <button type="button" class="close" data-dismiss="modal">\r\n            <span aria-hidden="true">&times;</span>\r\n            <span class="sr-only">{{"close" | translate}}</span>\r\n        </button>\r\n        <h4 class="modal-title">{{"preview" | translate}}</h4>\r\n      </div>\r\n      <div class="modal-body">\r\n        <div class="text-center">\r\n          <img id="imagepreview-target" class="preview" alt="{{singleSelection().model.name}}" ng-class="{\'loading\': apiMiddleware.apiHandler.inprocess}">\r\n          <span class="label label-warning" ng-show="apiMiddleware.apiHandler.inprocess">{{\'loading\' | translate}} ...</span>\r\n        </div>\r\n        <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n      </div>\r\n      <div class="modal-footer">\r\n        <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="downloadlink">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n      <div class="modal-header">\r\n        <button type="button" class="close" data-dismiss="modal">\r\n          <span aria-hidden="true">&times;</span>\r\n          <span class="sr-only">{{"close" | translate}}</span>\r\n        </button>\r\n        <h4 class="modal-title">{{"downloadlink" | translate}}</h4>\r\n      </div>\r\n      <div class="modal-body">\r\n        <div class="text-center">\r\n          <input type="text" class="form-control" autofocus="autofocus" id="downloadlink-target">\r\n          <span class="label label-warning" ng-show="apiMiddleware.apiHandler.inprocess">{{\'loading\' | translate}} ...</span>\r\n        </div>\r\n        <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n      </div>\r\n      <div class="modal-footer">\r\n        <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="remove">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n    <form ng-submit="remove()">\r\n      <div class="modal-header">\r\n        <button type="button" class="close" data-dismiss="modal">\r\n            <span aria-hidden="true">&times;</span>\r\n            <span class="sr-only">{{"close" | translate}}</span>\r\n        </button>\r\n        <h4 class="modal-title">{{"confirm" | translate}}</h4>\r\n      </div>\r\n      <div class="modal-body">\r\n        {{\'sure_to_delete\' | translate}} <span ng-include data-src="\'selected-files-msg\'"></span>\r\n\r\n        <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n      </div>\r\n      <div class="modal-footer">\r\n        <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n        <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess" autofocus="autofocus">{{"remove" | translate}}</button>\r\n      </div>\r\n      </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="move">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="move()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'move\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <div ng-include data-src="\'path-selector\'" class="clearfix"></div>\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n              <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'move\' | translate}}</button>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n\r\n<div class="modal animated fadeIn" id="rename">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="rename()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'rename\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <label class="radio">{{\'enter_new_name_for\' | translate}} <b>{{singleSelection() && singleSelection().model.name}}</b></label>\r\n              <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\r\n\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n              <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'rename\' | translate}}</button>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="copy">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="copy()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'copy_file\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <div ng-show="singleSelection()">\r\n                <label class="radio">{{\'enter_new_name_for\' | translate}} <b>{{singleSelection().model.name}}</b></label>\r\n                <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\r\n              </div>\r\n\r\n              <div ng-include data-src="\'path-selector\'" class="clearfix"></div>\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n              <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"copy" | translate}}</button>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="compress">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="compress()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'compress\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <div class="label label-success error-msg">{{\'compression_started\' | translate}}</div>\r\n              </div>\r\n              <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <div ng-hide="config.allowedActions.compressChooseName">\r\n                    {{\'sure_to_start_compression_with\' | translate}} <b>{{singleSelection().model.name}}</b> ?\r\n                  </div>\r\n                  <div ng-show="config.allowedActions.compressChooseName">\r\n                    <label class="radio">\r\n                      {{\'enter_file_name_for_compression\' | translate}}\r\n                      <span ng-include data-src="\'selected-files-msg\'"></span>\r\n                    </label>\r\n                    <input class="form-control" ng-model="temp.tempModel.name" autofocus="autofocus">\r\n                  </div>\r\n              </div>\r\n\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n              </div>\r\n              <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n                  <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'compress\' | translate}}</button>\r\n              </div>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="extract" ng-init="singleSelection().emptyName()">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="extract()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'extract_item\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <div class="label label-success error-msg">{{\'extraction_started\' | translate}}</div>\r\n              </div>\r\n              <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <label class="radio">{{\'enter_folder_name_for_extraction\' | translate}} <b>{{singleSelection().model.name}}</b></label>\r\n                  <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\r\n              </div>\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n              </div>\r\n              <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\r\n                  <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n                  <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'extract\' | translate}}</button>\r\n              </div>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="edit" ng-class="{\'modal-fullscreen\': fullscreen}">\r\n  <div class="modal-dialog modal-lg">\r\n    <div class="modal-content">\r\n        <form ng-submit="edit()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <button type="button" class="close fullscreen" ng-click="fullscreen=!fullscreen">\r\n                  <i class="glyphicon glyphicon-fullscreen"></i>\r\n                  <span class="sr-only">{{\'toggle_fullscreen\' | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'edit_file\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n                <label class="radio bold">{{ singleSelection().model.fullPath() }}</label>\r\n                <span class="label label-warning" ng-show="apiMiddleware.apiHandler.inprocess">{{\'loading\' | translate}} ...</span>\r\n                <textarea class="form-control code" ng-model="singleSelection().tempModel.content" ng-show="!apiMiddleware.apiHandler.inprocess" autofocus="autofocus"></textarea>\r\n                <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'close\' | translate}}</button>\r\n              <button type="submit" class="btn btn-primary" ng-show="config.allowedActions.edit" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'edit\' | translate}}</button>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="newfolder">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="createFolder()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'new_folder\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <label class="radio">{{\'folder_name\' | translate}}</label>\r\n              <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n              <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'create\' | translate}}</button>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="uploadfile">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="uploadFiles()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{"upload_files" | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <label class="radio">\r\n                {{"files_will_uploaded_to" | translate}} \r\n                <b>/{{fileNavigator.currentPath.join(\'/\')}}</b>\r\n              </label>\r\n              <button class="btn btn-default btn-block" ngf-select="$parent.addForUpload($files)" ngf-multiple="true">\r\n                {{"select_files" | translate}}\r\n              </button>\r\n              \r\n              <div class="upload-list">\r\n                <ul class="list-group">\r\n                  <li class="list-group-item" ng-repeat="(index, uploadFile) in $parent.uploadFileList">\r\n                    <button class="btn btn-sm btn-danger pull-right" ng-click="$parent.removeFromUpload(index)">\r\n                        &times;\r\n                    </button>\r\n                    <h5 class="list-group-item-heading">{{uploadFile.name}}</h5>\r\n                    <p class="list-group-item-text">{{uploadFile.size | humanReadableFileSize}}</p>\r\n                  </li>\r\n                </ul>\r\n                <div ng-show="apiMiddleware.apiHandler.inprocess">\r\n                  <em>{{"uploading" | translate}}... {{apiMiddleware.apiHandler.progress}}%</em>\r\n                  <div class="progress mb0">\r\n                    <div class="progress-bar active" role="progressbar" aria-valuenow="{{apiMiddleware.apiHandler.progress}}" aria-valuemin="0" aria-valuemax="100" style="width: {{apiMiddleware.apiHandler.progress}}%"></div>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <div>\r\n                  <button type="button" class="btn btn-default" data-dismiss="modal">{{"cancel" | translate}}</button>\r\n                  <button type="submit" class="btn btn-primary" ng-disabled="!$parent.uploadFileList.length || apiMiddleware.apiHandler.inprocess">{{\'upload\' | translate}}</button>\r\n              </div>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="changepermissions">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n        <form ng-submit="changePermissions()">\r\n            <div class="modal-header">\r\n              <button type="button" class="close" data-dismiss="modal">\r\n                  <span aria-hidden="true">&times;</span>\r\n                  <span class="sr-only">{{"close" | translate}}</span>\r\n              </button>\r\n              <h4 class="modal-title">{{\'change_permissions\' | translate}}</h4>\r\n            </div>\r\n            <div class="modal-body">\r\n              <table class="table mb0">\r\n                  <thead>\r\n                      <tr>\r\n                          <th>{{\'permissions\' | translate}}</th>\r\n                          <th class="col-xs-1 text-center">{{\'read\' | translate}}</th>\r\n                          <th class="col-xs-1 text-center">{{\'write\' | translate}}</th>\r\n                          <th class="col-xs-1 text-center">{{\'exec\' | translate}}</th>\r\n                      </tr>\r\n                  </thead>\r\n                  <tbody>\r\n                      <tr ng-repeat="(permTypeKey, permTypeValue) in temp.tempModel.perms">\r\n                          <td>{{permTypeKey | translate}}</td>\r\n                          <td ng-repeat="(permKey, permValue) in permTypeValue" class="col-xs-1 text-center" ng-click="main()">\r\n                              <label class="col-xs-12">\r\n                                <input type="checkbox" ng-model="temp.tempModel.perms[permTypeKey][permKey]">\r\n                              </label>\r\n                          </td>\r\n                      </tr>\r\n                </tbody>\r\n              </table>\r\n              <div class="checkbox" ng-show="config.enablePermissionsRecursive && selectionHas(\'dir\')">\r\n                <label>\r\n                  <input type="checkbox" ng-model="temp.tempModel.recursive"> {{\'recursive\' | translate}}\r\n                </label>\r\n              </div>\r\n              <div class="clearfix mt10">\r\n                  <span class="label label-primary pull-left" ng-hide="temp.multiple">\r\n                    {{\'original\' | translate}}: \r\n                    {{temp.model.perms.toCode(selectionHas(\'dir\') ? \'d\':\'-\')}} \r\n                    ({{temp.model.perms.toOctal()}})\r\n                  </span>\r\n                  <span class="label label-primary pull-right">\r\n                    {{\'changes\' | translate}}: \r\n                    {{temp.tempModel.perms.toCode(selectionHas(\'dir\') ? \'d\':\'-\')}} \r\n                    ({{temp.tempModel.perms.toOctal()}})\r\n                  </span>\r\n              </div>\r\n              <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n            </div>\r\n            <div class="modal-footer">\r\n              <button type="button" class="btn btn-default" data-dismiss="modal">{{"cancel" | translate}}</button>\r\n              <button type="submit" class="btn btn-primary" ng-disabled="">{{\'change\' | translate}}</button>\r\n            </div>\r\n        </form>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="selector" ng-controller="ModalFileManagerCtrl">\r\n  <div class="modal-dialog">\r\n    <div class="modal-content">\r\n      <div class="modal-header">\r\n        <button type="button" class="close" data-dismiss="modal">\r\n            <span aria-hidden="true">&times;</span>\r\n            <span class="sr-only">{{"close" | translate}}</span>\r\n        </button>\r\n        <h4 class="modal-title">{{"select_destination_folder" | translate}}</h4>\r\n      </div>\r\n      <div class="modal-body">\r\n        <div>\r\n            <div ng-include="config.tplPath + \'/current-folder-breadcrumb.html\'"></div>\r\n            <div ng-include="config.tplPath + \'/main-table-modal.html\'"></div>\r\n            <hr />\r\n            <button class="btn btn-sm btn-default" ng-click="selectCurrent()">\r\n                <i class="glyphicon"></i> {{"select_this" | translate}}\r\n            </button>\r\n        </div>\r\n      </div>\r\n      <div class="modal-footer">\r\n        <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n<script type="text/ng-template" id="path-selector">\r\n  <div class="panel panel-primary mt10 mb0">\r\n    <div class="panel-body">\r\n        <div class="detail-sources">\r\n          <div class="like-code mr5"><b>{{"selection" | translate}}:</b>\r\n            <span ng-include="\'selected-files-msg\'"></span>\r\n          </div>\r\n        </div>\r\n        <div class="detail-sources">\r\n          <div class="like-code mr5">\r\n            <b>{{"destination" | translate}}:</b> {{ getSelectedPath() }}\r\n          </div>\r\n          <a href="" class="label label-primary" ng-click="openNavigator(fileNavigator.currentPath)">\r\n            {{\'change\' | translate}}\r\n          </a>\r\n        </div>\r\n    </div>\r\n  </div>\r\n</script>\r\n\r\n<script type="text/ng-template" id="error-bar">\r\n  <div class="label label-danger error-msg pull-left animated fadeIn" ng-show="apiMiddleware.apiHandler.error">\r\n    <i class="glyphicon glyphicon-remove-circle"></i>\r\n    <span>{{apiMiddleware.apiHandler.error}}</span>\r\n  </div>\r\n</script>\r\n\r\n<script type="text/ng-template" id="selected-files-msg">\r\n  <span ng-show="temps.length == 1">\r\n    {{singleSelection().model.name}}\r\n  </span>\r\n  <span ng-show="temps.length > 1">\r\n    {{\'these_elements\' | translate:totalSelecteds()}}\r\n    <a href="" class="label label-primary" ng-click="showDetails = !showDetails">\r\n      {{showDetails ? \'-\' : \'+\'}} {{\'details\' | translate}}\r\n    </a>\r\n  </span>\r\n  <div ng-show="temps.length > 1 &amp;&amp; showDetails">\r\n    <ul class="selected-file-details">\r\n      <li ng-repeat="tempItem in temps">\r\n        <b>{{tempItem.model.name}}</b>\r\n      </li>\r\n    </ul>\r\n  </div>\r\n</script>\r\n'),
+e.put("src/templates/navbar.html",'<nav class="navbar navbar-inverse">\r\n    <div class="container-fluid">\r\n        <div class="row">\r\n            <div class="col-sm-9 col-md-10 hidden-xs">\r\n                <div ng-show="!config.breadcrumb">\r\n                    <a class="navbar-brand hidden-xs ng-binding" href="">angular-filemanager</a>\r\n                </div>\r\n                <div ng-include="config.tplPath + \'/current-folder-breadcrumb.html\'" ng-show="config.breadcrumb">\r\n                </div>\r\n            </div>\r\n            <div class="col-sm-3 col-md-2">\r\n                <div class="navbar-collapse">\r\n                    <div class="navbar-form navbar-right text-right">\r\n                        <div class="pull-left visible-xs" ng-if="fileNavigator.currentPath.length">\r\n                            <button class="btn btn-primary btn-flat" ng-click="fileNavigator.upDir()">\r\n                                <i class="glyphicon glyphicon-chevron-left"></i>\r\n                            </button>\r\n                            {{fileNavigator.getCurrentFolderName() | strLimit : 12}}\r\n                        </div>\r\n                        <div class="btn-group">\r\n                            <button class="btn btn-flat btn-sm dropdown-toggle" type="button" id="dropDownMenuSearch" data-toggle="dropdown" aria-expanded="true">\r\n                                <i class="glyphicon glyphicon-search mr2"></i>\r\n                            </button>\r\n                            <div class="dropdown-menu animated fast fadeIn pull-right" role="menu" aria-labelledby="dropDownMenuLang">\r\n                                <input type="text" class="form-control" ng-show="config.searchForm" placeholder="{{\'search\' | translate}}..." ng-model="$parent.query">\r\n                            </div>\r\n                        </div>\r\n\r\n                        <button class="btn btn-flat btn-sm" ng-click="$parent.setTemplate(\'main-icons.html\')" ng-show="$parent.viewTemplate !==\'main-icons.html\'" title="{{\'icons\' | translate}}">\r\n                            <i class="glyphicon glyphicon-th-large"></i>\r\n                        </button>\r\n\r\n                        <button class="btn btn-flat btn-sm" ng-click="$parent.setTemplate(\'main-table.html\')" ng-show="$parent.viewTemplate !==\'main-table.html\'" title="{{\'list\' | translate}}">\r\n                            <i class="glyphicon glyphicon-th-list"></i>\r\n                        </button>\r\n\r\n                        <div class="btn-group">\r\n                            <button class="btn btn-flat btn-sm dropdown-toggle" type="button" id="dropDownMenuLang" data-toggle="dropdown" aria-expanded="true">\r\n                                <i class="glyphicon glyphicon-globe mr2"></i>\r\n                            </button>\r\n\r\n                            <ul class="dropdown-menu scrollable-menu animated fast fadeIn pull-right" role="menu" aria-labelledby="dropDownMenuLang">\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'en\')">{{"english" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'zh\')">{{"chinese" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'es\')">{{"spanish" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'pt\')">{{"portuguese" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'fr\')">{{"french" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'de\')">{{"german" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'he\')">{{"hebrew" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'it\')">{{"italian" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'sk\')">{{"slovak" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'ru\')">{{"russian" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'ua\')">{{"ukrainian" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'tr\')">{{"turkish" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'fa\')">{{"persian" | translate}}</a></li>\r\n                                <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'pl\')">{{"polish" | translate}}</a></li>\r\n                            </ul>\r\n                        </div>\r\n\r\n                        <div class="btn-group">\r\n                            <button class="btn btn-flat btn-sm dropdown-toggle" type="button" id="more" data-toggle="dropdown" aria-expanded="true">\r\n                                <i class="glyphicon glyphicon-option-vertical"></i>\r\n                            </button>\r\n\r\n                            <ul class="dropdown-menu scrollable-menu animated fast fadeIn pull-right" role="menu" aria-labelledby="more">\r\n                                <li role="presentation" ng-show="config.allowedActions.createFolder" ng-click="modal(\'newfolder\') && prepareNewFolder()">\r\n                                    <a href="" role="menuitem" tabindex="-1">\r\n                                        <i class="glyphicon glyphicon-plus"></i> {{"new_folder" | translate}}\r\n                                    </a>\r\n                                </li>\r\n                                <li role="presentation" ng-show="config.allowedActions.upload" ng-click="modal(\'uploadfile\')">\r\n                                    <a href="" role="menuitem" tabindex="-1">\r\n                                        <i class="glyphicon glyphicon-cloud-upload"></i> {{"upload_files" | translate}}\r\n                                    </a>\r\n                                </li>\r\n                            </ul>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</nav>\r\n'),e.put("src/templates/sidebar.html",'<ul class="nav nav-sidebar file-tree-root">\r\n    <li ng-repeat="item in fileNavigator.history" ng-include="\'folder-branch-item\'" ng-class="{\'active\': item.name == fileNavigator.currentPath.join(\'/\')}"></li>\r\n</ul>\r\n\r\n<script type="text/ng-template" id="folder-branch-item">\r\n    <a href="" ng-click="fileNavigator.folderClick(item.item)" class="animated fast fadeInDown">\r\n\r\n        <span class="point">\r\n            <i class="glyphicon glyphicon-chevron-down" ng-show="isInThisPath(item.name)"></i>\r\n            <i class="glyphicon glyphicon-chevron-right" ng-show="!isInThisPath(item.name)"></i>\r\n        </span>\r\n\r\n        <i class="glyphicon glyphicon-folder-open mr2" ng-show="isInThisPath(item.name)"></i>\r\n        <i class="glyphicon glyphicon-folder-close mr2" ng-show="!isInThisPath(item.name)"></i>\r\n        {{ (item.name.split(\'/\').pop() || fileNavigator.getBasePath().join(\'/\') || \'/\') | strLimit : 30 }}\r\n    </a>\r\n    <ul class="nav nav-sidebar">\r\n        <li ng-repeat="item in item.nodes" ng-include="\'folder-branch-item\'" ng-class="{\'active\': item.name == fileNavigator.currentPath.join(\'/\')}"></li>\r\n    </ul>\r\n</script>'),e.put("src/templates/spinner.html",'<div class="spinner-wrapper col-xs-12">\r\n    <svg class="spinner-container" style="width:65px;height:65px" viewBox="0 0 44 44">\r\n        <circle class="path" cx="22" cy="22" r="20" fill="none" stroke-width="4"></circle>\r\n    </svg>\r\n</div>')}]);
diff --git a/index.html b/index.html
index 222a191f..7c039391 100644
--- a/index.html
+++ b/index.html
@@ -48,6 +48,22 @@
       var defaults = config.$get();
       config.set({
         appName: 'angular-filemanager',
+        defaultLang: 'zh',
+
+        listUrl: 'bridges/php-local/index.php',
+        uploadUrl: 'bridges/php-local/index.php',
+        renameUrl: 'bridges/php-local/index.php',
+        copyUrl: 'bridges/php-local/index.php',
+        moveUrl: 'bridges/php-local/index.php',
+        removeUrl: 'bridges/php-local/index.php',
+        editUrl: 'bridges/php-local/index.php',
+        getContentUrl: 'bridges/php-local/index.php',
+        createFolderUrl: 'bridges/php-local/index.php',
+        downloadFileUrl: 'bridges/php-local/index.php',
+        downloadMultipleUrl: 'bridges/php-local/index.php',
+        compressUrl: 'bridges/php-local/index.php',
+        extractUrl: 'bridges/php-local/index.php',
+        permissionsUrl: 'bridges/php-local/index.php',
         pickCallback: function(item) {
           var msg = 'Picked %s "%s" for external use'
             .replace('%s', item.type)
@@ -56,8 +72,9 @@
         },
 
         allowedActions: angular.extend(defaults.allowedActions, {
-          pickFiles: false,
-          pickFolders: false,
+          extract: false,
+          compress: false,
+          downloadMultiple: false,
         }),
       });
     }]);
@@ -66,14 +83,5 @@
 
 <body class="ng-cloak">
   <angular-filemanager></angular-filemanager>
-
-  <script> 
-    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
-    ga('create', 'UA-35182652-1', 'auto');
-    ga('send', 'pageview');
-  </script>
 </body>
 </html>
diff --git a/src/js/controllers/main.js b/src/js/controllers/main.js
index 862d47a4..0b8cb83f 100644
--- a/src/js/controllers/main.js
+++ b/src/js/controllers/main.js
@@ -156,6 +156,16 @@
                 });
         };
 
+        $scope.openDwonloadLink = function() {
+            var item = $scope.singleSelection();
+            $scope.modal('downloadlink', null, true)
+                .find('#downloadlink-target')
+                .val(window.location.protocol + '//' + window.location.hostname + '/' + $scope.apiMiddleware.getUrl(item))
+                .on('focus', function() {
+                    this.select();
+                });
+        };
+
         $scope.openEditItem = function() {
             var item = $scope.singleSelection();
             $scope.apiMiddleware.getContent(item).then(function(data) {
diff --git a/src/js/providers/translations.js b/src/js/providers/translations.js
index afd773c9..292ed62c 100644
--- a/src/js/providers/translations.js
+++ b/src/js/providers/translations.js
@@ -66,6 +66,7 @@
             wait: 'Wait',
             move: 'Move',
             download: 'Download',
+            downloadlink: 'View download link',
             view_item: 'View item',
             remove: 'Delete',
             edit: 'Edit',
@@ -751,6 +752,7 @@
             wait: '等待',
             move: '移动',
             download: '下载',
+            downloadlink: '显示下载链接',
             view_item: '查看子项',
             remove: '删除',
             edit: '编辑',
diff --git a/src/templates/item-context-menu.html b/src/templates/item-context-menu.html
index 6efa2e1d..91243e65 100644
--- a/src/templates/item-context-menu.html
+++ b/src/templates/item-context-menu.html
@@ -25,6 +25,12 @@
             </a>
         </li>
 
+        <li ng-show="config.allowedActions.download && !selectionHas('dir') && singleSelection()">
+            <a href="" tabindex="-1" ng-click="openDwonloadLink()">
+                <i class="glyphicon glyphicon-cloud-download"></i> {{'downloadlink' | translate}}
+            </a>
+        </li>
+
         <li ng-show="config.allowedActions.preview && singleSelection().isImage() && singleSelection()">
             <a href="" tabindex="-1" ng-click="openImagePreview()">
                 <i class="glyphicon glyphicon-picture"></i> {{'view_item' | translate}}
diff --git a/src/templates/modals.html b/src/templates/modals.html
index 939cc4c3..eadbc22a 100644
--- a/src/templates/modals.html
+++ b/src/templates/modals.html
@@ -22,6 +22,30 @@ <h4 class="modal-title">{{"preview" | translate}}</h4>
   </div>
 </div>
 
+<div class="modal animated fadeIn" id="downloadlink">
+  <div class="modal-dialog">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal">
+          <span aria-hidden="true">&times;</span>
+          <span class="sr-only">{{"close" | translate}}</span>
+        </button>
+        <h4 class="modal-title">{{"downloadlink" | translate}}</h4>
+      </div>
+      <div class="modal-body">
+        <div class="text-center">
+          <input type="text" class="form-control" autofocus="autofocus" id="downloadlink-target">
+          <span class="label label-warning" ng-show="apiMiddleware.apiHandler.inprocess">{{'loading' | translate}} ...</span>
+        </div>
+        <div ng-include data-src="'error-bar'" class="clearfix"></div>
+      </div>
+      <div class="modal-footer">
+        <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>
+      </div>
+    </div>
+  </div>
+</div>
+
 <div class="modal animated fadeIn" id="remove">
   <div class="modal-dialog">
     <div class="modal-content">