]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - jssource/src_files/include/javascript/report_additionals.js
Release 6.5.16
[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 dbValue = convertReportDateTimeToDB(filter_def.input_name0, filter_def.input_name1);
1604                 if (dbValue != '') {
1605                     filter_def.input_name0 = dbValue;
1606                 }
1607                         }
1608                         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') {
1609                 var dbValue = convertReportDateTimeToDB(filter_def.input_name2, filter_def.input_name3);
1610                 if (dbValue != '') {
1611                     filter_def.input_name2 = dbValue;
1612                 }
1613                         }
1614                 }
1615                 filters_def.push(filter_def);
1616         }
1617
1618         if (got_error == 1) {
1619                 alert(error_msgs);
1620                 return false;
1621         }
1622
1623         report_def.filters_def = filters_def;
1624
1625         // and/or filter option
1626         report_def.filters_combiner = document.getElementById('filters_combiner').options[document.getElementById('filters_combiner').selectedIndex].value;
1627
1628         var group_by_table = document.getElementById('group_by_tbody');
1629         var group_defs = new Array();
1630
1631         if (report_def.report_type!='tabular') {
1632                 //Loop through the group by table
1633             for(i=0; i < group_by_table.rows.length;i++) {
1634                         var cell0 = group_by_table.rows[i].cells[1];
1635                         var cell1 = group_by_table.rows[i].cells[2];
1636
1637                         var group_by_def = getListFieldDef(cell0.getElementsByTagName('select')[0].value);
1638                         var group_key = cell0.getElementsByTagName('select')[0].value;
1639                         if ( typeof (cell1) !=  'undefined' && cell1.getElementsByTagName('select')[0].style.display != 'none') {
1640                                 group_by_def.qualifier = cell1.getElementsByTagName('select')[0].value;
1641                         }
1642
1643                         //Should this column be displayed?
1644                         if ( typeof(summary_column_map[group_key]) == 'undefined') {
1645                                 // unshift on the display summary columns this group and mark it
1646                                 report_def.summary_columns.unshift( group_by_def);
1647                                 group_by_def.is_group_by = 'hidden';
1648                                 if ( typeof(group_by_def.qualifier) != 'undefined') {
1649                                         group_by_def.column_function = group_by_def.qualifier;
1650                                 }
1651                         }
1652                         else {
1653                                 summary_column_map[group_key].is_group_by = 'visible';
1654                         }
1655
1656                         group_defs.push(group_by_def);
1657                 }
1658         }
1659         report_def.group_defs = group_defs;
1660         var links = getSelectedLinks();
1661         var links_def  = new Array();
1662
1663         for(var i in links) {
1664                 links_def.push(links[i]);
1665         }
1666
1667         var link_joins = getSelectedLinkJoins(links_def);
1668         report_def.full_table_list = full_table_list;
1669
1670         report_def.module = current_module;
1671         report_def.report_name = document.EditView.save_report_as.value;
1672         report_def.chart_type = document.EditView.chart_type.value;
1673         report_def.chart_description = document.EditView.chart_description.value;
1674         report_def.numerical_chart_column = document.EditView.numerical_chart_column.value;
1675
1676         global_report_def = report_def;
1677         report_def.assigned_user_id = document.EditView.assigned_user_id.value;
1678
1679         report_def_str = YAHOO.lang.JSON.stringify(report_def);
1680         form_obj.report_def.value = report_def_str;
1681
1682         return true;
1683 }
1684
1685 function do_export() {
1686         if ( fill_form('export') == true) {
1687                 document.EditView.submit();
1688         }
1689 }
1690
1691 function set_sort(column_name,source) {
1692         if ( source == 'undefined') {
1693                 source = 'columns';
1694         }
1695
1696         var sort_by = 'sort_by';
1697         var sort_dir = 'sort_dir';
1698         if ( source == 'summary') {
1699                 sort_by = 'summary_sort_by';
1700                 sort_dir = 'summary_sort_dir';
1701         }
1702
1703         if (column_name == document.EditView[sort_by].value) {
1704                 if (  document.EditView[sort_dir].value=="d") {
1705                         document.EditView[sort_dir].value = "a";
1706                 }
1707                 else {
1708                         document.EditView[sort_dir].value = "d";
1709                 }
1710         }
1711         else {
1712                 document.EditView[sort_by].value = column_name;
1713                 document.EditView[sort_dir].value = "a";
1714         }
1715         document.EditView.to_pdf.value='';
1716         document.EditView.to_csv.value='';
1717         document.EditView['report_offset'].value=0;
1718         if ( fill_form() == true) {
1719                 document.EditView.submit();
1720         }
1721 }
1722
1723 function set_offset(offset) {
1724         document.EditView['report_offset'].value=offset;
1725         document.EditView.to_pdf.value='';
1726         document.EditView.to_csv.value='';
1727         if ( fill_form() == true) {
1728                 document.EditView.submit();
1729         }
1730
1731 }
1732
1733 function load_page() {
1734         reload_joins();
1735     current_module = document.EditView.self.options[document.EditView.self.options.selectedIndex].value;
1736     reload_join_rows('regular');
1737     all_fields = getAllFieldsMapped(current_module);
1738     if(form_submit != "true")
1739     {
1740         remakeGroups();
1741         reload_groups();
1742         reload_filters();
1743     }
1744     reload_columns('regular');
1745 }
1746
1747 function reload_joins() {
1748         for ( var index in report_def.full_table_list ) {
1749                 var curr_table = report_def.full_table_list[index];
1750
1751                 if ( index != "self" ) {
1752                         add_related(curr_table.parent,index);
1753
1754                         option_selectbox = document.getElementById('outer_' + index);
1755
1756                         if ( option_selectbox != null ) {
1757                                 if ( curr_table.optional != null && curr_table.optional == true ) {
1758                                         option_selectbox.checked = true;
1759                                 }
1760                                 else {
1761                                         option_selectbox.checked = false;
1762                                 }
1763                         }
1764                         else {
1765                                 //alert("option_selectbox is null (outer_" + index + ")");
1766                         }
1767                 }
1768
1769                 var curr_select = document.getElementById(index);
1770                 curr_select.value = curr_table.value;
1771                 full_table_list[index] = curr_table;
1772         }
1773 }
1774
1775 function getFieldKey(field_def) {
1776         var func_name = '';
1777         if (typeof(field_def.group_function) != 'undefined') {
1778                 func_name = field_def.group_function;
1779         }
1780         else if (typeof(field_def.column_function) != 'undefined') {
1781                 func_name = field_def.column_function;
1782         }
1783
1784         if ( field_def.group_function == 'count') {
1785                return 'count';
1786         }
1787         else if (! (func_name == 'weighted_amount' || func_name == 'weighted_sum') && func_name != '' ) {
1788                 return field_def.table_key+":"+field_def.name+":"+func_name;
1789         }
1790
1791         return field_def.table_key+":"+field_def.name;
1792 }
1793
1794
1795 function reload_filters() {
1796         for(index in report_def.filters_def) {
1797                 report_def.filters_def[index].column_name = getFieldKey(report_def.filters_def[index]);
1798                 addFilter(report_def.filters_def[index]);
1799         }
1800 }
1801
1802 function reload_groups() {
1803         for(index in report_def.group_defs) {
1804                 addGroupBy(report_def.group_defs[index]);
1805         }
1806 }
1807
1808 function get_rel_type(linked_field,relationship) {
1809         if ( typeof(linked_field['link_type']) != 'undefined') {
1810                 return linked_field['link_type'];
1811         }
1812
1813         // code should never get this far.. link_type is already defined
1814
1815         if ( relationship.relationship_type == 'one-to-many') {
1816                 if (linked_field.bean_is_lhs == true) {
1817                         if ( relationship['lhs_module'] == linked_field['module']) {
1818                                 return 'one';
1819                         }
1820                         else {
1821                                 return 'many';
1822                         }
1823                 }
1824                 else {
1825                         if ( relationship['rhs_module'] == linked_field['module']) {
1826                                 return 'one';
1827                         }
1828                         else {
1829                                 return 'many';
1830                         }
1831                 }
1832         }
1833
1834         return 'many';
1835 }
1836
1837 function joinChecked(obj) {
1838         reload_columns('add');
1839         reload_join_rows('add');
1840
1841         var objName = obj.id;
1842
1843         // loop thru all filters, refresh module select, and reset if
1844         // was selecting a module that doesnt exist in the current links
1845         for( var index in filters_arr) {
1846                 current_filter_id = index;
1847                 var filter_row = filters_arr[filters_count_map[index]];
1848
1849                 // Bug 13073////
1850                 var filter_module = filter_row.module_select[filter_row.module_select.selectedIndex].value;
1851                 if ( objName.indexOf("_div") > -1)
1852                         filter_module = filter_module.substr(0, objName.indexOf("_div"));
1853
1854                 // If the filter and the object refer to the same module and we aren't just adding more relations...
1855                 // When we add more relations, the object is not a div
1856                 if ( objName.indexOf("_div") > -1 && objName.substr(0, objName.indexOf("_div")) == filter_module) {
1857                         deleteFilter(index);
1858                 }
1859                 else {
1860                         // Bug 13124////
1861                         var filter = {column_name:filter_row.module_select[filter_row.module_select.selectedIndex].value,
1862                                 qualifier_name:'',input_name0:'',input_name1:''};
1863                         // Bug 13124////
1864
1865                         refreshFilterModule(filter_row.module_select,filter,index);
1866                 }
1867         }
1868
1869         for( var index in groups_arr) {
1870                 current_group_id = index;
1871                 var group_row = groups_arr[groups_count_map[index]];
1872                 // Bug 13073////
1873                 var group_module = group_row.module_select[group_row.module_select.selectedIndex].value;
1874                 if ( objName.indexOf("_div") > -1)
1875                         group_module = group_module.substr(0, objName.indexOf("_div"));
1876
1877                 // If the group and the object refer to the same module and we aren't just adding more relations...
1878                 // When we add more relations, the object is not a div
1879                 if ( objName.indexOf("_div") > -1 && objName.substr(0, objName.indexOf("_div")) == group_module) {
1880                         deleteGroup(index);
1881                 }
1882                 else {
1883                         // Bug 13124////
1884                         var group = {column_name:group_row.module_select[group_row.module_select.selectedIndex].value};
1885                         // Bug 13124////
1886                         refreshGroupModule(group_row.module_select,group,index);
1887                         refreshGroupColumn(group_row.column_select,group,index);
1888                         refreshGroupQualify(group_row.qualify_select,group,index);
1889                 }
1890
1891         }
1892 }
1893
1894
1895 function delete_this_join( this_id ) {
1896         // Get rid of my children
1897         delete_join_rows(this_id);
1898
1899         this_obj = document.getElementById(this_id + "_div");
1900         this_obj.parentNode.removeChild(this_obj);
1901
1902         parent_id = full_table_list[this_id].parent;
1903
1904         if ( full_table_list[parent_id] != null ) {
1905                 delete full_table_list[parent_id].children[this_id];
1906         }
1907
1908         delete full_table_list[this_id];
1909         joinChecked(this_obj);
1910 }
1911
1912 function delete_join_rows( parent_id ) {
1913         // Reset the selected fields
1914         all_fields = new Array();
1915
1916         if ( full_table_list[parent_id] != null && full_table_list[parent_id].children != null ) {
1917                 // This guy has some children
1918                 // Make a copy of the list, javascript doesn't like iterating through a list you are modifying.
1919                 var children_list = full_table_list[parent_id].children;
1920
1921                 for ( var child in children_list ) {
1922                         // Delete the grand-children first
1923                         delete_join_rows(child);
1924                         // Then delete the child
1925                         delete full_table_list[child];
1926                         delete full_table_list[parent_id].children[child];
1927                 }
1928         }
1929
1930         // Clear out the HTML div that contains the children
1931         var children_div = document.getElementById(parent_id + "_children");
1932         if ( children_div != null ) {
1933                 children_div.innerHTML = '';
1934                 children_div.style.display = 'none';
1935         }
1936 }
1937
1938 function add_related( parent_id, my_id ) {
1939         var options = new Array();
1940         var option_info = new Object();
1941         option_info['value'] = '';
1942         option_info['text'] = lbl_none;
1943         option_info['selected'] = true;
1944         options[options.length] = option_info;
1945
1946         // Get the parent module name
1947         var mod_name = full_table_list[parent_id].module;
1948         if ( mod_name == null ) {
1949                 alert(lbl_alert_cant_add);
1950                 return(false);
1951         }
1952
1953         if ( module_defs[mod_name] == null ) {
1954                 return(false);
1955         }
1956
1957         // Grab the parent's link list
1958         var link_defs = getLinksByRelType( module_defs[mod_name].link_defs);
1959
1960         var selected_linked_field;
1961
1962         for (linked_field_name in link_defs) {
1963                 var linked_field =  link_defs[linked_field_name];
1964
1965                 var selected = false;
1966                 var option_info = new Object();
1967                 option_info['text'] = linked_field['label'];
1968                 option_info['value'] = linked_field_name;
1969                 option_info['selected'] = false;
1970                 options[options.length] = option_info;
1971         }
1972
1973         var select_html_info = new Object();
1974         var select_info = new Object();
1975
1976         // Find a free ID
1977         if ( my_id == null ) {
1978                 var id_num = 0;
1979                 while ( document.getElementById(parent_id + '_link_' + id_num ) != null ) {
1980                         id_num++;
1981                 }
1982                 select_info['name'] = parent_id + '_link_' + id_num;
1983         }
1984         else {
1985                 // Use the ID that someone gave me.
1986                 select_info['name'] = my_id;
1987         }
1988         select_info['id'] = select_info['name'];
1989         select_info['onchange'] = 'table_changed(this);';
1990         select_html_info['select'] = select_info;
1991
1992         select_html_info['options'] = options;
1993
1994         // Setup the entry in the full table list
1995         full_table_list[select_info['id']] = new Object();
1996         full_table_list[select_info['id']].parent = parent_id;
1997         full_table_list[select_info['id']].children = new Object();
1998
1999         // Add some bookkeeping so that we can properly prune the children
2000         full_table_list[parent_id].children[select_info['id']] = select_info['id'];
2001
2002         children_div = document.getElementById(parent_id + "_children");
2003         if ( children_div.style.display == 'none' ) {
2004                 // We want to add children, we should make the display visible
2005                 children_div.style.display = '';
2006         }
2007
2008         new_child_div = document.createElement('div');
2009         new_child_div.style.marginLeft = '10px';
2010         new_child_div.style.marginTop = '5px';
2011         new_child_div.style.marginBottom = '5px';
2012
2013         new_child_div.innerHTML = "<b>" + LBL_RELATED + "</b>" + buildSelectHTML(select_html_info) +
2014                 ' <a href="" class="button" style="padding: 2px; text-decoration: none;" onClick="add_related(\'' + select_info['name'] + '\'); return(false);">' + lbl_add_related +
2015                 '</a> <a href="" class="button" style="padding: 2px; text-decoration: none;" onClick="delete_this_join(\'' + select_info['name'] + '\'); return(false);">' + lbl_del_this + '</a> ' +
2016                 buildOuterJoinHTML(select_html_info) +
2017                 '<div style="display: none; border-left: 2px dotted #000000; padding-left: 5px;" id="' + select_info['name'] + '_children"></div>';
2018
2019         new_child_div.id = select_info['name'] + '_div';
2020         children_div.appendChild(new_child_div);
2021 }
2022
2023 function reload_join_rows( type ) {
2024         // This function is now blank, in case someone wants to fill it in.
2025 }
2026
2027 //FIXME: Delete, this is now unused
2028 function build_join_rows(module,joins_table,level) {
2029         join_refs = new Array();
2030         if ( typeof (level) == 'undefined') {
2031                 level = 0;
2032         }
2033         level++;
2034
2035         var link_defs = getLinksByRelType( module_defs[module].link_defs,'one');
2036         if ( level == 1) {
2037
2038         }
2039
2040         if ( level < 5 ) {
2041                 var tr = joins_table.insertRow(joins_table.rows.length);
2042                 var td = tr.insertCell(tr.cells.length);
2043                 var hidden_input = '';
2044                 join_index = 0;
2045                 for (linked_field_name in  link_defs) {
2046                         var linked_field = link_defs[linked_field_name];
2047                         var input_elem =  document.createElement('input');
2048                         input_elem.type='hidden';
2049                         input_elem.name='link_'+linked_field['name'];
2050                         input_elem.id='link_'+linked_field['name'];
2051                         input_elem.value=linked_field['name'];
2052
2053                         join_index++;
2054
2055                         join_refs.push(input_elem);
2056                         td.appendChild(input_elem);
2057                 }
2058         }
2059
2060         if ( level == 1 ) {
2061                 var options = new Array();
2062                 var option_info = new Object();
2063                 option_info['value'] = '';
2064                 option_info['text'] = lbl_none;
2065                 option_info['selected'] = selected;
2066                 options[options.length] = option_info;
2067                 var link_defs = getLinksByRelType( module_defs[module].link_defs,'many');
2068
2069                 var selected_linked_field;
2070                 var first = true;
2071                 for (linked_field_name in  link_defs) {
2072                         if (first) {
2073                                 selected_linked_field = link_defs[linked_field_name];
2074                                 first = false;
2075                         }
2076                         var linked_field =  link_defs[linked_field_name];
2077                         var selected = false;
2078                         var option_info = new Object();
2079                         option_info['value'] = linked_field['name'];
2080                         option_info['text'] = linked_field_name.substring(0,1).toUpperCase() + linked_field_name.substring(1,linked_field_name.length);
2081                         option_info['selected'] = selected;
2082                         options[options.length] = option_info;
2083                 }
2084
2085                 var select_html_info = new Object();
2086                 var select_info = new Object();
2087                 select_info['name'] = 'joined';
2088                 select_info['id'] = 'multijoin';
2089                 select_info['onchange'] = 'joinChecked(this);';
2090                 select_html_info['select'] = select_info;
2091
2092                 var tr = joins_table.insertRow(joins_table.rows.length);
2093                 var td = tr.insertCell(tr.cells.length);
2094                 select_html_info['options'] = options;
2095         }
2096 }
2097
2098 function getSelectedLinkJoins( link_array ) {
2099         var link_join_array = new Object();
2100
2101         var outer_check = document.getElementById("outer_joined");
2102         if ( outer_check != null ) {
2103                 link_name = document.forms.EditView.joined;
2104                 if ( outer_check.checked ) {
2105                         link_join_array[link_name.value] = 1;
2106                 }
2107                 else {
2108                         link_join_array[link_name.value] = 0;
2109                 }
2110         }
2111
2112         return link_join_array;
2113 }
2114
2115 function getSelectedLinks() {
2116         var joins_array = new Array();
2117
2118         for (var index in full_table_list) {
2119                 if ( index == 'self' ) {
2120                         // This is the primary module, we don't want to include it
2121                         continue;
2122                 }
2123
2124                 if ( full_table_list[index] != null && full_table_list[index].value != '' ) {
2125                         joins_array.push(index);
2126                 }
2127         }
2128
2129         return joins_array;
2130 }
2131
2132 function getRelatedModule(link_def) {
2133         if(typeof link_def == 'undefined') {
2134                 return;
2135         }
2136         var rel_name = link_def.relationship_name;
2137         var rel_def = rel_defs[rel_name];
2138         if(typeof(rel_def) == 'undefined') {
2139                 return '';
2140         }
2141         if ( link_def.bean_is_lhs ) {
2142                 return rel_def['rhs_module'];
2143         }
2144         else {
2145                 return rel_def['lhs_module'];
2146         }
2147 }
2148
2149
2150 function viewJoinChanged(obj) {
2151         reload_columns('join');
2152 }
2153
2154 function getSelectedLinkDefs(module) {
2155         if ( typeof(module) == 'undefined') {
2156                 module = current_module;
2157         }
2158         var new_links = new Object();
2159         var links = getSelectedLinks()
2160
2161         var type = 'one';
2162         for(var i in  links) {
2163                 if(typeof full_table_list[links[i]].link_def == 'undefined') {
2164                         return;
2165                 }
2166                 var linked_field = full_table_list[links[i]].link_def;
2167
2168                 var selected = false;
2169                 var relationship = rel_defs[linked_field['relationship_name']];
2170                 var rel_type = get_rel_type(linked_field,relationship);
2171
2172                 new_links[links[i]] = linked_field;
2173         }
2174         return new_links;
2175 }
2176
2177 function moduleIsVisible(module) {
2178         if (typeof(visible_modules[module]) == 'undefined') {
2179                 return false;
2180         }
2181         return true;
2182 }
2183
2184 function getLinksByRelType(link_defs,type) {
2185         var new_links = new Object();
2186         for(var i in link_defs) {
2187                 var linked_field = link_defs[i];
2188
2189                 var module = getRelatedModule(linked_field);
2190                 if (! moduleIsVisible(module)) {
2191                         continue;
2192                 }
2193
2194                 var selected = false;
2195                 var relationship = rel_defs[linked_field['relationship_name']];
2196                 var rel_type = get_rel_type(linked_field,relationship);
2197
2198                 if (typeof(type) == 'undefined' || rel_type == type) {
2199                         new_links[i] = link_defs[i];
2200                 }
2201         }
2202         return new_links;
2203 }
2204
2205 //create a unique key for each reportable field across tables
2206
2207 function getAllFieldsMapped(module) {
2208         var all_fields = new Array();
2209         var summary_fields_str = '';
2210
2211         for(var k in module_defs[module].field_defs) {
2212                 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};
2213         }
2214
2215         for(var k in module_defs[module].summary_field_defs) {
2216                 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};
2217                         summary_fields_str+='|'+"self:"+module_defs[module].summary_field_defs[k].name;
2218         }
2219
2220         all_fields["count"] = all_fields["self:count"];
2221
2222         var link_defs = getSelectedLinkDefs(module);
2223
2224
2225         for(var i in link_defs) {
2226                 var join_module = getRelatedModule(link_defs[i]);
2227                 if ( typeof(module_defs[join_module]) == 'undefined') {
2228                         continue;
2229                 }
2230
2231                 for( var j in module_defs[join_module].field_defs) {
2232                         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};
2233                 }
2234
2235                 for(var j in module_defs[join_module].summary_field_defs) {
2236                         var sum_field_def = module_defs[join_module].summary_field_defs[j];
2237
2238                         // dont include custom fields on the second level.. yet
2239                         if ( typeof( sum_field_def.field_def_name) != 'undefined') {
2240                                 var field_def = module_defs[join_module].field_defs[sum_field_def.field_def_name];
2241                                 if ( typeof( field_def.custom_type) != 'undefined') {
2242                                         continue;
2243                                 }
2244                         }
2245                         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};
2246                 }
2247         }
2248
2249         return all_fields;
2250 }
2251
2252 // this is called on doubleclick of the columns selector
2253 function doRename(obj) {
2254         var label = prompt("Rename label:\n"+obj.default_label,obj.text);
2255         if ( label != null) {
2256                 obj.text = label;
2257                 obj.saved_text = label;
2258         }
2259 }
2260
2261 function saveLabel(type, obj) {
2262         if(type == 'column') {
2263                 var columns_ref = object_refs['display_columns'];
2264         }
2265         else if(type == 'detailsummary'){
2266                 var columns_ref = object_refs['display_summary'];
2267         }
2268         else {
2269                 return;
2270         }
2271
2272         if(typeof(obj.lastIndex) != 'undefined' &&  obj.lastIndex != -1 ){
2273                 var current_option = columns_ref.options[obj.lastIndex];
2274                 current_option.text =  obj.value + '  [' +  current_option.default_label + ']';
2275                 current_option.saved_text = obj.value;
2276          }
2277          else{
2278                 this.value = '';
2279                 this.lastIndex = -1;
2280          }
2281 }
2282
2283 function reload_columns( reload_type) {
2284         document.getElementById('column_label_editor').value = '';
2285         if ( typeof ( reload_type ) == 'undefined') {
2286                 reload_type = 'default';
2287         }
2288
2289  // get the current module from the dropdown value
2290         current_module = document.EditView.self.options[document.EditView.self.options.selectedIndex].value;
2291
2292         // get the reference to the select objects
2293     display_columns_ref = object_refs['display_columns'];
2294     hidden_columns_ref = object_refs['hidden_columns'];
2295     display_summary_ref = object_refs['display_summary'];
2296     display_summary_ref.onchange = function() {
2297                 var current_option = this.options[this.selectedIndex];
2298                 document.getElementById('detailsummary_label_editor').lastIndex = this.selectedIndex;
2299                 if(typeof(current_option.saved_text) == 'undefined') {
2300                         document.getElementById('detailsummary_label_editor').value =current_option.text;
2301                 }
2302                 else{
2303                         document.getElementById('detailsummary_label_editor').value =current_option.saved_text;
2304                 }
2305         };
2306
2307     hidden_summary_ref = object_refs['hidden_summary'];
2308         display_columns_ref.onchange = function() {
2309                 var current_option = this.options[this.selectedIndex];
2310                 document.getElementById('column_label_editor').lastIndex = this.selectedIndex;
2311                 if(typeof(current_option.saved_text) == 'undefined'){
2312                         document.getElementById('column_label_editor').value =current_option.text;
2313                 }
2314                 else{
2315                         document.getElementById('column_label_editor').value =current_option.saved_text;
2316                 }
2317         };
2318
2319     if ( reload_type == 'default' || reload_type=='regular') {
2320                 if (reload_type == 'default') {
2321                         visible_fields_map = new Object();
2322                         document.EditView.show_details.checked = false;
2323 //                      document.EditView.report_type[0].checked  = true;
2324
2325                         document.getElementById('summary_table').style.display='none';
2326                         document.getElementById('summary_more_div').style.display='none';
2327                         document.getElementById('columns_table').style.display='';
2328                         document.getElementById('columns_more_div').style.display='';
2329                 visible_summary_fields_org = module_defs[current_module].default_summary_columns;
2330
2331                 visible_summary_fields = new Array();
2332
2333                 for(i=0;i < visible_summary_fields_org.length;i++) {
2334                                 if ( visible_summary_fields_org[i] == 'count') {
2335                                 visible_summary_fields.push(  visible_summary_fields_org[i]);
2336                                 }
2337                                 else {
2338                                 visible_summary_fields.push( 'self:'+ visible_summary_fields_org[i]);
2339                                 }
2340                 }
2341                 visible_fields = module_defs[current_module].default_table_columns;
2342                 }
2343
2344                 // TODO: FIX THIS:
2345
2346                 selected_link_name = module_defs[current_module].default_link_name;
2347                 display_columns_ref.options.length = 0;
2348                 display_summary_ref.options.length = 0;
2349                 hidden_columns_ref.options.length = 0;
2350                 hidden_summary_ref.options.length = 0;
2351         }
2352         else if (reload_type == 'add' || reload_type == 'join')  {
2353                 visible_fields = new Array();
2354                 visible_summary_fields = new Array();
2355
2356                 for(i=0;i < display_columns_ref.options.length;i++) {
2357                         visible_fields.push(display_columns_ref.options[i].value);
2358
2359                         if ( typeof(visible_fields_map) != 'undefined' && typeof(visible_fields_map[display_columns_ref.options[i].value]) == 'undefined' ) {
2360                                 if ( typeof (display_columns_ref.options[i].saved_text) != 'undefined') {
2361                                         visible_fields_map[display_columns_ref.options[i].value] = {"label":display_columns_ref.options[i].saved_text};
2362                                 }
2363                         }
2364                 }
2365
2366                 for(i=0;i < display_summary_ref.options.length;i++) {
2367                         visible_summary_fields.push(display_summary_ref.options[i].value);
2368                         if ( typeof(visible_summary_fields_map) != 'undefined' && typeof(visible_summary_fields_map[display_summary_ref.options[i].value]) == 'undefined' ) {
2369                                 if ( typeof (display_summary_ref.options[i].saved_text) != 'undefined') {
2370                                         visible_fields_map[display_summary_ref.options[i].value] = {"label":display_summary_ref.options[i].saved_text};
2371                                 }
2372                         }
2373                 }
2374
2375                 display_columns_ref.options.length = 0;
2376                 display_summary_ref.options.length = 0;
2377                 hidden_columns_ref.options.length = 0;
2378                 hidden_summary_ref.options.length = 0;
2379         }
2380
2381     var seen_visible = new Object();
2382
2383         var view_join = document.EditView.view_join;
2384
2385         var selected_link = '';
2386         var link_defs = getSelectedLinkDefs();
2387
2388         var view_join_value = '';
2389         // first remember what was selected originally
2390         if (typeof(view_join.options) != 'undefined' && view_join.options.length > 0) {
2391                 view_join_value = view_join.options[view_join.selectedIndex].value;
2392         }
2393         // now rebuild the select box that chooses which related table to use when showing the available fields
2394         view_join.options.length = 0;
2395
2396         if ('self' == view_join_value) {
2397                 selected=true;
2398         }
2399         else {
2400                 selected=false;
2401         }
2402
2403         var select_counter = 0;
2404         view_join.options[view_join.options.length] = new Option(module_defs[current_module].label,'self',selected);
2405
2406
2407         for(var i in full_table_list) {
2408                 if ( i == "self" ) {
2409                         // We already added the self option above
2410                         continue;
2411                 }
2412                 var table_def = full_table_list[i];
2413                 var selected = false;
2414                 select_counter++;
2415
2416                 // re-selected the remembered select (if there was one)
2417                 if (i == view_join_value) {
2418                         selected=true;
2419                 }
2420                 else {
2421                         selected=false;
2422                 }
2423
2424                 var label = table_def['label'];
2425                 if ( i != 'self' ) {
2426                         label = full_table_list[full_table_list[i].parent].label + ' > '+ label;
2427                 }
2428
2429                 view_join.options[view_join.options.length] = new Option(label,i,selected);
2430                 if(selected){
2431                         view_join.selectedIndex = select_counter;
2432                 }
2433         }
2434
2435         // select the first one if first time load
2436         var selected_module = current_module;
2437         current_prefix = 'self';
2438         var table_key = view_join.options[view_join.selectedIndex].value;
2439         var field_defs = new Object();
2440         if ( table_key != 'self') {
2441                 current_prefix = table_key;
2442                 selected_module = full_table_list[table_key].module;
2443                 field_defs = module_defs[selected_module].field_defs;
2444         }
2445         else {
2446         field_defs = module_defs[selected_module].field_defs;
2447         }
2448
2449         all_fields = getAllFieldsMapped(current_module);
2450
2451         for(i=0;i < visible_fields.length;i++) {
2452                 if (typeof(all_fields[visible_fields[i]]) == 'undefined') {
2453              continue;
2454                 }
2455                 var field = all_fields[visible_fields[i]].field_def;
2456                 var default_label = all_fields[visible_fields[i]]['label_prefix']+": "+field['vname'];
2457
2458                 if ( typeof (visible_fields_map[visible_fields[i]]) != 'undefined' &&  typeof (visible_fields_map[visible_fields[i]].label) != 'undefined') {
2459                         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']);
2460                 }
2461                 else {
2462                         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']);
2463                 }
2464
2465                 var current_option = display_columns_ref.options[display_columns_ref.options.length-1];
2466                 current_option.default_label = default_label;
2467
2468                 if(current_option.text != current_option.default_label){
2469                         current_option.saved_text = current_option.text;
2470                         current_option.text  += '  [' + default_label + ']';
2471                 }
2472
2473        seen_visible[ visible_fields[i] ] = 1;
2474         }
2475
2476         var field_defs_arr = getOrderedFieldDefArray(field_defs,false);
2477
2478         for(var index in field_defs_arr) {
2479         var field = field_defs_arr[index];
2480         var key = current_prefix +":"+field['name'];
2481
2482                 if ( typeof(all_fields[key]) == 'undefined') {
2483                         continue;
2484                 }
2485
2486                 if (seen_visible[key] != 1) {
2487                         hidden_columns_ref.options[hidden_columns_ref.options.length] = new Option(field['vname'],key);
2488                 }
2489         }
2490
2491         var seen_visible_summary = new Object();
2492         var view_join_summary = document.EditView.view_join_summary;
2493         var selected_link_value = '';
2494
2495         // first remember what was selected originally
2496         if (typeof(view_join_summary.options) != 'undefined' && view_join_summary.options.length > 0) {
2497                 selected_link_value = view_join_summary.options[view_join_summary.selectedIndex].value;
2498         }
2499
2500         // now rebuild the select box that chooses which related table to use when showing the available fields
2501         view_join_summary.options.length = 0;
2502         if ( 'self' == selected_link_value) {
2503                 selected=true;
2504         }
2505         else {
2506                 selected=false;
2507         }
2508
2509         view_join_summary.options[view_join_summary.options.length] = new Option(module_defs[current_module].label,'self',selected);
2510
2511         var summary_select_counter = 0;
2512
2513         for(var i in full_table_list) {
2514                 if ( i == "self" ) {
2515                         // We already added the self option above
2516                         continue;
2517                 }
2518
2519                 var linked_field = full_table_list[i];
2520                 var selected = false;
2521
2522                 // re-selected the remembered select (if there was one)
2523
2524                 if (i == selected_link_value) {
2525                         selected=true;
2526                 }
2527                 else {
2528                         selected=false;
2529                 }
2530
2531                 var label = linked_field['label'];
2532                 if ( i != 'self' ) {
2533                         label = full_table_list[full_table_list[i].parent].label + ' > '+ label;
2534                 }
2535
2536                 summary_select_counter++;
2537                 view_join_summary.options[view_join_summary.options.length] = new Option(label,i,selected);
2538                 if(selected){
2539                         view_join_summary.selectedIndex = summary_select_counter;
2540                 }
2541         }
2542
2543         // select the first one if first time load
2544         var selected_module = current_module;
2545
2546         current_prefix = 'self';
2547
2548         var sum_table_key = view_join_summary.options[view_join_summary.selectedIndex].value;
2549         if ( sum_table_key != '' && sum_table_key != 'self') {
2550                 current_prefix = sum_table_key;
2551                 selected_module = full_table_list[sum_table_key].module;
2552         }
2553
2554
2555         var valid_groups = new Object();
2556
2557         var group_by_table = document.getElementById('group_by_tbody');
2558
2559         has_group = null;
2560
2561         for(i=0; i < group_by_table.rows.length;i++) {
2562         has_group = 1;
2563         var cell0 = group_by_table.rows[i].cells[1];
2564         var cell1 = group_by_table.rows[i].cells[2];
2565                 var key = cell0.getElementsByTagName('select')[0].value;
2566
2567                 if ( typeof(all_fields[key]) == 'undefined') {
2568                         // Not a valid field
2569                         continue;
2570                 }
2571
2572                 var group_by_def = getListFieldDef(key);
2573
2574                 if ( group_by_def.table_key != current_prefix) {
2575                         continue;
2576                 }
2577                 var key = group_by_def.table_key+":"+group_by_def.name;
2578
2579                 if ( typeof (cell1) !=  'undefined' && cell1.getElementsByTagName('select')[0].style.display != 'none') {
2580                         key += ":"+cell1.getElementsByTagName('select')[0].value;
2581                 }
2582
2583         valid_groups[key] = 1;
2584         }
2585
2586     var field_defs = module_defs[selected_module].field_defs;
2587         var numerical_chart_column = document.EditView.numerical_chart_column;
2588         numerical_chart_column.options.length = 0;
2589         var which_option_selected = 0;
2590
2591         for(i=0;i < visible_summary_fields.length;i++) {
2592                 var key = visible_summary_fields[i];
2593                 if (typeof(all_fields[key]) == 'undefined' || typeof( all_fields[key].field_def) == 'undefined') {
2594             continue;
2595                 }
2596
2597                 if ( (typeof(valid_groups[key]) == 'undefined' && ( typeof( all_fields[key].field_def.summary_type)  == 'undefined'
2598              || all_fields[key].field_def.summary_type != 'group'))) {
2599                         continue;
2600                 }
2601
2602                 var field = all_fields[key].field_def;
2603                 var linked_field_name = '';
2604                 var label_prefix = '';
2605                 var default_label =  '';
2606
2607                 if ( field.name == 'count') {
2608                         key = 'count';
2609                         default_label = field['vname'];
2610                 }
2611                 else {
2612                         linked_field_name = all_fields[key].linked_field_name;
2613                         label_prefix = all_fields[key].label_prefix;
2614                         default_label = label_prefix+": "+field['vname'];
2615                 }
2616
2617                 var column_label;
2618
2619                 if (  typeof (visible_summary_field_map[key]) != 'undefined' && typeof (visible_summary_field_map[key].label) != 'undefined') {
2620                         column_label = visible_summary_field_map[key].label;
2621                 }
2622                 else {
2623                         column_label = default_label;
2624                 }
2625
2626                 display_summary_ref.options[display_summary_ref.options.length] = new Option(column_label,key);
2627                 var split_key = key.split(':');
2628                 var summary_field = all_fields[key].field_def;
2629                 if ( typeof (summary_field.group_function) != 'undefined') {
2630                         if (key == report_def['numerical_chart_column']) {
2631                                 which_option_selected = numerical_chart_column.options.length;
2632                         }
2633                         numerical_chart_column.options[numerical_chart_column.options.length] = new Option( column_label,key);
2634                 }
2635
2636                 var current_option = display_summary_ref.options[display_summary_ref.options.length-1];
2637                 current_option.default_label = default_label;
2638                 if(current_option.text != current_option.default_label) {
2639                         current_option.saved_text = current_option.text;
2640                         current_option.text  += '  [' + default_label + ']';
2641                 }
2642
2643                 seen_visible_summary[ key] = 1;
2644         }
2645
2646         numerical_chart_column.options.selectedIndex = which_option_selected;
2647
2648         var summary_field_defs = module_defs[selected_module].summary_field_defs;
2649         var field_defs_arr = getOrderedFieldDefArray(field_defs,false);
2650
2651         group_field = null;
2652         for(group_key in valid_groups) {
2653                 if(typeof all_fields[group_key] != 'undefined') {
2654                         group_field = all_fields[group_key].field_def;
2655
2656                         if (seen_visible_summary[group_key] != 1) {
2657                                 hidden_summary_ref.options[hidden_summary_ref.options.length] = new Option(group_field['vname'],group_key);
2658                         }
2659                         seen_visible_summary[group_key] = 1;
2660                 }
2661         }
2662
2663         for( var index in summary_field_defs) {
2664                 var field = summary_field_defs[index];
2665                 if ( field.summary_type != 'group') {
2666                         continue;
2667                 }
2668
2669         var key = current_prefix +":"+field['name'];
2670
2671                 if ( field['name'] == 'count') {
2672                         key = 'count';
2673                 }
2674
2675                 if ( typeof(all_fields[key]) == 'undefined') {
2676                         continue;
2677                 }
2678
2679                 if (seen_visible_summary[key] != 1) {
2680                         hidden_summary_ref.options[hidden_summary_ref.options.length] = new Option(field['vname'],key);
2681                 }
2682         }
2683
2684         refresh_chart_tab();
2685         var selected_chart_index = 1;
2686         if (reload_type == 'regular') {
2687                 for(var i=0;i < document.EditView.chart_type.options.length; i++) {
2688                         if (document.EditView.chart_type.options[i].value == report_def.chart_type) {
2689                                 selected_chart_index = i;
2690                         }
2691                 }
2692                 document.EditView.chart_type.selectedIndex = selected_chart_index;
2693         }
2694 }
2695
2696 function refresh_chart_tab() {
2697         if ( document.EditView.numerical_chart_column.options.length > 0 && has_group != null) {
2698                 document.getElementById('no_chart_text').style.display='none';
2699                 document.EditView.numerical_chart_column.disabled = false;
2700                 document.EditView.chart_type.disabled = false;
2701                 document.EditView.chart_type.selectedIndex = 1;
2702                 document.EditView.chart_description.disabled = false;
2703         }
2704         else {
2705                 document.getElementById('no_chart_text').style.display='';
2706                 document.EditView.numerical_chart_column.disabled = true;
2707                 document.EditView.chart_type.disabled = true;
2708                 document.EditView.chart_type.selectedIndex = 0;
2709                 document.EditView.chart_description.disabled = true;
2710         }
2711 }
2712
2713 function set_readonly(form) {
2714         if (form.save_report.checked) {
2715                 form.save_report.value='on';
2716                 form.save_report_as.readOnly=false;
2717                 form.save_report_as.focus();
2718         }
2719         else {
2720                 form.save_report.value='off';
2721                 form.save_report_as.readOnly=true;
2722         }
2723 }
2724
2725 // add non-standard attrs to the newly created option objects
2726 function addSelectOptionAttrs(info,obj) {
2727         for(i=0; i < info['options'].length; i++) {
2728                 option = info['options'][i];
2729                 var attr = new Object();
2730
2731                 for( var j in option ) {
2732                         if ( j != 'text' &&  j != 'value' && j != 'selected' && j != 'name' && j != 'id') {
2733                         obj.options[i][j] = option[j];
2734                         }
2735                 }
2736         }
2737 }
2738
2739 //builds the html for a select
2740 function buildSelectHTML(info) {
2741         var text;
2742         text = "<select";
2743
2744         for(var key in info['select']) {
2745                 if ( typeof (info['select'][key]) != 'undefined') {
2746                         text +=" "+ key +"=\""+ info['select'][key] +"\"";
2747                 }
2748         }
2749         text +=">";
2750
2751         var saved_attrs = new Array();
2752
2753         for(i=0; i < info['options'].length; i++) {
2754                 option = info['options'][i];
2755                 var attr = new Object();
2756                 for( var j in option ) {
2757             if ( j != 'text' &&  j != 'value' && j != 'selected' && j != 'name' && j != 'id') {
2758                                 attr[j] = option[j];
2759             }
2760                 }
2761                 saved_attrs.push(attr);
2762                 text += "<option value=\""+encodeURI(option['value'])+"\" ";
2763
2764                 if ( typeof (option['selected']) != 'undefined' && option['selected']== true) {
2765                         text += "SELECTED";
2766                 }
2767                 text += ">"+option['text']+"</option>";
2768         }
2769         text += "</select>";
2770         return text;
2771 }
2772
2773 function buildOuterJoinHTML(info) {
2774         var text;
2775         var checked;
2776
2777         checked = '';
2778         if ( report_def.link_joins != null ) {
2779                 for ( key in report_def.link_joins ) {
2780                         if ( report_def.link_joins[key] == 1 ) {
2781                                 checked = 'CHECKED';
2782                         }
2783                 }
2784         }
2785         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;
2786         text += '<img border="0" class="inlineHelpTip" src="' + image_path +'help.gif" onclick="SUGAR.util.showHelpTips(this,\''+ lbl_optional_help +'\')"/>';
2787
2788         return text;
2789 }
2790
2791 // This function is called when the outer join/optional checkbox is checked.
2792 function updateOuterJoin ( obj ) {
2793         // Nuke the outer_ part at the front of the string, to get the table key
2794         table_key = obj.id.replace("outer_","");
2795
2796         if ( obj.checked == true ) {
2797                 full_table_list[table_key].optional = true;
2798         }
2799         else {
2800                 full_table_list[table_key].optional = false;
2801         }
2802 }
2803
2804 function saved_chart_drilldown(group_value,group_key,id) {
2805        var report_url = 'index.php?module=Reports&page=report&action=index&id='+id+'#'+group_value;
2806        document.location = report_url;
2807 }
2808
2809 function chart_drilldown(group_value,is_saved_report,id) {
2810         var anch = document.getElementById(group_value);
2811         var elems = document.anchors;
2812
2813         for(var i in elems) {
2814                 var elem = elems[i];
2815                 if ( typeof(elem.name) != 'undefined' && elem.name != '' && typeof(elem.id) != 'undefined' && elem.id != '' && elem.id == elem.name) {
2816                         if ( group_value == elem.name ) {
2817                                 elem.focus();
2818                                 window.scrollBy(0,300);
2819                         }
2820                 }
2821         }
2822 }
2823
2824 function expandCollapseComboSummaryDiv(divId) {
2825         if (document.getElementById(divId)) {
2826                 if (document.getElementById(divId).style.display == "none") {
2827                         document.getElementById(divId).style.display = "";
2828                         document.getElementById("img_" + divId).innerHTML =
2829                                 document.getElementById("img_" + divId).innerHTML.replace(/advanced_search/,"basic_search");
2830                         document.getElementById('expanded_combo_summary_divs').value += divId + " ";
2831                 }
2832                 else {
2833                         document.getElementById(divId).style.display = "none";
2834                         document.getElementById("img_" + divId).innerHTML =
2835                                 document.getElementById("img_" + divId).innerHTML.replace(/basic_search/,"advanced_search");
2836                         document.getElementById('expanded_combo_summary_divs').value =
2837                                 document.getElementById('expanded_combo_summary_divs').value.replace(divId,"");
2838
2839                 }
2840         }
2841 }