]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - jssource/src_files/include/SubPanel/SubPanelTiles.js
Release 6.5.16
[Github/sugarcrm.git] / jssource / src_files / include / SubPanel / SubPanelTiles.js
1 /*********************************************************************************
2  * SugarCRM Community Edition is a customer relationship management program developed by
3  * SugarCRM, Inc. Copyright (C) 2004-2013 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
37
38
39 var request_id = 0;
40 var current_child_field = '';
41 var current_subpanel_url = '';
42 var child_field_loaded = new Object();
43 var request_map = new Object();
44
45 function get_module_name()
46 {
47         if(typeof(window.document.forms['DetailView']) == 'undefined') {
48                 return '';
49         } else {
50
51                 //check to see if subpanel_parent_module input exists.  If so override module name
52                 //this is used in the case when the subpanel contents are of the same module as the current module
53                 //and the record in $_REQUEST is of the parent object.  By specifying the subpanel_parent_module,
54                 //you allow normal processing to continue.  For an example, see trackdetailview.html/php in campaigns module
55                 if(typeof(window.document.forms['DetailView'].elements['subpanel_parent_module']) != 'undefined' &&
56                 window.document.forms['DetailView'].elements['subpanel_parent_module'].value != ''){
57                         return window.document.forms['DetailView'].elements['subpanel_parent_module'].value;
58                 }
59                 return window.document.forms['DetailView'].elements['module'].value;
60         }
61 }
62 /*this function will take in three parameters, m,i,a and recreate navigation
63 * m = module
64 * i = record id
65 * a = action (detail/edit)
66 * t = element to be modified
67 * r = relationship to update after edit.
68 * This is done to minimize page size
69 * */
70 function subp_nav(m,i,a,t,r){
71         if(t.href.search(/#/) < 0){
72                 //no need to process if url has already been converted
73                 return;
74         }
75         if(a=='d'){
76                 a='DetailView';
77         }else{
78                 a='EditView';
79         }
80         url = "index.php?module="+m+"&action="+a+"&record="+i+"&parent_module="+get_module_name()+"&parent_id="+get_record_id()+"&return_module="+get_module_name()+"&return_id="+get_record_id()+"&return_action=DetailView";
81         if  (r)
82         {
83                 url += "&return_relationship=" + r;
84         }
85         t.href = url;
86 }
87
88
89 /*this function will take in three parameters, m,i,a and recreate navigation
90 * m = module
91 * i = record id
92 * a = action (detail/edit)
93 * This is done to minimize page size
94 * */
95 function sub_p_rem(sp,lf,li,rp){
96
97         return_url = "index.php?module="+get_module_name()+"&action=SubPanelViewer&subpanel="+sp+"&record="+get_record_id()+"&sugar_body_only=1&inline=1";
98
99         remove_url = "index.php?module="+ get_module_name()
100                         + "&action=DeleteRelationship"
101                         + "&record="+ get_record_id()
102                         + "&linked_field="+ lf  //$linked_field"
103                         + "&linked_id="+ li //$record"
104                         + "&return_url=" + escape(escape(return_url))
105                         + "&refresh_page=" + rp;//$refresh_page"
106         showSubPanel(sp,remove_url,true);
107 }
108
109 function sp_rem_conf(){
110         return confirm(SUGAR.language.get('app_strings', 'NTC_REMOVE_CONFIRMATION'))
111 }
112
113 function sub_p_del(sp,submod,subrec, rp){
114         return_url = "index.php?module="+get_module_name()+"&action=SubPanelViewer&subpanel="+sp+"&record="+get_record_id()+"&sugar_body_only=1&inline=1";
115
116         remove_url = "index.php?module="+ submod
117                         + "&action=delete"
118                         + "&record="+ subrec
119                         + "&return_url=" + escape(return_url)
120                         + "&refresh_page=" + rp;//$refresh_page"
121         showSubPanel(sp,remove_url,true);
122 }
123
124 function sp_del_conf(){
125         return confirm(SUGAR.language.get('app_strings', 'NTC_DELETE_CONFIRMATION'))
126 }
127
128 function get_record_id()
129 {
130         return window.document.forms['DetailView'].elements['record'].value;
131 }
132 function get_layout_def_key()
133 {
134         if(typeof(window.document.forms['DetailView'].elements['layout_def_key']) == 'undefined')return '';
135         return window.document.forms['DetailView'].elements['layout_def_key'].value;
136 }
137
138 function save_finished(args)
139 {
140         var child_field = request_map[args.request_id];
141         delete (child_field_loaded[child_field] );
142         showSubPanel(child_field);
143 }
144
145 function set_return_and_save_background(popup_reply_data)
146 {
147         var form_name = popup_reply_data.form_name;
148         var name_to_value_array = popup_reply_data.name_to_value_array;
149         var passthru_data = popup_reply_data.passthru_data;
150         var select_entire_list = typeof( popup_reply_data.select_entire_list ) == 'undefined' ? 0 : popup_reply_data.select_entire_list;
151         var current_query_by_page = popup_reply_data.current_query_by_page;
152         // construct the POST request
153         var query_array =  new Array();
154         if (name_to_value_array != 'undefined') {
155                 for (var the_key in name_to_value_array)
156                 {
157                         if(the_key == 'toJSON')
158                         {
159                                 /* just ignore */
160                         }
161                         else
162                         {
163                                 query_array.push(the_key+"="+name_to_value_array[the_key]);
164                         }
165                 }
166         }
167         //construct the muulti select list
168         var selection_list = popup_reply_data.selection_list;
169         if (selection_list != 'undefined') {
170                 for (var the_key in selection_list)
171                 {
172                         query_array.push('subpanel_id[]='+selection_list[the_key])
173                 }
174         }
175         var module = get_module_name();
176         var id = get_record_id();
177
178         query_array.push('value=DetailView');
179         query_array.push('module='+module);
180         query_array.push('http_method=get');
181         query_array.push('return_module='+module);
182         query_array.push('return_id='+id);
183         query_array.push('record='+id);
184         query_array.push('isDuplicate=false');
185         query_array.push('action=Save2');
186         query_array.push('inline=1');
187         query_array.push('select_entire_list='+select_entire_list);
188         if(select_entire_list == 1){
189                 query_array.push('current_query_by_page='+current_query_by_page);
190         }
191         var refresh_page = escape(passthru_data['refresh_page']);
192         for (prop in passthru_data) {
193                 if (prop=='link_field_name') {
194                         query_array.push('subpanel_field_name='+escape(passthru_data[prop]));
195                 } else {
196                         if (prop=='module_name') {
197                                 query_array.push('subpanel_module_name='+escape(passthru_data[prop]));
198                         } else if(prop == 'prospect_ids'){
199                                 for(var i=0;i<passthru_data[prop].length;i++){
200                                         query_array.push(prop + '[]=' + escape(passthru_data[prop][i]));
201                                 }
202                         } else {
203                                 query_array.push(prop+'='+escape(passthru_data[prop]));
204                         }
205                 }
206         }
207
208         var query_string = query_array.join('&');
209         request_map[request_id] = passthru_data['child_field'];
210
211         var returnstuff = http_fetch_sync('index.php',query_string);
212         request_id++;
213
214         // Bug 52843
215         // If returnstuff.responseText is empty, don't process, because it will blank the innerHTML
216         if (typeof returnstuff != 'undefined' && typeof returnstuff.responseText != 'undefined' && returnstuff.responseText.length != 0) {
217                 got_data(returnstuff, true);
218         }
219         
220         if(refresh_page == 1){
221                 document.location.reload(true);
222         }
223 }
224
225 function got_data(args, inline)
226 {
227
228         var list_subpanel = document.getElementById('list_subpanel_'+request_map[args.request_id].toLowerCase());
229         //this function assumes that we are always working with a subpanel..
230         //add a null check to prevent failures when we are not.
231         if (list_subpanel != null) {
232                 var subpanel = document.getElementById('subpanel_'+request_map[args.request_id].toLowerCase());
233                 var child_field = request_map[args.request_id].toLowerCase();
234                 if(inline){
235
236                         child_field_loaded[child_field] = 2;
237                         list_subpanel.innerHTML='';
238                         list_subpanel.innerHTML=args.responseText;                      
239
240                 } else {
241                         child_field_loaded[child_field] = 1;
242                         subpanel.innerHTML='';
243                         subpanel.innerHTML=args.responseText;
244
245                         /* walk into the DOM and insert the list_subpanel_* div */
246                         var inlineTable = subpanel.getElementsByTagName('table');
247                         inlineTable = inlineTable[1];
248                         inlineTable = subpanel.removeChild(inlineTable);
249                         var listDiv = document.createElement('div');
250                         listDiv.id = 'list_subpanel_'+request_map[args.request_id].toLowerCase();
251                         subpanel.appendChild(listDiv);
252                         listDiv.appendChild(inlineTable);
253                 }
254         SUGAR.util.evalScript(args.responseText);
255                 subpanel.style.display = '';
256                 set_div_cookie(subpanel.cookie_name, '');
257
258                 if (current_child_field != '' && child_field != current_child_field)
259                 {
260                         // commented out for now.  this was originally used by tab UI of subpanels
261                         //hideSubPanel(current_child_field);
262                 }
263                 current_child_field = child_field;
264                 //reinit action menus
265                 $("ul.clickMenu").each(function(index, node){
266                         $(node).sugarActionMenu();
267                 });
268         }
269 }
270
271 function showSubPanel(child_field,url,force_load,layout_def_key)
272 {
273         var inline = 1;
274         if ( typeof(force_load) == 'undefined' || force_load == null)
275         {
276                 force_load = false;
277         }
278
279         if (force_load || typeof( child_field_loaded[child_field] ) == 'undefined')
280         {
281                 request_map[request_id] = child_field;
282                 if ( typeof (url) == 'undefined' || url == null)
283                 {
284                         var module = get_module_name();
285                         var id = get_record_id();
286             if ( typeof(layout_def_key) == 'undefined' || layout_def_key == null ) {
287                 layout_def_key = get_layout_def_key();
288             }
289
290                         url = 'index.php?sugar_body_only=1&module='+module+'&subpanel='+child_field+'&action=SubPanelViewer&inline=' + inline + '&record='+id + '&layout_def_key='+ layout_def_key;
291                 }
292
293                 if ( url.indexOf('http://') != 0  && url.indexOf('https://') != 0)
294                 {
295                         url = ''+url ;
296                 }
297
298                 current_subpanel_url = url;
299                 // http_fetch_async(url,got_data,request_id++);
300                 var returnstuff = http_fetch_sync(url+ '&inline=' + inline + '&ajaxSubpanel=true');
301                 request_id++;
302                 got_data(returnstuff, inline);
303         }
304         else
305         {
306                 var subpanel = document.getElementById('subpanel_'+child_field);
307                 subpanel.style.display = '';
308
309                 set_div_cookie(subpanel.cookie_name, '');
310
311                 if (current_child_field != '' && child_field != current_child_field)
312                 {
313                         hideSubPanel(current_child_field);
314                 }
315
316                 current_child_field = child_field;
317         }
318         if(typeof(url) != 'undefined' && url != null && url.indexOf('refresh_page=1') > 0){
319                 document.location.reload();
320         }
321
322 }
323
324 function markSubPanelLoaded(child_field){
325         child_field_loaded[child_field] = 2;
326 }
327 function hideSubPanel(child_field)
328 {
329         var subpanel = document.getElementById('subpanel_'+child_field);
330         subpanel.style.display = 'none';
331         set_div_cookie(subpanel.cookie_name, 'none');
332 }
333 var sub_cookie_name = get_module_name() + '_divs';
334 var temp = Get_Cookie(sub_cookie_name);
335 var div_cookies = new Array();
336
337 if(temp && typeof(temp) != 'undefined'){
338         div_cookies = get_sub_cookies(temp);
339 }
340 function set_div_cookie(name, display){
341         div_cookies[name] = display;
342         Set_Cookie(sub_cookie_name, subs_to_cookie(div_cookies), 3000, false, false,false);
343 }
344
345
346 function local_open_popup(name, width, height,arg1, arg2, arg3, params)
347 {
348         return open_popup(name, width, height,arg1,arg2,arg3, params);
349 }
350
351 SUGAR.subpanelUtils = function() {
352         var originalLayout = null,
353         subpanelContents = {},
354         subpanelLocked = {},
355
356         // Keeps track of the current subpanel id
357         currentPanelDiv;
358
359         return {
360                 // get the current subpanel layout
361                 getLayout: function(asString, ignoreHidden) {
362                     subpanels = document.getElementById('subpanel_list');
363                     subpanelIds = new Array();
364                     for(wp = 0; wp < subpanels.childNodes.length; wp++) {
365                       if(typeof subpanels.childNodes[wp].id != 'undefined' && subpanels.childNodes[wp].id.match(/whole_subpanel_[\w-]*/) && (typeof ignoreHidden == 'undefined' || subpanels.childNodes[wp].style.display != 'none')) {
366                                 subpanelIds.push(subpanels.childNodes[wp].id.replace(/whole_subpanel_/,''));
367                       }
368                     }
369                         if(asString) return subpanelIds.join(',');
370                         else return subpanelIds;
371                 },
372
373                 // called when subpanel is picked up
374                 onDrag: function(e, id) {
375                         originalLayout = SUGAR.subpanelUtils.getLayout(true, true);
376                 },
377
378                 // called when subpanel is dropped
379                 onDrop: function(e, id) {
380                         newLayout = SUGAR.subpanelUtils.getLayout(true, true);
381                         if(originalLayout != newLayout) { // only save if the layout has changed
382                                 SUGAR.subpanelUtils.saveLayout(newLayout);
383                         }
384                 },
385
386                 // save the layout of the subpanels
387                 saveLayout: function(order) {
388                         ajaxStatus.showStatus(SUGAR.language.get('app_strings', 'LBL_SAVING_LAYOUT'));
389
390                         if(typeof SUGAR.subpanelUtils.currentSubpanelGroup != 'undefined') {
391                                 var orderList = SUGAR.subpanelUtils.getLayout(false, true);
392                                 var currentGroup = SUGAR.subpanelUtils.currentSubpanelGroup;
393                         }
394                         var success = function(data) {
395                                 ajaxStatus.showStatus(SUGAR.language.get('app_strings', 'LBL_SAVED_LAYOUT'));
396                                 window.setTimeout('ajaxStatus.hideStatus()', 2000);
397                                 if(typeof SUGAR.subpanelUtils.currentSubpanelGroup != 'undefined') {
398                                         SUGAR.subpanelUtils.reorderSubpanelSubtabs(currentGroup, orderList);
399                                 }
400                         }
401
402                         url = 'index.php?module=Home&action=SaveSubpanelLayout&layout=' + order + '&layoutModule=' + currentModule;
403                         if(typeof SUGAR.subpanelUtils.currentSubpanelGroup != 'undefined') {
404                                 url = url + '&layoutGroup=' + encodeURI(SUGAR.subpanelUtils.currentSubpanelGroup);
405                         }
406                         var cObj = YAHOO.util.Connect.asyncRequest('GET', url, {success: success, failure: success});
407                 },
408
409         /**
410          * Call when an inline create is saved.
411          * Note: We require the subpanel name to refresh the subpanel contents and
412          * to close the subpanel after the save. However, the code the generates the
413          * button doesn't have access to the subpanel name, only the module name.
414          * Hence this rather long-winded mechanism.
415          * @param theForm
416          * @param buttonName id of the originating 'save' button - we determine the
417          *          associated subpanel name by climbing the DOM from this point
418          */
419                 inlineSave: function(theForm, buttonName) {
420                         var saveButton = document.getElementsByName(buttonName);
421                         for (var i = 0; i < saveButton.length; i++) {
422                             saveButton[i].disabled = true;
423                         }
424                         ajaxStatus.showStatus(SUGAR.language.get('app_strings', 'LBL_SAVING'));
425                         var success = function(data) {
426                 var module = get_module_name();
427                 var id = get_record_id();
428                 var layout_def_key = get_layout_def_key();
429                 try {
430                     eval('result = ' + data.responseText);
431                 } catch (err) {
432                 }
433                 if (typeof(result) != 'undefined' && result != null && result['status'] == 'dupe') {
434                     document.location.href = "index.php?" + result['get'].replace(/&amp;/gi,'&').replace(/&lt;/gi,'<').replace(/&gt;/gi,'>').replace(/&#039;/gi,'\'').replace(/&quot;/gi,'"').replace(/\r\n/gi,'\n');
435                     for (var i = 0; i < saveButton.length; i++) {
436                         saveButton[i].disabled = false;
437                     }
438                     return;
439                 } else {
440                     SUGAR.subpanelUtils.cancelCreate(buttonName);
441                     // parse edit form name in order to get the name of
442                     // module which saved item belongs to
443                     var parts = theForm.split('_');
444                     var savedModule = '';
445                     var subPanels = [];
446                     for (var i = parts.length - 1; i >= 0; i --) {
447                         if (parts[i] == '') {
448                             continue;
449                         }
450                         if (savedModule != '') {
451                             savedModule = '_' + savedModule;
452                         }
453                         savedModule = parts[i] + savedModule;
454                         if (window.ModuleSubPanels && window.ModuleSubPanels[savedModule]) {
455                             subPanels = subPanels.concat(window.ModuleSubPanels[savedModule]);
456                         }
457                     }
458                     for (var i = 0; i < subPanels.length; i++) {
459                         showSubPanel(subPanels[i], null, true);
460                     }
461                     ajaxStatus.showStatus(SUGAR.language.get('app_strings', 'LBL_SAVED'));
462                     window.setTimeout('ajaxStatus.hideStatus()', 1000);
463                     for (var i = 0; i < saveButton.length; i++) {
464                         saveButton[i].disabled = false;
465                     }
466                 }
467                         }
468
469             YAHOO.util.Connect.setForm(theForm, true, true);
470                         var cObj = YAHOO.util.Connect.asyncRequest('POST', 'index.php', {success: success, failure: success, upload:success});
471                         return false;
472                 },
473
474         /**
475          * Retrieves the subpanel form.
476          * Note: We only allow one subpanel form to be open at any given time
477          * because some of the form widgets interfere with each other.
478          * @param theForm
479          * @param theDiv
480          * @param loadingStr
481          */
482                 sendAndRetrieve: function(theForm, theDiv, loadingStr) {
483             // look whether a quick create form is currently opened
484             var quickCreateDiv = YAHOO.util.Selector.query("div.quickcreate", null, true);
485             if (quickCreateDiv)
486             {
487                 var form = YAHOO.util.Selector.query("form", quickCreateDiv, true);
488                 if (form)
489                 {
490                     // discover cancelCreate function parameters needed
491                     var moduleName = YAHOO.util.Selector.query('input[name=module]', form, true).value;
492                     var buttonName = moduleName + "_subpanel_cancel_button";
493                     var cancelled  = false;
494
495                     // try to cancel form submission
496                     SUGAR.subpanelUtils.cancelCreate(buttonName, function()
497                     {
498                         cancelled = true;
499                     });
500
501                     // if submission cancellation was cancelled, do nothing
502                     if (cancelled)
503                     {
504                         return false;
505                     }
506                 }
507             }
508
509                         function success(data) {
510                                 var theDivObj = document.getElementById(theDiv),
511                     divName = theDiv + '_newDiv',
512                     form_el;
513                 SUGAR.subpanelUtils.dataToDOMAvail = false;
514
515                 // Show buttons before we remove subpanel
516                 if (typeof currentPanelDiv != 'undefined' && currentPanelDiv != null) {            
517                     var button_elements = YAHOO.util.Selector.query('td.buttons', currentPanelDiv, false);
518                     YAHOO.util.Dom.setStyle(button_elements, 'display', ''); 
519                 }
520                
521                 // Check if preview subpanel form exists, remove if it does.
522                 SUGAR.subpanelUtils.removeSubPanel();
523
524                                 subpanelContents[theDiv] = {};
525                                 subpanelContents[theDiv]['list'] = theDivObj;
526                                 subpanelContents[theDiv]['newDiv'] = document.createElement('div');
527                                 subpanelContents[theDiv]['newDiv'].innerHTML = '<script type="text/javascript">SUGAR.subpanelUtils.dataToDOMAvail=true;</script>' + data.responseText;
528                                 subpanelContents[theDiv]['newDiv'].id = divName;
529                                 subpanelContents[theDiv]['newDiv'].className = 'quickcreate';
530
531                                 // Grab the buttons from the subpanel and hide them
532                                 var button_elements = YAHOO.util.Selector.query('td.buttons', theDiv, false);
533                                 YAHOO.util.Dom.setStyle(button_elements, 'display', 'none');
534                                 button_elements = YAHOO.util.Selector.query('ul.SugarActionMenu', theDiv, false);
535                                 YAHOO.util.Dom.setStyle(button_elements, 'display', 'none');
536
537                 // Add the form object to the DOM
538                                 theDivObj.parentNode.insertBefore(subpanelContents[theDiv]['newDiv'], theDivObj);
539                 currentPanelDiv = divName;
540
541                 if (!SUGAR.subpanelUtils.dataToDOMAvail) {
542                                         SUGAR.util.evalScript(data.responseText);
543                                 }
544
545                                 form_el = YAHOO.util.Selector.query('form', divName, true);
546                 YAHOO.util.Dom.setStyle(form_el, 'padding-bottom', '10px');
547                 
548                 subpanelLocked[theDiv] = false;
549                 setTimeout("enableQS(false)",500);
550                                 ajaxStatus.hideStatus();
551                         }
552
553                         if (subpanelLocked[theDiv] === true) {
554                 return false;
555             }
556             
557                         subpanelLocked[theDiv] = true;
558
559                         loadingStr = loadingStr || SUGAR.language.get('app_strings', 'LBL_LOADING');
560                         ajaxStatus.showStatus(loadingStr);
561                         YAHOO.util.Connect.setForm(theForm);
562                         YAHOO.util.Connect.asyncRequest('POST', 'index.php', {success: success, failure: success});
563
564                         return false;
565                 },
566
567         // as long as formerly the function used to be always returning false,
568         // there was no possibility to determine, was the creation cancelled or not.
569         // we couldn't modify function return value in case of user cancels the
570         // cancellation as long as it (false) is used in multiple places to
571         // prevent DOM event propagation. thus, cancelCallback optional
572         // parameter is added to be able to track this case
573                 cancelCreate: function(buttonName, cancelCallback) {
574                         var element = document.getElementById(buttonName),
575                 theForm = element.form,
576                 confirmMsg = onUnloadEditView(theForm);
577
578                         do {
579                                 element = element.parentNode;
580                         } while ( element.className != 'quickcreate' && element.parentNode ) ;
581
582                         var theDiv = element.id.substr(0,element.id.length-7);
583
584                         if (typeof(subpanelContents[theDiv]) == 'undefined')
585                 return false;
586
587             if ( confirmMsg != null ) {
588                 if ( !confirm(confirmMsg) ) {
589                     if ("function" === typeof cancelCallback)
590                     {
591                         cancelCallback();
592                     }
593                     return false;
594                 } else {
595                     disableOnUnloadEditView(theForm);
596                 }
597             }
598
599             SUGAR.subpanelUtils.removeSubPanel();
600             var button_elements = YAHOO.util.Selector.query('td.buttons', theDiv, false);
601             YAHOO.util.Dom.setStyle(button_elements, 'display', '');
602             button_elements = YAHOO.util.Selector.query('ul.SugarActionMenu', theDiv, false);
603             YAHOO.util.Dom.setStyle(button_elements, 'display', '');
604             
605                         return false;
606                 },
607
608                 loadSubpanelGroupFromMore: function(group){
609                         SUGAR.subpanelUtils.updateSubpanelMoreTab(group);
610                         SUGAR.subpanelUtils.loadSubpanelGroup(group);
611                 },
612
613                 updateSubpanelMoreTab: function(group){
614                         // Update Tab
615                         var moreTab = document.getElementById(SUGAR.subpanelUtils.subpanelMoreTab + '_sp_tab');
616                         moreTab.id = group + '_sp_tab';
617                         moreTab.getElementsByTagName('a')[0].innerHTML = group;
618                         moreTab.getElementsByTagName('a')[0].href = "javascript:SUGAR.subpanelUtils.loadSubpanelGroup('"+group+"');";
619
620                         // Update Menu
621                         var menuLink = document.getElementById(group+'_sp_mm');
622                         menuLink.id = SUGAR.subpanelUtils.subpanelMoreTab+'_sp_mm';
623                         menuLink.href = "javascript:SUGAR.subpanelUtils.loadSubpanelGroupFromMore('"+SUGAR.subpanelUtils.subpanelMoreTab+"');";
624                         menuLink.innerHTML = SUGAR.subpanelUtils.subpanelMoreTab;
625
626                         SUGAR.subpanelUtils.subpanelMoreTab = group;
627                 },
628
629         /**
630          * Removes the current subpanel if it exists.
631          */
632         removeSubPanel: function() {
633             var currentPanelEl = null;
634             if (typeof currentPanelDiv != 'undefined' && currentPanelDiv != null) {
635                 currentPanelEl = document.getElementById(currentPanelDiv);
636             }
637
638             if (currentPanelEl != null) {
639                 currentPanelEl.parentNode.removeChild(currentPanelEl);
640                 SUGAR.ajaxUI.cleanGlobals();
641                 currentPanelDiv = null;
642             }
643         },
644
645                 /* loadSubpanels:
646                 /* construct set of needed subpanels */
647                 /* if we have not yet loaded this subpanel group, */
648                 /*     set loadedGroups[group] */
649                 /*     for each subpanel in subpanelGroups[group] */
650                 /*         if document.getElementById('whole_subpanel_'+subpanel) doesn't exist */
651                 /*         then add subpanel to set of needed subpanels */
652                 /*     if we need to load any subpanels, send a request for them */
653                 /*            with updateSubpanels as the callback. */
654                 /* otherwise call updateSubpanels */
655                 /* call setGroupCookie */
656
657                 loadSubpanelGroup: function(group){
658                         if(group == SUGAR.subpanelUtils.currentSubpanelGroup) return;
659
660                         if(SUGAR.subpanelUtils.loadedGroups[group]){
661                                 SUGAR.subpanelUtils.updateSubpanel(group);
662                         }else{
663
664                                 SUGAR.subpanelUtils.loadedGroups.push(group);
665                                 var needed = [];
666                                 for(group_sp in SUGAR.subpanelUtils.subpanelGroups[group]){
667                                         if(typeof(SUGAR.subpanelUtils.subpanelGroups[group][group_sp]) == 'string' && !document.getElementById('whole_subpanel_'+SUGAR.subpanelUtils.subpanelGroups[group][group_sp])){
668                                                 needed.push(SUGAR.subpanelUtils.subpanelGroups[group][group_sp]);
669                                         }
670                                 }
671                                 var success = function(){
672                                         SUGAR.subpanelUtils.updateSubpanelEventHandlers(needed);
673                                         SUGAR.subpanelUtils.updateSubpanels(group);
674                                 };
675                                 /* needed to retrieve each of the specified subpanels and install them ...*/
676                                 /* load them in bulk, insert via innerHTML, then sort nodes later. */
677                                 if(needed.length){
678
679                                         ajaxStatus.showStatus(SUGAR.language.get('app_strings', 'LBL_LOADING'));
680                                         SUGAR.util.retrieveAndFill(SUGAR.subpanelUtils.requestUrl + needed.join(','),'subpanel_list', null, success, null, true);
681                                 }else{
682                                         SUGAR.subpanelUtils.updateSubpanels(group);
683                                 }
684                         }
685                         SUGAR.subpanelUtils.setGroupCookie(group);
686                 },
687
688                 /* updateSubpanels:
689                 /* for each child node of subpanel_list */
690                 /*     let subpanel name be id.match(/whole_subpanel_(\w*)/) */
691                 /*     if the subpanel name is in the list of subpanels for the current group, show it */
692                 /*     otherwise hide it */
693                 /* swap nodes to suit user's order */
694                 /* call updateSubpanelTabs */
695
696                 updateSubpanels: function(group){
697                         var sp_list = document.getElementById('subpanel_list');
698                         for(sp in sp_list.childNodes){
699                                 if(sp_list.childNodes[sp].id){
700                                         sp_list.childNodes[sp].style.display = 'none';
701                                 }
702                         }
703
704                         for(group_sp in SUGAR.subpanelUtils.subpanelGroups[group]){
705                 if ( typeof(SUGAR.subpanelUtils.subpanelGroups[group][group_sp]) != 'string' )
706                 {
707                     continue;
708                 }
709                                 var cur = document.getElementById('whole_subpanel_'+SUGAR.subpanelUtils.subpanelGroups[group][group_sp]);
710                             
711                 if(cur == null)
712                 {
713                     continue;
714                 }
715
716                 cur.style.display = 'block';
717
718                         }
719
720                         SUGAR.subpanelUtils.updateSubpanelTabs(group);
721                 },
722
723                 updateSubpanelTabs: function(group){
724                         if(SUGAR.subpanelUtils.showLinks){
725                                 SUGAR.subpanelUtils.updateSubpanelSubtabs(group);
726                                 document.getElementById('subpanelSubTabs').innerHTML = SUGAR.subpanelUtils.subpanelSubTabs[group];
727                         }
728
729                         oldTab = document.getElementById(SUGAR.subpanelUtils.currentSubpanelGroup+'_sp_tab');
730                         if(oldTab){
731                                 oldTab.className = '';
732                                 oldTab.getElementsByTagName('a')[0].className = '';
733                         }
734
735                         mainTab = document.getElementById(group+'_sp_tab');
736                         mainTab.className = 'active';
737                         mainTab.getElementsByTagName('a')[0].className = 'current';
738
739                         SUGAR.subpanelUtils.currentSubpanelGroup = group;
740                         ajaxStatus.hideStatus();
741                 },
742
743                 updateSubpanelEventHandlers: function(){
744                         if(SubpanelInitTabNames){
745                                 SubpanelInitTabNames(SUGAR.subpanelUtils.getLayout(false));
746                         }
747                 },
748
749                 reorderSubpanelSubtabs: function(group, order){
750                         SUGAR.subpanelUtils.subpanelGroups[group] = order;
751                         if(SUGAR.subpanelUtils.showLinks==1){
752                                 SUGAR.subpanelUtils.updateSubpanelSubtabs(group);
753                                 if(SUGAR.subpanelUtils.currentSubpanelGroup == group){
754                                         document.getElementById('subpanelSubTabs').innerHTML = SUGAR.subpanelUtils.subpanelSubTabs[group];
755                                 }
756                         }
757                 },
758
759                 // Re-renders the contents of subpanelSubTabs[group].
760                 // Does not immediately affect what's on the screen.
761                 updateSubpanelSubtabs: function(group){
762                         var notFirst = 0;
763                         var preMore = SUGAR.subpanelUtils.subpanelGroups[group].slice(0, SUGAR.subpanelUtils.subpanelMaxSubtabs);
764
765                         SUGAR.subpanelUtils.subpanelSubTabs[group] = '<table border="0" cellpadding="0" cellspacing="0" height="20" width="100%" class="subTabs"><tr>';
766
767                         for(var sp_key = 0; sp_key < preMore.length; sp_key++){
768                                 if(notFirst != 0){
769                                         SUGAR.subpanelUtils.subpanelSubTabs[group] += '<td width="1"> | </td>';
770                                 }else{
771                                         notFirst = 1;
772                                 }
773                                 SUGAR.subpanelUtils.subpanelSubTabs[group] += '<td nowrap="nowrap"><a href="#'+preMore[sp_key]+'" class="subTabLink">'+SUGAR.subpanelUtils.subpanelTitles[preMore[sp_key]]+'</a></td>';
774                         }
775                         if(document.getElementById('MoreSub'+group+'PanelMenu')){
776                                 SUGAR.subpanelUtils.subpanelSubTabs[group] += '<td nowrap="nowrap"> | &nbsp;<span class="subTabMore" id="MoreSub'+group+'PanelHandle" style="margin-left:2px; cursor: pointer; cursor: hand;" align="absmiddle" onmouseover="SUGAR.subpanelUtils.menu.tbspButtonMouseOver(this.id,\'\',\'\',0);">&gt;&gt;</span></td>';
777                         }
778                         SUGAR.subpanelUtils.subpanelSubTabs[group] += '<td width="100%">&nbsp;</td></tr></table>';
779
780                         // Update the more menu for the current group
781                         var postMore = SUGAR.subpanelUtils.subpanelGroups[group].slice(SUGAR.subpanelUtils.subpanelMaxSubtabs);
782                         var subpanelMenu = document.getElementById('MoreSub'+group+'PanelMenu');
783
784                         if(postMore && subpanelMenu){
785                                 subpanelMenu.innerHTML = '';
786                                 for(var sp_key = 0; sp_key < postMore.length; sp_key++){
787                                         subpanelMenu.innerHTML += '<a href="#'+postMore[sp_key]+'" class="menuItem" parentid="MoreSub'+group+'PanelMenu" onmouseover="hiliteItem(this,\'yes\'); closeSubMenus(this);" onmouseout="unhiliteItem(this);">'+SUGAR.subpanelUtils.subpanelTitles[postMore[sp_key]]+'</a>';
788                                 }
789                                 subpanelMenu += '</div>';
790                         }
791                 },
792
793                 setGroupCookie: function(group){
794                         Set_Cookie(SUGAR.subpanelUtils.tabCookieName, group, 3000, false, false,false);
795                 }
796         };
797 }();
798
799 SUGAR.subpanelUtils.menu = function(){
800         return {
801                 tbspButtonMouseOver : function(id,top,left,leftOffset){ //*//
802                         closeMenusDelay = eraseTimeout(closeMenusDelay);
803                         if (openMenusDelay == null){
804                                 openMenusDelay = window.setTimeout("SUGAR.subpanelUtils.menu.spShowMenu('"+id+"','"+top+"','"+left+"','"+leftOffset+"')", delayTime);
805                         }
806                 },
807                 spShowMenu : function(id,top,left,leftOffset){ //*//
808                         openMenusDelay = eraseTimeout(openMenusDelay);
809                         var menuName = id.replace(/Handle/i,'Menu');
810                         var menu = getLayer(menuName);
811                         //if (menu) menu.className = 'tbButtonMouseOverUp';
812                         if (currentMenu){
813                                 closeAllMenus();
814                         }
815                         SUGAR.subpanelUtils.menu.spPopupMenu(id, menu, top,left,leftOffset);
816                 },
817                 spPopupMenu : function(handleID, menu, top, left, leftOffset){ //*//
818                         var bw = checkBrowserWidth();
819                         var menuName = handleID.replace(/Handle/i,'Menu');
820                         var menuWidth = 120;
821                         var imgWidth = document.getElementById(handleID).width;
822                         if (menu){
823                                 var menuHandle = getLayer(handleID);
824                                 var p=menuHandle;
825                                 if (left == "") {
826                                         var left = 0;
827                                         while(p&&p.tagName.toUpperCase()!='BODY'){
828                                                 left+=p.offsetLeft;
829                                                 p=p.offsetParent;
830                                         }
831                                         left+=parseInt(leftOffset);
832                                 }
833                                 if (top == "") {
834                                         var top = 0;
835                                         p=menuHandle;
836                                         top+=p.offsetHeight;
837                                         while(p&&p.tagName.toUpperCase()!='BODY'){
838                                                 top+=p.offsetTop;
839                                                 p=p.offsetParent;
840                                         }
841                                 }
842                                 if (left+menuWidth>bw) {
843                                         left = left-menuWidth+imgWidth;
844                                 }
845                                 setMenuVisible(menu, left, top, false);
846                         }
847                 }
848         };
849 }();