diff --git a/src/js/app-config.js b/src/js/app-config.js index 12b45fb..67e591f 100644 --- a/src/js/app-config.js +++ b/src/js/app-config.js @@ -25,4 +25,14 @@ var app; // container for the application namespace workerPath: 'js' }; + /** + * The Template Loader. Used to asynchronously load templates located in separate .html files + */ + app.util.tpl = { + templates: {}, + get: function(name) { + return this.templates[name]; + } + }; + }()); \ No newline at end of file diff --git a/src/js/loader.js b/src/js/loader.js deleted file mode 100644 index d88c6da..0000000 --- a/src/js/loader.js +++ /dev/null @@ -1,71 +0,0 @@ -(function() { - 'use strict'; - - /** - * The Template Loader. Used to asynchronously load templates located in separate .html files - */ - app.util.tpl = { - - // Hash of preloaded templates for the app - templates: {}, - - // Recursively pre-load all the templates for the app. - loadTemplates: function(names, callback) { - var that = this; - - var loadTemplate = function(index) { - var name = names[index]; - console.log('Loading template: ' + name); - $.get('tpl/' + name + '.html', function(data) { - that.templates[name] = data; - index++; - if (index < names.length) { - loadTemplate(index); - } else { - callback(); - } - }); - }; - - loadTemplate(0); - }, - - // Get template by name from hash of preloaded templates - get: function(name) { - return this.templates[name]; - } - - }; - - /** - * Load templates and start the application - */ - $(document).ready(function() { - // are we running in native app or in browser? - var isBrowser = false; - if (document.URL.indexOf("http") === 0) { - isBrowser = true; - } - - if (!isBrowser) { - document.addEventListener("deviceready", onDeviceReady, false); - } else { - onDeviceReady(); - } - - function onDeviceReady() { - console.log('Starting in Browser: ' + isBrowser); - app.util.tpl.loadTemplates([ - 'login', - 'compose', - 'folderlist', - 'messagelist', - 'messagelistitem', - 'read'], function() { - var router = new app.Router(); - Backbone.history.start(); - }); - } - }); - -}()); \ No newline at end of file diff --git a/src/js/sandbox-loader.js b/src/js/sandbox-loader.js index c3eec4f..87bea9f 100644 --- a/src/js/sandbox-loader.js +++ b/src/js/sandbox-loader.js @@ -1,20 +1,9 @@ (function() { 'use strict'; - /** - * The Template Loader. Used to asynchronously load templates located in separate .html files - */ - app.util.tpl = { - - // Hash of preloaded templates for the app - templates: {}, - - // Get template by name from hash of preloaded templates - get: function(name) { - return this.templates[name]; - } - - }; + var router, + mainWindow, + mainWindowOrigin; /** * Load templates and start the application @@ -28,13 +17,31 @@ app.util.tpl.templates = e.data.args; // remember references to main window - window.mainWindow = e.source; - window.mainWindowOrigin = e.origin; + mainWindow = e.source; + mainWindowOrigin = e.origin; - var router = new app.Router(); + router = new app.Router(); Backbone.history.start(); } }; }); + /** + * Helper method to ease message posting between sandbox and main window + */ + app.util.postMessage = function(cmd, args, callback) { + // set listender + window.onmessage = function(e) { + if (e.data.cmd === cmd) { + callback(e.data.args); + } + }; + + // send message to main window + mainWindow.postMessage({ + cmd: cmd, + args: args + }, mainWindowOrigin); + }; + }()); \ No newline at end of file diff --git a/src/js/view/login-view.js b/src/js/view/login-view.js index 0ebdd02..3b73cae 100644 --- a/src/js/view/login-view.js +++ b/src/js/view/login-view.js @@ -33,29 +33,21 @@ theme: 'c' }); - // set listener for event from main window - window.onmessage = function(e) { - if (e.data.cmd === 'login') { - var err = e.data.args.err; + // post message to main window + app.util.postMessage('login', { + userId: userId, + password: password + }, function(resArgs) { + var err = resArgs.err; - $.mobile.loading('hide'); - if (err) { - window.alert(err.errMsg); - return; - } - - window.location = '#accounts/' + userId + '/folders'; + $.mobile.loading('hide'); + if (err) { + window.alert(err.errMsg); + return; } - }; - // send message to main window - window.mainWindow.postMessage({ - cmd: 'login', - args: { - userId: userId, - password: password - } - }, window.mainWindowOrigin); + window.location = '#accounts/' + userId + '/folders'; + }); } }); diff --git a/src/js/view/messagelist-view.js b/src/js/view/messagelist-view.js index 1f6f049..f04cb57 100644 --- a/src/js/view/messagelist-view.js +++ b/src/js/view/messagelist-view.js @@ -6,10 +6,9 @@ initialize: function(args) { this.template = _.template(app.util.tpl.get('messagelist')); this.folder = args.folder; - this.dao = args.dao; }, - render: function(eventName) { + render: function() { var self = this, page = $(this.el); @@ -33,8 +32,12 @@ textVisible: true }); - // sync current folder from cloud - self.dao.syncFromCloud(self.folder, function(err) { + // post message to main window + app.util.postMessage('syncEmails', { + folder: self.folder + }, function(resArgs) { + var err = resArgs.err; + $.mobile.loading('hide'); // check for error @@ -61,7 +64,16 @@ text: 'decrypting...', textVisible: true }); - this.dao.listItems(this.folder, 0, 10, function(err, collection) { + + // post message to main window + app.util.postMessage('listEmails', { + folder: self.folder, + offset: 0, + num: 10 + }, function(resArgs) { + var err = resArgs.err; + var collection = resArgs.collection; + // check for error if (err) { $.mobile.loading('hide'); @@ -73,8 +85,8 @@ list.html(''); // append items to list in reverse order so mails with the most recent date will be displayed first - for (i = collection.models.length - 1; i >= 0; i--) { - email = collection.at(i); + for (i = collection.length - 1; i >= 0; i--) { + email = collection[i]; listItemArgs = { account: self.options.account, folder: self.folder, diff --git a/src/js/view/messagelistitem-view.js b/src/js/view/messagelistitem-view.js index d9246df..59aa33c 100644 --- a/src/js/view/messagelistitem-view.js +++ b/src/js/view/messagelistitem-view.js @@ -9,15 +9,16 @@ this.template = _.template(app.util.tpl.get('messagelistitem')); }, - render: function(eventName) { - var params = this.model.toJSON(); + render: function() { + var params = this.model; params.account = this.options.account; params.folder = this.options.folder; params.id = encodeURIComponent(params.id); - var util = new cryptoLib.Util(window, null); - var date = util.parseDate(params.sentDate); - params.displayDate = date.getDate() + '.' + (date.getMonth() + 1) + '. ' + date.getHours() + ':' + date.getMinutes(); + // var util = new cryptoLib.Util(window, null); + // var date = util.parseDate(params.sentDate); + // params.displayDate = date.getDate() + '.' + (date.getMonth() + 1) + '. ' + date.getHours() + ':' + date.getMinutes(); + params.displayDate = params.sentDate; $(this.el).html(this.template(params)); return this; diff --git a/src/js/window-loader.js b/src/js/window-loader.js index 52352a3..5d8fc73 100644 --- a/src/js/window-loader.js +++ b/src/js/window-loader.js @@ -6,37 +6,23 @@ /** * The Template Loader. Used to asynchronously load templates located in separate .html files */ - app.util.tpl = { - - // Hash of preloaded templates for the app - templates: {}, - - // Recursively pre-load all the templates for the app. - loadTemplates: function(names, callback) { - var that = this; - - var loadTemplate = function(index) { - var name = names[index]; - console.log('Loading template: ' + name); - $.get('tpl/' + name + '.html', function(data) { - that.templates[name] = data; - index++; - if (index < names.length) { - loadTemplate(index); - } else { - callback(); - } - }); - }; - - loadTemplate(0); - }, - - // Get template by name from hash of preloaded templates - get: function(name) { - return this.templates[name]; - } + app.util.tpl.loadTemplates = function(names, callback) { + var that = this; + var loadTemplate = function(index) { + var name = names[index]; + console.log('Loading template: ' + name); + $.get('tpl/' + name + '.html', function(data) { + that.templates[name] = data; + index++; + if (index < names.length) { + loadTemplate(index); + } else { + callback(); + } + }); + }; + loadTemplate(0); }; /** @@ -71,26 +57,21 @@ function startApp() { // init email dao and dependencies initDAO(); - // sandboxed ui in iframe var sandbox = document.getElementById('sandboxFrame').contentWindow; - // set listener for events from sandbox + // set global listener for events from sandbox window.onmessage = function(e) { var cmd = e.data.cmd; var args = e.data.args; - - if (cmd === 'login') { - // login user - login(args.userId, args.password, function(err) { - sandbox.postMessage({ - cmd: 'login', - args: { - err: err - } - }, '*'); - }); - } + // handle the workload in the main window + handleCommand(cmd, args, function(resArgs) { + // send reponse to sandbox + sandbox.postMessage({ + cmd: cmd, + args: resArgs + }, '*'); + }); }; // init sandbox ui @@ -100,6 +81,42 @@ }, '*'); } + function handleCommand(cmd, args, callback) { + if (cmd === 'login') { + // login user + login(args.userId, args.password, function(err) { + callback({ + err: err + }); + }); + + } else if (cmd === 'syncEmails') { + // list emails from folder + emailDao.syncFromCloud(args.folder, function(err) { + callback({ + err: err + }); + }); + + } else if (cmd === 'listEmails') { + // list emails from folder + emailDao.listItems(args.folder, args.offset, args.num, function(err, collection) { + callback({ + err: err, + collection: collection.toJSON() + }); + }); + + } else { + // error: invalid message from sandbox + callback({ + err: { + errMsg: 'Invalid message posted from sandbox!' + } + }); + } + } + function initDAO() { var util = new cryptoLib.Util(window, uuid); var crypto = new app.crypto.Crypto(window, util);