diff --git a/js/esm.js b/js/esm.js
new file mode 100644
index 0000000..8d6f283
--- /dev/null
+++ b/js/esm.js
@@ -0,0 +1,405 @@
+var esm = {};
+
+
+esm.getSystem = function() {
+
+ var module = 'system';
+
+ esm.reloadBlock_spin(module);
+
+ $.get('libs/'+module+'.php', function(data) {
+
+ var $box = $('.box#esm-'+module+' .box-content tbody');
+
+ esm.insertDatas($box, module, data);
+
+ esm.reloadBlock_spin(module);
+
+ }, 'json');
+
+}
+
+
+esm.getLoad_average = function() {
+
+ var module = 'load_average';
+
+ esm.reloadBlock_spin(module);
+
+ $.get('libs/'+module+'.php', function(data) {
+
+ var $box = $('.box#esm-'+module+' .box-content');
+
+ esm.reconfigureGauge($('input#load-average_1', $box), data[0]);
+ esm.reconfigureGauge($('input#load-average_5', $box), data[1]);
+ esm.reconfigureGauge($('input#load-average_15', $box), data[2]);
+
+ esm.reloadBlock_spin(module);
+
+ }, 'json');
+
+}
+
+
+esm.getCpu = function() {
+
+ var module = 'cpu';
+
+ esm.reloadBlock_spin(module);
+
+ $.get('libs/'+module+'.php', function(data) {
+
+ var $box = $('.box#esm-'+module+' .box-content tbody');
+
+ esm.insertDatas($box, module, data);
+
+ esm.reloadBlock_spin(module);
+
+ }, 'json');
+
+}
+
+
+esm.getMemory = function() {
+
+ var module = 'memory';
+
+ esm.reloadBlock_spin(module);
+
+ $.get('libs/'+module+'.php', function(data) {
+
+ var $box = $('.box#esm-'+module+' .box-content tbody');
+
+ esm.insertDatas($box, module, data);
+
+ esm.reloadBlock_spin(module);
+
+ // Percent bar
+ var $progress = $('.progressbar', $box);
+
+ $progress
+ .css('width', data.percent_used+'%')
+ .html(data.percent_used+'%')
+ .removeClass('green orange red');
+
+ if (data.percent_used <= 50)
+ $progress.addClass('green');
+ else if (data.percent_used <= 75)
+ $progress.addClass('orange');
+ else
+ $progress.addClass('red');
+
+ }, 'json');
+
+}
+
+
+esm.getSwap = function() {
+
+ var module = 'swap';
+
+ esm.reloadBlock_spin(module);
+
+ $.get('libs/'+module+'.php', function(data) {
+
+ var $box = $('.box#esm-'+module+' .box-content tbody');
+
+ esm.insertDatas($box, module, data);
+
+ // Percent bar
+ var $progress = $('.progressbar', $box);
+
+ $progress
+ .css('width', data.percent_used+'%')
+ .html(data.percent_used+'%')
+ .removeClass('green orange red');
+
+ if (data.percent_used <= 50)
+ $progress.addClass('green');
+ else if (data.percent_used <= 75)
+ $progress.addClass('orange');
+ else
+ $progress.addClass('red');
+
+ esm.reloadBlock_spin(module);
+
+ }, 'json');
+
+}
+
+
+esm.getDisk = function() {
+
+ var module = 'disk';
+
+ esm.reloadBlock_spin(module);
+
+ $.get('libs/'+module+'.php', function(data) {
+
+ var $box = $('.box#esm-'+module+' .box-content tbody');
+ $box.empty();
+
+ for (var line in data)
+ {
+ var bar_class = '';
+
+ if (data[line].percent_used <= 50)
+ bar_class = 'green';
+ else if (data[line].percent_used <= 75)
+ bar_class = 'orange';
+ else
+ bar_class = 'red';
+
+ var html = '';
+ html += '
';
+
+ if (typeof data[line].filesystem != 'undefined')
+ html += ''+data[line].filesystem+' | ';
+
+ html += ''+data[line].mount+' | ';
+ html += ''+data[line].percent_used+'% | ';
+ html += ''+data[line].free+' | ';
+ html += ''+data[line].used+' | ';
+ html += ''+data[line].total+' | ';
+ html += '
';
+
+ $box.append(html);
+ }
+
+ esm.reloadBlock_spin(module);
+
+ }, 'json');
+
+}
+
+
+esm.getLast_login = function() {
+
+ var module = 'last_login';
+
+ esm.reloadBlock_spin(module);
+
+ $.get('libs/'+module+'.php', function(data) {
+
+ var $box = $('.box#esm-'+module+' .box-content tbody');
+ $box.empty();
+
+ for (var line in data)
+ {
+ var html = '';
+ html += '';
+ html += ''+data[line].user+' | ';
+ html += ''+data[line].date+' | ';
+ html += '
';
+
+ $box.append(html);
+ }
+
+ esm.reloadBlock_spin(module);
+
+ }, 'json');
+
+}
+
+
+esm.getNetwork = function() {
+
+ var module = 'network';
+
+ esm.reloadBlock_spin(module);
+
+ $.get('libs/'+module+'.php', function(data) {
+
+ var $box = $('.box#esm-'+module+' .box-content tbody');
+ $box.empty();
+
+ for (var line in data)
+ {
+ var html = '';
+ html += '';
+ html += ''+data[line].interface+' | ';
+ html += ''+data[line].ip+' | ';
+ html += ''+data[line].receive+' | ';
+ html += ''+data[line].transmit+' | ';
+ html += '
';
+
+ $box.append(html);
+ }
+
+ esm.reloadBlock_spin(module);
+
+ }, 'json');
+
+}
+
+
+esm.getPing = function() {
+
+ var module = 'ping';
+
+ esm.reloadBlock_spin(module);
+
+ $.get('libs/'+module+'.php', function(data) {
+
+ var $box = $('.box#esm-'+module+' .box-content tbody');
+ $box.empty();
+
+ for (var line in data)
+ {
+ var html = '';
+ html += '';
+ html += ''+data[line].host+' | ';
+ html += ''+data[line].ping+' ms | ';
+ html += '
';
+
+ $box.append(html);
+ }
+
+ esm.reloadBlock_spin(module);
+
+ }, 'json');
+
+}
+
+
+esm.getServices = function() {
+
+ var module = 'services';
+
+ esm.reloadBlock_spin(module);
+
+ $.get('libs/'+module+'.php', function(data) {
+
+ var $box = $('.box#esm-'+module+' .box-content tbody');
+ $box.empty();
+
+ for (var line in data)
+ {
+ var label_color = data[line].status == 1 ? 'success' : 'error';
+ var label_status = data[line].status == 1 ? 'online' : 'offline';
+
+ var html = '';
+ html += '';
+ html += ''+label_status+' | ';
+ html += ''+data[line].name+' | ';
+ html += ''+data[line].port+' | ';
+ html += '
';
+
+ $box.append(html);
+ }
+
+ esm.reloadBlock_spin(module);
+
+ }, 'json');
+
+}
+
+esm.getServer = function() {
+
+ var module = 'server';
+
+ esm.reloadBlock_spin(module);
+
+ $.get('libs/'+module+'.php', function(data) {
+
+ var $box = $('.box#esm-'+module+' .box-content tbody');
+ $box.empty();
+
+ for (var line in data)
+ {
+ var label_color = data[line].status == 1 ? 'success' : 'error';
+ var label_status = data[line].status == 1 ? 'online' : 'offline';
+
+ var html = '';
+ html += '';
+ html += ''+label_status+' | ';
+ html += ''+data[line].name+' | ';
+ html += ''+data[line].port+' | ';
+ html += '
';
+
+ $box.append(html);
+ }
+
+ esm.reloadBlock_spin(module);
+
+ }, 'json');
+
+}
+
+
+esm.getAll = function() {
+ esm.getSystem();
+ esm.getCpu();
+ esm.getLoad_average();
+ esm.getMemory();
+ esm.getSwap();
+ esm.getDisk();
+ esm.getLast_login();
+ esm.getNetwork();
+ esm.getPing();
+ esm.getServices();
+ esm.getServer();
+}
+
+esm.reloadBlock = function(block) {
+
+ esm.mapping[block]();
+
+}
+
+esm.reloadBlock_spin = function(block) {
+
+ var $module = $('.box#esm-'+block);
+
+ $('.reload', $module).toggleClass('spin disabled');
+ $('.box-content', $module).toggleClass('faded');
+
+}
+
+esm.insertDatas = function($box, block, datas) {
+ for (var item in datas)
+ {
+ $('#'+block+'-'+item, $box).html(datas[item]);
+ }
+}
+
+esm.reconfigureGauge = function($gauge, newValue) {
+ // Change colors according to the percentages
+ var colors = { green : '#7BCE6C', orange : '#E3BB80', red : '#CF6B6B' };
+ var color = '';
+
+ if (newValue <= 50)
+ color = colors.green;
+ else if (newValue <= 75)
+ color = colors.orange;
+ else
+ color = colors.red;
+
+ $gauge.trigger('configure', {
+ 'fgColor': color,
+ 'inputColor': color,
+ 'fontWeight': 'normal',
+ 'format' : function (value) {
+ return value + '%';
+ }
+ });
+
+ // Change gauge value
+ $gauge.val(newValue).trigger('change');
+}
+
+
+esm.mapping = {
+ all: esm.getAll,
+ system: esm.getSystem,
+ load_average: esm.getLoad_average,
+ cpu: esm.getCpu,
+ memory: esm.getMemory,
+ swap: esm.getSwap,
+ disk: esm.getDisk,
+ last_login: esm.getLast_login,
+ network: esm.getNetwork,
+ ping: esm.getPing,
+ services: esm.getServices,
+ server: esm.getServer
+};
\ No newline at end of file