/*
	Performed by Carlo Peron
	This file contains function used in calculation; for now is used to compile dinamyc edit.
*/
/**
 * This function is used in manage javascript event function call.
 * In case of multiple function, return type is a bool.
 * In case of a single function, return type depend on single function call.
 */
function getCalculatedFunctionValue(paramFunction){
	var getValue;
	var i;
	var orIndexOf, andIndexOf;
	var parFuncSubStr;
	var functionsSplit;
	var arrFuncLength;
	var performAndCalc = false;
	//
	if (paramFunction != null){
            var andOrArray = getAndOrArrayFromString(paramFunction);
            if (andOrArray == null){
                getValue = selectCallFunction(paramFunction);
            }
            else{
                //
                try{
                    functionsSplit = paramFunction.split(/[|]{2}|[&]{2}/);
                    //
                    arrFuncLength = functionsSplit.length;
                    //
                    if (arrFuncLength > 0){
                        getValue = selectCallFunction(functionsSplit[0]);
                        //
                        var andOrItem;
                        for (i = 1; i < arrFuncLength; i++){
                            //
                            andOrItem = andOrArray[i - 1];
                            if (andOrItem == '&&'){
                                getValue = getValue && selectCallFunction(functionsSplit[i]);                                
                            }
                            else{
                                getValue = getValue || selectCallFunction(functionsSplit[i]);                                
                            }
                            //
                        }
                    }
                }
                catch(e){
                        getValue = false;
                        alert('Attention: Error in getCalculatedFunctionValue ' + e.message);
                }
            }
	}
	return getValue;
}
/***
 *
 *function getCalculatedFunctionValue(paramFunction){
	var getValue;
	var i;
	var orIndexOf, andIndexOf;
	var parFuncSubStr;
	var functionsSplit;
	var arrFuncLength;
	var performAndCalc = false;
	//
	if (paramFunction != null){
            getAndOrArrayFromString
            orIndexOf = paramFunction.indexOf("||");
            andIndexOf = paramFunction.indexOf("&&");
            //if paramFunction string doesn't contains || and && symbols it's the case of a single function call.
            if (orIndexOf == -1 && andIndexOf == -1){
                getValue = selectCallFunction(paramFunction);
            }
            else{
                //
                try{
                    functionsSplit = paramFunction.split(/[|]{2}|[&]{2}/);
                    //
                    arrFuncLength = functionsSplit.length;
                    //
                    if (arrFuncLength > 0){
                        getValue = selectCallFunction(functionsSplit[0]);
                        parFuncSubStr = paramFunction;
                        //
                        for (i = 1; i < arrFuncLength; i++){
                            if (orIndexOf == -1){
                                performAndCalc = true;
                            }
                            else{
                                if (andIndexOf != -1){
                                    if (orIndexOf > andIndexOf){
                                        performAndCalc = true;
                                    }
                                }
                            }
                            //
                            if (performAndCalc){
                                getValue = getValue && selectCallFunction(functionsSplit[i]);
                                parFuncSubStr = paramFunction.substr(andIndexOf + 2);
                            }
                            else{
                                getValue = getValue || selectCallFunction(functionsSplit[i]);
                                parFuncSubStr = paramFunction.substr(orIndexOf + 2);
                            }
                            //
                            orIndexOf = parFuncSubStr.indexOf("||");
                            andIndexOf = parFuncSubStr.indexOf("&&");
                            performAndCalc = false;
                        }
                    }
                }
                catch(e){
                        getValue = false;
                        alert('Attention: Error in getCalculatedFunctionValue ' + e.message);
                }
            }
	}
	return getValue;
}
*/


/**
This a simple switch to choose what function to call.
*/
function selectCallFunction(calcFunc){
	var getValue = null;
	var calcFuncName;
	var calcFuncParam;
	//get index of open and close parenthesis
	var openParPos, closeParPos;
	
	openParPos = calcFunc.indexOf('(');
	closeParPos = calcFunc.indexOf(')');
	
	if (openParPos != -1 && closeParPos != -1){
		calcFuncName = calcFunc.slice(0, openParPos);
		calcFuncParam = calcFunc.slice(openParPos + 1, closeParPos);
	}
	
	switch(calcFuncName){
		case "peritiGiudizPerc":
		 	getValue = judicialExpertsPerc(calcFuncParam);
			break;
		case "checkAtLeastOneSelected":
		 	getValue = checkAtLeastOneSelected(calcFuncParam);
			break;
		case "checkAllSelected":
		 	getValue = checkAllSelected(calcFuncParam);
			break;			
		case "checkConditionValue":
		 	getValue = checkConditionValue(calcFuncParam);
			break;
		case "calculateDifferenceOnTotal":
		 	getValue = calculateDifferenceOnTotal(calcFuncParam);
			break;			
		default:
			getValue = getValueFromFormula(calcFunc);
			break;
	}
	return getValue;
}
/**
	Perform judicial expert calculation
*/
function judicialExpertsPerc(calcFuncParam){
	var splitParam = calcFuncParam.split(",");
	var getValue = 0;
	//
	if (splitParam.length == 6){
		var fromValue, toValue, percMin, percMax, workValue, srcControl;
		workValue = controlValueToFloat(splitParam[0]);
		fromValue = controlValueToFloat(splitParam[1]);
		toValue = controlValueToFloat(splitParam[2]);
		percMin = controlValueToFloat(splitParam[3]);
		percMax = controlValueToFloat(splitParam[4]);
		srcControl = $(splitParam[5]);
		//
		if (workValue >= toValue){
			getValue = percMax;	
			//enable control
			srcControl.disabled = false;
		}
		else{
			if (workValue >= fromValue){
				var perc;
				perc = workValue * 100 / toValue;
				getValue = percMax * perc / 100;
				if (getValue < percMin)
					getValue = percMin;
				if (getValue > percMax)
					getValue = percMax;	
				//enable control
				srcControl.disabled = false;			
			}
			else{
				//if not in range, disable control
				srcControl.disabled = true;
				getValue = 0;
			}
		}
	}	
	//
	return formatNum(getValue, 4);
}
/*
 Utility function to convert control value to float.
*/
function controlValueToFloat(controlID){
	strControlValue = $(controlID).value;
	strControlValue = strControlValue.replace('.', '');
	strControlValue = strControlValue.replace('.', '');
	strControlValue = strControlValue.replace('.', '');
	strControlValue = strControlValue.replace(',', '.');
	return 	parseFloat(strControlValue);		
}
/*
This function manage number formatting.
*/
function formatNum(expr,decplaces) {
	var str = (Math.round(parseFloat(expr) * Math.pow(10,decplaces))).toString();
	while (str.length <= decplaces) {
		str = '0' + str;
	}
	var decpoint = str.length - decplaces;
	return str.substring(0,decpoint) + ',' + str.substring(decpoint,str.length);
}
/*
 * Check if at least one checkbox control is selected.
 * Return false if none is selected. 
*/
function checkAtLeastOneSelected(calcFuncParam){
	var splitParam = calcFuncParam.split(",");
	var i;
	var srcControl;
	var atLeastOneChecked = false;
	//
	if (splitParam != null){
		try{
			for (i = 0; i < splitParam.length; i++){
				atLeastOneChecked = checkSelected(splitParam[i]);
				if (atLeastOneChecked == true){
					break;
				}
			}
		}
		catch(e){
			alert('Attention: Error in checkAtLeastOneSelected ' + e.message);
		}
	}
	return atLeastOneChecked;
}
/*
 * Check if all checkboxes control are selected.
 * Return false if none is selected. 
*/
function checkAllSelected(calcFuncParam){
	var splitParam = calcFuncParam.split(",");
	var i;
	var srcControl;
	var allChecked = true;
	//
	if (splitParam != null){
		try{
			for (i = 0; i < splitParam.length; i++){
				allChecked = allChecked && checkSelected(splitParam[i]);
				if (allChecked == false){
					break;
				}
			}
		}
		catch(e){
			alert('Attention: Error in checkAtLeastOneSelected ' + e.message);
		}
	}
	return allChecked;
}

/*
 * Return true if a checkbox control is selected.
 *  
 */
function checkSelected(srcControlId){
	var srcControl;
	var getValue = false;
	//
	if (srcControlId != null){
		try{
			srcControl = $(srcControlId);
			if (srcControl != null){
				if (srcControl.checked == true){
					getValue = true;
				}				 
			}
		}
		catch(e){
			alert('Attention: Error in checkSelected ' + e.message);
		}
	}
	return getValue;
}
/*
 *  This function check value of a particular edit/select control
*/
function checkConditionValue(calcFuncParam){
	var splitParam = calcFuncParam.split(",");
	var srcControl;
	var srcCtrlValue = 0;
	var condSymbol;
	var condValue;
	//
	var getValue = false;
	//
	if (splitParam != null){
		if (splitParam.length == 3){
			try{
				srcControl = $(splitParam[0]);
				condSymbol = splitParam[1];
				condValue = splitParam[2];
				if (srcControl != null){
					srcCtrlValue = srcControl.value;
					switch(condSymbol) {
						case 'EQ':
							getValue = srcCtrlValue == condValue;
							break;
						case 'NE':
							getValue = srcCtrlValue != condValue;
							break;
						case 'GT':
							getValue = srcCtrlValue > condValue;
							break;
						case 'LT':
							getValue = srcCtrlValue < condValue;
							break;					
						default:
							break;					
					}					
				}			
			}
			catch(e){
				alert('Attention: Error in checkConditionValue' + e.message);
			}
		}
	}
	//
	return getValue;
}
/**
 * This function is used in Progettazione integrale e coordinata.
 * 
 * Determines the difference between a value and the sum of a list of values
 * 
 * @param calcFuncParam
 * 
 */
function calculateDifferenceOnTotal(calcFuncParam){
	var splitParam = calcFuncParam.split(",");	
	var getValue = 0;
	//
	try {
		var splitParamLenght = splitParam.length;
		if (splitParamLenght > 0){
			getValue = controlValueToFloat(splitParam[0]);
			//
			for (i = 1; i < splitParamLenght; i++){
				getValue = getValue - controlValueToFloat(splitParam[i]);
			}
		}
	}
	catch (e) {
		alert('calculateDifferenceOnTotal ' + e);
	}
	
	if (getValue < 0){
		getValue = 0;
	}
	return formatNum(getValue, 2);
}
/**
 * Check if a parameter string contains a function definition.
 */
function isAFunctionString(paramString){
    var getValue = false;
    //
    if (paramString.indexOf("(") > 0 && paramString.indexOf(")") > 0){
        getValue = true;
    }
    return getValue;
}
/**
 * Get an array of alla && or || occurence in a string.
 */
function getAndOrArrayFromString(paramString){
   var andOrArray = null;
   var andOrPos = paramString.search (/[|]{2}|[&]{2}/);
   if (andOrPos > 0){
       andOrArray = new Array(0);
       //
       while (andOrPos > 0){
           andOrArray.push(paramString.substr(andOrPos, 2));
           paramString = paramString.substr(andOrPos + 2);
           andOrPos = paramString.search (/[|]{2}|[&]{2}/);
       }
        //
   }
   return andOrArray;
}
//
function populateEnhancedDialog(srcId, calcFunc){
	var getValue = null;
	var calcFuncName;
	var calcFuncParam;
	//get index of open and close parenthesis
	var openParPos, closeParPos;
	
	openParPos = calcFunc.indexOf('(');
	closeParPos = calcFunc.indexOf(')');
	
	if (openParPos != -1 && closeParPos != -1){
		calcFuncName = calcFunc.slice(0, openParPos);
		calcFuncParam = calcFunc.slice(openParPos + 1, closeParPos);
	}
	
	switch(calcFuncName){
		case "enhancedGrid":
		 	getValue = getEnhancedGridContent(calcFuncParam);
			break;
		default:
			break;
	}
	return getValue;
}
/**
Populate Dialog with an enhanced grid content
*/
function getEnhancedGridContent(calcFuncParam) {
	var splitParam = calcFuncParam.split(",");
	var getValue = 0;
	//
	if (splitParam.length == 3) {
		var toValue, dataSourceRef;
		toValue = dojo.trim(splitParam[0]);
		labelDescrID = dojo.trim(splitParam[1]);
		dataSourceRef = dojo.trim(splitParam[2]);
		try{			
			createDojoEnhanced(dataSourceRef, dojo.byId(toValue).value);
			//set source ID in hidden form
			dojo.byId("enhancedDlgHiddenSourceID").value = toValue;
			dojo.byId("enhancedDlgHiddenSourceDescrID").value = labelDescrID;			
			//
			enhancedDlg.show();
		}
		catch (e){			
			alert('test:' + e);
		}
		//
	}
	//
	return getValue;
}

function createDojoEnhanced(dataSourceRef, selectedRowID) {
	//
	var xmlStore = new dojox.data.XmlStore({url: "./requests.php?action=fireprevention&option=" + dataSourceRef, rootItem: "activity"});
	//	
	var layout = 
		   [[{
		        field: "id",
		        name: "ID",
		        width: "auto",
		        hidden: true
		    },
		    {
		        field: "descr",
		        name: "Descrizione",
		        width: "auto",
		        disabledConditions: ["equalTo", "startsWith", "", "endsWith", "notEndsWith", "isEmpty", "notStartsWith"],
		        //autoComplete: true,
		        formatter: function(item) {
		            return item.toString();
		        }	    
		    }]];	
	
	// set the layout structure:
	try{
		enhancedGrid.setStore(xmlStore);
		enhancedGrid.setStructure(layout);
		//enhancedGrid.rowSelectCell.toggleRow(selectedRowID, true);
		enhancedGrid.selection.deselectAll();
		enhancedGrid.selection.toggleSelect(selectedRowID);
		enhancedGrid.scrollToRow(selectedRowID);
		dojo.byId("enhancedContentGrid").appendChild(enhancedGrid.domNode);		
		//dojo.byId("enhacnedContentGrid").appendChild(enhancedGrid);
		enhancedGrid.startup();
		//
		//set field name to return
		dojo.byId("enhancedDlgHiddenIDField").value = "id"; 
		dojo.byId("enhancedDlgHiddenDescrField").value = "descr";
	}
	catch(e){
		alert(e);
	}
}
/**
Populate source field with value from Enhanced Grid selected's row
*/
function setSourceWithEnhancedSelection() {
	var srcID, srcDescrID;
	var srcValue, srcDescr;
	try{
		//
		srcID = dojo.byId("enhancedDlgHiddenSourceID").value;
		srcDescrID = dojo.byId("enhancedDlgHiddenSourceDescrID").value;
		//getGridSelectedRow(enhancedGrid, dojo.byId("enhancedDlgHiddenIDField").value, srcValue, srcDescr);
		getGridSelectedRow(enhancedGrid, dojo.byId("enhancedDlgHiddenIDField").value, dojo.byId("enhancedDlgHiddenDescrField").value, dojo.byId(srcID), dojo.byId(srcDescrID));
		//
		//dojo.byId(srcID).value = srcValue;
		//dojo.byId(srcDescrID).setContent(srcDescr);
		//
		enhancedDlg.hide();
	}
	catch (e){			
		alert('test:' + e);
	}
}
/**
 * Get selected cell value from row and column
 */
function getGridSelectedRow(gridID, idCol, descrCol, idRes, descrRes){
	var items;
	try {
		//items = dijit.byId(gridID).selection.getSelected();
		items = gridID.selection.getSelected();
		if (items.length) {
			dojo.forEach(items, function(selectedItem){
				if (selectedItem !== null){
					idRes.value = gridID.store.getValues(selectedItem, idCol);					
					descrRes.value = gridID.store.getValues(selectedItem, descrCol);
					//descrRes.innerHTML = gridID.store.getValues(selectedItem, descrCol);
					fireChangeEvent(idRes);
				}
			});
		}
	} catch (e) {
		alert('getGridSelectedRows' + e);
	}
}

