_base.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. // wrapped by build app
  2. define("dojox/mobile/app/_base", ["dijit","dojo","dojox","dojo/require!dijit/_base,dijit/_WidgetBase,dojox/mobile,dojox/mobile/parser,dojox/mobile/Button,dojox/mobile/app/_event,dojox/mobile/app/_Widget,dojox/mobile/app/StageController,dojox/mobile/app/SceneController,dojox/mobile/app/SceneAssistant,dojox/mobile/app/AlertDialog,dojox/mobile/app/List,dojox/mobile/app/ListSelector,dojox/mobile/app/TextBox,dojox/mobile/app/ImageView,dojox/mobile/app/ImageThumbView"], function(dijit,dojo,dojox){
  3. dojo.provide("dojox.mobile.app._base");
  4. dojo.experimental("dojox.mobile.app._base");
  5. dojo.require("dijit._base");
  6. dojo.require("dijit._WidgetBase");
  7. dojo.require("dojox.mobile");
  8. dojo.require("dojox.mobile.parser");
  9. dojo.require("dojox.mobile.Button");
  10. dojo.require("dojox.mobile.app._event");
  11. dojo.require("dojox.mobile.app._Widget");
  12. dojo.require("dojox.mobile.app.StageController");
  13. dojo.require("dojox.mobile.app.SceneController");
  14. dojo.require("dojox.mobile.app.SceneAssistant");
  15. dojo.require("dojox.mobile.app.AlertDialog");
  16. dojo.require("dojox.mobile.app.List");
  17. dojo.require("dojox.mobile.app.ListSelector");
  18. dojo.require("dojox.mobile.app.TextBox");
  19. dojo.require("dojox.mobile.app.ImageView");
  20. dojo.require("dojox.mobile.app.ImageThumbView");
  21. (function(){
  22. var stageController;
  23. var appInfo;
  24. var jsDependencies = [
  25. "dojox.mobile",
  26. "dojox.mobile.parser"
  27. ];
  28. var loadedResources = {};
  29. var loadingDependencies;
  30. var rootNode;
  31. var sceneResources = [];
  32. // Load the required resources asynchronously, since not all mobile OSes
  33. // support dojo.require and sync XHR
  34. function loadResources(resources, callback){
  35. // summary:
  36. // Loads one or more JavaScript files asynchronously. When complete,
  37. // the first scene is pushed onto the stack.
  38. // resources:
  39. // An array of module names, e.g. 'dojox.mobile.AlertDialog'
  40. var resource;
  41. var url;
  42. do {
  43. resource = resources.pop();
  44. if (resource.source) {
  45. url = resource.source;
  46. }else if (resource.module) {
  47. url= dojo.moduleUrl(resource.module)+".js";
  48. }else {
  49. console.log("Error: invalid JavaScript resource " + dojo.toJson(resource));
  50. return;
  51. }
  52. }while (resources.length > 0 && loadedResources[url]);
  53. if(resources.length < 1 && loadedResources[url]){
  54. // All resources have already been loaded
  55. callback();
  56. return;
  57. }
  58. dojo.xhrGet({
  59. url: url,
  60. sync: false
  61. }).addCallbacks(function(text){
  62. dojo["eval"](text);
  63. loadedResources[url] = true;
  64. if(resources.length > 0){
  65. loadResources(resources, callback);
  66. }else{
  67. callback();
  68. }
  69. },
  70. function(){
  71. console.log("Failed to load resource " + url);
  72. });
  73. }
  74. var pushFirstScene = function(){
  75. // summary:
  76. // Pushes the first scene onto the stack.
  77. stageController = new dojox.mobile.app.StageController(rootNode);
  78. var defaultInfo = {
  79. id: "com.test.app",
  80. version: "1.0.0",
  81. initialScene: "main"
  82. };
  83. // If the application info has been defined, as it should be,
  84. // use it.
  85. if(dojo.global["appInfo"]){
  86. dojo.mixin(defaultInfo, dojo.global["appInfo"]);
  87. }
  88. appInfo = dojox.mobile.app.info = defaultInfo;
  89. // Set the document title from the app info title if it exists
  90. if(appInfo.title){
  91. var titleNode = dojo.query("head title")[0] ||
  92. dojo.create("title", {},dojo.query("head")[0]);
  93. document.title = appInfo.title;
  94. }
  95. stageController.pushScene(appInfo.initialScene);
  96. };
  97. var initBackButton = function(){
  98. var hasNativeBack = false;
  99. if(dojo.global.BackButton){
  100. // Android phonegap support
  101. BackButton.override();
  102. dojo.connect(document, 'backKeyDown', function(e) {
  103. dojo.publish("/dojox/mobile/app/goback");
  104. });
  105. hasNativeBack = true;
  106. }else if(dojo.global.Mojo){
  107. // TODO: add webOS support
  108. }
  109. if(hasNativeBack){
  110. dojo.addClass(dojo.body(), "mblNativeBack");
  111. }
  112. };
  113. dojo.mixin(dojox.mobile.app, {
  114. init: function(node){
  115. // summary:
  116. // Initializes the mobile app. Creates the
  117. rootNode = node || dojo.body();
  118. dojox.mobile.app.STAGE_CONTROLLER_ACTIVE = true;
  119. dojo.subscribe("/dojox/mobile/app/goback", function(){
  120. stageController.popScene();
  121. });
  122. dojo.subscribe("/dojox/mobile/app/alert", function(params){
  123. dojox.mobile.app.getActiveSceneController().showAlertDialog(params);
  124. });
  125. dojo.subscribe("/dojox/mobile/app/pushScene", function(sceneName, params){
  126. stageController.pushScene(sceneName, params || {});
  127. });
  128. // Get the list of files to load per scene/view
  129. dojo.xhrGet({
  130. url: "view-resources.json",
  131. load: function(data){
  132. var resources = [];
  133. if(data){
  134. // Should be an array
  135. sceneResources = data = dojo.fromJson(data);
  136. // Get the list of files to load that have no scene
  137. // specified, and therefore should be loaded on
  138. // startup
  139. for(var i = 0; i < data.length; i++){
  140. if(!data[i].scene){
  141. resources.push(data[i]);
  142. }
  143. }
  144. }
  145. if(resources.length > 0){
  146. loadResources(resources, pushFirstScene);
  147. }else{
  148. pushFirstScene();
  149. }
  150. },
  151. error: pushFirstScene
  152. });
  153. initBackButton();
  154. },
  155. getActiveSceneController: function(){
  156. // summary:
  157. // Gets the controller for the active scene.
  158. return stageController.getActiveSceneController();
  159. },
  160. getStageController: function(){
  161. // summary:
  162. // Gets the stage controller.
  163. return stageController;
  164. },
  165. loadResources: function(resources, callback){
  166. loadResources(resources, callback);
  167. },
  168. loadResourcesForScene: function(sceneName, callback){
  169. var resources = [];
  170. // Get the list of files to load that have no scene
  171. // specified, and therefore should be loaded on
  172. // startup
  173. for(var i = 0; i < sceneResources.length; i++){
  174. if(sceneResources[i].scene == sceneName){
  175. resources.push(sceneResources[i]);
  176. }
  177. }
  178. if(resources.length > 0){
  179. loadResources(resources, callback);
  180. }else{
  181. callback();
  182. }
  183. },
  184. resolveTemplate: function(sceneName){
  185. // summary:
  186. // Given the name of a scene, returns the path to it's template
  187. // file. For example, for a scene named 'main', the file
  188. // returned is 'app/views/main/main-scene.html'
  189. // This function can be overridden if it is desired to have
  190. // a different name to file mapping.
  191. return "app/views/" + sceneName + "/" + sceneName + "-scene.html";
  192. },
  193. resolveAssistant: function(sceneName){
  194. // summary:
  195. // Given the name of a scene, returns the path to it's assistant
  196. // file. For example, for a scene named 'main', the file
  197. // returned is 'app/assistants/main-assistant.js'
  198. // This function can be overridden if it is desired to have
  199. // a different name to file mapping.
  200. return "app/assistants/" + sceneName + "-assistant.js";
  201. }
  202. });
  203. })();
  204. });