vtigerossez/include/js/advancefilter.js
2013-01-30 21:51:28 -05:00

461 lines
16 KiB
JavaScript

/*********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
*********************************************************************************/
var typeofdata = new Array();
typeofdata['V'] = ['e','n','s','ew','c','k'];
typeofdata['N'] = ['e','n','l','g','m','h'];
typeofdata['T'] = ['e','n','l','g','m','h','bw','b','a'];
typeofdata['I'] = ['e','n','l','g','m','h'];
typeofdata['C'] = ['e','n'];
typeofdata['D'] = ['e','n','l','g','m','h','bw','b','a'];
typeofdata['DT'] = ['e','n','l','g','m','h','bw','b','a'];
typeofdata['NN'] = ['e','n','l','g','m','h'];
typeofdata['E'] = ['e','n','s','ew','c','k'];
var fLabels = new Array();
fLabels['e'] = alert_arr.EQUALS;
fLabels['n'] = alert_arr.NOT_EQUALS_TO;
fLabels['s'] = alert_arr.STARTS_WITH;
fLabels['ew'] = alert_arr.ENDS_WITH;
fLabels['c'] = alert_arr.CONTAINS;
fLabels['k'] = alert_arr.DOES_NOT_CONTAINS;
fLabels['l'] = alert_arr.LESS_THAN;
fLabels['g'] = alert_arr.GREATER_THAN;
fLabels['m'] = alert_arr.LESS_OR_EQUALS;
fLabels['h'] = alert_arr.GREATER_OR_EQUALS;
fLabels['bw'] = alert_arr.BETWEEN;
fLabels['b'] = alert_arr.BEFORE;
fLabels['a'] = alert_arr.AFTER;
var noneLabel;
var advft_column_index_count = -1;
var advft_group_index_count = 0;
var column_index_array = [];
var group_index_array = [];
function trimfValues(value) {
var string_array;
string_array = value.split(":");
return string_array[4];
}
function updatefOptions(sel, opSelName) {
var selObj = document.getElementById(opSelName);
var fieldtype = null ;
var currOption = selObj.options[selObj.selectedIndex];
var currField = sel.options[sel.selectedIndex];
if(currField.value != null && currField.value.length != 0) {
fieldtype = trimfValues(currField.value);
ops = typeofdata[fieldtype];
var off = 0;
if(ops != null) {
var nMaxVal = selObj.length;
for(nLoop = 0; nLoop < nMaxVal; nLoop++) {
selObj.remove(0);
}
selObj.options[0] = new Option ('None', '');
if (currField.value == '') {
selObj.options[0].selected = true;
}
off = 1;
for (var i = 0; i < ops.length; i++) {
var label = fLabels[ops[i]];
if (label == null) continue;
var option = new Option (fLabels[ops[i]], ops[i]);
selObj.options[i + off] = option;
if (currOption != null && currOption.value == option.value) {
option.selected = true;
}
}
}
} else {
if (currField.value == '') {
selObj.options[0].selected = true;
}
}
}
function showHideDivs(showdiv, hidediv) {
if(document.getElementById(showdiv))
document.getElementById(showdiv).style.display = "block";
if(document.getElementById(hidediv))
document.getElementById(hidediv).style.display = "none";
}
function hideAllElementsByName(name) {
var allElements = document.getElementsByTagName('div');
for(var i=0; i<allElements.length; ++i) {
var element = allElements[i];
if (element.getAttribute('name') == name)
element.style.display='none';
}
return true;
}
function removeElement(elementId) {
var element = document.getElementById(elementId);
if(element) {
var parent = element.parentNode;
if(parent) {
parent.removeChild(element);
} else {
element.remove();
}
}
}
function deleteGroup(groupIndex) {
removeElement('conditiongroup_'+groupIndex);
var keyOfTheGroup = group_index_array.indexOf(groupIndex);
var isLastElement = true;
for(var i=keyOfTheGroup; i<group_index_array.length; ++i) {
var nextGroupIndex = group_index_array[i];
var nextGroupBlockId = "conditiongroup_"+nextGroupIndex;
if(document.getElementById(nextGroupBlockId)) {
isLastElement = false;
break;
}
}
if(isLastElement) {
for(var i=keyOfTheGroup-1; i>=0; --i) {
var prevGroupIndex = group_index_array[i];
var prevGroupGlueId = "gpcon"+prevGroupIndex;
if(document.getElementById(prevGroupGlueId)) {
removeElement(prevGroupGlueId);
break;
}
}
}
}
function addNewConditionGroup(parentNodeId) {
addConditionGroup(parentNodeId);
addConditionRow(advft_group_index_count);
}
function deleteColumnRow(groupIndex, columnIndex) {
removeElement('conditioncolumn_'+groupIndex+'_'+columnIndex);
var groupColumns = column_index_array[groupIndex];
var keyOfTheColumn = groupColumns.indexOf(columnIndex);
var isLastElement = true;
for(var i=keyOfTheColumn; i<groupColumns.length; ++i) {
var nextColumnIndex = groupColumns[i];
var nextColumnRowId = 'conditioncolumn_'+groupIndex+'_'+nextColumnIndex;
if(document.getElementById(nextColumnRowId)) {
isLastElement = false;
break;
}
}
if(isLastElement) {
for(var i=keyOfTheColumn-1; i>=0; --i) {
var prevColumnIndex = groupColumns[i];
var prevColumnGlueId = "fcon"+prevColumnIndex;
if(document.getElementById(prevColumnGlueId)) {
removeElement(prevColumnGlueId);
break;
}
}
}
}
function addRequiredElements(columnindex) {
var colObj = document.getElementById('fcol'+columnindex);
var opObj = document.getElementById('fop'+columnindex);
var valObj = document.getElementById('fval'+columnindex);
var currField = colObj.options[colObj.selectedIndex];
var currOp = opObj.options[opObj.selectedIndex];
var fieldtype = null ;
if(currField.value != null && currField.value.length != 0) {
var fieldInfo = currField.value.split(":");
var tableName = fieldInfo[0];
var fieldName = fieldInfo[2];
fieldtype = fieldInfo[4];
switch(fieldtype) {
case 'D':
case 'DT':
case 'T':
if(fieldtype=='T' && tableName.indexOf('vtiger_crmentity')<0){
defaultRequiredElements(columnindex);
break;
}
var dateformat = $('jscal_dateformat').value;
var timeformat = "%H:%M:%S";
var showtime = true;
if(fieldtype == 'D' || (tableName == 'vtiger_activity' && fieldName == 'date_start')) {
timeformat = '';
showtime = false;
}
if(!document.getElementById('jscal_trigger_fval'+columnindex)) {
var node = document.createElement('img');
node.setAttribute('src',$('image_path').value+'btnL3Calendar.gif');
node.setAttribute('id','jscal_trigger_fval'+columnindex);
node.setAttribute('align','absmiddle');
node.setAttribute('width','20');
node.setAttribute('height','20');
var parentObj = valObj.parentNode;
var nextObj = valObj.nextSibling;
parentObj.insertBefore(node, nextObj);
}
Calendar.setup ({
inputField : 'fval'+columnindex, ifFormat : dateformat+' '+timeformat, showsTime : showtime, button : "jscal_trigger_fval"+columnindex, singleClick : true, step : 1
});
if(currOp.value == 'bw') {
if(!document.getElementById('fval_ext'+columnindex)) {
var fillernode = document.createElement('br');
var node1 = document.createElement('input');
node1.setAttribute('class', 'repBox small');
node1.setAttribute('type', 'text');
node1.setAttribute('id','fval_ext'+columnindex);
node1.setAttribute('name','fval_ext'+columnindex);
var parentObj = valObj.parentNode;
parentObj.appendChild(fillernode);
parentObj.appendChild(node1);
}
if(!document.getElementById('jscal_trigger_fval_ext'+columnindex)) {
var node2 = document.createElement('img');
node2.setAttribute('src',$('image_path').value+'btnL3Calendar.gif');
node2.setAttribute('id','jscal_trigger_fval_ext'+columnindex);
node2.setAttribute('align','absmiddle');
node2.setAttribute('width','20');
node2.setAttribute('height','20');
var parentObj = valObj.parentNode;
parentObj.appendChild(node2);
}
if(!document.getElementById('clear_text_ext'+columnindex)) {
var node3 = document.createElement('img');
node3.setAttribute('src','themes/images/clear_field.gif');
node3.setAttribute('id','clear_text_ext'+columnindex);
node3.setAttribute('align','absmiddle');
node3.setAttribute('width','20');
node3.setAttribute('height','20');
node3.style.cursor = "pointer";
node3.onclick = function() {
document.getElementById('fval_ext'+columnindex).value='';
return false;
}
var parentObj = valObj.parentNode;
parentObj.appendChild(node3);
}
Calendar.setup ({
inputField : 'fval_ext'+columnindex, ifFormat : dateformat+' '+timeformat, showsTime : showtime, button : "jscal_trigger_fval_ext"+columnindex, singleClick : true, step : 1
});
} else {
if(document.getElementById('fval_ext'+columnindex)) removeElement('fval_ext'+columnindex);
if(document.getElementById('jscal_trigger_fval_ext'+columnindex)) removeElement('jscal_trigger_fval_ext'+columnindex);
if(document.getElementById('clear_text_ext'+columnindex)) removeElement('clear_text_ext'+columnindex);
}
break;
default :defaultRequiredElements(columnindex);
}
}
}
function defaultRequiredElements(columnindex) {
if(document.getElementById('jscal_trigger_fval'+columnindex)) removeElement('jscal_trigger_fval'+columnindex);
if(document.getElementById('fval_ext'+columnindex)) removeElement('fval_ext'+columnindex);
if(document.getElementById('jscal_trigger_fval_ext'+columnindex)) removeElement('jscal_trigger_fval_ext'+columnindex);
if(document.getElementById('clear_text_ext'+columnindex)) removeElement('clear_text_ext'+columnindex);
}
function checkAdvancedFilter() {
var escapedOptions = new Array('account_id','contactid','contact_id','product_id','parent_id','campaignid','potential_id','assigned_user_id1','quote_id','accountname','salesorder_id','vendor_id','time_start','time_end','lastname');
var conditionColumns = vt_getElementsByName('tr', "conditionColumn");
var criteriaConditions = [];
for(var i=0;i < conditionColumns.length ; i++) {
var columnRowId = conditionColumns[i].getAttribute("id");
var columnRowInfo = columnRowId.split("_");
var columnGroupId = columnRowInfo[1];
var columnIndex = columnRowInfo[2];
var columnId = "fcol"+columnIndex;
var columnObject = getObj(columnId);
var selectedColumn = trim(columnObject.value);
var selectedColumnIndex = columnObject.selectedIndex;
var selectedColumnLabel = columnObject.options[selectedColumnIndex].text;
var comparatorId = "fop"+columnIndex;
var comparatorObject = getObj(comparatorId);
var comparatorValue = trim(comparatorObject.value);
var valueId = "fval"+columnIndex;
var valueObject = getObj(valueId);
var specifiedValue = trim(valueObject.value);
var extValueId = "fval_ext"+columnIndex;
var extValueObject = getObj(extValueId);
if(extValueObject) {
extendedValue = trim(extValueObject.value);
}
var glueConditionId = "fcon"+columnIndex;
var glueConditionObject = getObj(glueConditionId);
var glueCondition = '';
if(glueConditionObject) {
glueCondition = trim(glueConditionObject.value);
}
// If only the default row for the condition exists without user selecting any advanced criteria, then skip the validation and return.
if(conditionColumns.length == 1 && selectedColumn == '' && comparatorValue == '' && specifiedValue == '')
return true;
if (!emptyCheck(columnId," Column ","text"))
return false;
if (!emptyCheck(comparatorId,selectedColumnLabel+" Option","text"))
return false;
var col = selectedColumn.split(":");
if(escapedOptions.indexOf(col[3]) == -1) {
if(col[4] == 'T' || col[4] == 'DT') {
var datime = specifiedValue.split(" ");
if (specifiedValue.charAt(0) != "$" && specifiedValue.charAt(specifiedValue.length-1) != "$"){
if(datime.length > 1) {
if(!re_dateValidate(datime[0],selectedColumnLabel+" (Current User Date Time Format)","OTH")) {
return false
}
if(!re_patternValidate(datime[1],selectedColumnLabel+" (Time)","TIMESECONDS")) {
return false
}
} else if(col[0] == 'vtiger_activity' && col[2] == 'date_start') {
if(!dateValidate(valueId,selectedColumnLabel+" (Current User Date Format)","OTH"))
return false
} else {
if(!re_patternValidate(datime[0],selectedColumnLabel+" (Time)","TIMESECONDS")) {
return false
}
}
}
if(extValueObject) {
var datime = extendedValue.split(" ");
if (extendedValue.charAt(0) != "$" && extendedValue.charAt(extendedValue.length-1) != "$"){
if(datime.length > 1) {
if(!re_dateValidate(datime[0],selectedColumnLabel+" (Current User Date Time Format)","OTH")) {
return false
}
if(!re_patternValidate(datime[1],selectedColumnLabel+" (Time)","TIMESECONDS")) {
return false
}
} else if(col[0] == 'vtiger_activity' && col[2] == 'date_start') {
if(!dateValidate(extValueId,selectedColumnLabel+" (Current User Date Format)","OTH"))
return false
} else {
if(!re_patternValidate(datime[0],selectedColumnLabel+" (Time)","TIMESECONDS")) {
return false
}
}
}
}
}
else if(col[4] == 'D')
{
if (specifiedValue.charAt(0) != "$" && specifiedValue.charAt(specifiedValue.length-1) != "$"){
if(!dateValidate(valueId,selectedColumnLabel+" (Current User Date Format)","OTH"))
return false
}
if(extValueObject) {
if(!dateValidate(extValueId,selectedColumnLabel+" (Current User Date Format)","OTH"))
return false
}
}else if(col[4] == 'I')
{
if(!intValidate(valueId,selectedColumnLabel+" (Integer Criteria)"+i))
return false
}else if(col[4] == 'N')
{
if (!numValidate(valueId,selectedColumnLabel+" (Number) ","any",true))
return false
}else if(col[4] == 'E')
{
if (!patternValidate(valueId,selectedColumnLabel+" (Email Id)","EMAIL"))
return false
}
}
//Added to handle yes or no for checkbox fields in reports advance filters.
if(col[4] == "C") {
if(specifiedValue == "1")
specifiedValue = getObj(valueId).value = 'yes';
else if(specifiedValue =="0")
specifiedValue = getObj(valueId).value = 'no';
}
if (extValueObject && extendedValue != null && extendedValue != '') specifiedValue = specifiedValue +','+ extendedValue;
criteriaConditions[columnIndex] = {"groupid":columnGroupId,
"columnname":selectedColumn,
"comparator":comparatorValue,
"value":specifiedValue,
"columncondition":glueCondition
};
}
$('advft_criteria').value = JSON.stringify(criteriaConditions);
var conditionGroups = vt_getElementsByName('div', "conditionGroup");
var criteriaGroups = [];
for(var i=0;i < conditionGroups.length ; i++) {
var groupTableId = conditionGroups[i].getAttribute("id");
var groupTableInfo = groupTableId.split("_");
var groupIndex = groupTableInfo[1];
var groupConditionId = "gpcon"+groupIndex;
var groupConditionObject = getObj(groupConditionId);
var groupCondition = '';
if(groupConditionObject) {
groupCondition = trim(groupConditionObject.value);
}
criteriaGroups[groupIndex] = {"groupcondition":groupCondition};
}
$('advft_criteria_groups').value = JSON.stringify(criteriaGroups);
return true;
}
/**
* IE has a bug where document.getElementsByName doesnt include result of dynamically created
* elements
*/
function vt_getElementsByName(tagName, elementName) {
var inputs = document.getElementsByTagName( tagName );
var selectedElements = [];
for(var i=0;i<inputs.length;i++){
if(inputs.item(i).getAttribute( 'name' ) == elementName ){
selectedElements.push( inputs.item(i) );
}
}
return selectedElements;
}