1 /*********************************************************************************
2 * SugarCRM Community Edition is a customer relationship management program developed by
3 * SugarCRM, Inc. Copyright (C) 2004-2012 SugarCRM Inc.
5 * This program is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU Affero General Public License version 3 as published by the
7 * Free Software Foundation with the addition of the following permission added
8 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
9 * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
10 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
17 * You should have received a copy of the GNU Affero General Public License along with
18 * this program; if not, see http://www.gnu.org/licenses or write to the Free
19 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
23 * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
25 * The interactive user interfaces in modified source and object code versions
26 * of this program must display Appropriate Legal Notices, as required under
27 * Section 5 of the GNU Affero General Public License version 3.
29 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
30 * these Appropriate Legal Notices must retain the display of the "Powered by
31 * SugarCRM" logo. If the display of the logo is not reasonably feasible for
32 * technical reasons, the Appropriate Legal Notices must display the words
33 * "Powered by SugarCRM".
34 ********************************************************************************/
37 var groups_arr=new Array();
38 var chartTypesHolder = []; // storage for removed chart items
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;
49 var global_report_def = null;
51 // holds all the fields from current and joined tables
52 var all_fields = new Object();
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();
62 function hideCheckGroups() {
63 document.getElementById('checkGroups').style.display = 'none';
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);
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);
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;
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);
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);
94 full_table_list[obj.id].link_def.table_key = obj.id;
97 full_table_list[obj.id].module = obj.value;
100 if ( document.getElementById('report_results') != null ) {
101 document.getElementById('report_results').style.display='none';
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
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 = '';
124 function showDetailsClicked(obj) {
126 document.getElementById('columns_table').style.display='';
127 document.getElementById('columns_more_div').style.display='';
130 document.getElementById('columns_table').style.display='none';
131 document.getElementById('columns_more_div').style.display='none';
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);
140 for ( id in filters_count_map) {
141 if (filters_count_map[id] > filters_count_map[index]) {
142 filters_count_map[id]--;
147 function deleteGroup(index) {
148 if(typeof(groups_count_map[index]) == 'undefined' || typeof(groups_arr[groups_count_map[index]]) == 'undefined') {
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);
156 for ( id in groups_count_map) {
157 if (groups_count_map[id] > groups_count_map[index]) {
158 groups_count_map[id]--;
162 var group_by_button = document.getElementById('group_by_button');
163 group_by_button.style.display = 'inline';
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;
170 reload_columns('add');
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;
181 function reportTypeChanged() {
182 var report_type = getReportType();
184 var columns_table = document.getElementById('columns_table');
185 var summary_table = document.getElementById('summary_table');
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='';
199 if (document.EditView.show_details.checked) {
200 document.getElementById('columns_table').style.display='';
201 document.getElementById('columns_more_div').style.display='';
204 document.getElementById('columns_table').style.display='none';
205 document.getElementById('columns_more_div').style.display='none';
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') ;
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';
221 document.getElementById('report_results').style.display='none';
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);
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);
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');
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);
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');
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);
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);
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);
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);
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);
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);
305 function filterTypeChanged(index) {
306 var filter = {input_name0:''};
307 refreshFilterInput(filter,index);
310 function refreshFilterInput(filter,index) {
311 current_filter_id = index;
312 var filter_row = filters_arr[filters_count_map[index]];
314 if (typeof (filter_row.input_field0) != 'undefined' && typeof (filter_row.input_field0.value) != 'undefined') {
318 filter_row.input_cell.removeChild(filter_row.input_cell.firstChild);
319 addFilterInput(filter_row.input_cell,filter);
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;
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;
333 if (table_key == 'self') {
334 selected_module = current_module;
335 field_defs = module_defs[selected_module].group_by_field_defs;
338 selected_module = table_key;
339 var field_defs = module_defs[full_table_list[table_key].module].group_by_field_defs;
342 var field_defs_arr = getOrderedFieldDefArray(field_defs,true);
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' )) {
352 var key = table_key+":"+field.name;
354 if ( typeof(all_fields[key]) == 'undefined') {
358 if ( group.column_name == key) {
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;
372 if ( got_selected == 0) {
373 options[0]['selected'] = true;
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];
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;
388 var link_defs = getSelectedLinkDefs();
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;
396 var parts = filter.column_name.split(':');
397 var selected_link_name = parts[0];
399 for(var i in link_defs) {
400 var linked_field = link_defs[i];
401 var selected = false;
402 if ( i == selected_link_name) {
409 // re-selected the remembered select (if there was one)
411 var option_info = new Object();
412 option_info['value'] = i;
413 var label = linked_field['label'];
415 label = full_table_list[full_table_list[i].parent].label + ' > '+ label;
417 option_info['text'] = label;
418 option_info['selected'] = selected;
419 options[options.length] = option_info;
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];
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;
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;
442 var parts = filter.column_name.split(':');
443 var selected_link_name = parts[0];
445 for(var i in link_defs) {
446 var linked_field = link_defs[i];
447 var selected = false;
448 if ( i == selected_link_name) {
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'];
460 label = full_table_list[full_table_list[i].parent].label + ' > '+ label;
463 option_info['text'] = label;
464 option_info['selected'] = selected;
465 options[options.length] = option_info;
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];
473 function getOrderedFieldDefArray(field_defs,show_id_field) {
474 var field_defs_arr = new Array();
477 for(field_name in field_defs) {
478 var field = field_defs[field_name];
479 field_defs_arr.push(field);
482 field_defs_arr.sort( _sort_by_field_name);
484 if ( id_field != null && show_id_field ) {
485 field_defs_arr.unshift(id_field);
487 return field_defs_arr;
490 function _sort_by_field_name(a,b) {
491 if ( typeof(a['vname']) == 'undefined') {
492 a['vname'] = a['name'];
494 else if ( typeof(b['vname']) == 'undefined') {
495 b['vname'] = b['name'];
498 if ( a['type'] == 'name' || a['type'] == 'user_name' ) {
501 else if ( b['type'] == 'name' || b['type'] == 'user_name' ) {
505 return a['vname'].localeCompare( b['vname']);
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();
515 select_info['name'] = 'filter';
516 select_info['onchange'] = 'columnSelectChanged('+current_filter_id+');';
517 select_html_info['select'] = select_info;
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;
526 selected_module = table_key;
527 var field_defs = module_defs[full_table_list[table_key].module].field_defs;
530 var field_defs_arr = getOrderedFieldDefArray(field_defs,true);
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') {
540 if ( field.type == 'time') {
544 if ( filter.column_name == key) {
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;
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];
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;
576 selected_module = table_key;
577 var field_defs = module_defs[full_table_list[table_key].module].field_defs;
580 if ( typeof ( qualifier_name) == 'undefined' || qualifier_name == '') {
581 qualifier_name='equals';
584 var column_name = filter_row.column_select.options[filter_row.column_select.selectedIndex].value;
586 if ( typeof ( column_name) == 'undefined' || column_name == '') {
589 var field = all_fields[column_name].field_def;
591 var field_type = field.type;
592 if ( typeof(field.custom_type) != 'undefined') {
593 field_type = field.custom_type;
595 cell.innerHTML = "<table><tr></tr></table>";
597 var row = cell.getElementsByTagName("tr")[0];
599 if (qualifier_name == 'between') {
600 addFilterInputTextBetween(row,filter);
602 else if (qualifier_name == 'between_dates') {
603 addFilterInputDateBetween(row,filter);
605 else if (qualifier_name == 'empty' || qualifier_name == 'not_empty') {
606 addFilterNoInput(row,filter);
608 else if (field_type == 'date' || field_type == 'datetime') {
609 if (qualifier_name.indexOf('tp_') == 0) {
610 addFilterInputEmpty(row,filter);
614 addFilterInputDate(row,filter);
617 else if (field_type == 'id' || field_type == 'name' ) {
618 if ( qualifier_name == 'is') {
619 addFilterInputRelate(row,field,filter);
622 addFilterInputText(row,filter);
625 else if ((field_type == 'user_name')||(field_type == 'assigned_user_name')) {
626 if(users_array=="") {
629 if (qualifier_name == 'one_of') {
630 addFilterInputSelectMultiple(row,users_array,filter);
633 addFilterInputSelectSingle(row,users_array,filter);
636 else if (field_type == 'enum' || field_type == 'multienum') {
637 if (qualifier_name == 'one_of') {
638 addFilterInputSelectMultiple(row,field.options,filter);
641 addFilterInputSelectSingle(row,field.options,filter);
644 else if (field_type=='bool') {
645 var no = new Object();
647 no['text'] = SUGAR.language.languages.app_list_strings.checkbox_dom[1];
648 var yes = new Object();
650 yes['text'] = SUGAR.language.languages.app_list_strings.checkbox_dom[2];
651 var options = [ yes, no ];
652 addFilterInputSelectSingle(row,options,filter);
655 addFilterInputText(row,filter);
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');
668 xmlhttp.open("GET", gURL, false);
669 xmlhttp.onreadystatechange=loadUsers;
673 else if (window.ActiveXObject) { //IE
674 xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
676 xmlhttp.onreadystatechange=loadUsers;
677 xmlhttp.open('GET', gURL, false);
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);
689 var acc = xmlhttp.responseXML.getElementsByTagName('data');
691 for (var i=0;i<acc.length;i++)
693 val = getNodeValue(acc[i],'datavalue');
694 users_array[users_array.length] = eval("("+val+")");
700 function getNodeValue(obj,tag) {
701 return obj.getElementsByTagName(tag)[0].firstChild.nodeValue;
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 = '';
711 new_input.value=filter.input_name0;
712 new_input.name="text_input";
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;
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]);
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";
744 if ( typeof (filter.input_name0) != 'undefined' && filter.input_name0.length > 0) {
745 filter.input_name0 = to_display_date(filter.input_name0);
748 new_input.value=filter.input_name0;
749 new_input.name="text_input";
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);
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);
765 inputFieldObj : new_input ,
766 buttonObj : img_element,
767 ifFormat : cal_date_format,
769 singleClick : true, step : 1,
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;
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);
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);
799 var cell = document.createElement("td");
800 row.appendChild(cell);
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;
807 function addFilterInputSelectMultiple(row,options,filter) {
808 var cell = document.createElement('td');
809 row.appendChild(cell);
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;
818 var selected_map = new Object();
819 for (i=0;i < filter.input_name0.length;i++) {
820 selected_map[filter.input_name0[i] ] = 1;
823 for(i=0;i < options.length;i++) {
826 if (typeof(options[i].text) == 'undefined') {
827 option_text = options[i];
828 option_value = options[i];
830 else if (options[i].value == '') {
834 option_text = options[i].text;
835 option_value = options[i].value;
837 if ( typeof( selected_map[option_value]) != 'undefined' ) {
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;
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;
857 function addFilterInputSelectSingle(row,options,filter) {
858 var cell = document.createElement('td');
859 row.appendChild(cell);
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;
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];
872 else if (options[i].value == '') {
876 option_text = options[i].text;
877 option_value = options[i].value;
880 if (option_value == filter.input_name0 ) {
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;
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;
900 function addFilterInputTextBetween(row,filter) {
901 var filter_row = filters_arr[filters_count_map[current_filter_id]];
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 = '';
910 new_input.value=filter.input_name0;
911 cell.appendChild(new_input);
912 row.appendChild(cell);
913 filter_row.input_field0 = new_input;
915 var cell = document.createElement('td');
916 var new_text = document.createTextNode(lbl_and);
917 cell.appendChild(new_text);
918 row.appendChild(cell);
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 = '';
927 new_input.value=filter.input_name1;
928 cell.appendChild(new_input);
929 row.appendChild(cell);
930 filter_row.input_field1 = new_input;
933 function addFilterInputDateBetween(row,filter) {
934 var filter_row = filters_arr[filters_count_map[current_filter_id]];
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 = '';
944 filter.input_name0 = to_display_date(filter.input_name0);
945 new_input.value=filter.input_name0;
946 new_input.name="text_input";
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;
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);
964 inputFieldObj : new_input ,
965 buttonObj : img_element,
966 ifFormat : cal_date_format,
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);
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 = '';
985 filter.input_name1 = to_display_date(filter.input_name1);
986 new_input.value=filter.input_name1;
987 new_input.name="text_input";
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;
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);
1003 inputFieldObj : new_input ,
1004 buttonObj : img_element,
1005 ifFormat : cal_date_format,
1014 var current_parent = '';
1015 var current_parent_id = '';
1017 function set_current_parent(name,value) {
1018 current_parent.value = name;
1019 current_parent_id.value = value;
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;
1033 return selected_module;
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;
1041 current_parent_id.value = name_to_value_array['id'];
1042 current_parent.value = name_to_value_array['name'];
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";
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 = '';
1059 id_input.setAttribute("value",filter.input_name0);
1060 cell.appendChild(id_input);
1061 filter_row.input_field0 = id_input;
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= '';
1071 name_input.setAttribute("value",filter.input_name1);
1072 cell.appendChild(name_input);
1073 filter_row.input_field1 = name_input;
1075 row.appendChild(cell);
1077 var cell = document.createElement('td');
1078 var new_input = document.createElement("input");
1079 new_input.title= lbl_select;
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" } });
1091 cell.appendChild(new_input);
1093 row.appendChild(cell);
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;
1106 selected_module = full_table_list[table_key].module;
1111 if (typeof(column_name) == 'undefined' || column_name == '') {
1112 field = all_fields['self:name'].field_def;
1115 field = all_fields[column_name].field_def;
1118 var field_type = field.type;
1120 if ( typeof(field.custom_type) != 'undefined') {
1121 field_type = field.custom_type;
1124 var style = 'display: inline';
1125 if (field_type != 'date' && field_type != 'datetime') {
1126 style='display: none';
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;
1137 var selected = false;
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) ) {
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;
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];
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;
1163 var field = new Object();
1164 if (typeof(field_key) != 'undefined' && field_key != '') {
1165 field = all_fields[field_key].field_def;
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;
1175 field_type = field.type;
1177 if ( typeof(field.custom_type) != 'undefined') {
1178 field_type = field.custom_type;
1181 var qualifiers = filter_defs[field_type];
1182 var selected = false;
1184 for(i=0;i < qualifiers.length; i++) {
1185 if (qualifiers[i].name == filter.qualifier_name) {
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;
1198 select_html_info['options'] = options;
1199 cell.innerHTML=buildSelectHTML(select_html_info);
1201 filter_row['qualify_select'] = cell.getElementsByTagName('select')[0];
1204 var default_group = {column_name:''};
1206 function addGroupByFromButton(group) {
1208 reload_columns('add');
1211 function addGroupBy(group) {
1212 groups_arr[groups_arr.length] = new Object();
1214 groups_count_map[groups_count] = groups_arr.length - 1;
1215 current_group_id = groups_count;
1217 if ( typeof (group) == 'undefined') {
1218 group = default_group;
1220 group.column_name = group.table_key+":"+group.name;
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;
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);
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);
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);
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);
1249 the_table.appendChild(row);
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;
1255 else if(groups_arr.length == 2){
1256 document.EditView.chart_type.options[5] = chartTypesHolder.pop();
1260 var default_filter = {column_name:'',qualifier_name:'',input_name0:'',input_name1:''};
1262 function addFilter(filter) {
1263 filters_arr[filters_arr.length] = new Object();
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;
1271 var the_table = document.getElementById('filters');
1272 var row = document.createElement('tr');
1273 filters_arr[filters_count_map[filters_count]].row = row;
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);
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);
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);
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);
1300 var cell = document.createElement('td');
1302 row.appendChild(cell);
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);
1308 the_table.appendChild(row);
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]);
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);
1326 for ( id in groups_count_map) {
1327 if (groups_count_map[id] > groups_count_map[index]) {
1328 groups_count_map[id]--;
1332 var group_by_button = document.getElementById('group_by_button');
1333 group_by_button.style.display = 'inline';
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();
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;
1353 function getListFieldDef(field_key) {
1354 var field_def = new Object();
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'];
1361 field_def.name = vardef['name'];
1364 field_def.label = vardef['vname'];
1366 if ( typeof(vardef.group_function) != 'undefined' && vardef.group_function != null) {
1367 field_def.group_function = vardef.group_function;
1369 if ( typeof(vardef.column_function) != 'undefined' && vardef.column_function != null) {
1370 field_def.column_function = vardef.column_function;
1372 field_def.table_key = all_fields[field_key].linked_field_name;
1377 function fill_form(type) {
1378 var report_def = new Object();
1379 var form_obj = document.EditView;
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';
1387 var got_summary_sort = 0;
1388 var got_summary_column = 0;
1390 var error_msgs = lbl_missing_fields+': \n';
1391 report_def['report_type'] = getReportType();
1393 report_def.display_columns = new Array();
1395 var group_by_table = document.getElementById('group_by_tbody');
1397 if (document.EditView.show_details.checked == true || report_def.report_type=='tabular') {
1398 var disp_opts = object_refs['display_columns'].options;
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);
1405 if(typeof(disp_opts[i].saved_text) != 'undefined') {
1406 field_def['label'] = disp_opts[i].saved_text;
1409 field_def['label'] = disp_opts[i].text;
1412 report_def.display_columns.push(field_def);
1414 if (form_obj.sort_by.value == disp_opts[i].value) {
1420 report_def.summary_columns = new Array();
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);
1430 if (typeof(field_def.group_function) != 'undefined') {
1431 got_summary_column = 1;
1434 if(typeof(sum_opts[i].saved_text) != 'undefined') {
1435 field_def['label'] = sum_opts[i].saved_text;
1438 field_def['label'] = sum_opts[i].text;
1441 summary_column_map[sum_opts[i].value] = field_def;
1443 report_def.summary_columns.push(field_def);
1445 if (form_obj.summary_sort_by.value == sum_opts[i].value) {
1446 got_summary_sort = 1;
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();
1457 if (got_sort == 0 ) {
1458 form_obj.sort_by.value = '';
1459 form_obj.sort_dir.value = '';
1462 var sort_by_elem = new Object();
1463 var sort_by_elem = getListFieldDef(form_obj.sort_by.value);
1465 sort_by_elem.sort_dir = form_obj.sort_dir.value;
1466 sort_by.push(sort_by_elem);
1468 report_def.order_by = sort_by;
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 = '';
1476 var summary_sort_by_elem = new Object();
1477 var key_arr = form_obj.summary_sort_by.value.split(':');
1479 summary_sort_by_elem.name = key_arr[1];
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;
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;
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;
1495 var group_by_table = document.getElementById('group_by_tbody');
1496 var report_type_elem = document.EditView.report_type;
1498 var group_defs = new Array();
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';
1505 if (report_def['report_type'] == 'summary' && object_refs['display_summary'].options.length == 0 ) {
1506 error_msgs += lbl_at_least_one_summary_column+'\n';
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';
1518 var filter_table = document.getElementById('filters');
1519 var filters_def = new Array();
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];
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;
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');
1537 if ( typeof(input_arr[0]) != 'undefined') {
1538 filter_def.input_name0=input_arr[0].value;
1539 if (input_arr[0].value == '') {
1541 error_msgs += "\""+column_vname+"\""+lbl_missing_input_value+"\n";
1544 if ( typeof(input_arr[1]) != 'undefined') {
1545 filter_def.input_name1=input_arr[1].value;
1546 if (input_arr[1].value == '') {
1548 error_msgs += "\"" + column_vname + "\""+lbl_missing_second_input_value+"\n";
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') {
1557 error_msgs += "\"" + column_vname + "\" "+lbl_missing_input_value+"\n";
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') {
1564 error_msgs += "\"" + column_vname + "\" "+lbl_missing_input_value+"\n";
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') {
1571 error_msgs += "\"" + column_vname + "\" "+lbl_missing_input_value+"\n";
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));
1586 if (got_selected==0) {
1587 error_msgs += "\"" +column_vname +"\": "+lbl_missing_second_input_value+"\n";
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']];
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']];
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;
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;
1621 filters_def.push(filter_def);
1624 if (got_error == 1) {
1629 report_def.filters_def = filters_def;
1631 // and/or filter option
1632 report_def.filters_combiner = document.getElementById('filters_combiner').options[document.getElementById('filters_combiner').selectedIndex].value;
1634 var group_by_table = document.getElementById('group_by_tbody');
1635 var group_defs = new Array();
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];
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;
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;
1659 summary_column_map[group_key].is_group_by = 'visible';
1662 group_defs.push(group_by_def);
1665 report_def.group_defs = group_defs;
1666 var links = getSelectedLinks();
1667 var links_def = new Array();
1669 for(var i in links) {
1670 links_def.push(links[i]);
1673 var link_joins = getSelectedLinkJoins(links_def);
1674 report_def.full_table_list = full_table_list;
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;
1682 global_report_def = report_def;
1683 report_def.assigned_user_id = document.EditView.assigned_user_id.value;
1685 report_def_str = YAHOO.lang.JSON.stringify(report_def);
1686 form_obj.report_def.value = report_def_str;
1691 function do_export() {
1692 if ( fill_form('export') == true) {
1693 document.EditView.submit();
1697 function set_sort(column_name,source) {
1698 if ( source == 'undefined') {
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';
1709 if (column_name == document.EditView[sort_by].value) {
1710 if ( document.EditView[sort_dir].value=="d") {
1711 document.EditView[sort_dir].value = "a";
1714 document.EditView[sort_dir].value = "d";
1718 document.EditView[sort_by].value = column_name;
1719 document.EditView[sort_dir].value = "a";
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();
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();
1739 function load_page() {
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")
1750 reload_columns('regular');
1753 function reload_joins() {
1754 for ( var index in report_def.full_table_list ) {
1755 var curr_table = report_def.full_table_list[index];
1757 if ( index != "self" ) {
1758 add_related(curr_table.parent,index);
1760 option_selectbox = document.getElementById('outer_' + index);
1762 if ( option_selectbox != null ) {
1763 if ( curr_table.optional != null && curr_table.optional == true ) {
1764 option_selectbox.checked = true;
1767 option_selectbox.checked = false;
1771 //alert("option_selectbox is null (outer_" + index + ")");
1775 var curr_select = document.getElementById(index);
1776 curr_select.value = curr_table.value;
1777 full_table_list[index] = curr_table;
1781 function getFieldKey(field_def) {
1783 if (typeof(field_def.group_function) != 'undefined') {
1784 func_name = field_def.group_function;
1786 else if (typeof(field_def.column_function) != 'undefined') {
1787 func_name = field_def.column_function;
1790 if ( field_def.group_function == 'count') {
1793 else if (! (func_name == 'weighted_amount' || func_name == 'weighted_sum') && func_name != '' ) {
1794 return field_def.table_key+":"+field_def.name+":"+func_name;
1797 return field_def.table_key+":"+field_def.name;
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]);
1808 function reload_groups() {
1809 for(index in report_def.group_defs) {
1810 addGroupBy(report_def.group_defs[index]);
1814 function get_rel_type(linked_field,relationship) {
1815 if ( typeof(linked_field['link_type']) != 'undefined') {
1816 return linked_field['link_type'];
1819 // code should never get this far.. link_type is already defined
1821 if ( relationship.relationship_type == 'one-to-many') {
1822 if (linked_field.bean_is_lhs == true) {
1823 if ( relationship['lhs_module'] == linked_field['module']) {
1831 if ( relationship['rhs_module'] == linked_field['module']) {
1843 function joinChecked(obj) {
1844 reload_columns('add');
1845 reload_join_rows('add');
1847 var objName = obj.id;
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]];
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"));
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);
1867 var filter = {column_name:filter_row.module_select[filter_row.module_select.selectedIndex].value,
1868 qualifier_name:'',input_name0:'',input_name1:''};
1871 refreshFilterModule(filter_row.module_select,filter,index);
1875 for( var index in groups_arr) {
1876 current_group_id = index;
1877 var group_row = groups_arr[groups_count_map[index]];
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"));
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) {
1890 var group = {column_name:group_row.module_select[group_row.module_select.selectedIndex].value};
1892 refreshGroupModule(group_row.module_select,group,index);
1893 refreshGroupColumn(group_row.column_select,group,index);
1894 refreshGroupQualify(group_row.qualify_select,group,index);
1901 function delete_this_join( this_id ) {
1902 // Get rid of my children
1903 delete_join_rows(this_id);
1905 this_obj = document.getElementById(this_id + "_div");
1906 this_obj.parentNode.removeChild(this_obj);
1908 parent_id = full_table_list[this_id].parent;
1910 if ( full_table_list[parent_id] != null ) {
1911 delete full_table_list[parent_id].children[this_id];
1914 delete full_table_list[this_id];
1915 joinChecked(this_obj);
1918 function delete_join_rows( parent_id ) {
1919 // Reset the selected fields
1920 all_fields = new Array();
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;
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];
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';
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;
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);
1959 if ( module_defs[mod_name] == null ) {
1963 // Grab the parent's link list
1964 var link_defs = getLinksByRelType( module_defs[mod_name].link_defs);
1966 var selected_linked_field;
1968 for (linked_field_name in link_defs) {
1969 var linked_field = link_defs[linked_field_name];
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;
1979 var select_html_info = new Object();
1980 var select_info = new Object();
1983 if ( my_id == null ) {
1985 while ( document.getElementById(parent_id + '_link_' + id_num ) != null ) {
1988 select_info['name'] = parent_id + '_link_' + id_num;
1991 // Use the ID that someone gave me.
1992 select_info['name'] = my_id;
1994 select_info['id'] = select_info['name'];
1995 select_info['onchange'] = 'table_changed(this);';
1996 select_html_info['select'] = select_info;
1998 select_html_info['options'] = options;
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();
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'];
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 = '';
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';
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>';
2025 new_child_div.id = select_info['name'] + '_div';
2026 children_div.appendChild(new_child_div);
2029 function reload_join_rows( type ) {
2030 // This function is now blank, in case someone wants to fill it in.
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') {
2041 var link_defs = getLinksByRelType( module_defs[module].link_defs,'one');
2047 var tr = joins_table.insertRow(joins_table.rows.length);
2048 var td = tr.insertCell(tr.cells.length);
2049 var hidden_input = '';
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'];
2061 join_refs.push(input_elem);
2062 td.appendChild(input_elem);
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');
2075 var selected_linked_field;
2077 for (linked_field_name in link_defs) {
2079 selected_linked_field = link_defs[linked_field_name];
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;
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;
2098 var tr = joins_table.insertRow(joins_table.rows.length);
2099 var td = tr.insertCell(tr.cells.length);
2100 select_html_info['options'] = options;
2104 function getSelectedLinkJoins( link_array ) {
2105 var link_join_array = new Object();
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;
2114 link_join_array[link_name.value] = 0;
2118 return link_join_array;
2121 function getSelectedLinks() {
2122 var joins_array = new Array();
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
2130 if ( full_table_list[index] != null && full_table_list[index].value != '' ) {
2131 joins_array.push(index);
2138 function getRelatedModule(link_def) {
2139 if(typeof link_def == 'undefined') {
2142 var rel_name = link_def.relationship_name;
2143 var rel_def = rel_defs[rel_name];
2144 if(typeof(rel_def) == 'undefined') {
2147 if ( link_def.bean_is_lhs ) {
2148 return rel_def['rhs_module'];
2151 return rel_def['lhs_module'];
2156 function viewJoinChanged(obj) {
2157 reload_columns('join');
2160 function getSelectedLinkDefs(module) {
2161 if ( typeof(module) == 'undefined') {
2162 module = current_module;
2164 var new_links = new Object();
2165 var links = getSelectedLinks()
2168 for(var i in links) {
2169 if(typeof full_table_list[links[i]].link_def == 'undefined') {
2172 var linked_field = full_table_list[links[i]].link_def;
2174 var selected = false;
2175 var relationship = rel_defs[linked_field['relationship_name']];
2176 var rel_type = get_rel_type(linked_field,relationship);
2178 new_links[links[i]] = linked_field;
2183 function moduleIsVisible(module) {
2184 if (typeof(visible_modules[module]) == 'undefined') {
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];
2195 var module = getRelatedModule(linked_field);
2196 if (! moduleIsVisible(module)) {
2200 var selected = false;
2201 var relationship = rel_defs[linked_field['relationship_name']];
2202 var rel_type = get_rel_type(linked_field,relationship);
2204 if (typeof(type) == 'undefined' || rel_type == type) {
2205 new_links[i] = link_defs[i];
2211 //create a unique key for each reportable field across tables
2213 function getAllFieldsMapped(module) {
2214 var all_fields = new Array();
2215 var summary_fields_str = '';
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};
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;
2226 all_fields["count"] = all_fields["self:count"];
2228 var link_defs = getSelectedLinkDefs(module);
2231 for(var i in link_defs) {
2232 var join_module = getRelatedModule(link_defs[i]);
2233 if ( typeof(module_defs[join_module]) == 'undefined') {
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};
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];
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') {
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};
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) {
2263 obj.saved_text = label;
2267 function saveLabel(type, obj) {
2268 if(type == 'column') {
2269 var columns_ref = object_refs['display_columns'];
2271 else if(type == 'detailsummary'){
2272 var columns_ref = object_refs['display_summary'];
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;
2285 this.lastIndex = -1;
2289 function reload_columns( reload_type) {
2290 document.getElementById('column_label_editor').value = '';
2291 if ( typeof ( reload_type ) == 'undefined') {
2292 reload_type = 'default';
2295 // get the current module from the dropdown value
2296 current_module = document.EditView.self.options[document.EditView.self.options.selectedIndex].value;
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;
2309 document.getElementById('detailsummary_label_editor').value =current_option.saved_text;
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;
2321 document.getElementById('column_label_editor').value =current_option.saved_text;
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;
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;
2337 visible_summary_fields = new Array();
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]);
2344 visible_summary_fields.push( 'self:'+ visible_summary_fields_org[i]);
2347 visible_fields = module_defs[current_module].default_table_columns;
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;
2358 else if (reload_type == 'add' || reload_type == 'join') {
2359 visible_fields = new Array();
2360 visible_summary_fields = new Array();
2362 for(i=0;i < display_columns_ref.options.length;i++) {
2363 visible_fields.push(display_columns_ref.options[i].value);
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};
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};
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;
2387 var seen_visible = new Object();
2389 var view_join = document.EditView.view_join;
2391 var selected_link = '';
2392 var link_defs = getSelectedLinkDefs();
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;
2399 // now rebuild the select box that chooses which related table to use when showing the available fields
2400 view_join.options.length = 0;
2402 if ('self' == view_join_value) {
2409 var select_counter = 0;
2410 view_join.options[view_join.options.length] = new Option(module_defs[current_module].label,'self',selected);
2413 for(var i in full_table_list) {
2414 if ( i == "self" ) {
2415 // We already added the self option above
2418 var table_def = full_table_list[i];
2419 var selected = false;
2422 // re-selected the remembered select (if there was one)
2423 if (i == view_join_value) {
2430 var label = table_def['label'];
2431 if ( i != 'self' ) {
2432 label = full_table_list[full_table_list[i].parent].label + ' > '+ label;
2435 view_join.options[view_join.options.length] = new Option(label,i,selected);
2437 view_join.selectedIndex = select_counter;
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;
2452 field_defs = module_defs[selected_module].field_defs;
2455 all_fields = getAllFieldsMapped(current_module);
2457 for(i=0;i < visible_fields.length;i++) {
2458 if (typeof(all_fields[visible_fields[i]]) == 'undefined') {
2461 var field = all_fields[visible_fields[i]].field_def;
2462 var default_label = all_fields[visible_fields[i]]['label_prefix']+": "+field['vname'];
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']);
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']);
2471 var current_option = display_columns_ref.options[display_columns_ref.options.length-1];
2472 current_option.default_label = default_label;
2474 if(current_option.text != current_option.default_label){
2475 current_option.saved_text = current_option.text;
2476 current_option.text += ' [' + default_label + ']';
2479 seen_visible[ visible_fields[i] ] = 1;
2482 var field_defs_arr = getOrderedFieldDefArray(field_defs,false);
2484 for(var index in field_defs_arr) {
2485 var field = field_defs_arr[index];
2486 var key = current_prefix +":"+field['name'];
2488 if ( typeof(all_fields[key]) == 'undefined') {
2492 if (seen_visible[key] != 1) {
2493 hidden_columns_ref.options[hidden_columns_ref.options.length] = new Option(field['vname'],key);
2497 var seen_visible_summary = new Object();
2498 var view_join_summary = document.EditView.view_join_summary;
2499 var selected_link_value = '';
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;
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) {
2515 view_join_summary.options[view_join_summary.options.length] = new Option(module_defs[current_module].label,'self',selected);
2517 var summary_select_counter = 0;
2519 for(var i in full_table_list) {
2520 if ( i == "self" ) {
2521 // We already added the self option above
2525 var linked_field = full_table_list[i];
2526 var selected = false;
2528 // re-selected the remembered select (if there was one)
2530 if (i == selected_link_value) {
2537 var label = linked_field['label'];
2538 if ( i != 'self' ) {
2539 label = full_table_list[full_table_list[i].parent].label + ' > '+ label;
2542 summary_select_counter++;
2543 view_join_summary.options[view_join_summary.options.length] = new Option(label,i,selected);
2545 view_join_summary.selectedIndex = summary_select_counter;
2549 // select the first one if first time load
2550 var selected_module = current_module;
2552 current_prefix = 'self';
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;
2561 var valid_groups = new Object();
2563 var group_by_table = document.getElementById('group_by_tbody');
2567 for(i=0; i < group_by_table.rows.length;i++) {
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;
2573 if ( typeof(all_fields[key]) == 'undefined') {
2574 // Not a valid field
2578 var group_by_def = getListFieldDef(key);
2580 if ( group_by_def.table_key != current_prefix) {
2583 var key = group_by_def.table_key+":"+group_by_def.name;
2585 if ( typeof (cell1) != 'undefined' && cell1.getElementsByTagName('select')[0].style.display != 'none') {
2586 key += ":"+cell1.getElementsByTagName('select')[0].value;
2589 valid_groups[key] = 1;
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;
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') {
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'))) {
2608 var field = all_fields[key].field_def;
2609 var linked_field_name = '';
2610 var label_prefix = '';
2611 var default_label = '';
2613 if ( field.name == 'count') {
2615 default_label = field['vname'];
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'];
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;
2629 column_label = default_label;
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;
2639 numerical_chart_column.options[numerical_chart_column.options.length] = new Option( column_label,key);
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 + ']';
2649 seen_visible_summary[ key] = 1;
2652 numerical_chart_column.options.selectedIndex = which_option_selected;
2654 var summary_field_defs = module_defs[selected_module].summary_field_defs;
2655 var field_defs_arr = getOrderedFieldDefArray(field_defs,false);
2658 for(group_key in valid_groups) {
2659 if(typeof all_fields[group_key] != 'undefined') {
2660 group_field = all_fields[group_key].field_def;
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);
2665 seen_visible_summary[group_key] = 1;
2669 for( var index in summary_field_defs) {
2670 var field = summary_field_defs[index];
2671 if ( field.summary_type != 'group') {
2675 var key = current_prefix +":"+field['name'];
2677 if ( field['name'] == 'count') {
2681 if ( typeof(all_fields[key]) == 'undefined') {
2685 if (seen_visible_summary[key] != 1) {
2686 hidden_summary_ref.options[hidden_summary_ref.options.length] = new Option(field['vname'],key);
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;
2698 document.EditView.chart_type.selectedIndex = selected_chart_index;
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;
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;
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();
2726 form.save_report.value='off';
2727 form.save_report_as.readOnly=true;
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();
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];
2745 //builds the html for a select
2746 function buildSelectHTML(info) {
2750 for(var key in info['select']) {
2751 if ( typeof (info['select'][key]) != 'undefined') {
2752 text +=" "+ key +"=\""+ info['select'][key] +"\"";
2757 var saved_attrs = new Array();
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];
2767 saved_attrs.push(attr);
2768 text += "<option value=\""+encodeURI(option['value'])+"\" ";
2770 if ( typeof (option['selected']) != 'undefined' && option['selected']== true) {
2773 text += ">"+option['text']+"</option>";
2775 text += "</select>";
2779 function buildOuterJoinHTML(info) {
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';
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" class="inlineHelpTip" src="' + image_path +'help.gif" onclick="SUGAR.util.showHelpTips(this,\''+ lbl_optional_help +'\')"/>';
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_","");
2802 if ( obj.checked == true ) {
2803 full_table_list[table_key].optional = true;
2806 full_table_list[table_key].optional = false;
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;
2815 function chart_drilldown(group_value,is_saved_report,id) {
2816 var anch = document.getElementById(group_value);
2817 var elems = document.anchors;
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 ) {
2824 window.scrollBy(0,300);
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 + " ";
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,"");