/*
* Script contains localized numeric formatting functions.
*
* DO NOT CHANGE UNLESS YOU KNOW WHAT YOU ARE DOING!
*/

// Decimal indicator.
var _numericDecimalCharacter_en_US=".";
var _numericDecimalCharacter_en_CA=".";
var _numericDecimalCharacter_fr_CA=",";
var _numericDecimalCharacter_de_DE=",";
var _numericDecimalCharacter_fr_FR=",";

// Number format charcter.
var _numericFormatCharacter_en_US=",";
var _numericFormatCharacter_en_CA=",";
var _numericFormatCharacter_fr_CA=",";
var _numericFormatCharacter_de_DE=".";
var _numericFormatCharacter_fr_FR=".";

// Format for number
var _numericRegExpNumberFormat_en_US  = new RegExp('(-?[0-9]+)([0-9]{3})');
var _numericRegExpNumberFormat_en_CA  = new RegExp('(-?[0-9]+)([0-9]{3})');
var _numericRegExpNumberFormat_fr_CA  = new RegExp('(-?[0-9]+)([0-9]{3})');
var _numericRegExpNumberFormat_de_DE  = new RegExp('(-?[0-9]+)([0-9]{3})');
var _numericRegExpNumberFormat_fr_FR  = new RegExp('(-?[0-9]+)([0-9]{3})');

// Currency Format Replacement, ${number} is replaced with actual number.
var _numericCurrencyFormat_en_US  = '$${number}';
var _numericCurrencyFormat_en_CA  = '$${number}';
var _numericCurrencyFormat_fr_CA  = '${number} $';
var _numericCurrencyFormat_de_DE  = '&euro; ${number}';
var _numericCurrencyFormat_fr_FR  = '&euro; ${number}';


// VERSION OF SCRIPT
Numeric={version:"1.0.0"};

// Validates required variables exist.
Numeric.validateObjects = function(locale) {
    
    if (typeof(eval("_numericDecimalCharacter_" + locale))== "undefined") {
        alert("Required variable not defined. Variable:[_numericDecimalCharacter_" + locale + "]");
        return false;
    }
    
    if (eval("_numericFormatCharacter_" + locale) == "undefined") {
        alert("Required variable not defined. Variable:[_numericFormatCharacter_" + locale + "]");
        return false;
    }
    
    if (eval("_numericRegExpNumberFormat_" + locale)== "undefined") {
        alert("Required variable not defined. Variable:[_numericRegExpNumberFormat_" + locale + "]");
        return false;
    }
    
    if (eval("_numericCurrencyFormat_" + locale)== "undefined") {
        alert("Required variable not defined. Variable:[_numericCurrencyFormat_" + locale + "]");
        return false;
    }
    
    return true;
}

/************************************************
DESCRIPTION: Formats a number.

PARAMETERS:
  strValue - Source string to be formatted

REMARKS: Assumes number passed is a valid
  numeric value in the rounded to 2 decimal
  places.  If not, returns original value.
*************************************************/

Numeric.formatCurrencyWithLocale = function(strValue, locale) {

    var numberValue = Numeric.formatNumberWithScaleWithLocale(strValue, 2, locale);

    var replacementString = eval("_numericCurrencyFormat_" + locale);

    return replacementString.replace('${number}', numberValue);
    
}

Numeric.formatNumberWithLocale = function(strValue, locale) {
    return Numeric.formatNumberWithScale(strValue, 2, locale);
}

Numeric.formatNumberWithScaleWithLocale = function(strValue, scale, locale) {

    var formattedNumber = strValue;

    if (!Numeric.validateObjects(locale)) {
        return formattedNumber;
    }

    if (!Numeric.isFloat(formattedNumber, eval("_numericDecimalCharacter_" + locale))) {
       return formattedNumber;
    }

    formattedNumber = new String(Numeric.roundNumberWithLocale(formattedNumber, scale, locale));

    while(eval("_numericRegExpNumberFormat_" + locale).test(formattedNumber)) {
       formattedNumber = formattedNumber.replace(eval("_numericRegExpNumberFormat_" + locale), '$1' + eval("_numericFormatCharacter_" + locale) + '$2');
    }
    
    return Numeric.padDecimalWithLocale(formattedNumber, 2, locale);
    
}

Numeric.isFloat = function(s, decimalPointDelimiter) {

    var i;
    var seenDecimalPoint = false;

    if (isEmpty(s))
       if (isFloat.arguments.length == 1) return false;
       else return (isFloat.arguments[1] == true);

    if (s == decimalPointDelimiter) return false;

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {
        // Check that current character is number.
        var c = s.charAt(i);

        if ((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
        else if (!isDigit(c)) return false;
    }

    // All characters are numbers.
    return true;
}

Numeric.roundNumberWithLocale = function(number, scale, locale) {

    if (!isFloat(number)) {
       return number;
    }

    return Math.round(number*Math.pow(10,scale))/Math.pow(10,scale);
    
}

Numeric.padDecimalWithLocale = function(number, scale, locale) {
   
    var stringNumber = number.toString();
   
    // Add decimal character to end of number if it does not exist. 
    if (stringNumber.lastIndexOf(eval("_numericDecimalCharacter_" + locale)) == -1) {
        stringNumber = stringNumber + eval("_numericDecimalCharacter_" + locale);
    }
    
    while(stringNumber.indexOf(eval("_numericDecimalCharacter_" + locale)) >= stringNumber.length-scale) {
        stringNumber = stringNumber + 0;
    }
    
    return stringNumber;
    
}
// converts a formatted decimal value to a String that represents a double
Numeric.deformatDecimalWithLocale = function(formattedNumber, locale) {
	   
    var stringNumber = formattedNumber.toString();
   
    //replace locale decimal with true decimal point (.)
    stringNumber = stringNumber.replace(eval("_numericDecimalCharacter_" + locale),".");
        
    return stringNumber;
    
}
