// mredkj.com
addNamespace("KY.Web.NumberFormat");
KY.Web.NumberFormat = Class.create();

Object.extend(KY.Web.NumberFormat.prototype, {
	VERSION : 'Number Format v1.5.4',
	COMMA : ',',
	PERIOD : '.',
	DASH : '-', 
	LEFT_PAREN : '(', 
	RIGHT_PAREN : ')', 
	LEFT_OUTSIDE : 0, 
	LEFT_INSIDE : 1,  
	RIGHT_INSIDE : 2,  
	RIGHT_OUTSIDE : 3,  
	LEFT_DASH : 0, 
	RIGHT_DASH : 1, 
	PARENTHESIS : 2, 
	NO_ROUNDING : -1,
	num: null,
	numOriginal: null,
	hasSeparators : false,  
	separatorValue: null,  
	inputDecimalValue:null, 
	decimalValue:null,  
	negativeFormat:null, 
	negativeRed:null, 
	hasCurrency:null,  
	currencyPosition:null,  
	currencyValue:null,  
	places:null,
	roundToPlaces:null, 
	truncate:null, 
	initialize: function(num, inputDecimal){
		if (inputDecimal == null) {
			this.setNumber(num, this.PERIOD);
		} else {
			this.setNumber(num, inputDecimal); 
		}
		this.setCommas(true);
		this.setNegativeFormat(this.LEFT_DASH); 
		this.setNegativeRed(false); 
		this.setCurrency(false); 
		this.setCurrencyPrefix('TL');
		this.setPlaces(2);
	},
	setInputDecimal: function(val){
		this.inputDecimalValue = val;
	},
	setNumber:function (num, inputDecimal){
		//DebugWindow('KY.Web.NumberFormat.setNumber:num', num);
		//DebugWindow('KY.Web.NumberFormat.setNumber:inputDecimal', inputDecimal);
		if (inputDecimal != null) {
			this.setInputDecimal(inputDecimal); 
		}
		this.numOriginal = num;
		this.num = this.justNumber(num);
	},
	toUnformatted:function (){
		return (this.num);
	},
	getOriginal:function (){
		return (this.numOriginal);
	},
	setNegativeFormat:function (format){
		this.negativeFormat = format;
	},
	setNegativeRed:function (isRed){
		this.negativeRed = isRed;
	},
	setSeparators:function (isC, separator, decimal){
		this.hasSeparators = isC;
		if (separator == null) separator = this.COMMA;
		if (decimal == null) decimal = this.PERIOD;
		if (separator == decimal) {
			this.decimalValue = (decimal == this.PERIOD) ? this.COMMA : this.PERIOD;
		} else {
			this.decimalValue = decimal;
		}
		this.separatorValue = separator;
	},
	setCommas:function (isC){
		this.setSeparators(isC, this.COMMA, this.PERIOD);
	},
	setCurrency:function (isC){
		this.hasCurrency = isC;
	},
	setCurrencyValue:function (val){
		this.currencyValue = val;
	},
	setCurrencyPrefix:function (cp){
		this.setCurrencyValue(cp);
		this.setCurrencyPosition(this.LEFT_OUTSIDE);
	},
	setCurrencyPosition:function (cp){
		this.currencyPosition = cp
	},
	setPlaces:function (p, tr){
		this.roundToPlaces = !(p == this.NO_ROUNDING); 
		this.truncate = (tr != null && tr); 
		this.places = (p < 0) ? 0 : p; 
	},
	addSeparators:function (nStr, inD, outD, sep){
		nStr += '';
		var dpos = nStr.indexOf(inD);
		var nStrEnd = '';
		if (dpos != -1) {
			nStrEnd = outD + nStr.substring(dpos + 1, nStr.length);
			nStr = nStr.substring(0, dpos);
		}
		var rgx = /(\d+)(\d{3})/;
		while (rgx.test(nStr)) {
			nStr = nStr.replace(rgx, '$1' + sep + '$2');
		}
		return nStr + nStrEnd;
	},
	toFormatted:function (){	
		var pos;
		var nNum = this.num; 
		var nStr;            
		var splitString = new Array(2);   
		//DebugWindow('KY.Web.NumberFormat.toFormatted:nNum', nNum);
		if (this.roundToPlaces) {
			nNum = this.getRounded(nNum);
			nStr = this.preserveZeros(Math.abs(nNum)); 
		} else {
			nStr = this.expandExponential(Math.abs(nNum)); 
		}
		//DebugWindow('KY.Web.NumberFormat.toFormatted:nNum', nNum);
		//DebugWindow('KY.Web.NumberFormat.toFormatted:nStr', nStr);
		if (this.hasSeparators) {
			nStr = this.addSeparators(nStr, this.PERIOD, this.decimalValue, this.separatorValue);
		} else {
			nStr = nStr.replace(new RegExp('\\' + this.PERIOD), this.decimalValue); 
		}
		var c0 = '';
		var n0 = '';
		var c1 = '';
		var n1 = '';
		var n2 = '';
		var c2 = '';
		var n3 = '';
		var c3 = '';
		var negSignL = (this.negativeFormat == this.PARENTHESIS) ? this.LEFT_PAREN : this.DASH;
		var negSignR = (this.negativeFormat == this.PARENTHESIS) ? this.RIGHT_PAREN : this.DASH;
		if (this.currencyPosition == this.LEFT_OUTSIDE) {
			if (nNum < 0) {
				if (this.negativeFormat == this.LEFT_DASH || this.negativeFormat == this.PARENTHESIS) n1 = negSignL;
				if (this.negativeFormat == this.RIGHT_DASH || this.negativeFormat == this.PARENTHESIS) n2 = negSignR;
			}
			if (this.hasCurrency) c0 = this.currencyValue;
		} else if (this.currencyPosition == this.LEFT_INSIDE) {
			if (nNum < 0) {
				if (this.negativeFormat == this.LEFT_DASH || this.negativeFormat == this.PARENTHESIS) n0 = negSignL;
				if (this.negativeFormat == this.RIGHT_DASH || this.negativeFormat == this.PARENTHESIS) n3 = negSignR;
			}
			if (this.hasCurrency) c1 = this.currencyValue;
		}else if (this.currencyPosition == this.RIGHT_INSIDE) {
			if (nNum < 0) {
				if (this.negativeFormat == this.LEFT_DASH || this.negativeFormat == this.PARENTHESIS) n0 = negSignL;
				if (this.negativeFormat == this.RIGHT_DASH || this.negativeFormat == this.PARENTHESIS) n3 = negSignR;
			}
			if (this.hasCurrency) c2 = this.currencyValue;
		}else if (this.currencyPosition == this.RIGHT_OUTSIDE) {
			if (nNum < 0) {
				if (this.negativeFormat == this.LEFT_DASH || this.negativeFormat == this.PARENTHESIS) n1 = negSignL;
				if (this.negativeFormat == this.RIGHT_DASH || this.negativeFormat == this.PARENTHESIS) n2 = negSignR;
			}
			if (this.hasCurrency) c3 = this.currencyValue;
		}
		nStr = c0 + n0 + c1 + n1 + nStr + n2 + c2 + n3 + c3;
		if (this.negativeRed && nNum < 0) {
			nStr = '<font color="red">' + nStr + '</font>';
		}
		return (nStr);
	},
	toPercentage:function (){
		nNum = this.num * 100;
		nNum = this.getRounded(nNum);
		return nNum + '%';
	},
	getZeros:function (places){
		var extraZ = '';
		var i;
		for (i=0; i<places; i++) {
			extraZ += '0';
		}
		return extraZ;
	},
	expandExponential: function (origVal){
		if (isNaN(origVal)) return origVal;
		var newVal = parseFloat(origVal) + ''; 
		var eLoc = newVal.toLowerCase().indexOf('e');
		if (eLoc != -1) {
			var plusLoc = newVal.toLowerCase().indexOf('+');
			var negLoc = newVal.toLowerCase().indexOf('-', eLoc); 
			var justNumber = newVal.substring(0, eLoc);
			if (negLoc != -1) {
				var places = newVal.substring(negLoc + 1, newVal.length);
				justNumber = this.moveDecimalAsString(justNumber, true, parseInt(places));
			} else {
				if (plusLoc == -1) plusLoc = eLoc;
				var places = newVal.substring(plusLoc + 1, newVal.length);
				justNumber = this.moveDecimalAsString(justNumber, false, parseInt(places));
			}
			newVal = justNumber;
		}
		return newVal;
	},
	moveDecimalRight:function (val, places){
		var newVal = '';
		if (places == null) {
			newVal = this.moveDecimal(val, false);
		} else {
			newVal = this.moveDecimal(val, false, places);
		}
		return newVal;
	},
	moveDecimalLeft:function (val, places){
		var newVal = '';
		if (places == null) {
			newVal = this.moveDecimal(val, true);
		} else {
			newVal = this.moveDecimal(val, true, places);
		}
		return newVal;
	},
	moveDecimalAsString:function (val, left, places){
		var spaces = (arguments.length < 3) ? this.places : places;
		if (spaces <= 0) return val; 
		var newVal = val + '';
		var extraZ = this.getZeros(spaces);
		var re1 = new RegExp('([0-9.]+)');
		if (left) {
			newVal = newVal.replace(re1, extraZ + '$1');
			var re2 = new RegExp('(-?)([0-9]*)([0-9]{' + spaces + '})(\\.?)');		
			newVal = newVal.replace(re2, '$1$2.$3');
		} else {
			var reArray = re1.exec(newVal); 
			if (reArray != null) {
				newVal = newVal.substring(0,reArray.index) + reArray[1] + extraZ + newVal.substring(reArray.index + reArray[0].length); 
			}
			var re2 = new RegExp('(-?)([0-9]*)(\\.?)([0-9]{' + spaces + '})');
			newVal = newVal.replace(re2, '$1$2$4.');
		}
		newVal = newVal.replace(/\.$/, ''); 
		return newVal;
	},
	moveDecimal:function (val, left, places){
		var newVal = '';
		if (places == null) {
			newVal = this.moveDecimalAsString(val, left);
		} else {
			newVal = this.moveDecimalAsString(val, left, places);
		}
		return parseFloat(newVal);
	},
	getRounded:function (val){
		//DebugWindow('KY.Web.NumberFormat.getRounded:val', val);
		val = this.moveDecimalRight(val);
		//DebugWindow('KY.Web.NumberFormat.getRounded:val', val);
		if (this.truncate) {
			val = val >= 0 ? Math.floor(val) : Math.ceil(val); 
		} else {
			val = Math.round(val);
		}
		//DebugWindow('KY.Web.NumberFormat.getRounded:val', val);
		val = this.moveDecimalLeft(val);
		return val;
	},
	preserveZeros:function (val){
		var i;
		val = this.expandExponential(val);
		if (this.places <= 0) return val; 
		var decimalPos = val.indexOf('.');
		if (decimalPos == -1) {
			val += '.';
			for (i=0; i<this.places; i++) {
				val += '0';
			}
		} else {
			var actualDecimals = (val.length - 1) - decimalPos;
			var difference = this.places - actualDecimals;
			for (i=0; i<difference; i++) {
				val += '0';
			}
		}
		return val;
	},
	justNumber:function (val){
		var newVal = val + '';
		var isPercentage = false;
		//DebugWindow('justNumber:newVal - begin', newVal);
		if (newVal.indexOf('%') != -1) {
			newVal = newVal.replace(/\%/g, '');
			isPercentage = true; 
		}
		//DebugWindow('justNumber:newVal - after percentage', newVal);
		//DebugWindow('justNumber:this.inputDecimalValue', this.inputDecimalValue);
		var re = new RegExp('[^\\' + this.inputDecimalValue + '\\d\\-\\+\\(\\)eE]', 'g');	
		newVal = newVal.replace(re, '');
		//DebugWindow('justNumber:newVal - replace', newVal);
		var tempRe = new RegExp('[' + this.inputDecimalValue + ']', 'g');
		var treArray = tempRe.exec(newVal); 
		if (treArray != null) {
			var tempRight = newVal.substring(treArray.index + treArray[0].length); 
			newVal = newVal.substring(0,treArray.index) + this.PERIOD + tempRight.replace(tempRe, ''); 
		}
		if (newVal.charAt(newVal.length - 1) == this.DASH ) {
			newVal = newVal.substring(0, newVal.length - 1);
			newVal = '-' + newVal;
		}
		else if (newVal.charAt(0) == this.LEFT_PAREN && newVal.charAt(newVal.length - 1) == this.RIGHT_PAREN) {
			newVal = newVal.substring(1, newVal.length - 1);
			newVal = '-' + newVal;
		}
		newVal = parseFloat(newVal);
		if (!isFinite(newVal)) {
			newVal = 0;
		}
		if (isPercentage) {
			newVal = this.moveDecimalLeft(newVal, 2);
		}
		return newVal;
	}
}, false); 
