//-----------------------
function currencyvalue(s){
	var sout=String(s);
	sout=sout.replace(/[\$\,]/g,'');
	return sout;
}

function valueStrToFixed(s, digits)
{
	var num=Number(s);
	if (isNaN(num)){
		alert("Invalid value");
		return s.replace(/[^0-9]/g,"");
	}
	var buff=s;
	var position=buff.indexOf(".");
	var i;
	if (position<0){//integer
		if (digits>0){
			buff+=".";
			for (i=0;i<digits;++i)
				buff+="0";
		}
	}
	else{
		var isNegative=(buff.charAt(0)=="-");
		var intpart=buff.substring(0,position);
		var intvalue=(intpart=="" || intpart=="-" ? 0 : parseInt(intpart));
		var fraction=buff.substr(position+1);
		var len=fraction.length;
		if (len>digits){
			var right;
			var charvalue;
			i=digits;
			if (fraction.charCodeAt(i)>=0x35){
				while(i>0){
					right=fraction.substr(i);
					charvalue=fraction.charCodeAt(i-1);
					if (++charvalue!=0x3A){
						fraction=fraction.substring(0,i-1)+String.fromCharCode(charvalue)+right;
						break;
					}
					fraction=fraction.substring(0,--i) + "0" + right;
				}
				if (i==0) intvalue += (isNegative? -1: 1);
			}
		}
		for (i=len;i<digits;++i) fraction+="0";
		buff=intvalue.toString();
		var newfraction=fraction.substring(0,digits);
		if (digits>0) buff += ("." + newfraction);
		if (isNegative && intvalue==0 && newfraction.search(/[1-9]/)>=0)
			buff="-"+buff;
	}
	return buff;
}

//-----------------------
function formatCurrency(s, digits){
	if (s==null || s=="") return "";
	var sout=String(s).replace(/[^0-9\.-]/g,'');
	var digits1 = digits >= 0 ? digits : -digits;
//	sout = Number(sout).toFixed(digits1);
	sout = valueStrToFixed(sout,digits1);
	var i=sout.indexOf('.');
	if (i<0)
		i=sout.length;
	while (i>3) {
		if (sout.substring(0,i-3) != "-")
			sout=sout.substring(0,i-3)+","+sout.substring(i-3);
		i-=3;
	}
	if (digits < 0 && sout.indexOf(".") >= 0)
	{
		i = sout.length;
		while (i > 0)
		{
			var cha = sout.charAt(--i);
			if (cha != '0') {
				if (cha != '.') ++i;
				break;
			}
		}
		if (i < sout.length)
			sout = sout.substr(0, i);
	}
	return sout;
}

//-----------------------
function checkCurrency(obj){
	if (obj.value.replace(/[ ]*(\$[ ]*)?\d+(\,?\d{3})*(\.\d*)?[ ]*/, '')!='')
	{
		alert("Invalid format for currency value");
		obj.value=formatCurrency(obj.value);
		obj.focus();
		return false;
	}
	obj.value=formatCurrency(obj.value);
	return true;
}

//==== NEW CODE =====
// inobj: the input-text type element id string for currency value (also is operant if totalobj specified)
// ndigits:  number of the digits after decimal point (default: 2)
//     if ndigits < 0, the ending 0's in right side of decimal point will be removed.
// totalobj: the input-text type element for total currency value (if specified)
function formatCurrencyInput(inobj, ndigits, totalobj)
{
	var digits = (ndigits == null ? 2 : ndigits);
	if (totalobj != null)
	{
		if (typeof totalobj.operantlist == 'undefined')
		{
			totalobj.operantlist = new Array();
		}
		
		totalobj.operantlist.push(inobj);
	}
	
	inobj.onblur = function() {
		inobj.value = formatCurrency(inobj.value, digits);
		if (totalobj != null)
		{
			var total = 0;
			var showtotal = false;
			var val;
			for (var i = 0; i < totalobj.operantlist.length; ++i)
			{
				val = totalobj.operantlist[i].value;
				if (val != null && val != "")
				{
					total += Number(currencyvalue(val));
					showtotal = true;
				}
			}
			val = String(total);
			totalobj.innerText = showtotal ? formatCurrency(val, digits) : "";
		}
	};
}

//-----------------------
// arguments opr1, opr2, product are inputBox objects for multiplicand, multiplier, and product respectively
// currencydigits: number of the digits after decimal point for product currency value (default: 2), or -1 for non-currency number 
function InputMultiplier(opr1, opr2, product, currencydigits)
{
	digits = (currencydigits == null ? 2 : currencydigits);
	this._doMultiply = function (e) {
		var op1 = Number(currencyvalue(opr1.value));
		var op2 = Number(currencyvalue(opr2.value));
		product.value = String(op1 * op2);
		if (digits >= 0)
		{
			product.value = formatCurrency(product.value, digits);
		}
	};

	opr1.attachEvent("onblur", this._doMultiply);
	opr2.attachEvent("onblur", this._doMultiply);
}

function validateKeyCode(sExisting, key, caretPos)
{
	if (sExisting.charAt(0) != '-')
	{
		if (key == '-' && caretPos == sExisting.length) return true;
	}
	else
		sExisting = sExisting.substr(1);
	if ('0123456789'.indexOf(key) >= 0) return true;
	if (key == '.' && sExisting.indexOf('.') == -1) return true;
	return false;
}

function reformatCurrency(str)
{
	var sout = str.replace(/[\,]/g,'');
	var i=sout.indexOf('.');
	if (i<0)
		i=sout.length;
	while (i>3) {
		if (sout.substring(0,i-3) != "-")
			sout=sout.substring(0,i-3)+","+sout.substring(i-3);
		i-=3;
	}
	return sout;
}

function formatCurrencyNew(oInput)
{
	/*
	var code = event.keyCode;
	if (code == 13) return ture;
	var key = String.fromCharCode(code);
	var buff = oInput.value;
	if (!validateKeyCode(buff, key)) return false;
	if (typeof oInput._crtPosition == "undefined" || oInput._crtPosition == null)
		oInput._crtPosition = 0;
	var decPointPos = buff.indexOf('.');
	var len = buff.length;
	if (decPointPos == -1) decPointPos = len;
	// insert newly input key
	buff = buff.substr(0, oInput._crtPosition) + key + buff.substr(oInput._crtPosition);
	++(oInput._crtPosition);
	oInput.value = buff;
	
	return false;
	
	if (
	return false;
	*/

/* == this example can move carot
	*/
	alert("keypress");
	oInput.value = 'abcdefgh';
	var oTextRange = oInput.createTextRange();
	oTextRange.move("character", 1);
	oTextRange.collapse(true);
		oTextRange.select();
	return true;
	
	
	/* temp keep >>
	//alert(event.keyCode);
//	if (event.keyCode == 49) return true;
	oInput.value = 'abcdefgh';
	var oTextRange = oInput.createTextRange();
	oTextRange.move("character", 1);
///	oTextRange.moveStart("character", 5);
///	oTextRange.moveEnd("character", -3);
	oTextRange.collapse(true);
//	oTextRange.findText("cd");
//		oTextRange.select();
	return false; << temp keep */
/*
	var orgStr = oInput.value;
	var orgStr = "*";
	alert(orgStr);
*/
}

function fmtCrcKeydown(oInput)
{
	if (event.repeat) {
		oInput._repeatKeydown = true;
		return false;
	}
	else
		oInput._repeatKeydown = false;

//oInput.ownerDocument.all('showdiv').innerHTML=oInput.ownerDocument.all('showdiv').innerHTML+' keydown';
}

function fmtCrcKeypress(oInput)
{
	if (oInput._repeatKeydown) return false;
	var key = String.fromCharCode(event.keyCode);
	var buff = oInput.value;
	if (!validateKeyCode(buff, key)) return false;
	
	oInput._storedKayValue = key;
	event.keyCode = 124; // 124 is the ASC value of '|'
//oInput.ownerDocument.all('showdiv').innerHTML=oInput.ownerDocument.all('showdiv').innerHTML+' keypress';
}

function fmtCrcKeyup(oInput)
{
///alert(oInput.value + event.keyCode);
//alert(!validateKeyCode(oInput.value, String.fromCharCode(event.keyCode)));
	///if (!validateKeyCode(oInput.value, String.fromCharCode(event.keyCode))) return true;
	//if (event.keyCode != '|') return true;
	if (typeof oInput._storedKayValue == "undefined" || oInput._storedKayValue == '')
	{
		icode = event.keyCode;
		if (icode < 37 || icode > 40) // arrow keys
			oInput.value = reformatCurrency(oInput.value);
		//reformatCurrency(oInput);
		return true;
	}
	var buff = oInput.value;
	var len = buff.length;
	var insPosition = buff.indexOf('|');
	if (insPosition < 0) return true;
	var insertKey = oInput._storedKayValue;
	// block '-' input if it is not in the leftmost or '-' already inputed
	if (insertKey == '-' && (insPosition != 0 || buff.indexOf('-') >= 0)) insertKey = '';
	// new input character at the left of '-' is not allowed
	if (buff.indexOf('-') == 1 && buff.indexOf('|') == 0) insertKey = '';
	buff = buff.replace('|', insertKey);
	// adjust inser position
	var firstsection = buff.indexOf(',');
	if (firstsection <= 0)
		fiestsection = buff.indexOf('.');
	if (firstsection <= 0)
		firstsection = len;
	if (firstsection >= insPosition)
		--firstsection;
	if (buff.charAt(0) == '-' ? firstsection == 4 : firstsection == 3)
		// need add a new comma, i.e., need adjust
		++insPosition;
	if (insertKey != '')
	{
		buff = reformatCurrency(buff);
	}
	
	oInput._storedKayValue = ''; //clean key value
	oInput.value = buff;//oInput.value.replace('|', insertKey);

	// move caret to proper position
	var oTextRange = oInput.createTextRange();
	oTextRange.move("character", insPosition + 1);
	oTextRange.collapse(true);
	oTextRange.select();
//oInput.ownerDocument.all('showdiv').innerHTML=oInput.ownerDocument.all('showdiv').innerHTML+' keyup';
//	oInput._repeatKeydown = false;
}

/*** Problems: ***
1. past not working
2. keyup process adjustment not feel good
3. ...
***/
/// todo: add onblur hander to handle when
function getCaretPosition(oText)
{
	var trsel = document.selection.createRange();
	var trtxt=oText.createTextRange();
	var pos=0;
	while(trsel.compareEndPoints("EndToEnd",trtxt) < 0)
	{
		trtxt.moveEnd("character", -1);
		++pos;
	}
	return pos;
}

function formatCurrencyStr(str, caretPos, key)
{
	var matchary = str.substr(str.length - caretPos).match(/[\,]/g);
	if (matchary != null)
		caretPos -= matchary.length;
	var sout = str.replace(/[\,]/g,'');
	var len1 = sout.length - caretPos;
	if (key != null)
		sout = sout.substr(0, len1) + key + sout.substr(len1);
	var i=sout.indexOf('.');
	if (i<0)
		i=sout.length;
	while (i>3) {
		i-=3;
		if (sout.substring(0,i) != "-")
		{
			if (i+caretPos>=sout.length)
				++caretPos;
			sout=sout.substring(0,i)+","+sout.substring(i);
		}
	}
	return { str: sout, pos: caretPos };
}

function crcKeypress(oInput)
{
	oInput._cureencyFormated = true;
	var key = String.fromCharCode(event.keyCode);
	var buff = oInput.value;
	var caretPos = (getCaretPosition(oInput));
	if (!validateKeyCode(buff, key, caretPos)) return false;
	var fmt = formatCurrencyStr(oInput.value, caretPos, key);
	oInput.value = fmt.str;
	var oTextRange = oInput.createTextRange();
	oTextRange.move("character", oInput.value.length - fmt.pos);
	oTextRange.collapse(true);
	oTextRange.select();
	return false;
}

function crcKeyup(oInput)
{
	if (oInput._cureencyFormated == true)
	{
		oInput._cureencyFormated = false;
		return;
	}
	var	icode = event.keyCode;
	if (icode >= 33 && icode <= 40) return;// pgup/dw, home, end, arrow keys
	var buff = oInput.value;
	var caretPos = (getCaretPosition(oInput));
	var hasdecpoint = false;
	for (var i = 0; i < buff.length; ++i)
	{
		var chr = buff.charAt(i);
		if (i == 0 && chr == '-') continue;
		if (chr == '.' && !hasdecpoint)
		{
			hasdecpoint = true;
			continue;
		}
		if ("0123456789".indexOf(chr) >= 0) continue;
		buff = buff.substr(0, i) + buff.substr(i + 1);
		if (i > caretPos) --caretPos; // adj caretPos
		--i;
	}
	var key = String.fromCharCode(icode);
	var fmt = formatCurrencyStr(buff, caretPos, null);
	oInput.value = fmt.str;
	var oTextRange = oInput.createTextRange();
	oTextRange.move("character", oInput.value.length - fmt.pos);
	oTextRange.collapse(true);
	oTextRange.select();
	return false;
}
