      1 // ==========================================================================
      2 // Project:   The M-Project - Mobile HTML5 Application Framework
      3 // Copyright: �2010 M-Way Solutions GmbH. All rights reserved.
      4 // Creator:   Sebastian
      5 // Date:      02.11.2010
      6 // License:   Dual licensed under the MIT or GPL Version 2 licenses.
      7 //            http://github.com/mwaylabs/The-M-Project/blob/master/MIT-LICENSE
      8 //            http://github.com/mwaylabs/The-M-Project/blob/master/GPL-LICENSE
      9 // ==========================================================================
     10
     11 m_require('core/foundation/view_manager.js');
     12
     13 /**
     14  * @class
     15  *
     16  * The root class for an application.
     17  *
     18  * @extends M.Object
     19  */
     20 M.Application = M.Object.extend(
     21 /** @scope M.Application.prototype */ {
     22
     23     /**
     24      * The type of this object.
     25      *
     26      * @type String
     27      */
     28     type: 'M.Application',
     29
     30     /**
     31      * The application's name.
     32      *
     33      * @type String
     34      */
     35     name: null,
     36
     37     /**
     38      * The application's view manager.
     39      *
     40      * @type Object
     41      */
     42     viewManager: M.ViewManager,
     43
     44     /**
     45      * The application's model registry.
     46      *
     47      * @type Object
     48      */
     49     modelRegistry: M.ModelRegistry,
     50
     51     /**
     52      * The application's event dispatcher.
     53      *
     54      * @type Object
     55      */
     56     eventDispatcher: M.EventDispatcher,
     57
     58     /**
     59      * The application's cypher object, used for encoding and decoding.
     60      *
     61      * @type Object
     62      */
     63     cypher: M.Cypher,
     64
     65     /**
     66      * The application's current language.
     67      *
     68      * @type String
     69      */
     70     currentLanguage: null,
     71
     72     /**
     73      * The application's default / fallback language.
     74      *
     75      * @type String
     76      */
     77     defaultLanguage: null,
     78
     79     /**
     80      * This method encapsulates the 'include' method of M.Object for better reading of code syntax.
     81      * Basically it integrates the defined pages within the application into M.Application and sets
     82      * some basic configuration properties, e.g. the default language.
     83      *
     84      * @param {Object} obj The mixed in object for the extend call.
     85      */
     86     design: function(obj) {
     87         this.include({
     88             pages: obj
     89         });
     90         return this;
     91     },
     92
     93     /**
     94      * The application's main-method, that is called automatically on load of the app.
     95      * Inside this method the rendering is initiated and all pages are bound to the 'pageshow'
     96      * event so one can do some action whenever a page is loaded.
     97      */
     98     main: function() {
     99         var that = this;
    100
    101         /* live is jQuery fn that binds an event to all elements matching a certain selector now and in the future */
    102         var eventList = 'click change keyup focus blur orientationchange';
    103         $('*[id]').live(eventList, function(evt) {
    104             that.eventDispatcher.eventDidHappen(evt);
    105         });
    106
    107         /* also bind the orientationchange event to the body of the application */
    108         $('body').bind('orientationchange', function(evt) {
    109             that.eventDispatcher.eventDidHappen(evt);
    110         });
    111
    112         var html = '';
    113         for(i in this.viewManager.viewList) {
    114             if(this.viewManager.viewList[i].type === 'M.PageView') {
    115                 html += this.viewManager.viewList[i].render();
    116                 /* bind the pageshow event to any view's pageDidLoad property function */
    117                 $('#' + this.viewManager.viewList[i].id).bind('pagebeforeshow', this.bindToCaller(this.viewManager.viewList[i], this.viewManager.viewList[i].pageWillLoad));
    118
    119                 /* bind the pageshow event to any view's pageWillLoad property function */
    120                 $('#' + this.viewManager.viewList[i].id).bind('pageshow', this.bindToCaller(this.viewManager.viewList[i], this.viewManager.viewList[i].pageDidLoad));
    121
    122                 /* bind the pagebeforehide event to any view's pageWillHide property function */
    123                 $('#' + this.viewManager.viewList[i].id).bind('pagebeforehide', this.bindToCaller(this.viewManager.viewList[i], this.viewManager.viewList[i].pageWillHide));
    124
    125                 /* bind the pagehide event to any view's pageDidHide property function */
    126                 $('#' + this.viewManager.viewList[i].id).bind('pagehide', this.bindToCaller(this.viewManager.viewList[i], this.viewManager.viewList[i].pageDidHide));
    127
    128                 /* set the first page as current page to be displayed */
    129                 if(!this.viewManager.getCurrentPage()) {
    130                     this.viewManager.setCurrentPage(this.viewManager.viewList[i]);
    131                 }
    132             }
    133         }
    134     }
    135
    136 });