App.js
上传用户:snow1005
上传日期:2015-11-10
资源大小:3151k
文件大小:15k
源码类别:

Ajax

开发平台:

JavaScript

  1. /*
  2.  * qWikiOffice Desktop 0.8.1
  3.  * Copyright(c) 2007-2008, Integrated Technologies, Inc.
  4.  * licensing@qwikioffice.com
  5.  * 
  6.  * http://www.qwikioffice.com/license
  7.  *
  8.  * NOTE:
  9.  * This code is based on code from the original Ext JS desktop demo.
  10.  * I have made many modifications/additions.
  11.  *
  12.  * The Ext JS licensing can be viewed here:
  13.  *
  14.  * Ext JS Library 2.0 Beta 2
  15.  * Copyright(c) 2006-2007, Ext JS, LLC.
  16.  * licensing@extjs.com
  17.  * 
  18.  * http://extjs.com/license
  19.  *
  20.  */
  21. Ext.app.App = function(config){
  22.     Ext.apply(this, config);
  23.     
  24.     this.addEvents({
  25.         'ready' : true,
  26.         'beforeunload' : true
  27.     });
  28.     Ext.onReady(this.initApp, this);
  29. };
  30. Ext.extend(Ext.app.App, Ext.util.Observable, {
  31.     /**
  32.      * Read-only. This app's ready state
  33.      * @type boolean
  34.      */
  35.     isReady : false,
  36.     /**
  37.      * Read-only. This app's launchers
  38.      * @type object
  39.      */
  40.     launchers : null,
  41.     /**
  42.      * Read-only. This app's modules
  43.      * @type array
  44.      */
  45.     modules : null,
  46.      /**
  47.      * Read-only. This app's styles
  48.      * @type object
  49.      */
  50.     styles : null,
  51.     /**
  52.      * Read-only. This app's Start Menu config
  53.      * @type object
  54.      */
  55.     startConfig : null,
  56.     /**
  57.      * Read-only. This app's Start Menu's items and toolItems configs.
  58.      * @type object
  59.      */
  60.     startItemsConfig : null,
  61.     /**
  62.      * Read-only. This app's logout button config
  63.      * @type object
  64.      */
  65.     logoutButtonConfig : null,
  66.     /**
  67.  * Read-only. The url of this app's server connection
  68.  * 
  69.  * Allows a module to connect to its server script without knowing the path.
  70.  * Example ajax call:
  71.  * 
  72.  * Ext.Ajax.request({
  73.  *  url: this.app.connection,
  74.  *  // Could also pass moduleId and fileName in querystring like this,
  75.  *  // instead of in the params config option.
  76.  *      
  77.  *  // url: this.app.connection+'?moduleId='+this.id+'&fileName=Preferences.php',
  78.  *      params: {
  79.  * moduleId: this.id,
  80.  * fileName: 'Preferences.php',
  81.  *
  82.  * ...
  83.  * },
  84.  * success: function(){
  85.  * ...
  86.  * },
  87.  * failure: function(){
  88.  * ...
  89.  * },
  90.  * scope: this
  91.  * });
  92.  */
  93. connection : 'connect.php',
  94. /**
  95.      * Read-only. The url of this app's loader script
  96.      * @type string
  97.      * 
  98.      * Handles module on demand loading
  99.      */
  100. loader : 'load.php',
  101. /**
  102.  * Read-only. The queue of requests to run once a module is loaded
  103.  */
  104. requestQueue : [],
  105. init : Ext.emptyFn,
  106. startMenuSortFn : Ext.emptyFn,
  107. getModules : Ext.emptyFn,
  108. getLaunchers : Ext.emptyFn,
  109. getStyles : Ext.emtpyFn,
  110. getStartConfig : Ext.emptyFn,
  111.     getLogoutConfig : Ext.emptyFn,
  112.     
  113. initApp : function(){
  114. Ext.BLANK_IMAGE_URL = 'resources/images/default/s.gif';
  115.      this.preventBackspace();
  116.     
  117.      this.privileges = this.privileges || this.getPrivileges();
  118.     
  119.      this.modules = this.modules || this.getModules();
  120.      this.initModules();
  121. this.startConfig = this.startConfig || this.getStartConfig();
  122. this.startItemsConfig = this.startItemsConfig || this.getStartItemsConfig();
  123. Ext.apply(this.startConfig, this.startItemsConfig);
  124. this.desktop = new Ext.Desktop(this);
  125. this.styles = this.styles || this.getStyles();
  126.      this.initStyles();
  127. this.launchers = this.launchers || this.getLaunchers();
  128. this.initLaunchers();
  129. this.logoutConfig = this.logoutConfig || this.getLogoutConfig();
  130. this.initLogout();
  131. this.init();
  132. Ext.EventManager.on(window, 'beforeunload', this.onBeforeUnload, this);
  133. this.fireEvent('ready', this);
  134. this.isReady = true;
  135.     },
  136.     
  137.     initLogout : function(){
  138. if(this.logoutConfig){
  139. this.desktop.taskbar.startMenu.addTool(this.logoutConfig);
  140. }
  141. },
  142. initStyles : function(){
  143.      var s = this.styles;
  144.      if(!s){
  145.      return false;
  146.      }
  147.     
  148.      this.desktop.setBackgroundColor(s.backgroundcolor);
  149.      this.desktop.setFontColor(s.fontcolor);
  150.      this.desktop.setTheme(s.theme);
  151.      this.desktop.setTransparency(s.transparency);
  152.      this.desktop.setWallpaper(s.wallpaper);
  153.      this.desktop.setWallpaperPosition(s.wallpaperposition);
  154.     
  155.      return true;
  156.     },
  157.     initModules : function(){
  158.      var ms = this.modules;
  159.      if(!ms){ return false; }
  160.     
  161. for(var i = 0, len = ms.length; i < len; i++){
  162. if(ms[i].loaded === true){
  163. //ms[i].app = this;
  164.      }else{
  165.      // module is not loaded, set the handler for its launcher
  166.      ms[i].launcher.handler = this.createWindow.createDelegate(this, [ms[i].moduleId]);
  167.      }
  168.      ms[i].app = this;
  169.         }
  170.         
  171.         return true;
  172.     },
  173.     
  174.     initLaunchers : function(){
  175.      var l = this.launchers;
  176.      if(!l){
  177.      return false;
  178.      }
  179.     
  180.      if(l.contextmenu){
  181. this.initContextMenu(l.contextmenu);
  182. }
  183. if(l.quickstart){
  184. this.initQuickStart(l.quickstart);
  185. }
  186. if(l.shortcut){
  187. this.initShortcut(l.shortcut);
  188. }
  189. if(l.autorun){
  190. this.onReady(this.initAutoRun.createDelegate(this, [l.autorun]), this);
  191. }
  192. return true;
  193.     },
  194.     
  195.     /**
  196.  * @param {array} mIds An array of the module ids to run when this app is ready
  197.  */
  198.     initAutoRun : function(mIds){
  199.      if(mIds){
  200.      for(var i = 0, len = mIds.length; i < len; i++){
  201.             var m = this.getModule(mIds[i]);
  202.             if(m){
  203.              m.autorun = true;
  204.              this.createWindow(mIds[i]);
  205.             }
  206. }
  207. }
  208.     },
  209. /**
  210.  * @param {array} mIds An array of the module ids to add to the Desktop Context Menu
  211.  */
  212.     initContextMenu : function(mIds){
  213.      if(mIds){
  214.      for(var i = 0, len = mIds.length; i < len; i++){
  215.      this.desktop.addContextMenuItem(mIds[i]);
  216.         }
  217.      }
  218.     },
  219. /**
  220.  * @param {array} mIds An array of the module ids to add to the Desktop Shortcuts
  221.  */
  222.     initShortcut : function(mIds){
  223. if(mIds){
  224. for(var i = 0, len = mIds.length; i < len; i++){
  225.             this.desktop.addShortcut(mIds[i], false);
  226.         }
  227. }
  228.     },
  229. /**
  230.  * @param {array} mIds An array of the modulId's to add to the Quick Start panel
  231.  */
  232. initQuickStart : function(mIds){
  233. if(mIds){
  234. for(var i = 0, len = mIds.length; i < len; i++){
  235.             this.desktop.addQuickStartButton(mIds[i], false);
  236.         }
  237. }
  238.     },
  239.     
  240.     /**
  241.  * Returns the Start Menu items and toolItems configs
  242.  * @param {array} ms An array of the modules.
  243.  */
  244. getStartItemsConfig : function(){
  245. var ms = this.modules;
  246. var sortFn = this.startMenuSortFn;
  247.      if(ms){
  248.      var paths;
  249.      var root;
  250.      var sm = { menu: { items: [] } }; // Start Menu
  251.      var smi = sm.menu.items;
  252.     
  253.      smi.push({text: 'StartMenu', menu: { items: [] } });
  254.      smi.push({text: 'ToolMenu', menu: { items: [] } });
  255.     
  256. for(var i = 0, iLen = ms.length; i < iLen; i++){ // loop through modules
  257. if(ms[i].menuPath){
  258. paths = ms[i].menuPath.split('/');
  259. root = paths[0];
  260. if(paths.length > 0){
  261. if(root === 'StartMenu'){
  262. simplify(smi[0].menu, paths, ms[i].launcher);
  263. sort(smi[0].menu);
  264. }else if(root === 'ToolMenu'){
  265. simplify(smi[1].menu, paths, ms[i].launcher);
  266. sort(smi[1].menu);
  267. }
  268. }
  269. }
  270. }
  271. return {
  272. items: smi[0].menu.items,
  273. toolItems: smi[1].menu.items
  274. };
  275.      }
  276.     
  277.      return null;
  278. /**
  279.  * Creates nested arrays that represent the Start Menu.
  280.  * 
  281.  * @param {array} pMenu The Start Menu
  282.  * @param {array} texts The menu texts
  283.  * @param {object} launcher The launcher config
  284.  */
  285. function simplify(pMenu, paths, launcher){
  286. var newMenu;
  287. var foundMenu;
  288. for(var i = 1, len = paths.length; i < len; i++){ // ignore the root (StartMenu, ToolMenu)
  289. foundMenu = findMenu(pMenu.items, paths[i]); // text exists?
  290. if(!foundMenu){
  291. newMenu = {
  292. iconCls: 'ux-start-menu-submenu',
  293. handler: function(){ return false; },
  294. menu: { items: [] },
  295. text: paths[i]
  296. };
  297. pMenu.items.push(newMenu);
  298. pMenu = newMenu.menu;
  299. }else{
  300. pMenu = foundMenu;
  301. }
  302. }
  303. pMenu.items.push(launcher);
  304. }
  305. /**
  306.  * Returns the menu if found.
  307.  * 
  308.  * @param {array} pMenu The parent menu to search
  309.  * @param {string} text
  310.  */
  311. function findMenu(pMenu, text){
  312. for(var j = 0, jlen = pMenu.length; j < jlen; j++){
  313. if(pMenu[j].text === text){
  314. return pMenu[j].menu; // found the menu, return it
  315. }
  316. }
  317. return null;
  318. }
  319. /**
  320.  * @param {array} menu The nested array to sort
  321.  */
  322. function sort(menu){
  323. var items = menu.items;
  324. for(var i = 0, ilen = items.length; i < ilen; i++){
  325. if(items[i].menu){
  326. sort(items[i].menu); // use recursion to iterate nested arrays
  327. }
  328. bubbleSort(items, 0, items.length); // sort the menu items
  329. }
  330. }
  331. /**
  332.  * @param {array} items Menu items to sort
  333.  * @param {integer} start The start index
  334.  * @param {integer} stop The stop index
  335.  */
  336. function bubbleSort(items, start, stop){
  337. for(var i = stop - 1; i >= start;  i--){
  338. for(var j = start; j <= i; j++){
  339. if(items[j+1] && items[j]){
  340. if(sortFn(items[j], items[j+1])){
  341. var tempValue = items[j];
  342. items[j] = items[j+1];
  343. items[j+1] = tempValue;
  344. }
  345. }
  346. }
  347. }
  348. return items;
  349. }
  350. },
  351.     
  352.     /**
  353.      * @param {string} moduleId
  354.      * 
  355.      * Provides the handler to the placeholder's launcher until the module it is loaded.
  356.      * Requests the module.  Passes in the callback and scope as params.
  357.      */
  358.     createWindow : function(moduleId){
  359.      var m = this.requestModule(moduleId, function(m){
  360.      if(m){
  361.      m.createWindow();
  362.      }
  363.      }, this);
  364.     },
  365.     
  366.     /** 
  367.      * @param {string} v The moduleId or moduleType you want returned
  368.      * @param {Function} cb The Function to call when the module is ready/loaded
  369.      * @param {object} scope The scope in which to execute the function
  370.      */
  371. requestModule : function(v, cb, scope){
  372.      var m = this.getModule(v);
  373.         
  374.         if(m){
  375.         if(m.loaded === true){
  376.          cb.call(scope, m);
  377.         }else{
  378.          if(cb && scope){
  379.          this.requestQueue.push({
  380.          moduleId: m.moduleId,
  381.          callback: cb,
  382.          scope: scope
  383.         });
  384.         this.loadModule(m.moduleId, m.launcher.text);
  385.          }
  386.         }
  387.         }
  388.     },
  389.     
  390.     loadModule : function(moduleId, moduleName){
  391.      var notifyWin = this.desktop.showNotification({
  392. html: 'Loading ' + moduleName + '...'
  393. , title: 'Please wait'
  394. });
  395.     
  396.      Ext.Ajax.request({
  397.      url: this.loader,
  398.      params: {
  399.      moduleId: moduleId
  400.      },
  401.      success: function(o){
  402.      notifyWin.setIconClass('x-icon-done');
  403. notifyWin.setTitle('Finished');
  404. notifyWin.setMessage(moduleName + ' loaded.');
  405. this.desktop.hideNotification(notifyWin);
  406. notifyWin = null;
  407.      if(o.responseText !== ''){
  408.      eval(o.responseText);
  409.      this.loadModuleComplete(true, moduleId);
  410.      }else{
  411.      alert('An error occured on the server.');
  412.      }
  413.      },
  414.      failure: function(){
  415.      alert('Connection to the server failed!');
  416.      },
  417.      scope: this
  418.      });
  419.     },
  420.     
  421.     /**
  422.      * @param {boolean} success
  423.      * @param {string} moduleId
  424.      * 
  425.      * Will be called when a module is loaded.
  426.      * If a request for this module is waiting in the
  427.      * queue, it as executed and removed from the queue.
  428.      */
  429.     loadModuleComplete : function(success, moduleId){    
  430.      if(success === true && moduleId){
  431.      var m = this.getModule(moduleId);
  432.      m.loaded = true;
  433.      m.init();
  434.     
  435.      var q = this.requestQueue;
  436.      var nq = [];
  437.      for(var i = 0, len = q.length; i < len; i++){
  438.      if(q[i].moduleId === moduleId){
  439.      q[i].callback.call(q[i].scope, m);
  440.      }else{
  441.      nq.push(q[i]);
  442.      }
  443.      }
  444.      this.requestQueue = nq;
  445.      }
  446.     },
  447.     /**
  448.      * @param {string} v The moduleId or moduleType you want returned
  449.      */
  450.     getModule : function(v){
  451.      var ms = this.modules;
  452.     
  453.         for(var i = 0, len = ms.length; i < len; i++){
  454.      if(ms[i].moduleId == v || ms[i].moduleType == v){
  455.      return ms[i];
  456. }
  457.         }
  458.         
  459.         return null;
  460.     },
  461.     
  462.     
  463.     /**
  464.      * @param {Ext.app.Module} m The module to register
  465.      */
  466.     registerModule: function(m){
  467.      if(!m){ return false; }
  468. this.modules.push(m);
  469. m.launcher.handler = this.createWindow.createDelegate(this, [m.moduleId]);
  470. m.app = this;
  471. },
  472.     /**
  473.      * @param {string} moduleId or moduleType 
  474.      * @param {array} requests An array of request objects
  475.      * 
  476.      * Example:
  477.      * this.app.makeRequest('module-id', {
  478.  *    requests: [
  479.  *       {
  480.  *          action: 'createWindow',
  481.  *          params: '',
  482.  *          callback: this.myCallbackFunction,
  483.  *          scope: this
  484.  *       },
  485.  *       { ... }
  486.  *    ]
  487.  * });
  488.      */
  489.     makeRequest : function(moduleId, requests){
  490.      if(moduleId !== '' && Ext.isArray(requests)){
  491.      var m = this.requestModule(moduleId, function(m){
  492.      if(m){
  493.      m.handleRequest(requests);
  494.      }
  495.      }, this);
  496.      }
  497.     },
  498.     
  499.     /**
  500.      * @param {string} action The module action
  501.      * @param {string} moduleId The moduleId property
  502.      */
  503.     isAllowedTo : function(action, moduleId){
  504.      var p = this.privileges,
  505.      a = p[action];
  506.     
  507.      if(p && a){
  508.      for(var i = 0, len = a.length; i < len; i++){
  509.      if(a[i] === moduleId){
  510.      return true;
  511.      }
  512.      }
  513.      }
  514.     
  515.      return false;
  516.     },
  517.     
  518.     getDesktop : function(){
  519.         return this.desktop;
  520.     },
  521.     
  522.     /**
  523.      * @param {Function} fn The function to call after the app is ready
  524.      * @param {object} scope The scope in which to execute the function
  525.      */
  526.     onReady : function(fn, scope){
  527.         if(!this.isReady){
  528.             this.on('ready', fn, scope);
  529.         }else{
  530.             fn.call(scope, this);
  531.         }
  532.     },
  533.     
  534.     onBeforeUnload : function(e){
  535.         if(this.fireEvent('beforeunload', this) === false){
  536.             e.stopEvent();
  537.         }
  538.     },
  539.     
  540.     /**
  541.      * Prevent the backspace (history -1) shortcut
  542.      */
  543.     preventBackspace : function(){
  544.      var map = new Ext.KeyMap(document, [{
  545. key: Ext.EventObject.BACKSPACE,
  546. fn: function(key, e){
  547. var t = e.target.tagName;
  548. if(t != "INPUT" && t != "TEXTAREA"){
  549. e.stopEvent();
  550. }
  551. }
  552. }]);
  553.     }
  554. });