/*
	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;
	//
	if (paramFunction != null){
		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 > andIndexOf){
							getValue = getValue || selectCallFunction(functionsSplit[i]);
							parFuncSubStr = parFunction.substr(orIndexOf + 2);
						}
						else{
							getValue = getValue && selectCallFunction(functionsSplit[i]);
							parFuncSubStr = paramFunction.substr(andIndexOf + 2);
						}
						//
						orIndexOf = parFuncSubStr.indexOf("||");
						andIndexOf = parFuncSubStr.indexOf("&&");					
					}
				}
			}
			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 "checkConditionValue":
		 	getValue = checkConditionValue(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;
}
/*
 * 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;
}


