//<!--
var G_TableCalculationDirection = 1, maxPrecision = 6;
var G_idForm = "convertMeasureForm", G_idM1 = "m1", G_idM2 = "m2", G_idMTP = "MTP";
var G_idCV = "cv", G_idRezult = "rezult", G_idDiv = "msrDataDiv";

function searchNodeInDirectChildNodesById(oTop,idObj)
{
	if(!oTop) return null;
	if(!oTop.childNodes) return null;
	if(!idObj || "" == idObj) return null;
	idObj = idObj.toLowerCase();

	var cChilds = oTop.childNodes;
	for(var i=0;i<cChilds.length;i++)
	{
		obj = cChilds[i];
//alert(obj.nodeName);
		if(obj.id && obj.nodeName.toLowerCase())
		{
			if(idObj == obj.id.toLowerCase()) return obj;
		}
	}
	return null;
}

function initConvertMeasureForm(idAdd)
{

	maxPrecision = 13;
	//> check & set Parameters
	if("" == idAdd || !idAdd) return false;

	var idForm = G_idForm + idAdd,idM1 = G_idM1 + idAdd,idM2 = G_idM2 + idAdd,idMTP = G_idMTP + idAdd;
	var idCV = G_idCV + idAdd,idRezult = G_idRezult + idAdd,idDiv = G_idDiv + idAdd;

	var oForm = document.getElementById(idForm);
	if(!oForm) return false;
	oForm.action = "javascript:return false;";

	var oMTP = document.getElementById(idMTP);
	if(!oMTP) return false;
	if("select" != oMTP.nodeName.toLowerCase()){alert(3); return false;}

	var oM1 = document.getElementById(idM1);
	if(!oM1) return false;
	if("select" != oM1.nodeName.toLowerCase()){alert(5); return false;}
	
	var oM2 = document.getElementById(idM2);
	if(!oM2) return false;
	if("select" != oM2.nodeName.toLowerCase()){alert(7); return false;}
	
	var oRezult = document.getElementById(idRezult);
	if(!oRezult) return false;
	
	var oCV = document.getElementById(idCV);
	if(!oCV) return false;

	if(isNaN(oCV.value)) return false;
	//< check & set Parameters

	//> fulfil <select> for type of measures
	oMTP.options.length = measuresTypeList.length;
	var i;

	oMTP.selectedIndex = 0;
	for(i=0;i<measuresTypeList.length;i++)
	{
		oMTP.options[i].value = i;
		oMTP.options[i].text = measuresTypeList[i];
	}
	//< fulfil <select> for type of measures

	// fulfil selects of measures
	fulfilMeasureSelectsFromArrays(oM1,oM2,measuresNameList_1,measuresValueList_1);
	// run generate of Data Table
	fulfilAllMeasuresDataTable(idAdd, 0, 0);
	return false;
}

function selectMeasureType(idAdd)
{
// gets wich Measure type is selected, runs generating OPTIONS for source and rezult measure selects
// and runs generating of DataTable

	//> check & set Parameters
	if("" == idAdd || !idAdd) return false;

	var idForm = G_idForm + idAdd,idM1 = G_idM1 + idAdd,idM2 = G_idM2 + idAdd,idMTP = G_idMTP + idAdd;
	var idCV = G_idCV + idAdd,idRezult = G_idRezult + idAdd,idDiv = G_idDiv + idAdd;
		
	var oForm = document.getElementById(idForm);
	if(!oForm) return false;
	
	var oMTP = document.getElementById(idMTP);
	if(!oMTP) return false;
	if("select" != oMTP.nodeName.toLowerCase()){alert(3); return false;}
	
	if(!oMTP.selectedIndex) oMTP.selectedIndex = 0;
	
	var oM1 = document.getElementById(idM1);
	if(!oM1) return false;
	if("select" != oM1.nodeName.toLowerCase()) return false;
	
	var oM2 = document.getElementById(idM2);
	if(!oM2) return false;
	if("select" != oM2.nodeName.toLowerCase()) return false;
	//< check & set Parameters

	var i,selectedType = oMTP.selectedIndex;
	var arrNames, arrValues
	
	// get Array of Measure Names for selected measure type
	arrNames = eval("measuresNameList_" + (selectedType+1));
	// get Array of Measure Values for selected measure type
	arrValues = eval("measuresValueList_" + (selectedType+1));
	
	fulfilMeasureSelectsFromArrays(oM1,oM2,arrNames,arrValues);
	fulfilAllMeasuresDataTable(idAdd, oMTP.selectedIndex, oM1.selectedIndex);
	convertMeasure(idAdd);
	return false;
}

function fulfilMeasureSelectsFromArrays(oM1,oM2,arrNames,arrValues)
{
// generates OPTIONs for source and Target Measure Selects
//alert("fulfilMeasureSelectsFromArrays\n" + oM1 + "\n" + oM2 + "\n" + arrNames + "\n" + arrValues);
	oM1.options.length = arrNames.length;
	oM2.options.length = arrNames.length;
	oM1.selectedIndex = 0;
	oM2.selectedIndex = 0;
	var tmpStr = "";
	
	for(var i=0;i<arrNames.length;i++)
	{
//alert(i);
		//tmpStr += "<option value=\"" + arrValues[i] + "\">" + arrNames[i] + "</option>";
		oM1.options[i].value = arrValues[i];
		oM2.options[i].value = arrValues[i];
		
		oM1.options[i].text = arrNames[i];
		oM2.options[i].text = arrNames[i];
	}
	//oM1.innerHTML = tmpStr;
	//oM2.innerHTML = tmpStr;
//alert(oM1.innerHTML);
	return false;
}

function convertMeasure(idAdd)
{
// get value N from source INPUT ,CALCULATE rezult & run generate Data Table
	maxPrecision = 13;
	//> check & set Parameters
	if("" == idAdd || !idAdd) return false;

	var idForm = G_idForm + idAdd,idM1 = G_idM1 + idAdd,idM2 = G_idM2 + idAdd,idMTP = G_idMTP + idAdd;
	var idCV = G_idCV + idAdd,idRezult = G_idRezult + idAdd,idDiv = G_idDiv + idAdd;

	var oForm = document.getElementById(idForm);
	if(!oForm) return false;
	
	var oMTP = document.getElementById(idMTP);
	if(!oMTP) return false;
	measureTypeIndex = oMTP.selectedIndex;

	var oM1 = document.getElementById(idM1);
	if(!oM1) return false;
	if("select" != oM1.nodeName.toLowerCase()) return false;

	if(!oM1.selectedIndex) oM1.selectedIndex = 0;
	selectedMeasureIndex = oM1.selectedIndex;
	
	var oM2 = document.getElementById(idM2);
	if(!oM2) return false;
	if("select" != oM2.nodeName.toLowerCase()) return false;

	if(!oM2.selectedIndex) oM2.selectedIndex = 0;
	
	var oRezult = document.getElementById(idRezult);
	if(!oRezult) return false;
	
	var oCV = document.getElementById(idCV);
	if(!oCV) return false;
	var convertValue = oCV.value;
	
	if(10000000000000000000000 <= convertValue) alert(getConstStr("CONST_JS_Too_Big_Value_Can_Bee_Error","Too big NUMBER. Some results culd have errors.."));
	if(isNaN(convertValue)) return false;
	//< check & set Parameters
	
	try{
		if(isRule(oM1.options[0].value))// check selected Measure value is Rule
		{
			// execute rule (function) to calculate ETALONE measure value (first element value)
			var etaloneValue = calculateValueFromRule(oM1.options[oM1.selectedIndex].value,convertValue,"i");
			// execute rule (function) to calculate REZULT measure value (depend on ETALONE element value)
			oRezult.value = removeEndZeros("" + calculateValueFromRule(oM2.options[oM2.selectedIndex].value,etaloneValue,"f").toFixed(maxPrecision) + "");
		}
		else
		{
			//if(0 != oM2.options[oM2.selectedIndex].value)// if first element selected 
			oRezult.value = removeEndZeros("" + ((oM1.options[oM1.selectedIndex].value/oM2.options[oM2.selectedIndex].value) * convertValue).toFixed(maxPrecision) + "");
		}
		// generate DataTable for selected Measure
		fulfilAllMeasuresDataTable(idAdd, measureTypeIndex, selectedMeasureIndex);
	}
	catch(e){showError(e,"convertMeasure");}
	return false;
}

function changeTableCalculationDirection(idAdd)
{
	//> check & set Parameters
	if("" == idAdd || !idAdd) return false;

	var idForm = G_idForm + idAdd,idM1 = G_idM1 + idAdd,idM2 = G_idM2 + idAdd,idMTP = G_idMTP + idAdd;
	var idCV = G_idCV + idAdd,idRezult = G_idRezult + idAdd,idDiv = G_idDiv + idAdd;
	
	var measureTypeIndex, selectedMeasureIndex;
	
	var oForm = document.getElementById(idForm);
	if(!oForm) return false;
	
	var oM1 = document.getElementById(idM1);
	if(!oM1) return false;
	if("select" != oM1.nodeName.toLowerCase()) return false;

	if(!oM1.selectedIndex) oM1.selectedIndex = 0;
	selectedMeasureIndex = oM1.selectedIndex;
	
	var oMTP = document.getElementById(idMTP);
	if(!oMTP) return false;
	if("select" != oMTP.nodeName.toLowerCase()) return false;

	if(!oMTP.selectedIndex) oMTP.selectedIndex = 0;
	measureTypeIndex = oMTP.selectedIndex;
	//< check & set Parameters
		
	G_TableCalculationDirection = -G_TableCalculationDirection;// swith type of Table calculation
	// generate Table with Data for selected Measure
	fulfilAllMeasuresDataTable(idAdd, measureTypeIndex, selectedMeasureIndex);
	return false;
}

function fulfilAllMeasuresDataTable(idAdd, measureTypeIndex, selectedMeasureIndex)
{
	maxPrecision = 13;
	//> check & set Parameters
	if("" == idAdd || !idAdd) return false;

	var idForm = G_idForm + idAdd,idM1 = G_idM1 + idAdd,idM2 = G_idM2 + idAdd,idMTP = G_idMTP + idAdd;
	var idCV = G_idCV + idAdd,idRezult = G_idRezult + idAdd,idDiv = G_idDiv + idAdd;
	
	var oForm = document.getElementById(idForm);
	if(!oForm) return false;
	
	var oMTP = document.getElementById(idMTP);
	if(!oMTP) return false;
	if("select" != oMTP.nodeName.toLowerCase()) return false;

	var oM1 = document.getElementById(idM1);
	if(!oM1) return false;
	if("select" != oM1.nodeName.toLowerCase()) return false;

	var oCV = document.getElementById(idCV);
	if(!oCV) return false;

	var convertValue = ifNum(oCV.value,1);
	if(!measureTypeIndex || -1 == measureTypeIndex) measureTypeIndex = 0;
	if(!selectedMeasureIndex || -1 == selectedMeasureIndex) selectedMeasureIndex = 0;
	
	var oDiv = document.getElementById(idDiv);
	if(!oDiv) return false;
	
	var strTable,i,j,arrNames, arrValues, arrAbbr,generateOnlySelectedMeasureTable = false;
	var selectedMeasureValue = 1, tmpAbbrIndex = 0;
	var tmpStr = "", tmpV = 1, x = -1, s="", tmpArrValue = 0, isRuleFlag = false, etaloneValue = 0,re;
	
	//convertMeasure(idAdd);
	
	if(-1 != measureTypeIndex) generateOnlySelectedMeasureTable = true;
	//< check & set Parameters
	
	strTable =	"<table cellpadding=0 cellspacing=1 border=0 id='allMeasuresDataTable[:id:]' class=msrTbl>";
	
	//> for each measure type
	for(i=0;i<measuresTypeList.length;i++)
	{
		//> check if need to generate only 1 table
		if((generateOnlySelectedMeasureTable && i == measureTypeIndex) || !generateOnlySelectedMeasureTable)
		{
			arrNames = eval("measuresNameList_" + (i+1));
			arrValues = eval("measuresValueList_" + (i+1));
			try{arrAbbr = eval("measuresAbbrList_" + (i+1));}
			catch(e){arrAbbr = new Array(arrNames.length)}
			
			// get selected measure from correct array
			if(generateOnlySelectedMeasureTable && i == measureTypeIndex)
			{
				tmpAbbrIndex = selectedMeasureIndex;
				selectedMeasureValue = arrValues[selectedMeasureIndex];
			}
			else
			{
				tmpAbbrIndex = 0;
				selectedMeasureValue = arrValues[0];
			}

			// if selected Measure value is Rule (function) -> calculate etalon (1) Value for feature Calculations
			if(isRule(arrValues[0]))
			{
				isRuleFlag = true;
				etaloneValue = calculateValueFromRule(selectedMeasureValue,convertValue,"i");
				selectedMeasureValue = convertValue;
			}

			//> title ROW and button
			strTable += "<tr><td class=dirBtn>";

			if(isRuleFlag) strTable += "&nbsp;";
			else strTable += "<BUTTON class='grayBtn2' onClick=\"javascript:changeTableCalculationDirection('" + idAdd + "');\" title='" + getConstStr("CONST_JS_change_calc_type_btn_descr","change type..") + "'>m/x &nbsp; <span class=btnspr>||</span> &nbsp;  x/m</BUTTON>";
			
			strTable += "</td><td colspan=2 class=tit>" + measuresTypeList[i] + "</td></tr>";
			//< title ROW and button
			
			//> DESCRIPTION row
			if(!isRuleFlag)
			{
				if(1 == G_TableCalculationDirection) tmpStr = getConstStr("CONST_JS_table_calculation_type_2","calc type 2..");
				else tmpStr = getConstStr("CONST_JS_table_calculation_type_1","calc type 1..");

				re = /\[\:selected\ measures\:\]/g;
				tmpStr = tmpStr.replace(re,"<u>" + convertValue + " " + arrNames[selectedMeasureIndex] + "</u>");
				re = /\[\:measure\:\]/g;
				tmpStr = tmpStr.replace(re,"<b style='color:#0000CC;'>" + getConstStr("CONST_JS_measure_txt","measure") + "</b>");

				strTable += "<tr><td colspan=3 class=subtit>" + tmpStr + "</td></tr>";
			}
			//< DESCRIPTION row
			
			strTable += "<tr><!--td class=td1></td--><td class=td2></td><td class=td3></td><td class=td4></td></tr>";
			
			//> for each measure
			for(j=0;j<arrNames.length;j++)
			{
				isRuleFlag = false;
				if(!arrAbbr[j]) arrAbbr[j] = "&nbsp;";
				if(!arrValues[j]) arrValues[j] = 0;
				if(!arrNames[j]) arrNames[j] = "&nbsp;";
				x = -x
				if(isNaN(arrValues[j]))// if it is not Numeric value
				{
					if(isRule(arrValues[j]))// if it is not Value but RULE (function) -> calculate it depend on ETALONE value
					{
						isRuleFlag = true;
						tmpArrValue = calculateValueFromRule(arrValues[j],etaloneValue,"f");
					}
					else tmpArrValue = 0;
				}
				else tmpArrValue = arrValues[j];
				
				if(isRuleFlag) tmpV = tmpArrValue;
				else
				{
					if(-1 == G_TableCalculationDirection)// calculate how much times selected Measure * N is in current Measure
						tmpV = ((tmpArrValue/selectedMeasureValue)/convertValue).toFixed(maxPrecision);
					else// calculate direct equivalent of selected measure and current Measure * N
						tmpV = (convertValue * (selectedMeasureValue/tmpArrValue)).toFixed(maxPrecision);
				}

				//to mark SELECTED line in table
				if(j == selectedMeasureIndex) s = "s";
				else s = "";
				
				//> generate Table LINE
				tmpV = removeEndZeros("" + tmpV + "");
				strTable += "<tr class='" + s + "" + x + "'>";
				//strTable += "<td class=dE"+ s "" + x +">=</td>";
				strTable += "<td class=dN" + s + ">" + tmpV + "</td>";//" &nbsp;<b>" + arrAbbr[tmpAbbrIndex] + "</b></td>";
				strTable += "<td class=dA" + s + "" + x + ">" + arrAbbr[j] + "</td>";
				strTable += "<td class=dM" + s + ">" + arrNames[j] + "</td>";
				strTable += "</tr>";
				//< generate Table LINE
			}//< for each measure
		}//< check if need to generate only 1 table
	}//< for each Measure type
	
	// bottom line
	strTable += "<tr class=addinfo><td colspan=3>min ~1*10<sup>-" + maxPrecision + "</sup></td></tr>";
	strTable += "</table>";
	try{oDiv.innerHTML = strTable;}// insert Generated HTML code in existent DIV
	catch(e){alert(e);}
	return false;
}

function isRule(strRule)
{
//check if strRule is string is RULE (FUNCTION)
// return true or false
	if(!strRule) return false;
	strRule = "" + strRule + "";
	var posX = strRule.indexOf("F:[");
	if(0 > posX) return false;
	return true;
}

function calculateValueFromRule(strRule,x,marker)
{
// get strRule (set of rules [functions] ) and calculate it Value for x parameter
//depend on "marker" will be calculated specifik function from set of Rules (functions)
// strRules sample : "F:[x + 3345/x]:F I:[x/(1-cos(x))]:I"
// F:[]:F - direct rule to calculate Value of current Measure
// I:[]:I - invert Rule - to calculate ETALON value of ETALON measure
	if(!strRule || "" == strRule) return 0;
	strRule = "" + strRule + "";
	if(1 > strRule.length) return 0;
	if(!marker || "" == marker) marker = "F";
	marker = marker.toLowerCase();
	strRule = strRule.toLowerCase();

	x = parseFloat(x);
	
	var posX = strRule.indexOf(marker + ":[");// get start marker position of needed rule
	if(0 > posX) return 0;
	var posY = strRule.indexOf("]:" + marker);// get end marker position of needed rule
	posX = posX + marker.length + 2;
	if(posX >  posY) return 0;
	
	strRule = strRule.substr(posX, posY - posX);//get one needed rule from set
//alert(strRule + "\n" + x);
	var rezult = 0;
	try{rezult = eval(strRule);}
	catch(e)
	{
		showError(e,"calculateValueFromRule");
		rezult = 0;
	}
	return rezult;
}

function removeEndZeros(numStr)
{
// removes ALL ZEROs till DOT "." or not ZERO found (. removes also)
// 1.340000 -> f() -> 1.34
	if(!numStr) return 0;
	if(2 > numStr.length) return numStr;
	if(0 > numStr.indexOf(".")) return numStr;
	
	while("0" == numStr.substr(numStr.length-1,1))
	{
		numStr = numStr.substr(0,numStr.length-1);
	}
	if("." == numStr.substr(numStr.length-1,1) || "," == numStr.substr(numStr.length-1,1)) numStr = numStr.substr(0,numStr.length-1);
	return numStr;
}
//-->