]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - jssource/src_files/include/javascript/report_additionals.js
Release 6.5.11
[Github/sugarcrm.git] / jssource / src_files / include / javascript / report_additionals.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 var groups_arr=new Array();
38 var chartTypesHolder = []; // storage for removed chart items
39 var groups_count=-1;
40 var filters_arr=new Array();
41 var filters_count_map=new Object();
42 var filters_count = -1;
43 var current_filter_id = -1;
44 var groups_count_map=new Object();
45 var current_group_id = -1;
46 var join_refs = new Array();
47 var group_field = null;
48 var has_group = null;
49 var global_report_def = null;
50 var goto_anchor = '';
51 // holds all the fields from current and joined tables
52 var all_fields = new Object();
53
54 var full_table_list = new Object();
55 full_table_list.self = new Object();
56 full_table_list.self.parent = '';
57 full_table_list.self.value = document.EditView.self.options[document.EditView.self.options.selectedIndex].value;
58 full_table_list.self.module = document.EditView.self.options[document.EditView.self.options.selectedIndex].value;
59 full_table_list.self.label = document.EditView.self.options[document.EditView.self.options.selectedIndex].text;
60 full_table_list.self.children = new Object();
61
62 function hideCheckGroups() {
63         document.getElementById('checkGroups').style.display = 'none';
64 }
65
66 function table_changed(obj) {
67         if(document.EditView.report_type[1].checked) {
68                 if(typeof hideCheckGroupsTimeout != 'undefined') clearTimeout(hideCheckGroupsTimeout);
69                 document.getElementById('checkGroups').style.display = '';
70                 hideCheckGroupsTimeout = window.setTimeout('hideCheckGroups()', 6000);
71         }
72
73         current_module = document.EditView.self.options[document.EditView.self.options.selectedIndex].value;
74         if(obj.options[obj.selectedIndex].value == '') { // None was selected, delete the link
75                 delete_this_join(obj.id);
76                 return;
77         }
78
79         // Set the master table list to the current value
80         full_table_list[obj.id].value = obj.value;
81         full_table_list[obj.id].label = obj.options[obj.options.selectedIndex].text;
82
83         if ( obj.id != 'self' ) {
84                 // Get the link definitions, and store them
85                 var parent_id = full_table_list[obj.id].parent;
86                 var parent_module = full_table_list[parent_id].module;
87                 var parent_link_defs = getLinksByRelType(module_defs[parent_module].link_defs);
88
89                 full_table_list[obj.id].link_def = parent_link_defs[full_table_list[obj.id].value];
90                 //full_table_list[obj.id].rel_def = rel_defs[full_table_list[obj.id].link_def.relationship_name];
91                 //full_table_list[obj.id].module = full_table_list[obj.id].label;
92                 full_table_list[obj.id].module = getRelatedModule(full_table_list[obj.id].link_def);
93
94                 full_table_list[obj.id].link_def.table_key = obj.id;
95         }
96         else {
97                 full_table_list[obj.id].module = obj.value;
98         }
99
100         if ( document.getElementById('report_results') != null ) {
101                 document.getElementById('report_results').style.display='none';
102         }
103         delete_join_rows(obj.id);
104         //alert("I'm done deleting the join rows");
105         if ( obj.id == 'self' ) {
106                 // We are deleting the main entry, nuke everything
107                 reload_join_rows();
108                 deleteAllFilters();
109                 deleteAllGroups(0);
110                 reload_columns();
111         }
112         else {
113                 joinChecked(obj);
114         }
115
116         remakeGroups();
117
118         document.EditView.sort_by.value = '';
119         document.EditView.sort_dir.value = '';
120         document.EditView.summary_sort_by.value = '';
121         document.EditView.summary_sort_dir.value = '';
122 }
123
124 function showDetailsClicked(obj) {
125         if (obj.checked) {
126                 document.getElementById('columns_table').style.display='';
127                 document.getElementById('columns_more_div').style.display='';
128         }
129         else {
130                 document.getElementById('columns_table').style.display='none';
131                 document.getElementById('columns_more_div').style.display='none';
132         }
133 }
134
135 function deleteFilter(index) {
136         var this_row = filters_arr[filters_count_map[index]].row;
137         this_row.parentNode.removeChild(this_row);
138         filters_arr.splice(filters_count_map[index],1);
139
140         for ( id in filters_count_map) {
141                 if (filters_count_map[id] > filters_count_map[index]) {
142                         filters_count_map[id]--;
143                 }
144         }
145 }
146
147 function deleteGroup(index) {
148         if(typeof(groups_count_map[index]) == 'undefined' || typeof(groups_arr[groups_count_map[index]]) == 'undefined') {
149                 return;
150         }
151
152         var this_row = groups_arr[groups_count_map[index]].row;
153         this_row.parentNode.removeChild(this_row);
154         groups_arr.splice(groups_count_map[index],1);
155
156         for ( id in groups_count_map) {
157                 if (groups_count_map[id] > groups_count_map[index]) {
158                         groups_count_map[id]--;
159                 }
160         }
161
162         var group_by_button = document.getElementById('group_by_button');
163         group_by_button.style.display = 'inline';
164
165         // add back line charts
166         if(groups_arr.length == 1 && document.EditView.chart_type.options.length > 5) {
167                 chartTypesHolder.push(document.EditView.chart_type.options[5]);
168                 document.EditView.chart_type.options[5] = null;
169         }
170         reload_columns('add');
171 }
172
173 function getReportType() {
174         for (i=0;i < document.EditView.report_type.length;i++) {
175                 if ( document.EditView.report_type[i].checked == true) {
176                         return document.EditView.report_type[i].value;
177                 }
178         }
179 }
180
181 function reportTypeChanged() {
182         var report_type = getReportType();
183
184         var columns_table = document.getElementById('columns_table');
185         var summary_table = document.getElementById('summary_table');
186
187         if ( report_type == 'summary') {
188                 document.getElementById('tab_li_chart_options_tab').style.display='';
189                 document.getElementById('tab_link_chart_options_tab').style.display='';
190                 document.getElementById('tab_li_group_by_tab').style.display='';
191                 document.getElementById('tab_link_group_by_tab').style.display='';
192                 document.getElementById('tab_link_columns_tab').innerHTML = SUGAR.language.get('Reports', 'LBL_4_CHOOSE') ;
193                 document.getElementById('summary_table').style.display='';
194                 document.getElementById('summary_more_div').style.display='';
195                 document.getElementById('columns_table').style.display='none';
196                 document.getElementById('columns_more_div').style.display='none';
197                 document.getElementById('group_by_div').style.display='';
198
199                 if (document.EditView.show_details.checked)  {
200                         document.getElementById('columns_table').style.display='';
201                         document.getElementById('columns_more_div').style.display='';
202                 }
203                 else {
204                         document.getElementById('columns_table').style.display='none';
205                         document.getElementById('columns_more_div').style.display='none';
206                 }
207         }
208         else if ( report_type == 'tabular' ) {
209                 document.getElementById('tab_li_chart_options_tab').style.display='none';
210                 document.getElementById('tab_link_chart_options_tab').style.display='none';
211                 document.getElementById('tab_li_group_by_tab').style.display='none';
212                 document.getElementById('tab_link_group_by_tab').style.display='none';
213                 document.getElementById('tab_link_columns_tab').innerHTML = SUGAR.language.get('Reports', 'LBL_3_CHOOSE') ;
214
215                 document.getElementById('columns_table').style.display='';
216                 document.getElementById('columns_more_div').style.display='';
217                 document.getElementById('summary_table').style.display='none';
218                 document.getElementById('summary_more_div').style.display='none';
219                 document.getElementById('group_by_div').style.display='none';
220         }
221         document.getElementById('report_results').style.display='none';
222         refresh_chart_tab();
223 }
224
225 function manyColumnSelectChanged(index) {
226         current_filter_id = index;
227         var filter_row = filters_arr[filters_count_map[index]];
228         refreshFilterColumn(filter_row.column_select,default_filter,index);
229         refreshFilterQualify(filter_row.column_select,default_filter,index);
230         refreshFilterInput(default_filter,index);
231 }
232
233 function moduleSelectChanged(index) {
234         current_filter_id = index;
235         var filter_row = filters_arr[filters_count_map[index]];
236         refreshFilterColumn(filter_row.column_select,default_filter,index);
237         refreshFilterQualify(filter_row.column_select,default_filter,index);
238         refreshFilterInput(default_filter,index);
239 }
240
241 function moduleSelectChangedGroup(index) {
242         current_group_id = index;
243         var group_row = groups_arr[groups_count_map[index]];
244         refreshGroupColumn(group_row.column_select,default_group,index);
245         refreshGroupQualify(group_row.column_select,default_group,index);
246         reload_columns('add');
247 }
248
249 function columnSelectChanged(index) {
250         current_filter_id = index;
251         var filter_row = filters_arr[filters_count_map[index]];
252         refreshFilterQualify(filter_row.column_select,default_filter,index);
253         refreshFilterInput(default_filter,index);
254 }
255
256 function columnSelectGroupChanged(index) {
257         current_group_id = index;
258         var group_row = groups_arr[groups_count_map[index]];
259         refreshGroupQualify(group_row.column_select,default_group,index);
260         reload_columns('add');
261 }
262
263 function refreshGroupQualify(obj,group,index) {
264         current_group_id = index;
265         var group_row = groups_arr[groups_count_map[index]];
266         group_row.qualify_cell.removeChild(group_row.qualify_select);
267         addGroupQualify(group_row.qualify_cell,group);
268 }
269
270 function refreshFilterQualify(obj,filter,index) {
271         current_filter_id = index;
272         var filter_row = filters_arr[filters_count_map[index]];
273         filter_row.qualify_cell.removeChild(filter_row.qualify_select);
274         addFilterQualify(filter_row.qualify_cell,filter);
275 }
276
277 function refreshFilterColumn(obj,filter,index) {
278         current_filter_id = index;
279         var filter_row = filters_arr[filters_count_map[index]];
280         filter_row.column_cell.removeChild(filter_row.column_select);
281         addColumnSelectFilter(filter_row.column_cell,filter);
282 }
283
284 function refreshGroupColumn(obj,group,index) {
285         current_group_id = index;
286         var group_row = groups_arr[groups_count_map[index]];
287         group_row.column_cell.removeChild(group_row.column_select);
288         addColumnSelectGroup(group_row.column_cell,group);
289 }
290
291 function refreshFilterModule(obj,filter,index) {
292         current_filter_id = index;
293         var filter_row = filters_arr[filters_count_map[index]];
294         filter_row.module_cell.removeChild(filter_row.module_select);
295         addModuleSelectFilter(filter_row.module_cell,filter);
296 }
297
298 function refreshGroupModule(obj,group,index) {
299         current_group_id = index;
300         var group_row = groups_arr[groups_count_map[index]];
301         group_row.module_cell.removeChild(group_row.module_select);
302         addModuleSelectGroup(group_row.module_cell,group);
303 }
304
305 function filterTypeChanged(index) {
306         var filter = {input_name0:''};
307         refreshFilterInput(filter,index);
308 }
309
310 function refreshFilterInput(filter,index) {
311         current_filter_id = index;
312         var filter_row = filters_arr[filters_count_map[index]];
313
314         if (typeof (filter_row.input_field0) != 'undefined' && typeof (filter_row.input_field0.value) != 'undefined') {
315                 type = "input";
316         }
317
318         filter_row.input_cell.removeChild(filter_row.input_cell.firstChild);
319         addFilterInput(filter_row.input_cell,filter);
320 }
321
322 function addColumnSelectGroup(cell,group) {
323         var select_html_info = new Object();
324         var options = new Array();
325         var select_info = new Object();
326         select_info['name'] = 'group';
327         select_info['onchange'] = 'columnSelectGroupChanged('+current_group_id+');';
328         select_html_info['select'] = select_info;
329
330         var module_select = groups_arr[groups_count_map[current_group_id]].module_select;
331         var table_key = module_select.options[module_select.selectedIndex].value;
332
333         if (table_key == 'self') {
334                 selected_module = current_module;
335                 field_defs = module_defs[selected_module].group_by_field_defs;
336         }
337         else {
338                 selected_module = table_key;
339                 var field_defs = module_defs[full_table_list[table_key].module].group_by_field_defs;
340         }
341
342         var field_defs_arr = getOrderedFieldDefArray(field_defs,true);
343
344         var selected = false;
345         var got_selected = 0;
346         for(var index in field_defs_arr) {
347             var field = field_defs_arr[index];
348                 if ( field.type == 'text' || ( field.type == 'name' && typeof (field.fields) != 'undefined' )) {
349                         continue;
350                 }
351
352     var key = table_key+":"+field.name;
353
354     if ( typeof(all_fields[key]) == 'undefined') {
355                 continue;
356     }
357
358     if ( group.column_name == key) {
359         got_selected = 1;
360                 selected = true;
361     }
362     else {
363                 selected = false;
364     }
365                 var option_info = new Object();
366                 option_info['value'] = key;
367                 option_info['text'] = field.vname;
368                 option_info['selected'] = selected;
369                 options[options.length] = option_info;
370         }
371
372         if ( got_selected == 0) {
373                 options[0]['selected'] = true;
374         }
375         select_html_info['options'] = options;
376         cell.innerHTML=buildSelectHTML(select_html_info);
377         groups_arr[groups_count_map[current_group_id]].column_select = cell.getElementsByTagName('select')[0];
378 }
379
380 function addModuleSelectFilter(cell,filter) {
381         var select_html_info = new Object();
382         var options = new Array();
383         var select_info = new Object();
384         select_info['name'] = 'filter';
385         select_info['onchange'] = 'moduleSelectChanged('+current_filter_id+');';
386         select_html_info['select'] = select_info;
387
388         var link_defs = getSelectedLinkDefs();
389
390         var option_info = new Object();
391         option_info['value'] = 'self';
392         option_info['text'] = module_defs[current_module].label;
393         option_info['selected'] = selected;
394         options[options.length] = option_info;
395
396         var parts = filter.column_name.split(':');
397         var selected_link_name = parts[0];
398
399         for(var i in link_defs) {
400                 var linked_field = link_defs[i];
401                 var selected = false;
402                 if ( i == selected_link_name) {
403                                 selected=true;
404                 }
405                 else {
406                                 selected=false;
407                 }
408
409                 // re-selected the remembered select (if there was one)
410
411                 var option_info = new Object();
412                 option_info['value'] = i;
413                 var label = linked_field['label'];
414                 if ( i != 'self' ) {
415                         label = full_table_list[full_table_list[i].parent].label + ' &gt; '+ label;
416                 }
417                 option_info['text'] = label;
418                 option_info['selected'] = selected;
419                 options[options.length] = option_info;
420         }
421
422         select_html_info['options'] = options;
423         cell.innerHTML=buildSelectHTML(select_html_info);
424         filters_arr[filters_count_map[current_filter_id]].module_select = cell.getElementsByTagName('select')[0];
425 }
426
427 function addModuleSelectGroup(cell,filter) {
428         var select_html_info = new Object();
429         var options = new Array();
430         var select_info = new Object();
431         select_info['name'] = 'group';
432         select_info['onchange'] = 'moduleSelectChangedGroup('+current_group_id+');';
433         select_html_info['select'] = select_info;
434
435         var link_defs = getSelectedLinkDefs();
436         var option_info = new Object();
437         option_info['value'] = 'self';
438         option_info['text'] = module_defs[current_module].label;
439         option_info['selected'] = selected;
440         options[options.length] = option_info;
441
442         var parts = filter.column_name.split(':');
443         var selected_link_name = parts[0];
444
445         for(var i in  link_defs) {
446                 var linked_field = link_defs[i];
447                 var selected = false;
448                 if ( i == selected_link_name) {
449                         selected=true;
450                 }
451                 else {
452                         selected=false;
453                 }
454
455                 // re-selected the remembered select (if there was one)
456                 var option_info = new Object();
457                 option_info['value'] = i;
458                 var label = linked_field['label'];
459                 if ( i != 'self' ) {
460                         label = full_table_list[full_table_list[i].parent].label + ' &gt; '+ label;
461                 }
462
463                 option_info['text'] = label;
464                 option_info['selected'] = selected;
465                 options[options.length] = option_info;
466         }
467
468         select_html_info['options'] = options;
469         cell.innerHTML=buildSelectHTML(select_html_info);
470         groups_arr[groups_count_map[current_group_id]].module_select = cell.getElementsByTagName('select')[0];
471 }
472
473 function getOrderedFieldDefArray(field_defs,show_id_field) {
474         var field_defs_arr = new Array();
475         var id_field = null;
476
477         for(field_name in field_defs) {
478                 var field = field_defs[field_name];
479                 field_defs_arr.push(field);
480         }
481
482         field_defs_arr.sort( _sort_by_field_name);
483
484         if ( id_field  != null && show_id_field ) {
485                 field_defs_arr.unshift(id_field);
486         }
487         return field_defs_arr;
488 }
489
490 function _sort_by_field_name(a,b) {
491         if ( typeof(a['vname']) == 'undefined') {
492                 a['vname'] = a['name'];
493         }
494         else if ( typeof(b['vname']) == 'undefined') {
495                 b['vname'] = b['name'];
496         }
497
498         if ( a['type'] == 'name' ||  a['type'] == 'user_name' ) {
499                 return -1;
500         }
501         else if ( b['type'] == 'name' ||  b['type'] == 'user_name' ) {
502                 return 1;
503         }
504         else {
505                 return a['vname'].localeCompare( b['vname']);
506         }
507 }
508
509 function addColumnSelectFilter(cell,filter) {
510         var select_html_info = new Object();
511         var options = new Array();
512         var select_info = new Object();
513         var field_defs = new Object();
514
515         select_info['name'] = 'filter';
516         select_info['onchange'] = 'columnSelectChanged('+current_filter_id+');';
517         select_html_info['select'] = select_info;
518
519         var module_select = filters_arr[filters_count_map[current_filter_id]].module_select;
520         var table_key = module_select.options[module_select.selectedIndex].value;
521         if (table_key == 'self') {
522                 selected_module = current_module;
523                 field_defs = module_defs[selected_module].field_defs;
524         }
525         else {
526                 selected_module = table_key;
527                 var field_defs = module_defs[full_table_list[table_key].module].field_defs;
528         }
529
530         var field_defs_arr = getOrderedFieldDefArray(field_defs,true);
531
532         var     selected = false;
533         for(var index in field_defs_arr) {
534                 var field = field_defs_arr[index];
535                 var key = table_key+":"+field.name;
536                 if ( typeof(all_fields[key]) == 'undefined') {
537                         continue;
538                 }
539
540                 if ( field.type  == 'time') {
541                         continue;
542                 }
543
544                 if ( filter.column_name == key) {
545                         selected = true;
546                 }
547                 else {
548                         selected = false;
549                 }
550                 var option_info = new Object();
551                 option_info['value'] = key;
552                 option_info['text'] = field.vname;
553                 option_info['selected'] = selected;
554                 options[options.length] = option_info;
555         }
556
557         select_html_info['options'] = options;
558         cell.innerHTML=buildSelectHTML(select_html_info);
559         filters_arr[filters_count_map[current_filter_id]].column_select = cell.getElementsByTagName('select')[0];
560 }
561
562
563 function addFilterInput(cell,filter) {
564         var filter_row = filters_arr[filters_count_map[current_filter_id]];
565         var qualifier_name = filter_row.qualify_select.options[filter_row.qualify_select.selectedIndex].value;
566         var module_select = filter_row.module_select;
567         var table_key = module_select.options[module_select.selectedIndex].value;
568         filter.table_key = table_key;
569         var module_select = filters_arr[filters_count_map[current_filter_id]].module_select;
570         var table_key = module_select.options[module_select.selectedIndex].value;
571         if (table_key == 'self') {
572             selected_module = current_module;
573                 var field_defs = module_defs[selected_module].field_defs;
574         }
575         else {
576                 selected_module = table_key;
577                 var field_defs = module_defs[full_table_list[table_key].module].field_defs;
578         }
579
580         if ( typeof ( qualifier_name) == 'undefined' ||  qualifier_name == '') {
581                 qualifier_name='equals';
582         }
583
584         var column_name = filter_row.column_select.options[filter_row.column_select.selectedIndex].value;
585
586         if ( typeof ( column_name) == 'undefined' || column_name == '') {
587                 column_name='';
588         }
589         var field = all_fields[column_name].field_def;
590
591         var field_type = field.type;
592         if ( typeof(field.custom_type) != 'undefined') {
593                 field_type = field.custom_type;
594         }
595         cell.innerHTML = "<table><tr></tr></table>";
596
597         var row = cell.getElementsByTagName("tr")[0];
598
599         if (qualifier_name == 'between') {
600                 addFilterInputTextBetween(row,filter);
601         }
602         else if (qualifier_name == 'between_dates') {
603                 addFilterInputDateBetween(row,filter);
604         }
605         else if (qualifier_name == 'empty' || qualifier_name == 'not_empty') {
606             addFilterNoInput(row,filter);
607         }
608         else if (field_type == 'date' || field_type == 'datetime') {
609                 if (qualifier_name.indexOf('tp_') == 0) {
610                         addFilterInputEmpty(row,filter);
611                 }
612
613                 else {
614                         addFilterInputDate(row,filter);
615                 }
616         }
617         else if (field_type == 'id' || field_type == 'name' ) {
618                 if ( qualifier_name == 'is') {
619                         addFilterInputRelate(row,field,filter);
620                 }
621                 else {
622                         addFilterInputText(row,filter);
623                 }
624         }
625         else if ((field_type == 'user_name')||(field_type == 'assigned_user_name')) {
626                 if(users_array=="") {
627                         loadXML();
628                 }
629                 if (qualifier_name == 'one_of') {
630                         addFilterInputSelectMultiple(row,users_array,filter);
631                 }
632                 else {
633                         addFilterInputSelectSingle(row,users_array,filter);
634                 }
635         }
636         else if (field_type == 'enum' || field_type == 'multienum') {
637                 if (qualifier_name == 'one_of') {
638                         addFilterInputSelectMultiple(row,field.options,filter);
639                 }
640                 else {
641                         addFilterInputSelectSingle(row,field.options,filter);
642                 }
643         }
644         else if (field_type=='bool') {
645         var no = new Object();
646         no['value'] = 'yes';
647         no['text'] = SUGAR.language.languages.app_list_strings.checkbox_dom[1];
648         var yes = new Object();
649         yes['value'] = 'no';
650         yes['text'] = SUGAR.language.languages.app_list_strings.checkbox_dom[2];
651         var options = [ yes, no ];
652         addFilterInputSelectSingle(row,options,filter);
653     }
654         else {
655                 addFilterInputText(row,filter);
656         }
657
658         return row;
659 }
660
661 function loadXML() {
662         var gURL = 'index.php?module=Reports&action=fillUserCombo';
663         if (window.XMLHttpRequest) { // code for Mozilla, Safari, etc
664                 xmlhttp=new XMLHttpRequest();
665                 if (xmlhttp.overrideMimeType) {
666                         xmlhttp.overrideMimeType('text/xml');
667                 }
668                 xmlhttp.open("GET", gURL, false);
669                 xmlhttp.onreadystatechange=loadUsers;
670                 xmlhttp.send(null);
671                 loadUsers();
672         }
673         else if (window.ActiveXObject) { //IE
674                 xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
675                 if (xmlhttp) {
676                         xmlhttp.onreadystatechange=loadUsers;
677                         xmlhttp.open('GET', gURL, false);
678                         xmlhttp.send();
679                 }
680         }
681 }
682
683 function loadUsers() {
684         if (xmlhttp.readyState==4) {
685                 if(xmlhttp.status==200 || xmlhttp.status==0){
686                         if (window.ActiveXObject)
687                                 xmlhttp.responseXML.loadXML(xmlhttp.responseText);
688
689                         var acc = xmlhttp.responseXML.getElementsByTagName('data');
690                         var opts = '';
691                         for (var i=0;i<acc.length;i++)
692                         {
693                                 val = getNodeValue(acc[i],'datavalue');
694                                 users_array[users_array.length] = eval("("+val+")");
695                         }
696                 }
697         }
698 }
699
700 function getNodeValue(obj,tag) {
701         return obj.getElementsByTagName(tag)[0].firstChild.nodeValue;
702 }
703
704 function addFilterInputText(row,filter) {
705         var cell = document.createElement("td");
706         var new_input = document.createElement("input");
707         new_input.type="text";
708         if ( typeof (filter.input_name0) == 'undefined') {
709                 filter.input_name0 = '';
710         }
711         new_input.value=filter.input_name0;
712         new_input.name="text_input";
713         new_input.size="30";
714         new_input.maxsize="255";
715         new_input.visible="true";
716         cell.appendChild(new_input);
717         row.appendChild(cell);
718         var filter_row = filters_arr[filters_count_map[current_filter_id]];
719         filter_row.input_field0 = new_input;
720         filter_row.input_field1 = null;
721 }
722
723
724 function to_display_date(date_str) {
725         var date_arr = date_str.match(/([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})/);
726         if ( date_arr != null) {
727                 var new_date = new String(cal_date_format);
728         new_date = new_date.replace("%Y",date_arr[1]);
729         new_date = new_date.replace("%m",date_arr[2]);
730         new_date = new_date.replace("%d",date_arr[3]);
731         return new_date;
732         }
733         else {
734         return date_str;
735         }
736 }
737
738 function addFilterInputDate(row,filter) {
739         var cell = document.createElement("td");
740         cell.setAttribute('valign','middle');
741         var new_input = document.createElement("input");
742         new_input.type="text";
743
744         if ( typeof (filter.input_name0) != 'undefined' && filter.input_name0.length > 0) {
745         new_input.value = to_display_date(filter.input_name0);
746         }
747         new_input.name="text_input";
748         new_input.size="30";
749         new_input.maxsize="255";
750         new_input.visible="true";
751         new_input.setAttribute('id','jscal_field');
752         cell.appendChild(new_input);
753         row.appendChild(cell);
754
755         var cell = document.createElement("td");
756         cell.setAttribute('valign','middle');
757         var img_element = document.createElement("img");
758         img_element.setAttribute('src','index.php?entryPoint=getImage&themeName='+SUGAR.themes.theme_name+'&imageName=jscalendar.gif');
759         img_element.setAttribute('id','jscal_trigger');
760         cell.appendChild(img_element);
761         row.appendChild(cell);
762         Calendar.setup ({
763                 inputFieldObj : new_input ,
764                 buttonObj : img_element,
765                 ifFormat : cal_date_format,
766                 showsTime : false,
767                 singleClick : true, step : 1,
768                 weekNumbers:false
769         });
770
771         var filter_row = filters_arr[filters_count_map[current_filter_id]];
772         filter_row.input_field0 = new_input;
773         filter_row.input_field1 = null;
774 }
775
776 function addFilterNoInput(row,filter) {
777         var cell = document.createElement("td");
778         cell.setAttribute('valign','middle');
779         var new_input = document.createElement("input");
780         new_input.type="hidden";
781         new_input.value=filter.qualifier_name;
782         new_input.name="text_input";
783         cell.appendChild(new_input);
784         row.appendChild(cell);
785 }
786
787 function addFilterInputEmpty(row,filter) {
788         var cell = document.createElement("td");
789         cell.setAttribute('valign','middle');
790         var new_input = document.createElement("input");
791         new_input.type="hidden";
792         new_input.value=filter.qualifier_name;
793         new_input.name="text_input";
794         cell.appendChild(new_input);
795         row.appendChild(cell);
796
797         var cell = document.createElement("td");
798         row.appendChild(cell);
799
800         var filter_row = filters_arr[filters_count_map[current_filter_id]];
801         filter_row.input_field0 = new_input;
802         filter_row.input_field1 = null;
803 }
804
805 function addFilterInputSelectMultiple(row,options,filter) {
806         var cell = document.createElement('td');
807         row.appendChild(cell);
808
809         var select_html_info = new Object();
810         var options_arr = new Array();
811         var select_info = new Object();
812         select_info['size'] = '5';
813         select_info['multiple'] = true;
814         select_html_info['select'] = select_info;
815
816         var selected_map = new Object();
817         for (i=0;i < filter.input_name0.length;i++) {
818                 selected_map[filter.input_name0[i] ] = 1;
819         }
820
821         for(i=0;i < options.length;i++) {
822                 var option_name;
823                 var option_value;
824                 if (typeof(options[i].text) == 'undefined') {
825                         option_text = options[i];
826                         option_value = options[i];
827                 }
828                 else if (options[i].value == '') {
829                         continue;
830                 }
831                 else {
832                         option_text = options[i].text;
833                         option_value = options[i].value;
834                 }
835                 if ( typeof( selected_map[option_value]) != 'undefined' ) {
836                         selected = true;
837                 }
838                 else {
839                         selected = false;
840                 }
841                 var option_info = new Object();
842                 option_info['value'] = option_value;
843                 option_info['text'] = option_text;
844                 option_info['selected'] = selected;
845                 options_arr[options_arr.length] = option_info;
846         }
847
848         select_html_info['options'] = options_arr;
849         cell.innerHTML=buildSelectHTML(select_html_info)
850         var filter_row = filters_arr[filters_count_map[current_filter_id]];
851         filter_row.input_field0 = cell.getElementsByTagName('select')[0];
852         filter_row.input_field1 = null;
853 }
854
855 function addFilterInputSelectSingle(row,options,filter) {
856         var cell = document.createElement('td');
857         row.appendChild(cell);
858
859         var select_html_info = new Object();
860         var options_arr = new Array();
861         var select_info = new Object();
862         select_info['name'] = 'input';
863         select_html_info['select'] = select_info;
864
865         for(i=0;i < options.length;i++) {
866                 if (typeof(options[i].text) == 'undefined') {
867                         option_text = options[i];
868                         option_value = options[i];
869                 }
870                 else if (options[i].value == '') {
871                         continue;
872                 }
873                 else {
874                         option_text = options[i].text;
875                         option_value = options[i].value;
876                 }
877
878                 if (option_value == filter.input_name0 ) {
879                         selected = true;
880                 }
881                 else {
882                         selected = false;
883                 }
884                 var option_info = new Object();
885                 option_info['value'] = option_value;
886                 option_info['text'] = option_text;
887                 option_info['selected'] = selected;
888                 options_arr[options_arr.length] = option_info;
889         }
890         select_html_info['options'] = options_arr;
891         cell.innerHTML=buildSelectHTML(select_html_info);
892         var filter_row = filters_arr[filters_count_map[current_filter_id]];
893         filter_row.input_field0 = cell.getElementsByTagName('select')[0];
894         filter_row.input_field1 = null;
895 }
896
897
898 function addFilterInputTextBetween(row,filter) {
899         var filter_row = filters_arr[filters_count_map[current_filter_id]];
900
901         var cell = document.createElement('td');
902         var new_input = document.createElement("input");
903         new_input.type="text";
904         if (typeof(filter.input_name0) == 'undefined') {
905                 filter.input_name0 = '';
906         }
907
908         new_input.value=filter.input_name0;
909         cell.appendChild(new_input);
910         row.appendChild(cell);
911         filter_row.input_field0 = new_input;
912
913         var cell = document.createElement('td');
914         var new_text = document.createTextNode(lbl_and);
915         cell.appendChild(new_text);
916         row.appendChild(cell);
917
918         var cell = document.createElement('td');
919         var new_input = document.createElement("input");
920         new_input.type="text";
921         if (typeof(filter.input_name1) == 'undefined') {
922                 filter.input_name1 = '';
923         }
924
925         new_input.value=filter.input_name1;
926         cell.appendChild(new_input);
927         row.appendChild(cell);
928         filter_row.input_field1 = new_input;
929 }
930
931 function addFilterInputDateBetween(row,filter) {
932         var filter_row = filters_arr[filters_count_map[current_filter_id]];
933
934         var cell = document.createElement("td");
935         cell.setAttribute('valign','middle');
936         var new_input = document.createElement("input");
937         new_input.type="text";
938         if (typeof(filter.input_name0) == 'undefined') {
939                 filter.input_name0 = '';
940         }
941
942     new_input.value = to_display_date(filter.input_name0);
943         new_input.name="text_input";
944         new_input.size="12";
945         new_input.maxsize="255";
946         new_input.visible="true";
947         new_input.setAttribute('id','jscal_field');
948         cell.appendChild(new_input);
949         row.appendChild(cell);
950         filter_row.input_field1 = new_input;
951
952         var cell = document.createElement("td");
953         cell.setAttribute('valign','middle');
954         var img_element = document.createElement("img");
955         img_element.setAttribute('src','index.php?entryPoint=getImage&themeName='+SUGAR.themes.theme_name+'&imageName=jscalendar.gif');
956         img_element.setAttribute('id','jscal_trigger');
957         cell.appendChild(img_element);
958         row.appendChild(cell);
959
960         Calendar.setup ({
961                 inputFieldObj : new_input ,
962                 buttonObj : img_element,
963                 ifFormat : cal_date_format,
964                 showsTime : false,
965                 singleClick : true,
966                 weekNumbers:false,
967                 step : 1 });
968
969     var cell = document.createElement('td');
970         cell.setAttribute('valign','middle');
971     var new_text = document.createTextNode(lbl_and);
972     cell.appendChild(new_text);
973     row.appendChild(cell);
974
975         var cell = document.createElement("td");
976         cell.setAttribute('valign','middle');
977         var new_input = document.createElement("input");
978         new_input.type="text";
979         if (typeof(filter.input_name1) == 'undefined') {
980                 filter.input_name1 = '';
981         }
982     new_input.value = to_display_date(filter.input_name1);
983         new_input.name="text_input";
984         new_input.size="12";
985         new_input.maxsize="255";
986         new_input.visible="true";
987         new_input.setAttribute('id','jscal_field2');
988         cell.appendChild(new_input);
989         row.appendChild(cell);
990         filter_row.input_field1 = new_input;
991
992         var cell = document.createElement("td");
993         var img_element = document.createElement("img");
994         img_element.setAttribute('src','index.php?entryPoint=getImage&themeName='+SUGAR.themes.theme_name+'&imageName=jscalendar.gif');
995         img_element.setAttribute('id','jscal_trigger2');
996         cell.appendChild(img_element);
997         row.appendChild(cell);
998         Calendar.setup ({
999                 inputFieldObj : new_input ,
1000                 buttonObj : img_element,
1001                 ifFormat : cal_date_format,
1002                 showsTime : false,
1003                 singleClick : true,
1004                 weekNumbers:false,
1005                 step : 1 });
1006 }
1007
1008
1009
1010 var current_parent = '';
1011 var current_parent_id = '';
1012
1013 function set_current_parent(name,value) {
1014         current_parent.value = name;
1015         current_parent_id.value = value;
1016 }
1017
1018 function getModuleInFilter(filter) {
1019         // select the first one if first time load
1020         var selected_module = current_module;
1021         //current_prefix = module_defs[selected_module].label;
1022         current_prefix = 'self';
1023         var view_join = filter.module_cell.getElementsByTagName('select')[0];
1024         var selected_option = view_join.options[view_join.selectedIndex].value;
1025         if ( selected_option != 'self') {
1026                 selected_module = full_table_list[selected_option].module;
1027         }
1028
1029         return selected_module;
1030 }
1031
1032 function set_form_return_reports(popup_reply_data) {
1033         var form_name = popup_reply_data.form_name;
1034         var name_to_value_array = popup_reply_data.name_to_value_array;
1035         var passthru_data = popup_reply_data.passthru_data;
1036
1037         current_parent_id.value = name_to_value_array['id'];
1038         current_parent.value = name_to_value_array['name'];
1039 }
1040
1041 function addFilterInputRelate(row,field,filter) {
1042         var filter_row = filters_arr[filters_count_map[current_filter_id]];
1043         var module_name=getModuleInFilter(filter_row);
1044         var field_name= module_name+":"+field.name;
1045         var field_id_name= module_name+":"+field.name+":id";
1046
1047         var cell = document.createElement('td');
1048         var id_input = document.createElement("input");
1049         id_input.setAttribute('type','hidden');
1050         id_input.setAttribute("name", field_id_name);
1051         id_input.setAttribute("id", field_id_name);
1052         if ( typeof (filter.input_name0) == 'undefined') {
1053                 filter.input_name0 = '';
1054         }
1055         id_input.setAttribute("value",filter.input_name0);
1056         cell.appendChild(id_input);
1057         filter_row.input_field0 = id_input;
1058
1059         var name_input = document.createElement("input");
1060         name_input.setAttribute("type","text");
1061         name_input.setAttribute("readonly","true");
1062         name_input.setAttribute("name", field_name);
1063         name_input.setAttribute("id", field_name);
1064         if ( typeof (filter.input_name1) == 'undefined') {
1065                 filter.input_name1= '';
1066         }
1067         name_input.setAttribute("value",filter.input_name1);
1068         cell.appendChild(name_input);
1069         filter_row.input_field1 = name_input;
1070
1071         row.appendChild(cell);
1072
1073         var cell = document.createElement('td');
1074         var new_input = document.createElement("input");
1075         new_input.title= lbl_select;
1076 //      new_input.accessKey="G";
1077         new_input.type="button";
1078         new_input.value=lbl_select;
1079         new_input.name=field.module;
1080         new_input.setAttribute("class","button");
1081         new_input.onclick= function () {
1082                 current_parent = name_input;
1083                 current_parent_id = id_input;
1084                 return  open_popup(module_name, 600, 400, "", true, false, { "call_back_function":"set_form_return_reports", "form_name":"EditView", "field_to_name_array":{ "id":"id", "name":"name" } });
1085         }
1086
1087         cell.appendChild(new_input);
1088
1089         row.appendChild(cell);
1090 }
1091
1092
1093 function addGroupQualify(cell, group) {
1094         var group_row = groups_arr[groups_count_map[current_group_id]];
1095         var column_name = group_row.column_select.options[group_row.column_select.selectedIndex].value;
1096         var module_select = group_row.module_select;
1097         var table_key = module_select.options[module_select.selectedIndex].value;
1098         if (table_key == 'self') {
1099         selected_module = current_module;
1100         }
1101         else {
1102           selected_module = full_table_list[table_key].module;
1103         }
1104
1105         var field;
1106
1107         if (typeof(column_name) == 'undefined' || column_name == '') {
1108                 field = all_fields['self:name'].field_def;
1109         }
1110         else {
1111                 field = all_fields[column_name].field_def;
1112         }
1113
1114         var field_type = field.type;
1115
1116         if ( typeof(field.custom_type) != 'undefined') {
1117                 field_type = field.custom_type;
1118         }
1119
1120         var style = 'display: inline';
1121         if (field_type != 'date' && field_type != 'datetime') {
1122                 style='display: none';
1123         }
1124
1125         var select_html_info = new Object();
1126         var options = new Array();
1127         var select_info = new Object();
1128         select_info['name'] = 'qualify';
1129         select_info['style'] = style;
1130         select_info['onChange'] = 'reload_columns(\'add\');';
1131         select_html_info['select'] = select_info;
1132
1133         var selected = false;
1134
1135         for(i=0;i < date_group_defs.length; i++) {
1136                 if ( ( typeof(group.qualifier_name) != 'undefined' && date_group_defs[i].name == group.qualifier_name) || (typeof(group.qualifier) != 'undefined' && date_group_defs[i].name == group.qualifier) ) {
1137                         selected = true;
1138                 }
1139                 else {
1140                         selected = false;
1141                 }
1142                 var option_info = new Object();
1143                 option_info['value'] =  date_group_defs[i].name;
1144                 option_info['text'] =  date_group_defs[i].value;
1145                 option_info['selected'] = selected;
1146                 options[options.length] = option_info;
1147         }
1148
1149         select_html_info['options'] = options;
1150         var html =buildSelectHTML(select_html_info);
1151         cell.innerHTML=html;
1152         group_row.qualify_select = cell.getElementsByTagName('select')[0];
1153 }
1154
1155 function addFilterQualify(cell, filter) {
1156         var filter_row = filters_arr[filters_count_map[current_filter_id]];
1157         var field_key = filter_row.column_select.options[filter_row.column_select.selectedIndex].value;
1158
1159         var field = new Object();
1160         if (typeof(field_key) != 'undefined' && field_key != '') {
1161                 field = all_fields[field_key].field_def;
1162         }
1163
1164         var select_html_info = new Object();
1165         var options = new Array();
1166         var select_info = new Object();
1167         select_info['name'] = 'qualify';
1168         select_info['onchange'] = "filterTypeChanged("+current_filter_id+");";
1169         select_html_info['select'] = select_info;
1170
1171         field_type = field.type;
1172
1173         if ( typeof(field.custom_type) != 'undefined') {
1174                 field_type = field.custom_type;
1175         }
1176
1177         var qualifiers = filter_defs[field_type];
1178         var selected = false;
1179
1180         for(i=0;i < qualifiers.length; i++) {
1181                 if (qualifiers[i].name == filter.qualifier_name) {
1182                         selected = true;
1183                 }
1184                 else {
1185                         selected = false;
1186                 }
1187                 var option_info = new Object();
1188                 option_info['value'] =  qualifiers[i].name;
1189                 option_info['text'] =  qualifiers[i].value;
1190                 option_info['selected'] = selected;
1191                 options[options.length] = option_info;
1192         }
1193
1194         select_html_info['options'] = options;
1195         cell.innerHTML=buildSelectHTML(select_html_info);
1196
1197         filter_row['qualify_select'] = cell.getElementsByTagName('select')[0];
1198 }
1199
1200 var default_group = {column_name:''};
1201
1202 function addGroupByFromButton(group) {
1203   addGroupBy(group);
1204   reload_columns('add');
1205 }
1206
1207 function addGroupBy(group) {
1208         groups_arr[groups_arr.length] = new Object();
1209         groups_count++;
1210         groups_count_map[groups_count] = groups_arr.length - 1;
1211         current_group_id = groups_count;
1212
1213         if ( typeof (group) == 'undefined') {
1214                 group = default_group;
1215         }
1216         group.column_name = group.table_key+":"+group.name;
1217
1218         var the_table = document.getElementById('group_by_tbody');
1219         var row = document.createElement('tr');
1220         groups_arr[groups_count_map[groups_count]].row = row;
1221         row.valign="top";
1222
1223         var module_cell = document.createElement('td');
1224         module_cell.valign="top";
1225         row.appendChild(module_cell);
1226         groups_arr[groups_count_map[groups_count]].module_cell = module_cell;
1227         addModuleSelectGroup(module_cell,group);
1228
1229     var column_cell = document.createElement('td');
1230         column_cell.valign="top";
1231         row.appendChild(column_cell);
1232         groups_arr[groups_count_map[groups_count]].column_cell = column_cell;
1233         var new_select = addColumnSelectGroup(column_cell,group);
1234
1235         var qualify_cell = document.createElement('td');
1236         qualify_cell.valign="top";
1237         row.appendChild( qualify_cell);
1238         groups_arr[groups_count_map[groups_count]].qualify_cell = qualify_cell;
1239         var new_filter = addGroupQualify(qualify_cell,group);
1240
1241         var cell = document.createElement('td');
1242         cell.innerHTML = "<input type=button onclick=\"deleteGroup("+groups_count+");\" class=button value="+lbl_remove+">";
1243         row.appendChild(cell);
1244
1245         the_table.appendChild(row);
1246
1247         if(groups_arr.length == 1 && document.EditView.chart_type.options.length > 5) {
1248                 chartTypesHolder.push(document.EditView.chart_type.options[5]);
1249                 document.EditView.chart_type.options[5] = null;
1250         }
1251         else if(groups_arr.length == 2){
1252                 document.EditView.chart_type.options[5] = chartTypesHolder.pop();
1253         }
1254 }
1255
1256 var default_filter = {column_name:'',qualifier_name:'',input_name0:'',input_name1:''};
1257
1258 function addFilter(filter) {
1259         filters_arr[filters_arr.length] = new Object();
1260         filters_count++;
1261         filters_count_map[filters_count] = filters_arr.length - 1;
1262         current_filter_id = filters_count;
1263         if ( typeof(filter) == 'undefined') {
1264                 filter = default_filter;
1265         }
1266
1267         var the_table = document.getElementById('filters');
1268         var row = document.createElement('tr');
1269         filters_arr[filters_count_map[filters_count]].row = row;
1270         row.valign="top";
1271
1272         var module_cell = document.createElement('td');
1273         module_cell.valign="top";
1274         row.appendChild(module_cell);
1275         filters_arr[filters_count_map[filters_count]].module_cell = module_cell;
1276         addModuleSelectFilter(module_cell,filter);
1277
1278         var column_cell = document.createElement('td');
1279         column_cell.valign="top";
1280         row.appendChild(column_cell);
1281         filters_arr[filters_count_map[filters_count]].column_cell = column_cell;
1282         addColumnSelectFilter(column_cell,filter);
1283
1284         var qualify_cell = document.createElement('td');
1285         qualify_cell.valign="top";
1286         row.appendChild(qualify_cell);
1287         filters_arr[filters_count_map[filters_count]].qualify_cell = qualify_cell;
1288         addFilterQualify(qualify_cell,filter);
1289
1290         var input_cell = document.createElement('td');
1291         input_cell.valign="top";
1292         row.appendChild(input_cell);
1293         filters_arr[filters_count_map[filters_count]].input_cell = input_cell;
1294         addFilterInput(input_cell,filter);
1295
1296         var cell = document.createElement('td');
1297         cell.valign="top";
1298         row.appendChild(cell);
1299
1300         var cell = document.createElement('td');
1301         cell.innerHTML = "<input type=button onclick=\"deleteFilter("+filters_count+");\" class=button value='"+lbl_remove+"'>";
1302         row.appendChild(cell);
1303
1304         the_table.appendChild(row);
1305 }
1306
1307 function deleteAllFilters() {
1308         var the_table = document.getElementById('filters');
1309         var rows = the_table.rows;
1310         for (i=rows.length - 1; i >= 0;i--) {
1311                 the_table.removeChild(rows[i]);
1312         }
1313         return;
1314 }
1315
1316 function deleteAllGroups(index) {
1317         if (typeof(groups_arr[groups_count_map[index]])!='undefined') {
1318                 var this_row = groups_arr[groups_count_map[index]].row;
1319                 this_row.parentNode.removeChild(this_row);
1320                 groups_arr.splice(groups_count_map[index],1);
1321
1322                 for ( id in groups_count_map) {
1323                         if (groups_count_map[id] > groups_count_map[index]) {
1324                                 groups_count_map[id]--;
1325                         }
1326                 }
1327
1328                 var group_by_button = document.getElementById('group_by_button');
1329                 group_by_button.style.display = 'inline';
1330         }
1331         return;
1332 }
1333
1334
1335
1336 function remakeGroups() {
1337         document.EditView['report_offset'].value=0;
1338         if (typeof(document.EditView.show_columns) != 'undefined' && document.EditView.show_columns.checked){
1339                 module_defs[current_module].group_by_field_defs = new Object();
1340
1341                 for(i=0; i < object_refs['display_columns'].options.length ;i++)  {
1342                         var field_name =  object_refs['display_columns'].options[i].value;
1343                         var field_def = module_defs[current_module].field_defs[field_name];
1344                         module_defs[current_module].group_by_field_defs[ field_def.name ] = field_def;
1345                 }
1346         }
1347 }
1348
1349 function getListFieldDef(field_key) {
1350         var field_def = new Object();
1351
1352         var vardef =  all_fields[field_key].field_def;
1353         if ( typeof(vardef.field_def_name) != 'undefined') {
1354                 field_def.name = vardef['field_def_name'];
1355         }
1356         else {
1357                 field_def.name = vardef['name'];
1358         }
1359
1360         field_def.label = vardef['vname'];
1361
1362         if ( typeof(vardef.group_function) != 'undefined' && vardef.group_function != null) {
1363                 field_def.group_function = vardef.group_function;
1364         }
1365         if ( typeof(vardef.column_function) != 'undefined' && vardef.column_function != null) {
1366                 field_def.column_function = vardef.column_function;
1367         }
1368         field_def.table_key = all_fields[field_key].linked_field_name;
1369         return field_def;
1370 }
1371
1372 // called on save:
1373 function fill_form(type) {
1374         var report_def = new Object();
1375         var form_obj = document.EditView;
1376
1377   // we want an export of csv:
1378         if ( typeof (type) != 'undefined' && type == 'export') {
1379                 form_obj.to_pdf.value = '';
1380                 form_obj.to_csv.value = 'on';
1381         }
1382         var got_sort = 0;
1383         var got_summary_sort = 0;
1384         var got_summary_column = 0;
1385         var got_error = 0;
1386         var error_msgs =  lbl_missing_fields+': \n';
1387         report_def['report_type'] = getReportType();
1388
1389         report_def.display_columns = new Array();
1390
1391         var group_by_table = document.getElementById('group_by_tbody');
1392
1393         if (document.EditView.show_details.checked == true || report_def.report_type=='tabular') {
1394             var disp_opts = object_refs['display_columns'].options;
1395
1396         // loop thru display columns in the select element
1397             // and construct report_def for display_columns
1398                 for(i=0; i < disp_opts.length ;i++) {
1399                         var field_def = getListFieldDef(disp_opts[i].value);
1400
1401                         if(typeof(disp_opts[i].saved_text) != 'undefined') {
1402                                 field_def['label'] = disp_opts[i].saved_text;
1403                         }
1404                         else {
1405                                 field_def['label'] = disp_opts[i].text;
1406                         }
1407
1408                         report_def.display_columns.push(field_def);
1409
1410                         if (form_obj.sort_by.value == disp_opts[i].value) {
1411                                 got_sort = 1;
1412                         }
1413                 }
1414         }
1415
1416         report_def.summary_columns = new Array();
1417
1418         if (report_def.report_type=='summary' && object_refs['display_summary'].style.display != 'none') {
1419                 // loop thru display columns in the select element
1420                 // and construct report_def for display_columns
1421                 var sum_opts = object_refs['display_summary'].options;
1422                 var summary_column_map = new Object();
1423                 for(i=0; i < sum_opts.length ;i++) {
1424                         var field_def = getListFieldDef(sum_opts[i].value);
1425
1426                         if (typeof(field_def.group_function) != 'undefined') {
1427                                 got_summary_column = 1;
1428                         }
1429
1430                         if(typeof(sum_opts[i].saved_text) != 'undefined') {
1431                                 field_def['label'] = sum_opts[i].saved_text;
1432                         }
1433                         else {
1434                                 field_def['label'] = sum_opts[i].text;
1435                         }
1436
1437                         summary_column_map[sum_opts[i].value] = field_def;
1438
1439                         report_def.summary_columns.push(field_def);
1440
1441                         if (form_obj.summary_sort_by.value == sum_opts[i].value) {
1442                                 got_summary_sort = 1;
1443                         }
1444                 }
1445         }
1446
1447         // set sorting
1448         var sort_by = new Array();
1449         var summary_sort_by = new Array();
1450         var sort_dir = new Array();
1451         var summary_sort_dir = new Array();
1452
1453         if (got_sort == 0 ) {
1454                 form_obj.sort_by.value = '';
1455                 form_obj.sort_dir.value = '';
1456         }
1457         else {
1458                 var sort_by_elem = new Object();
1459                 var sort_by_elem = getListFieldDef(form_obj.sort_by.value);
1460
1461                 sort_by_elem.sort_dir = form_obj.sort_dir.value;
1462                 sort_by.push(sort_by_elem);
1463
1464                 report_def.order_by = sort_by;
1465         }
1466
1467         if (got_summary_sort == 0 || document.EditView.show_details.checked) {
1468                 form_obj.summary_sort_by.value = '';
1469                 form_obj.summary_sort_dir.value = '';
1470         }
1471         else {
1472                 var summary_sort_by_elem = new Object();
1473                 var key_arr = form_obj.summary_sort_by.value.split(':');
1474
1475                 summary_sort_by_elem.name = key_arr[1];
1476
1477                 if ( typeof(all_fields[ form_obj.summary_sort_by.value ].field_def.group_function) != 'undefined') {
1478                         summary_sort_by_elem.group_function = all_fields[ form_obj.summary_sort_by.value ].field_def.group_function;
1479                 }
1480                 else if ( typeof(all_fields[ form_obj.summary_sort_by.value ].field_def.column_function) != 'undefined') {
1481                         summary_sort_by_elem.group_function = all_fields[ form_obj.summary_sort_by.value ].field_def.column_function;
1482                 }
1483
1484                 summary_sort_by_elem.column_function = key_arr[2];
1485                 summary_sort_by_elem.table_key = all_fields[ form_obj.summary_sort_by.value ].linked_field_name;
1486                 summary_sort_by_elem.sort_dir = form_obj.summary_sort_dir.value;
1487                 summary_sort_by.push(summary_sort_by_elem);
1488                 report_def.summary_order_by = summary_sort_by;
1489         }
1490
1491         var group_by_table = document.getElementById('group_by_tbody');
1492         var report_type_elem = document.EditView.report_type;
1493
1494         var group_defs = new Array();
1495
1496         if ((document.EditView.show_details.checked || report_def['report_type'] == 'tabular' ) && object_refs['display_columns'].options.length == 0) {
1497                 error_msgs += lbl_at_least_one_display_column+'\n';
1498                 got_error = 1;
1499         }
1500
1501         if (report_def['report_type'] == 'summary' &&  object_refs['display_summary'].options.length == 0 ) {
1502                 error_msgs += lbl_at_least_one_summary_column+'\n';
1503                 got_error = 1;
1504         }
1505
1506         // check if all options have been filled out for related tables
1507         for(var wp in full_table_list) {
1508                 if(typeof full_table_list[wp].value == 'undefined') {
1509                         error_msgs += lbl_related_table_blank + '\n';
1510                         got_error = 1;
1511                         break;
1512                 }
1513         }
1514         var filter_table = document.getElementById('filters');
1515         var filters_def = new Array();
1516
1517         for(i=0; i < filter_table.rows.length;i++) {
1518                 // the module select is the first cell.. we dont need that
1519                 var cell0 = filter_table.rows[i].cells[1];
1520                 var cell1 = filter_table.rows[i].cells[2];
1521                 var cell2 = filter_table.rows[i].cells[3];
1522
1523                 var column_name = cell0.getElementsByTagName('select')[0].value;
1524                 var filter_def = new Object();
1525                 var field = all_fields[column_name].field_def;
1526                 filter_def.name = field.name;
1527                 filter_def.table_key = all_fields[column_name].linked_field_name;
1528
1529                 column_vname = all_fields[column_name].label_prefix+": "+ field['vname'];
1530                 filter_def.qualifier_name=cell1.getElementsByTagName('select')[0].value;
1531                 var input_arr = cell2.getElementsByTagName('input');
1532
1533                 if ( typeof(input_arr[0]) !=  'undefined') {
1534                         filter_def.input_name0=input_arr[0].value;
1535                         if (input_arr[0].value == '') {
1536                                 got_error = 1;
1537                                 error_msgs += "\""+column_vname+"\""+lbl_missing_input_value+"\n";
1538                         }
1539
1540                         if ( typeof(input_arr[1]) != 'undefined') {
1541                                 filter_def.input_name1=input_arr[1].value;
1542                                 if (input_arr[1].value == '') {
1543                                         got_error = 1;
1544                                         error_msgs += "\"" + column_vname + "\""+lbl_missing_second_input_value+"\n";
1545                                 }
1546                         }
1547
1548                         if(field.type=='datetimecombo'){
1549                                 if( typeof(input_arr[2]) != 'undefined'){
1550                                         filter_def.input_name2=input_arr[2].value;
1551                                         if (input_arr[2].value == '' && input_arr[2].type != 'checkbox') {
1552                                                 got_error = 1;
1553                                                 error_msgs += "\"" + column_vname + "\" "+lbl_missing_input_value+"\n";
1554                                         }
1555                                 }
1556                                 if( typeof(input_arr[3]) != 'undefined'){
1557                                         filter_def.input_name3=input_arr[3].value;
1558                                         if (input_arr[3].value == '' && input_arr[3].type != 'checkbox') {
1559                                                 got_error = 1;
1560                                                 error_msgs += "\"" + column_vname + "\" "+lbl_missing_input_value+"\n";
1561                                         }
1562                                 }
1563                                 if( typeof(input_arr[4]) != 'undefined'){
1564                                         filter_def.input_name4=input_arr[4].value;
1565                                         if (input_arr[4].value == '' && input_arr[4].type != 'checkbox') {
1566                                                 got_error = 1;
1567                                                 error_msgs += "\"" + column_vname + "\" "+lbl_missing_input_value+"\n";
1568                                         }
1569                                 }
1570                         }
1571                 }
1572                 else {
1573                         var got_selected = 0;
1574                         var select_input = cell2.getElementsByTagName('select')[0];
1575                         filter_def.input_name0= new Array();
1576                         for (j=0;j<select_input.options.length;j++) {
1577                                 if (select_input.options[j].selected == true) {
1578                                         filter_def.input_name0.push(decodeURI(select_input.options[j].value));
1579                                         got_selected = 1;
1580                                 }
1581                         }
1582                         if (got_selected==0) {
1583                                 error_msgs += "\"" +column_vname +"\": "+lbl_missing_second_input_value+"\n";
1584                                 got_error = 1;
1585                         }
1586                 }
1587
1588                 if ( field.type == 'datetime' || field.type == 'date') {
1589                         if ( typeof(filter_def.input_name0) != 'undefined' && typeof(filter_def.input_name0) != 'array') {
1590                                 var date_match = filter_def.input_name0.match(date_reg_format);
1591                                 if ( date_match != null) {
1592                                         filter_def.input_name0 = date_match[date_reg_positions['Y']] + "-"+date_match[date_reg_positions['m']] + "-"+date_match[date_reg_positions['d']];
1593                                 }
1594                         }
1595                         if ( typeof(filter_def.input_name1) != 'undefined' && typeof(filter_def.input_name1) != 'array') {
1596                                 var date_match = filter_def.input_name1.match(date_reg_format);
1597                                 if ( date_match != null) {
1598                                         filter_def.input_name1 = date_match[date_reg_positions['Y']] + "-"+date_match[date_reg_positions['m']] + "-"+date_match[date_reg_positions['d']];
1599                                 }
1600                         }
1601                 }else if ( field.type == 'datetimecombo') {
1602                         if ( (typeof(filter_def.input_name0) != 'undefined' && typeof(filter_def.input_name0) != 'array') && (typeof(filter_def.input_name1) != 'undefined' && typeof(filter_def.input_name1) != 'array')) {
1603                                 var date_match = filter_def.input_name0.match(date_reg_format);
1604                                 var time_match = filter_def.input_name1.match(time_reg_format);
1605                                 if ( date_match != null && time_match != null) {
1606                                         filter_def.input_name0 = date_match[date_reg_positions['Y']] + "-"+date_match[date_reg_positions['m']] + "-"+date_match[date_reg_positions['d']] + ' '+ filter_def.input_name1;
1607                                 }
1608                         }
1609                         if ( typeof(filter_def.input_name2) != 'undefined' && typeof(filter_def.input_name2) != 'array' && typeof(filter_def.input_name3) != 'undefined' && typeof(filter_def.input_name3) != 'array') {
1610                                 var date_match = filter_def.input_name2.match(date_reg_format);
1611                                 var time_match = filter_def.input_name3.match(time_reg_format);
1612                                 if ( date_match != null && time_match != null) {
1613                                         filter_def.input_name2 = date_match[date_reg_positions['Y']] + "-"+date_match[date_reg_positions['m']] + "-"+date_match[date_reg_positions['d']] + ' '+ filter_def.input_name3;
1614                                 }
1615                         }
1616                 }
1617                 filters_def.push(filter_def);
1618         }
1619
1620         if (got_error == 1) {
1621                 alert(error_msgs);
1622                 return false;
1623         }
1624
1625         report_def.filters_def = filters_def;
1626
1627         // and/or filter option
1628         report_def.filters_combiner = document.getElementById('filters_combiner').options[document.getElementById('filters_combiner').selectedIndex].value;
1629
1630         var group_by_table = document.getElementById('group_by_tbody');
1631         var group_defs = new Array();
1632
1633         if (report_def.report_type!='tabular') {
1634                 //Loop through the group by table
1635             for(i=0; i < group_by_table.rows.length;i++) {
1636                         var cell0 = group_by_table.rows[i].cells[1];
1637                         var cell1 = group_by_table.rows[i].cells[2];
1638
1639                         var group_by_def = getListFieldDef(cell0.getElementsByTagName('select')[0].value);
1640                         var group_key = cell0.getElementsByTagName('select')[0].value;
1641                         if ( typeof (cell1) !=  'undefined' && cell1.getElementsByTagName('select')[0].style.display != 'none') {
1642                                 group_by_def.qualifier = cell1.getElementsByTagName('select')[0].value;
1643                         }
1644
1645                         //Should this column be displayed?
1646                         if ( typeof(summary_column_map[group_key]) == 'undefined') {
1647                                 // unshift on the display summary columns this group and mark it
1648                                 report_def.summary_columns.unshift( group_by_def);
1649                                 group_by_def.is_group_by = 'hidden';
1650                                 if ( typeof(group_by_def.qualifier) != 'undefined') {
1651                                         group_by_def.column_function = group_by_def.qualifier;
1652                                 }
1653                         }
1654                         else {
1655                                 summary_column_map[group_key].is_group_by = 'visible';
1656                         }
1657
1658                         group_defs.push(group_by_def);
1659                 }
1660         }
1661         report_def.group_defs = group_defs;
1662         var links = getSelectedLinks();
1663         var links_def  = new Array();
1664
1665         for(var i in links) {
1666                 links_def.push(links[i]);
1667         }
1668
1669         var link_joins = getSelectedLinkJoins(links_def);
1670         report_def.full_table_list = full_table_list;
1671
1672         report_def.module = current_module;
1673         report_def.report_name = document.EditView.save_report_as.value;
1674         report_def.chart_type = document.EditView.chart_type.value;
1675         report_def.chart_description = document.EditView.chart_description.value;
1676         report_def.numerical_chart_column = document.EditView.numerical_chart_column.value;
1677
1678         global_report_def = report_def;
1679         report_def.assigned_user_id = document.EditView.assigned_user_id.value;
1680
1681         report_def_str = YAHOO.lang.JSON.stringify(report_def);
1682         form_obj.report_def.value = report_def_str;
1683
1684         return true;
1685 }
1686
1687 function do_export() {
1688         if ( fill_form('export') == true) {
1689                 document.EditView.submit();
1690         }
1691 }
1692
1693 function set_sort(column_name,source) {
1694         if ( source == 'undefined') {
1695                 source = 'columns';
1696         }
1697
1698         var sort_by = 'sort_by';
1699         var sort_dir = 'sort_dir';
1700         if ( source == 'summary') {
1701                 sort_by = 'summary_sort_by';
1702                 sort_dir = 'summary_sort_dir';
1703         }
1704
1705         if (column_name == document.EditView[sort_by].value) {
1706                 if (  document.EditView[sort_dir].value=="d") {
1707                         document.EditView[sort_dir].value = "a";
1708                 }
1709                 else {
1710                         document.EditView[sort_dir].value = "d";
1711                 }
1712         }
1713         else {
1714                 document.EditView[sort_by].value = column_name;
1715                 document.EditView[sort_dir].value = "a";
1716         }
1717         document.EditView.to_pdf.value='';
1718         document.EditView.to_csv.value='';
1719         document.EditView['report_offset'].value=0;
1720         if ( fill_form() == true) {
1721                 document.EditView.submit();
1722         }
1723 }
1724
1725 function set_offset(offset) {
1726         document.EditView['report_offset'].value=offset;
1727         document.EditView.to_pdf.value='';
1728         document.EditView.to_csv.value='';
1729         if ( fill_form() == true) {
1730                 document.EditView.submit();
1731         }
1732
1733 }
1734
1735 function load_page() {
1736         reload_joins();
1737     current_module = document.EditView.self.options[document.EditView.self.options.selectedIndex].value;
1738     reload_join_rows('regular');
1739     all_fields = getAllFieldsMapped(current_module);
1740     if(form_submit != "true")
1741     {
1742         remakeGroups();
1743         reload_groups();
1744         reload_filters();
1745     }
1746     reload_columns('regular');
1747 }
1748
1749 function reload_joins() {
1750         for ( var index in report_def.full_table_list ) {
1751                 var curr_table = report_def.full_table_list[index];
1752
1753                 if ( index != "self" ) {
1754                         add_related(curr_table.parent,index);
1755
1756                         option_selectbox = document.getElementById('outer_' + index);
1757
1758                         if ( option_selectbox != null ) {
1759                                 if ( curr_table.optional != null && curr_table.optional == true ) {
1760                                         option_selectbox.checked = true;
1761                                 }
1762                                 else {
1763                                         option_selectbox.checked = false;
1764                                 }
1765                         }
1766                         else {
1767                                 //alert("option_selectbox is null (outer_" + index + ")");
1768                         }
1769                 }
1770
1771                 var curr_select = document.getElementById(index);
1772                 curr_select.value = curr_table.value;
1773                 full_table_list[index] = curr_table;
1774         }
1775 }
1776
1777 function getFieldKey(field_def) {
1778         var func_name = '';
1779         if (typeof(field_def.group_function) != 'undefined') {
1780                 func_name = field_def.group_function;
1781         }
1782         else if (typeof(field_def.column_function) != 'undefined') {
1783                 func_name = field_def.column_function;
1784         }
1785
1786         if ( field_def.group_function == 'count') {
1787                return 'count';
1788         }
1789         else if (! (func_name == 'weighted_amount' || func_name == 'weighted_sum') && func_name != '' ) {
1790                 return field_def.table_key+":"+field_def.name+":"+func_name;
1791         }
1792
1793         return field_def.table_key+":"+field_def.name;
1794 }
1795
1796
1797 function reload_filters() {
1798         for(index in report_def.filters_def) {
1799                 report_def.filters_def[index].column_name = getFieldKey(report_def.filters_def[index]);
1800                 addFilter(report_def.filters_def[index]);
1801         }
1802 }
1803
1804 function reload_groups() {
1805         for(index in report_def.group_defs) {
1806                 addGroupBy(report_def.group_defs[index]);
1807         }
1808 }
1809
1810 function get_rel_type(linked_field,relationship) {
1811         if ( typeof(linked_field['link_type']) != 'undefined') {
1812                 return linked_field['link_type'];
1813         }
1814
1815         // code should never get this far.. link_type is already defined
1816
1817         if ( relationship.relationship_type == 'one-to-many') {
1818                 if (linked_field.bean_is_lhs == true) {
1819                         if ( relationship['lhs_module'] == linked_field['module']) {
1820                                 return 'one';
1821                         }
1822                         else {
1823                                 return 'many';
1824                         }
1825                 }
1826                 else {
1827                         if ( relationship['rhs_module'] == linked_field['module']) {
1828                                 return 'one';
1829                         }
1830                         else {
1831                                 return 'many';
1832                         }
1833                 }
1834         }
1835
1836         return 'many';
1837 }
1838
1839 function joinChecked(obj) {
1840         reload_columns('add');
1841         reload_join_rows('add');
1842
1843         var objName = obj.id;
1844
1845         // loop thru all filters, refresh module select, and reset if
1846         // was selecting a module that doesnt exist in the current links
1847         for( var index in filters_arr) {
1848                 current_filter_id = index;
1849                 var filter_row = filters_arr[filters_count_map[index]];
1850
1851                 // Bug 13073////
1852                 var filter_module = filter_row.module_select[filter_row.module_select.selectedIndex].value;
1853                 if ( objName.indexOf("_div") > -1)
1854                         filter_module = filter_module.substr(0, objName.indexOf("_div"));
1855
1856                 // If the filter and the object refer to the same module and we aren't just adding more relations...
1857                 // When we add more relations, the object is not a div
1858                 if ( objName.indexOf("_div") > -1 && objName.substr(0, objName.indexOf("_div")) == filter_module) {
1859                         deleteFilter(index);
1860                 }
1861                 else {
1862                         // Bug 13124////
1863                         var filter = {column_name:filter_row.module_select[filter_row.module_select.selectedIndex].value,
1864                                 qualifier_name:'',input_name0:'',input_name1:''};
1865                         // Bug 13124////
1866
1867                         refreshFilterModule(filter_row.module_select,filter,index);
1868                 }
1869         }
1870
1871         for( var index in groups_arr) {
1872                 current_group_id = index;
1873                 var group_row = groups_arr[groups_count_map[index]];
1874                 // Bug 13073////
1875                 var group_module = group_row.module_select[group_row.module_select.selectedIndex].value;
1876                 if ( objName.indexOf("_div") > -1)
1877                         group_module = group_module.substr(0, objName.indexOf("_div"));
1878
1879                 // If the group and the object refer to the same module and we aren't just adding more relations...
1880                 // When we add more relations, the object is not a div
1881                 if ( objName.indexOf("_div") > -1 && objName.substr(0, objName.indexOf("_div")) == group_module) {
1882                         deleteGroup(index);
1883                 }
1884                 else {
1885                         // Bug 13124////
1886                         var group = {column_name:group_row.module_select[group_row.module_select.selectedIndex].value};
1887                         // Bug 13124////
1888                         refreshGroupModule(group_row.module_select,group,index);
1889                         refreshGroupColumn(group_row.column_select,group,index);
1890                         refreshGroupQualify(group_row.qualify_select,group,index);
1891                 }
1892
1893         }
1894 }
1895
1896
1897 function delete_this_join( this_id ) {
1898         // Get rid of my children
1899         delete_join_rows(this_id);
1900
1901         this_obj = document.getElementById(this_id + "_div");
1902         this_obj.parentNode.removeChild(this_obj);
1903
1904         parent_id = full_table_list[this_id].parent;
1905
1906         if ( full_table_list[parent_id] != null ) {
1907                 delete full_table_list[parent_id].children[this_id];
1908         }
1909
1910         delete full_table_list[this_id];
1911         joinChecked(this_obj);
1912 }
1913
1914 function delete_join_rows( parent_id ) {
1915         // Reset the selected fields
1916         all_fields = new Array();
1917
1918         if ( full_table_list[parent_id] != null && full_table_list[parent_id].children != null ) {
1919                 // This guy has some children
1920                 // Make a copy of the list, javascript doesn't like iterating through a list you are modifying.
1921                 var children_list = full_table_list[parent_id].children;
1922
1923                 for ( var child in children_list ) {
1924                         // Delete the grand-children first
1925                         delete_join_rows(child);
1926                         // Then delete the child
1927                         delete full_table_list[child];
1928                         delete full_table_list[parent_id].children[child];
1929                 }
1930         }
1931
1932         // Clear out the HTML div that contains the children
1933         var children_div = document.getElementById(parent_id + "_children");
1934         if ( children_div != null ) {
1935                 children_div.innerHTML = '';
1936                 children_div.style.display = 'none';
1937         }
1938 }
1939
1940 function add_related( parent_id, my_id ) {
1941         var options = new Array();
1942         var option_info = new Object();
1943         option_info['value'] = '';
1944         option_info['text'] = lbl_none;
1945         option_info['selected'] = true;
1946         options[options.length] = option_info;
1947
1948         // Get the parent module name
1949         var mod_name = full_table_list[parent_id].module;
1950         if ( mod_name == null ) {
1951                 alert(lbl_alert_cant_add);
1952                 return(false);
1953         }
1954
1955         if ( module_defs[mod_name] == null ) {
1956                 return(false);
1957         }
1958
1959         // Grab the parent's link list
1960         var link_defs = getLinksByRelType( module_defs[mod_name].link_defs);
1961
1962         var selected_linked_field;
1963
1964         for (linked_field_name in link_defs) {
1965                 var linked_field =  link_defs[linked_field_name];
1966
1967                 var selected = false;
1968                 var option_info = new Object();
1969                 option_info['text'] = linked_field['label'];
1970                 option_info['value'] = linked_field_name;
1971                 option_info['selected'] = false;
1972                 options[options.length] = option_info;
1973         }
1974
1975         var select_html_info = new Object();
1976         var select_info = new Object();
1977
1978         // Find a free ID
1979         if ( my_id == null ) {
1980                 var id_num = 0;
1981                 while ( document.getElementById(parent_id + '_link_' + id_num ) != null ) {
1982                         id_num++;
1983                 }
1984                 select_info['name'] = parent_id + '_link_' + id_num;
1985         }
1986         else {
1987                 // Use the ID that someone gave me.
1988                 select_info['name'] = my_id;
1989         }
1990         select_info['id'] = select_info['name'];
1991         select_info['onchange'] = 'table_changed(this);';
1992         select_html_info['select'] = select_info;
1993
1994         select_html_info['options'] = options;
1995
1996         // Setup the entry in the full table list
1997         full_table_list[select_info['id']] = new Object();
1998         full_table_list[select_info['id']].parent = parent_id;
1999         full_table_list[select_info['id']].children = new Object();
2000
2001         // Add some bookkeeping so that we can properly prune the children
2002         full_table_list[parent_id].children[select_info['id']] = select_info['id'];
2003
2004         children_div = document.getElementById(parent_id + "_children");
2005         if ( children_div.style.display == 'none' ) {
2006                 // We want to add children, we should make the display visible
2007                 children_div.style.display = '';
2008         }
2009
2010         new_child_div = document.createElement('div');
2011         new_child_div.style.marginLeft = '10px';
2012         new_child_div.style.marginTop = '5px';
2013         new_child_div.style.marginBottom = '5px';
2014
2015         new_child_div.innerHTML = "<b>" + LBL_RELATED + "</b>" + buildSelectHTML(select_html_info) +
2016                 ' <a href="" class="button" style="padding: 2px; text-decoration: none;" onClick="add_related(\'' + select_info['name'] + '\'); return(false);">' + lbl_add_related +
2017                 '</a> <a href="" class="button" style="padding: 2px; text-decoration: none;" onClick="delete_this_join(\'' + select_info['name'] + '\'); return(false);">' + lbl_del_this + '</a> ' +
2018                 buildOuterJoinHTML(select_html_info) +
2019                 '<div style="display: none; border-left: 2px dotted #000000; padding-left: 5px;" id="' + select_info['name'] + '_children"></div>';
2020
2021         new_child_div.id = select_info['name'] + '_div';
2022         children_div.appendChild(new_child_div);
2023 }
2024
2025 function reload_join_rows( type ) {
2026         // This function is now blank, in case someone wants to fill it in.
2027 }
2028
2029 //FIXME: Delete, this is now unused
2030 function build_join_rows(module,joins_table,level) {
2031         join_refs = new Array();
2032         if ( typeof (level) == 'undefined') {
2033                 level = 0;
2034         }
2035         level++;
2036
2037         var link_defs = getLinksByRelType( module_defs[module].link_defs,'one');
2038         if ( level == 1) {
2039
2040         }
2041
2042         if ( level < 5 ) {
2043                 var tr = joins_table.insertRow(joins_table.rows.length);
2044                 var td = tr.insertCell(tr.cells.length);
2045                 var hidden_input = '';
2046                 join_index = 0;
2047                 for (linked_field_name in  link_defs) {
2048                         var linked_field = link_defs[linked_field_name];
2049                         var input_elem =  document.createElement('input');
2050                         input_elem.type='hidden';
2051                         input_elem.name='link_'+linked_field['name'];
2052                         input_elem.id='link_'+linked_field['name'];
2053                         input_elem.value=linked_field['name'];
2054
2055                         join_index++;
2056
2057                         join_refs.push(input_elem);
2058                         td.appendChild(input_elem);
2059                 }
2060         }
2061
2062         if ( level == 1 ) {
2063                 var options = new Array();
2064                 var option_info = new Object();
2065                 option_info['value'] = '';
2066                 option_info['text'] = lbl_none;
2067                 option_info['selected'] = selected;
2068                 options[options.length] = option_info;
2069                 var link_defs = getLinksByRelType( module_defs[module].link_defs,'many');
2070
2071                 var selected_linked_field;
2072                 var first = true;
2073                 for (linked_field_name in  link_defs) {
2074                         if (first) {
2075                                 selected_linked_field = link_defs[linked_field_name];
2076                                 first = false;
2077                         }
2078                         var linked_field =  link_defs[linked_field_name];
2079                         var selected = false;
2080                         var option_info = new Object();
2081                         option_info['value'] = linked_field['name'];
2082                         option_info['text'] = linked_field_name.substring(0,1).toUpperCase() + linked_field_name.substring(1,linked_field_name.length);
2083                         option_info['selected'] = selected;
2084                         options[options.length] = option_info;
2085                 }
2086
2087                 var select_html_info = new Object();
2088                 var select_info = new Object();
2089                 select_info['name'] = 'joined';
2090                 select_info['id'] = 'multijoin';
2091                 select_info['onchange'] = 'joinChecked(this);';
2092                 select_html_info['select'] = select_info;
2093
2094                 var tr = joins_table.insertRow(joins_table.rows.length);
2095                 var td = tr.insertCell(tr.cells.length);
2096                 select_html_info['options'] = options;
2097         }
2098 }
2099
2100 function getSelectedLinkJoins( link_array ) {
2101         var link_join_array = new Object();
2102
2103         var outer_check = document.getElementById("outer_joined");
2104         if ( outer_check != null ) {
2105                 link_name = document.forms.EditView.joined;
2106                 if ( outer_check.checked ) {
2107                         link_join_array[link_name.value] = 1;
2108                 }
2109                 else {
2110                         link_join_array[link_name.value] = 0;
2111                 }
2112         }
2113
2114         return link_join_array;
2115 }
2116
2117 function getSelectedLinks() {
2118         var joins_array = new Array();
2119
2120         for (var index in full_table_list) {
2121                 if ( index == 'self' ) {
2122                         // This is the primary module, we don't want to include it
2123                         continue;
2124                 }
2125
2126                 if ( full_table_list[index] != null && full_table_list[index].value != '' ) {
2127                         joins_array.push(index);
2128                 }
2129         }
2130
2131         return joins_array;
2132 }
2133
2134 function getRelatedModule(link_def) {
2135         if(typeof link_def == 'undefined') {
2136                 return;
2137         }
2138         var rel_name = link_def.relationship_name;
2139         var rel_def = rel_defs[rel_name];
2140         if(typeof(rel_def) == 'undefined') {
2141                 return '';
2142         }
2143         if ( link_def.bean_is_lhs ) {
2144                 return rel_def['rhs_module'];
2145         }
2146         else {
2147                 return rel_def['lhs_module'];
2148         }
2149 }
2150
2151
2152 function viewJoinChanged(obj) {
2153         reload_columns('join');
2154 }
2155
2156 function getSelectedLinkDefs(module) {
2157         if ( typeof(module) == 'undefined') {
2158                 module = current_module;
2159         }
2160         var new_links = new Object();
2161         var links = getSelectedLinks()
2162
2163         var type = 'one';
2164         for(var i in  links) {
2165                 if(typeof full_table_list[links[i]].link_def == 'undefined') {
2166                         return;
2167                 }
2168                 var linked_field = full_table_list[links[i]].link_def;
2169
2170                 var selected = false;
2171                 var relationship = rel_defs[linked_field['relationship_name']];
2172                 var rel_type = get_rel_type(linked_field,relationship);
2173
2174                 new_links[links[i]] = linked_field;
2175         }
2176         return new_links;
2177 }
2178
2179 function moduleIsVisible(module) {
2180         if (typeof(visible_modules[module]) == 'undefined') {
2181                 return false;
2182         }
2183         return true;
2184 }
2185
2186 function getLinksByRelType(link_defs,type) {
2187         var new_links = new Object();
2188         for(var i in link_defs) {
2189                 var linked_field = link_defs[i];
2190
2191                 var module = getRelatedModule(linked_field);
2192                 if (! moduleIsVisible(module)) {
2193                         continue;
2194                 }
2195
2196                 var selected = false;
2197                 var relationship = rel_defs[linked_field['relationship_name']];
2198                 var rel_type = get_rel_type(linked_field,relationship);
2199
2200                 if (typeof(type) == 'undefined' || rel_type == type) {
2201                         new_links[i] = link_defs[i];
2202                 }
2203         }
2204         return new_links;
2205 }
2206
2207 //create a unique key for each reportable field across tables
2208
2209 function getAllFieldsMapped(module) {
2210         var all_fields = new Array();
2211         var summary_fields_str = '';
2212
2213         for(var k in module_defs[module].field_defs) {
2214                 all_fields["self:"+module_defs[module].field_defs[k].name] = {"field_def": module_defs[module].field_defs[k],"linked_field_name":"self","label_prefix":module_defs[module].label};
2215         }
2216
2217         for(var k in module_defs[module].summary_field_defs) {
2218                 all_fields["self:"+module_defs[module].summary_field_defs[k].name] = {"field_def": module_defs[module].summary_field_defs[k],"linked_field_name":"self","label_prefix":module_defs[module].label};
2219                         summary_fields_str+='|'+"self:"+module_defs[module].summary_field_defs[k].name;
2220         }
2221
2222         all_fields["count"] = all_fields["self:count"];
2223
2224         var link_defs = getSelectedLinkDefs(module);
2225
2226
2227         for(var i in link_defs) {
2228                 var join_module = getRelatedModule(link_defs[i]);
2229                 if ( typeof(module_defs[join_module]) == 'undefined') {
2230                         continue;
2231                 }
2232
2233                 for( var j in module_defs[join_module].field_defs) {
2234                         all_fields[i+":"+module_defs[join_module].field_defs[j].name] = {"field_def": module_defs[join_module].field_defs[j],"linked_field_name":i,"label_prefix":link_defs[i].label};
2235                 }
2236
2237                 for(var j in module_defs[join_module].summary_field_defs) {
2238                         var sum_field_def = module_defs[join_module].summary_field_defs[j];
2239
2240                         // dont include custom fields on the second level.. yet
2241                         if ( typeof( sum_field_def.field_def_name) != 'undefined') {
2242                                 var field_def = module_defs[join_module].field_defs[sum_field_def.field_def_name];
2243                                 if ( typeof( field_def.custom_type) != 'undefined') {
2244                                         continue;
2245                                 }
2246                         }
2247                         all_fields[i+":"+module_defs[join_module].summary_field_defs[j].name] ={"field_def": module_defs[join_module].summary_field_defs[j],"linked_field_name":i,"label_prefix":link_defs[i].label};
2248                 }
2249         }
2250
2251         return all_fields;
2252 }
2253
2254 // this is called on doubleclick of the columns selector
2255 function doRename(obj) {
2256         var label = prompt("Rename label:\n"+obj.default_label,obj.text);
2257         if ( label != null) {
2258                 obj.text = label;
2259                 obj.saved_text = label;
2260         }
2261 }
2262
2263 function saveLabel(type, obj) {
2264         if(type == 'column') {
2265                 var columns_ref = object_refs['display_columns'];
2266         }
2267         else if(type == 'detailsummary'){
2268                 var columns_ref = object_refs['display_summary'];
2269         }
2270         else {
2271                 return;
2272         }
2273
2274         if(typeof(obj.lastIndex) != 'undefined' &&  obj.lastIndex != -1 ){
2275                 var current_option = columns_ref.options[obj.lastIndex];
2276                 current_option.text =  obj.value + '  [' +  current_option.default_label + ']';
2277                 current_option.saved_text = obj.value;
2278          }
2279          else{
2280                 this.value = '';
2281                 this.lastIndex = -1;
2282          }
2283 }
2284
2285 function reload_columns( reload_type) {
2286         document.getElementById('column_label_editor').value = '';
2287         if ( typeof ( reload_type ) == 'undefined') {
2288                 reload_type = 'default';
2289         }
2290
2291  // get the current module from the dropdown value
2292         current_module = document.EditView.self.options[document.EditView.self.options.selectedIndex].value;
2293
2294         // get the reference to the select objects
2295     display_columns_ref = object_refs['display_columns'];
2296     hidden_columns_ref = object_refs['hidden_columns'];
2297     display_summary_ref = object_refs['display_summary'];
2298     display_summary_ref.onchange = function() {
2299                 var current_option = this.options[this.selectedIndex];
2300                 document.getElementById('detailsummary_label_editor').lastIndex = this.selectedIndex;
2301                 if(typeof(current_option.saved_text) == 'undefined') {
2302                         document.getElementById('detailsummary_label_editor').value =current_option.text;
2303                 }
2304                 else{
2305                         document.getElementById('detailsummary_label_editor').value =current_option.saved_text;
2306                 }
2307         };
2308
2309     hidden_summary_ref = object_refs['hidden_summary'];
2310         display_columns_ref.onchange = function() {
2311                 var current_option = this.options[this.selectedIndex];
2312                 document.getElementById('column_label_editor').lastIndex = this.selectedIndex;
2313                 if(typeof(current_option.saved_text) == 'undefined'){
2314                         document.getElementById('column_label_editor').value =current_option.text;
2315                 }
2316                 else{
2317                         document.getElementById('column_label_editor').value =current_option.saved_text;
2318                 }
2319         };
2320
2321     if ( reload_type == 'default' || reload_type=='regular') {
2322                 if (reload_type == 'default') {
2323                         visible_fields_map = new Object();
2324                         document.EditView.show_details.checked = false;
2325 //                      document.EditView.report_type[0].checked  = true;
2326
2327                         document.getElementById('summary_table').style.display='none';
2328                         document.getElementById('summary_more_div').style.display='none';
2329                         document.getElementById('columns_table').style.display='';
2330                         document.getElementById('columns_more_div').style.display='';
2331                 visible_summary_fields_org = module_defs[current_module].default_summary_columns;
2332
2333                 visible_summary_fields = new Array();
2334
2335                 for(i=0;i < visible_summary_fields_org.length;i++) {
2336                                 if ( visible_summary_fields_org[i] == 'count') {
2337                                 visible_summary_fields.push(  visible_summary_fields_org[i]);
2338                                 }
2339                                 else {
2340                                 visible_summary_fields.push( 'self:'+ visible_summary_fields_org[i]);
2341                                 }
2342                 }
2343                 visible_fields = module_defs[current_module].default_table_columns;
2344                 }
2345
2346                 // TODO: FIX THIS:
2347
2348                 selected_link_name = module_defs[current_module].default_link_name;
2349                 display_columns_ref.options.length = 0;
2350                 display_summary_ref.options.length = 0;
2351                 hidden_columns_ref.options.length = 0;
2352                 hidden_summary_ref.options.length = 0;
2353         }
2354         else if (reload_type == 'add' || reload_type == 'join')  {
2355                 visible_fields = new Array();
2356                 visible_summary_fields = new Array();
2357
2358                 for(i=0;i < display_columns_ref.options.length;i++) {
2359                         visible_fields.push(display_columns_ref.options[i].value);
2360
2361                         if ( typeof(visible_fields_map) != 'undefined' && typeof(visible_fields_map[display_columns_ref.options[i].value]) == 'undefined' ) {
2362                                 if ( typeof (display_columns_ref.options[i].saved_text) != 'undefined') {
2363                                         visible_fields_map[display_columns_ref.options[i].value] = {"label":display_columns_ref.options[i].saved_text};
2364                                 }
2365                         }
2366                 }
2367
2368                 for(i=0;i < display_summary_ref.options.length;i++) {
2369                         visible_summary_fields.push(display_summary_ref.options[i].value);
2370                         if ( typeof(visible_summary_fields_map) != 'undefined' && typeof(visible_summary_fields_map[display_summary_ref.options[i].value]) == 'undefined' ) {
2371                                 if ( typeof (display_summary_ref.options[i].saved_text) != 'undefined') {
2372                                         visible_fields_map[display_summary_ref.options[i].value] = {"label":display_summary_ref.options[i].saved_text};
2373                                 }
2374                         }
2375                 }
2376
2377                 display_columns_ref.options.length = 0;
2378                 display_summary_ref.options.length = 0;
2379                 hidden_columns_ref.options.length = 0;
2380                 hidden_summary_ref.options.length = 0;
2381         }
2382
2383     var seen_visible = new Object();
2384
2385         var view_join = document.EditView.view_join;
2386
2387         var selected_link = '';
2388         var link_defs = getSelectedLinkDefs();
2389
2390         var view_join_value = '';
2391         // first remember what was selected originally
2392         if (typeof(view_join.options) != 'undefined' && view_join.options.length > 0) {
2393                 view_join_value = view_join.options[view_join.selectedIndex].value;
2394         }
2395         // now rebuild the select box that chooses which related table to use when showing the available fields
2396         view_join.options.length = 0;
2397
2398         if ('self' == view_join_value) {
2399                 selected=true;
2400         }
2401         else {
2402                 selected=false;
2403         }
2404
2405         var select_counter = 0;
2406         view_join.options[view_join.options.length] = new Option(module_defs[current_module].label,'self',selected);
2407
2408
2409         for(var i in full_table_list) {
2410                 if ( i == "self" ) {
2411                         // We already added the self option above
2412                         continue;
2413                 }
2414                 var table_def = full_table_list[i];
2415                 var selected = false;
2416                 select_counter++;
2417
2418                 // re-selected the remembered select (if there was one)
2419                 if (i == view_join_value) {
2420                         selected=true;
2421                 }
2422                 else {
2423                         selected=false;
2424                 }
2425
2426                 var label = table_def['label'];
2427                 if ( i != 'self' ) {
2428                         label = full_table_list[full_table_list[i].parent].label + ' > '+ label;
2429                 }
2430
2431                 view_join.options[view_join.options.length] = new Option(label,i,selected);
2432                 if(selected){
2433                         view_join.selectedIndex = select_counter;
2434                 }
2435         }
2436
2437         // select the first one if first time load
2438         var selected_module = current_module;
2439         current_prefix = 'self';
2440         var table_key = view_join.options[view_join.selectedIndex].value;
2441         var field_defs = new Object();
2442         if ( table_key != 'self') {
2443                 current_prefix = table_key;
2444                 selected_module = full_table_list[table_key].module;
2445                 field_defs = module_defs[selected_module].field_defs;
2446         }
2447         else {
2448         field_defs = module_defs[selected_module].field_defs;
2449         }
2450
2451         all_fields = getAllFieldsMapped(current_module);
2452
2453         for(i=0;i < visible_fields.length;i++) {
2454                 if (typeof(all_fields[visible_fields[i]]) == 'undefined') {
2455              continue;
2456                 }
2457                 var field = all_fields[visible_fields[i]].field_def;
2458                 var default_label = all_fields[visible_fields[i]]['label_prefix']+": "+field['vname'];
2459
2460                 if ( typeof (visible_fields_map[visible_fields[i]]) != 'undefined' &&  typeof (visible_fields_map[visible_fields[i]].label) != 'undefined') {
2461                         display_columns_ref.options[display_columns_ref.options.length] = new Option(visible_fields_map[visible_fields[i]].label,all_fields[visible_fields[i]]['linked_field_name']+":"+all_fields[visible_fields[i]].field_def['name']);
2462                 }
2463                 else {
2464                         display_columns_ref.options[display_columns_ref.options.length] = new Option(default_label,all_fields[visible_fields[i]]['linked_field_name']+":"+all_fields[visible_fields[i]].field_def['name']);
2465                 }
2466
2467                 var current_option = display_columns_ref.options[display_columns_ref.options.length-1];
2468                 current_option.default_label = default_label;
2469
2470                 if(current_option.text != current_option.default_label){
2471                         current_option.saved_text = current_option.text;
2472                         current_option.text  += '  [' + default_label + ']';
2473                 }
2474
2475        seen_visible[ visible_fields[i] ] = 1;
2476         }
2477
2478         var field_defs_arr = getOrderedFieldDefArray(field_defs,false);
2479
2480         for(var index in field_defs_arr) {
2481         var field = field_defs_arr[index];
2482         var key = current_prefix +":"+field['name'];
2483
2484                 if ( typeof(all_fields[key]) == 'undefined') {
2485                         continue;
2486                 }
2487
2488                 if (seen_visible[key] != 1) {
2489                         hidden_columns_ref.options[hidden_columns_ref.options.length] = new Option(field['vname'],key);
2490                 }
2491         }
2492
2493         var seen_visible_summary = new Object();
2494         var view_join_summary = document.EditView.view_join_summary;
2495         var selected_link_value = '';
2496
2497         // first remember what was selected originally
2498         if (typeof(view_join_summary.options) != 'undefined' && view_join_summary.options.length > 0) {
2499                 selected_link_value = view_join_summary.options[view_join_summary.selectedIndex].value;
2500         }
2501
2502         // now rebuild the select box that chooses which related table to use when showing the available fields
2503         view_join_summary.options.length = 0;
2504         if ( 'self' == selected_link_value) {
2505                 selected=true;
2506         }
2507         else {
2508                 selected=false;
2509         }
2510
2511         view_join_summary.options[view_join_summary.options.length] = new Option(module_defs[current_module].label,'self',selected);
2512
2513         var summary_select_counter = 0;
2514
2515         for(var i in full_table_list) {
2516                 if ( i == "self" ) {
2517                         // We already added the self option above
2518                         continue;
2519                 }
2520
2521                 var linked_field = full_table_list[i];
2522                 var selected = false;
2523
2524                 // re-selected the remembered select (if there was one)
2525
2526                 if (i == selected_link_value) {
2527                         selected=true;
2528                 }
2529                 else {
2530                         selected=false;
2531                 }
2532
2533                 var label = linked_field['label'];
2534                 if ( i != 'self' ) {
2535                         label = full_table_list[full_table_list[i].parent].label + ' > '+ label;
2536                 }
2537
2538                 summary_select_counter++;
2539                 view_join_summary.options[view_join_summary.options.length] = new Option(label,i,selected);
2540                 if(selected){
2541                         view_join_summary.selectedIndex = summary_select_counter;
2542                 }
2543         }
2544
2545         // select the first one if first time load
2546         var selected_module = current_module;
2547
2548         current_prefix = 'self';
2549
2550         var sum_table_key = view_join_summary.options[view_join_summary.selectedIndex].value;
2551         if ( sum_table_key != '' && sum_table_key != 'self') {
2552                 current_prefix = sum_table_key;
2553                 selected_module = full_table_list[sum_table_key].module;
2554         }
2555
2556
2557         var valid_groups = new Object();
2558
2559         var group_by_table = document.getElementById('group_by_tbody');
2560
2561         has_group = null;
2562
2563         for(i=0; i < group_by_table.rows.length;i++) {
2564         has_group = 1;
2565         var cell0 = group_by_table.rows[i].cells[1];
2566         var cell1 = group_by_table.rows[i].cells[2];
2567                 var key = cell0.getElementsByTagName('select')[0].value;
2568
2569                 if ( typeof(all_fields[key]) == 'undefined') {
2570                         // Not a valid field
2571                         continue;
2572                 }
2573
2574                 var group_by_def = getListFieldDef(key);
2575
2576                 if ( group_by_def.table_key != current_prefix) {
2577                         continue;
2578                 }
2579                 var key = group_by_def.table_key+":"+group_by_def.name;
2580
2581                 if ( typeof (cell1) !=  'undefined' && cell1.getElementsByTagName('select')[0].style.display != 'none') {
2582                         key += ":"+cell1.getElementsByTagName('select')[0].value;
2583                 }
2584
2585         valid_groups[key] = 1;
2586         }
2587
2588     var field_defs = module_defs[selected_module].field_defs;
2589         var numerical_chart_column = document.EditView.numerical_chart_column;
2590         numerical_chart_column.options.length = 0;
2591         var which_option_selected = 0;
2592
2593         for(i=0;i < visible_summary_fields.length;i++) {
2594                 var key = visible_summary_fields[i];
2595                 if (typeof(all_fields[key]) == 'undefined' || typeof( all_fields[key].field_def) == 'undefined') {
2596             continue;
2597                 }
2598
2599                 if ( (typeof(valid_groups[key]) == 'undefined' && ( typeof( all_fields[key].field_def.summary_type)  == 'undefined'
2600              || all_fields[key].field_def.summary_type != 'group'))) {
2601                         continue;
2602                 }
2603
2604                 var field = all_fields[key].field_def;
2605                 var linked_field_name = '';
2606                 var label_prefix = '';
2607                 var default_label =  '';
2608
2609                 if ( field.name == 'count') {
2610                         key = 'count';
2611                         default_label = field['vname'];
2612                 }
2613                 else {
2614                         linked_field_name = all_fields[key].linked_field_name;
2615                         label_prefix = all_fields[key].label_prefix;
2616                         default_label = label_prefix+": "+field['vname'];
2617                 }
2618
2619                 var column_label;
2620
2621                 if (  typeof (visible_summary_field_map[key]) != 'undefined' && typeof (visible_summary_field_map[key].label) != 'undefined') {
2622                         column_label = visible_summary_field_map[key].label;
2623                 }
2624                 else {
2625                         column_label = default_label;
2626                 }
2627
2628                 display_summary_ref.options[display_summary_ref.options.length] = new Option(column_label,key);
2629                 var split_key = key.split(':');
2630                 var summary_field = all_fields[key].field_def;
2631                 if ( typeof (summary_field.group_function) != 'undefined') {
2632                         if (key == report_def['numerical_chart_column']) {
2633                                 which_option_selected = numerical_chart_column.options.length;
2634                         }
2635                         numerical_chart_column.options[numerical_chart_column.options.length] = new Option( column_label,key);
2636                 }
2637
2638                 var current_option = display_summary_ref.options[display_summary_ref.options.length-1];
2639                 current_option.default_label = default_label;
2640                 if(current_option.text != current_option.default_label) {
2641                         current_option.saved_text = current_option.text;
2642                         current_option.text  += '  [' + default_label + ']';
2643                 }
2644
2645                 seen_visible_summary[ key] = 1;
2646         }
2647
2648         numerical_chart_column.options.selectedIndex = which_option_selected;
2649
2650         var summary_field_defs = module_defs[selected_module].summary_field_defs;
2651         var field_defs_arr = getOrderedFieldDefArray(field_defs,false);
2652
2653         group_field = null;
2654         for(group_key in valid_groups) {
2655                 if(typeof all_fields[group_key] != 'undefined') {
2656                         group_field = all_fields[group_key].field_def;
2657
2658                         if (seen_visible_summary[group_key] != 1) {
2659                                 hidden_summary_ref.options[hidden_summary_ref.options.length] = new Option(group_field['vname'],group_key);
2660                         }
2661                         seen_visible_summary[group_key] = 1;
2662                 }
2663         }
2664
2665         for( var index in summary_field_defs) {
2666                 var field = summary_field_defs[index];
2667                 if ( field.summary_type != 'group') {
2668                         continue;
2669                 }
2670
2671         var key = current_prefix +":"+field['name'];
2672
2673                 if ( field['name'] == 'count') {
2674                         key = 'count';
2675                 }
2676
2677                 if ( typeof(all_fields[key]) == 'undefined') {
2678                         continue;
2679                 }
2680
2681                 if (seen_visible_summary[key] != 1) {
2682                         hidden_summary_ref.options[hidden_summary_ref.options.length] = new Option(field['vname'],key);
2683                 }
2684         }
2685
2686         refresh_chart_tab();
2687         var selected_chart_index = 1;
2688         if (reload_type == 'regular') {
2689                 for(var i=0;i < document.EditView.chart_type.options.length; i++) {
2690                         if (document.EditView.chart_type.options[i].value == report_def.chart_type) {
2691                                 selected_chart_index = i;
2692                         }
2693                 }
2694                 document.EditView.chart_type.selectedIndex = selected_chart_index;
2695         }
2696 }
2697
2698 function refresh_chart_tab() {
2699         if ( document.EditView.numerical_chart_column.options.length > 0 && has_group != null) {
2700                 document.getElementById('no_chart_text').style.display='none';
2701                 document.EditView.numerical_chart_column.disabled = false;
2702                 document.EditView.chart_type.disabled = false;
2703                 document.EditView.chart_type.selectedIndex = 1;
2704                 document.EditView.chart_description.disabled = false;
2705         }
2706         else {
2707                 document.getElementById('no_chart_text').style.display='';
2708                 document.EditView.numerical_chart_column.disabled = true;
2709                 document.EditView.chart_type.disabled = true;
2710                 document.EditView.chart_type.selectedIndex = 0;
2711                 document.EditView.chart_description.disabled = true;
2712         }
2713 }
2714
2715 function set_readonly(form) {
2716         if (form.save_report.checked) {
2717                 form.save_report.value='on';
2718                 form.save_report_as.readOnly=false;
2719                 form.save_report_as.focus();
2720         }
2721         else {
2722                 form.save_report.value='off';
2723                 form.save_report_as.readOnly=true;
2724         }
2725 }
2726
2727 // add non-standard attrs to the newly created option objects
2728 function addSelectOptionAttrs(info,obj) {
2729         for(i=0; i < info['options'].length; i++) {
2730                 option = info['options'][i];
2731                 var attr = new Object();
2732
2733                 for( var j in option ) {
2734                         if ( j != 'text' &&  j != 'value' && j != 'selected' && j != 'name' && j != 'id') {
2735                         obj.options[i][j] = option[j];
2736                         }
2737                 }
2738         }
2739 }
2740
2741 //builds the html for a select
2742 function buildSelectHTML(info) {
2743         var text;
2744         text = "<select";
2745
2746         for(var key in info['select']) {
2747                 if ( typeof (info['select'][key]) != 'undefined') {
2748                         text +=" "+ key +"=\""+ info['select'][key] +"\"";
2749                 }
2750         }
2751         text +=">";
2752
2753         var saved_attrs = new Array();
2754
2755         for(i=0; i < info['options'].length; i++) {
2756                 option = info['options'][i];
2757                 var attr = new Object();
2758                 for( var j in option ) {
2759             if ( j != 'text' &&  j != 'value' && j != 'selected' && j != 'name' && j != 'id') {
2760                                 attr[j] = option[j];
2761             }
2762                 }
2763                 saved_attrs.push(attr);
2764                 text += "<option value=\""+encodeURI(option['value'])+"\" ";
2765
2766                 if ( typeof (option['selected']) != 'undefined' && option['selected']== true) {
2767                         text += "SELECTED";
2768                 }
2769                 text += ">"+option['text']+"</option>";
2770         }
2771         text += "</select>";
2772         return text;
2773 }
2774
2775 function buildOuterJoinHTML(info) {
2776         var text;
2777         var checked;
2778
2779         checked = '';
2780         if ( report_def.link_joins != null ) {
2781                 for ( key in report_def.link_joins ) {
2782                         if ( report_def.link_joins[key] == 1 ) {
2783                                 checked = 'CHECKED';
2784                         }
2785                 }
2786         }
2787         text = " <input class='checkbox' type='checkbox' name='outer_" + info['select']['name'] + "' id='outer_" + info['select']['name'] + "' value=1 " + checked + " onChange='updateOuterJoin(this);'> " + lbl_outer_join_checkbox;
2788         text += '<img border="0" class="inlineHelpTip" src="' + image_path +'help.gif" onclick="SUGAR.util.showHelpTips(this,\''+ lbl_optional_help +'\')"/>';
2789
2790         return text;
2791 }
2792
2793 // This function is called when the outer join/optional checkbox is checked.
2794 function updateOuterJoin ( obj ) {
2795         // Nuke the outer_ part at the front of the string, to get the table key
2796         table_key = obj.id.replace("outer_","");
2797
2798         if ( obj.checked == true ) {
2799                 full_table_list[table_key].optional = true;
2800         }
2801         else {
2802                 full_table_list[table_key].optional = false;
2803         }
2804 }
2805
2806 function saved_chart_drilldown(group_value,group_key,id) {
2807        var report_url = 'index.php?module=Reports&page=report&action=index&id='+id+'#'+group_value;
2808        document.location = report_url;
2809 }
2810
2811 function chart_drilldown(group_value,is_saved_report,id) {
2812         var anch = document.getElementById(group_value);
2813         var elems = document.anchors;
2814
2815         for(var i in elems) {
2816                 var elem = elems[i];
2817                 if ( typeof(elem.name) != 'undefined' && elem.name != '' && typeof(elem.id) != 'undefined' && elem.id != '' && elem.id == elem.name) {
2818                         if ( group_value == elem.name ) {
2819                                 elem.focus();
2820                                 window.scrollBy(0,300);
2821                         }
2822                 }
2823         }
2824 }
2825
2826 function expandCollapseComboSummaryDiv(divId) {
2827         if (document.getElementById(divId)) {
2828                 if (document.getElementById(divId).style.display == "none") {
2829                         document.getElementById(divId).style.display = "";
2830                         document.getElementById("img_" + divId).innerHTML =
2831                                 document.getElementById("img_" + divId).innerHTML.replace(/advanced_search/,"basic_search");
2832                         document.getElementById('expanded_combo_summary_divs').value += divId + " ";
2833                 }
2834                 else {
2835                         document.getElementById(divId).style.display = "none";
2836                         document.getElementById("img_" + divId).innerHTML =
2837                                 document.getElementById("img_" + divId).innerHTML.replace(/basic_search/,"advanced_search");
2838                         document.getElementById('expanded_combo_summary_divs').value =
2839                                 document.getElementById('expanded_combo_summary_divs').value.replace(divId,"");
2840
2841                 }
2842         }
2843 }