var Util; (function(scope, Util) { 'use strict'; var rendy; if (typeof module === 'object' && module.exports) { rendy = require('rendy'); module.exports = new CloudFuncProto(Util); } else { rendy = window.rendy; scope.CloudFunc = new CloudFuncProto(Util); } function CloudFuncProto() { var CloudFunc = this, Entity = new entityProto(), FS; /* КОНСТАНТЫ (общие для клиента и сервера)*/ /* название программы */ this.NAME = 'Cloud Commander'; /* если в ссылке будет эта строка - в браузере js отключен */ this.FS = FS = '/fs'; this.apiURL = '/api/v1'; this.MAX_FILE_SIZE = 500 * 1024; this.Entity = Entity; function entityProto() { var Entities = { ' ': ' ', '<' : '<', '>' : '>' }; this.encode = function(str) { Object.keys(Entities).forEach(function(code) { var char = Entities[code], reg = RegExp(char, 'g'); str = str.replace(reg, code); }); return str; }; this.decode = 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; if (typeof path !== 'string') throw(Error('path should be a 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 = '/'; if (!url) throw(Error('url could not be empty!')); if (!template) throw(Error('template could not be empty!')); 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 += rendy(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 = rendy(template.path, { link : FS + refreshPath, fullPath : path, path : htmlPath }), header = rendy(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);