diff --git a/ChangeLog b/ChangeLog
index 991a0681..8c3719ac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -35,10 +35,17 @@ elements one-by-one.
* Added function loadModule thet make it easier to connect
new module.
-* Fixed bug with context menu hiding (on Esc). Keys was unbinded.
+* Fixed bug with context menu hiding (on Esc).
+Keys was unbinded.
* Added ability to disable web sockets.
+* Moved cloudRequire to srvfunc.js file.
+
+* Fixed bug with directory pathes detection
+(used document.location.href, now using
+document.location.origin)
+
2012.10.01, Version 0.1.7
diff --git a/client.js b/client.js
index ad04d756..1cba393c 100644
--- a/client.js
+++ b/client.js
@@ -57,10 +57,10 @@ var CloudClient = {
-var cloudcmd = CloudClient;
+var cloudcmd = CloudClient,
/* глобальные переменные */
-var CloudFunc, $, Util, KeyBinding,
+CloudFunc, $, Util, KeyBinding,
/* short names used all the time functions */
getByClass, getById;
@@ -1290,9 +1290,9 @@ function baseInit(){
lTitle[0].textContent = 'Cloud Commander';
/* загружаем общие функции для клиента и сервера */
- Util.jsload(CloudClient.LIBDIR+'cloudfunc.js',function(){
+ Util.jsload(CloudClient.LIBDIR + 'cloudfunc.js',function(){
/* берём из обьекта window общий с сервером функционал */
- CloudFunc=window.CloudFunc;
+ CloudFunc = window.CloudFunc;
/* меняем ссылки на ajax'овые */
CloudClient._changeLinks(CloudFunc.LEFTPANEL);
@@ -1328,7 +1328,7 @@ function baseInit(){
window.screen.height -
(window.screen.height/3).toFixed();
- lHeight=(lHeight/100).toFixed()*100;
+ lHeight = (lHeight/100).toFixed()*100;
CloudClient.HEIGHT = lHeight;
@@ -1351,85 +1351,84 @@ CloudClient._changeLinks = function(pPanelID){
lClearcache.onclick = CloudClient.Cache.clear;
/* меняем ссылки на ajax-запросы */
- var lPanel = getById(pPanelID);
- var a = lPanel.getElementsByTagName('a');
+ var lPanel = getById(pPanelID),
+ a = lPanel.getElementsByTagName('a'),
/* номер ссылки иконки обновления страницы */
- var lREFRESHICON = 0;
+ lREFRESHICON = 0,
/* путь в ссылке, который говорит
* что js отключен
*/
- var lNoJS_s = CloudFunc.NOJS;
- var lFS_s = CloudFunc.FS;
-
+ lNoJS_s = CloudFunc.NOJS,
+ lFS_s = CloudFunc.FS,
+
/* right mouse click function varible */
- var lOnContextMenu_f = function(pEvent){
- var lReturn_b = true;
-
- KeyBinding.unSet();
-
- /* getting html element
- * currentTarget - DOM event
- * target - jquery event
- */
- var lTarget = pEvent.currentTarget || pEvent.target;
- Util.setCurrentFile(lTarget);
-
- if(Util.isFunction(cloudcmd.Menu) ){
- cloudcmd.Menu({
- x: pEvent.x,
- y: pEvent.y
- });
+ lOnContextMenu_f = function(pEvent){
+ var lReturn_b = true;
- /* disabling browsers menu*/
- lReturn_b = false;
- Util.Images.showLoad();
- }
+ KeyBinding.unSet();
+
+ /* getting html element
+ * currentTarget - DOM event
+ * target - jquery event
+ */
+ var lTarget = pEvent.currentTarget || pEvent.target;
+ Util.setCurrentFile(lTarget);
+
+ if(Util.isFunction(cloudcmd.Menu) ){
+ cloudcmd.Menu({
+ x: pEvent.x,
+ y: pEvent.y
+ });
+
+ /* disabling browsers menu*/
+ lReturn_b = false;
+ Util.Images.showLoad();
+ }
+
+ return lReturn_b;
+ },
- return lReturn_b;
- };
-
/* drag and drop function varible
* download file from browser to descktop
* in Chrome (HTML5)
*/
- var lOnDragStart_f = function(pEvent){
- var lElement = pEvent.target;
-
- var lLink = lElement.href;
- var lName = lElement.textContent;
+ lOnDragStart_f = function(pEvent){
+ var lElement = pEvent.target,
+ lLink = lElement.href,
+ lName = lElement.textContent,
+ /* if it's directory - adding json extension */
+ lType = lElement.parentElement.nextSibling;
+
+ if(lType && lType.textContent === '
'){
+ lLink = lLink.replace(lNoJS_s,'');
+ lName += '.json';
+ }
+
+ pEvent.dataTransfer.setData("DownloadURL",
+ 'application/octet-stream' + ':' +
+ lName + ':' +
+ lLink);
+ },
- /* if it's directory - adding json extension */
- var lType = lElement.parentElement.nextSibling;
- if(lType && lType.textContent === ''){
- lLink = lLink.replace(lNoJS_s,'');
- lName += '.json';
- }
-
- pEvent.dataTransfer.setData("DownloadURL",
- 'application/octet-stream' + ':' +
- lName + ':' +
- lLink);
- };
-
- var lSetCurrentFile_f = function(pEvent){
- var pElement = pEvent.target;
-
- var lTag = pElement.tagName;
- if(lTag !== 'LI')
- do{
- pElement = pElement.parentElement;
+ lSetCurrentFile_f = function(pEvent){
+ var pElement = pEvent.target,
lTag = pElement.tagName;
- }while(lTag !== 'LI');
+
+ if(lTag !== 'LI')
+ do{
+ pElement = pElement.parentElement;
+ lTag = pElement.tagName;
+ }while(lTag !== 'LI');
+
+ Util.setCurrentFile(pElement);
+ };
- Util.setCurrentFile(pElement);
- };
-
- for(var i=0; i < a.length ; i++)
+ for(var i = 0, n = a.length; i < n ; i++)
{
/* убираем адрес хоста*/
- var link = '/'+a[i].href.replace(document.location.href,'');
+ var link = a[i].href.replace(document.location.origin,'');
/* убираем значения, которые говорят, *
* об отсутствии js */
diff --git a/lib/cloudfunc.js b/lib/cloudfunc.js
index 2b182463..9ea9cf02 100644
--- a/lib/cloudfunc.js
+++ b/lib/cloudfunc.js
@@ -1,499 +1,503 @@
-"use strict";
-/** Модуль, содержащий функции, которые будут работать
- * и на клиенте и на сервере
- */
+var CloudFunc, exports;
-var CloudFunc = {
- /* Путь с которым мы сейчас работаем */
- Path : '',
- /* КОНСТАНТЫ (общие для клиента и сервера)*/
- /* название программы */
- NAME : 'Cloud Commander',
- /* если в ссылке будет эта строка -
- * в браузере js отключен
+(function(){
+ "use strict";
+
+ /** Модуль, содержащий функции, которые будут работать
+ * и на клиенте и на сервере
*/
- NOJS : '/no-js',
- FS : '/fs',
- /* название css-класа кнопки обновления файловой структуры*/
- REFRESHICON : 'refresh-icon',
- /* id панелей с файлами */
- LEFTPANEL : 'left',
- RIGHTPANEL : 'right',
- /* length of longest
- * file name
+
+ CloudFunc = {
+ /* Путь с которым мы сейчас работаем */
+ Path : '',
+ /* КОНСТАНТЫ (общие для клиента и сервера)*/
+ /* название программы */
+ NAME : 'Cloud Commander',
+ /* если в ссылке будет эта строка -
+ * в браузере js отключен
+ */
+ NOJS : '/no-js',
+ FS : '/fs',
+ /* название css-класа кнопки обновления файловой структуры*/
+ REFRESHICON : 'refresh-icon',
+ /* id панелей с файлами */
+ LEFTPANEL : 'left',
+ RIGHTPANEL : 'right',
+ /* length of longest
+ * file name
+ */
+ SHORTNAMELENGTH : 16
+};
+
+
+ /**
+ * Функция убирает последний слеш,
+ * если он - последний символ строки
*/
- SHORTNAMELENGTH : 16
-};
-
-
-/**
- * Функция убирает последний слеш,
- * если он - последний символ строки
- */
-CloudFunc.removeLastSlash = function(pPath){
- if(typeof pPath==='string')
- return (pPath.lastIndexOf('/') === pPath.length-1) ?
- pPath.substr(pPath, pPath.length-1):pPath;
- else return pPath;
-};
-
-/* Функция возвращает заголовок веб страницы */
-CloudFunc.setTitle = function(){
+ CloudFunc.removeLastSlash = function(pPath){
+ if(typeof pPath==='string')
+ return (pPath.lastIndexOf('/') === pPath.length-1) ?
+ pPath.substr(pPath, pPath.length-1):pPath;
+ else return pPath;
+ };
- return CloudFunc.Path==='' ? CloudFunc.NAME:
- CloudFunc.Path +
- ' - ' +
- CloudFunc.NAME;
-};
-/**
- * Функция переводит права из цыфрового вида в символьный
- * @param pPerm_s - строка с правами доступа
- * к файлу в 8-миричной системе
- */
-CloudFunc.convertPermissionsToSymbolic = function(pPerm_s){
- /*
- S_IRUSR 0000400 protection: readable by owner
- S_IWUSR 0000200 writable by owner
- S_IXUSR 0000100 executable by owner
- S_IRGRP 0000040 readable by group
- S_IWGRP 0000020 writable by group
- S_IXGRP 0000010 executable by group
- S_IROTH 0000004 readable by all
- S_IWOTH 0000002 writable by all
- S_IXOTH 0000001 executable by all
- */
- if(pPerm_s===undefined) return;
-
- /* тип файла */
- var lType=pPerm_s.charAt(0);
-
- switch (lType-0) {
- case 1: /* обычный файл */
- lType='-';
- break;
- case 2: /* байт-ориентированное (символьное) устройство*/
- lType='c';
- break;
- case 4: /* каталог */
- lType='d';
- break;
- default:
- lType='-';
- }
-
- /* оставляем последние 3 символа*/
- pPerm_s=pPerm_s.length>5?pPerm_s.substr(3):pPerm_s.substr(2);
-
- /* Рекомендации гугла советуют вместо string[3]
- * использовать string.charAt(3)
- */
-/*
- http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=Standards_features#Standards_features
-
- Always preferred over non-standards featuresFor
- maximum portability and compatibility, always
- prefer standards features over non-standards
- features (e.g., string.charAt(3) over string[3]
- and element access with DOM functions instead
- of using an application-specific shorthand).
-*/
- /* Переводим в двоичную систему */
- var lOwner = (pPerm_s[0]-0).toString(2);
- var lGroup = (pPerm_s[1]-0).toString(2);
- var lAll = (pPerm_s[2]-0).toString(2);
- /*
- console.log(lOwner+' '+lGroup+' '+lAll);
- */
- /* переводим в символьную систему*/
- var lPermissions=//lType+' '+
- (lOwner[0]-0>0?'r':'-') +
- (lOwner[1]-0>0?'w':'-') +
- (lOwner[2]-0>0?'x':'-') +
- ' ' +
- (lGroup[0]-0>0?'r':'-') +
- (lGroup[1]-0>0?'w':'-') +
- (lGroup[2]-0>0?'x':'-') +
- ' ' +
- (lAll[0]-0>0?'r':'-') +
- (lAll[1]-0>0?'w':'-') +
- (lAll[2]-0>0?'x':'-');
- /*
- console.log(lPermissions);
- */
- return lPermissions;
-};
-
-/**
- * Функция конвертирует права доступа к файлам из символьного вида
- * в цыфровой
- */
-CloudFunc.convertPermissionsToNumberic= function(pPerm_s){
- /* если передана правильная строка, конвертированная
- * функциец convertPermissionsToSymbolic
- */
- if(!pPerm_s || pPerm_s.length!==11)return pPerm_s;
-
- var lOwner= (pPerm_s[0]==='r'?4:0) +
- (pPerm_s[1]==='w'?2:0) +
- (pPerm_s[2]==='x'?1:0);
- var lGroup= (pPerm_s[4]==='r'?4:0) +
- (pPerm_s[5]==='w'?2:0) +
- (pPerm_s[6]==='x'?1:0);
- var lAll = (pPerm_s[8]==='r'?4:0) +
- (pPerm_s[9]==='w'?2:0) +
- (pPerm_s[10]==='x'?1:0);
- /* добавляем 2 цыфры до 5 */
- return '00'+lOwner+lGroup+lAll;
-};
-/** Функция получает короткие размеры
- * конвертируя байт в килобайты, мегабойты,
- * гигайбайты и терабайты
- * @pSize - размер в байтах
- */
-CloudFunc.getShortedSize = function(pSize){
- /* if pSize=0 - return it */
- if (pSize !== pSize-0) return pSize;
-
- /* Константы размеров, что используются
- * внутри функции
- */
- var l1BMAX = 1024;
- var l1KBMAX = 1048576;
- var l1MBMAX = 1073741824;
- var l1GBMAX = 1099511627776;
- var l1TBMAX = 1125899906842624;
-
- var lShorted;
-
- if (pSize < l1BMAX) lShorted = pSize + 'b';
- else if (pSize < l1KBMAX) lShorted = (pSize/l1BMAX) .toFixed(2) + 'kb';
- else if (pSize < l1MBMAX) lShorted = (pSize/l1KBMAX).toFixed(2) + 'mb';
- else if (pSize < l1GBMAX) lShorted = (pSize/l1MBMAX).toFixed(2) + 'gb';
- else if (pSize < l1TBMAX) lShorted = (pSize/l1GBMAX).toFixed(2) + 'tb';
- return lShorted;
-};
-
-/** Function gets file name and
- * if it's bigger the 16 chars
- * cut it and adds '..'
- * @pName - file name
- */
-CloudFunc.getShortedName = function(pName){
- return (pName.length > CloudFunc.SHORTNAMELENGTH ?
- (pName.substr(pName,
- CloudFunc.SHORTNAMELENGTH) + '..'):
- pName);
-};
-
-
-/** Функция парсит uid и имена пользователей
- * из переданного в строке вычитаного файла /etc/passwd
- * и возвращает массив обьектов имён и uid пользователей
- * @pPasswd_s - строка, в которой находиться файл /etc/passwd
- */
-CloudFunc.getUserUIDsAndNames=function(pPasswd_s){
- var lUsers={name:'',uid:''};
- var lUsersData=[];
- var i=0;
- do{
- /* получаем первую строку */
- var lLine=pPasswd_s.substr(pPasswd_s,pPasswd_s.indexOf('\n')+1);
- if(lLine){
- /* удаляем первую строку из /etc/passwd*/
- pPasswd_s=pPasswd_s.replace(lLine,'');
- /* получаем первое слово строки */
- var lName=lLine.substr(lLine,lLine.indexOf(':'));
- lLine=lLine.replace(lName+':x:','');
- /* получаем uid*/
- var lUID=lLine.substr(lLine,lLine.indexOf(':'));
- if((lUID-0).toString()!=='NaN'){
- lUsers.name=lName;
- lUsers.uid=lUID;
- lUsersData[i++]=lUsers;
- console.log('uid='+lUID+' name='+lName);
- }
- }
- }while(pPasswd_s!=='');
-
- return lUsersData;
-};
-/* Функция получает адреса каждого каталога в пути
- * возвращаеться массив каталогов
- * @url - адрес каталога
- */
-CloudFunc._getDirPath = function(url)
-{
- var folders=[];
- var i=0;
- do{
- folders[i++]=url; url=url.substr(url,url.lastIndexOf('/'));
- }while(url!=='');
-
- /* Формируем ссылки на каждый каталог в пути */
- var lHref='';
- var lHrefEnd='';
-
- var lHtmlPath;
- /* путь в ссылке, который говорит
- * что js отключен
- */
- var lNoJS_s = CloudFunc.NOJS;
- var lFS_s = CloudFunc.FS;
- /* корневой каталог */
- lHtmlPath = lHref +
- lFS_s +
- lNoJS_s +
- lTitle +
- '"/"' +
- _l +
- '/' +
- lHrefEnd;
-
- for(i = folders.length - 1; i > 0; i--)
- {
- var lUrl=folders[i];
- var lShortName=lUrl.replace(lUrl.substr(lUrl,lUrl.lastIndexOf('/')+1),'');
- if (i!==1)
- lHtmlPath += lHref +
- lFS_s + lNoJS_s + lUrl +
- lTitle + lUrl + _l +
- lShortName +
- lHrefEnd + '/';
- else
- lHtmlPath+=lShortName+'/';
- }
- /* *** */
- return lHtmlPath;
-};
-
-/*
- * Функция ищет в имени файла расширение
- * и если находит возвращает true
- * @pName - получает имя файла
- * @pExt - расширение
- */
-CloudFunc.checkExtension = function(pName, pExt)
-{
- /* если длина имени больше
- * длинны расширения -
- * имеет смысл продолжать
- */
- if (typeof pExt === 'string' &&
- pName.length > pExt.length) {
- var lLength = pName.length; /* длина имени*/
- var lExtNum = pName.lastIndexOf(pExt); /* последнее вхождение расширения*/
- var lExtSub = lLength - lExtNum; /* длина расширения*/
-
- /* если pExt - расширение pName */
- return lExtSub === pExt.length;
-
- }else if(typeof pExt === 'object' &&
- pExt.length){
- for(var i=0; i < pName.length; i++)
- if(this.checkExtension(pName, pExt[i]))
- return true;
- }else
- return false;
-};
-
-/*
- * Функция формирует заголовки столбиков
- * @pFileTableTitles - массив названий столбиков
- */
-CloudFunc._getFileTableHeader=function(pFileTableTitles)
-{
- var lHeader='';
-
- return lHeader;
-};
-
-/*
- * Функция строит таблицу файлв из JSON-информации о файлах
- * @pJSON - информация о файлах
- * @pKeyBinded - если клавиши назначены, выделяем верхний файл
- * [{path:'путь',size:'dir'},
- * {name:'имя',size:'размер',mode:'права доступа'}]
- */
-CloudFunc.buildFromJSON = function(pJSON, pKeyBinded)
-{
- var files;
- /*
- * Если мы на клиенте и нет JSON -
- * через eval парсим.
- * Если-же мы на сервере,
- * или на клиенте всё есть
- * парсим стандарным методом
- *
- * По скольку мы прописали заголовок application/json
- * нет необходимости его конвертировать,
- * но она есть, если мы вытягиваем данные из
- * localStorage
- */
- files = pJSON;
-
- /* сохраняем путь каталога в котором мы сейчас находимся*/
- var lPath = files[0].path;
-
- /* сохраняем путь */
- CloudFunc.Path = lPath;
-
- /*
- * Строим путь каталога в котором мы находимся
- * со всеми подкаталогами
- */
- var lHtmlPath = CloudFunc._getDirPath(lPath);
-
- /* Убираем последний слэш
- * с пути для кнопки обновить страницу
- * если он есть
- */
- var lRefreshPath = CloudFunc.removeLastSlash(lPath);
-
- /* путь в ссылке, который говорит
- * что js отключен
- */
- var lNoJS_s = CloudFunc.NOJS;
- var lFS_s = CloudFunc.FS;
-
- var lFileTable =
- ''+
- '' +
- '' +
- '' +
- '' +
- '' +
- '' +
- '' + lHtmlPath + '' +
- '';
-
- var fileTableTitles = ['name','size','owner','mode'];
- lFileTable += CloudFunc._getFileTableHeader(fileTableTitles);
-
- /* Если мы не в корне */
- if(lPath !== '/'){
- /* ссылка на верхний каталог*/
- var lDotDot;
- /* убираем последний слеш и каталог в котором мы сейчас находимся*/
- lDotDot = lPath.substr(lPath,lPath.lastIndexOf('/'));
- lDotDot = lDotDot.substr(lDotDot,lDotDot.lastIndexOf('/'));
- /* Если предыдущий каталог корневой */
- if(lDotDot === '')lDotDot = '/';
+ /* Функция возвращает заголовок веб страницы */
+ CloudFunc.setTitle = function(){
- /* Сохраняем путь к каталогу верхнего уровня*/
- lFileTable += ''+
- '' +
- '' +
- '' +
- '' + ".." +
- '' +
- '<dir>'+
- '.' +
- '' +
- '';
- }
- var lLength = files.length;
-
- for(var i = 1; i < lLength; i++){
- lFileTable += '';
- lFileTable += '';
- lFileTable += '';
- lFileTable += '' +
- ' CloudFunc.SHORTNAMELENGTH ?
- ' title="' + files[i].name + '">' +
- CloudFunc.getShortedName(files[i].name)
- : 'draggable=true>' + files[i].name) +
- "" +
+ /* тип файла */
+ var lType=pPerm_s.charAt(0);
+
+ switch (lType-0) {
+ case 1: /* обычный файл */
+ lType='-';
+ break;
+ case 2: /* байт-ориентированное (символьное) устройство*/
+ lType='c';
+ break;
+ case 4: /* каталог */
+ lType='d';
+ break;
+ default:
+ lType='-';
+ }
+
+ /* оставляем последние 3 символа*/
+ pPerm_s=pPerm_s.length>5?pPerm_s.substr(3):pPerm_s.substr(2);
+
+ /* Рекомендации гугла советуют вместо string[3]
+ * использовать string.charAt(3)
+ */
+ /*
+ http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=Standards_features#Standards_features
+
+ Always preferred over non-standards featuresFor
+ maximum portability and compatibility, always
+ prefer standards features over non-standards
+ features (e.g., string.charAt(3) over string[3]
+ and element access with DOM functions instead
+ of using an application-specific shorthand).
+ */
+ /* Переводим в двоичную систему */
+ var lOwner = (pPerm_s[0]-0).toString(2);
+ var lGroup = (pPerm_s[1]-0).toString(2);
+ var lAll = (pPerm_s[2]-0).toString(2);
+ /*
+ console.log(lOwner+' '+lGroup+' '+lAll);
+ */
+ /* переводим в символьную систему*/
+ var lPermissions=//lType+' '+
+ (lOwner[0]-0>0?'r':'-') +
+ (lOwner[1]-0>0?'w':'-') +
+ (lOwner[2]-0>0?'x':'-') +
+ ' ' +
+ (lGroup[0]-0>0?'r':'-') +
+ (lGroup[1]-0>0?'w':'-') +
+ (lGroup[2]-0>0?'x':'-') +
+ ' ' +
+ (lAll[0]-0>0?'r':'-') +
+ (lAll[1]-0>0?'w':'-') +
+ (lAll[2]-0>0?'x':'-');
+ /*
+ console.log(lPermissions);
+ */
+ return lPermissions;
+ };
+
+ /**
+ * Функция конвертирует права доступа к файлам из символьного вида
+ * в цыфровой
+ */
+ CloudFunc.convertPermissionsToNumberic = function(pPerm_s){
+ /* если передана правильная строка, конвертированная
+ * функциец convertPermissionsToSymbolic
+ */
+ if(!pPerm_s || pPerm_s.length!==11)return pPerm_s;
+
+ var lOwner= (pPerm_s[0]==='r'?4:0) +
+ (pPerm_s[1]==='w'?2:0) +
+ (pPerm_s[2]==='x'?1:0);
+ var lGroup= (pPerm_s[4]==='r'?4:0) +
+ (pPerm_s[5]==='w'?2:0) +
+ (pPerm_s[6]==='x'?1:0);
+ var lAll = (pPerm_s[8]==='r'?4:0) +
+ (pPerm_s[9]==='w'?2:0) +
+ (pPerm_s[10]==='x'?1:0);
+ /* добавляем 2 цыфры до 5 */
+ return '00'+lOwner+lGroup+lAll;
+ };
+ /** Функция получает короткие размеры
+ * конвертируя байт в килобайты, мегабойты,
+ * гигайбайты и терабайты
+ * @pSize - размер в байтах
+ */
+ CloudFunc.getShortedSize = function(pSize){
+ /* if pSize=0 - return it */
+ if (pSize !== pSize-0) return pSize;
+
+ /* Константы размеров, что используются
+ * внутри функции
+ */
+ var l1BMAX = 1024;
+ var l1KBMAX = 1048576;
+ var l1MBMAX = 1073741824;
+ var l1GBMAX = 1099511627776;
+ var l1TBMAX = 1125899906842624;
+
+ var lShorted;
+
+ if (pSize < l1BMAX) lShorted = pSize + 'b';
+ else if (pSize < l1KBMAX) lShorted = (pSize/l1BMAX) .toFixed(2) + 'kb';
+ else if (pSize < l1MBMAX) lShorted = (pSize/l1KBMAX).toFixed(2) + 'mb';
+ else if (pSize < l1GBMAX) lShorted = (pSize/l1MBMAX).toFixed(2) + 'gb';
+ else if (pSize < l1TBMAX) lShorted = (pSize/l1GBMAX).toFixed(2) + 'tb';
+ return lShorted;
+ };
+
+ /** Function gets file name and
+ * if it's bigger the 16 chars
+ * cut it and adds '..'
+ * @pName - file name
+ */
+ CloudFunc.getShortedName = function(pName){
+ return (pName.length > CloudFunc.SHORTNAMELENGTH ?
+ (pName.substr(pName,
+ CloudFunc.SHORTNAMELENGTH) + '..'):
+ pName);
+ };
+
+
+ /** Функция парсит uid и имена пользователей
+ * из переданного в строке вычитаного файла /etc/passwd
+ * и возвращает массив обьектов имён и uid пользователей
+ * @pPasswd_s - строка, в которой находиться файл /etc/passwd
+ */
+ CloudFunc.getUserUIDsAndNames = function(pPasswd_s){
+ var lUsers={name:'',uid:''};
+ var lUsersData=[];
+ var i=0;
+ do{
+ /* получаем первую строку */
+ var lLine=pPasswd_s.substr(pPasswd_s,pPasswd_s.indexOf('\n')+1);
+ if(lLine){
+ /* удаляем первую строку из /etc/passwd*/
+ pPasswd_s=pPasswd_s.replace(lLine,'');
+ /* получаем первое слово строки */
+ var lName=lLine.substr(lLine,lLine.indexOf(':'));
+ lLine=lLine.replace(lName+':x:','');
+ /* получаем uid*/
+ var lUID=lLine.substr(lLine,lLine.indexOf(':'));
+ if((lUID-0).toString()!=='NaN'){
+ lUsers.name=lName;
+ lUsers.uid=lUID;
+ lUsersData[i++]=lUsers;
+ console.log('uid='+lUID+' name='+lName);
+ }
+ }
+ }while(pPasswd_s!=='');
+
+ return lUsersData;
+ };
+
+ /** Функция получает адреса каждого каталога в пути
+ * возвращаеться массив каталогов
+ * @param url - адрес каталога
+ */
+ CloudFunc._getDirPath = function(url){
+ var folders=[];
+ var i=0;
+ do{
+ folders[i++]=url; url=url.substr(url,url.lastIndexOf('/'));
+ }while(url!=='');
+
+ /* Формируем ссылки на каждый каталог в пути */
+ var lHref='';
+ var lHrefEnd='';
+
+ var lHtmlPath;
+ /* путь в ссылке, который говорит
+ * что js отключен
+ */
+ var lNoJS_s = CloudFunc.NOJS;
+ var lFS_s = CloudFunc.FS;
+ /* корневой каталог */
+ lHtmlPath = lHref +
+ lFS_s +
+ lNoJS_s +
+ lTitle +
+ '"/"' +
+ _l +
+ '/' +
+ lHrefEnd;
+
+ for(i = folders.length - 1; i > 0; i--)
+ {
+ var lUrl=folders[i];
+ var lShortName=lUrl.replace(lUrl.substr(lUrl,lUrl.lastIndexOf('/')+1),'');
+ if (i!==1)
+ lHtmlPath += lHref +
+ lFS_s + lNoJS_s + lUrl +
+ lTitle + lUrl + _l +
+ lShortName +
+ lHrefEnd + '/';
+ else
+ lHtmlPath+=lShortName+'/';
+ }
+ /* *** */
+ return lHtmlPath;
+ };
+
+ /**
+ * Функция ищет в имени файла расширение
+ * и если находит возвращает true
+ * @param pName - получает имя файла
+ * @param pExt - расширение
+ */
+ CloudFunc.checkExtension = function(pName, pExt)
+ {
+ /* если длина имени больше
+ * длинны расширения -
+ * имеет смысл продолжать
+ */
+ if (typeof pExt === 'string' &&
+ pName.length > pExt.length) {
+ var lLength = pName.length; /* длина имени*/
+ var lExtNum = pName.lastIndexOf(pExt); /* последнее вхождение расширения*/
+ var lExtSub = lLength - lExtNum; /* длина расширения*/
+
+ /* если pExt - расширение pName */
+ return lExtSub === pExt.length;
+
+ }else if(typeof pExt === 'object' &&
+ pExt.length){
+ for(var i=0; i < pName.length; i++)
+ if(this.checkExtension(pName, pExt[i]))
+ return true;
+ }else
+ return false;
+ };
+
+ /**
+ * Функция формирует заголовки столбиков
+ * @pFileTableTitles - массив названий столбиков
+ */
+ CloudFunc._getFileTableHeader = function(pFileTableTitles)
+ {
+ var lHeader='';
- /* если папка - не выводим размер */
- lFileTable +='' +
- (files[i].size === 'dir' ?
- '<dir>'
- /* если это файл - получаем
- * короткий размер
- */
- : CloudFunc.getShortedSize(
- files[i].size));
- lFileTable +='' +
- '' +
- (!files[i].uid ? 'root' : files[i].uid) +
- '' +
- '' +
- /* конвертируем названия разрешений
- * из числового формата в буквенный
- * при этом корневой каталог не трогаем
- * по скольку в нём и так всё уже
- * установлено еще на сервере
- */
- (//lPath==='/'?files[i].mode:
- CloudFunc
- .convertPermissionsToSymbolic
- (files[i].mode)) +
- '';
- lFileTable += '';
- }
-
- /* если клавиши назначены и
- * мы в корневом каталоге и
- * верхний файл еще не выделен -
- * выделяем верхний файл
- */
- if(pKeyBinded && lPath === '/'&&
- lFileTable.indexOf('') < 0){
- lFileTable = lFileTable
- .replace('',
- '');
- }
+ }
+ lHeader+='';
- return lFileTable;
-};
-
-/*
- * Если мы на стороне сервера -
- * прописываем экспортируемые функции
- */
-var exports;
-if(exports){
- /* экспортируемые функции */
- exports.checkExtension = CloudFunc.checkExtension;
- exports.buildFromJSON = CloudFunc.buildFromJSON;
- exports.setTitle = CloudFunc.setTitle;
- exports.getUserUIDsAndNames = CloudFunc.getUserUIDsAndNames;
+ return lHeader;
+ };
- /* константы*/
- exports.Name = CloudFunc.NAME;
- exports.NOJS = CloudFunc.NOJS;
- exports.FS = CloudFunc.FS;
-}
\ No newline at end of file
+ /**
+ * Функция строит таблицу файлв из JSON-информации о файлах
+ * @param pJSON - информация о файлах
+ * @param pKeyBinded - если клавиши назначены, выделяем верхний файл
+ * [{path:'путь',size:'dir'},
+ * {name:'имя',size:'размер',mode:'права доступа'}]
+ */
+ CloudFunc.buildFromJSON = function(pJSON, pKeyBinded)
+ {
+ var files;
+ /*
+ * Если мы на клиенте и нет JSON -
+ * через eval парсим.
+ * Если-же мы на сервере,
+ * или на клиенте всё есть
+ * парсим стандарным методом
+ *
+ * По скольку мы прописали заголовок application/json
+ * нет необходимости его конвертировать,
+ * но она есть, если мы вытягиваем данные из
+ * localStorage
+ */
+ files = pJSON;
+
+ /* сохраняем путь каталога в котором мы сейчас находимся*/
+ var lPath = files[0].path;
+
+ /* сохраняем путь */
+ CloudFunc.Path = lPath;
+
+ /*
+ * Строим путь каталога в котором мы находимся
+ * со всеми подкаталогами
+ */
+ var lHtmlPath = CloudFunc._getDirPath(lPath),
+
+ /* Убираем последний слэш
+ * с пути для кнопки обновить страницу
+ * если он есть
+ */
+ lRefreshPath = CloudFunc.removeLastSlash(lPath),
+
+ /* путь в ссылке, который говорит
+ * что js отключен
+ */
+ lNoJS_s = CloudFunc.NOJS,
+ lFS_s = CloudFunc.FS,
+
+ lFileTable =
+ ''+
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '' +
+ '' + lHtmlPath + '' +
+ '',
+
+ fileTableTitles = ['name','size','owner','mode'];
+
+ lFileTable += CloudFunc._getFileTableHeader(fileTableTitles);
+
+ /* Если мы не в корне */
+ if(lPath !== '/'){
+ /* ссылка на верхний каталог*/
+ var lDotDot;
+ /* убираем последний слеш и каталог в котором мы сейчас находимся*/
+ lDotDot = lPath.substr(lPath,lPath.lastIndexOf('/'));
+ lDotDot = lDotDot.substr(lDotDot,lDotDot.lastIndexOf('/'));
+ /* Если предыдущий каталог корневой */
+ if(lDotDot === '')lDotDot = '/';
+
+ /* Сохраняем путь к каталогу верхнего уровня*/
+ lFileTable += ''+
+ '' +
+ '' +
+ '' +
+ '' + ".." +
+ '' +
+ '<dir>'+
+ '.' +
+ '' +
+ '';
+ }
+
+ for(var i = 1, n = files.length; i < n; i++){
+ lFileTable += '';
+ lFileTable += '';
+ lFileTable += '';
+ lFileTable += '' +
+ ' CloudFunc.SHORTNAMELENGTH ?
+ ' title="' + files[i].name + '">' +
+ CloudFunc.getShortedName(files[i].name)
+ : 'draggable=true>' + files[i].name) +
+ "" +
+ '';
+ /* если папка - не выводим размер */
+ lFileTable += '' +
+ (files[i].size === 'dir' ?
+ '<dir>'
+ /* если это файл - получаем
+ * короткий размер
+ */
+ : CloudFunc.getShortedSize(
+ files[i].size));
+ lFileTable += '' +
+ '' +
+ (!files[i].uid ? 'root' : files[i].uid) +
+ '' +
+ '' +
+ /* конвертируем названия разрешений
+ * из числового формата в буквенный
+ * при этом корневой каталог не трогаем
+ * по скольку в нём и так всё уже
+ * установлено еще на сервере
+ */
+ (//lPath==='/'?files[i].mode:
+ CloudFunc
+ .convertPermissionsToSymbolic
+ (files[i].mode)) +
+ '';
+ lFileTable += '';
+ }
+
+ /* если клавиши назначены и
+ * мы в корневом каталоге и
+ * верхний файл еще не выделен -
+ * выделяем верхний файл
+ */
+ if(pKeyBinded && lPath === '/'&&
+ lFileTable.indexOf('') < 0){
+ lFileTable = lFileTable
+ .replace('',
+ '');
+ }
+
+ return lFileTable;
+ };
+
+ /*
+ * Если мы на стороне сервера -
+ * прописываем экспортируемые функции
+ */
+ if(exports){
+ /* экспортируемые функции */
+ exports.checkExtension = CloudFunc.checkExtension;
+ exports.buildFromJSON = CloudFunc.buildFromJSON;
+ exports.setTitle = CloudFunc.setTitle;
+ exports.getUserUIDsAndNames = CloudFunc.getUserUIDsAndNames;
+
+ /* константы*/
+ exports.Name = CloudFunc.NAME;
+ exports.NOJS = CloudFunc.NOJS;
+ exports.FS = CloudFunc.FS;
+ }
+})();
\ No newline at end of file