/////////////////////////////////////////////////////////////////////
//
// CLIENT-SIDE UTILITY
//
/////////////////////////////////////////////////////////////////////

// client-side data units conversion & support routines

// low-level conversion routine. converts value (of type unitKey) from fromSys to toSys, rounding accordingly to roundPrec.
// uses array of conversion coefficients arrConv
function ConvertValue (arrConv,value,unitKey,fromSys,toSys,roundPrec)
{
	var UNIT = null;
	for (var i = 0; i < arrConv.length; i++) {
		if (arrConv[i][0] == unitKey) {
			UNIT = arrConv[i][1];
			break;
		};
	};
	if (!UNIT) return;

	var FROM_SYS = null;
	var TO_SYS = null;

	for (var i = 0; i < UNIT.length; i++) {
		if (UNIT[i][2] == fromSys) {
			FROM_SYS = UNIT[i];
		};
		if (UNIT[i][2] == toSys) {
			TO_SYS = UNIT[i];
		};
	};
	//if (!FROM_SYS || !TO_SYS) return;

	var value = parseFloat(value);
	if (isNaN(value)) value = 0;
	if (FROM_SYS) {
		value = value * FROM_SYS[0] + FROM_SYS[1];
	};
	if (TO_SYS) {
		value = (value - TO_SYS[1]) / TO_SYS[0];
	};

	if (roundPrec && roundPrec!=-1) {
		if (!isNaN(roundPrec)) {
			var p = Math.pow(10,roundPrec);
			value = Math.round (value * p) / p;
		};
	};
	return value;
};

// helper routine - converts data unit directly from DHTML control
// a number of additional DHTML attributes used: UNIT_KEY,CUR_SYS
function ConvertValueElem (oElem,toSys,roundPrec)
{
	if (!oElem) return;
	var value = parseFloat(oElem.value);
	if (isNaN(value)) value = 0;

	var unitKey = oElem.UNIT_KEY;
	var fromSys = oElem.CUR_SYS;

	value = ConvertValue (arrConvTables,value,unitKey,fromSys,toSys,roundPrec);
	oElem.value = value;
	oElem.CUR_SYS = toSys;
};

// converts 'raw' values to display system (or previously selected)
function ConvertToPrev (oForm,cb_names,arrConvTables)
{
	if (!oForm) return false;

	for (var i = 0; i < cb_names.length; i++) {
		var name = cb_names[i][0];
		var oElem = oForm.all[name];
		var oElemShadow = oForm.all[name+"_shadow"];
		if (!oElem || !oElemShadow) { alert(name); continue; };
		var curSys = oElem.CUR_SYS;
		var toSys  = oElem.CONVERT_TO;
		//if ((toSys == "") || (toSys == curSys)) continue;

		var roundPrec = cb_names[i][1];
		var unitKey   = oElem.UNIT_KEY;
		var value     = oElemShadow.value;
		oElem.value = ConvertValue (arrConvTables,value,unitKey,"",cb_names[i][2]/*"SI"*/);
		ConvertValueElem (oElem,toSys,roundPrec);
	};
};

// converts display-system values to 'raw' to be submitted in form
function ConvertAllToSI(oForm,cb_names,arrConvTables)
{
	for (var i = 0; i < cb_names.length; i++) {
		var name = cb_names[i][0];
		var oElem = oForm.all[name];
		var oElemShadow = oForm.all[name+"_shadow"];
		if (!oElem || !oElemShadow) { alert(name); continue; };

		var roundPrec = cb_names[i][1];
		var unitKey   = oElem.UNIT_KEY;
		var curSys    = oElem.CUR_SYS;
		var toSys     = cb_names[i][2]; //"SI";

		var value = ConvertValue (arrConvTables,oElem.value,unitKey,curSys,toSys);
		oElemShadow.value = ConvertValue (arrConvTables,value,unitKey,cb_names[i][2],"",roundPrec);
	};
};


/////////////////////////////////////////////////////////////////////


function Trim (str)
{
	var temp = new String (str);
	var len = temp.length;
	while (len-- > 0) {
		if (temp.charAt(len) != ' ') break;
	};
	temp = temp.substring(0, len+1);
	return temp;
};


function ABS(num){return(num>0)?num:-num;};
function QWORD (hiDWord, loDWord, base)
{
	base = parseInt(base);
	if (!base || isNaN(base)) base = 10;
	var obj=new Object();
	obj.hiDWord=(hiDWord)?hiDWord:0;
	obj.loDWord=(loDWord)?loDWord:0;
	obj.getString=new Function('return (ABS(this.hiDWord).toString('+base+') + ABS(this.loDWord).toString('+base+'));');
	return obj;
};
function ROLD (qword)
{
	var hi_bit = (qword.hiDWord & 0x8000) >> 15;
	var lo_bit = (qword.loDWord & 0x8000) >> 15;
	qword.hiDWord = (qword.hiDWord << 1) | lo_bit;
	qword.loDWord = (qword.loDWord << 1) | hi_bit;
};
function HASH (str,base,stHi,stLo,a)
{
	var str = String(str);

	stHi = parseInt(stHi);
	if (isNaN(stHi)) stHi = 0x1234;
	stLo = parseInt(stLo);
	if (isNaN(stLo)) stLo = 0x9876;

	var qword = QWORD (stHi,stLo,base);
	var len = str.length;
	for (var i = 0; i < len; i++) {
		var code = str.charCodeAt(i);
		if (!a) code = -code;
		qword.hiDWord += code;
		ROLD (qword);
		qword.loDWord -= code;
		ROLD (qword);
	};

	return qword.getString();
};


/////////////////////////////////////////////////////////////////////

function ConcatURL(baseURL,concatURL)
{
	var res = String(baseURL), toConcat=String(concatURL);
	if(toConcat.length>0 && toConcat!="" && toConcat!="undefined") {
		var app_sign = (res.indexOf("?")!=-1) ? "&" : "?";
		if ((toConcat.charAt(0) == "?") || (toConcat.charAt(0) == '&'))
			toConcat = toConcat.substring(1,toConcat.length);

		res += app_sign + toConcat;
	};
	return res;
};

function SetURLValue(baseURL,paramName,paramValue)
{
	var url = String(baseURL);
	var res = "";
	var testRG = new RegExp("[?&]?("+paramName+"=[^&]*)(&|$)","g");
	if (url.search(testRG) != -1) {
		res = url.replace(RegExp.$1,paramName+"="+URLEncode(paramValue));
	} else {
		res = ConcatURL(baseURL,paramName+"="+URLEncode(paramValue));
	};
	return res;
};
