1 // ==========================================================================
  2 // Project:   The M-Project - Mobile HTML5 Application Framework
  3 // Copyright: (c) 2010 M-Way Solutions GmbH. All rights reserved.
  4 // Creator:   Sebastian
  5 // Date:      22.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/object.js');
 12 
 13 /**
 14  * A constant value for being offline.
 15  *
 16  * @type String
 17  */
 18 M.OFFLINE = 'offline';
 19 
 20 /**
 21  * A constant value for being online.
 22  *
 23  * @type String
 24  */
 25 M.ONLINE = 'online';
 26 
 27 
 28 /**
 29  * @class
 30  *
 31  * M.Environment encapsulates methods to retrieve information about the
 32  * environment, like browser used, platform, user agent (based on navigator
 33  * object) or whether or not the device is online (determined via an ajax
 34  * request).
 35  *
 36  * @extends M.Object
 37  */
 38 M.Environment = M.Object.extend(
 39 /** @scope M.Environment.prototype */ {
 40 
 41     /**
 42      * Checks the connection status by sending an ajax request
 43      * and waiting for the response to decide whether online or offline.
 44      *
 45      * The callback is called when the request returns successful or times out. The parameter to callback is a
 46      * string saying either offline or online.
 47      *
 48      * @param {function} callback The function to be called when request returns.
 49      * @param {String} url Optional. The request url. When not given, a request is made to google.com. (Note: Add a proxy: /google)
 50      * @param {Number} timeout Optional. Time in milliseconds until request is considered to be timed out. Defaults to 5 seconds.
 51      */
 52     getConnectionStatus: function(callback, url, timeout){
 53         M.Request.init({
 54             url: url ? url : '/google',
 55             isJSON: NO,
 56             timeout: timeout ? timeout : 5000,
 57             onSuccess: function(data){
 58                 callback(M.ONLINE);
 59             },
 60             onError: function(data){
 61                 callback(M.OFFLINE);
 62             }
 63         }).send();
 64     },
 65 
 66     /**
 67      * Returns the userAgent as received from navigator object.
 68      * E.g. "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7"
 69      *
 70      * @returns {String} The user agent.
 71      */
 72     getUserAgent: function() {
 73         return navigator.userAgent;
 74     },
 75 
 76     /**
 77      * Returns the platform as received from navigator object.
 78      * E.g. "MacIntel"
 79      *
 80      * @returns {String} The user's platform.
 81      */
 82     getPlatform: function() {
 83         return navigator.platform;
 84     },
 85 
 86     /**
 87      * Returns the browser version as received from navigator object.
 88      * E.g. "5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7"
 89      *
 90      * @returns {String} The user's browser.
 91      */
 92     getBrowserName: function() {
 93         return navigator.appName;
 94     },
 95 
 96     /**
 97      * Returns the currently available width and height of the browser window
 98      * as an array:
 99      *
100      * 0 -> width
101      * 1 -> height
102      *
103      * @returns {Array} The widht and height of the user's browser window.
104      */
105     getSize: function() {
106         var viewportWidth;
107         var viewportHeight;
108 
109         if(typeof window.innerWidth != 'undefined') {
110             viewportWidth = window.innerWidth,
111             viewportHeight = window.innerHeight
112         } else if(typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0) {
113             viewportWidth = document.documentElement.clientWidth,
114             viewportHeight = document.documentElement.clientHeight
115         } else {
116             viewportWidth = document.getElementsByTagName('body')[0].clientWidth,
117             viewportHeight = document.getElementsByTagName('body')[0].clientHeight
118         }
119 
120         return [viewportWidth, viewportHeight];
121     },
122 
123     /**
124      * Returns the currently available width of the browser window.
125      *
126      * @returns {Number} The width of the user's browser window.
127      */
128     getWidth: function() {
129         return this.getSize()[0];
130     },
131 
132     /**
133      * Returns the currently available height of the browser window.
134      *
135      * @returns {Number} The height of the user's browser window.
136      */
137     getHeight: function() {
138         return this.getSize()[1];
139     }
140 
141 });