
/* -------------------------------------------------------------------------- */
/*                              Numeric Methods                               */
/* -------------------------------------------------------------------------- */

Number.prototype.decToBin = _decToBin;
function _decToBin() {
    return JSV_decToBin(this);
}

Number.prototype.decToOct = _decToOct;
function _decToOct() {
    return JSV_decToOct(this);
}

Number.prototype.decToHex = _decToHex;
function _decToHex() {
    return JSV_decToHex(this);
}

Number.prototype.ordinalSuffix = _ordinalSuffix;
function _ordinalSuffix(suffixOnly) {
	return JSV_ordinalSuffix(this, suffixOnly);
}

Number.prototype.dollarFormat = _dollarFormat;
function _dollarFormat() {
	return JSV_dollarFormat(this);
}

Number.prototype.commaFormat = _commaFormat;
function _commaFormat(delimiter) {
	return JSV_commaFormat(this, delimiter);
}

function JSV_nz(variant, valueIfNull) {
	if ( JSV_isEmpty(JSV_nz.arguments[1]) ) valueIfNull = '';
	return ( JSV_isEmpty(JSV_nz.arguments[0]) ? valueIfNull : variant );
}

function JSV_isInteger(expI, signed) {
	var	isIntegerValue = true,
		isSigned = false,
		expS = JSV_toString(expI),
		psCount = JSV_occurs(expS, jsvPlusSign),
		nsCount = JSV_occurs(expS, jsvNegativeSign);

	if (nsCount != 0 || psCount != 0) isSigned = true;
	if (JSV_isInteger.arguments[1] == null) signed = true;

	if (JSV_occurs(expS, jsvDecimalPointDelimiter) != 0)
		isIntegerValue = false;
	else if (nsCount > 1 || expS.indexOf(jsvNegativeSign) > 0 )
		isIntegerValue = false;
	else if (psCount > 1 || expS.indexOf(jsvPlusSign) > 0 )
		isIntegerValue = false;
	else if (psCount > 0 && nsCount > 0 )
		isIntegerValue = false;
	else if (!signed && isSigned)
		isIntegerValue = false;

	if (isIntegerValue) {
		var remainingChars = JSV_stripCharacters(expS, jsvDigits + jsvNegativeSign + jsvPlusSign);
		isIntegerValue = (remainingChars.length == 0);
	}

	return isIntegerValue;
}

function JSV_isFloat(expF) {
	var isFloatValue = true,
		expS = expF.toString();

	if (JSV_occurs(expS, jsvDecimalPointDelimiter) != 1 ||
			JSV_occurs(expS, jsvNegativeSign) > 1 ||
			expS.indexOf(jsvNegativeSign) > 0 ) {
		isFloatValue = false;
	}
	else {
		var remainingChars = JSV_stripCharacters(expS, jsvDigits + jsvNegativeSign + jsvDecimalPointDelimiter);
		isFloatValue = ( (remainingChars.length == 0) ? true : false );
	}

	return isFloatValue;
}

/* -------------------------------------------------------------------------- */
/* Author: Aaron Weiss                                                        */
/* Column: Tricks with Scripts                                                */
/* Article: Significant Digits                                                */
/* Date: June 4, 1998                                                         */
/* URL: http://www.internetworld.com/daily/tips/1998/06/0401-math.html        */
/* -------------------------------------------------------------------------- */

// Required operation for JSV_round
function significantDigits(expV, digits, round) {
	var divisor = Math.pow(10,digits);
	return ( round ? Math.round(expV*divisor) : Math.floor(expV*divisor) )/divisor;
}

// Required operation for JSV_numberFormat and JSV_numberTruncate
function printDigits(expV, digits, round) {
	// Convert number value into string value
	var numberString = '' + significantDigits(expV, digits, round);
	if (numberString.indexOf('.') == -1) numberString += jsvDecimalPointDelimiter;
	var zeroPadding = digits + numberString.indexOf('.') + 1;
	return ( zeroPadding >= 0 ? numberString.padR(zeroPadding, "0") : numberString );
}

function JSV_round(value, precision) {
	return significantDigits(value, precision, true);
}

function JSV_truncate(value, precision) {
	return significantDigits(value, precision, false);
}

function JSV_numberFormat(value, precision) {
	return printDigits(value, precision, true);
}

function JSV_numberTruncate(value, precision) {
	return printDigits(value, precision, false);
}

function JSV_decToBin(expD) {
	return expD.toString(2);
}

function JSV_decToOct(expD) {
	return expD.toString(8);
}

function JSV_decToHex(expD) {
	return expD.toString(16);
}

function JSV_binToDec(expB) {
	return parseInt(expB, 2);
}

function JSV_octToDec(expO) {
	return parseInt(expO, 8);
}

function JSV_hexToDec(expH) {
	return parseInt(expH, 16);
}

function JSV_ordinalSuffix(expCN, suffixOnly) {
	var suffix = '',
		CNS = expCN.toString();
	if (JSV_ordinalSuffix.arguments[1] == null) suffixOnly = false;
	if (CNS.length != 0) {
		var lastDigit = CNS.charAt(CNS.length-1);
		suffix = "th";
		if (lastDigit == '1')
			suffix = "st";
		else if (lastDigit == '2')
			suffix = "nd";
		else if (lastDigit == '3')
			suffix = "rd";

		// Numbers between 11 and 19 always end in 'th'
		if (CNS.length > 1) {
			suffix = ( (CNS.substring(CNS.length-2,CNS.length-1) == '1') ? "th" : suffix );
		}
	}
	return ( suffixOnly ? suffix : CNS + suffix );
}

function JSV_dollarFormat(expD) {
	var dollars = JSV_round(expD,2);
	if (dollars < 0) dollars = '(' + Math.abs(dollars) + ')';
	return dollars;
}

/* -------------------------------------------------------------------------- */
/* Author: Martin Webb                                                        */
/* URL: http://www.irt.org                                                    */
/* Original Function: Comma()                                                 */
/* -------------------------------------------------------------------------- */

function JSV_commaFormat(number) {
	number = '' + number;
	var number_with_commas = number;
	var delimiter = '' + ( JSV_commaFormat.arguments[1] == null ? ',' : JSV_commaFormat.arguments[1] );
	if (number.length > 3) {
		var i = 0, loopCounter = Math.floor(number.length/3);
		var mod = number.length % 3;
		var number_with_commas = (mod > 0 ? number.substring(0,mod) : '');
		for (i=0; i<loopCounter; i++) {
			number_with_commas += (
				( mod == 0 && i == 0 ? '' : delimiter ) + 
				number.substring(mod + 3 * i, mod + 3 * i + 3)
			);
		}
	}
	return number_with_commas;
}

