1 /*********************************************************************************
2 * SugarCRM Community Edition is a customer relationship management program developed by
3 * SugarCRM, Inc. Copyright (C) 2004-2012 SugarCRM Inc.
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.
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
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
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.
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.
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 ********************************************************************************/
36 function treeinit() {}
38 if(typeof('console') == 'undefined'){
40 log: function(message){
46 Event = YAHOO.util.Event,
47 Connect = YAHOO.util.Connect,
50 function createTreePanel(treeData, params) {
51 var tree = new YAHOO.widget.TreeView(params.id);
52 var root = tree.getRoot();
53 addChildNodes(root, treeData);
58 function addChildNodes(parentNode, parentData) {
59 var nodes = parentData.nodes || parentData.children;
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]);
72 if (typeof(ModuleBuilder) == 'undefined') {
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;
79 window.location = "index.php?action=ajaxui#ajaxUILoc=" + ajaxLoc;
82 //Setup the basic ajax request settings
83 Connect.extraParams = {
86 Connect.url = 'index.php?to_pdf=1&sugar_body_only=1';
87 Connect.method = 'POST';
88 Connect.timeout = 300000;
90 //Setup and read cookie settings
91 //Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
93 if (SUGAR.themes.tempHideLeftCol)
94 SUGAR.themes.tempHideLeftCol();
96 var Ck = YAHOO.util.Cookie;
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'),
103 content : "<div> </div>",
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', {
112 height: viewHeight - heightOffset - 40,
115 units: [//ModuleBuilder.tree, ModuleBuilder.tabPanel,
128 body : "<div id='mbTree'/>"
131 header: SUGAR.language.get('ModuleBuilder', 'LBL_SECTION_HELP'),
140 header: SUGAR.util.getAndRemove("footerHTML").innerHTML,
149 ModuleBuilder.nextYear = new Date();
150 ModuleBuilder.nextYear.setDate(ModuleBuilder.nextYear.getDate() + 360);
152 var nextyear = ModuleBuilder.nextYear;
154 if (Ck.getSub("ModuleBuilder", "helpHidden") == "true") {
155 mp.getUnitByPosition('right').collapse();
157 if (Ck.getSub("ModuleBuilder", "treeHidden") == "true") {
158 mp.getUnitByPosition('left').collapse();
161 var centerEl = mp.getUnitByPosition('center').get('wrap');
162 tp.appendTo(centerEl);
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")
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";
179 mp.getUnitByPosition('right').on("expand", function(){
180 Ck.setSub("ModuleBuilder", "helpHidden", "false");
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";
187 mp.getUnitByPosition('left').on("expand", function(){
188 Ck.setSub("ModuleBuilder", "treeHidden", "false");
191 Event.on(window, 'resize', ModuleBuilder.autoSetLayout, this, true);
193 var tree = ModuleBuilder.tree = createTreePanel(TREE_DATA, {
196 tree.setCollapseAnim("TVSlideOut");
197 tree.setExpandAnim("TVSlideIn");
198 //tree.subscribe("labelClick", ModuleBuilder.handleTreeClick);
199 tree.subscribe("clickEvent", ModuleBuilder.handleTreeClick);
202 //Setup Browser History
203 var mbContent = YAHOO.util.History.getBookmarkedState('mbContent');
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=';
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';
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';
219 mp.getUnitByPosition('left').collapse(false);
220 mbContent = mbContent ? mbContent : 'module=ModuleBuilder&action=home';
223 YAHOO.util.History.register('mbContent', mbContent, ModuleBuilder.navigate);
224 YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
225 ModuleBuilder.getContent(mbContent);
227 if (SUGAR.themes.tempHideLeftCol) SUGAR.themes.tempHideLeftCol();
228 ModuleBuilder.autoSetLayout();
230 ModuleBuilder.tabPanel.on('activeTabChange', function(e) {
231 ModuleBuilder.helpLoad( e.newValue.get("id") ) ;
234 if (Dom.get("HideHandle")){
235 if (SUGAR.themes.tempHideLeftCol){
236 SUGAR.themes.tempHideLeftCol();
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";
244 //Empty layout manager
248 ModuleBuilder.layoutValidation.popup_window = new YAHOO.widget.SimpleDialog("emptyLayout", {
251 constraintoviewport: true,
254 text: SUGAR.language.get('ModuleBuilder', 'ERROR_MINIMUM_FIELDS'),
255 bodyStyle: "padding:5px",
257 text: SUGAR.language.get('ModuleBuilder', 'LBL_BTN_CLOSE'),
260 ModuleBuilder.layoutValidation.popup_window.hide()
264 ModuleBuilder.layoutValidation.popup_window.render(document.body);
265 ModuleBuilder.layoutValidation.popup_window.show();
268 //Layout history manager
273 browse: function(module, layout, subpanel){
274 subpanel = subpanel ? subpanel : "";
275 if (!module && ModuleBuilder.module != "undefined") {
276 module = ModuleBuilder.module;
278 if (!ModuleBuilder.history.popup_window) {
279 ModuleBuilder.history.popup_window = new YAHOO.SUGAR.AsyncPanel('histWindow', {
283 constraintoviewport: true,
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];
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',
298 view_package: ModuleBuilder.MBpackage,
303 ModuleBuilder.history.popup_window.load(ModuleBuilder.paramsToUrl(ModuleBuilder.history.params));
304 ModuleBuilder.history.popup_window.show();
305 ModuleBuilder.history.popup_window.center();
307 preview: function(module, layout, id, subpanel) {
308 var prevPanel = ModuleBuilder.findTabById('preview:' + id);
310 ModuleBuilder.history.params = {
311 module: 'ModuleBuilder',
312 histAction: 'preview',
314 view_package: ModuleBuilder.MBpackage,
320 prevPanel = new YAHOO.SUGAR.ClosableTab({
321 dataSrc: Connect.url + "&" + ModuleBuilder.paramsToUrl(ModuleBuilder.history.params),
322 label: SUGAR.language.get("ModuleBuilder", "LBL_MB_PREVIEW"),
327 }, ModuleBuilder.tabPanel);
328 prevPanel.closable = true;
329 ModuleBuilder.tabPanel.addTab(prevPanel);
331 ModuleBuilder.tabPanel.set("activeTab", prevPanel);
335 revert: function(module, layout, id, subpanel){
336 var prevTab = ModuleBuilder.tabPanel.getTabIndex("preview:" + id);
337 if(prevTab) ModuleBuilder.tabPanel.removeTab(prevTab);
339 ModuleBuilder.history.params = {
340 module: 'ModuleBuilder',
341 histAction: 'restore',
343 view_package: ModuleBuilder.MBpackage,
349 ModuleBuilder.asyncRequest(ModuleBuilder.history.params, function(){
350 ModuleBuilder.history.reverted = true;
351 ModuleBuilder.getContent(ModuleBuilder.contentURL);
352 ModuleBuilder.state.isDirty = true;
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});
360 ModuleBuilder.history.params = { };
361 ModuleBuilder.history.reverted = false;
364 if (ModuleBuilder.history.popup_window && ModuleBuilder.history.popup_window.cfg.getProperty("visible")) {
365 var historyButton = YAHOO.util.Dom.get('historyBtn');
367 historyButton.onclick();
369 ModuleBuilder.history.popup_window.hide();
377 hideFailedMesage: false,
386 save_url_for_current_view: null,
388 setupState: function(){
389 //ModuleBuilder.state.popup();
390 document.body.setAttribute("onclose", "ModuleBuilder.state.popup(); ModuleBuilder.state.popup_window.show()");
393 onSaveClick: function(){
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");
400 var mbForm = document.forms[1];
402 var mbButtons = mbForm.getElementsByTagName("input");
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];
413 alert("Could not find the save action for this view.");
417 //After the save call completes, load the next page
418 ModuleBuilder.state.saving = true;
419 eval(saveBtn.getAttributeNode('onclick').value);
421 ModuleBuilder.state.popup_window.hide();
423 onDontSaveClick: function(){
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();
431 loadOnSaveComplete: function() {
432 ModuleBuilder.state.saving = false;
433 ModuleBuilder.getContent(ModuleBuilder.state.intended_view.url, ModuleBuilder.state.intended_view.successCall);
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", {
440 constraintoviewport: true,
443 text: SUGAR.language.get('ModuleBuilder', 'LBL_CONFIRM_DONT_SAVE'),
444 bodyStyle: "padding:5px",
446 text: SUGAR.language.get('ModuleBuilder', 'LBL_BTN_DONT_SAVE'),
447 handler: ModuleBuilder.state.onDontSaveClick
449 text: SUGAR.language.get('ModuleBuilder', 'LBL_BTN_CANCEL'),
452 ModuleBuilder.state.popup_window.hide()
455 text: SUGAR.language.get('ModuleBuilder', 'LBL_BTN_SAVE_CHANGES'),
456 handler: ModuleBuilder.state.onSaveClick
459 ModuleBuilder.state.popup_window.setHeader(SUGAR.language.get('ModuleBuilder', 'LBL_CONFIRM_DONT_SAVE_TITLE'));
461 if(ModuleBuilder.disablePopupPrompt != 1){
462 ModuleBuilder.state.popup_window.render(document.body);
464 ModuleBuilder.state.onDontSaveClick();
468 copyFromView: function(module, layout){
469 var url = ModuleBuilder.contentURL;
470 ModuleBuilder.getContent(url+"©FromEditView=true");
471 ModuleBuilder.contentURL = url;
472 ModuleBuilder.state.intended_view.url = url;
473 ModuleBuilder.state.isDirty = true;
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);
482 getContent: function(url, successCall){
485 if (url.substring(0, 11) == "javascript:")
487 eval(url.substring(11));
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();
505 ModuleBuilder.state.current_view.url = url;
506 ModuleBuilder.state.current_view.successCall = successCall;
509 ModuleBuilder.contentURL = url;
510 if (typeof(successCall) != 'function') {
511 if (ModuleBuilder.callInProgress)
513 ModuleBuilder.callInProgress = true;
514 successCall = ModuleBuilder.updateContent;
516 ModuleBuilder.asyncRequest(url, successCall);
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();
525 ajaxStatus.flashStatus(SUGAR.language.get('app_strings', 'LBL_REQUEST_PROCESSED'), 2000);
526 if(ModuleBuilder.checkForErrors(o))
530 var ajaxResponse = YAHOO.lang.JSON.parse((o.responseText));
532 YAHOO.SUGAR.MessageBox.show({
533 title: SUGAR.language.get('ModuleBuilder', 'ERROR_GENERIC_TITLE'),
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));
549 for (var maj in ajaxResponse) {
550 var name = 'mb' + maj;
551 var comp = ModuleBuilder.mainPanel.getUnitById(maj);
553 var tabs = ModuleBuilder.tabPanel.get("tabs");
555 if (tabs[i].get && tabs[i].get("id") == maj)
560 if (name == 'mbwest') { //refresh package_tree!
561 var tree = ModuleBuilder.tree;
562 var root = tree.root;
565 while (root.hasChildren()) {
566 tree.removeNode(root.children[0], true);
568 addChildNodes(root, ajaxResponse.west.content.tree_data);
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,
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);
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);
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);
605 ModuleBuilder.history.update();
608 checkForErrors: function(o){
609 if (SUGAR.util.isLoginPage(o.responseText))
611 if (o.responseText.substr(0, 1) == "<") {
612 YAHOO.SUGAR.MessageBox.show({
613 title: SUGAR.language.get('ModuleBuilder', 'ERROR_GENERIC_TITLE'),
623 submitForm: function(formname, successCall){
624 ajaxStatus.showStatus(SUGAR.language.get('ModuleBuilder', 'LBL_AJAX_LOADING'));
625 if (typeof(successCall) == 'undefined') {
626 successCall = ModuleBuilder.updateContent;
629 ModuleBuilder.callLock = true;
631 Connect.setForm(document.getElementById(formname) || document.forms[formname]);
632 Connect.asyncRequest(
635 {success: successCall, failure: ModuleBuilder.failed}
638 setMode: function(reqMode){
639 ModuleBuilder.mode = reqMode;
641 main: function(type){
642 document.location.href = 'index.php?module=ModuleBuilder&action=index&type=' + type;
645 if(!ModuleBuilder.state.hideFailedMesage){
646 ajaxStatus.flashStatus(SUGAR.language.get('ModuleBuilder', 'LBL_AJAX_FAILED_DATA'), 2000);
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';
655 ModuleBuilder.buttonSelect(name, list);
657 button.className = 'wizardButtonDown';
660 buttonOver: function(button){
661 button.className = 'button';
663 buttonOut: function(button, name, list){
664 if (typeof(name) != 'undefined') {
665 if (ModuleBuilder.buttonGetSelected(list) != name) {
666 button.className = 'wizardButton'
670 button.className = 'wizardButton'
674 buttonAdd: function(id, name, list){
675 if (typeof(ModuleBuilder.buttons[list]) == 'undefined') {
676 ModuleBuilder.buttons[list] = {};
679 ModuleBuilder.buttons[list][name] = document.getElementById(id);
682 buttonGetSelected: function(list){
683 if (typeof(ModuleBuilder.selected[list]) == 'undefined') {
686 return ModuleBuilder.selected[list];
688 buttonSelect: function(name, list){
689 ModuleBuilder.selected[list] = name;
691 buttonToForm: function(form, field, list){
692 var theField = eval('document.' + form + '.' + field);
693 theField.value = ModuleBuilder.buttonGetSelected(list);
696 getTitle: function(title, breadCrumb){
697 return "<h2>" + title + "</h2><br>" + breadCrumb;
699 closeAllTabs: function() {
700 var tabs = ModuleBuilder.tabPanel.get('tabs');
701 for (var i = tabs.length - 1; i > -1; i--) {
709 helpRegister: function(name){
710 var formname = 'document.' + name;
711 var form = eval(formname);
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)
718 form.elements[i].onmouseout = function(){
719 ModuleBuilder.helpToggle('default')
725 helpUnregisterByID: function (id){
726 var elm = document.getElementById(id);
728 elm.onmouseover = function() {};
729 elm.onmouseout = function() {};
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)
741 //children[i].onmouseover = function(){alert(this.id)};
742 children[i].onmouseout = function(){
743 ModuleBuilder.helpToggle('default')
748 helpSetup: function(group, def, panel){
749 if (!ModuleBuilder.panelHelp) ModuleBuilder.panelHelp = [];
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 } ;
755 // get the help text if required
756 if ( ! ModuleBuilder.AllHelpLang ) ModuleBuilder.AllHelpLang = SUGAR.language.get('ModuleBuilder', 'help');
759 ModuleBuilder.helpLang = ModuleBuilder.AllHelpLang[group];
760 ModuleBuilder.helpDefault = def;
763 ModuleBuilder.helpToggle('default');
765 helpLoad: function(panelId){
766 if (!ModuleBuilder.panelHelp) return;
768 if ( ! ModuleBuilder.AllHelpLang ) ModuleBuilder.AllHelpLang = SUGAR.language.get('ModuleBuilder', 'help');
770 if ( ModuleBuilder.panelHelp [ panelId ] )
772 ModuleBuilder.helpLang = ModuleBuilder.AllHelpLang[ ModuleBuilder.panelHelp [ panelId ].lang ];
773 ModuleBuilder.helpDefault = ModuleBuilder.panelHelp [ panelId ].def ;
774 ModuleBuilder.helpToggle('default');
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];
784 handleSave: function(form, callBack){
785 if (check_form(form)) {
786 ModuleBuilder.state.isDirty=false;
787 ModuleBuilder.submitForm(form, callBack);
791 handleTreeClick: function(o) {
793 ModuleBuilder.getContent(node.data.action);
796 treeSubscribe:function(tree){
797 tree.subscribe("labelClick", ModuleBuilder.treeLabelClick);
799 treeRefresh:function(type){
800 ModuleBuilder.getContent('module=ModuleBuilder&action=ViewTree&tree=' + type);
803 addModule: function(MBpackage){
804 ModuleBuilder.getContent('module=ModuleBuilder&action=module&view_package=' + MBpackage);
806 viewModule: function(MBpackage, module){
807 ModuleBuilder.getContent('module=ModuleBuilder&action=module&view_package=' + MBpackage + '&view_module=' + module);
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);
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);
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;
830 packageDeploy: function(form, deployed){
831 var confirmed = true;
833 confirmed = confirm(SUGAR.language.get('ModuleBuilder', 'LBL_JS_DEPLOY_PACKAGE'));
835 if (confirmed && check_form(form)) {
836 ajaxStatus.showStatus(SUGAR.language.get('ModuleBuilder', 'LBL_AJAX_DEPLOYPROGRESS'));
837 ModuleBuilder.submitForm(form, ModuleBuilder.packageInstall);
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);
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');
852 beginDeploy: function(p){
853 ModuleBuilder.asyncRequest('module=ModuleBuilder&action=DeployPackage&package=' + p, ModuleBuilder.deployComplete);
855 deployComplete: function(o){
856 var resp = o.responseText;
858 //check if the deploy completed
859 if (!resp.match(/^\s*(\s*(Table already exists : [\w_]*)(<br>)*\s*)*complete$/m))
861 //Unknown error occured, warn the user
862 alert(SUGAR.language.get("ModuleBuilder", "LBL_DEPLOY_FAILED"));
864 //Cleanup in the background
865 ModuleBuilder.asyncRequest(
866 'module=Administration&action=RebuildRelationship&silent=true',
869 ModuleBuilder.asyncRequest(
870 'module=Administration&action=RebuildDashlets&silent=true',
874 ModuleBuilder.failed = function(){};
875 ModuleBuilder.state.hideFailedMesage = true;
877 window.setTimeout("window.location.assign(window.location.href.split('#')[0])", 2000);
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);
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;
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);
902 moduleViewFields: function(o){
904 ModuleBuilder.callLock = false;
906 ModuleBuilder.getContent('module=ModuleBuilder&action=modulefields&view_package=' + ModuleBuilder.MBpackage +
907 '&view_module=' + ModuleBuilder.module);
909 moduleLoadField: function(name, type){
910 if (typeof(type) == 'undefined')
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);
917 moduleLoadLabels: function(type){
918 if (typeof(type) == 'undefined')
921 if (type == "studio") {
922 ModuleBuilder.getContent('module=ModuleBuilder&action=editLabels&view_module=' + ModuleBuilder.module);
926 ModuleBuilder.getContent('module=ModuleBuilder&action=modulelabels&view_package=' + ModuleBuilder.MBpackage + '&view_module=' + ModuleBuilder.module + '&type=' + type);
929 moduleViewRelationships: function(o){
930 ModuleBuilder.callLock = false;
931 ModuleBuilder.getContent('module=ModuleBuilder&action=relationships&view_package=' + ModuleBuilder.MBpackage + '&view_module=' + ModuleBuilder.module);
933 moduleLoadRelationship2: function(name, resetLabel, checkLanguage) {
934 if (resetLabel && Dom.get('rhs_label')) {
935 Dom.get('rhs_label').value = "";
937 var panel = ModuleBuilder.findTabById('relEditor');
939 panel = new YAHOO.SUGAR.ClosableTab({
940 label: SUGAR.language.get("ModuleBuilder", "LBL_RELATIONSHIP_EDIT"),
945 }, ModuleBuilder.tabPanel);
946 ModuleBuilder.tabPanel.addTab(panel);
948 ModuleBuilder.tabPanel.set("activeTab", panel);
950 var rtField = Dom.get('relationship_type_field');
951 var relType = rtField ? rtField.options[rtField.selectedIndex].value: "";
953 name = Dom.get('rel_name_id') ? Dom.get('rel_name_id').value : "";
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 : "",
970 params['relationship_lang'] = Dom.get('relationship_lang').value;
971 params['ajaxLoad'] = '1';
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);
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);
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);
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)
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);
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();
1008 paramsToUrl : function (params) {
1011 url += i + "=" + params[i] + "&";
1015 asyncRequest : function(params, callback) {
1017 if (typeof params == "object") {
1018 url = ModuleBuilder.paramsToUrl(params);
1022 ajaxStatus.showStatus(SUGAR.language.get('app_strings', 'LBL_LOADING_PAGE'));
1023 Connect.asyncRequest(
1025 Connect.url + '&' + url,
1026 {success: callback, failure: ModuleBuilder.failed}
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);
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");
1041 dropdownChanged: function(value){
1042 var select = document.getElementById('default[]').options;
1043 while(select.length > 0) {
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
1052 dropdownChangedCallback : function(o) {
1053 var ajaxResponse = YAHOO.lang.JSON.parse(o.responseText);
1054 var select = document.getElementById('default[]').options;
1056 for (var key in ajaxResponse) {
1057 select[count] = new Option(ajaxResponse[key], key);
1060 ajaxStatus.flashStatus(SUGAR.language.get('app_strings', 'LBL_REQUEST_PROCESSED'), 2000);
1062 setSelectedOption : function (sel, option)
1064 var sel = Dom.get(sel);
1065 for (var i = 0; i < sel.options.length; i++)
1067 if(sel.options[i].value == option) {
1068 sel.selectedIndex = i;
1075 ModuleBuilder.buttons = {};
1076 ModuleBuilder.selected = {};
1077 ModuleBuilder.callLock = false;