cloudcmd/lib/client/config.js
2014-12-15 04:31:48 -05:00

315 lines
9.3 KiB
JavaScript

var CloudCmd, Util, DOM, io;
(function(CloudCmd, Util, DOM) {
'use strict';
CloudCmd.Config = ConfigProto;
function ConfigProto() {
var Loading = true,
Key = CloudCmd.Key,
Images = DOM.Images,
Events = DOM.Events,
showLoad = function() {
Images.show.load('top');
},
Element,
INPUT = 'INPUT',
CONFIG,
Template,
Notify = DOM.Notify,
Config = this;
function init() {
Loading = true;
showLoad();
Util.exec.series([
CloudCmd.View,
function(callback) {
Loading = false;
Util.exec(callback);
DOM.loadSocket(initSocket);
},
Config.show
]);
}
function getHost() {
var l = location,
href = l.origin || l.protocol + '//' + l.host;
return href;
}
function initSocket(error) {
var socket,
href = getHost(),
FIVE_SECONDS = 5000,
save = function(data) {
socket.send(data);
};
if (!error) {
socket = io.connect(href + '/config', {
'max reconnection attempts' : Math.pow(2, 32),
'reconnection limit' : FIVE_SECONDS
});
socket.on('connect', function() {
Config.save = save;
});
socket.on('message', function(data) {
onSave(data);
});
socket.on('log', function(msg) {
Util.log(msg);
});
socket.on('disconnect', function() {
Config.save = saveHttp;
});
socket.on('err', function(error) {
DOM.Dialog.alert(error);
});
}
}
Config.save = saveHttp;
this.show = function() {
var prefix = CloudCmd.PREFIX,
exec = Util.exec,
funcs = [
exec.with(DOM.Files.get, 'config-tmpl'),
exec.with(DOM.load.css, prefix + '/css/config.css')
];
if (!Loading) {
showLoad();
exec.parallel(funcs, fillTemplate);
}
};
function fillTemplate(error, template) {
if (!Template)
Template = template;
DOM.Files.get('config', function(error, config) {
var div, data, inputs, inputFirst,
focus, obj;
CONFIG = config;
obj = Util.copyObj(CONFIG);
changeConfig(obj);
data = Util.render(Template, obj);
div = DOM.load({
name : 'div',
className : 'config',
inner : data,
attribute : {
'data-name': 'js-config'
}
});
Element = div;
inputs = DOM.getByTag(INPUT, div);
inputFirst = inputs[0];
if (inputFirst) {
onAuthChange(inputFirst.checked);
focus = function() {
inputFirst.focus();
};
}
[].forEach.call(inputs, function(input) {
Events.addKey(input, onKey)
.add('change', input, function(event) {
onChange(event.target);
});
});
CloudCmd.View.show(div, {
autoSize: true,
afterShow: focus
});
});
}
this.hide = function() {
CloudCmd.View.hide();
};
function changeConfig(config) {
Object.keys(config).forEach(function(name) {
var item = config[name],
isBool = Util.type.boolean(item);
if (isBool)
config[name] = setState(item);
});
}
function setState(state) {
var ret = '';
if (state)
ret = ' checked';
return ret;
}
function onChange(el) {
var data,
obj = {},
name = el.id,
type = el.type;
data = getValue(el);
if (type === 'checkbox')
if (el.id === 'localStorage')
onLocalStorageChange();
else if (el.id === 'diff')
onLSChange(el);
else if (el.id === 'buffer')
onLSChange(el);
else if (el.id === 'dirStorage')
onLSChange(el);
else if (el.id === 'auth')
onAuthChange(data);
if (name === 'notifications') {
if (data && !Notify.check())
Notify.request();
}
obj[name] = data;
Config.save(obj);
}
function onSave(obj) {
Object.keys(obj).forEach(function(name) {
var data = obj[name];
CONFIG[name] = data;
setValue(name, data);
});
DOM.Files.set('config', CONFIG);
}
function saveHttp(obj) {
var RESTful = DOM.RESTful;
RESTful.Config.write(obj, function() {
onSave(obj);
});
}
function getValue(el) {
var data,
type = el.type;
switch(type) {
case 'checkbox':
data = el.checked;
break;
case 'number':
data = el.value - 0;
break;
default:
data = el.value;
break;
}
return data;
}
function setValue(name, value) {
var el = DOM.getById(name, Element),
type = el.type;
switch(type) {
case 'checkbox':
el.checked = value;
break;
default:
el.value = value;
break;
}
}
function onLocalStorageChange() {
var names = ['diff', 'buffer', 'dirStorage', 'localStorage'],
elements = names.map(function(name) {
return DOM.getById(name);
}),
el = {},
msg = 'Diff, Buffer and Directory Storage do not work without localStorage',
isChecked;
elements.forEach(function(element) {
var name = element.id;
el[name] = element;
if (element.checked)
isChecked = true;
});
if (isChecked && !el.localStorage.checked) {
alert(msg);
elements.forEach(function(element) {
if (element.checked) {
element.checked = false;
onChange(element);
}
return element;
});
}
}
function onLSChange(el) {
var elLocalStorage = DOM.getById('localStorage', Element),
msg = el.id + ' depends on localStorage';
if (el.checked && !elLocalStorage.checked) {
alert(msg);
elLocalStorage.checked = true;
}
}
function onAuthChange(checked) {
var elUsername = DOM.getById('username', Element),
elPassword = DOM.getById('password', Element);
elUsername.disabled =
elPassword.disabled = !checked;
}
function onKey(event) {
var keyCode = event.keyCode,
ESC = Key.ESC;
if (keyCode === ESC)
Config.hide();
}
init();
}
})(CloudCmd, Util, DOM);