refactor(client) mv Events.add to listeners

This commit is contained in:
coderaiser 2013-09-18 07:41:50 +00:00
parent d1dda5a7ae
commit 5e055f3d67
2 changed files with 307 additions and 267 deletions

View file

@ -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);

280
lib/client/listeners.js Normal file
View file

@ -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);