diff --git a/lib/client.js b/lib/client.js index df690e5f..7b0af0e2 100644 --- a/lib/client.js +++ b/lib/client.js @@ -7,8 +7,7 @@ var Util, DOM, CloudFunc, CloudCmd; (function(Util, DOM){ 'use strict'; - var Key, Config, Modules, FileTemplate, PathTemplate, - Events = DOM.Events, + var Key, Config, Modules, FileTemplate, PathTemplate, Listeners, Cache = DOM.Cache; CloudCmd = { @@ -26,16 +25,6 @@ var Util, DOM, CloudFunc, CloudCmd; })() }; - CloudCmd.analytics = function(){ - Events.addOneTime('mousemove', function(){ - var lUrl = CloudCmd.LIBDIRCLIENT + 'analytics.js'; - - setTimeout(function(){ - DOM.jsload(lUrl); - }, 5000); - }); - }; - /** * Функция привязываеться ко всем ссылкам и * загружает содержимое каталогов @@ -132,7 +121,6 @@ var Util, DOM, CloudFunc, CloudCmd; var lCallBack = function(){ Util.loadOnLoad([ Util.retExec(route, location.hash), - initKeysPanel, initModules, baseInit ]); @@ -147,17 +135,6 @@ var Util, DOM, CloudFunc, CloudCmd; }; Util.ifExec(document.body.scrollIntoViewIfNeeded, lCallBack, lFunc); - - DOM.Events.add(['unload', 'beforeunload'], function (pEvent) { - var lRet, lIsBind = Key && Key.isBind(); - - if(!lIsBind) { - DOM.preventDefault(pEvent); - lRet = 'Please make sure that you saved all work.'; - } - - return lRet; - }); }; function initModules(pCallBack){ @@ -173,10 +150,6 @@ var Util, DOM, CloudFunc, CloudCmd; CloudCmd.getModules(function(pModules) { pModules = pModules || []; - Events.addContextMenu(function(pEvent){ - CloudCmd.Menu.ENABLED || DOM.preventDefault(pEvent); - }, document); - var i, n, lStorage = 'storage', lShowLoadFunc = Util.retFunc( DOM.Images.showLoad, {top:true} ), @@ -217,117 +190,26 @@ var Util, DOM, CloudFunc, CloudCmd; }); } - function initKeysPanel(pCallBack){ - var i, lButton, lEl, - lKeysPanel = {}, - - lFuncs =[ - null, - CloudCmd.Help, /* f1 */ - DOM.renameCurrent, /* f2 */ - CloudCmd.View, /* f3 */ - CloudCmd.Edit, /* f4 */ - DOM.copyCurrent, /* f5 */ - DOM.moveCurrent, /* f6 */ - DOM.promptNewDir, /* f7 */ - DOM.promptDeleteSelected, /* f8 */ - CloudCmd.Menu, /* f9 */ - ]; - - for (i = 1; i <= 9; i++) { - lButton = 'f' + i, - lEl = DOM.getById('f' + i); - lKeysPanel[lButton] = lEl; - - if (i === 1 || i === 3 || i === 4 || i === 9) - Events.addOneTime('click', lFuncs[i], lEl); - else - Events.addClick(lFuncs[i], lEl); - } - - lButton = '~', - lEl = DOM.getById('~'); - lKeysPanel[lButton] = lEl; - Events.addOneTime('click', CloudCmd.Console, lEl); - - CloudCmd.KeysPanel = lKeysPanel; - Util.exec(pCallBack); - } function baseInit(pCallBack) { - var panels = DOM.getByClass('panel'), - i = 0, - n = panels.length, - preventDefault = function (event) { - event.stopPropagation(); - event.preventDefault(); - }, - toggle = function () { - for (i = 0; i < n; i++) - DOM.toggleClass(panels[i], 'selected-panel'); - }, - onDrop = function (event) { - var reader, file, files, - dir = DOM.getCurrentDirPath(), - load = function(file){ - return function(event) { - var path = dir + file.name, - data = event.target.result; - - DOM.RESTfull.save(path, data, CloudCmd.refresh); - }; - }; + var LIB = CloudCmd.LIBDIR, + LIBCLIENT = CloudCmd.LIBDIRCLIENT, + files = [ + LIB + 'cloudfunc.js', + LIBCLIENT + 'listeners.js' + ]; - preventDefault(event); - toggle(); - - files = event.dataTransfer.files; - - if (files.length) { - n = files.length; - - for (i = 0; i < n; i++) { - reader = new FileReader(); - file = files[i]; - Events.add('load', load(file), reader); - reader.readAsArrayBuffer(file); - } - } - }; - - if (window.applicationCache) - Events.add('updateready', function() { - var ret = confirm('An update is available. Reload now?'); - - if (ret) - location.reload(); - - }, applicationCache); - - Events.add(['dragenter', 'dragleave'], toggle); - - for (i = 0; i < n; i++) { - Events.add('dragover', preventDefault, panels[i]); - Events.add('drop', onDrop, panels[i]); - } - - /* загружаем общие функции для клиента и сервера */ - DOM.jsload(CloudCmd.LIBDIR + 'cloudfunc.js', function() { - Events.add("popstate", function(pEvent) { - var lPath = pEvent.state + '?json'; - - if (pEvent.state) { - lPath = pEvent.state + '?json'; - ajaxLoad(lPath, {nohistory: true}); - } else - route(location.hash); - - return true; - }); + DOM.anyLoadInParallel(files, function() { + Listeners = CloudCmd.Listeners; - changeLinks(CloudFunc.LEFTPANEL); - changeLinks(CloudFunc.RIGHTPANEL); + Listeners.init(); + /* загружаем Google Analytics */ + Listeners.analytics(); + Listeners.changeLinks(CloudFunc.LEFTPANEL); + Listeners.changeLinks(CloudFunc.RIGHTPANEL); + + CloudCmd.KeysPanel = Listeners.initKeysPanel(); /* устанавливаем переменную доступности кэша */ Cache.setAllowed(true); @@ -433,132 +315,16 @@ var Util, DOM, CloudFunc, CloudCmd; }); }; - - /** - * функция меняет ссыки на ajax-овые - * @param pPanelID - */ - function changeLinks(pPanelID){ - /* назначаем кнопку очистить кэш и показываем её */ - var lClearcache = DOM.getById('clear-cache'); - Events.addClick(Cache.clear, lClearcache); - - /* меняем ссылки на ajax-запросы */ - var lPanel = DOM.getById(pPanelID), - a = DOM.getByTag('a', lPanel), - - /* right mouse click function varible */ - lOnContextMenu_f = function(pEvent){ - var lReturn_b = true; - - Key && Key.unsetBind(); - - /* getting html element - * currentTarget - DOM event - * target - jquery event - */ - var lTarget = pEvent.currentTarget || pEvent.target; - DOM.setCurrentFile(lTarget); - - if(Util.isFunction(CloudCmd.Menu) ){ - CloudCmd.Menu({ - x: pEvent.clientX, - y: pEvent.clientY - }); - - /* disabling browsers menu*/ - lReturn_b = false; - DOM.Images.showLoad(); - } - - return lReturn_b; - }, - - /* drag and drop function varible - * download file from browser to descktop - * in Chrome (HTML5) - */ - lOnDragStart_f = function(pEvent){ - var lElement = pEvent.target, - lLink = lElement.href, - lName = lElement.textContent; - - /* if it's directory - adding json extension */ - if( DOM.isCurrentIsDir() ){ - lName += '.json'; - lLink += '?json'; - } - - pEvent.dataTransfer.setData("DownloadURL", - 'application/octet-stream' + ':' + - lName + ':' + - lLink); - }, - - lSetCurrentFile_f = function(pEvent){ - var pElement = pEvent.target, - lTag = pElement.tagName; - - if(lTag !== 'LI') - do{ - pElement = pElement.parentElement; - lTag = pElement.tagName; - }while(lTag !== 'LI'); - - DOM.setCurrentFile(pElement); - }, - - lUrl = CloudCmd.HOST, - lLoadDirOnce = CloudCmd.loadDir(); - - CloudCmd.refresh = function(pCurrent){ - var lNEEDREFRESH = true, - lPanel = pCurrent && pCurrent.parentElement, - lPath = DOM.getCurrentDirPath(lPanel), - lLink = CloudFunc.FS + lPath, - lNotSlashlLink = CloudFunc.removeLastSlash(lLink), - lLoad = CloudCmd.loadDir(lNotSlashlLink, lNEEDREFRESH); - lLoad(); - }; + CloudCmd.refresh = function(pCurrent){ + var lNEEDREFRESH = true, + lPanel = pCurrent && pCurrent.parentElement, + lPath = DOM.getCurrentDirPath(lPanel), + lLink = CloudFunc.FS + lPath, + lNotSlashlLink = CloudFunc.removeLastSlash(lLink), + lLoad = CloudCmd.loadDir(lNotSlashlLink, lNEEDREFRESH); - /* ставим загрузку гифа на клик*/ - Events.addClick( CloudCmd.refresh, a[0].parentElement ); - - /* start from 1 cous 0 is a path and it's setted up */ - for(var i = 1, n = a.length; i < n ; i++){ - /* убираем адрес хоста*/ - var ai = a[i], - lLink = Util.removeStr(ai.href, lUrl), - lLoadDir = CloudCmd.loadDir(lLink), - /* устанавливаем обработчики на строку - * на двойное нажатие на левую кнопку мышки */ - lLi = ai.parentElement.parentElement; - - /* if we in path - set click event */ - if (lLi.className === 'path') - Events.addClick( lLoadDir, ai ); - else { - Events.add({ - 'click' : DOM.preventDefault, - 'mousedown' : lSetCurrentFile_f, - 'contextmenu' : lOnContextMenu_f - }, lLi); - - Events.add('dragstart', lOnDragStart_f, ai); - - /* если ссылка на папку, а не файл */ - if(ai.target !== '_blank'){ - Events.add({ - 'dblclick' : lLoadDirOnce, - 'touchend' : lLoadDirOnce - }, lLi); - } - - lLi.id = (ai.title ? ai.title : ai.textContent) + - '(' + pPanelID + ')'; - } - } - } + lLoad(); + }; /** * Функция загружает json-данные о Файловой Системе @@ -681,7 +447,7 @@ var Util, DOM, CloudFunc, CloudCmd; DOM.setCurrentFile(lCurrent); - changeLinks(pElem); + Listeners.changeLinks(pElem); if(lName === '..' && lDir !== '/') currentToParent(lDir); @@ -730,11 +496,5 @@ var Util, DOM, CloudFunc, CloudCmd; return Util.stringifyJSON(lFileTable); } - Events.addOneTime('load', function(){ - /* базовая инициализация*/ - CloudCmd.init(); - - /* загружаем Google Analytics */ - CloudCmd.analytics(); - }); + DOM.Events.addOneTime('load', CloudCmd.init); })(Util, DOM); diff --git a/lib/client/listeners.js b/lib/client/listeners.js new file mode 100644 index 00000000..00a7dda1 --- /dev/null +++ b/lib/client/listeners.js @@ -0,0 +1,280 @@ +var Util, DOM, CloudCmd; + +(function (Util, DOM) { + 'use strict'; + + CloudCmd.Listeners = new ListenersProto(CloudCmd, Util, DOM); + + function ListenersProto(CloudCmd, Util, DOM){ + var Cache = DOM.Cache, + Events = DOM.Events; + + this.analytics = function(){ + Events.addOneTime('mousemove', function(){ + var lUrl = CloudCmd.LIBDIRCLIENT + 'analytics.js'; + + setTimeout(function(){ + DOM.jsload(lUrl); + }, 5000); + }); + }; + + this.init = function () { + appCache(); + contextMenu(); + dragndrop(); + unload(); + pop(); + }; + + this.initKeysPanel = function() { + var i, lButton, lEl, + lKeysPanel = {}, + + lFuncs =[ + null, + CloudCmd.Help, /* f1 */ + DOM.renameCurrent, /* f2 */ + CloudCmd.View, /* f3 */ + CloudCmd.Edit, /* f4 */ + DOM.copyCurrent, /* f5 */ + DOM.moveCurrent, /* f6 */ + DOM.promptNewDir, /* f7 */ + DOM.promptDeleteSelected, /* f8 */ + CloudCmd.Menu, /* f9 */ + ]; + + for (i = 1; i <= 9; i++) { + lButton = 'f' + i, + lEl = DOM.getById('f' + i); + lKeysPanel[lButton] = lEl; + + if (i === 1 || i === 3 || i === 4 || i === 9) + Events.addOneTime('click', lFuncs[i], lEl); + else + Events.addClick(lFuncs[i], lEl); + } + + lButton = '~', + lEl = DOM.getById('~'); + lKeysPanel[lButton] = lEl; + Events.addOneTime('click', CloudCmd.Console, lEl); + + return lKeysPanel; + }; + + /** + * функция меняет ссыки на ajax-овые + * @param pPanelID + */ + this.changeLinks = function(pPanelID){ + /* назначаем кнопку очистить кэш и показываем её */ + var lClearcache = DOM.getById('clear-cache'); + Events.addClick(Cache.clear, lClearcache); + + /* меняем ссылки на ajax-запросы */ + var lPanel = DOM.getById(pPanelID), + a = DOM.getByTag('a', lPanel), + + /* right mouse click function varible */ + lOnContextMenu_f = function(pEvent){ + var lReturn_b = true, + Key = CloudCmd.Key; + + Key && Key.unsetBind(); + + /* getting html element + * currentTarget - DOM event + * target - jquery event + */ + var lTarget = pEvent.currentTarget || pEvent.target; + DOM.setCurrentFile(lTarget); + + if(Util.isFunction(CloudCmd.Menu) ){ + CloudCmd.Menu({ + x: pEvent.clientX, + y: pEvent.clientY + }); + + /* disabling browsers menu*/ + lReturn_b = false; + DOM.Images.showLoad(); + } + + return lReturn_b; + }, + + /* drag and drop function varible + * download file from browser to descktop + * in Chrome (HTML5) + */ + lOnDragStart_f = function(pEvent){ + var lElement = pEvent.target, + lLink = lElement.href, + lName = lElement.textContent; + + /* if it's directory - adding json extension */ + if( DOM.isCurrentIsDir() ){ + lName += '.json'; + lLink += '?json'; + } + + pEvent.dataTransfer.setData("DownloadURL", + 'application/octet-stream' + ':' + + lName + ':' + + lLink); + }, + + lSetCurrentFile_f = function(pEvent){ + var pElement = pEvent.target, + lTag = pElement.tagName; + + if(lTag !== 'LI') + do{ + pElement = pElement.parentElement; + lTag = pElement.tagName; + }while(lTag !== 'LI'); + + DOM.setCurrentFile(pElement); + }, + + lUrl = CloudCmd.HOST, + lLoadDirOnce = CloudCmd.loadDir(); + + /* ставим загрузку гифа на клик*/ + Events.addClick( CloudCmd.refresh, a[0].parentElement ); + + /* start from 1 cous 0 is a path and it's setted up */ + for(var i = 1, n = a.length; i < n ; i++){ + /* убираем адрес хоста*/ + var ai = a[i], + lLink = Util.removeStr(ai.href, lUrl), + lLoadDir = CloudCmd.loadDir(lLink), + /* устанавливаем обработчики на строку + * на двойное нажатие на левую кнопку мышки */ + lLi = ai.parentElement.parentElement; + + /* if we in path - set click event */ + if (lLi.className === 'path') + Events.addClick( lLoadDir, ai ); + else { + Events.add({ + 'click' : DOM.preventDefault, + 'mousedown' : lSetCurrentFile_f, + 'contextmenu' : lOnContextMenu_f + }, lLi); + + Events.add('dragstart', lOnDragStart_f, ai); + + /* если ссылка на папку, а не файл */ + if(ai.target !== '_blank'){ + Events.add({ + 'dblclick' : lLoadDirOnce, + 'touchend' : lLoadDirOnce + }, lLi); + } + + lLi.id = (ai.title ? ai.title : ai.textContent) + + '(' + pPanelID + ')'; + } + } + }; + + function appCache() { + if (window.applicationCache) + Events.add('updateready', function() { + var ret = confirm('An update is available. Reload now?'); + + if (ret) + location.reload(); + + }, applicationCache); + } + + function contextMenu() { + Events.addContextMenu(function(pEvent){ + CloudCmd.Menu.ENABLED || DOM.preventDefault(pEvent); + }, document); + } + + function dragndrop() { + var panels = DOM.getByClass('panel'), + i = 0, + n = panels.length, + preventDefault = function (event) { + event.stopPropagation(); + event.preventDefault(); + }, + toggle = function () { + for (i = 0; i < n; i++) + DOM.toggleClass(panels[i], 'selected-panel'); + }, + onDrop = function (event) { + var reader, file, files, + dir = DOM.getCurrentDirPath(), + load = function(file){ + return function(event) { + var path = dir + file.name, + data = event.target.result; + + DOM.RESTfull.save(path, data, CloudCmd.refresh); + }; + }; + + preventDefault(event); + toggle(); + + files = event.dataTransfer.files; + + if (files.length) { + n = files.length; + + for (i = 0; i < n; i++) { + reader = new FileReader(); + file = files[i]; + Events.add('load', load(file), reader); + reader.readAsArrayBuffer(file); + } + } + }; + + Events.add(['dragenter', 'dragleave'], toggle); + + for (i = 0; i < n; i++) { + Events.add('dragover', preventDefault, panels[i]); + Events.add('drop', onDrop, panels[i]); + } + } + + function unload() { + DOM.Events.add(['unload', 'beforeunload'], function (pEvent) { + var lRet, + Key = CloudCmd.Key, + lIsBind = Key && Key.isBind(); + + if(!lIsBind) { + DOM.preventDefault(pEvent); + lRet = 'Please make sure that you saved all work.'; + } + + return lRet; + }); + } + + function pop() { + Events.add("popstate", function(pEvent) { + var lPath = pEvent.state + '?json'; + + if (pEvent.state) { + lPath = pEvent.state + '?json'; + ajaxLoad(lPath, {nohistory: true}); + } else + route(location.hash); + + return true; + }); + } + + } + +})(Util, DOM);