      1 // ==========================================================================
      2 // Project:   The M-Project - Mobile HTML5 Application Framework
      3 // Copyright: (c) M-Way Solutions GmbH. All rights reserved.
      4 // Creator:   Dominik
      5 // Date:      27.10.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/utility/logger.js');
     12
     13 /**
     14  * @class
     15  *
     16  * Object for dispatching all incoming events.
     17  *
     18  * @extends M.Object
     19  */
     20 M.EventDispatcher = M.Object.create(
     21 /** @scope M.EventDispatcher.prototype */ {
     22
     23     /**
     24      * The type of this object.
     25      *
     26      * @type String
     27      */
     28     type: 'M.EventDispatcher',
     29
     30     /**
     31      * This method is called whenever an event is triggered within the app.
     32      *
     33      * @param {Object} evt The event.
     34      */
     35     eventDidHappen: function(evt) {
     36         this.delegateEvent(evt.type, evt.currentTarget.id, evt.keyCode, evt.orientation);
     37     },
     38
     39     /**
     40      * This method is called whenever an onClick event is triggered within the app. This is
     41      * not the common way to catch events, but in some cases it might be necessary to use
     42      * the onClick property.
     43      *
     44      * @param {String} type The type of event that occured, e.g. 'click'.
     45      * @param {String} id The id of the element that triggered the event.
     46      * @param {Number} keyCode The keyCode property of the event, necessary for keypress event, e.g. keyCode is 13 when enter is pressed.
     47      * @param {String} orientation The orientation of the device (only passed if an orientationChange event did happen).
     48      */
     49     onClickEventDidHappen: function(type, id, keyCode, orientation) {
     50         if(!M.Application.viewManager.getViewById(id).inEditMode) {
     51             this.delegateEvent(type, id, keyCode, orientation);
     52         }
     53     },
     54
     55     /**
     56      * This method looks for a corresponding event inside the view manager and
     57      * delegates the call directly to the responsible controller defined by the
     58      * target and action properties of the view.
     59      *
     60      * @param {String} type The type of event that occured, e.g. 'click'.
     61      * @param {String} id The id of the element that triggered the event.
     62      * @param {Number} keyCode The keyCode property of the event, necessary for keypress event, e.g. keyCode is 13 when enter is pressed.
     63      * @param {String} orientation The orientation of the device (only passed if an orientationChange event did happen).
     64      */
     65     delegateEvent: function(type, id, keyCode, orientation) {
     66         var view = M.Application.viewManager.getViewById(id);
     67
     68         switch(type) {
     69             case 'click':
     70                 if(view && view.internalTarget && view.internalAction) {
     71                     view.internalTarget[view.internalAction](id, view.modelId);
     72                 }
     73                 if(view && view.target && view.action && view.type !== 'M.TextFieldView' && view.type !== 'M.SearchBarView') {
     74                     view.target[view.action](id, view.modelId);
     75                 }
     76                 break;
     77             case 'change':
     78                 view.setValueFromDOM(type);
     79                 break;
     80             case 'keyup':
     81                 if(keyCode === 13 && view.triggerActionOnEnter && (view.type === 'M.TextFieldView' || view.type === 'M.SearchBarView')) {
     82                     if(view && view.target && view.action) {
     83                         view.target[view.action](id);
     84                     }
     85                 } else if(view.type === 'M.TextFieldView' || view.type === 'M.SearchBarView') {
     86                     view.setValueFromDOM(type);
     87                 }
     88                 break;
     89             case 'focusin':
     90                 view.gotFocus(type);
     91                 break;
     92             case 'focusout':
     93                 view.lostFocus(type);
     94                 break;
     95             case 'orientationchange':
     96                 M.Application.viewManager.getCurrentPage().orientationDidChange(orientation);
     97                 break;
     98         }
     99     },
    100
    101     /**
    102      * Registers events given from eventList to a view defined by an id. Can be used to register events after application load.
    103      * @param {String} id The View Id, e.g. m_123
    104      * @param {String} eventList The Events one after another in a string divided by whitespace.
    105      */
    106     registerEvents: function(id, eventList) {
    107         var that = this;
    108         $('#' + id).bind(eventList, function(evt) {
    109             that.eventDidHappen(evt);
    110         });
    111     }
    112
    113 });
    114