1 // ==========================================================================
  2 // Project:   The M-Project - Mobile HTML5 Application Framework
  3 // Copyright: �2010 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 /* Available transitions for page changes */
 12 M.TRANSITION = {};
 13 M.TRANSITION.NONE = 'none';
 14 M.TRANSITION.SLIDE = 'slide';
 15 M.TRANSITION.SLIDEUP = 'slideup';
 16 M.TRANSITION.SLIDEDOWN = 'slidedown';
 17 M.TRANSITION.POP = 'pop';
 18 M.TRANSITION.FADE = 'fade';
 19 M.TRANSITION.FLIP = 'flip';
 20 
 21 m_require('core/foundation/observable.js');
 22 
 23 /**
 24  * @class
 25  *
 26  * The root class for every controller.
 27  *
 28  * Controllers, respectively their properties, are observables. Views can observe them.
 29  *
 30  * @extends M.Object
 31  */
 32 M.Controller = M.Object.extend(
 33 /** @scope M.Controller.prototype */ {
 34 
 35     /**
 36      * The type of this object.
 37      *
 38      * @type String
 39      */
 40     type: 'M.Controller',
 41 
 42     /**
 43      * Makes the controller's properties observable.
 44      */
 45     observable: M.Observable.extend({}),
 46 
 47     /**
 48      * Helper function to build the location href for the view to be displayed.
 49      *
 50      * @param {String} id The id of the new target.
 51      */
 52     buildLocationHref: function(id) {
 53         return location.pathname + '#' + id;
 54     },
 55 
 56     /**
 57      * Returns the class property behind the given key and informs its observers.
 58      *
 59      * @param {Object} page The page to be displayed.
 60      * @param {String} transition The transition that should be used. Default: horizontal slide
 61      * @param {Boolean} isBack YES will cause a reverse-direction transition. Default: NO
 62      * @param {Boolean} changeLoc Update the browser history. Default: YES
 63      */
 64     switchToPage: function(page, transition, isBack, changeLoc) {
 65         var id = M.Application.viewManager.getIdByView(page);
 66         var isTabBarViewTopPage = NO;
 67 
 68         if(id) {
 69             if(page.hasTabBarView) {
 70                 if(page.tabBarView.childViews) {
 71                     var tabItemViews = $.trim(page.tabBarView.childViews).split(' ');
 72                     for(var i in tabItemViews) {
 73                         var tabItemView = page.tabBarView[tabItemViews[i]];
 74                         if(M.ViewManager.getPage(tabItemView.page) === page) {
 75                             page.tabBarView.setActiveTab(tabItemView.page, M.Application.viewManager.getIdByView(tabItemView));
 76                             isTabBarViewTopPage = YES;
 77                         }
 78                     }
 79                 }
 80             }
 81             /* If the new page is a real tabBarViewPage (has a tabBarView and is no sub view), use no transition. */
 82             if(isTabBarViewTopPage) {
 83                 transition = page.tabBarView.transition ? page.tabBarView.transition : M.TRANSITION.NONE;
 84                 isBack = NO;
 85                 changeLoc = changeLoc !== undefined ? changeLoc : NO;
 86             } else {
 87                 transition = transition ? transition : M.TRANSITION.SLIDE;
 88                 isBack = isBack !== undefined ? isBack : NO;
 89                 changeLoc = changeLoc !== undefined ? changeLoc : YES;
 90             }
 91 
 92             /* Now do the page change by using a jquery mobile method and pass the properties */
 93             $.mobile.changePage(id, transition, isBack, changeLoc);
 94 
 95             /* Save the current page in the view manager */
 96             M.Application.viewManager.setCurrentPage(page);
 97         } else {
 98             M.Logger.log('"' + page + '" not found', M.WARN);
 99         }
100     },
101 
102     /**
103      * Returns the class property behind the given key and informs its observers.
104      *
105      * @param {String} key The key of the property to be changed.
106      * @param {Object, String} value The value to be set.
107      */
108     set: function(key, value) {
109         this[key] = value;
110         this.observable.notifyObservers(key);
111     }
112 
113 });