diff --git a/ChangeLog b/ChangeLog
index 9ec6842c..6971ee77 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -136,6 +136,8 @@ while menu is showing now.
* Added ability to remove /fs/no-js when go up to root
directory.
+* Removed reflows maded by js.
+
2012.12.12, Version 0.1.8
diff --git a/README.md b/README.md
index 9791205d..ad96c9e8 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ DEMO:
[cloudfoundry] (http://cloudcmd.cloudfoundry.com "cloudfoundry"),
[appfog] (http://cloudcmd.aws.af.cm "appfog").
-Google PageSpeed Score : [99](http://developers.google.com/speed/pagespeed/insights#url=http_3A_2F_2Fcloudcmd.cloudfoundry.com_2F&mobile=false "score") (out of 100)
+Google PageSpeed Score : [100](http://developers.google.com/speed/pagespeed/insights#url=http_3A_2F_2Fcloudcmd.cloudfoundry.com_2F&mobile=false "score") (out of 100)
(or 96 if js or css minification disabled in config.json).

diff --git a/json/config.json b/json/config.json
index 609d9776..e53c7ca4 100644
--- a/json/config.json
+++ b/json/config.json
@@ -2,7 +2,7 @@
"api_url" : "/api/v1",
"appcache" : false,
"minification" : {
- "js" : false,
+ "js" : true,
"css" : true,
"html" : true,
"img" : true
diff --git a/lib/client.js b/lib/client.js
index 0e6d99ea..ea909564 100644
--- a/lib/client.js
+++ b/lib/client.js
@@ -337,19 +337,14 @@ function baseInit(pCallBack){
DOM.Cache.set('/', CloudCmd._getJSONfromFileTable());
});
- /* устанавливаем размер высоты таблицы файлов
- * исходя из размеров разрешения экрана
- */
-
- /* выделяем строку с первым файлом */
- var lFmHeader = DOM.getByClass('fm-header');
- DOM.setCurrentFile(lFmHeader[0].nextSibling);
-
/* показываем элементы, которые будут работать только, если есть js */
var lFM = DOM.getById('fm');
lFM.className='localstorage';
- /* формируем и округляем высоту экрана
+ /* устанавливаем размер высоты таблицы файлов
+ * исходя из размеров разрешения экрана
+ *
+ * формируем и округляем высоту экрана
* при разрешениии 1024x1280:
* 658 -> 700
*/
diff --git a/lib/cloudfunc.js b/lib/cloudfunc.js
index 18b2e5ec..e0e2faf8 100644
--- a/lib/cloudfunc.js
+++ b/lib/cloudfunc.js
@@ -1,449 +1,446 @@
-var CloudFunc, exports;
-
-(function(){
- "use strict";
-
- /**
- * Модуль, содержащий функции, которые
- * будут работать и на клиенте и на сервере
- */
-
- CloudFunc = exports || {};
-
- /* Путь с которым мы сейчас работаем */
- CloudFunc.Path = '';
-
- /* КОНСТАНТЫ (общие для клиента и сервера)*/
-
- /* название программы */
- CloudFunc.NAME = 'Cloud Commander';
-
- /* если в ссылке будет эта строка - в браузере js отключен */
- CloudFunc.NOJS = '/no-js';
- CloudFunc.FS = '/fs';
-
- /* название css-класа кнопки обновления файловой структуры*/
- CloudFunc.REFRESHICON = 'refresh-icon';
-
- /* id панелей с файлами */
- CloudFunc.LEFTPANEL = 'left';
- CloudFunc.RIGHTPANEL = 'right';
-
- /* length of longest file name */
- CloudFunc.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;
- };
-
- /** Функция возвращает заголовок веб страницы
- * @pPath
- */
- CloudFunc.getTitle = function(pPath){
- if(!CloudFunc.Path)
- CloudFunc.Path = '/';
-
- return CloudFunc.NAME + ' - ' + (pPath || CloudFunc.Path);
-
- };
- /**
- * Функция переводит права из цыфрового вида в символьный
- * @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) 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),
- lGroup = (pPerm_s[1]-0).toString(2),
- lAll = (pPerm_s[2]-0).toString(2),
- /*
- console.log(lOwner+' '+lGroup+' '+lAll);
- */
- /* переводим в символьную систему*/
- 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),
-
- lGroup= (pPerm_s[4] === 'r' ? 4 : 0) +
- (pPerm_s[5] === 'w' ? 2 : 0) +
- (pPerm_s[6] === 'x' ? 1 : 0),
-
- 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;
- };
-
- /** Функция парсит uid и имена пользователей
- * из переданного в строке вычитаного файла /etc/passwd
- * и возвращает массив обьектов имён и uid пользователей
- * @pPasswd_s - строка, в которой находиться файл /etc/passwd
- */
- CloudFunc.getUserUIDsAndNames = function(pPasswd_s){
- var lUsers = {name:'', uid:''},
- lUsersData = [],
- 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 = [],
- i = 0;
- do{
- folders[i++] = url;
- url = url.substr(url,url.lastIndexOf('/'));
- }while(url !== '');
-
- /* Формируем ссылки на каждый каталог в пути */
- var lHref = '',
- lHrefEnd ='',
-
- lHtmlPath,
-
- /* путь в ссылке, который говорит что js отключен */
- lNoJS_s = CloudFunc.NOJS,
- 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],
- 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;
- };
-
- /**
- * Функция формирует заголовки столбиков
- * @pFileTableTitles - массив названий столбиков
- */
- CloudFunc._getFileTableHeader = function(pFileTableTitles)
- {
- var lHeader='
';
-
- return lHeader;
- };
-
- /**
- * Функция строит таблицу файлв из 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 += '' +
- '' + 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;
- };
+var CloudFunc, exports;
+
+(function(){
+ "use strict";
+
+ /**
+ * Модуль, содержащий функции, которые
+ * будут работать и на клиенте и на сервере
+ */
+
+ CloudFunc = exports || {};
+
+ /* Путь с которым мы сейчас работаем */
+ CloudFunc.Path = '';
+
+ /* КОНСТАНТЫ (общие для клиента и сервера)*/
+
+ /* название программы */
+ CloudFunc.NAME = 'Cloud Commander';
+
+ /* если в ссылке будет эта строка - в браузере js отключен */
+ CloudFunc.NOJS = '/no-js';
+ CloudFunc.FS = '/fs';
+
+ /* название css-класа кнопки обновления файловой структуры*/
+ CloudFunc.REFRESHICON = 'refresh-icon';
+
+ /* id панелей с файлами */
+ CloudFunc.LEFTPANEL = 'left';
+ CloudFunc.RIGHTPANEL = 'right';
+
+ /* length of longest file name */
+ CloudFunc.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;
+ };
+
+ /** Функция возвращает заголовок веб страницы
+ * @pPath
+ */
+ CloudFunc.getTitle = function(pPath){
+ if(!CloudFunc.Path)
+ CloudFunc.Path = '/';
+
+ return CloudFunc.NAME + ' - ' + (pPath || CloudFunc.Path);
+
+ };
+ /**
+ * Функция переводит права из цыфрового вида в символьный
+ * @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) 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),
+ lGroup = (pPerm_s[1]-0).toString(2),
+ lAll = (pPerm_s[2]-0).toString(2),
+ /*
+ console.log(lOwner+' '+lGroup+' '+lAll);
+ */
+ /* переводим в символьную систему*/
+ 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),
+
+ lGroup= (pPerm_s[4] === 'r' ? 4 : 0) +
+ (pPerm_s[5] === 'w' ? 2 : 0) +
+ (pPerm_s[6] === 'x' ? 1 : 0),
+
+ 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;
+ };
+
+ /** Функция парсит uid и имена пользователей
+ * из переданного в строке вычитаного файла /etc/passwd
+ * и возвращает массив обьектов имён и uid пользователей
+ * @pPasswd_s - строка, в которой находиться файл /etc/passwd
+ */
+ CloudFunc.getUserUIDsAndNames = function(pPasswd_s){
+ var lUsers = {name:'', uid:''},
+ lUsersData = [],
+ 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 = [],
+ i = 0;
+ do{
+ folders[i++] = url;
+ url = url.substr(url,url.lastIndexOf('/'));
+ }while(url !== '');
+
+ /* Формируем ссылки на каждый каталог в пути */
+ var lHref = '',
+ lHrefEnd ='',
+
+ lHtmlPath,
+
+ /* путь в ссылке, который говорит что js отключен */
+ lNoJS_s = CloudFunc.NOJS,
+ 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],
+ 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;
+ };
+
+ /**
+ * Функция формирует заголовки столбиков
+ * @pFileTableTitles - массив названий столбиков
+ */
+ CloudFunc._getFileTableHeader = function(pFileTableTitles)
+ {
+ var lHeader='';
+
+ return lHeader;
+ };
+
+ /**
+ * Функция строит таблицу файлв из 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 += '' +
+ '' + 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(lPath === '/')
+ lFileTable = lFileTable.replace('',
+ '');
+
+ return lFileTable;
+ };
})();
\ No newline at end of file