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). ![Cloud Commander](img/logo/cloudcmd.png "Cloud Commander") 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='
  • '; - lHeader+=''; - for(var i=0;i'+ - lStr+ - ''; - } - 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='
  • '; + lHeader+=''; + for(var i=0;i'+ + lStr+ + ''; + } + 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