]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - jssource/src_files/include/javascript/report_additionals.js
Release 6.4.0
[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-2011 SugarCRM Inc.
4  * 
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU Affero General Public License version 3 as published by the
7  * Free Software Foundation with the addition of the following permission added
8  * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
9  * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
10  * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
11  * 
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
15  * details.
16  * 
17  * You should have received a copy of the GNU Affero General Public License along with
18  * this program; if not, see http://www.gnu.org/licenses or write to the Free
19  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  * 02110-1301 USA.
21  * 
22  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
23  * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
24  * 
25  * The interactive user interfaces in modified source and object code versions
26  * of this program must display Appropriate Legal Notices, as required under
27  * Section 5 of the GNU Affero General Public License version 3.
28  * 
29  * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
30  * these Appropriate Legal Notices must retain the display of the "Powered by
31  * SugarCRM" logo. If the display of the logo is not reasonably feasible for
32  * technical reasons, the Appropriate Legal Notices must display the words
33  * "Powered by SugarCRM".
34  ********************************************************************************/
35
36
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                 filter.input_name0 = to_display_date(filter.input_name0);
746         }
747
748         new_input.value=filter.input_name0;
749         new_input.name="text_input";
750         new_input.size="30";
751         new_input.maxsize="255";
752         new_input.visible="true";
753         new_input.setAttribute('id','jscal_field');
754         cell.appendChild(new_input);
755         row.appendChild(cell);
756
757         var cell = document.createElement("td");
758         cell.setAttribute('valign','middle');
759         var img_element = document.createElement("img");
760         img_element.setAttribute('src','index.php?entryPoint=getImage&themeName='+SUGAR.themes.theme_name+'&imageName=jscalendar.gif');
761         img_element.setAttribute('id','jscal_trigger');
762         cell.appendChild(img_element);
763         row.appendChild(cell);
764         Calendar.setup ({
765                 inputFieldObj : new_input ,
766                 buttonObj : img_element,
767                 ifFormat : cal_date_format,
768                 showsTime : false,
769                 singleClick : true, step : 1,
770                 weekNumbers:false
771         });
772
773         var filter_row = filters_arr[filters_count_map[current_filter_id]];
774         filter_row.input_field0 = new_input;
775         filter_row.input_field1 = null;
776 }
777
778 function addFilterNoInput(row,filter) {
779         var cell = document.createElement("td");
780         cell.setAttribute('valign','middle');
781         var new_input = document.createElement("input");
782         new_input.type="hidden";
783         new_input.value=filter.qualifier_name;
784         new_input.name="text_input";
785         cell.appendChild(new_input);
786         row.appendChild(cell);
787 }
788
789 function addFilterInputEmpty(row,filter) {
790         var cell = document.createElement("td");
791         cell.setAttribute('valign','middle');
792         var new_input = document.createElement("input");
793         new_input.type="hidden";
794         new_input.value=filter.qualifier_name;
795         new_input.name="text_input";
796         cell.appendChild(new_input);
797         row.appendChild(cell);
798
799         var cell = document.createElement("td");
800         row.appendChild(cell);
801
802         var filter_row = filters_arr[filters_count_map[current_filter_id]];
803         filter_row.input_field0 = new_input;
804         filter_row.input_field1 = null;
805 }
806
807 function addFilterInputSelectMultiple(row,options,filter) {
808         var cell = document.createElement('td');
809         row.appendChild(cell);
810
811         var select_html_info = new Object();
812         var options_arr = new Array();
813         var select_info = new Object();
814         select_info['size'] = '5';
815         select_info['multiple'] = true;
816         select_html_info['select'] = select_info;
817
818         var selected_map = new Object();
819         for (i=0;i < filter.input_name0.length;i++) {
820                 selected_map[filter.input_name0[i] ] = 1;
821         }
822
823         for(i=0;i < options.length;i++) {
824                 var option_name;
825                 var option_value;
826                 if (typeof(options[i].text) == 'undefined') {
827                         option_text = options[i];
828                         option_value = options[i];
829                 }
830                 else if (options[i].value == '') {
831                         continue;
832                 }
833                 else {
834                         option_text = options[i].text;
835                         option_value = options[i].value;
836                 }
837                 if ( typeof( selected_map[option_value]) != 'undefined' ) {
838                         selected = true;
839                 }
840                 else {
841                         selected = false;
842                 }
843                 var option_info = new Object();
844                 option_info['value'] = option_value;
845                 option_info['text'] = option_text;
846                 option_info['selected'] = selected;
847                 options_arr[options_arr.length] = option_info;
848         }
849
850         select_html_info['options'] = options_arr;
851         cell.innerHTML=buildSelectHTML(select_html_info)
852         var filter_row = filters_arr[filters_count_map[current_filter_id]];
853         filter_row.input_field0 = cell.getElementsByTagName('select')[0];
854         filter_row.input_field1 = null;
855 }
856
857 function addFilterInputSelectSingle(row,options,filter) {
858         var cell = document.createElement('td');
859         row.appendChild(cell);
860
861         var select_html_info = new Object();
862         var options_arr = new Array();
863         var select_info = new Object();
864         select_info['name'] = 'input';
865         select_html_info['select'] = select_info;
866
867         for(i=0;i < options.length;i++) {
868                 if (typeof(options[i].text) == 'undefined') {
869                         option_text = options[i];
870                         option_value = options[i];
871                 }
872                 else if (options[i].value == '') {
873                         continue;
874                 }
875                 else {
876                         option_text = options[i].text;
877                         option_value = options[i].value;
878                 }
879
880                 if (option_value == filter.input_name0 ) {
881                         selected = true;
882                 }
883                 else {
884                         selected = false;
885                 }
886                 var option_info = new Object();
887                 option_info['value'] = option_value;
888                 option_info['text'] = option_text;
889                 option_info['selected'] = selected;
890                 options_arr[options_arr.length] = option_info;
891         }
892         select_html_info['options'] = options_arr;
893         cell.innerHTML=buildSelectHTML(select_html_info);
894         var filter_row = filters_arr[filters_count_map[current_filter_id]];
895         filter_row.input_field0 = cell.getElementsByTagName('select')[0];
896         filter_row.input_field1 = null;
897 }
898
899
900 function addFilterInputTextBetween(row,filter) {
901         var filter_row = filters_arr[filters_count_map[current_filter_id]];
902
903         var cell = document.createElement('td');
904         var new_input = document.createElement("input");
905         new_input.type="text";
906         if (typeof(filter.input_name0) == 'undefined') {
907                 filter.input_name0 = '';
908         }
909
910         new_input.value=filter.input_name0;
911         cell.appendChild(new_input);
912         row.appendChild(cell);
913         filter_row.input_field0 = new_input;
914
915         var cell = document.createElement('td');
916         var new_text = document.createTextNode(lbl_and);
917         cell.appendChild(new_text);
918         row.appendChild(cell);
919
920         var cell = document.createElement('td');
921         var new_input = document.createElement("input");
922         new_input.type="text";
923         if (typeof(filter.input_name1) == 'undefined') {
924                 filter.input_name1 = '';
925         }
926
927         new_input.value=filter.input_name1;
928         cell.appendChild(new_input);
929         row.appendChild(cell);
930         filter_row.input_field1 = new_input;
931 }
932
933 function addFilterInputDateBetween(row,filter) {
934         var filter_row = filters_arr[filters_count_map[current_filter_id]];
935
936         var cell = document.createElement("td");
937         cell.setAttribute('valign','middle');
938         var new_input = document.createElement("input");
939         new_input.type="text";
940         if (typeof(filter.input_name0) == 'undefined') {
941                 filter.input_name0 = '';
942         }
943
944         filter.input_name0 = to_display_date(filter.input_name0);
945         new_input.value=filter.input_name0;
946         new_input.name="text_input";
947         new_input.size="12";
948         new_input.maxsize="255";
949         new_input.visible="true";
950         new_input.setAttribute('id','jscal_field');
951         cell.appendChild(new_input);
952         row.appendChild(cell);
953         filter_row.input_field1 = new_input;
954
955         var cell = document.createElement("td");
956         cell.setAttribute('valign','middle');
957         var img_element = document.createElement("img");
958         img_element.setAttribute('src','index.php?entryPoint=getImage&themeName='+SUGAR.themes.theme_name+'&imageName=jscalendar.gif');
959         img_element.setAttribute('id','jscal_trigger');
960         cell.appendChild(img_element);
961         row.appendChild(cell);
962
963         Calendar.setup ({
964                 inputFieldObj : new_input ,
965                 buttonObj : img_element,
966                 ifFormat : cal_date_format,
967                 showsTime : false,
968                 singleClick : true,
969                 weekNumbers:false,
970                 step : 1 });
971
972     var cell = document.createElement('td');
973         cell.setAttribute('valign','middle');
974     var new_text = document.createTextNode(lbl_and);
975     cell.appendChild(new_text);
976     row.appendChild(cell);
977
978         var cell = document.createElement("td");
979         cell.setAttribute('valign','middle');
980         var new_input = document.createElement("input");
981         new_input.type="text";
982         if (typeof(filter.input_name1) == 'undefined') {
983                 filter.input_name1 = '';
984         }
985         filter.input_name1 = to_display_date(filter.input_name1);
986         new_input.value=filter.input_name1;
987         new_input.name="text_input";
988         new_input.size="12";
989         new_input.maxsize="255";
990         new_input.visible="true";
991         new_input.setAttribute('id','jscal_field2');
992         cell.appendChild(new_input);
993         row.appendChild(cell);
994         filter_row.input_field1 = new_input;
995
996         var cell = document.createElement("td");
997         var img_element = document.createElement("img");
998         img_element.setAttribute('src','index.php?entryPoint=getImage&themeName='+SUGAR.themes.theme_name+'&imageName=jscalendar.gif');
999         img_element.setAttribute('id','jscal_trigger2');
1000         cell.appendChild(img_element);
1001         row.appendChild(cell);
1002         Calendar.setup ({
1003                 inputFieldObj : new_input ,
1004                 buttonObj : img_element,
1005                 ifFormat : cal_date_format,
1006                 showsTime : false,
1007                 singleClick : true,
1008                 weekNumbers:false,
1009                 step : 1 });
1010 }
1011
1012
1013
1014 var current_parent = '';
1015 var current_parent_id = '';
1016
1017 function set_current_parent(name,value) {
1018         current_parent.value = name;
1019         current_parent_id.value = value;
1020 }
1021
1022 function getModuleInFilter(filter) {
1023         // select the first one if first time load
1024         var selected_module = current_module;
1025         //current_prefix = module_defs[selected_module].label;
1026         current_prefix = 'self';
1027         var view_join = filter.module_cell.getElementsByTagName('select')[0];
1028         var selected_option = view_join.options[view_join.selectedIndex].value;
1029         if ( selected_option != 'self') {
1030                 selected_module = full_table_list[selected_option].module;
1031         }
1032
1033         return selected_module;
1034 }
1035
1036 function set_form_return_reports(popup_reply_data) {
1037         var form_name = popup_reply_data.form_name;
1038         var name_to_value_array = popup_reply_data.name_to_value_array;
1039         var passthru_data = popup_reply_data.passthru_data;
1040
1041         current_parent_id.value = name_to_value_array['id'];
1042         current_parent.value = name_to_value_array['name'];
1043 }
1044
1045 function addFilterInputRelate(row,field,filter) {
1046         var filter_row = filters_arr[filters_count_map[current_filter_id]];
1047         var module_name=getModuleInFilter(filter_row);
1048         var field_name= module_name+":"+field.name;
1049         var field_id_name= module_name+":"+field.name+":id";
1050
1051         var cell = document.createElement('td');
1052         var id_input = document.createElement("input");
1053         id_input.setAttribute('type','hidden');
1054         id_input.setAttribute("name", field_id_name);
1055         id_input.setAttribute("id", field_id_name);
1056         if ( typeof (filter.input_name0) == 'undefined') {
1057                 filter.input_name0 = '';
1058         }
1059         id_input.setAttribute("value",filter.input_name0);
1060         cell.appendChild(id_input);
1061         filter_row.input_field0 = id_input;
1062
1063         var name_input = document.createElement("input");
1064         name_input.setAttribute("type","text");
1065         name_input.setAttribute("readonly","true");
1066         name_input.setAttribute("name", field_name);
1067         name_input.setAttribute("id", field_name);
1068         if ( typeof (filter.input_name1) == 'undefined') {
1069                 filter.input_name1= '';
1070         }
1071         name_input.setAttribute("value",filter.input_name1);
1072         cell.appendChild(name_input);
1073         filter_row.input_field1 = name_input;
1074
1075         row.appendChild(cell);
1076
1077         var cell = document.createElement('td');
1078         var new_input = document.createElement("input");
1079         new_input.title= lbl_select+"[Alt+G]";
1080         new_input.accessKey="G";
1081         new_input.type="button";
1082         new_input.value=lbl_select;
1083         new_input.name=field.module;
1084         new_input.setAttribute("class","button");
1085         new_input.onclick= function () {
1086                 current_parent = name_input;
1087                 current_parent_id = id_input;
1088                 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" } });
1089         }
1090
1091         cell.appendChild(new_input);
1092
1093         row.appendChild(cell);
1094 }
1095
1096
1097 function addGroupQualify(cell, group) {
1098         var group_row = groups_arr[groups_count_map[current_group_id]];
1099         var column_name = group_row.column_select.options[group_row.column_select.selectedIndex].value;
1100         var module_select = group_row.module_select;
1101         var table_key = module_select.options[module_select.selectedIndex].value;
1102         if (table_key == 'self') {
1103         selected_module = current_module;
1104         }
1105         else {
1106           selected_module = full_table_list[table_key].module;
1107         }
1108
1109         var field;
1110
1111         if (typeof(column_name) == 'undefined' || column_name == '') {
1112                 field = all_fields['self:name'].field_def;
1113         }
1114         else {
1115                 field = all_fields[column_name].field_def;
1116         }
1117
1118         var field_type = field.type;
1119
1120         if ( typeof(field.custom_type) != 'undefined') {
1121                 field_type = field.custom_type;
1122         }
1123
1124         var style = 'display: inline';
1125         if (field_type != 'date' && field_type != 'datetime') {
1126                 style='display: none';
1127         }
1128
1129         var select_html_info = new Object();
1130         var options = new Array();
1131         var select_info = new Object();
1132         select_info['name'] = 'qualify';
1133         select_info['style'] = style;
1134         select_info['onChange'] = 'reload_columns(\'add\');';
1135         select_html_info['select'] = select_info;
1136
1137         var selected = false;
1138
1139         for(i=0;i < date_group_defs.length; i++) {
1140                 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) ) {
1141                         selected = true;
1142                 }
1143                 else {
1144                         selected = false;
1145                 }
1146                 var option_info = new Object();
1147                 option_info['value'] =  date_group_defs[i].name;
1148                 option_info['text'] =  date_group_defs[i].value;
1149                 option_info['selected'] = selected;
1150                 options[options.length] = option_info;
1151         }
1152
1153         select_html_info['options'] = options;
1154         var html =buildSelectHTML(select_html_info);
1155         cell.innerHTML=html;
1156         group_row.qualify_select = cell.getElementsByTagName('select')[0];
1157 }
1158
1159 function addFilterQualify(cell, filter) {
1160         var filter_row = filters_arr[filters_count_map[current_filter_id]];
1161         var field_key = filter_row.column_select.options[filter_row.column_select.selectedIndex].value;
1162
1163         var field = new Object();
1164         if (typeof(field_key) != 'undefined' && field_key != '') {
1165                 field = all_fields[field_key].field_def;
1166         }
1167
1168         var select_html_info = new Object();
1169         var options = new Array();
1170         var select_info = new Object();
1171         select_info['name'] = 'qualify';
1172         select_info['onchange'] = "filterTypeChanged("+current_filter_id+");";
1173         select_html_info['select'] = select_info;
1174
1175         field_type = field.type;
1176
1177         if ( typeof(field.custom_type) != 'undefined') {
1178                 field_type = field.custom_type;
1179         }
1180
1181         var qualifiers = filter_defs[field_type];
1182         var selected = false;
1183
1184         for(i=0;i < qualifiers.length; i++) {
1185                 if (qualifiers[i].name == filter.qualifier_name) {
1186                         selected = true;
1187                 }
1188                 else {
1189                         selected = false;
1190                 }
1191                 var option_info = new Object();
1192                 option_info['value'] =  qualifiers[i].name;
1193                 option_info['text'] =  qualifiers[i].value;
1194                 option_info['selected'] = selected;
1195                 options[options.length] = option_info;
1196         }
1197
1198         select_html_info['options'] = options;
1199         cell.innerHTML=buildSelectHTML(select_html_info);
1200
1201         filter_row['qualify_select'] = cell.getElementsByTagName('select')[0];
1202 }
1203
1204 var default_group = {column_name:''};
1205
1206 function addGroupByFromButton(group) {
1207   addGroupBy(group);
1208   reload_columns('add');
1209 }
1210
1211 function addGroupBy(group) {
1212         groups_arr[groups_arr.length] = new Object();
1213         groups_count++;
1214         groups_count_map[groups_count] = groups_arr.length - 1;
1215         current_group_id = groups_count;
1216
1217         if ( typeof (group) == 'undefined') {
1218                 group = default_group;
1219         }
1220         group.column_name = group.table_key+":"+group.name;
1221
1222         var the_table = document.getElementById('group_by_tbody');
1223         var row = document.createElement('tr');
1224         groups_arr[groups_count_map[groups_count]].row = row;
1225         row.valign="top";
1226
1227         var module_cell = document.createElement('td');
1228         module_cell.valign="top";
1229         row.appendChild(module_cell);
1230         groups_arr[groups_count_map[groups_count]].module_cell = module_cell;
1231         addModuleSelectGroup(module_cell,group);
1232
1233     var column_cell = document.createElement('td');
1234         column_cell.valign="top";
1235         row.appendChild(column_cell);
1236         groups_arr[groups_count_map[groups_count]].column_cell = column_cell;
1237         var new_select = addColumnSelectGroup(column_cell,group);
1238
1239         var qualify_cell = document.createElement('td');
1240         qualify_cell.valign="top";
1241         row.appendChild( qualify_cell);
1242         groups_arr[groups_count_map[groups_count]].qualify_cell = qualify_cell;
1243         var new_filter = addGroupQualify(qualify_cell,group);
1244
1245         var cell = document.createElement('td');
1246         cell.innerHTML = "<input type=button onclick=\"deleteGroup("+groups_count+");\" class=button value="+lbl_remove+">";
1247         row.appendChild(cell);
1248
1249         the_table.appendChild(row);
1250
1251         if(groups_arr.length == 1 && document.EditView.chart_type.options.length > 5) {
1252                 chartTypesHolder.push(document.EditView.chart_type.options[5]);
1253                 document.EditView.chart_type.options[5] = null;
1254         }
1255         else if(groups_arr.length == 2){
1256                 document.EditView.chart_type.options[5] = chartTypesHolder.pop();
1257         }
1258 }
1259
1260 var default_filter = {column_name:'',qualifier_name:'',input_name0:'',input_name1:''};
1261
1262 function addFilter(filter) {
1263         filters_arr[filters_arr.length] = new Object();
1264         filters_count++;
1265         filters_count_map[filters_count] = filters_arr.length - 1;
1266         current_filter_id = filters_count;
1267         if ( typeof(filter) == 'undefined') {
1268                 filter = default_filter;
1269         }
1270
1271         var the_table = document.getElementById('filters');
1272         var row = document.createElement('tr');
1273         filters_arr[filters_count_map[filters_count]].row = row;
1274         row.valign="top";
1275
1276         var module_cell = document.createElement('td');
1277         module_cell.valign="top";
1278         row.appendChild(module_cell);
1279         filters_arr[filters_count_map[filters_count]].module_cell = module_cell;
1280         addModuleSelectFilter(module_cell,filter);
1281
1282         var column_cell = document.createElement('td');
1283         column_cell.valign="top";
1284         row.appendChild(column_cell);
1285         filters_arr[filters_count_map[filters_count]].column_cell = column_cell;
1286         addColumnSelectFilter(column_cell,filter);
1287
1288         var qualify_cell = document.createElement('td');
1289         qualify_cell.valign="top";
1290         row.appendChild(qualify_cell);
1291         filters_arr[filters_count_map[filters_count]].qualify_cell = qualify_cell;
1292         addFilterQualify(qualify_cell,filter);
1293
1294         var input_cell = document.createElement('td');
1295         input_cell.valign="top";
1296         row.appendChild(input_cell);
1297         filters_arr[filters_count_map[filters_count]].input_cell = input_cell;
1298         addFilterInput(input_cell,filter);
1299
1300         var cell = document.createElement('td');
1301         cell.valign="top";
1302         row.appendChild(cell);
1303
1304         var cell = document.createElement('td');
1305         cell.innerHTML = "<input type=button onclick=\"deleteFilter("+filters_count+");\" class=button value='"+lbl_remove+"'>";
1306         row.appendChild(cell);
1307
1308         the_table.appendChild(row);
1309 }
1310
1311 function deleteAllFilters() {
1312         var the_table = document.getElementById('filters');
1313         var rows = the_table.rows;
1314         for (i=rows.length - 1; i >= 0;i--) {
1315                 the_table.removeChild(rows[i]);
1316         }
1317         return;
1318 }
1319
1320 function deleteAllGroups(index) {
1321         if (typeof(groups_arr[groups_count_map[index]])!='undefined') {
1322                 var this_row = groups_arr[groups_count_map[index]].row;
1323                 this_row.parentNode.removeChild(this_row);
1324                 groups_arr.splice(groups_count_map[index],1);
1325
1326                 for ( id in groups_count_map) {
1327                         if (groups_count_map[id] > groups_count_map[index]) {
1328                                 groups_count_map[id]--;
1329                         }
1330                 }
1331
1332                 var group_by_button = document.getElementById('group_by_button');
1333                 group_by_button.style.display = 'inline';
1334         }
1335         return;
1336 }
1337
1338
1339
1340 function remakeGroups() {
1341         document.EditView['report_offset'].value=0;
1342         if (typeof(document.EditView.show_columns) != 'undefined' && document.EditView.show_columns.checked){
1343                 module_defs[current_module].group_by_field_defs = new Object();
1344
1345                 for(i=0; i < object_refs['display_columns'].options.length ;i++)  {
1346                         var field_name =  object_refs['display_columns'].options[i].value;
1347                         var field_def = module_defs[current_module].field_defs[field_name];
1348                         module_defs[current_module].group_by_field_defs[ field_def.name ] = field_def;
1349                 }
1350         }
1351 }
1352
1353 function getListFieldDef(field_key) {
1354         var field_def = new Object();
1355
1356         var vardef =  all_fields[field_key].field_def;
1357         if ( typeof(vardef.field_def_name) != 'undefined') {
1358                 field_def.name = vardef['field_def_name'];
1359         }
1360         else {
1361                 field_def.name = vardef['name'];
1362         }
1363
1364         field_def.label = vardef['vname'];
1365
1366         if ( typeof(vardef.group_function) != 'undefined' && vardef.group_function != null) {
1367                 field_def.group_function = vardef.group_function;
1368         }
1369         if ( typeof(vardef.column_function) != 'undefined' && vardef.column_function != null) {
1370                 field_def.column_function = vardef.column_function;
1371         }
1372         field_def.table_key = all_fields[field_key].linked_field_name;
1373         return field_def;
1374 }
1375
1376 // called on save:
1377 function fill_form(type) {
1378         var report_def = new Object();
1379         var form_obj = document.EditView;
1380
1381   // we want an export of csv:
1382         if ( typeof (type) != 'undefined' && type == 'export') {
1383                 form_obj.to_pdf.value = '';
1384                 form_obj.to_csv.value = 'on';
1385         }
1386         var got_sort = 0;
1387         var got_summary_sort = 0;
1388         var got_summary_column = 0;
1389         var got_error = 0;
1390         var error_msgs =  lbl_missing_fields+': \n';
1391         report_def['report_type'] = getReportType();
1392
1393         report_def.display_columns = new Array();
1394
1395         var group_by_table = document.getElementById('group_by_tbody');
1396
1397         if (document.EditView.show_details.checked == true || report_def.report_type=='tabular') {
1398             var disp_opts = object_refs['display_columns'].options;
1399
1400         // loop thru display columns in the select element
1401             // and construct report_def for display_columns
1402                 for(i=0; i < disp_opts.length ;i++) {
1403                         var field_def = getListFieldDef(disp_opts[i].value);
1404
1405                         if(typeof(disp_opts[i].saved_text) != 'undefined') {
1406                                 field_def['label'] = disp_opts[i].saved_text;
1407                         }
1408                         else {
1409                                 field_def['label'] = disp_opts[i].text;
1410                         }
1411
1412                         report_def.display_columns.push(field_def);
1413
1414                         if (form_obj.sort_by.value == disp_opts[i].value) {
1415                                 got_sort = 1;
1416                         }
1417                 }
1418         }
1419
1420         report_def.summary_columns = new Array();
1421
1422         if (report_def.report_type=='summary' && object_refs['display_summary'].style.display != 'none') {
1423                 // loop thru display columns in the select element
1424                 // and construct report_def for display_columns
1425                 var sum_opts = object_refs['display_summary'].options;
1426                 var summary_column_map = new Object();
1427                 for(i=0; i < sum_opts.length ;i++) {
1428                         var field_def = getListFieldDef(sum_opts[i].value);
1429
1430                         if (typeof(field_def.group_function) != 'undefined') {
1431                                 got_summary_column = 1;
1432                         }
1433
1434                         if(typeof(sum_opts[i].saved_text) != 'undefined') {
1435                                 field_def['label'] = sum_opts[i].saved_text;
1436                         }
1437                         else {
1438                                 field_def['label'] = sum_opts[i].text;
1439                         }
1440
1441                         summary_column_map[sum_opts[i].value] = field_def;
1442
1443                         report_def.summary_columns.push(field_def);
1444
1445                         if (form_obj.summary_sort_by.value == sum_opts[i].value) {
1446                                 got_summary_sort = 1;
1447                         }
1448                 }
1449         }
1450
1451         // set sorting
1452         var sort_by = new Array();
1453         var summary_sort_by = new Array();
1454         var sort_dir = new Array();
1455         var summary_sort_dir = new Array();
1456
1457         if (got_sort == 0 ) {
1458                 form_obj.sort_by.value = '';
1459                 form_obj.sort_dir.value = '';
1460         }
1461         else {
1462                 var sort_by_elem = new Object();
1463                 var sort_by_elem = getListFieldDef(form_obj.sort_by.value);
1464
1465                 sort_by_elem.sort_dir = form_obj.sort_dir.value;
1466                 sort_by.push(sort_by_elem);
1467
1468                 report_def.order_by = sort_by;
1469         }
1470
1471         if (got_summary_sort == 0 || document.EditView.show_details.checked) {
1472                 form_obj.summary_sort_by.value = '';
1473                 form_obj.summary_sort_dir.value = '';
1474         }
1475         else {
1476                 var summary_sort_by_elem = new Object();
1477                 var key_arr = form_obj.summary_sort_by.value.split(':');
1478
1479                 summary_sort_by_elem.name = key_arr[1];
1480
1481                 if ( typeof(all_fields[ form_obj.summary_sort_by.value ].field_def.group_function) != 'undefined') {
1482                         summary_sort_by_elem.group_function = all_fields[ form_obj.summary_sort_by.value ].field_def.group_function;
1483                 }
1484                 else if ( typeof(all_fields[ form_obj.summary_sort_by.value ].field_def.column_function) != 'undefined') {
1485                         summary_sort_by_elem.group_function = all_fields[ form_obj.summary_sort_by.value ].field_def.column_function;
1486                 }
1487
1488                 summary_sort_by_elem.column_function = key_arr[2];
1489                 summary_sort_by_elem.table_key = all_fields[ form_obj.summary_sort_by.value ].linked_field_name;
1490                 summary_sort_by_elem.sort_dir = form_obj.summary_sort_dir.value;
1491                 summary_sort_by.push(summary_sort_by_elem);
1492                 report_def.summary_order_by = summary_sort_by;
1493         }
1494
1495         var group_by_table = document.getElementById('group_by_tbody');
1496         var report_type_elem = document.EditView.report_type;
1497
1498         var group_defs = new Array();
1499
1500         if ((document.EditView.show_details.checked || report_def['report_type'] == 'tabular' ) && object_refs['display_columns'].options.length == 0) {
1501                 error_msgs += lbl_at_least_one_display_column+'\n';
1502                 got_error = 1;
1503         }
1504
1505         if (report_def['report_type'] == 'summary' &&  object_refs['display_summary'].options.length == 0 ) {
1506                 error_msgs += lbl_at_least_one_summary_column+'\n';
1507                 got_error = 1;
1508         }
1509
1510         // check if all options have been filled out for related tables
1511         for(var wp in full_table_list) {
1512                 if(typeof full_table_list[wp].value == 'undefined') {
1513                         error_msgs += lbl_related_table_blank + '\n';
1514                         got_error = 1;
1515                         break;
1516                 }
1517         }
1518         var filter_table = document.getElementById('filters');
1519         var filters_def = new Array();
1520
1521         for(i=0; i < filter_table.rows.length;i++) {
1522                 // the module select is the first cell.. we dont need that
1523                 var cell0 = filter_table.rows[i].cells[1];
1524                 var cell1 = filter_table.rows[i].cells[2];
1525                 var cell2 = filter_table.rows[i].cells[3];
1526
1527                 var column_name = cell0.getElementsByTagName('select')[0].value;
1528                 var filter_def = new Object();
1529                 var field = all_fields[column_name].field_def;
1530                 filter_def.name = field.name;
1531                 filter_def.table_key = all_fields[column_name].linked_field_name;
1532
1533                 column_vname = all_fields[column_name].label_prefix+": "+ field['vname'];
1534                 filter_def.qualifier_name=cell1.getElementsByTagName('select')[0].value;
1535                 var input_arr = cell2.getElementsByTagName('input');
1536
1537                 if ( typeof(input_arr[0]) !=  'undefined') {
1538                         filter_def.input_name0=input_arr[0].value;
1539                         if (input_arr[0].value == '') {
1540                                 got_error = 1;
1541                                 error_msgs += "\""+column_vname+"\""+lbl_missing_input_value+"\n";
1542                         }
1543
1544                         if ( typeof(input_arr[1]) != 'undefined') {
1545                                 filter_def.input_name1=input_arr[1].value;
1546                                 if (input_arr[1].value == '') {
1547                                         got_error = 1;
1548                                         error_msgs += "\"" + column_vname + "\""+lbl_missing_second_input_value+"\n";
1549                                 }
1550                         }
1551
1552                         if(field.type=='datetimecombo'){
1553                                 if( typeof(input_arr[2]) != 'undefined'){
1554                                         filter_def.input_name2=input_arr[2].value;
1555                                         if (input_arr[2].value == '' && input_arr[2].type != 'checkbox') {
1556                                                 got_error = 1;
1557                                                 error_msgs += "\"" + column_vname + "\" "+lbl_missing_input_value+"\n";
1558                                         }
1559                                 }
1560                                 if( typeof(input_arr[3]) != 'undefined'){
1561                                         filter_def.input_name3=input_arr[3].value;
1562                                         if (input_arr[3].value == '' && input_arr[3].type != 'checkbox') {
1563                                                 got_error = 1;
1564                                                 error_msgs += "\"" + column_vname + "\" "+lbl_missing_input_value+"\n";
1565                                         }
1566                                 }
1567                                 if( typeof(input_arr[4]) != 'undefined'){
1568                                         filter_def.input_name4=input_arr[4].value;
1569                                         if (input_arr[4].value == '' && input_arr[4].type != 'checkbox') {
1570                                                 got_error = 1;
1571                                                 error_msgs += "\"" + column_vname + "\" "+lbl_missing_input_value+"\n";
1572                                         }
1573                                 }
1574                         }
1575                 }
1576                 else {
1577                         var got_selected = 0;
1578                         var select_input = cell2.getElementsByTagName('select')[0];
1579                         filter_def.input_name0= new Array();
1580                         for (j=0;j<select_input.options.length;j++) {
1581                                 if (select_input.options[j].selected == true) {
1582                                         filter_def.input_name0.push(decodeURI(select_input.options[j].value));
1583                                         got_selected = 1;
1584                                 }
1585                         }
1586                         if (got_selected==0) {
1587                                 error_msgs += "\"" +column_vname +"\": "+lbl_missing_second_input_value+"\n";
1588                                 got_error = 1;
1589                         }
1590                 }
1591
1592                 if ( field.type == 'datetime' || field.type == 'date') {
1593                         if ( typeof(filter_def.input_name0) != 'undefined' && typeof(filter_def.input_name0) != 'array') {
1594                                 var date_match = filter_def.input_name0.match(date_reg_format);
1595                                 if ( date_match != null) {
1596                                         filter_def.input_name0 = date_match[date_reg_positions['Y']] + "-"+date_match[date_reg_positions['m']] + "-"+date_match[date_reg_positions['d']];
1597                                 }
1598                         }
1599                         if ( typeof(filter_def.input_name1) != 'undefined' && typeof(filter_def.input_name1) != 'array') {
1600                                 var date_match = filter_def.input_name1.match(date_reg_format);
1601                                 if ( date_match != null) {
1602                                         filter_def.input_name1 = date_match[date_reg_positions['Y']] + "-"+date_match[date_reg_positions['m']] + "-"+date_match[date_reg_positions['d']];
1603                                 }
1604                         }
1605                 }else if ( field.type == 'datetimecombo') {
1606                         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')) {
1607                                 var date_match = filter_def.input_name0.match(date_reg_format);
1608                                 var time_match = filter_def.input_name1.match(time_reg_format);
1609                                 if ( date_match != null && time_match != null) {
1610                                         filter_def.input_name0 = date_match[date_reg_positions['Y']] + "-"+date_match[date_reg_positions['m']] + "-"+date_match[date_reg_positions['d']] + ' '+ filter_def.input_name1;
1611                                 }
1612                         }
1613                         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') {
1614                                 var date_match = filter_def.input_name2.match(date_reg_format);
1615                                 var time_match = filter_def.input_name3.match(time_reg_format);
1616                                 if ( date_match != null && time_match != null) {
1617                                         filter_def.input_name2 = date_match[date_reg_positions['Y']] + "-"+date_match[date_reg_positions['m']] + "-"+date_match[date_reg_positions['d']] + ' '+ filter_def.input_name3;
1618                                 }
1619                         }
1620                 }
1621                 filters_def.push(filter_def);
1622         }
1623
1624         if (got_error == 1) {
1625                 alert(error_msgs);
1626                 return false;
1627         }
1628
1629         report_def.filters_def = filters_def;
1630
1631         // and/or filter option
1632         report_def.filters_combiner = document.getElementById('filters_combiner').options[document.getElementById('filters_combiner').selectedIndex].value;
1633
1634         var group_by_table = document.getElementById('group_by_tbody');
1635         var group_defs = new Array();
1636
1637         if (report_def.report_type!='tabular') {
1638                 //Loop through the group by table
1639             for(i=0; i < group_by_table.rows.length;i++) {
1640                         var cell0 = group_by_table.rows[i].cells[1];
1641                         var cell1 = group_by_table.rows[i].cells[2];
1642
1643                         var group_by_def = getListFieldDef(cell0.getElementsByTagName('select')[0].value);
1644                         var group_key = cell0.getElementsByTagName('select')[0].value;
1645                         if ( typeof (cell1) !=  'undefined' && cell1.getElementsByTagName('select')[0].style.display != 'none') {
1646                                 group_by_def.qualifier = cell1.getElementsByTagName('select')[0].value;
1647                         }
1648
1649                         //Should this column be displayed?
1650                         if ( typeof(summary_column_map[group_key]) == 'undefined') {
1651                                 // unshift on the display summary columns this group and mark it
1652                                 report_def.summary_columns.unshift( group_by_def);
1653                                 group_by_def.is_group_by = 'hidden';
1654                                 if ( typeof(group_by_def.qualifier) != 'undefined') {
1655                                         group_by_def.column_function = group_by_def.qualifier;
1656                                 }
1657                         }
1658                         else {
1659                                 summary_column_map[group_key].is_group_by = 'visible';
1660                         }
1661
1662                         group_defs.push(group_by_def);
1663                 }
1664         }
1665         report_def.group_defs = group_defs;
1666         var links = getSelectedLinks();
1667         var links_def  = new Array();
1668
1669         for(var i in links) {
1670                 links_def.push(links[i]);
1671         }
1672
1673         var link_joins = getSelectedLinkJoins(links_def);
1674         report_def.full_table_list = full_table_list;
1675
1676         report_def.module = current_module;
1677         report_def.report_name = document.EditView.save_report_as.value;
1678         report_def.chart_type = document.EditView.chart_type.value;
1679         report_def.chart_description = document.EditView.chart_description.value;
1680         report_def.numerical_chart_column = document.EditView.numerical_chart_column.value;
1681
1682         global_report_def = report_def;
1683         report_def.assigned_user_id = document.EditView.assigned_user_id.value;
1684
1685         report_def_str = YAHOO.lang.JSON.stringify(report_def);
1686         form_obj.report_def.value = report_def_str;
1687
1688         return true;
1689 }
1690
1691 function do_export() {
1692         if ( fill_form('export') == true) {
1693                 document.EditView.submit();
1694         }
1695 }
1696
1697 function set_sort(column_name,source) {
1698         if ( source == 'undefined') {
1699                 source = 'columns';
1700         }
1701
1702         var sort_by = 'sort_by';
1703         var sort_dir = 'sort_dir';
1704         if ( source == 'summary') {
1705                 sort_by = 'summary_sort_by';
1706                 sort_dir = 'summary_sort_dir';
1707         }
1708
1709         if (column_name == document.EditView[sort_by].value) {
1710                 if (  document.EditView[sort_dir].value=="d") {
1711                         document.EditView[sort_dir].value = "a";
1712                 }
1713                 else {
1714                         document.EditView[sort_dir].value = "d";
1715                 }
1716         }
1717         else {
1718                 document.EditView[sort_by].value = column_name;
1719                 document.EditView[sort_dir].value = "a";
1720         }
1721         document.EditView.to_pdf.value='';
1722         document.EditView.to_csv.value='';
1723         document.EditView['report_offset'].value=0;
1724         if ( fill_form() == true) {
1725                 document.EditView.submit();
1726         }
1727 }
1728
1729 function set_offset(offset) {
1730         document.EditView['report_offset'].value=offset;
1731         document.EditView.to_pdf.value='';
1732         document.EditView.to_csv.value='';
1733         if ( fill_form() == true) {
1734                 document.EditView.submit();
1735         }
1736
1737 }
1738
1739 function load_page() {
1740         reload_joins();
1741     current_module = document.EditView.self.options[document.EditView.self.options.selectedIndex].value;
1742     reload_join_rows('regular');
1743     all_fields = getAllFieldsMapped(current_module);
1744     if(form_submit != "true")
1745     {
1746         remakeGroups();
1747         reload_groups();
1748         reload_filters();
1749     }
1750     reload_columns('regular');
1751 }
1752
1753 function reload_joins() {
1754         for ( var index in report_def.full_table_list ) {
1755                 var curr_table = report_def.full_table_list[index];
1756
1757                 if ( index != "self" ) {
1758                         add_related(curr_table.parent,index);
1759
1760                         option_selectbox = document.getElementById('outer_' + index);
1761
1762                         if ( option_selectbox != null ) {
1763                                 if ( curr_table.optional != null && curr_table.optional == true ) {
1764                                         option_selectbox.checked = true;
1765                                 }
1766                                 else {
1767                                         option_selectbox.checked = false;
1768                                 }
1769                         }
1770                         else {
1771                                 //alert("option_selectbox is null (outer_" + index + ")");
1772                         }
1773                 }
1774
1775                 var curr_select = document.getElementById(index);
1776                 curr_select.value = curr_table.value;
1777                 full_table_list[index] = curr_table;
1778         }
1779 }
1780
1781 function getFieldKey(field_def) {
1782         var func_name = '';
1783         if (typeof(field_def.group_function) != 'undefined') {
1784                 func_name = field_def.group_function;
1785         }
1786         else if (typeof(field_def.column_function) != 'undefined') {
1787                 func_name = field_def.column_function;
1788         }
1789
1790         if ( field_def.group_function == 'count') {
1791                return 'count';
1792         }
1793         else if (! (func_name == 'weighted_amount' || func_name == 'weighted_sum') && func_name != '' ) {
1794                 return field_def.table_key+":"+field_def.name+":"+func_name;
1795         }
1796
1797         return field_def.table_key+":"+field_def.name;
1798 }
1799
1800
1801 function reload_filters() {
1802         for(index in report_def.filters_def) {
1803                 report_def.filters_def[index].column_name = getFieldKey(report_def.filters_def[index]);
1804                 addFilter(report_def.filters_def[index]);
1805         }
1806 }
1807
1808 function reload_groups() {
1809         for(index in report_def.group_defs) {
1810                 addGroupBy(report_def.group_defs[index]);
1811         }
1812 }
1813
1814 function get_rel_type(linked_field,relationship) {
1815         if ( typeof(linked_field['link_type']) != 'undefined') {
1816                 return linked_field['link_type'];
1817         }
1818
1819         // code should never get this far.. link_type is already defined
1820
1821         if ( relationship.relationship_type == 'one-to-many') {
1822                 if (linked_field.bean_is_lhs == true) {
1823                         if ( relationship['lhs_module'] == linked_field['module']) {
1824                                 return 'one';
1825                         }
1826                         else {
1827                                 return 'many';
1828                         }
1829                 }
1830                 else {
1831                         if ( relationship['rhs_module'] == linked_field['module']) {
1832                                 return 'one';
1833                         }
1834                         else {
1835                                 return 'many';
1836                         }
1837                 }
1838         }
1839
1840         return 'many';
1841 }
1842
1843 function joinChecked(obj) {
1844         reload_columns('add');
1845         reload_join_rows('add');
1846
1847         var objName = obj.id;
1848
1849         // loop thru all filters, refresh module select, and reset if
1850         // was selecting a module that doesnt exist in the current links
1851         for( var index in filters_arr) {
1852                 current_filter_id = index;
1853                 var filter_row = filters_arr[filters_count_map[index]];
1854
1855                 // Bug 13073////
1856                 var filter_module = filter_row.module_select[filter_row.module_select.selectedIndex].value;
1857                 if ( objName.indexOf("_div") > -1)
1858                         filter_module = filter_module.substr(0, objName.indexOf("_div"));
1859
1860                 // If the filter and the object refer to the same module and we aren't just adding more relations...
1861                 // When we add more relations, the object is not a div
1862                 if ( objName.indexOf("_div") > -1 && objName.substr(0, objName.indexOf("_div")) == filter_module) {
1863                         deleteFilter(index);
1864                 }
1865                 else {
1866                         // Bug 13124////
1867                         var filter = {column_name:filter_row.module_select[filter_row.module_select.selectedIndex].value,
1868                                 qualifier_name:'',input_name0:'',input_name1:''};
1869                         // Bug 13124////
1870
1871                         refreshFilterModule(filter_row.module_select,filter,index);
1872                 }
1873         }
1874
1875         for( var index in groups_arr) {
1876                 current_group_id = index;
1877                 var group_row = groups_arr[groups_count_map[index]];
1878                 // Bug 13073////
1879                 var group_module = group_row.module_select[group_row.module_select.selectedIndex].value;
1880                 if ( objName.indexOf("_div") > -1)
1881                         group_module = group_module.substr(0, objName.indexOf("_div"));
1882
1883                 // If the group and the object refer to the same module and we aren't just adding more relations...
1884                 // When we add more relations, the object is not a div
1885                 if ( objName.indexOf("_div") > -1 && objName.substr(0, objName.indexOf("_div")) == group_module) {
1886                         deleteGroup(index);
1887                 }
1888                 else {
1889                         // Bug 13124////
1890                         var group = {column_name:group_row.module_select[group_row.module_select.selectedIndex].value};
1891                         // Bug 13124////
1892                         refreshGroupModule(group_row.module_select,group,index);
1893                         refreshGroupColumn(group_row.column_select,group,index);
1894                         refreshGroupQualify(group_row.qualify_select,group,index);
1895                 }
1896
1897         }
1898 }
1899
1900
1901 function delete_this_join( this_id ) {
1902         // Get rid of my children
1903         delete_join_rows(this_id);
1904
1905         this_obj = document.getElementById(this_id + "_div");
1906         this_obj.parentNode.removeChild(this_obj);
1907
1908         parent_id = full_table_list[this_id].parent;
1909
1910         if ( full_table_list[parent_id] != null ) {
1911                 delete full_table_list[parent_id].children[this_id];
1912         }
1913
1914         delete full_table_list[this_id];
1915         joinChecked(this_obj);
1916 }
1917
1918 function delete_join_rows( parent_id ) {
1919         // Reset the selected fields
1920         all_fields = new Array();
1921
1922         if ( full_table_list[parent_id] != null && full_table_list[parent_id].children != null ) {
1923                 // This guy has some children
1924                 // Make a copy of the list, javascript doesn't like iterating through a list you are modifying.
1925                 var children_list = full_table_list[parent_id].children;
1926
1927                 for ( var child in children_list ) {
1928                         // Delete the grand-children first
1929                         delete_join_rows(child);
1930                         // Then delete the child
1931                         delete full_table_list[child];
1932                         delete full_table_list[parent_id].children[child];
1933                 }
1934         }
1935
1936         // Clear out the HTML div that contains the children
1937         var children_div = document.getElementById(parent_id + "_children");
1938         if ( children_div != null ) {
1939                 children_div.innerHTML = '';
1940                 children_div.style.display = 'none';
1941         }
1942 }
1943
1944 function add_related( parent_id, my_id ) {
1945         var options = new Array();
1946         var option_info = new Object();
1947         option_info['value'] = '';
1948         option_info['text'] = lbl_none;
1949         option_info['selected'] = true;
1950         options[options.length] = option_info;
1951
1952         // Get the parent module name
1953         var mod_name = full_table_list[parent_id].module;
1954         if ( mod_name == null ) {
1955                 alert(lbl_alert_cant_add);
1956                 return(false);
1957         }
1958
1959         if ( module_defs[mod_name] == null ) {
1960                 return(false);
1961         }
1962
1963         // Grab the parent's link list
1964         var link_defs = getLinksByRelType( module_defs[mod_name].link_defs);
1965
1966         var selected_linked_field;
1967
1968         for (linked_field_name in link_defs) {
1969                 var linked_field =  link_defs[linked_field_name];
1970
1971                 var selected = false;
1972                 var option_info = new Object();
1973                 option_info['text'] = linked_field['label'];
1974                 option_info['value'] = linked_field_name;
1975                 option_info['selected'] = false;
1976                 options[options.length] = option_info;
1977         }
1978
1979         var select_html_info = new Object();
1980         var select_info = new Object();
1981
1982         // Find a free ID
1983         if ( my_id == null ) {
1984                 var id_num = 0;
1985                 while ( document.getElementById(parent_id + '_link_' + id_num ) != null ) {
1986                         id_num++;
1987                 }
1988                 select_info['name'] = parent_id + '_link_' + id_num;
1989         }
1990         else {
1991                 // Use the ID that someone gave me.
1992                 select_info['name'] = my_id;
1993         }
1994         select_info['id'] = select_info['name'];
1995         select_info['onchange'] = 'table_changed(this);';
1996         select_html_info['select'] = select_info;
1997
1998         select_html_info['options'] = options;
1999
2000         // Setup the entry in the full table list
2001         full_table_list[select_info['id']] = new Object();
2002         full_table_list[select_info['id']].parent = parent_id;
2003         full_table_list[select_info['id']].children = new Object();
2004
2005         // Add some bookkeeping so that we can properly prune the children
2006         full_table_list[parent_id].children[select_info['id']] = select_info['id'];
2007
2008         children_div = document.getElementById(parent_id + "_children");
2009         if ( children_div.style.display == 'none' ) {
2010                 // We want to add children, we should make the display visible
2011                 children_div.style.display = '';
2012         }
2013
2014         new_child_div = document.createElement('div');
2015         new_child_div.style.marginLeft = '10px';
2016         new_child_div.style.marginTop = '5px';
2017         new_child_div.style.marginBottom = '5px';
2018
2019         new_child_div.innerHTML = "<b>" + LBL_RELATED + "</b>" + buildSelectHTML(select_html_info) +
2020                 ' <a href="" class="button" style="padding: 2px; text-decoration: none;" onClick="add_related(\'' + select_info['name'] + '\'); return(false);">' + lbl_add_related +
2021                 '</a> <a href="" class="button" style="padding: 2px; text-decoration: none;" onClick="delete_this_join(\'' + select_info['name'] + '\'); return(false);">' + lbl_del_this + '</a> ' +
2022                 buildOuterJoinHTML(select_html_info) +
2023                 '<div style="display: none; border-left: 2px dotted #000000; padding-left: 5px;" id="' + select_info['name'] + '_children"></div>';
2024
2025         new_child_div.id = select_info['name'] + '_div';
2026         children_div.appendChild(new_child_div);
2027 }
2028
2029 function reload_join_rows( type ) {
2030         // This function is now blank, in case someone wants to fill it in.
2031 }
2032
2033 //FIXME: Delete, this is now unused
2034 function build_join_rows(module,joins_table,level) {
2035         join_refs = new Array();
2036         if ( typeof (level) == 'undefined') {
2037                 level = 0;
2038         }
2039         level++;
2040
2041         var link_defs = getLinksByRelType( module_defs[module].link_defs,'one');
2042         if ( level == 1) {
2043
2044         }
2045
2046         if ( level < 5 ) {
2047                 var tr = joins_table.insertRow(joins_table.rows.length);
2048                 var td = tr.insertCell(tr.cells.length);
2049                 var hidden_input = '';
2050                 join_index = 0;
2051                 for (linked_field_name in  link_defs) {
2052                         var linked_field = link_defs[linked_field_name];
2053                         var input_elem =  document.createElement('input');
2054                         input_elem.type='hidden';
2055                         input_elem.name='link_'+linked_field['name'];
2056                         input_elem.id='link_'+linked_field['name'];
2057                         input_elem.value=linked_field['name'];
2058
2059                         join_index++;
2060
2061                         join_refs.push(input_elem);
2062                         td.appendChild(input_elem);
2063                 }
2064         }
2065
2066         if ( level == 1 ) {
2067                 var options = new Array();
2068                 var option_info = new Object();
2069                 option_info['value'] = '';
2070                 option_info['text'] = lbl_none;
2071                 option_info['selected'] = selected;
2072                 options[options.length] = option_info;
2073                 var link_defs = getLinksByRelType( module_defs[module].link_defs,'many');
2074
2075                 var selected_linked_field;
2076                 var first = true;
2077                 for (linked_field_name in  link_defs) {
2078                         if (first) {
2079                                 selected_linked_field = link_defs[linked_field_name];
2080                                 first = false;
2081                         }
2082                         var linked_field =  link_defs[linked_field_name];
2083                         var selected = false;
2084                         var option_info = new Object();
2085                         option_info['value'] = linked_field['name'];
2086                         option_info['text'] = linked_field_name.substring(0,1).toUpperCase() + linked_field_name.substring(1,linked_field_name.length);
2087                         option_info['selected'] = selected;
2088                         options[options.length] = option_info;
2089                 }
2090
2091                 var select_html_info = new Object();
2092                 var select_info = new Object();
2093                 select_info['name'] = 'joined';
2094                 select_info['id'] = 'multijoin';
2095                 select_info['onchange'] = 'joinChecked(this);';
2096                 select_html_info['select'] = select_info;
2097
2098                 var tr = joins_table.insertRow(joins_table.rows.length);
2099                 var td = tr.insertCell(tr.cells.length);
2100                 select_html_info['options'] = options;
2101         }
2102 }
2103
2104 function getSelectedLinkJoins( link_array ) {
2105         var link_join_array = new Object();
2106
2107         var outer_check = document.getElementById("outer_joined");
2108         if ( outer_check != null ) {
2109                 link_name = document.forms.EditView.joined;
2110                 if ( outer_check.checked ) {
2111                         link_join_array[link_name.value] = 1;
2112                 }
2113                 else {
2114                         link_join_array[link_name.value] = 0;
2115                 }
2116         }
2117
2118         return link_join_array;
2119 }
2120
2121 function getSelectedLinks() {
2122         var joins_array = new Array();
2123
2124         for (var index in full_table_list) {
2125                 if ( index == 'self' ) {
2126                         // This is the primary module, we don't want to include it
2127                         continue;
2128                 }
2129
2130                 if ( full_table_list[index] != null && full_table_list[index].value != '' ) {
2131                         joins_array.push(index);
2132                 }
2133         }
2134
2135         return joins_array;
2136 }
2137
2138 function getRelatedModule(link_def) {
2139         if(typeof link_def == 'undefined') {
2140                 return;
2141         }
2142         var rel_name = link_def.relationship_name;
2143         var rel_def = rel_defs[rel_name];
2144         if(typeof(rel_def) == 'undefined') {
2145                 return '';
2146         }
2147         if ( link_def.bean_is_lhs ) {
2148                 return rel_def['rhs_module'];
2149         }
2150         else {
2151                 return rel_def['lhs_module'];
2152         }
2153 }
2154
2155
2156 function viewJoinChanged(obj) {
2157         reload_columns('join');
2158 }
2159
2160 function getSelectedLinkDefs(module) {
2161         if ( typeof(module) == 'undefined') {
2162                 module = current_module;
2163         }
2164         var new_links = new Object();
2165         var links = getSelectedLinks()
2166
2167         var type = 'one';
2168         for(var i in  links) {
2169                 if(typeof full_table_list[links[i]].link_def == 'undefined') {
2170                         return;
2171                 }
2172                 var linked_field = full_table_list[links[i]].link_def;
2173
2174                 var selected = false;
2175                 var relationship = rel_defs[linked_field['relationship_name']];
2176                 var rel_type = get_rel_type(linked_field,relationship);
2177
2178                 new_links[links[i]] = linked_field;
2179         }
2180         return new_links;
2181 }
2182
2183 function moduleIsVisible(module) {
2184         if (typeof(visible_modules[module]) == 'undefined') {
2185                 return false;
2186         }
2187         return true;
2188 }
2189
2190 function getLinksByRelType(link_defs,type) {
2191         var new_links = new Object();
2192         for(var i in link_defs) {
2193                 var linked_field = link_defs[i];
2194
2195                 var module = getRelatedModule(linked_field);
2196                 if (! moduleIsVisible(module)) {
2197                         continue;
2198                 }
2199
2200                 var selected = false;
2201                 var relationship = rel_defs[linked_field['relationship_name']];
2202                 var rel_type = get_rel_type(linked_field,relationship);
2203
2204                 if (typeof(type) == 'undefined' || rel_type == type) {
2205                         new_links[i] = link_defs[i];
2206                 }
2207         }
2208         return new_links;
2209 }
2210
2211 //create a unique key for each reportable field across tables
2212
2213 function getAllFieldsMapped(module) {
2214         var all_fields = new Array();
2215         var summary_fields_str = '';
2216
2217         for(var k in module_defs[module].field_defs) {
2218                 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};
2219         }
2220
2221         for(var k in module_defs[module].summary_field_defs) {
2222                 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};
2223                         summary_fields_str+='|'+"self:"+module_defs[module].summary_field_defs[k].name;
2224         }
2225
2226         all_fields["count"] = all_fields["self:count"];
2227
2228         var link_defs = getSelectedLinkDefs(module);
2229
2230
2231         for(var i in link_defs) {
2232                 var join_module = getRelatedModule(link_defs[i]);
2233                 if ( typeof(module_defs[join_module]) == 'undefined') {
2234                         continue;
2235                 }
2236
2237                 for( var j in module_defs[join_module].field_defs) {
2238                         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};
2239                 }
2240
2241                 for(var j in module_defs[join_module].summary_field_defs) {
2242                         var sum_field_def = module_defs[join_module].summary_field_defs[j];
2243
2244                         // dont include custom fields on the second level.. yet
2245                         if ( typeof( sum_field_def.field_def_name) != 'undefined') {
2246                                 var field_def = module_defs[join_module].field_defs[sum_field_def.field_def_name];
2247                                 if ( typeof( field_def.custom_type) != 'undefined') {
2248                                         continue;
2249                                 }
2250                         }
2251                         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};
2252                 }
2253         }
2254
2255         return all_fields;
2256 }
2257
2258 // this is called on doubleclick of the columns selector
2259 function doRename(obj) {
2260         var label = prompt("Rename label:\n"+obj.default_label,obj.text);
2261         if ( label != null) {
2262                 obj.text = label;
2263                 obj.saved_text = label;
2264         }
2265 }
2266
2267 function saveLabel(type, obj) {
2268         if(type == 'column') {
2269                 var columns_ref = object_refs['display_columns'];
2270         }
2271         else if(type == 'detailsummary'){
2272                 var columns_ref = object_refs['display_summary'];
2273         }
2274         else {
2275                 return;
2276         }
2277
2278         if(typeof(obj.lastIndex) != 'undefined' &&  obj.lastIndex != -1 ){
2279                 var current_option = columns_ref.options[obj.lastIndex];
2280                 current_option.text =  obj.value + '  [' +  current_option.default_label + ']';
2281                 current_option.saved_text = obj.value;
2282          }
2283          else{
2284                 this.value = '';
2285                 this.lastIndex = -1;
2286          }
2287 }
2288
2289 function reload_columns( reload_type) {
2290         document.getElementById('column_label_editor').value = '';
2291         if ( typeof ( reload_type ) == 'undefined') {
2292                 reload_type = 'default';
2293         }
2294
2295  // get the current module from the dropdown value
2296         current_module = document.EditView.self.options[document.EditView.self.options.selectedIndex].value;
2297
2298         // get the reference to the select objects
2299     display_columns_ref = object_refs['display_columns'];
2300     hidden_columns_ref = object_refs['hidden_columns'];
2301     display_summary_ref = object_refs['display_summary'];
2302     display_summary_ref.onchange = function() {
2303                 var current_option = this.options[this.selectedIndex];
2304                 document.getElementById('detailsummary_label_editor').lastIndex = this.selectedIndex;
2305                 if(typeof(current_option.saved_text) == 'undefined') {
2306                         document.getElementById('detailsummary_label_editor').value =current_option.text;
2307                 }
2308                 else{
2309                         document.getElementById('detailsummary_label_editor').value =current_option.saved_text;
2310                 }
2311         };
2312
2313     hidden_summary_ref = object_refs['hidden_summary'];
2314         display_columns_ref.onchange = function() {
2315                 var current_option = this.options[this.selectedIndex];
2316                 document.getElementById('column_label_editor').lastIndex = this.selectedIndex;
2317                 if(typeof(current_option.saved_text) == 'undefined'){
2318                         document.getElementById('column_label_editor').value =current_option.text;
2319                 }
2320                 else{
2321                         document.getElementById('column_label_editor').value =current_option.saved_text;
2322                 }
2323         };
2324
2325     if ( reload_type == 'default' || reload_type=='regular') {
2326                 if (reload_type == 'default') {
2327                         visible_fields_map = new Object();
2328                         document.EditView.show_details.checked = false;
2329 //                      document.EditView.report_type[0].checked  = true;
2330
2331                         document.getElementById('summary_table').style.display='none';
2332                         document.getElementById('summary_more_div').style.display='none';
2333                         document.getElementById('columns_table').style.display='';
2334                         document.getElementById('columns_more_div').style.display='';
2335                 visible_summary_fields_org = module_defs[current_module].default_summary_columns;
2336
2337                 visible_summary_fields = new Array();
2338
2339                 for(i=0;i < visible_summary_fields_org.length;i++) {
2340                                 if ( visible_summary_fields_org[i] == 'count') {
2341                                 visible_summary_fields.push(  visible_summary_fields_org[i]);
2342                                 }
2343                                 else {
2344                                 visible_summary_fields.push( 'self:'+ visible_summary_fields_org[i]);
2345                                 }
2346                 }
2347                 visible_fields = module_defs[current_module].default_table_columns;
2348                 }
2349
2350                 // TODO: FIX THIS:
2351
2352                 selected_link_name = module_defs[current_module].default_link_name;
2353                 display_columns_ref.options.length = 0;
2354                 display_summary_ref.options.length = 0;
2355                 hidden_columns_ref.options.length = 0;
2356                 hidden_summary_ref.options.length = 0;
2357         }
2358         else if (reload_type == 'add' || reload_type == 'join')  {
2359                 visible_fields = new Array();
2360                 visible_summary_fields = new Array();
2361
2362                 for(i=0;i < display_columns_ref.options.length;i++) {
2363                         visible_fields.push(display_columns_ref.options[i].value);
2364
2365                         if ( typeof(visible_fields_map) != 'undefined' && typeof(visible_fields_map[display_columns_ref.options[i].value]) == 'undefined' ) {
2366                                 if ( typeof (display_columns_ref.options[i].saved_text) != 'undefined') {
2367                                         visible_fields_map[display_columns_ref.options[i].value] = {"label":display_columns_ref.options[i].saved_text};
2368                                 }
2369                         }
2370                 }
2371
2372                 for(i=0;i < display_summary_ref.options.length;i++) {
2373                         visible_summary_fields.push(display_summary_ref.options[i].value);
2374                         if ( typeof(visible_summary_fields_map) != 'undefined' && typeof(visible_summary_fields_map[display_summary_ref.options[i].value]) == 'undefined' ) {
2375                                 if ( typeof (display_summary_ref.options[i].saved_text) != 'undefined') {
2376                                         visible_fields_map[display_summary_ref.options[i].value] = {"label":display_summary_ref.options[i].saved_text};
2377                                 }
2378                         }
2379                 }
2380
2381                 display_columns_ref.options.length = 0;
2382                 display_summary_ref.options.length = 0;
2383                 hidden_columns_ref.options.length = 0;
2384                 hidden_summary_ref.options.length = 0;
2385         }
2386
2387     var seen_visible = new Object();
2388
2389         var view_join = document.EditView.view_join;
2390
2391         var selected_link = '';
2392         var link_defs = getSelectedLinkDefs();
2393
2394         var view_join_value = '';
2395         // first remember what was selected originally
2396         if (typeof(view_join.options) != 'undefined' && view_join.options.length > 0) {
2397                 view_join_value = view_join.options[view_join.selectedIndex].value;
2398         }
2399         // now rebuild the select box that chooses which related table to use when showing the available fields
2400         view_join.options.length = 0;
2401
2402         if ('self' == view_join_value) {
2403                 selected=true;
2404         }
2405         else {
2406                 selected=false;
2407         }
2408
2409         var select_counter = 0;
2410         view_join.options[view_join.options.length] = new Option(module_defs[current_module].label,'self',selected);
2411
2412
2413         for(var i in full_table_list) {
2414                 if ( i == "self" ) {
2415                         // We already added the self option above
2416                         continue;
2417                 }
2418                 var table_def = full_table_list[i];
2419                 var selected = false;
2420                 select_counter++;
2421
2422                 // re-selected the remembered select (if there was one)
2423                 if (i == view_join_value) {
2424                         selected=true;
2425                 }
2426                 else {
2427                         selected=false;
2428                 }
2429
2430                 var label = table_def['label'];
2431                 if ( i != 'self' ) {
2432                         label = full_table_list[full_table_list[i].parent].label + ' > '+ label;
2433                 }
2434
2435                 view_join.options[view_join.options.length] = new Option(label,i,selected);
2436                 if(selected){
2437                         view_join.selectedIndex = select_counter;
2438                 }
2439         }
2440
2441         // select the first one if first time load
2442         var selected_module = current_module;
2443         current_prefix = 'self';
2444         var table_key = view_join.options[view_join.selectedIndex].value;
2445         var field_defs = new Object();
2446         if ( table_key != 'self') {
2447                 current_prefix = table_key;
2448                 selected_module = full_table_list[table_key].module;
2449                 field_defs = module_defs[selected_module].field_defs;
2450         }
2451         else {
2452         field_defs = module_defs[selected_module].field_defs;
2453         }
2454
2455         all_fields = getAllFieldsMapped(current_module);
2456
2457         for(i=0;i < visible_fields.length;i++) {
2458                 if (typeof(all_fields[visible_fields[i]]) == 'undefined') {
2459              continue;
2460                 }
2461                 var field = all_fields[visible_fields[i]].field_def;
2462                 var default_label = all_fields[visible_fields[i]]['label_prefix']+": "+field['vname'];
2463
2464                 if ( typeof (visible_fields_map[visible_fields[i]]) != 'undefined' &&  typeof (visible_fields_map[visible_fields[i]].label) != 'undefined') {
2465                         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']);
2466                 }
2467                 else {
2468                         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']);
2469                 }
2470
2471                 var current_option = display_columns_ref.options[display_columns_ref.options.length-1];
2472                 current_option.default_label = default_label;
2473
2474                 if(current_option.text != current_option.default_label){
2475                         current_option.saved_text = current_option.text;
2476                         current_option.text  += '  [' + default_label + ']';
2477                 }
2478
2479        seen_visible[ visible_fields[i] ] = 1;
2480         }
2481
2482         var field_defs_arr = getOrderedFieldDefArray(field_defs,false);
2483
2484         for(var index in field_defs_arr) {
2485         var field = field_defs_arr[index];
2486         var key = current_prefix +":"+field['name'];
2487
2488                 if ( typeof(all_fields[key]) == 'undefined') {
2489                         continue;
2490                 }
2491
2492                 if (seen_visible[key] != 1) {
2493                         hidden_columns_ref.options[hidden_columns_ref.options.length] = new Option(field['vname'],key);
2494                 }
2495         }
2496
2497         var seen_visible_summary = new Object();
2498         var view_join_summary = document.EditView.view_join_summary;
2499         var selected_link_value = '';
2500
2501         // first remember what was selected originally
2502         if (typeof(view_join_summary.options) != 'undefined' && view_join_summary.options.length > 0) {
2503                 selected_link_value = view_join_summary.options[view_join_summary.selectedIndex].value;
2504         }
2505
2506         // now rebuild the select box that chooses which related table to use when showing the available fields
2507         view_join_summary.options.length = 0;
2508         if ( 'self' == selected_link_value) {
2509                 selected=true;
2510         }
2511         else {
2512                 selected=false;
2513         }
2514
2515         view_join_summary.options[view_join_summary.options.length] = new Option(module_defs[current_module].label,'self',selected);
2516
2517         var summary_select_counter = 0;
2518
2519         for(var i in full_table_list) {
2520                 if ( i == "self" ) {
2521                         // We already added the self option above
2522                         continue;
2523                 }
2524
2525                 var linked_field = full_table_list[i];
2526                 var selected = false;
2527
2528                 // re-selected the remembered select (if there was one)
2529
2530                 if (i == selected_link_value) {
2531                         selected=true;
2532                 }
2533                 else {
2534                         selected=false;
2535                 }
2536
2537                 var label = linked_field['label'];
2538                 if ( i != 'self' ) {
2539                         label = full_table_list[full_table_list[i].parent].label + ' > '+ label;
2540                 }
2541
2542                 summary_select_counter++;
2543                 view_join_summary.options[view_join_summary.options.length] = new Option(label,i,selected);
2544                 if(selected){
2545                         view_join_summary.selectedIndex = summary_select_counter;
2546                 }
2547         }
2548
2549         // select the first one if first time load
2550         var selected_module = current_module;
2551
2552         current_prefix = 'self';
2553
2554         var sum_table_key = view_join_summary.options[view_join_summary.selectedIndex].value;
2555         if ( sum_table_key != '' && sum_table_key != 'self') {
2556                 current_prefix = sum_table_key;
2557                 selected_module = full_table_list[sum_table_key].module;
2558         }
2559
2560
2561         var valid_groups = new Object();
2562
2563         var group_by_table = document.getElementById('group_by_tbody');
2564
2565         has_group = null;
2566
2567         for(i=0; i < group_by_table.rows.length;i++) {
2568         has_group = 1;
2569         var cell0 = group_by_table.rows[i].cells[1];
2570         var cell1 = group_by_table.rows[i].cells[2];
2571                 var key = cell0.getElementsByTagName('select')[0].value;
2572
2573                 if ( typeof(all_fields[key]) == 'undefined') {
2574                         // Not a valid field
2575                         continue;
2576                 }
2577
2578                 var group_by_def = getListFieldDef(key);
2579
2580                 if ( group_by_def.table_key != current_prefix) {
2581                         continue;
2582                 }
2583                 var key = group_by_def.table_key+":"+group_by_def.name;
2584
2585                 if ( typeof (cell1) !=  'undefined' && cell1.getElementsByTagName('select')[0].style.display != 'none') {
2586                         key += ":"+cell1.getElementsByTagName('select')[0].value;
2587                 }
2588
2589         valid_groups[key] = 1;
2590         }
2591
2592     var field_defs = module_defs[selected_module].field_defs;
2593         var numerical_chart_column = document.EditView.numerical_chart_column;
2594         numerical_chart_column.options.length = 0;
2595         var which_option_selected = 0;
2596
2597         for(i=0;i < visible_summary_fields.length;i++) {
2598                 var key = visible_summary_fields[i];
2599                 if (typeof(all_fields[key]) == 'undefined' || typeof( all_fields[key].field_def) == 'undefined') {
2600             continue;
2601                 }
2602
2603                 if ( (typeof(valid_groups[key]) == 'undefined' && ( typeof( all_fields[key].field_def.summary_type)  == 'undefined'
2604              || all_fields[key].field_def.summary_type != 'group'))) {
2605                         continue;
2606                 }
2607
2608                 var field = all_fields[key].field_def;
2609                 var linked_field_name = '';
2610                 var label_prefix = '';
2611                 var default_label =  '';
2612
2613                 if ( field.name == 'count') {
2614                         key = 'count';
2615                         default_label = field['vname'];
2616                 }
2617                 else {
2618                         linked_field_name = all_fields[key].linked_field_name;
2619                         label_prefix = all_fields[key].label_prefix;
2620                         default_label = label_prefix+": "+field['vname'];
2621                 }
2622
2623                 var column_label;
2624
2625                 if (  typeof (visible_summary_field_map[key]) != 'undefined' && typeof (visible_summary_field_map[key].label) != 'undefined') {
2626                         column_label = visible_summary_field_map[key].label;
2627                 }
2628                 else {
2629                         column_label = default_label;
2630                 }
2631
2632                 display_summary_ref.options[display_summary_ref.options.length] = new Option(column_label,key);
2633                 var split_key = key.split(':');
2634                 var summary_field = all_fields[key].field_def;
2635                 if ( typeof (summary_field.group_function) != 'undefined') {
2636                         if (key == report_def['numerical_chart_column']) {
2637                                 which_option_selected = numerical_chart_column.options.length;
2638                         }
2639                         numerical_chart_column.options[numerical_chart_column.options.length] = new Option( column_label,key);
2640                 }
2641
2642                 var current_option = display_summary_ref.options[display_summary_ref.options.length-1];
2643                 current_option.default_label = default_label;
2644                 if(current_option.text != current_option.default_label) {
2645                         current_option.saved_text = current_option.text;
2646                         current_option.text  += '  [' + default_label + ']';
2647                 }
2648
2649                 seen_visible_summary[ key] = 1;
2650         }
2651
2652         numerical_chart_column.options.selectedIndex = which_option_selected;
2653
2654         var summary_field_defs = module_defs[selected_module].summary_field_defs;
2655         var field_defs_arr = getOrderedFieldDefArray(field_defs,false);
2656
2657         group_field = null;
2658         for(group_key in valid_groups) {
2659                 if(typeof all_fields[group_key] != 'undefined') {
2660                         group_field = all_fields[group_key].field_def;
2661
2662                         if (seen_visible_summary[group_key] != 1) {
2663                                 hidden_summary_ref.options[hidden_summary_ref.options.length] = new Option(group_field['vname'],group_key);
2664                         }
2665                         seen_visible_summary[group_key] = 1;
2666                 }
2667         }
2668
2669         for( var index in summary_field_defs) {
2670                 var field = summary_field_defs[index];
2671                 if ( field.summary_type != 'group') {
2672                         continue;
2673                 }
2674
2675         var key = current_prefix +":"+field['name'];
2676
2677                 if ( field['name'] == 'count') {
2678                         key = 'count';
2679                 }
2680
2681                 if ( typeof(all_fields[key]) == 'undefined') {
2682                         continue;
2683                 }
2684
2685                 if (seen_visible_summary[key] != 1) {
2686                         hidden_summary_ref.options[hidden_summary_ref.options.length] = new Option(field['vname'],key);
2687                 }
2688         }
2689
2690         refresh_chart_tab();
2691         var selected_chart_index = 1;
2692         if (reload_type == 'regular') {
2693                 for(var i=0;i < document.EditView.chart_type.options.length; i++) {
2694                         if (document.EditView.chart_type.options[i].value == report_def.chart_type) {
2695                                 selected_chart_index = i;
2696                         }
2697                 }
2698                 document.EditView.chart_type.selectedIndex = selected_chart_index;
2699         }
2700 }
2701
2702 function refresh_chart_tab() {
2703         if ( document.EditView.numerical_chart_column.options.length > 0 && has_group != null) {
2704                 document.getElementById('no_chart_text').style.display='none';
2705                 document.EditView.numerical_chart_column.disabled = false;
2706                 document.EditView.chart_type.disabled = false;
2707                 document.EditView.chart_type.selectedIndex = 1;
2708                 document.EditView.chart_description.disabled = false;
2709         }
2710         else {
2711                 document.getElementById('no_chart_text').style.display='';
2712                 document.EditView.numerical_chart_column.disabled = true;
2713                 document.EditView.chart_type.disabled = true;
2714                 document.EditView.chart_type.selectedIndex = 0;
2715                 document.EditView.chart_description.disabled = true;
2716         }
2717 }
2718
2719 function set_readonly(form) {
2720         if (form.save_report.checked) {
2721                 form.save_report.value='on';
2722                 form.save_report_as.readOnly=false;
2723                 form.save_report_as.focus();
2724         }
2725         else {
2726                 form.save_report.value='off';
2727                 form.save_report_as.readOnly=true;
2728         }
2729 }
2730
2731 // add non-standard attrs to the newly created option objects
2732 function addSelectOptionAttrs(info,obj) {
2733         for(i=0; i < info['options'].length; i++) {
2734                 option = info['options'][i];
2735                 var attr = new Object();
2736
2737                 for( var j in option ) {
2738                         if ( j != 'text' &&  j != 'value' && j != 'selected' && j != 'name' && j != 'id') {
2739                         obj.options[i][j] = option[j];
2740                         }
2741                 }
2742         }
2743 }
2744
2745 //builds the html for a select
2746 function buildSelectHTML(info) {
2747         var text;
2748         text = "<select";
2749
2750         for(var key in info['select']) {
2751                 if ( typeof (info['select'][key]) != 'undefined') {
2752                         text +=" "+ key +"=\""+ info['select'][key] +"\"";
2753                 }
2754         }
2755         text +=">";
2756
2757         var saved_attrs = new Array();
2758
2759         for(i=0; i < info['options'].length; i++) {
2760                 option = info['options'][i];
2761                 var attr = new Object();
2762                 for( var j in option ) {
2763             if ( j != 'text' &&  j != 'value' && j != 'selected' && j != 'name' && j != 'id') {
2764                                 attr[j] = option[j];
2765             }
2766                 }
2767                 saved_attrs.push(attr);
2768                 text += "<option value=\""+encodeURI(option['value'])+"\" ";
2769
2770                 if ( typeof (option['selected']) != 'undefined' && option['selected']== true) {
2771                         text += "SELECTED";
2772                 }
2773                 text += ">"+option['text']+"</option>";
2774         }
2775         text += "</select>";
2776         return text;
2777 }
2778
2779 function buildOuterJoinHTML(info) {
2780         var text;
2781         var checked;
2782
2783         checked = '';
2784         if ( report_def.link_joins != null ) {
2785                 for ( key in report_def.link_joins ) {
2786                         if ( report_def.link_joins[key] == 1 ) {
2787                                 checked = 'CHECKED';
2788                         }
2789                 }
2790         }
2791         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;
2792         text += '<img border="0" onmouseout="return nd();" onmouseover="return overlib(\'' + lbl_optional_help + '\', FGCLASS, \'olFgClass\', CGCLASS, \'olCgClass\', BGCLASS, \'olBgClass\', TEXTFONTCLASS, \'olFontClass\', CAPTIONFONTCLASS, \'olCapFontClass\', CLOSEFONTCLASS, \'olCloseFontClass\' );" src="' + image_path +'help.gif"/>';
2793
2794         return text;
2795 }
2796
2797 // This function is called when the outer join/optional checkbox is checked.
2798 function updateOuterJoin ( obj ) {
2799         // Nuke the outer_ part at the front of the string, to get the table key
2800         table_key = obj.id.replace("outer_","");
2801
2802         if ( obj.checked == true ) {
2803                 full_table_list[table_key].optional = true;
2804         }
2805         else {
2806                 full_table_list[table_key].optional = false;
2807         }
2808 }
2809
2810 function saved_chart_drilldown(group_value,group_key,id) {
2811        var report_url = 'index.php?module=Reports&page=report&action=index&id='+id+'#'+group_value;
2812        document.location = report_url;
2813 }
2814
2815 function chart_drilldown(group_value,is_saved_report,id) {
2816         var anch = document.getElementById(group_value);
2817         var elems = document.anchors;
2818
2819         for(var i in elems) {
2820                 var elem = elems[i];
2821                 if ( typeof(elem.name) != 'undefined' && elem.name != '' && typeof(elem.id) != 'undefined' && elem.id != '' && elem.id == elem.name) {
2822                         if ( group_value == elem.name ) {
2823                                 elem.focus();
2824                                 window.scrollBy(0,300);
2825                         }
2826                 }
2827         }
2828 }
2829
2830 function expandCollapseComboSummaryDiv(divId) {
2831         if (document.getElementById(divId)) {
2832                 if (document.getElementById(divId).style.display == "none") {
2833                         document.getElementById(divId).style.display = "";
2834                         document.getElementById("img_" + divId).innerHTML =
2835                                 document.getElementById("img_" + divId).innerHTML.replace(/advanced_search/,"basic_search");
2836                         document.getElementById('expanded_combo_summary_divs').value += divId + " ";
2837                 }
2838                 else {
2839                         document.getElementById(divId).style.display = "none";
2840                         document.getElementById("img_" + divId).innerHTML =
2841                                 document.getElementById("img_" + divId).innerHTML.replace(/basic_search/,"advanced_search");
2842                         document.getElementById('expanded_combo_summary_divs').value =
2843                                 document.getElementById('expanded_combo_summary_divs').value.replace(divId,"");
2844
2845                 }
2846         }
2847 }