var Util; (function(scope, Util) { 'use strict'; if (typeof module === 'object' && module.exports) { Util = require('./util'); module.exports = new CloudFuncProto(Util); } else { scope.CloudFunc = new CloudFuncProto(Util); } function CloudFuncProto(Util) { var CloudFunc = this, check = Util.check, render = Util.render, FS; /* КОНСТАНТЫ (общие для клиента и сервера)*/ /* название программы */ this.NAME = 'Cloud Commander'; /* если в ссылке будет эта строка - в браузере js отключен */ this.FS = FS = '/fs'; this.apiURL = '/api/v1'; /* id панелей с файлами */ this.PANEL_LEFT = 'js-left'; this.PANEL_RIGHT = 'js-right'; this.CHANNEL_CONSOLE = 'console-data'; this.CHANNEL_TERMINAL = 'terminal-data'; this.CHANNEL_TERMINAL_RESIZE= 'terminal-resize'; this.MAX_FILE_SIZE = 500 * 1024; var Entities = { ' ': ' ', '<': '<', '>' : '>' }; this.encodeEntities = function(str) { Object.keys(Entities).forEach(function(code) { var char = Entities[code], reg = RegExp(char, 'g'); str = str.replace(reg, code); }); return str; }; this.decodeEntities = function(str) { Object.keys(Entities).forEach(function(code) { var char = Entities[code], reg = RegExp(code, 'g'); str = str.replace(reg, char); }); return str; }; this.formatMsg = function(msg, name, status) { if (!status) status = 'ok'; if (name) name = '("' + name + '")'; else name = ''; msg = msg + ': ' + status + name; return msg; }; /** * Функция убирает последний слеш, * если он - последний символ строки */ this.rmLastSlash = function(path) { var length, lastSlash, isEqual; check(arguments, ['path']) .type('path', path, 'string'); length = path.length - 1; lastSlash = path.lastIndexOf('/'); isEqual = lastSlash === length; if (length && isEqual) path = path.substr(path, length); return path; }; /** Функция возвращает заголовок веб страницы * @pPath */ this.getTitle = function(pPath) { if (!CloudFunc.Path) CloudFunc.Path = '/'; return CloudFunc.NAME + ' - ' + (pPath || CloudFunc.Path); }; /** Функция получает адреса каждого каталога в пути * возвращаеться массив каталогов * @param url - адрес каталога */ function getPathLink(url, template) { var namesRaw, names, length, pathHTML = '', path = '/'; check(arguments, ['url', 'template']); namesRaw = url.split('/') .slice(1, -1), names = [].concat('/', namesRaw), length = names.length - 1; names.forEach(function(name, index) { var slash = '', isLast = index === length; if (index) path += name + '/'; if (index && isLast) { pathHTML += name + '/'; } else { if (index) slash = '/'; pathHTML += render(template, { path: path, name: name, slash: slash }); } }); return pathHTML; } /** * Функция строит таблицу файлв из JSON-информации о файлах * @param params - информация о файлах * */ this.buildFromJSON = function(params) { var file, i, n, type, attribute, size, owner, mode, dotDot, link, dataName, linkResult, template = params.template, templateFile = template.file, templateLink = template.link, json = params.data, files = json.files, path = json.path, /* * Строим путь каталога в котором мы находимся * со всеми подкаталогами */ htmlPath = getPathLink(path, template.pathLink), /* Убираем последний слэш * с пути для кнопки обновить страницу * если он есть */ refreshPath = CloudFunc.rmLastSlash(path), fileTable = render(template.path, { link : FS + refreshPath, fullPath : path, path : htmlPath }), header = render(templateFile, { tag : 'div', attribute : '', className : 'fm-header', type : '', name : 'name', size : 'size', owner : 'owner', mode : 'mode' }); fileTable += header; /* сохраняем путь */ CloudFunc.Path = path; fileTable += ''; return fileTable; }; } })(this, Util);