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