]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - modules/ModuleBuilder/javascript/ModuleBuilder.js
Release 6.5.0
[Github/sugarcrm.git] / modules / ModuleBuilder / javascript / ModuleBuilder.js
1 /*********************************************************************************
2  * SugarCRM Community Edition is a customer relationship management program developed by
3  * SugarCRM, Inc. Copyright (C) 2004-2012 SugarCRM Inc.
4  * 
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU Affero General Public License version 3 as published by the
7  * Free Software Foundation with the addition of the following permission added
8  * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
9  * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
10  * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
11  * 
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
15  * details.
16  * 
17  * You should have received a copy of the GNU Affero General Public License along with
18  * this program; if not, see http://www.gnu.org/licenses or write to the Free
19  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  * 02110-1301 USA.
21  * 
22  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
23  * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
24  * 
25  * The interactive user interfaces in modified source and object code versions
26  * of this program must display Appropriate Legal Notices, as required under
27  * Section 5 of the GNU Affero General Public License version 3.
28  * 
29  * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
30  * these Appropriate Legal Notices must retain the display of the "Powered by
31  * SugarCRM" logo. If the display of the logo is not reasonably feasible for
32  * technical reasons, the Appropriate Legal Notices must display the words
33  * "Powered by SugarCRM".
34  ********************************************************************************/
35
36 function treeinit() {}
37
38 if(typeof('console') == 'undefined'){
39 console = {
40         log: function(message){
41
42         }}
43 }
44 (function() {
45         var sw = YAHOO.SUGAR,
46                 Event = YAHOO.util.Event,
47                 Connect = YAHOO.util.Connect,
48             Dom = YAHOO.util.Dom;
49         
50 function createTreePanel(treeData, params) {
51         var tree = new YAHOO.widget.TreeView(params.id);
52         var root = tree.getRoot();
53         addChildNodes(root, treeData);
54         
55         return tree;
56 }
57
58 function addChildNodes(parentNode, parentData) {
59         var nodes = parentData.nodes || parentData.children;
60         for (i in nodes) {
61                 if (typeof(nodes[i]) == 'object') {
62                         nodes[i].data.href = 'javascript:void(0);';
63                         var node = new YAHOO.widget.TextNode(nodes[i].data, parentNode)
64                         node.action = nodes[i].data.action;
65                         if (typeof(nodes[i].nodes) == 'object') {
66                                 addChildNodes(node, nodes[i]);
67                         }
68                 }
69         }
70 }
71
72 if (typeof(ModuleBuilder) == 'undefined') {
73         ModuleBuilder = {
74             init: function(){
75             //Check if we shoudln't be in studio and need to load the normal ajaxUI
76             var aRegex = /#.*ajaxUILoc=([^&]*)/.exec(window.location);
77             var ajaxLoc = aRegex ? aRegex[1] : false;
78             if (ajaxLoc) {
79                 window.location = "index.php?action=ajaxui#ajaxUILoc=" + ajaxLoc;
80                 return;
81             }
82                         //Setup the basic ajax request settings
83                         Connect.extraParams = {
84                                 to_pdf: true
85                         };
86                         Connect.url = 'index.php?to_pdf=1&sugar_body_only=1';
87                         Connect.method = 'POST';
88                         Connect.timeout = 300000; 
89                         
90                         //Setup and read cookie settings
91                         //Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
92                         
93                         if (SUGAR.themes.tempHideLeftCol)
94                                 SUGAR.themes.tempHideLeftCol();
95                         
96                         var Ck = YAHOO.util.Cookie;
97                         
98                         //Setup the main layout
99                         var tp = ModuleBuilder.tabPanel = new YAHOO.widget.TabView("mbtabs");
100                         tp.addTab(new YAHOO.widget.Tab({ 
101                                 label: SUGAR.language.get('ModuleBuilder', 'LBL_SECTION_MAIN'),
102                                 scroll : true,
103                                 content : "<div> </div>",
104                                 id : "center",
105                                 active : true
106                         }));
107
108                         var viewHeight = document.documentElement ? document.documentElement.clientHeight : self.innerHeight;
109             var heightOffset = $('#dcmenu').length > 0 ? $('#dcmenu').height() : $('#header').height();
110                         var mp = ModuleBuilder.mainPanel = new YAHOO.widget.Layout('mblayout', {
111                                 border: false,
112                                 height: viewHeight - heightOffset - 40,
113                                 //autoHeight: true
114                                 //frame: true,
115                                 units: [//ModuleBuilder.tree, ModuleBuilder.tabPanel,
116                                 {
117                                         position: 'center',
118                                         body : 'mbcenter',
119                                         scroll : true
120                                 },{
121                                         position: "left",
122                                         header: "Tree",
123                                         collapse: true,
124                                         width: 230,
125                                         minWidth: 100,
126                                         resize: true,
127                                         scroll : true,
128                                         body : "<div id='mbTree'/>"
129                                 },{
130                                         id: 'help',
131                                         header: SUGAR.language.get('ModuleBuilder', 'LBL_SECTION_HELP'),
132                                         position:'right',
133                                         body: 'mbhelp',
134                                         scroll: true,
135                                         width: 250,
136                                         minWidth: 200,
137                                         resize: true,
138                                         collapse: true
139                                 },{
140                                         header: SUGAR.util.getAndRemove("footerHTML").innerHTML,
141                                         position: 'bottom',
142                                         id: 'mbfooter',
143                                         height: 30,
144                                         border: false
145                                 }]
146                         });
147                         mp.render();
148                         
149                         ModuleBuilder.nextYear = new Date();
150                         ModuleBuilder.nextYear.setDate(ModuleBuilder.nextYear.getDate() + 360);
151                         
152                         var nextyear = ModuleBuilder.nextYear;
153                         
154                         if (Ck.getSub("ModuleBuilder", "helpHidden") == "true") {
155                                 mp.getUnitByPosition('right').collapse();
156                         }
157                         if (Ck.getSub("ModuleBuilder", "treeHidden") == "true") {
158                                 mp.getUnitByPosition('left').collapse();
159                         }
160                         
161                         var centerEl = mp.getUnitByPosition('center').get('wrap');
162                         tp.appendTo(centerEl);
163                         
164                         //YUI does not take the resizers into account when calculating panel size.
165                         var correctW = function(){
166                                 var w = (this.body.offsetWidth - 7) + "px";
167                                 this.body.style.width = w;
168                                 this.header.style.width = w;
169                 if (typeof Studio2 != "undefined")
170                     Studio2.resizeDivs();
171                 if (typeof resizeDDLists == "function")
172                     resizeDDLists();
173                         };
174                         mp.getUnitByPosition('right').on("resize", correctW); 
175                         mp.getUnitByPosition('right').on("collapse", function(){
176                                 Ck.setSub("ModuleBuilder", "helpHidden", "true");
177                 mp.get("element").querySelector(".yui-layout-clip-right .collapse").id = "expand_help";
178                         });
179                         mp.getUnitByPosition('right').on("expand", function(){
180                                 Ck.setSub("ModuleBuilder", "helpHidden", "false");
181                         });
182                         mp.getUnitByPosition('left').on("resize", correctW);
183                         mp.getUnitByPosition('left').on("collapse", function(){
184                                 Ck.setSub("ModuleBuilder", "treeHidden", "true");
185                 mp.get("element").querySelector(".yui-layout-clip-left .collapse").id = "expand_tree";
186                         });
187                         mp.getUnitByPosition('left').on("expand", function(){
188                                 Ck.setSub("ModuleBuilder", "treeHidden", "false");
189                         });
190                         mp.resize(true);
191                         Event.on(window, 'resize', ModuleBuilder.autoSetLayout, this, true);
192                         
193                         var tree = ModuleBuilder.tree = createTreePanel(TREE_DATA, {
194                                 id: 'mbTree'
195                         });
196                         tree.setCollapseAnim("TVSlideOut");
197                         tree.setExpandAnim("TVSlideIn");
198                         //tree.subscribe("labelClick", ModuleBuilder.handleTreeClick);
199                         tree.subscribe("clickEvent", ModuleBuilder.handleTreeClick);
200                         tree.render();
201                         
202                         //Setup Browser History
203                         var mbContent = YAHOO.util.History.getBookmarkedState('mbContent');
204                         
205                         if (ModuleBuilder.mode == 'mb') {
206                                 mp.getUnitByPosition('left').header.firstChild.innerHTML = SUGAR.language.get('ModuleBuilder', 'LBL_SECTION_PACKAGES');
207                                 mbContent = mbContent ? mbContent : 'module=ModuleBuilder&action=package&package=';
208                         }
209                         else if (ModuleBuilder.mode == 'studio') {
210                                 ModuleBuilder.MBpackage = ''; // set to empty so other views can recognize that dealing with an deployed, rather than undeployed, module
211                                 mp.getUnitByPosition('left').header.firstChild.innerHTML = SUGAR.language.get('ModuleBuilder', 'LBL_SECTION_MODULES');
212                                 mbContent = mbContent ? mbContent :'module=ModuleBuilder&action=wizard';
213                         }
214                         else if (ModuleBuilder.mode == 'dropdowns') {
215                                 mp.getUnitByPosition('left').header.firstChild.innerHTML = SUGAR.language.get('ModuleBuilder', 'LBL_SECTION_DROPDOWNS');
216                                 mbContent = mbContent ? mbContent : 'module=ModuleBuilder&action=dropdowns';
217                         }
218                         else {
219                                 mp.getUnitByPosition('left').collapse(false);
220                                 mbContent = mbContent ? mbContent : 'module=ModuleBuilder&action=home';
221                         }
222
223                         YAHOO.util.History.register('mbContent', mbContent, ModuleBuilder.navigate);
224             YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
225                         ModuleBuilder.getContent(mbContent);
226                         
227                         if (SUGAR.themes.tempHideLeftCol) SUGAR.themes.tempHideLeftCol();
228                         ModuleBuilder.autoSetLayout();
229                         
230                         ModuleBuilder.tabPanel.on('activeTabChange', function(e) {
231                                 ModuleBuilder.helpLoad( e.newValue.get("id") ) ;
232                         });
233                         
234                         if (Dom.get("HideHandle")){
235                                 if (SUGAR.themes.tempHideLeftCol){
236                                         SUGAR.themes.tempHideLeftCol();
237                                         }
238                         }
239             //We need to add ID's to the collapse buttons for automated testing
240             Dom.getElementsByClassName("collapse", "div", mp.getUnitByPosition('left').header)[0].id = "collapse_tree";
241             Dom.getElementsByClassName("collapse", "div", mp.getUnitByPosition('right').header)[0].id = "collapse_help";
242
243                 },
244                 //Empty layout manager
245                 layoutValidation: {
246                         popup_window: null,
247                         popup: function(){
248                                 ModuleBuilder.layoutValidation.popup_window = new YAHOO.widget.SimpleDialog("emptyLayout", {
249                                         width: "400px",
250                                         draggable: true,
251                                         constraintoviewport: true,
252                                         modal: true,
253                                         fixedcenter: true,
254                                         text: SUGAR.language.get('ModuleBuilder', 'ERROR_MINIMUM_FIELDS'),
255                                         bodyStyle: "padding:5px",
256                                         buttons: [{
257                                                 text: SUGAR.language.get('ModuleBuilder', 'LBL_BTN_CLOSE'),
258                                                 isDefault:true,
259                                                 handler: function(){
260                                                         ModuleBuilder.layoutValidation.popup_window.hide()
261                                                 }
262                                         }]
263                                 });
264                                 ModuleBuilder.layoutValidation.popup_window.render(document.body);
265                                 ModuleBuilder.layoutValidation.popup_window.show();
266                         }
267                 },
268                 //Layout history manager
269                 history: {
270                         popup_window: false,
271                         reverted: false,
272                         params: { },
273                         browse: function(module, layout, subpanel){
274                                 subpanel = subpanel ? subpanel : "";
275                                 if (!module && ModuleBuilder.module != "undefined") {
276                                         module = ModuleBuilder.module;
277                                 }   
278                                 if (!ModuleBuilder.history.popup_window) {
279                                         ModuleBuilder.history.popup_window = new YAHOO.SUGAR.AsyncPanel('histWindow', {
280                                                 width: 300,
281                                                 draggable: true,
282                                                 close: true,
283                                                 constraintoviewport: true,
284                                                 fixedcenter: false
285                                         });
286                                 }
287                                 var module_str = module;
288                                 if(typeof SUGAR.language.languages['app_list_strings']['moduleList'][module] != 'undefined'){
289                                         module_str = SUGAR.language.languages['app_list_strings']['moduleList'][module];
290                                 } 
291                                 ModuleBuilder.history.popup_window.setHeader( module_str + ' : ' + SUGAR.language.get('ModuleBuilder', 'LBL_' + layout.toUpperCase()) + SUGAR.language.get('ModuleBuilder', 'LBL_HISTORY_TITLE'));
292                                 ModuleBuilder.history.popup_window.setBody("test");
293                                 ModuleBuilder.history.popup_window.render(document.body);
294                                 ModuleBuilder.history.params = {
295                                         module: 'ModuleBuilder',
296                                         histAction: 'browse',
297                                         action: 'history',
298                                         view_package: ModuleBuilder.MBpackage,
299                                         view_module: module,
300                                         view: layout,
301                                         subpanel: subpanel
302                                 };
303                                 ModuleBuilder.history.popup_window.load(ModuleBuilder.paramsToUrl(ModuleBuilder.history.params));
304                                 ModuleBuilder.history.popup_window.show();
305                                 ModuleBuilder.history.popup_window.center();
306                         },
307                         preview: function(module, layout, id, subpanel) {
308                                 var prevPanel =  ModuleBuilder.findTabById('preview:' + id);
309                                 if (!prevPanel) {
310                                         ModuleBuilder.history.params = {
311                                                 module: 'ModuleBuilder',
312                                                 histAction: 'preview',
313                                                 action: 'history',
314                                                 view_package: ModuleBuilder.MBpackage,
315                                                 view_module: module,
316                                                 view: layout,
317                                                 sid: id,
318                                                 subpanel: subpanel
319                                         };
320                                         prevPanel = new YAHOO.SUGAR.ClosableTab({
321                                                 dataSrc: Connect.url + "&" + ModuleBuilder.paramsToUrl(ModuleBuilder.history.params),
322                                                 label: SUGAR.language.get("ModuleBuilder", "LBL_MB_PREVIEW"),
323                                                 id: 'preview:' + id,
324                                                 scroll: true,
325                                                 cacheData: true,
326                                                 active :true
327                                         }, ModuleBuilder.tabPanel);
328                                         prevPanel.closable = true;
329                                         ModuleBuilder.tabPanel.addTab(prevPanel);
330                                 } else {
331                                         ModuleBuilder.tabPanel.set("activeTab", prevPanel);
332                                 }
333                                 
334                         },
335                         revert: function(module, layout, id, subpanel){
336                                 var prevTab = ModuleBuilder.tabPanel.getTabIndex("preview:" + id);
337                                 if(prevTab) ModuleBuilder.tabPanel.removeTab(prevTab);
338                                 
339                                 ModuleBuilder.history.params = {
340                                         module: 'ModuleBuilder',
341                                         histAction: 'restore',
342                                         action: 'history',
343                                         view_package: ModuleBuilder.MBpackage,
344                                         view_module: module,
345                                         view: layout,
346                                         sid: id,
347                                         subpanel: subpanel
348                                 }
349                                 ModuleBuilder.asyncRequest(ModuleBuilder.history.params, function(){
350                                         ModuleBuilder.history.reverted = true;
351                                         ModuleBuilder.getContent(ModuleBuilder.contentURL);
352                                         ModuleBuilder.state.isDirty = true;
353                                 });
354                         },
355                         cleanup: function() {
356                                 if (ModuleBuilder.history.reverted && ModuleBuilder.history.params.histAction) {
357                                         ModuleBuilder.history.params.histAction = 'unrestore';
358                                         ModuleBuilder.asyncRequest({params: ModuleBuilder.history.params});
359                                 }
360                                 ModuleBuilder.history.params = { };
361                                 ModuleBuilder.history.reverted = false;
362                         },
363                         update: function() {
364                                 if (ModuleBuilder.history.popup_window && ModuleBuilder.history.popup_window.cfg.getProperty("visible")) {
365                                         var historyButton = YAHOO.util.Dom.get('historyBtn');
366                                         if (historyButton) {
367                                                 historyButton.onclick();
368                                         } else {
369                                                 ModuleBuilder.history.popup_window.hide();
370                                         }
371                                 }
372                         }
373                 },
374                 state: {
375                         isDirty: false,
376                         saving: false,
377             hideFailedMesage: false,
378                         intended_view: {
379                                 url: null,
380                                 successCall: null
381                         },
382                         current_view: {
383                                 url: null,
384                                 successCall: null
385                         },
386                         save_url_for_current_view: null,
387                         popup_window: null,
388                         setupState: function(){
389                                 //ModuleBuilder.state.popup();
390                                 document.body.setAttribute("onclose", "ModuleBuilder.state.popup(); ModuleBuilder.state.popup_window.show()");
391                                 return;
392                         },
393                         onSaveClick: function(){
394                                 //set dirty = false
395                                 //call the save method of the current view.
396                                 //call the intended action.
397                                 ModuleBuilder.state.isDirty = false;
398                                 var saveBtn = document.getElementById("saveBtn");
399                                 if (!saveBtn) {
400                                         var mbForm = document.forms[1];
401                                         if (mbForm)
402                                                 var mbButtons = mbForm.getElementsByTagName("input");
403                                         if (mbButtons) {
404                                                 for (var button = 0; button < mbButtons.length; button++) {
405                                                         var name = mbButtons[button].getAttribute("name");
406                                                         if (name && (name.toUpperCase() == "SAVEBTN" || name.toUpperCase() == "LSAVEBTN")) {
407                                                                 saveBtn = mbButtons[button];
408                                                                 break;
409                                                         }
410                                                 }
411                                         }
412                                         else {
413                                                 alert("Could not find the save action for this view.");
414                                         }
415                                 }
416                                 if (saveBtn) {
417                                         //After the save call completes, load the next page
418                                         ModuleBuilder.state.saving = true;
419                                         eval(saveBtn.getAttributeNode('onclick').value);
420                                 }
421                                 ModuleBuilder.state.popup_window.hide();
422                         },
423                         onDontSaveClick: function(){
424                                 //set dirty to false
425                                 //call the intended action.
426                                 ModuleBuilder.state.isDirty = false;
427                                 ModuleBuilder.history.cleanup();
428                                 ModuleBuilder.getContent(ModuleBuilder.state.intended_view.url, ModuleBuilder.state.intended_view.successCall);
429                                 ModuleBuilder.state.popup_window.hide();
430                         },
431                         loadOnSaveComplete: function() {
432                                 ModuleBuilder.state.saving = false;
433                                 ModuleBuilder.getContent(ModuleBuilder.state.intended_view.url, ModuleBuilder.state.intended_view.successCall);
434                         },
435                         popup: function(){
436                 if(false == YAHOO.lang.isObject(ModuleBuilder.state.popup_window) || ModuleBuilder.state.popup_window.id != 'confirmUnsaved'){
437                     ModuleBuilder.state.popup_window = new YAHOO.widget.SimpleDialog("confirmUnsaved", {
438                      width: "400px",
439                      draggable: true,
440                      constraintoviewport: true,
441                      modal: true,
442                      fixedcenter: true,
443                      text: SUGAR.language.get('ModuleBuilder', 'LBL_CONFIRM_DONT_SAVE'),
444                      bodyStyle: "padding:5px",
445                      buttons: [{
446                         text: SUGAR.language.get('ModuleBuilder', 'LBL_BTN_DONT_SAVE'),
447                         handler: ModuleBuilder.state.onDontSaveClick
448                      }, {
449                         text: SUGAR.language.get('ModuleBuilder', 'LBL_BTN_CANCEL'),
450                         isDefault:true,
451                         handler: function(){
452                             ModuleBuilder.state.popup_window.hide()
453                         }
454                      },{
455                         text: SUGAR.language.get('ModuleBuilder', 'LBL_BTN_SAVE_CHANGES'),
456                         handler: ModuleBuilder.state.onSaveClick
457                         }]
458                     });
459                     ModuleBuilder.state.popup_window.setHeader(SUGAR.language.get('ModuleBuilder', 'LBL_CONFIRM_DONT_SAVE_TITLE'));
460                 }
461                 if(ModuleBuilder.disablePopupPrompt != 1){
462                     ModuleBuilder.state.popup_window.render(document.body);
463                 }else{
464                     ModuleBuilder.state.onDontSaveClick();
465                 }
466                         }
467                 },
468         copyFromView: function(module, layout){
469             var url = ModuleBuilder.contentURL;
470             ModuleBuilder.getContent(url+"&copyFromEditView=true");
471              ModuleBuilder.contentURL = url;
472             ModuleBuilder.state.intended_view.url = url;
473             ModuleBuilder.state.isDirty = true;
474         },
475                 //AJAX Navigation Functions
476                 navigate : function(url) {
477                         //Check if we are just registering the url
478                         if (url != ModuleBuilder.contentURL) {
479                                 ModuleBuilder.getContent(url);
480                         }
481                 },
482                 getContent: function(url, successCall){
483                         if (!url) return;
484                         
485                         if (url.substring(0, 11) == "javascript:")
486                         {
487                                 eval(url.substring(11));
488                                 return;
489                         }
490                         
491                         //save a pointer to intended action
492                         ModuleBuilder.state.intended_view.url = url;
493                         ModuleBuilder.state.intended_view.successCall = successCall;
494                         if(ModuleBuilder.state.isDirty){ //prompt to save current data.
495                                 //check if we are editing a property of the current view (such views open up in new tabs)
496                                 //if so we leave the state dirty and return
497                                 temp_url = url.toLowerCase();
498                                 if(null == temp_url.match(/&action=editproperty/)){
499                                         ModuleBuilder.state.popup();
500                                         ModuleBuilder.state.popup_window.show();
501                                         return;
502                                 }
503
504                         }else{
505                                 ModuleBuilder.state.current_view.url = url;
506                                 ModuleBuilder.state.current_view.successCall = successCall;
507                         }
508                         
509                         ModuleBuilder.contentURL =  url;
510                         if (typeof(successCall) != 'function') {
511                                 if (ModuleBuilder.callInProgress)
512                                         return;
513                                 ModuleBuilder.callInProgress = true;
514                                 successCall = ModuleBuilder.updateContent;
515                         }
516                         ModuleBuilder.asyncRequest(url, successCall);
517                 },
518                 updateContent: function(o){
519                         ModuleBuilder.callInProgress = false;
520                         //Check if a save action was called and now we need to move-on
521                         if (ModuleBuilder.state.saving) {
522                                 ModuleBuilder.state.loadOnSaveComplete();
523                                 return;
524                         }
525                         ajaxStatus.flashStatus(SUGAR.language.get('app_strings', 'LBL_REQUEST_PROCESSED'), 2000);
526                         if(ModuleBuilder.checkForErrors(o))
527                 return false; 
528                         
529                         try {
530                         var ajaxResponse = YAHOO.lang.JSON.parse((o.responseText));
531                         } catch (err) {
532                                 YAHOO.SUGAR.MessageBox.show({
533                     title: SUGAR.language.get('ModuleBuilder', 'ERROR_GENERIC_TITLE'),
534                     msg: o.responseText,
535                     width: 500
536                 });
537                                 return false;
538                         }
539                         
540                         
541                         if (ajaxResponse.tpl){
542                                 var t = new YAHOO.SUGAR.Template(ajaxResponse.tpl);
543                                 ModuleBuilder.ajaxData = ajaxResponse.data;
544                                 ModuleBuilder.tabPanel.getTab(0).set(t.exec(ajaxResponse.data));
545                                 SUGAR.util.evalScript(t.exec(ajaxResponse.data));
546                                 return true;
547                         }
548                         
549                         for (var maj in ajaxResponse) {
550                                 var name = 'mb' + maj;
551                                 var comp = ModuleBuilder.mainPanel.getUnitById(maj);
552                                 if (!comp) {
553                                         var tabs = ModuleBuilder.tabPanel.get("tabs");
554                                         for (i in tabs) {
555                                                 if (tabs[i].get && tabs[i].get("id") == maj)
556                                                 comp = tabs[i];
557                                         }
558                                 }
559                                 
560                                 if (name == 'mbwest') { //refresh package_tree!
561                                         var tree = ModuleBuilder.tree;
562                                         var root = tree.root;
563                                         tree.maxAnim = 0;
564                                         tree.collapseAll();
565                                         while (root.hasChildren()) {
566                                                 tree.removeNode(root.children[0], true);
567                                         }
568                                         addChildNodes(root, ajaxResponse.west.content.tree_data);
569                                         tree.maxAnim = 2;
570                                         tree.render();
571                                 }
572                                 else {
573                                         if (!comp) {
574                                                 if(ajaxResponse[maj].action == 'deactivate') continue;
575                                                 comp = new YAHOO.SUGAR.ClosableTab({
576                                                         content: "<div class='bodywrapper'><script>ModuleBuilder.scriptTest=true;</script>" + ((maj == 'center') ? "<div>" + ajaxResponse[maj].crumb + "</div>" :"")
577                                                                  + ajaxResponse[maj].content + "</div>",
578                                                         label: ajaxResponse[maj].title,
579                                                         id: maj,
580                                                         scroll: true,
581                                                         closable: true,
582                                                         active :true
583                                                 }, ModuleBuilder.tabPanel);
584                                                 comp.closable = true;
585                                                 ModuleBuilder.scriptTest = false;
586                                                 ModuleBuilder.tabPanel.set("activeTab", comp);
587                                                 ModuleBuilder.tabPanel.addTab(comp);
588                                                 //Text if the browser automatically evaluated the content's script tags or not. If not, manually evaluate them.
589                                                 if (!ModuleBuilder.scriptTest)
590                                                         SUGAR.util.evalScript(ajaxResponse[maj].content);
591                                         } else {
592                                                 //Store Center pane changes in browser history
593                                                 YAHOO.util.History.navigate('mbContent', ModuleBuilder.contentURL);
594                                                 if (name == 'mbcenter') {
595                                                         ModuleBuilder.closeAllTabs();
596                                                         comp = ModuleBuilder.tabPanel.getTab(0);
597                                                 }
598                                                 ModuleBuilder.tabPanel.set("activeTab", comp);
599                                                 comp.set('content', "<div class='bodywrapper'><div>" + ajaxResponse[maj].crumb + "</div>" + ajaxResponse[maj].content + "</div>");
600                                                 if (ajaxResponse[maj].title != "no_change")
601                                                         comp.set('label', ajaxResponse[maj].title);
602                                                 SUGAR.util.evalScript(ajaxResponse[maj].content);       
603                                         }
604                                 }
605                                 ModuleBuilder.history.update();
606                         }
607                 },
608                 checkForErrors: function(o){
609                         if (SUGAR.util.isLoginPage(o.responseText))
610                                 return true;
611                         if (o.responseText.substr(0, 1) == "<") {
612                 YAHOO.SUGAR.MessageBox.show({
613                                         title: SUGAR.language.get('ModuleBuilder', 'ERROR_GENERIC_TITLE'),
614                                         msg: o.responseText,
615                                         width: 500
616                                 });
617                                 return true;
618             }
619                         
620                         
621                         return false;
622                 },
623                 submitForm: function(formname, successCall){
624                         ajaxStatus.showStatus(SUGAR.language.get('ModuleBuilder', 'LBL_AJAX_LOADING'));
625                         if (typeof(successCall) == 'undefined') {
626                                 successCall = ModuleBuilder.updateContent;
627                         }
628                         else {
629                                 ModuleBuilder.callLock = true;
630                         }
631                         Connect.setForm(document.getElementById(formname) || document.forms[formname]);
632                         Connect.asyncRequest(
633                             Connect.method, 
634                             Connect.url, 
635                             {success: successCall, failure: ModuleBuilder.failed}
636                         );
637                 },
638                 setMode: function(reqMode){
639                         ModuleBuilder.mode = reqMode;
640                 },
641                 main: function(type){
642                         document.location.href = 'index.php?module=ModuleBuilder&action=index&type=' + type;
643                 },
644                 failed: function(o){
645             if(!ModuleBuilder.state.hideFailedMesage){
646                 ajaxStatus.flashStatus(SUGAR.language.get('ModuleBuilder', 'LBL_AJAX_FAILED_DATA'), 2000);
647             }
648                 },
649                 //Wizard Functions
650                 buttonDown: function(button, name, list){
651                         if (typeof(name) != 'undefined') {
652                                 for (i in ModuleBuilder.buttons[list]) {
653                                         ModuleBuilder.buttons[list][i].className = 'wizardButton';
654                                 }
655                                 ModuleBuilder.buttonSelect(name, list);
656                         }
657                         button.className = 'wizardButtonDown';
658
659                 },
660                 buttonOver: function(button){
661                         button.className = 'button';
662                 },
663                 buttonOut: function(button, name, list){
664                         if (typeof(name) != 'undefined') {
665                                 if (ModuleBuilder.buttonGetSelected(list) != name) {
666                                         button.className = 'wizardButton'
667                                 }
668                         }
669                         else {
670                                 button.className = 'wizardButton'
671                         }
672
673                 },
674                 buttonAdd: function(id, name, list){
675                         if (typeof(ModuleBuilder.buttons[list]) == 'undefined') {
676                                 ModuleBuilder.buttons[list] = {};
677
678                         }
679                         ModuleBuilder.buttons[list][name] = document.getElementById(id);
680
681                 },
682                 buttonGetSelected: function(list){
683                         if (typeof(ModuleBuilder.selected[list]) == 'undefined') {
684                                 return false;
685                         }
686                         return ModuleBuilder.selected[list];
687                 },
688                 buttonSelect: function(name, list){
689                         ModuleBuilder.selected[list] = name;
690                 },
691                 buttonToForm: function(form, field, list){
692                         var theField = eval('document.' + form + '.' + field);
693                         theField.value = ModuleBuilder.buttonGetSelected(list);
694                 },
695
696                 getTitle: function(title, breadCrumb){
697                         return "<h2>" + title + "</h2><br>" + breadCrumb;
698                 },
699                 closeAllTabs: function() {
700                         var tabs = ModuleBuilder.tabPanel.get('tabs');
701                         for (var i = tabs.length - 1; i > -1; i--) {
702                                 var tab = tabs[i];
703                                 if (tab.close) {
704                                         tab.close();
705                                 }
706                         }
707                 },
708                 //Help Functions
709                 helpRegister: function(name){
710                         var formname = 'document.' + name;
711                         var form = eval(formname);
712                         var i = 0;
713                         for (i = 0; i < form.elements.length; i++) {
714                                 if (typeof(form.elements[i].type) != 'undefined' && typeof(form.elements[i].name) != 'undefined' && form.elements[i].type != 'hidden') {
715                                         form.elements[i].onmouseover = function(){
716                                                 ModuleBuilder.helpToggle(this.name)
717                                         };
718                                         form.elements[i].onmouseout = function(){
719                                                 ModuleBuilder.helpToggle('default')
720                                         };
721
722                                 }
723                         }
724                 },
725                 helpUnregisterByID: function (id){
726                         var elm = document.getElementById(id);
727                         if (elm) {
728                         elm.onmouseover = function() {};
729                         elm.onmouseout = function() {};
730                         }
731                         return;
732                 },
733                 helpRegisterByID: function(name, tag){
734                         var parent = document.getElementById(name);
735                         var children = parent.getElementsByTagName(tag);
736                         for (var i = 0; i < children.length; i++) {
737                                 if (children[i].id != 'undefined') {
738                                         children[i].onmouseover = function(){
739                                                 ModuleBuilder.helpToggle(this.id)
740                                         };
741                                         //children[i].onmouseover = function(){alert(this.id)};
742                                         children[i].onmouseout = function(){
743                                                 ModuleBuilder.helpToggle('default')
744                                         };
745                                 }
746                         }
747                 },
748                 helpSetup: function(group, def, panel){
749                         if (!ModuleBuilder.panelHelp) ModuleBuilder.panelHelp = [];
750                         
751                         // setup the linkage between this tab/panel and the relevant help
752                         var id = ModuleBuilder.tabPanel.get("activeTab").get("id")  ;
753                         ModuleBuilder.panelHelp [ id ] = { lang: group , def: def } ;
754                          
755                         // get the help text if required
756                         if ( ! ModuleBuilder.AllHelpLang ) ModuleBuilder.AllHelpLang = SUGAR.language.get('ModuleBuilder', 'help');
757
758                         if (group && def) {
759                                 ModuleBuilder.helpLang = ModuleBuilder.AllHelpLang[group];
760                                 ModuleBuilder.helpDefault = def;
761                         } 
762                         
763                         ModuleBuilder.helpToggle('default');
764                 },
765                 helpLoad: function(panelId){
766                         if (!ModuleBuilder.panelHelp) return;
767                         
768                         if ( ! ModuleBuilder.AllHelpLang ) ModuleBuilder.AllHelpLang = SUGAR.language.get('ModuleBuilder', 'help');
769                         
770                         if ( ModuleBuilder.panelHelp [ panelId ] )
771                         {
772                                 ModuleBuilder.helpLang = ModuleBuilder.AllHelpLang[ ModuleBuilder.panelHelp [ panelId ].lang ];
773                                 ModuleBuilder.helpDefault = ModuleBuilder.panelHelp [ panelId ].def ;
774                                 ModuleBuilder.helpToggle('default');
775                         }
776                 },
777                 helpToggle: function(name){
778                         if (name == 'default')
779                                 name = ModuleBuilder.helpDefault;
780                         if (ModuleBuilder.helpLang != null && typeof(ModuleBuilder.helpLang[name]) != 'undefined') {
781                                 document.getElementById('mbhelp').innerHTML = ModuleBuilder.helpLang[name];
782                         }
783                 },
784                 handleSave: function(form, callBack){
785                         if (check_form(form)) {
786                                 ModuleBuilder.state.isDirty=false;
787                                 ModuleBuilder.submitForm(form, callBack);
788                         }
789                 },
790                 //Tree Functions
791                 handleTreeClick: function(o) {
792                         var node = o.node;
793                         ModuleBuilder.getContent(node.data.action);
794                         return false;
795                 },
796                 treeSubscribe:function(tree){
797                         tree.subscribe("labelClick", ModuleBuilder.treeLabelClick);
798                 },
799                 treeRefresh:function(type){
800                         ModuleBuilder.getContent('module=ModuleBuilder&action=ViewTree&tree=' + type);
801                 },
802                 //MB Specific
803                 addModule: function(MBpackage){
804                         ModuleBuilder.getContent('module=ModuleBuilder&action=module&view_package=' + MBpackage);
805                 },
806                 viewModule: function(MBpackage, module){
807                         ModuleBuilder.getContent('module=ModuleBuilder&action=module&view_package=' + MBpackage + '&view_module=' + module);
808                 },
809                 packageDelete: function(MBpackage){
810                         ajaxStatus.showStatus(SUGAR.language.get('ModuleBuilder', 'LBL_AJAX_DELETING'));
811                         if (confirm(SUGAR.language.get('ModuleBuilder', 'LBL_JS_REMOVE_PACKAGE'))) {
812                                 ModuleBuilder.getContent('module=ModuleBuilder&action=DeletePackage&package=' + MBpackage);
813                                 var node = ModuleBuilder.tree.getNodeByProperty('id', 'package_tree/' + MBpackage);
814                                 if (node) ModuleBuilder.tree.removeNode(node, true);
815                         }
816                 },
817                 packagePublish: function(form){
818                         if (check_form(form)) {
819                                 ajaxStatus.showStatus(SUGAR.language.get('ModuleBuilder', 'LBL_AJAX_BUILDPROGRESS'));
820                                 ModuleBuilder.submitForm(form, ModuleBuilder.packageBuild);
821                         }
822                 },
823                 packageBuild: function(o){
824                         //make sure no user changes were made
825                         document.CreatePackage.action.value = 'BuildPackage';
826                         document.CreatePackage.submit();
827                         ajaxStatus.flashStatus(SUGAR.language.get('app_strings', 'LBL_REQUEST_PROCESSED'), 2000);
828                         ModuleBuilder.callLock = false;
829                 },
830                 packageDeploy: function(form, deployed){
831             var confirmed = true;
832             if (deployed){
833                         confirmed = confirm(SUGAR.language.get('ModuleBuilder', 'LBL_JS_DEPLOY_PACKAGE'));
834             }
835                 if (confirmed && check_form(form)) {
836                                 ajaxStatus.showStatus(SUGAR.language.get('ModuleBuilder', 'LBL_AJAX_DEPLOYPROGRESS'));
837                                 ModuleBuilder.submitForm(form, ModuleBuilder.packageInstall);
838                         }
839                 },
840                 packageInstall: function(o){
841                         //make sure no user changes were made
842                         document.CreatePackage.action.value = 'displaydeploy';
843                         ModuleBuilder.callLock = false;
844                         ModuleBuilder.submitForm('CreatePackage', ModuleBuilder.packageInstallCleanup);
845                 },
846                 packageInstallCleanup: function(o){
847                         //make sure no user changes were made
848                         document.CreatePackage.action.value = 'displaydeploy';
849                         ModuleBuilder.callLock = false;
850                         ModuleBuilder.submitForm('CreatePackage');
851                 },
852                 beginDeploy: function(p){
853                         ModuleBuilder.asyncRequest('module=ModuleBuilder&action=DeployPackage&package=' + p, ModuleBuilder.deployComplete);
854                 },
855                 deployComplete: function(o){
856                         var resp = o.responseText;
857                         
858                         //check if the deploy completed
859                         if (!resp.match(/^\s*(\s*(Table already exists : [\w_]*)(<br>)*\s*)*complete$/m))
860                         {
861                                         //Unknown error occured, warn the user
862                                         alert(SUGAR.language.get("ModuleBuilder", "LBL_DEPLOY_FAILED"));
863                         }
864                         //Cleanup in the background
865                         ModuleBuilder.asyncRequest(
866                             'module=Administration&action=RebuildRelationship&silent=true',
867                                 function(){}
868                         );
869                         ModuleBuilder.asyncRequest(
870                                 'module=Administration&action=RebuildDashlets&silent=true',
871                                 function(){}                    
872                         );
873                         
874                         ModuleBuilder.failed = function(){};
875             ModuleBuilder.state.hideFailedMesage = true;
876                         //Reload the page
877                         window.setTimeout("window.location.assign(window.location.href.split('#')[0])", 2000);
878                         
879                         
880                 },
881                 packageExport: function(form){
882                         if (check_form(form)) {
883                                 ajaxStatus.showStatus(SUGAR.language.get('ModuleBuilder', 'LBL_AJAX_BUILDPROGRESS'));
884                                 ModuleBuilder.submitForm(form, ModuleBuilder.packageExportProject);
885                         }
886                 },
887                 packageExportProject: function(o){
888                         //make sure no user changes were made
889                         document.CreatePackage.action.value = 'ExportPackage';
890                         document.CreatePackage.submit();
891                         ajaxStatus.flashStatus(SUGAR.language.get('app_strings', 'LBL_REQUEST_PROCESSED'), 2000);
892                         ModuleBuilder.callLock = false;
893                 },
894                 moduleDelete: function(MBpackage, module){
895                         ajaxStatus.showStatus(SUGAR.language.get('ModuleBuilder', 'LBL_AJAX_DELETING'));
896                         if (confirm(SUGAR.language.get('ModuleBuilder', 'LBL_JS_REMOVE_MODULE'))) {
897                                 ModuleBuilder.getContent('module=ModuleBuilder&action=DeleteModule&package=' + MBpackage + '&view_module=' + module);
898                                 var node = ModuleBuilder.tree.getNodeByProperty('id', 'package_tree/' + MBpackage + '/' + module);
899                                 if (node) ModuleBuilder.tree.removeNode(node, true);
900                         }
901                 },
902                 moduleViewFields: function(o){
903
904                         ModuleBuilder.callLock = false;
905
906                         ModuleBuilder.getContent('module=ModuleBuilder&action=modulefields&view_package=' + ModuleBuilder.MBpackage + 
907                                 '&view_module=' + ModuleBuilder.module);
908                 },
909                 moduleLoadField: function(name, type){
910                         if (typeof(type) == 'undefined')
911                                 type = 0;
912                         if (typeof(formsWithFieldLogic) != 'undefined')
913                                 formsWithFieldLogic = 'undefined';
914                         ModuleBuilder.getContent('module=ModuleBuilder&action=modulefield&view_package=' + ModuleBuilder.MBpackage + 
915                                 '&view_module=' + ModuleBuilder.module + '&field=' + name + '&type=' + type);
916                 },
917                 moduleLoadLabels: function(type){
918                         if (typeof(type) == 'undefined')
919                                 type = 0;
920                         else
921                                 if (type == "studio") {
922                                         ModuleBuilder.getContent('module=ModuleBuilder&action=editLabels&view_module=' + ModuleBuilder.module);
923                                 }
924                                 else
925                                         if (type == "mb") {
926                                                 ModuleBuilder.getContent('module=ModuleBuilder&action=modulelabels&view_package=' + ModuleBuilder.MBpackage + '&view_module=' + ModuleBuilder.module + '&type=' + type);
927                                         }
928                 },
929                 moduleViewRelationships: function(o){
930                         ModuleBuilder.callLock = false;
931                         ModuleBuilder.getContent('module=ModuleBuilder&action=relationships&view_package=' + ModuleBuilder.MBpackage + '&view_module=' + ModuleBuilder.module);
932                 },
933                 moduleLoadRelationship2: function(name, resetLabel, checkLanguage) {
934                         if (resetLabel && Dom.get('rhs_label')) {
935                                 Dom.get('rhs_label').value = "";
936                         }
937                         var panel = ModuleBuilder.findTabById('relEditor');
938                         if (!panel) {
939                                 panel = new YAHOO.SUGAR.ClosableTab({
940                                         label: SUGAR.language.get("ModuleBuilder", "LBL_RELATIONSHIP_EDIT"),
941                                         id: 'relEditor',
942                                         scroll: true,
943                                         cacheData: true,
944                                         active :true
945                                 }, ModuleBuilder.tabPanel);
946                                 ModuleBuilder.tabPanel.addTab(panel);
947                         } else {
948                                 ModuleBuilder.tabPanel.set("activeTab", panel);
949                         }
950                         var rtField = Dom.get('relationship_type_field');
951                         var relType = rtField ? rtField.options[rtField.selectedIndex].value: "";
952                         if (name == "") {
953                                 name = Dom.get('rel_name_id') ? Dom.get('rel_name_id').value : "";
954                         }
955                         var params = {
956                                 module: 'ModuleBuilder',
957                                 action: 'relationship',
958                                 view_package: ModuleBuilder.MBpackage,
959                                 view_module: ModuleBuilder.module,
960                                 relationship_name: name,
961                                 relationship_type: relType,
962                                 lhs_module: Dom.get('lhs_mod_field') ? Dom.get('lhs_mod_field').value : document.forms.relform ? document.forms.relform.lhs_module.value : "",
963                                 rhs_module: Dom.get('rhs_mod_field') ? Dom.get('rhs_mod_field').value : "",
964                                 lhs_label:  Dom.get('lhs_label')     ? Dom.get('lhs_label').value     : "",
965                                 rhs_label:  Dom.get('rhs_label')     ? Dom.get('rhs_label').value     : "",
966                                 json: false,
967                                 id:'relEditor'
968                         };
969                         if(checkLanguage){
970                                 params['relationship_lang'] = Dom.get('relationship_lang').value;
971                                 params['ajaxLoad'] = '1';
972                         }
973                         ModuleBuilder.asyncRequest(params, function(o) {
974                                 ajaxStatus.hideStatus();
975                                 var tab = ModuleBuilder.findTabById('relEditor');
976                                 tab.set("content", o.responseText);
977                                 SUGAR.util.evalScript(o.responseText);
978                         });
979                 },
980                 moduleDropDown: function(name, field){
981                         ModuleBuilder.getContent('module=ModuleBuilder&action=dropdown&view_package=' + ModuleBuilder.MBpackage + '&view_module=' + ModuleBuilder.module + '&dropdown_name=' + name + '&field=' + field);
982                 },
983                 moduleViewLayouts: function(o){
984                         ModuleBuilder.callLock = false;
985                         ModuleBuilder.getContent('module=ModuleBuilder&MB=1&action=wizard&view_package=' + ModuleBuilder.MBpackage + '&view_module=' + ModuleBuilder.module);
986                 },
987                 findTabById : function(id) {
988                         var tabs = ModuleBuilder.tabPanel.get("tabs");
989                         for (var i = 0; i < tabs.length; i++) {
990                                 if (tabs[i].get("id") == id)
991                                         return tabs[i];
992                         }
993                         return null;
994                 }, 
995                 autoSetLayout: function(){
996                         var mp = ModuleBuilder.mainPanel;
997                         var c = Dom.get("mblayout");
998                         mp.set("height", Dom.getViewportHeight() - Dom.getY(c) - 30);
999                         mp.set("width", Dom.getViewportWidth() - 40);
1000                         mp.resize(true);
1001                         var tabEl = ModuleBuilder.tabPanel.get("element");
1002                         Dom.setStyle(tabEl.firstChild.nextSibling, "overflow-y", "auto");
1003                         Dom.setStyle(tabEl.firstChild.nextSibling, "height", tabEl.offsetHeight - ModuleBuilder.tabPanel.get("element").firstChild.offsetHeight - 5 + "px");
1004                         //Resize editor layouts
1005                         if (document.getElementById('toolbox')) Studio2.resizeDivs();
1006                         if (document.getElementById('edittabs')) resizeDDLists();
1007                 },
1008                 paramsToUrl : function (params) {
1009                         url = "";
1010                         for (i in params) {
1011                 url += i + "=" + params[i] + "&";
1012                         }
1013                         return url;
1014                 },
1015                 asyncRequest : function(params, callback) {
1016                         var url;
1017                         if (typeof params == "object") {
1018                                 url = ModuleBuilder.paramsToUrl(params);
1019                         } else {
1020                                 url = params;
1021                         }
1022                         ajaxStatus.showStatus(SUGAR.language.get('app_strings', 'LBL_LOADING_PAGE'));
1023                         Connect.asyncRequest(
1024                             Connect.method, 
1025                             Connect.url + '&' + url, 
1026                             {success: callback, failure: ModuleBuilder.failed}
1027                         );
1028                 },
1029                 refreshGlobalDropDown: function(o){
1030                         // just clear the callLock; the convention is that this is done in a handler rather than in updateContent
1031                         ModuleBuilder.callLock = false;
1032                         ModuleBuilder.updateContent(o);
1033                 },
1034                 refreshDropDown: function(){
1035                         ModuleBuilder.callLock = false;
1036                         document.popup_form.action.value = 'RefreshField';
1037                         document.popup_form.new_dropdown.value = ModuleBuilder.refreshDD_name;
1038                         SimpleList.refreshDD_name = '';
1039                         ModuleBuilder.submitForm("popup_form");
1040                 },
1041                 dropdownChanged: function(value){
1042                         var select = document.getElementById('default[]').options;
1043                         while(select.length > 0) {
1044                                 select[0] = null;
1045                         }
1046                         ModuleBuilder.asyncRequest(
1047                                 'module=ModuleBuilder&action=get_app_list_string&key=' + value +
1048                                 '&view_package=' + ModuleBuilder.MBpackage + '&view_module=' + ModuleBuilder.module,
1049                                 ModuleBuilder.dropdownChangedCallback
1050                         );
1051                 },
1052                 dropdownChangedCallback : function(o) {
1053                         var ajaxResponse = YAHOO.lang.JSON.parse(o.responseText);
1054                         var select = document.getElementById('default[]').options;
1055                         var count = 0;
1056                         for (var key in ajaxResponse) {
1057                                 select[count] = new Option(ajaxResponse[key], key);
1058                                 count++;
1059                         }
1060                         ajaxStatus.flashStatus(SUGAR.language.get('app_strings', 'LBL_REQUEST_PROCESSED'), 2000);
1061                 },
1062                 setSelectedOption : function (sel, option)
1063                 {
1064                         var sel = Dom.get(sel);
1065                         for (var i = 0; i < sel.options.length; i++)
1066                         {
1067                                 if(sel.options[i].value == option) {
1068                                         sel.selectedIndex = i;
1069                                         return true;
1070                                 }
1071                         }
1072                         return false;
1073                 }
1074         };
1075         ModuleBuilder.buttons = {};
1076         ModuleBuilder.selected = {};
1077         ModuleBuilder.callLock = false;
1078 }
1079 })();