diff --git a/.jscsrc b/.jscsrc new file mode 100644 index 00000000..bc1fcea6 --- /dev/null +++ b/.jscsrc @@ -0,0 +1,8 @@ +{ + "preset": "google", + "validateIndentation": "\t", + "validateQuoteMarks": "\"", + "maximumLineLength": 250, + "requireCurlyBraces": [], + "requireCamelCaseOrUpperCaseIdentifiers": false +} \ No newline at end of file diff --git a/js/class.js b/js/class.js index 726e1abc..69b0cb09 100644 --- a/js/class.js +++ b/js/class.js @@ -4,66 +4,66 @@ */ // Inspired by base2 and Prototype -(function(){ - var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; +(function() { + var initializing = false; + var fnTest = /xyz/.test(function() {xyz;}) ? /\b_super\b/ : /.*/; - // The base Class implementation (does nothing) - this.Class = function(){}; + // The base Class implementation (does nothing) + this.Class = function() {}; - // Create a new Class that inherits from this class - Class.extend = function(prop) { - var _super = this.prototype; + // Create a new Class that inherits from this class + Class.extend = function(prop) { + var _super = this.prototype; - // Instantiate a base class (but only create the instance, - // don't run the init constructor) - initializing = true; - var prototype = new this(); - initializing = false; + // Instantiate a base class (but only create the instance, + // don't run the init constructor) + initializing = true; + var prototype = new this(); + initializing = false; - // Copy the properties over onto the new prototype - for (var name in prop) { - // Check if we're overwriting an existing function - prototype[name] = typeof prop[name] == "function" && - typeof _super[name] == "function" && fnTest.test(prop[name]) ? - (function(name, fn){ - return function() { - var tmp = this._super; + // Copy the properties over onto the new prototype + for (var name in prop) { + // Check if we're overwriting an existing function + prototype[name] = typeof prop[name] == "function" && + typeof _super[name] == "function" && fnTest.test(prop[name]) ? + (function(name, fn) { + return function() { + var tmp = this._super; - // Add a new ._super() method that is the same method - // but on the super-class - this._super = _super[name]; + // Add a new ._super() method that is the same method + // but on the super-class + this._super = _super[name]; - // The method only need to be bound temporarily, so we - // remove it when we're done executing - var ret = fn.apply(this, arguments); - this._super = tmp; + // The method only need to be bound temporarily, so we + // remove it when we're done executing + var ret = fn.apply(this, arguments); + this._super = tmp; - return ret; - }; + return ret; + }; })(name, prop[name]) : prop[name]; - } + } - // The dummy class constructor - function Class() { - // All construction is actually done in the init method - if ( !initializing && this.init ) - this.init.apply(this, arguments); - } + // The dummy class constructor + function Class() { + // All construction is actually done in the init method + if (!initializing && this.init) + this.init.apply(this, arguments); + } - // Populate our constructed prototype object - Class.prototype = prototype; + // Populate our constructed prototype object + Class.prototype = prototype; - // Enforce the constructor to be what we expect - Class.prototype.constructor = Class; + // Enforce the constructor to be what we expect + Class.prototype.constructor = Class; - // And make this class extendable - Class.extend = arguments.callee; + // And make this class extendable + Class.extend = arguments.callee; - return Class; - }; + return Class; + }; })(); - /*************** DO NOT EDIT THE LINE BELOW ***************/ -if (typeof module !== 'undefined') {module.exports = Class;} +if (typeof module !== "undefined") {module.exports = Class;} diff --git a/js/defaults.js b/js/defaults.js index 52df69fe..61156ab1 100644 --- a/js/defaults.js +++ b/js/defaults.js @@ -10,49 +10,48 @@ var defaults = { port: 8080, - language: 'en', + language: "en", timeFormat: 24, modules: [ { - module: 'helloworld', - position: 'upper_third', + module: "helloworld", + position: "upper_third", config: { - text: 'Magic Mirror V2', - classes: 'large thin' + text: "Magic Mirror V2", + classes: "large thin" } }, { - module: 'helloworld', - position: 'middle_center', + module: "helloworld", + position: "middle_center", config: { - text: 'Please create a config file.' + text: "Please create a config file." } }, { - module: 'helloworld', - position: 'middle_center', + module: "helloworld", + position: "middle_center", config: { - text: 'See README for more information.', - classes: 'small dimmed' + text: "See README for more information.", + classes: "small dimmed" } }, { - module: 'helloworld', - position: 'bottom_bar', + module: "helloworld", + position: "bottom_bar", config: { - text: 'www.michaelteeuw.nl', - classes: 'xsmall dimmed' + text: "www.michaelteeuw.nl", + classes: "xsmall dimmed" } }, ], paths: { - modules: 'modules', - vendor: 'vendor' + modules: "modules", + vendor: "vendor" }, }; - /*************** DO NOT EDIT THE LINE BELOW ***************/ -if (typeof module !== 'undefined') {module.exports = defaults;} +if (typeof module !== "undefined") {module.exports = defaults;} diff --git a/js/electron.js b/js/electron.js index 0e1f1532..883a35bc 100755 --- a/js/electron.js +++ b/js/electron.js @@ -1,13 +1,13 @@ -'use strict'; +"use strict"; //load modules -const walk = require('walk'); -const fs = require('fs'); -const Server = require(__dirname + '/server.js'); -const spawn = require('child_process').spawn; -const electron = require('electron'); -const defaultModules = require(__dirname + '/../modules/default/defaultmodules.js'); -const path = require('path'); +const walk = require("walk"); +const fs = require("fs"); +const Server = require(__dirname + "/server.js"); +const spawn = require("child_process").spawn; +const electron = require("electron"); +const defaultModules = require(__dirname + "/../modules/default/defaultmodules.js"); +const path = require("path"); // Config var config = {}; @@ -22,19 +22,19 @@ var nodeHelpers = []; // be closed automatically when the JavaScript object is garbage collected. let mainWindow; -function createWindow () { +function createWindow() { // Create the browser window. mainWindow = new BrowserWindow({width: 800, height: 600, fullscreen: true, autoHideMenuBar: true, webPreferences: {nodeIntegration: false}}); // and load the index.html of the app. //mainWindow.loadURL('file://' + __dirname + '../../index.html'); - mainWindow.loadURL('http://localhost:' + config.port); + mainWindow.loadURL("http://localhost:" + config.port); // Open the DevTools. //mainWindow.webContents.openDevTools(); // Emitted when the window is closed. - mainWindow.on('closed', function() { + mainWindow.on("closed", function() { // Dereference the window object, usually you would store windows // in an array if your app supports multi windows, this is the time // when you should delete the corresponding element. @@ -42,36 +42,36 @@ function createWindow () { }); } -function loadConfig (callback) { +function loadConfig(callback) { console.log("Loading config ..."); - var defaults = require(__dirname + '/defaults.js'); - var configFilename = __dirname + '/../config/config.js'; + var defaults = require(__dirname + "/defaults.js"); + var configFilename = __dirname + "/../config/config.js"; try { - fs.accessSync(configFilename, fs.R_OK); - var c = require(configFilename); + fs.accessSync(configFilename, fs.R_OK); + var c = require(configFilename); var config = Object.assign(defaults, c); callback(config); } catch (e) { - callback(defaults); + callback(defaults); } } function loadModule(module) { - var elements = module.split('/'); + var elements = module.split("/"); var moduleName = elements[elements.length - 1]; - var moduleFolder = __dirname + '/../modules/' + module; + var moduleFolder = __dirname + "/../modules/" + module; if (defaultModules.indexOf(moduleName) !== -1) { - moduleFolder = __dirname + '/../modules/default/' + module; + moduleFolder = __dirname + "/../modules/default/" + module; } - var helperPath = moduleFolder + '/node_helper.js'; + var helperPath = moduleFolder + "/node_helper.js"; var loadModule = true; try { - fs.accessSync(helperPath, fs.R_OK); + fs.accessSync(helperPath, fs.R_OK); } catch (e) { loadModule = false; console.log("No helper found for module: " + moduleName + "."); @@ -80,9 +80,9 @@ function loadModule(module) { if (loadModule) { var Module = require(helperPath); var m = new Module(); - m.setName(moduleName); - m.setPath(path.resolve(moduleFolder)); - nodeHelpers.push(m); + m.setName(moduleName); + m.setPath(path.resolve(moduleFolder)); + nodeHelpers.push(m); } } @@ -111,7 +111,7 @@ loadConfig(function(c) { loadModules(modules); var server = new Server(config, function(app, io) { - console.log('Server started ...'); + console.log("Server started ..."); for (var h in nodeHelpers) { var nodeHelper = nodeHelpers[h]; @@ -120,28 +120,28 @@ loadConfig(function(c) { nodeHelper.start(); } - console.log('Sockets connected & modules started ...'); + console.log("Sockets connected & modules started ..."); }); }); // This method will be called when Electron has finished // initialization and is ready to create browser windows. -app.on('ready', function() { - console.log('Launching application.'); +app.on("ready", function() { + console.log("Launching application."); createWindow(); }); // Quit when all windows are closed. -app.on('window-all-closed', function () { +app.on("window-all-closed", function() { // On OS X it is common for applications and their menu bar // to stay active until the user quits explicitly with Cmd + Q - if (process.platform !== 'darwin') { + if (process.platform !== "darwin") { app.quit(); } }); -app.on('activate', function () { +app.on("activate", function() { // On OS X it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. if (mainWindow === null) { diff --git a/js/loader.js b/js/loader.js index 4f650ac6..2553a187 100644 --- a/js/loader.js +++ b/js/loader.js @@ -2,7 +2,6 @@ /* jshint unused:false */ /* jshint -W061 */ - /* Magic Mirror * Module and File loaders. * @@ -18,10 +17,8 @@ var Loader = (function() { var loadedFiles = []; var moduleObjects = []; - /* Private Methods */ - /* loadModules() * Loops thru all modules and requests load for every module. */ @@ -79,33 +76,31 @@ var Loader = (function() { var moduleData = modules[m]; var module = moduleData.module; - var elements = module.split('/'); + var elements = module.split("/"); var moduleName = elements[elements.length - 1]; - var moduleFolder = config.paths.modules + '/' + module; + var moduleFolder = config.paths.modules + "/" + module; if (defaultModules.indexOf(moduleName) !== -1) { - moduleFolder = config.paths.modules + '/default/' + module; + moduleFolder = config.paths.modules + "/default/" + module; } moduleFiles.push({ index: m, - identifier: 'module_' + m + '_' + module, + identifier: "module_" + m + "_" + module, name: moduleName, - path: moduleFolder + '/' , - file: moduleName + '.js', + path: moduleFolder + "/" , + file: moduleName + ".js", position: moduleData.position, header: moduleData.header, config: moduleData.config, - classes: (typeof moduleData.classes !== 'undefined') ? moduleData.classes + ' ' + module : module + classes: (typeof moduleData.classes !== "undefined") ? moduleData.classes + " " + module : module }); - } return moduleFiles; }; - /* loadModule(module) * Load modules via ajax request and create module objects. * @@ -113,7 +108,7 @@ var Loader = (function() { * argument module object - Information about the module we want to load. */ var loadModule = function(module, callback) { - var url = module.path + '/' + module.file; + var url = module.path + "/" + module.file; var afterLoad = function() { var moduleObject = Module.create(module.name); @@ -141,21 +136,20 @@ var Loader = (function() { * argument callback function - Function called when done. */ var bootstrapModule = function(module, mObj, callback) { - Log.info('Bootstrapping module: ' + module.name); + Log.info("Bootstrapping module: " + module.name); mObj.setData(module); mObj.loadScripts(function() { - Log.log('Scripts loaded for: ' + module.name); - mObj.loadStyles(function(){ - Log.log('Styles loaded for: ' + module.name); + Log.log("Scripts loaded for: " + module.name); + mObj.loadStyles(function() { + Log.log("Styles loaded for: " + module.name); moduleObjects.push(mObj); callback(); }); }); - }; /* loadFile(fileName) @@ -170,27 +164,27 @@ var Loader = (function() { switch (extension.toLowerCase()) { case "js": - Log.log('Load script: ' + fileName); + Log.log("Load script: " + fileName); var script = document.createElement("script"); script.type = "text/javascript"; script.src = fileName; script.onload = function() { - if (typeof callback === 'function') {callback();} + if (typeof callback === "function") {callback();} }; document.getElementsByTagName("body")[0].appendChild(script); break; case "css": - Log.log('Load stylesheet: ' + fileName); + Log.log("Load stylesheet: " + fileName); var stylesheet = document.createElement("link"); stylesheet.rel = "stylesheet"; stylesheet.type = "text/css"; stylesheet.href = fileName; stylesheet.onload = function() { - if (typeof callback === 'function') {callback();} + if (typeof callback === "function") {callback();} }; document.getElementsByTagName("head")[0].appendChild(stylesheet); @@ -220,12 +214,12 @@ var Loader = (function() { loadFile: function(fileName, module, callback) { if (loadedFiles.indexOf(fileName.toLowerCase()) !== -1) { - Log.log('File already loaded: ' + fileName); + Log.log("File already loaded: " + fileName); callback(); return; } - if (fileName.indexOf('http://') === 0 || fileName.indexOf('https://') === 0 || fileName.indexOf('/') !== -1) { + if (fileName.indexOf("http://") === 0 || fileName.indexOf("https://") === 0 || fileName.indexOf("/") !== -1) { // This is an absolute or relative path. // Load it and then return. loadedFiles.push(fileName.toLowerCase()); @@ -237,7 +231,7 @@ var Loader = (function() { // This file is available in the vendor folder. // Load it from this vendor folder. loadedFiles.push(fileName.toLowerCase()); - loadFile(config.paths.vendor+'/'+vendor[fileName], callback); + loadFile(config.paths.vendor + "/" + vendor[fileName], callback); return; } diff --git a/js/logger.js b/js/logger.js index 1389c5f9..994fe534 100644 --- a/js/logger.js +++ b/js/logger.js @@ -8,11 +8,9 @@ * MIT Licensed. */ - // This logger is very simple, but needs to be extended. // This system can eventually be used to push the log messages to an external target. - var Log = (function() { return { info: function(message) { diff --git a/js/main.js b/js/main.js index a45c56b1..9fb5415c 100644 --- a/js/main.js +++ b/js/main.js @@ -22,7 +22,7 @@ var MM = (function() { for (var m in modules) { var module = modules[m]; - if (typeof module.data.position === 'string') { + if (typeof module.data.position === "string") { var wrapper = selectWrapper(module.data.position); @@ -30,14 +30,14 @@ var MM = (function() { dom.id = module.identifier; dom.className = module.name; - if (typeof module.data.classes === 'string') { - dom.className = 'module '+ dom.className + ' ' + module.data.classes; + if (typeof module.data.classes === "string") { + dom.className = "module " + dom.className + " " + module.data.classes; } dom.opacity = 0; wrapper.appendChild(dom); - if (typeof module.data.header !== 'undefined' && module.data.header !== '') { + if (typeof module.data.header !== "undefined" && module.data.header !== "") { var moduleHeader = document.createElement("header"); moduleHeader.innerHTML = module.data.header; dom.appendChild(moduleHeader); @@ -51,7 +51,7 @@ var MM = (function() { } } - sendNotification('DOM_OBJECTS_CREATED'); + sendNotification("DOM_OBJECTS_CREATED"); }; /* selectWrapper(position) @@ -60,10 +60,10 @@ var MM = (function() { * argument position string - The name of the position. */ var selectWrapper = function(position) { - var classes = position.replace('_',' '); + var classes = position.replace("_"," "); var parentWrapper = document.getElementsByClassName(classes); if (parentWrapper.length > 0) { - var wrapper = parentWrapper[0].getElementsByClassName('container'); + var wrapper = parentWrapper[0].getElementsByClassName("container"); if (wrapper.length > 0) { return wrapper[0]; } @@ -117,7 +117,6 @@ var MM = (function() { } }; - /* moduleNeedsUpdate(module, newContent) * Check if the content has changed. * @@ -128,9 +127,9 @@ var MM = (function() { */ var moduleNeedsUpdate = function(module, newContent) { var moduleWrapper = document.getElementById(module.identifier); - var contentWrapper = moduleWrapper.getElementsByClassName('module-content')[0]; + var contentWrapper = moduleWrapper.getElementsByClassName("module-content")[0]; - var tempWrapper = document.createElement('div'); + var tempWrapper = document.createElement("div"); tempWrapper.appendChild(newContent); return tempWrapper.innerHTML !== contentWrapper.innerHTML; @@ -144,7 +143,7 @@ var MM = (function() { */ var updateModuleContent = function(module, content) { var moduleWrapper = document.getElementById(module.identifier); - var contentWrapper = moduleWrapper.getElementsByClassName('module-content')[0]; + var contentWrapper = moduleWrapper.getElementsByClassName("module-content")[0]; contentWrapper.innerHTML = null; contentWrapper.appendChild(content); @@ -168,9 +167,9 @@ var MM = (function() { // since it's fade out anyway, we can see it lay above or // below other modules. This works way better than adjusting // the .display property. - moduleWrapper.style.position = 'absolute'; + moduleWrapper.style.position = "absolute"; - if (typeof callback === 'function') { callback(); } + if (typeof callback === "function") { callback(); } }, speed); } }; @@ -187,11 +186,11 @@ var MM = (function() { if (moduleWrapper !== null) { moduleWrapper.style.transition = "opacity " + speed / 1000 + "s"; // Restore the postition. See hideModule() for more info. - moduleWrapper.style.position = 'static'; + moduleWrapper.style.position = "static"; moduleWrapper.style.opacity = 1; setTimeout(function() { - if (typeof callback === 'function') { callback(); } + if (typeof callback === "function") { callback(); } }, speed); } @@ -201,9 +200,9 @@ var MM = (function() { * Loads the core config and combines it with de system defaults. */ var loadConfig = function() { - if (typeof config === 'undefined') { + if (typeof config === "undefined") { config = defaults; - Log.error('Config file is missing! Please create a config file.'); + Log.error("Config file is missing! Please create a config file."); return; } @@ -228,13 +227,13 @@ var MM = (function() { var newModules = []; var searchClasses = className; - if (typeof className === 'string') { - searchClasses = className.split(' '); + if (typeof className === "string") { + searchClasses = className.split(" "); } for (var m in modules) { var module = modules[m]; - var classes = module.data.classes.toLowerCase().split(' '); + var classes = module.data.classes.toLowerCase().split(" "); for (var c in searchClasses) { var searchClass = searchClasses[c]; @@ -259,13 +258,13 @@ var MM = (function() { var newModules = []; var searchClasses = className; - if (typeof className === 'string') { - searchClasses = className.split(' '); + if (typeof className === "string") { + searchClasses = className.split(" "); } for (var m in modules) { var module = modules[m]; - var classes = module.data.classes.toLowerCase().split(' '); + var classes = module.data.classes.toLowerCase().split(" "); var foundClass = false; for (var c in searchClasses) { var searchClass = searchClasses[c]; @@ -316,13 +315,12 @@ var MM = (function() { } }; - if (typeof modules.withClass === 'undefined') { Object.defineProperty(modules, 'withClass', {value: withClass, enumerable: false}); } - if (typeof modules.exceptWithClass === 'undefined') { Object.defineProperty(modules, 'exceptWithClass', {value: exceptWithClass, enumerable: false}); } - if (typeof modules.exceptModule === 'undefined') { Object.defineProperty(modules, 'exceptModule', {value: exceptModule, enumerable: false}); } - if (typeof modules.enumerate === 'undefined') { Object.defineProperty(modules, 'enumerate', {value: enumerate, enumerable: false}); } + if (typeof modules.withClass === "undefined") { Object.defineProperty(modules, "withClass", {value: withClass, enumerable: false}); } + if (typeof modules.exceptWithClass === "undefined") { Object.defineProperty(modules, "exceptWithClass", {value: exceptWithClass, enumerable: false}); } + if (typeof modules.exceptModule === "undefined") { Object.defineProperty(modules, "exceptModule", {value: exceptModule, enumerable: false}); } + if (typeof modules.enumerate === "undefined") { Object.defineProperty(modules, "enumerate", {value: enumerate, enumerable: false}); } }; - return { /* Public Methods */ @@ -330,7 +328,7 @@ var MM = (function() { * Main init method. */ init: function() { - Log.info('Initializing MagicMirror.'); + Log.info("Initializing MagicMirror."); loadConfig(); Loader.loadModules(); }, @@ -347,8 +345,8 @@ var MM = (function() { modules[module.data.index] = module; } - Log.info('All modules started!'); - sendNotification('ALL_MODULES_STARTED'); + Log.info("All modules started!"); + sendNotification("ALL_MODULES_STARTED"); createDomObjects(); }, @@ -362,17 +360,17 @@ var MM = (function() { */ sendNotification: function(notification, payload, sender) { if (arguments.length < 3) { - Log.error('sendNotification: Missing arguments.'); + Log.error("sendNotification: Missing arguments."); return; } - if (typeof notification !== 'string') { - Log.error('sendNotification: Notification should be a string.'); + if (typeof notification !== "string") { + Log.error("sendNotification: Notification should be a string."); return; } if (!(sender instanceof Module)) { - Log.error('sendNotification: Sender should be a module.'); + Log.error("sendNotification: Sender should be a module."); return; } @@ -388,7 +386,7 @@ var MM = (function() { */ updateDom: function(module, speed) { if (!(module instanceof Module)) { - Log.error('updateDom: Sender should be a module.'); + Log.error("updateDom: Sender should be a module."); return; } diff --git a/js/module.js b/js/module.js index 2c2c18d2..ab0f8ad3 100644 --- a/js/module.js +++ b/js/module.js @@ -28,7 +28,7 @@ var Module = Class.extend({ * Is called when the module is started. */ start: function() { - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); }, /* getScripts() @@ -82,9 +82,9 @@ var Module = Class.extend({ */ notificationReceived: function(notification, payload, sender) { if (sender) { - Log.log(this.name + ' received a module notification: ' + notification + ' from sender: ' + sender.name); + Log.log(this.name + " received a module notification: " + notification + " from sender: " + sender.name); } else { - Log.log(this.name + ' received a system notification: ' + notification); + Log.log(this.name + " received a system notification: " + notification); } }, @@ -95,10 +95,9 @@ var Module = Class.extend({ * argument payload mixed - The payload of the notification. */ socketNotificationReceived: function(notification, payload) { - Log.log(this.name + ' received a socket notification: ' + notification + ' - Payload: ' + payload); + Log.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload); }, - /********************************************* * The methods below don't need subclassing. * *********************************************/ @@ -131,7 +130,7 @@ var Module = Class.extend({ * It also registers the notification callback. */ socket: function() { - if (typeof this._socket === 'undefined') { + if (typeof this._socket === "undefined") { this._socket = this._socket = new MMSocket(this.name); } @@ -151,7 +150,7 @@ var Module = Class.extend({ * return string - File path. */ file: function(file) { - return this.data.path + '/' + file; + return this.data.path + "/" + file; }, /* loadStyles() @@ -258,16 +257,16 @@ Module.create = function(name) { //Define the clone method for later use. function cloneObject(obj) { - if (obj === null || typeof obj !== 'object') { - return obj; - } + if (obj === null || typeof obj !== "object") { + return obj; + } - var temp = obj.constructor(); // give temp the original obj's constructor - for (var key in obj) { - temp[key] = cloneObject(obj[key]); - } + var temp = obj.constructor(); // give temp the original obj's constructor + for (var key in obj) { + temp[key] = cloneObject(obj[key]); + } - return temp; + return temp; } var moduleDefinition = Module.definitions[name]; @@ -281,6 +280,6 @@ Module.create = function(name) { }; Module.register = function(name, moduleDefinition) { - Log.log('Module registered: ' + name); + Log.log("Module registered: " + name); Module.definitions[name] = moduleDefinition; }; diff --git a/js/server.js b/js/server.js index bdf9738a..b5eab036 100644 --- a/js/server.js +++ b/js/server.js @@ -5,28 +5,28 @@ * MIT Licensed. */ -var express = require('express'); -var app = require('express')(); -var server = require('http').Server(app); -var io = require('socket.io')(server); -var path = require('path'); +var express = require("express"); +var app = require("express")(); +var server = require("http").Server(app); +var io = require("socket.io")(server); +var path = require("path"); var Server = function(config, callback) { console.log("Starting server op port " + config.port + " ... "); server.listen(config.port); - app.use('/js', express.static(__dirname)); - app.use('/config', express.static(path.resolve(__dirname + '/../config'))); - app.use('/css', express.static(path.resolve(__dirname + '/../css'))); - app.use('/fonts', express.static(path.resolve(__dirname + '/../fonts'))); - app.use('/modules', express.static(path.resolve(__dirname + '/../modules'))); - app.use('/vendor', express.static(path.resolve(__dirname + '/../vendor'))); + app.use("/js", express.static(__dirname)); + app.use("/config", express.static(path.resolve(__dirname + "/../config"))); + app.use("/css", express.static(path.resolve(__dirname + "/../css"))); + app.use("/fonts", express.static(path.resolve(__dirname + "/../fonts"))); + app.use("/modules", express.static(path.resolve(__dirname + "/../modules"))); + app.use("/vendor", express.static(path.resolve(__dirname + "/../vendor"))); - app.get('/', function (req, res) { - res.sendFile(path.resolve(__dirname + '/../index.html')); + app.get("/", function(req, res) { + res.sendFile(path.resolve(__dirname + "/../index.html")); }); - if (typeof callback === 'function') { + if (typeof callback === "function") { callback(app, io); } }; diff --git a/js/socket.js b/js/socket.js index 8f3abaf1..c62c24da 100644 --- a/js/socket.js +++ b/js/socket.js @@ -11,22 +11,21 @@ var MMSocket = function(moduleName) { var self = this; - if (typeof moduleName !== 'string') { - throw new Error('Please set the module name for the MMSocket.'); + if (typeof moduleName !== "string") { + throw new Error("Please set the module name for the MMSocket."); } self.moduleName = moduleName; - - self.socket = io('http://localhost:8080'); - self.socket.on('notification', function (data) { + self.socket = io("http://localhost:8080"); + self.socket.on("notification", function(data) { MM.sendNotification(data.notification, data.payload, Socket); }); return { sendMessage: function(notification, payload, sender) { - Log.log('Send socket message: ' + notification); - self.socket.emit('notification', { + Log.log("Send socket message: " + notification); + self.socket.emit("notification", { notification: notification, sender: sender, payload: payload diff --git a/js/socketclient.js b/js/socketclient.js index c834679a..f7d1843a 100644 --- a/js/socketclient.js +++ b/js/socketclient.js @@ -1,40 +1,39 @@ var MMSocket = function(moduleName) { var self = this; - if (typeof moduleName !== 'string') { - throw new Error('Please set the module name for the MMSocket.'); + if (typeof moduleName !== "string") { + throw new Error("Please set the module name for the MMSocket."); } self.moduleName = moduleName; // Private Methods - socket = io.connect('/' + self.moduleName); + socket = io.connect("/" + self.moduleName); var notificationCallback = function() {}; var onevent = socket.onevent; - socket.onevent = function (packet) { + socket.onevent = function(packet) { var args = packet.data || []; - onevent.call (this, packet); // original call + onevent.call(this, packet); // original call packet.data = ["*"].concat(args); onevent.call(this, packet); // additional call to catch-all }; // register catch all. - socket.on('*', function (notification, payload) { - if (notification !== '*') { + socket.on("*", function(notification, payload) { + if (notification !== "*") { //console.log('Received notification: ' + notification +', payload: ' + payload); notificationCallback(notification, payload); } }); - // Public Methods this.setNotificationCallback = function(callback) { notificationCallback = callback; }; this.sendNotification = function(notification, payload) { - if (typeof payload === 'undefined') { + if (typeof payload === "undefined") { payload = {}; } socket.emit(notification, payload); diff --git a/modules/default/alert/alert.js b/modules/default/alert/alert.js index 7ba47a86..561eeebf 100644 --- a/modules/default/alert/alert.js +++ b/modules/default/alert/alert.js @@ -7,12 +7,12 @@ * MIT Licensed. */ -Module.register('alert',{ +Module.register("alert",{ defaults: { // scale|slide|genie|jelly|flip|bouncyflip|exploader effect: "slide", // scale|slide|genie|jelly|flip|bouncyflip|exploader - alert_effect:"jelly", + alert_effect: "jelly", //time a notification is displayed in seconds display_time: 3500, //Position @@ -21,100 +21,97 @@ Module.register('alert',{ welcome_message: "Welcome, start was successfull!" }, getScripts: function() { - return ["classie.js", "modernizr.custom.js", 'notificationFx.js']; + return ["classie.js", "modernizr.custom.js", "notificationFx.js"]; }, getStyles: function() { - return ['ns-default.css']; + return ["ns-default.css"]; }, - show_notification: function (message) { - if (this.config.effect == "slide"){this.config.effect=this.config.effect + "-" + this.config.position} - message = "" + message.title + "
" + message.message + "" + show_notification: function(message) { + if (this.config.effect == "slide") {this.config.effect = this.config.effect + "-" + this.config.position;} + message = "" + message.title + "
" + message.message + ""; new NotificationFx({ - message : message, - layout : "growl", - effect : this.config.effect, + message: message, + layout: "growl", + effect: this.config.effect, ttl: this.config.display_time }).show(); }, - show_alert: function (params, sender) { - var self = this + show_alert: function(params, sender) { + var self = this; //Set standard params if not provided by module - if (typeof params.timer === 'undefined') { params.timer = null; } - if (typeof params.imageHeight === 'undefined') { params.imageHeight = "80px"; } - if (typeof params.imageUrl === 'undefined') { + if (typeof params.timer === "undefined") { params.timer = null; } + if (typeof params.imageHeight === "undefined") { params.imageHeight = "80px"; } + if (typeof params.imageUrl === "undefined") { params.imageUrl = null; - image = "" - } - else { - image = "
" + image = ""; + } else { + image = "
"; } //Create overlay var overlay = document.createElement("div"); - overlay.id = "overlay" - overlay.innerHTML += '
'; + overlay.id = "overlay"; + overlay.innerHTML += "
"; document.body.insertBefore(overlay, document.body.firstChild); - + //If module already has an open alert close it - if (this.alerts[sender.name]){ - this.hide_alert(sender) + if (this.alerts[sender.name]) { + this.hide_alert(sender); } - - message = "" + params.title + "
" + params.message + "" + + message = "" + params.title + "
" + params.message + ""; //Store alert in this.alerts this.alerts[sender.name] = new NotificationFx({ - message : image + message, - effect : this.config.alert_effect, + message: image + message, + effect: this.config.alert_effect, ttl: params.timer, al_no: "ns-alert" }); //Show alert - this.alerts[sender.name].show() + this.alerts[sender.name].show(); //Add timer to dismiss alert and overlay if (params.timer) { - setTimeout( function() { - self.hide_alert(sender) - }, params.timer ); + setTimeout(function() { + self.hide_alert(sender); + }, params.timer); } - + }, - hide_alert: function (sender) { + hide_alert: function(sender) { //Dismiss alert and remove from this.alerts - this.alerts[sender.name].dismiss() - this.alerts[sender.name] = null + this.alerts[sender.name].dismiss(); + this.alerts[sender.name] = null; //Remove overlay var overlay = document.getElementById("overlay"); overlay.parentNode.removeChild(overlay); }, - setPosition: function (pos) { + setPosition: function(pos) { //Add css to body depending on the set position for notifications - var sheet = document.createElement('style') - if (pos == "center"){sheet.innerHTML = ".ns-box {margin-left: auto; margin-right: auto;text-align: center;}";} - if (pos == "right"){sheet.innerHTML = ".ns-box {margin-left: auto;text-align: right;}";} - if (pos == "left"){sheet.innerHTML = ".ns-box {margin-right: auto;text-align: left;}";} + var sheet = document.createElement("style"); + if (pos == "center") {sheet.innerHTML = ".ns-box {margin-left: auto; margin-right: auto;text-align: center;}";} + if (pos == "right") {sheet.innerHTML = ".ns-box {margin-left: auto;text-align: right;}";} + if (pos == "left") {sheet.innerHTML = ".ns-box {margin-right: auto;text-align: left;}";} document.body.appendChild(sheet); - + }, notificationReceived: function(notification, payload, sender) { - if (notification === 'SHOW_ALERT') { - if (typeof payload.type === 'undefined') { payload.type = "alert"; } - if (payload.type == "alert"){ - this.show_alert(payload, sender) + if (notification === "SHOW_ALERT") { + if (typeof payload.type === "undefined") { payload.type = "alert"; } + if (payload.type == "alert") { + this.show_alert(payload, sender); + } else if (payload.type = "notification") { + this.show_notification(payload); } - else if (payload.type = "notification"){ - this.show_notification(payload) - } - } - else if (notification === 'HIDE_ALERT') { - this.hide_alert(sender) + } else if (notification === "HIDE_ALERT") { + this.hide_alert(sender); } }, start: function() { - this.alerts = {} - this.setPosition(this.config.position) - if (this.config.welcome_message){ - this.show_notification({title: "MagicMirror Notification", message: this.config.welcome_message}) + this.alerts = {}; + this.setPosition(this.config.position); + if (this.config.welcome_message) { + this.show_notification({title: "MagicMirror Notification", message: this.config.welcome_message}); } - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); } -}); \ No newline at end of file +}); diff --git a/modules/default/alert/classie.js b/modules/default/alert/classie.js index a9675548..4a096f1e 100755 --- a/modules/default/alert/classie.js +++ b/modules/default/alert/classie.js @@ -1,80 +1,79 @@ /*! * classie - class helper functions * from bonzo https://github.com/ded/bonzo - * + * * classie.has( elem, 'my-class' ) -> true/false * classie.add( elem, 'my-new-class' ) * classie.remove( elem, 'my-unwanted-class' ) * classie.toggle( elem, 'my-class' ) */ - +// jscs:disable /*jshint browser: true, strict: true, undef: true */ /*global define: false */ -( function( window ) { +(function(window) { -'use strict'; +"use strict"; // class helper functions from bonzo https://github.com/ded/bonzo -function classReg( className ) { - return new RegExp("(^|\\s+)" + className + "(\\s+|$)"); +function classReg(className) { + return new RegExp("(^|\\s+)" + className + "(\\s+|$)"); } // classList support for class management // altho to be fair, the api sucks because it won't accept multiple classes at once var hasClass, addClass, removeClass; -if ( 'classList' in document.documentElement ) { - hasClass = function( elem, c ) { - return elem.classList.contains( c ); - }; - addClass = function( elem, c ) { - elem.classList.add( c ); - }; - removeClass = function( elem, c ) { - elem.classList.remove( c ); - }; -} -else { - hasClass = function( elem, c ) { - return classReg( c ).test( elem.className ); - }; - addClass = function( elem, c ) { - if ( !hasClass( elem, c ) ) { - elem.className = elem.className + ' ' + c; - } - }; - removeClass = function( elem, c ) { - elem.className = elem.className.replace( classReg( c ), ' ' ); - }; +if ("classList" in document.documentElement) { + hasClass = function(elem, c) { + return elem.classList.contains(c); + }; + addClass = function(elem, c) { + elem.classList.add(c); + }; + removeClass = function(elem, c) { + elem.classList.remove(c); + }; +} else { + hasClass = function(elem, c) { + return classReg(c).test(elem.className); + }; + addClass = function(elem, c) { + if (!hasClass(elem, c)) { + elem.className = elem.className + " " + c; + } + }; + removeClass = function(elem, c) { + elem.className = elem.className.replace(classReg(c), " "); + }; } -function toggleClass( elem, c ) { - var fn = hasClass( elem, c ) ? removeClass : addClass; - fn( elem, c ); +function toggleClass(elem, c) { + var fn = hasClass(elem, c) ? removeClass : addClass; + fn(elem, c); } var classie = { - // full names - hasClass: hasClass, - addClass: addClass, - removeClass: removeClass, - toggleClass: toggleClass, - // short names - has: hasClass, - add: addClass, - remove: removeClass, - toggle: toggleClass + // full names + hasClass: hasClass, + addClass: addClass, + removeClass: removeClass, + toggleClass: toggleClass, + // short names + has: hasClass, + add: addClass, + remove: removeClass, + toggle: toggleClass }; // transport -if ( typeof define === 'function' && define.amd ) { - // AMD - define( classie ); +if (typeof define === "function" && define.amd) { + // AMD + define(classie); } else { - // browser global - window.classie = classie; + // browser global + window.classie = classie; } -})( window ); +})(window); diff --git a/modules/default/alert/modernizr.custom.js b/modules/default/alert/modernizr.custom.js index adf2df7e..3d33a8be 100755 --- a/modules/default/alert/modernizr.custom.js +++ b/modules/default/alert/modernizr.custom.js @@ -1,4 +1,5 @@ /* Modernizr 2.8.3 (Custom Build) | MIT & BSD * Build: http://modernizr.com/download/#-cssanimations-shiv-cssclasses-prefixed-testprop-testallprops-domprefixes-load */ -;window.Modernizr=function(a,b,c){function x(a){j.cssText=a}function y(a,b){return x(prefixes.join(a+";")+(b||""))}function z(a,b){return typeof a===b}function A(a,b){return!!~(""+a).indexOf(b)}function B(a,b){for(var d in a){var e=a[d];if(!A(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function C(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:z(f,"function")?f.bind(d||b):f}return!1}function D(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+n.join(d+" ")+d).split(" ");return z(b,"string")||z(b,"undefined")?B(e,b):(e=(a+" "+o.join(d+" ")+d).split(" "),C(e,b,c))}var d="2.8.3",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m="Webkit Moz O ms",n=m.split(" "),o=m.toLowerCase().split(" "),p={},q={},r={},s=[],t=s.slice,u,v={}.hasOwnProperty,w;!z(v,"undefined")&&!z(v.call,"undefined")?w=function(a,b){return v.call(a,b)}:w=function(a,b){return b in a&&z(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=t.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(t.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(t.call(arguments)))};return e}),p.cssanimations=function(){return D("animationName")};for(var E in p)w(p,E)&&(u=E.toLowerCase(),e[u]=p[E](),s.push((e[u]?"":"no-")+u));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)w(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},x(""),i=k=null,function(a,b){function l(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function m(){var a=s.elements;return typeof a=="string"?a.split(" "):a}function n(a){var b=j[a[h]];return b||(b={},i++,a[h]=i,j[i]=b),b}function o(a,c,d){c||(c=b);if(k)return c.createElement(a);d||(d=n(c));var g;return d.cache[a]?g=d.cache[a].cloneNode():f.test(a)?g=(d.cache[a]=d.createElem(a)).cloneNode():g=d.createElem(a),g.canHaveChildren&&!e.test(a)&&!g.tagUrn?d.frag.appendChild(g):g}function p(a,c){a||(a=b);if(k)return a.createDocumentFragment();c=c||n(a);var d=c.frag.cloneNode(),e=0,f=m(),g=f.length;for(;e",g="hidden"in a,k=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){g=!0,k=!0}})();var s={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:c,shivCSS:d.shivCSS!==!1,supportsUnknownElements:k,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:r,createElement:o,createDocumentFragment:p};a.html5=s,r(b)}(this,b),e._version=d,e._domPrefixes=o,e._cssomPrefixes=n,e.testProp=function(a){return B([a])},e.testAllProps=D,e.prefixed=function(a,b,c){return b?D(a,b,c):D(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+s.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f",d.insertBefore(c.lastChild,d.firstChild);}function m() {var a = s.elements;return typeof a == "string" ? a.split(" ") : a;}function n(a) {var b = j[a[h]];return b || (b = {},i++,a[h] = i,j[i] = b),b;}function o(a, c, d) {c || (c = b);if (k)return c.createElement(a);d || (d = n(c));var g;return d.cache[a] ? g = d.cache[a].cloneNode() : f.test(a) ? g = (d.cache[a] = d.createElem(a)).cloneNode() : g = d.createElem(a),g.canHaveChildren && !e.test(a) && !g.tagUrn ? d.frag.appendChild(g) : g;}function p(a, c) {a || (a = b);if (k)return a.createDocumentFragment();c = c || n(a);var d = c.frag.cloneNode(),e = 0,f = m(),g = f.length;for (; e < g; e++)d.createElement(f[e]);return d;}function q(a, b) {b.cache || (b.cache = {},b.createElem = a.createElement,b.createFrag = a.createDocumentFragment,b.frag = b.createFrag()),a.createElement = function(c) {return s.shivMethods ? o(c,a,b) : b.createElem(c);},a.createDocumentFragment = Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(" + m().join().replace(/[\w\-]+/g,function(a) {return b.createElem(a),b.frag.createElement(a),"c(\"" + a + "\")";}) + ");return n}")(s,b.frag);}function r(a) {a || (a = b);var c = n(a);return s.shivCSS && !g && !c.hasCSS && (c.hasCSS = !!l(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),k || q(a,c),a;}var c = "3.7.0",d = a.html5 || {},e = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,f = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g,h = "_html5shiv",i = 0,j = {},k;(function() {try {var a = b.createElement("a");a.innerHTML = "",g = "hidden"in a,k = a.childNodes.length == 1 || function() {b.createElement("a");var a = b.createDocumentFragment();return typeof a.cloneNode == "undefined" || typeof a.createDocumentFragment == "undefined" || typeof a.createElement == "undefined";}();}catch (c) {g = !0,k = !0;}})();var s = {elements: d.elements || "abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version: c,shivCSS: d.shivCSS !== !1,supportsUnknownElements: k,shivMethods: d.shivMethods !== !1,type: "default",shivDocument: r,createElement: o,createDocumentFragment: p};a.html5 = s,r(b);}(this,b),e._version = d,e._domPrefixes = o,e._cssomPrefixes = n,e.testProp = function(a) {return B([a]);},e.testAllProps = D,e.prefixed = function(a, b, c) {return b ? D(a,b,c) : D(a,"pfx");},g.className = g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2") + (f ? " js " + s.join(" ") : ""),e;}(this,this.document),function(a, b, c) {function d(a) {return "[object Function]" == o.call(a);}function e(a) {return "string" == typeof a;}function f() {}function g(a) {return !a || "loaded" == a || "complete" == a || "uninitialized" == a;}function h() {var a = p.shift();q = 1,a ? a.t ? m(function() {("c" == a.t ? B.injectCss : B.injectJs)(a.s,0,a.a,a.x,a.e,1);},0) : (a(),h()) : q = 0;}function i(a, c, d, e, f, i, j) {function k(b) {if (!o && g(l.readyState) && (u.r = o = 1,!q && h(),l.onload = l.onreadystatechange = null,b)) {"img" != a && m(function() {t.removeChild(l);},50);for (var d in y[c])y[c].hasOwnProperty(d) && y[c][d].onload();}}var j = j || B.errorTimeout,l = b.createElement(a),o = 0,r = 0,u = {t: d,s: c,e: f,a: i,x: j};1 === y[c] && (r = 1,y[c] = []),"object" == a ? l.data = c : (l.src = c,l.type = a),l.width = l.height = "0",l.onerror = l.onload = l.onreadystatechange = function() {k.call(this,r);},p.splice(e,0,u),"img" != a && (r || 2 === y[c] ? (t.insertBefore(l,s ? null : n),m(k,j)) : y[c].push(l));}function j(a, b, c, d, f) {return q = 0,b = b || "j",e(a) ? i("c" == b ? v : u,a,b,this.i++,c,d,f) : (p.splice(this.i++,0,a),1 == p.length && h()),this;}function k() {var a = B;return a.loader = {load: j,i: 0},a;}var l = b.documentElement,m = a.setTimeout,n = b.getElementsByTagName("script")[0],o = {}.toString,p = [],q = 0,r = "MozAppearance"in l.style,s = r && !!b.createRange().compareNode,t = s ? l : n.parentNode,l = a.opera && "[object Opera]" == o.call(a.opera),l = !!b.attachEvent && !l,u = r ? "object" : l ? "script" : "img",v = l ? "script" : u,w = Array.isArray || function(a) {return "[object Array]" == o.call(a);},x = [],y = {},z = {timeout: function(a, b) {return b.length && (a.timeout = b[0]),a;}},A,B;B = function(a) {function b(a) {var a = a.split("!"),b = x.length,c = a.pop(),d = a.length,c = {url: c,origUrl: c,prefixes: a},e,f,g;for (f = 0; f < d; f++)g = a[f].split("="),(e = z[g.shift()]) && (c = e(c,g));for (f = 0; f < b; f++)c = x[f](c);return c;}function g(a, e, f, g, h) {var i = b(a),j = i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass || (e && (e = d(e) ? e : e[a] || e[g] || e[a.split("/").pop().split("?")[0]]),i.instead ? i.instead(a,e,f,g,h) : (y[i.url] ? i.noexec = !0 : y[i.url] = 1,f.load(i.url,i.forceCSS || !i.forceJS && "css" == i.url.split(".").pop().split("?").shift() ? "c" : c,i.noexec,i.attrs,i.timeout),(d(e) || d(j)) && f.load(function() {k(),e && e(i.origUrl,h,g),j && j(i.origUrl,h,g),y[i.url] = 2;})));}function h(a, b) {function c(a, c) {if (a) {if (e(a))c || (j = function() {var a = [].slice.call(arguments);k.apply(this,a),l();}),g(a,j,b,0,h);else if (Object(a) === a)for (n in m = function() {var b = 0,c;for (c in a)a.hasOwnProperty(c) && b++;return b;}(),a)a.hasOwnProperty(n) && (!c && !--m && (d(j) ? j = function() {var a = [].slice.call(arguments);k.apply(this,a),l();} : j[n] = function(a) {return function() {var b = [].slice.call(arguments);a && a.apply(this,b),l();};}(k[n])),g(a[n],j,b,n,h));}else !c && l();}var h = !!a.test,i = a.load || a.both,j = a.callback || f,k = j,l = a.complete || f,m,n;c(h ? a.yep : a.nope,!!i),i && c(i);}var i,j,l = this.yepnope.loader;if (e(a))g(a,0,l,0);else if (w(a))for (i = 0; i < a.length; i++)j = a[i],e(j) ? g(j,0,l,0) : w(j) ? B(j) : Object(j) === j && h(j,l);else Object(a) === a && h(a,l);},B.addPrefix = function(a, b) {z[a] = b;},B.addFilter = function(a) {x.push(a);},B.errorTimeout = 1e4,null == b.readyState && b.addEventListener && (b.readyState = "loading",b.addEventListener("DOMContentLoaded",A = function() {b.removeEventListener("DOMContentLoaded",A,0),b.readyState = "complete";},0)),a.yepnope = k(),a.yepnope.executeStack = h,a.yepnope.injectJs = function(a, c, d, e, i, j) {var k = b.createElement("script"),l,o,e = e || B.errorTimeout;k.src = a;for (o in d)k.setAttribute(o,d[o]);c = j ? h : c || f,k.onreadystatechange = k.onload = function() {!l && g(k.readyState) && (l = 1,c(),k.onload = k.onreadystatechange = null);},m(function() {l || (l = 1,c(1));},e),i ? k.onload() : n.parentNode.insertBefore(k,n);},a.yepnope.injectCss = function(a, c, d, e, g, i) {var e = b.createElement("link"),j,c = i ? h : c || f;e.href = a,e.rel = "stylesheet",e.type = "text/css";for (j in d)e.setAttribute(j,d[j]);g || (n.parentNode.insertBefore(e,n),m(c,0));};}(this,document),Modernizr.load = function() {yepnope.apply(window,[].slice.call(arguments,0));}; diff --git a/modules/default/alert/notificationFx.js b/modules/default/alert/notificationFx.js index 9f7c7207..b74c9d14 100644 --- a/modules/default/alert/notificationFx.js +++ b/modules/default/alert/notificationFx.js @@ -4,31 +4,32 @@ * * Licensed under the MIT license. * http://www.opensource.org/licenses/mit-license.php - * + * * Copyright 2014, Codrops * http://www.codrops.com */ -;( function( window ) { - - 'use strict'; +// jscs:disable +;(function(window) { + + "use strict"; var docElem = window.document.documentElement, - support = { animations : Modernizr.cssanimations }, + support = {animations: Modernizr.cssanimations}, animEndEventNames = { - 'WebkitAnimation' : 'webkitAnimationEnd', - 'OAnimation' : 'oAnimationEnd', - 'msAnimation' : 'MSAnimationEnd', - 'animation' : 'animationend' + "WebkitAnimation": "webkitAnimationEnd", + "OAnimation": "oAnimationEnd", + "msAnimation": "MSAnimationEnd", + "animation": "animationend" }, // animation end event name - animEndEventName = animEndEventNames[ Modernizr.prefixed( 'animation' ) ]; - + animEndEventName = animEndEventNames[ Modernizr.prefixed("animation") ]; + /** * extend obj function */ - function extend( a, b ) { - for( var key in b ) { - if( b.hasOwnProperty( key ) ) { + function extend(a, b) { + for (var key in b) { + if (b.hasOwnProperty(key)) { a[key] = b[key]; } } @@ -38,9 +39,9 @@ /** * NotificationFx function */ - function NotificationFx( options ) { - this.options = extend( {}, this.options ); - extend( this.options, options ); + function NotificationFx(options) { + this.options = extend({}, this.options); + extend(this.options, options); this._init(); } @@ -50,28 +51,28 @@ NotificationFx.prototype.options = { // element to which the notification will be appended // defaults to the document.body - wrapper : document.body, + wrapper: document.body, // the message - message : 'yo!', + message: "yo!", // layout type: growl|attached|bar|other - layout : 'growl', + layout: "growl", // effects for the specified layout: // for growl layout: scale|slide|genie|jelly // for attached layout: flip|bouncyflip // for other layout: boxspinner|cornerexpand|loadingcircle|thumbslider // ... - effect : 'slide', + effect: "slide", // notice, warning, error, success // will add class ns-type-warning, ns-type-error or ns-type-success - type : 'notice', - // if the user doesn´t close the notification then we remove it + type: "notice", + // if the user doesn´t close the notification then we remove it // after the following time - ttl : 6000, + ttl: 6000, al_no: "ns-box", // callbacks - onClose : function() { return false; }, - onOpen : function() { return false; } - } + onClose: function() { return false; }, + onOpen: function() { return false; } + }; /** * init function @@ -79,29 +80,29 @@ */ NotificationFx.prototype._init = function() { // create HTML structure - this.ntf = document.createElement( 'div' ); - this.ntf.className = this.options.al_no + ' ns-' + this.options.layout + ' ns-effect-' + this.options.effect + ' ns-type-' + this.options.type; - var strinner = '
'; + this.ntf = document.createElement("div"); + this.ntf.className = this.options.al_no + " ns-" + this.options.layout + " ns-effect-" + this.options.effect + " ns-type-" + this.options.type; + var strinner = "
"; strinner += this.options.message; - strinner += '
'; + strinner += "
"; this.ntf.innerHTML = strinner; // append to body or the element specified in options.wrapper - this.options.wrapper.insertBefore( this.ntf, this.options.wrapper.nextSibling ); + this.options.wrapper.insertBefore(this.ntf, this.options.wrapper.nextSibling); // dismiss after [options.ttl]ms var self = this; - if (this.options.ttl){ - this.dismissttl = setTimeout( function() { - if( self.active ) { + if (this.options.ttl) { + this.dismissttl = setTimeout(function() { + if (self.active) { self.dismiss(); } - }, this.options.ttl ); + }, this.options.ttl); } // init events this._initEvents(); - } + }; /** * init events @@ -109,18 +110,18 @@ NotificationFx.prototype._initEvents = function() { var self = this; // dismiss notification by tapping on it if someone has a touchscreen - this.ntf.querySelector( '.ns-box-inner' ).addEventListener( 'click', function() { self.dismiss(); } ); - } + this.ntf.querySelector(".ns-box-inner").addEventListener("click", function() { self.dismiss(); }); + }; /** * show the notification */ NotificationFx.prototype.show = function() { this.active = true; - classie.remove( this.ntf, 'ns-hide' ); - classie.add( this.ntf, 'ns-show' ); + classie.remove(this.ntf, "ns-hide"); + classie.add(this.ntf, "ns-show"); this.options.onOpen(); - } + }; /** * dismiss the notification @@ -128,35 +129,34 @@ NotificationFx.prototype.dismiss = function() { var self = this; this.active = false; - clearTimeout( this.dismissttl ); - classie.remove( this.ntf, 'ns-show' ); - setTimeout( function() { - classie.add( self.ntf, 'ns-hide' ); - + clearTimeout(this.dismissttl); + classie.remove(this.ntf, "ns-show"); + setTimeout(function() { + classie.add(self.ntf, "ns-hide"); + // callback self.options.onClose(); - }, 25 ); + }, 25); // after animation ends remove ntf from the DOM - var onEndAnimationFn = function( ev ) { - if( support.animations ) { - if( ev.target !== self.ntf ) return false; - this.removeEventListener( animEndEventName, onEndAnimationFn ); + var onEndAnimationFn = function(ev) { + if (support.animations) { + if (ev.target !== self.ntf) return false; + this.removeEventListener(animEndEventName, onEndAnimationFn); } - self.options.wrapper.removeChild( this ); + self.options.wrapper.removeChild(this); }; - if( support.animations ) { - this.ntf.addEventListener( animEndEventName, onEndAnimationFn ); - } - else { + if (support.animations) { + this.ntf.addEventListener(animEndEventName, onEndAnimationFn); + } else { onEndAnimationFn(); } - } + }; /** * add to global namespace */ window.NotificationFx = NotificationFx; -} )( window ); \ No newline at end of file +})(window); diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index a9c54022..253ea708 100644 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -7,55 +7,55 @@ * MIT Licensed. */ -Module.register('calendar',{ +Module.register("calendar",{ // Define module defaults defaults: { maximumEntries: 10, // Total Maximum Entries maximumNumberOfDays: 365, displaySymbol: true, - defaultSymbol: 'calendar', // Fontawsome Symbol see http://fontawesome.io/cheatsheet/ + defaultSymbol: "calendar", // Fontawsome Symbol see http://fontawesome.io/cheatsheet/ maxTitleLength: 25, fetchInterval: 5 * 60 * 1000, // Update every 5 minutes. animationSpeed: 2000, fade: true, fadePoint: 0.25, // Start on 1/4th of the list. - calendars: [ + calendars: [ { - symbol: 'calendar', - url: 'http://www.calendarlabs.com/templates/ical/US-Holidays.ics', + symbol: "calendar", + url: "http://www.calendarlabs.com/templates/ical/US-Holidays.ics", }, ], titleReplace: { - 'De verjaardag van ' : '' + "De verjaardag van ": "" }, - loadingText: 'Loading events …', - emptyCalendarText: 'No upcoming events.', + loadingText: "Loading events …", + emptyCalendarText: "No upcoming events.", // TODO: It would be nice if there is a way to get this from the Moment.js locale. - todayText: 'Today' + todayText: "Today" }, // Define required scripts. getStyles: function() { - return ['calendar.css', 'font-awesome.css']; + return ["calendar.css", "font-awesome.css"]; }, // Define required scripts. getScripts: function() { - return ['moment.js']; + return ["moment.js"]; }, // Override start method. start: function() { - Log.log('Starting module: ' + this.name); + Log.log("Starting module: " + this.name); // Set locale. moment.locale(config.language); for (var c in this.config.calendars) { var calendar = this.config.calendars[c]; - calendar.url = calendar.url.replace('webcal://', 'http://'); + calendar.url = calendar.url.replace("webcal://", "http://"); this.addCalendar(calendar.url); } @@ -65,17 +65,17 @@ Module.register('calendar',{ // Override socket notification handler. socketNotificationReceived: function(notification, payload) { - if (notification === 'CALENDAR_EVENTS') { + if (notification === "CALENDAR_EVENTS") { if (this.hasCalendarURL(payload.url)) { this.calendarData[payload.url] = payload.events; this.loaded = true; } - } else if(notification === 'FETCH_ERROR') { - Log.error('Calendar Error. Could not fetch calendar: ' + payload.url); - } else if(notification === 'INCORRECT_URL') { - Log.error('Calendar Error. Incorrect url: ' + payload.url); + } else if (notification === "FETCH_ERROR") { + Log.error("Calendar Error. Could not fetch calendar: " + payload.url); + } else if (notification === "INCORRECT_URL") { + Log.error("Calendar Error. Incorrect url: " + payload.url); } else { - Log.log('Calendar received an unknown socket notification: '+notification); + Log.log("Calendar received an unknown socket notification: " + notification); } this.updateDom(this.config.animationSpeed); @@ -115,7 +115,7 @@ Module.register('calendar',{ eventWrapper.appendChild(titleWrapper); var timeWrapper = document.createElement("td"); - timeWrapper.innerHTML = (event.today) ? this.config.todayText : moment(event.startDate,'x').fromNow(); + timeWrapper.innerHTML = (event.today) ? this.config.todayText : moment(event.startDate,"x").fromNow(); // timeWrapper.innerHTML = moment(event.startDate,'x').format('lll'); timeWrapper.className = "time light"; eventWrapper.appendChild(timeWrapper); @@ -164,7 +164,7 @@ Module.register('calendar',{ */ createEventList: function() { var events = []; - var today = moment().startOf('day'); + var today = moment().startOf("day"); for (var c in this.calendarData) { var calendar = this.calendarData[c]; for (var e in calendar) { @@ -175,7 +175,7 @@ Module.register('calendar',{ } } - events.sort(function(a,b) { + events.sort(function(a, b) { return a.startDate - b.startDate; }); @@ -188,7 +188,7 @@ Module.register('calendar',{ * argument url sting - Url to add. */ addCalendar: function(url) { - this.sendSocketNotification('ADD_CALENDAR', { + this.sendSocketNotification("ADD_CALENDAR", { url: url, maximumEntries: this.config.maximumEntries, maximumNumberOfDays: this.config.maximumNumberOfDays, @@ -206,7 +206,7 @@ Module.register('calendar',{ symbolForUrl: function(url) { for (var c in this.config.calendars) { var calendar = this.config.calendars[c]; - if (calendar.url === url && typeof calendar.symbol === 'string') { + if (calendar.url === url && typeof calendar.symbol === "string") { return calendar.symbol; } } diff --git a/modules/default/calendar/node_helper.js b/modules/default/calendar/node_helper.js index 215f60ee..d6a366e0 100644 --- a/modules/default/calendar/node_helper.js +++ b/modules/default/calendar/node_helper.js @@ -5,10 +5,10 @@ * MIT Licensed. */ -var NodeHelper = require('node_helper'); -var ical = require('ical'); -var moment = require('moment'); -var validUrl = require('valid-url'); +var NodeHelper = require("node_helper"); +var ical = require("ical"); +var moment = require("moment"); +var validUrl = require("valid-url"); var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumberOfDays) { var self = this; @@ -27,7 +27,6 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe clearTimeout(reloadTimer); reloadTimer = null; - ical.fromURL(url, {}, function(err, data) { if (err) { fetchFailedCallback(self, err); @@ -38,66 +37,65 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe //console.log(data); newEvents = []; - var limitFunction = function (date, i){return i < maximumEntries;}; + var limitFunction = function(date, i) {return i < maximumEntries;}; for (var e in data) { var event = data[e]; var now = new Date(); - var today = moment().startOf('day'); + var today = moment().startOf("day"); //console.log(event); - // FIXME: + // FIXME: // Ugly fix to solve the facebook birthday issue. // Otherwise, the recurring events only show the birthday for next year. var isFacebookBirthday = false; - if (typeof event.uid !== 'undefined') { - if (event.uid.indexOf('@facebook.com') !== -1) { + if (typeof event.uid !== "undefined") { + if (event.uid.indexOf("@facebook.com") !== -1) { isFacebookBirthday = true; } } - if (event.type === 'VEVENT') { - var startDate = (event.start.length === 8) ? moment(event.start, 'YYYYMMDD') : moment(new Date(event.start)); + if (event.type === "VEVENT") { + var startDate = (event.start.length === 8) ? moment(event.start, "YYYYMMDD") : moment(new Date(event.start)); if (event.start.length === 8) { - startDate = startDate.startOf('day'); + startDate = startDate.startOf("day"); } - if (typeof event.rrule != 'undefined' && !isFacebookBirthday) { + if (typeof event.rrule != "undefined" && !isFacebookBirthday) { var rule = event.rrule; // Check if the timeset is set to this current time. // If so, the RRULE line does not contain any BYHOUR, BYMINUTE, BYSECOND params. // This causes the times of the recurring event to be incorrect. // By adjusting the timeset property, this issue is solved. - if (rule.timeset[0].hour == now.getHours(), rule.timeset[0].minute == now.getMinutes(), rule.timeset[0].second == now.getSeconds()) { - rule.timeset[0].hour = startDate.format('H'); - rule.timeset[0].minute = startDate.format('m'); - rule.timeset[0].second = startDate.format('s'); + rule.timeset[0].hour = startDate.format("H"); + rule.timeset[0].minute = startDate.format("m"); + rule.timeset[0].second = startDate.format("s"); } - var dates = rule.between(today, today.add(maximumNumberOfDays, 'days') , true, limitFunction); + var dates = rule.between(today, today.add(maximumNumberOfDays, "days") , true, limitFunction); console.log(dates); for (var d in dates) { startDate = moment(new Date(dates[d])); newEvents.push({ - title: (typeof event.summary.val !== 'undefined') ? event.summary.val : event.summary, - startDate: startDate.format('x'), + title: (typeof event.summary.val !== "undefined") ? event.summary.val : event.summary, + startDate: startDate.format("x"), fullDayEvent: (event.start.length === 8) - + }); } } else { // Single event. - if (startDate >= today && startDate <= today.add(maximumNumberOfDays, 'days')) { + if (startDate >= today && startDate <= today.add(maximumNumberOfDays, "days")) { newEvents.push({ - title: (typeof event.summary.val !== 'undefined') ? event.summary.val : event.summary, - startDate: startDate.format('x'), + title: (typeof event.summary.val !== "undefined") ? event.summary.val : event.summary, + startDate: startDate.format("x"), fullDayEvent: (event.start.length === 8) }); } @@ -105,7 +103,7 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe } } - newEvents.sort(function(a,b) { + newEvents.sort(function(a, b) { return a.startDate - b.startDate; }); @@ -190,14 +188,13 @@ module.exports = NodeHelper.create({ this.fetchers = []; - console.log('Starting node helper for: ' + this.name); - + console.log("Starting node helper for: " + this.name); }, // Override socketNotificationReceived method. socketNotificationReceived: function(notification, payload) { - if (notification === 'ADD_CALENDAR') { + if (notification === "ADD_CALENDAR") { //console.log('ADD_CALENDAR: '); this.createFetcher(payload.url, payload.fetchInterval, payload.maximumEntries, payload.maximumNumberOfDays); } @@ -214,28 +211,28 @@ module.exports = NodeHelper.create({ createFetcher: function(url, fetchInterval, maximumEntries, maximumNumberOfDays) { var self = this; - if (!validUrl.isUri(url)){ - self.sendSocketNotification('INCORRECT_URL', {url:url}); + if (!validUrl.isUri(url)) { + self.sendSocketNotification("INCORRECT_URL", {url: url}); return; } var fetcher; - if (typeof self.fetchers[url] === 'undefined') { - console.log('Create new calendar fetcher for url: ' + url + ' - Interval: ' + fetchInterval); + if (typeof self.fetchers[url] === "undefined") { + console.log("Create new calendar fetcher for url: " + url + " - Interval: " + fetchInterval); fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays); fetcher.onReceive(function(fetcher) { //console.log('Broadcast events.'); //console.log(fetcher.events()); - self.sendSocketNotification('CALENDAR_EVENTS', { + self.sendSocketNotification("CALENDAR_EVENTS", { url: fetcher.url(), events: fetcher.events() }); }); fetcher.onError(function(fetcher, error) { - self.sendSocketNotification('FETCH_ERROR', { + self.sendSocketNotification("FETCH_ERROR", { url: fetcher.url(), error: error }); diff --git a/modules/default/clock/clock.js b/modules/default/clock/clock.js index b71f4313..3acdf53d 100644 --- a/modules/default/clock/clock.js +++ b/modules/default/clock/clock.js @@ -7,7 +7,7 @@ * MIT Licensed. */ -Module.register('clock',{ +Module.register("clock",{ // Module config defaults. defaults: { @@ -17,12 +17,12 @@ Module.register('clock',{ // Define required scripts. getScripts: function() { - return ['moment.js']; + return ["moment.js"]; }, // Define start sequence. start: function() { - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); // Schedule update interval. var self = this; @@ -34,7 +34,6 @@ Module.register('clock',{ moment.locale(config.language); }, - // Override dom generator. getDom: function() { // Create wrappers. @@ -49,9 +48,9 @@ Module.register('clock',{ secondsWrapper.className = "dimmed"; // Set content of wrappers. - dateWrapper.innerHTML = moment().format('dddd, LL'); - timeWrapper.innerHTML = moment().format((this.config.timeFormat === 24) ? 'HH:mm' : ('hh:mm')); - secondsWrapper.innerHTML = moment().format('ss'); + dateWrapper.innerHTML = moment().format("dddd, LL"); + timeWrapper.innerHTML = moment().format((this.config.timeFormat === 24) ? "HH:mm" : ("hh:mm")); + secondsWrapper.innerHTML = moment().format("ss"); // Combine wrappers. wrapper.appendChild(dateWrapper); diff --git a/modules/default/compliments/compliments.js b/modules/default/compliments/compliments.js index d018680d..61f9ec5f 100644 --- a/modules/default/compliments/compliments.js +++ b/modules/default/compliments/compliments.js @@ -7,26 +7,26 @@ * MIT Licensed. */ -Module.register('compliments',{ +Module.register("compliments",{ // Module config defaults. defaults: { compliments: { morning: [ - 'Good morning, handsome!', - 'Enjoy your day!', - 'How was your sleep?' - ], - afternoon: [ - 'Hello, beauty!', - 'You look sexy!', - 'Looking good today!' - ], - evening: [ - 'Wow, you look hot!', - 'You look nice!', - 'Hi, sexy!' - ] + "Good morning, handsome!", + "Enjoy your day!", + "How was your sleep?" + ], + afternoon: [ + "Hello, beauty!", + "You look sexy!", + "Looking good today!" + ], + evening: [ + "Wow, you look hot!", + "You look nice!", + "Hi, sexy!" + ] }, updateInterval: 30000, fadeSpeed: 4000 @@ -34,12 +34,12 @@ Module.register('compliments',{ // Define required scripts. getScripts: function() { - return ['moment.js']; + return ["moment.js"]; }, // Define start sequence. start: function() { - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); this.lastComplimentIndex = -1; @@ -50,7 +50,6 @@ Module.register('compliments',{ }, this.config.updateInterval); }, - /* randomIndex(compliments) * Generate a random index for a list of compliments. * @@ -113,7 +112,7 @@ Module.register('compliments',{ var compliment = document.createTextNode(complimentText); var wrapper = document.createElement("div"); - wrapper.className = 'thin xlarge bright'; + wrapper.className = "thin xlarge bright"; wrapper.appendChild(compliment); return wrapper; diff --git a/modules/default/currentweather/currentweather.js b/modules/default/currentweather/currentweather.js index 17b23bce..103a1d78 100644 --- a/modules/default/currentweather/currentweather.js +++ b/modules/default/currentweather/currentweather.js @@ -7,61 +7,60 @@ * MIT Licensed. */ -Module.register('currentweather',{ +Module.register("currentweather",{ // Default module config. defaults: { - location: '', - appid: '', - units: 'metric', - updateInterval: 10 * 60 * 1000, // every 10 minutes - animationSpeed: 1000, - timeFormat: config.timeFormat, + location: "", + appid: "", + units: "metric", + updateInterval: 10 * 60 * 1000, // every 10 minutes + animationSpeed: 1000, + timeFormat: config.timeFormat, lang: config.language, initialLoadDelay: 0, // 0 seconds delay retryDelay: 2500, - apiVersion: '2.5', - apiBase: 'http://api.openweathermap.org/data/', - weatherEndpoint: 'weather', + apiVersion: "2.5", + apiBase: "http://api.openweathermap.org/data/", + weatherEndpoint: "weather", iconTable: { - '01d':'wi-day-sunny', - '02d':'wi-day-cloudy', - '03d':'wi-cloudy', - '04d':'wi-cloudy-windy', - '09d':'wi-showers', - '10d':'wi-rain', - '11d':'wi-thunderstorm', - '13d':'wi-snow', - '50d':'wi-fog', - '01n':'wi-night-clear', - '02n':'wi-night-cloudy', - '03n':'wi-night-cloudy', - '04n':'wi-night-cloudy', - '09n':'wi-night-showers', - '10n':'wi-night-rain', - '11n':'wi-night-thunderstorm', - '13n':'wi-night-snow', - '50n':'wi-night-alt-cloudy-windy' + "01d": "wi-day-sunny", + "02d": "wi-day-cloudy", + "03d": "wi-cloudy", + "04d": "wi-cloudy-windy", + "09d": "wi-showers", + "10d": "wi-rain", + "11d": "wi-thunderstorm", + "13d": "wi-snow", + "50d": "wi-fog", + "01n": "wi-night-clear", + "02n": "wi-night-cloudy", + "03n": "wi-night-cloudy", + "04n": "wi-night-cloudy", + "09n": "wi-night-showers", + "10n": "wi-night-rain", + "11n": "wi-night-thunderstorm", + "13n": "wi-night-snow", + "50n": "wi-night-alt-cloudy-windy" }, }, // Define required scripts. getScripts: function() { - return ['moment.js']; + return ["moment.js"]; }, // Define required scripts. getStyles: function() { - return ['weather-icons.css', 'currentweather.css']; + return ["weather-icons.css", "currentweather.css"]; }, - // Define start sequence. start: function() { - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); // Set locale. moment.locale(config.language); @@ -83,13 +82,13 @@ Module.register('currentweather',{ getDom: function() { var wrapper = document.createElement("div"); - if (this.config.appid === '') { + if (this.config.appid === "") { wrapper.innerHTML = "Please set the correct openweather appid in the config for module: " + this.name + "."; wrapper.className = "dimmed light small"; return wrapper; } - if (this.config.location === '') { + if (this.config.location === "") { wrapper.innerHTML = "Please set the openweather location in the config for module: " + this.name + "."; wrapper.className = "dimmed light small"; return wrapper; @@ -101,7 +100,6 @@ Module.register('currentweather',{ return wrapper; } - var small = document.createElement("div"); small.className = "normal medium"; @@ -134,7 +132,7 @@ Module.register('currentweather',{ var temperature = document.createElement("span"); temperature.className = "bright"; - temperature.innerHTML = " " + this.temperature + '°'; + temperature.innerHTML = " " + this.temperature + "°"; large.appendChild(temperature); wrapper.appendChild(small); @@ -142,36 +140,35 @@ Module.register('currentweather',{ return wrapper; }, - /* updateWeather(compliments) * Requests new data from openweather.org. * Calls processWeather on succesfull response. */ updateWeather: function() { - var url = this.config.apiBase + this.config.apiVersion + '/' + this.config.weatherEndpoint + this.getParams(); + var url = this.config.apiBase + this.config.apiVersion + "/" + this.config.weatherEndpoint + this.getParams(); var self = this; var retry = true; var weatherRequest = new XMLHttpRequest(); weatherRequest.open("GET", url, true); weatherRequest.onreadystatechange = function() { - if(this.readyState === 4) { - if(this.status === 200) { - self.processWeather(JSON.parse(this.response)); - } else if (this.status === 401) { - self.config.appid = ''; - self.updateDom(self.config.animationSpeed); + if (this.readyState === 4) { + if (this.status === 200) { + self.processWeather(JSON.parse(this.response)); + } else if (this.status === 401) { + self.config.appid = ""; + self.updateDom(self.config.animationSpeed); - Log.error(self.name + ": Incorrect APPID."); - retry = false; - } else { - Log.error(self.name + ": Could not load weather."); - } + Log.error(self.name + ": Incorrect APPID."); + retry = false; + } else { + Log.error(self.name + ": Could not load weather."); + } - if (retry) { - self.scheduleUpdate((self.loaded) ? -1 : self.config.retryDelay); + if (retry) { + self.scheduleUpdate((self.loaded) ? -1 : self.config.retryDelay); + } } - } }; weatherRequest.send(); }, @@ -183,10 +180,10 @@ Module.register('currentweather',{ */ getParams: function() { var params = "?"; - params += 'q=' + this.config.location; - params += '&units=' + this.config.units; - params += '&lang=' + this.config.lang; - params += '&APPID=' + this.config.appid; + params += "q=" + this.config.location; + params += "&units=" + this.config.units; + params += "&lang=" + this.config.lang; + params += "&APPID=" + this.config.appid; return params; }, @@ -201,19 +198,16 @@ Module.register('currentweather',{ this.windSpeed = this.ms2Beaufort(this.roundValue(data.wind.speed)); this.weatherType = this.config.iconTable[data.weather[0].icon]; - - - var now = moment().format('x'); - var sunrise = moment(data.sys.sunrise*1000).format('x'); - var sunset = moment(data.sys.sunset*1000).format('x'); - + var now = moment().format("x"); + var sunrise = moment(data.sys.sunrise * 1000).format("x"); + var sunset = moment(data.sys.sunset * 1000).format("x"); if (sunrise < now && sunset > now) { - this.sunriseSunsetTime = moment(data.sys.sunset*1000).format((this.config.timeFormat === 24) ? 'HH:mm' : 'hh:mm a'); - this.sunriseSunsetIcon = 'wi-sunset'; + this.sunriseSunsetTime = moment(data.sys.sunset * 1000).format((this.config.timeFormat === 24) ? "HH:mm" : "hh:mm a"); + this.sunriseSunsetIcon = "wi-sunset"; } else { - this.sunriseSunsetTime = moment(data.sys.sunrise*1000).format((this.config.timeFormat === 24) ? 'HH:mm' : 'hh:mm a'); - this.sunriseSunsetIcon = 'wi-sunrise'; + this.sunriseSunsetTime = moment(data.sys.sunrise * 1000).format((this.config.timeFormat === 24) ? "HH:mm" : "hh:mm a"); + this.sunriseSunsetIcon = "wi-sunrise"; } @@ -228,7 +222,7 @@ Module.register('currentweather',{ */ scheduleUpdate: function(delay) { var nextLoad = this.config.updateInterval; - if (typeof delay !== 'undefined' && delay >= 0) { + if (typeof delay !== "undefined" && delay >= 0) { nextLoad = delay; } @@ -264,7 +258,7 @@ Module.register('currentweather',{ * * return number - Rounded Temperature. */ - roundValue: function (temperature) { + roundValue: function(temperature) { return parseFloat(temperature).toFixed(1); } }); diff --git a/modules/default/defaultmodules.js b/modules/default/defaultmodules.js index 8545dd9a..42e89ee0 100644 --- a/modules/default/defaultmodules.js +++ b/modules/default/defaultmodules.js @@ -8,16 +8,15 @@ // Modules listed below can be loaded without the 'default/' prefix. Omitting the default folder name. var defaultModules = [ - 'alert', - 'calendar', - 'clock', - 'compliments', - 'currentweather', - 'helloworld', - 'newsfeed', - 'weatherforecast' + "alert", + "calendar", + "clock", + "compliments", + "currentweather", + "helloworld", + "newsfeed", + "weatherforecast" ]; - /*************** DO NOT EDIT THE LINE BELOW ***************/ -if (typeof module !== 'undefined') {module.exports = defaultModules;} +if (typeof module !== "undefined") {module.exports = defaultModules;} diff --git a/modules/default/helloworld/helloworld.js b/modules/default/helloworld/helloworld.js index 4dc51eaf..9573299a 100644 --- a/modules/default/helloworld/helloworld.js +++ b/modules/default/helloworld/helloworld.js @@ -7,7 +7,7 @@ * MIT Licensed. */ -Module.register('helloworld',{ +Module.register("helloworld",{ // Default module config. defaults: { diff --git a/modules/default/newsfeed/fetcher.js b/modules/default/newsfeed/fetcher.js index 427d198f..03dea1b3 100644 --- a/modules/default/newsfeed/fetcher.js +++ b/modules/default/newsfeed/fetcher.js @@ -5,7 +5,7 @@ * MIT Licensed. */ -var NewsFetcher = require('./newsfetcher.js'); +var NewsFetcher = require("./newsfetcher.js"); /* Fetcher * Responsible for requesting an update on the set interval and broadcasting the data. diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js index b643a000..65a0c867 100644 --- a/modules/default/newsfeed/newsfeed.js +++ b/modules/default/newsfeed/newsfeed.js @@ -7,26 +7,26 @@ * MIT Licensed. */ -Module.register('newsfeed',{ +Module.register("newsfeed",{ // Default module config. defaults: { - feedUrl: 'http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml', + feedUrl: "http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml", showPublishDate: true, reloadInterval: 5 * 60 * 1000, // every 5 minutes - updateInterval: 7.5 * 1000, - animationSpeed: 2.5 * 1000, - encoding: 'UTF-8' //ISO-8859-1 + updateInterval: 7.5 * 1000, + animationSpeed: 2.5 * 1000, + encoding: "UTF-8" //ISO-8859-1 }, // Define required scripts. getScripts: function() { - return ['moment.js']; + return ["moment.js"]; }, // Define start sequence. start: function() { - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); // Set locale. moment.locale(config.language); @@ -41,7 +41,7 @@ Module.register('newsfeed',{ // Override socket notification handler. socketNotificationReceived: function(notification, payload) { - if (notification === 'NEWS_ITEMS') { + if (notification === "NEWS_ITEMS") { if (payload.url === this.config.feedUrl) { this.newsItems = payload.items; if (!this.loaded) { @@ -73,7 +73,7 @@ Module.register('newsfeed',{ if (this.config.showPublishDate) { var timestamp = document.createElement("div"); timestamp.className = "light small dimmed"; - timestamp.innerHTML = this.capitalizeFirstLetter(moment(new Date(this.newsItems[this.activeItem].pubdate)).fromNow() + ':'); + timestamp.innerHTML = this.capitalizeFirstLetter(moment(new Date(this.newsItems[this.activeItem].pubdate)).fromNow() + ":"); //timestamp.innerHTML = this.config.feedUrl; wrapper.appendChild(timestamp); } @@ -95,8 +95,8 @@ Module.register('newsfeed',{ * Requests new data from news proxy. */ fetchNews: function() { - Log.log('Add news feed to fetcher: ' + this.config.feedUrl); - this.sendSocketNotification('ADD_FEED', { + Log.log("Add news feed to fetcher: " + this.config.feedUrl); + this.sendSocketNotification("ADD_FEED", { url: this.config.feedUrl, reloadInterval: this.config.reloadInterval, encoding: this.config.encoding @@ -125,6 +125,6 @@ Module.register('newsfeed',{ * return string - Capitalized output string. */ capitalizeFirstLetter: function(string) { - return string.charAt(0).toUpperCase() + string.slice(1); + return string.charAt(0).toUpperCase() + string.slice(1); } }); diff --git a/modules/default/newsfeed/newsfetcher.js b/modules/default/newsfeed/newsfetcher.js index 3c0f8f51..50db36f4 100644 --- a/modules/default/newsfeed/newsfetcher.js +++ b/modules/default/newsfeed/newsfetcher.js @@ -5,15 +5,15 @@ * MIT Licensed. */ -var FeedMe = require('feedme'); -var request = require('request'); -var iconv = require('iconv-lite'); +var FeedMe = require("feedme"); +var request = require("request"); +var iconv = require("iconv-lite"); var NewsFetcher = function() { var self = this; - self.successCallback = function(){}; - self.errorCallback = function(){}; + self.successCallback = function() {}; + self.errorCallback = function() {}; self.items = []; @@ -30,22 +30,22 @@ var NewsFetcher = function() { var parser = new FeedMe(); - parser.on('item', function(item) { + parser.on("item", function(item) { self.items.push({ title: item.title, pubdate: item.pubdate, }); }); - parser.on('end', function(item) { + parser.on("end", function(item) { self.successCallback(self.items); }); - parser.on('error', function(error) { + parser.on("error", function(error) { self.errorCallback(error); }); - request({uri:url, encoding:null}).pipe(iconv.decodeStream(encoding)).pipe(parser); + request({uri: url, encoding: null}).pipe(iconv.decodeStream(encoding)).pipe(parser); }; }; diff --git a/modules/default/newsfeed/node_helper.js b/modules/default/newsfeed/node_helper.js index 12328607..4233ead3 100644 --- a/modules/default/newsfeed/node_helper.js +++ b/modules/default/newsfeed/node_helper.js @@ -5,21 +5,21 @@ * MIT Licensed. */ -var NodeHelper = require('node_helper'); -var validUrl = require('valid-url'); -var Fetcher = require('./fetcher.js'); +var NodeHelper = require("node_helper"); +var validUrl = require("valid-url"); +var Fetcher = require("./fetcher.js"); module.exports = NodeHelper.create({ // Subclass start method. start: function() { - console.log('Starting module: ' + this.name); + console.log("Starting module: " + this.name); this.fetchers = []; }, // Subclass socketNotificationReceived received. socketNotificationReceived: function(notification, payload) { - if(notification === 'ADD_FEED') { + if (notification === "ADD_FEED") { this.createFetcher(payload.url, payload.reloadInterval, payload.encoding); } }, @@ -35,25 +35,25 @@ module.exports = NodeHelper.create({ createFetcher: function(url, reloadInterval, encoding) { var self = this; - if (!validUrl.isUri(url)){ - self.sendSocketNotification('INCORRECT_URL', url); + if (!validUrl.isUri(url)) { + self.sendSocketNotification("INCORRECT_URL", url); return; } var fetcher; - if (typeof self.fetchers[url] === 'undefined') { - console.log('Create new news fetcher for url: ' + url + ' - Interval: ' + reloadInterval); + if (typeof self.fetchers[url] === "undefined") { + console.log("Create new news fetcher for url: " + url + " - Interval: " + reloadInterval); fetcher = new Fetcher(url, reloadInterval, encoding); fetcher.onReceive(function(fetcher) { - self.sendSocketNotification('NEWS_ITEMS', { + self.sendSocketNotification("NEWS_ITEMS", { url: fetcher.url(), items: fetcher.items() }); }); fetcher.onError(function(fetcher, error) { - self.sendSocketNotification('FETCH_ERROR', { + self.sendSocketNotification("FETCH_ERROR", { url: fetcher.url(), error: error }); @@ -61,7 +61,7 @@ module.exports = NodeHelper.create({ self.fetchers[url] = fetcher; } else { - console.log('Use exsisting news fetcher for url: ' + url); + console.log("Use exsisting news fetcher for url: " + url); fetcher = self.fetchers[url]; fetcher.setReloadInterval(reloadInterval); fetcher.broadcastItems(); diff --git a/modules/default/weatherforecast/weatherforecast.js b/modules/default/weatherforecast/weatherforecast.js index d000680b..68c0c012 100644 --- a/modules/default/weatherforecast/weatherforecast.js +++ b/modules/default/weatherforecast/weatherforecast.js @@ -7,16 +7,16 @@ * MIT Licensed. */ -Module.register('weatherforecast',{ +Module.register("weatherforecast",{ // Default module config. defaults: { - location: '', - appid: '', - units: 'metric', - updateInterval: 10 * 60 * 1000, // every 10 minutes - animationSpeed: 1000, - timeFormat: config.timeFormat, + location: "", + appid: "", + units: "metric", + updateInterval: 10 * 60 * 1000, // every 10 minutes + animationSpeed: 1000, + timeFormat: config.timeFormat, lang: config.language, fade: true, fadePoint: 0.25, // Start on 1/4th of the list. @@ -24,46 +24,45 @@ Module.register('weatherforecast',{ initialLoadDelay: 2500, // 2.5 seconds delay. This delay is used to keep the OpenWeather API happy. retryDelay: 2500, - apiVersion: '2.5', - apiBase: 'http://api.openweathermap.org/data/', - forecastEndpoint: 'forecast/daily', + apiVersion: "2.5", + apiBase: "http://api.openweathermap.org/data/", + forecastEndpoint: "forecast/daily", iconTable: { - '01d':'wi-day-sunny', - '02d':'wi-day-cloudy', - '03d':'wi-cloudy', - '04d':'wi-cloudy-windy', - '09d':'wi-showers', - '10d':'wi-rain', - '11d':'wi-thunderstorm', - '13d':'wi-snow', - '50d':'wi-fog', - '01n':'wi-night-clear', - '02n':'wi-night-cloudy', - '03n':'wi-night-cloudy', - '04n':'wi-night-cloudy', - '09n':'wi-night-showers', - '10n':'wi-night-rain', - '11n':'wi-night-thunderstorm', - '13n':'wi-night-snow', - '50n':'wi-night-alt-cloudy-windy' + "01d": "wi-day-sunny", + "02d": "wi-day-cloudy", + "03d": "wi-cloudy", + "04d": "wi-cloudy-windy", + "09d": "wi-showers", + "10d": "wi-rain", + "11d": "wi-thunderstorm", + "13d": "wi-snow", + "50d": "wi-fog", + "01n": "wi-night-clear", + "02n": "wi-night-cloudy", + "03n": "wi-night-cloudy", + "04n": "wi-night-cloudy", + "09n": "wi-night-showers", + "10n": "wi-night-rain", + "11n": "wi-night-thunderstorm", + "13n": "wi-night-snow", + "50n": "wi-night-alt-cloudy-windy" }, }, // Define required scripts. getScripts: function() { - return ['moment.js']; + return ["moment.js"]; }, // Define required scripts. getStyles: function() { - return ['weather-icons.css', 'weatherforecast.css']; + return ["weather-icons.css", "weatherforecast.css"]; }, - // Define start sequence. start: function() { - Log.info('Starting module: ' + this.name); + Log.info("Starting module: " + this.name); // Set locale. moment.locale(config.language); @@ -80,13 +79,13 @@ Module.register('weatherforecast',{ getDom: function() { var wrapper = document.createElement("div"); - if (this.config.appid === '') { + if (this.config.appid === "") { wrapper.innerHTML = "Please set the correct openweather appid in the config for module: " + this.name + "."; wrapper.className = "dimmed light small"; return wrapper; } - if (this.config.location === '') { + if (this.config.location === "") { wrapper.innerHTML = "Please set the openweather location in the config for module: " + this.name + "."; wrapper.className = "dimmed light small"; return wrapper; @@ -98,7 +97,6 @@ Module.register('weatherforecast',{ return wrapper; } - var table = document.createElement("table"); table.className = "small"; @@ -109,7 +107,7 @@ Module.register('weatherforecast',{ table.appendChild(row); var dayCell = document.createElement("td"); - dayCell.className = 'day'; + dayCell.className = "day"; dayCell.innerHTML = forecast.day; row.appendChild(dayCell); @@ -123,15 +121,14 @@ Module.register('weatherforecast',{ var maxTempCell = document.createElement("td"); maxTempCell.innerHTML = forecast.maxTemp; - maxTempCell.className = 'align-right bright max-temp'; + maxTempCell.className = "align-right bright max-temp"; row.appendChild(maxTempCell); var minTempCell = document.createElement("td"); minTempCell.innerHTML = forecast.minTemp; - minTempCell.className = 'align-right min-temp'; + minTempCell.className = "align-right min-temp"; row.appendChild(minTempCell); - if (this.config.fade && this.config.fadePoint < 1) { if (this.config.fadePoint < 0) { this.config.fadePoint = 0; @@ -144,45 +141,40 @@ Module.register('weatherforecast',{ } } - - } - - return table; }, - /* updateWeather(compliments) * Requests new data from openweather.org. * Calls processWeather on succesfull response. */ updateWeather: function() { - var url = this.config.apiBase + this.config.apiVersion + '/' + this.config.forecastEndpoint + this.getParams(); + var url = this.config.apiBase + this.config.apiVersion + "/" + this.config.forecastEndpoint + this.getParams(); var self = this; var retry = true; var weatherRequest = new XMLHttpRequest(); weatherRequest.open("GET", url, true); weatherRequest.onreadystatechange = function() { - if(this.readyState === 4) { - if(this.status === 200) { - self.processWeather(JSON.parse(this.response)); - } else if (this.status === 401) { - self.config.appid = ''; - self.updateDom(self.config.animationSpeed); + if (this.readyState === 4) { + if (this.status === 200) { + self.processWeather(JSON.parse(this.response)); + } else if (this.status === 401) { + self.config.appid = ""; + self.updateDom(self.config.animationSpeed); - Log.error(self.name + ": Incorrect APPID."); - retry = false; - } else { - Log.error(self.name + ": Could not load weather."); - } + Log.error(self.name + ": Incorrect APPID."); + retry = false; + } else { + Log.error(self.name + ": Could not load weather."); + } - if (retry) { - self.scheduleUpdate((self.loaded) ? -1 : self.config.retryDelay); + if (retry) { + self.scheduleUpdate((self.loaded) ? -1 : self.config.retryDelay); + } } - } }; weatherRequest.send(); }, @@ -194,10 +186,10 @@ Module.register('weatherforecast',{ */ getParams: function() { var params = "?"; - params += 'q=' + this.config.location; - params += '&units=' + this.config.units; - params += '&lang=' + this.config.lang; - params += '&APPID=' + this.config.appid; + params += "q=" + this.config.location; + params += "&units=" + this.config.units; + params += "&lang=" + this.config.lang; + params += "&APPID=" + this.config.appid; return params; }, @@ -215,7 +207,7 @@ Module.register('weatherforecast',{ var forecast = data.list[i]; this.forecast.push({ - day: moment(forecast.dt, 'X').format('ddd.'), + day: moment(forecast.dt, "X").format("ddd."), icon: this.config.iconTable[forecast.weather[0].icon], maxTemp: this.roundValue(forecast.temp.max), minTemp: this.roundValue(forecast.temp.min) @@ -236,7 +228,7 @@ Module.register('weatherforecast',{ */ scheduleUpdate: function(delay) { var nextLoad = this.config.updateInterval; - if (typeof delay !== 'undefined' && delay >= 0) { + if (typeof delay !== "undefined" && delay >= 0) { nextLoad = delay; } @@ -273,7 +265,7 @@ Module.register('weatherforecast',{ * * return number - Rounded Temperature. */ - roundValue: function (temperature) { + roundValue: function(temperature) { return parseFloat(temperature).toFixed(1); } }); diff --git a/modules/node_modules/node_helper/index.js b/modules/node_modules/node_helper/index.js index a94d00ec..dc57ef36 100644 --- a/modules/node_modules/node_helper/index.js +++ b/modules/node_modules/node_helper/index.js @@ -5,17 +5,17 @@ * MIT Licensed. */ -var Class = require('../../../js/class.js'); -var express = require('express'); -var path = require('path'); +var Class = require("../../../js/class.js"); +var express = require("express"); +var path = require("path"); NodeHelper = Class.extend({ init: function() { - console.log('Initializing new module helper ...'); + console.log("Initializing new module helper ..."); }, start: function() { - console.log('Staring module helper: ' + this.name); + console.log("Staring module helper: " + this.name); }, /* socketNotificationReceived(notification, payload) @@ -25,7 +25,7 @@ NodeHelper = Class.extend({ * argument payload mixed - The payload of the notification. */ socketNotificationReceived: function(notification, payload) { - console.log(this.name + ' received a socket notification: ' + notification + ' - Payload: ' + payload); + console.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload); }, /* setName(name) @@ -56,7 +56,6 @@ NodeHelper = Class.extend({ this.io.of(this.name).emit(notification, payload); }, - /* setExpressApp(app) * Sets the express app object for this module. * This allows you to host files from the created webserver. @@ -66,8 +65,8 @@ NodeHelper = Class.extend({ setExpressApp: function(app) { this.expressApp = app; - var publicPath = this.path + '/public'; - app.use('/' + this.name, express.static(publicPath)); + var publicPath = this.path + "/public"; + app.use("/" + this.name, express.static(publicPath)); }, /* setSocketIO(io) @@ -80,21 +79,21 @@ NodeHelper = Class.extend({ var self = this; self.io = io; - console.log('Connecting socket for: ' + this.name); + console.log("Connecting socket for: " + this.name); var namespace = this.name; - io.of(namespace).on('connection', function (socket) { + io.of(namespace).on("connection", function(socket) { // add a catch all event. var onevent = socket.onevent; - socket.onevent = function (packet) { + socket.onevent = function(packet) { var args = packet.data || []; - onevent.call (this, packet); // original call + onevent.call(this, packet); // original call packet.data = ["*"].concat(args); onevent.call(this, packet); // additional call to catch-all }; // register catch all. - socket.on('*', function (notification, payload) { - if (notification !== '*') + socket.on("*", function(notification, payload) { + if (notification !== "*") //console.log('received message in namespace: ' + namespace); self.socketNotificationReceived(notification, payload); }); @@ -107,4 +106,4 @@ NodeHelper.create = function(moduleDefinition) { return NodeHelper.extend(moduleDefinition); }; -module.exports = NodeHelper; \ No newline at end of file +module.exports = NodeHelper;