(function(window){
    "use strict";
    createNamespace('Rtk.ThIntl.Util.Locale');
    /** @constructor **/
    Rtk.ThIntl.Util.Locale = function (localeInfo){
        var commaChar   = localeInfo.commaChar,
            decimalChar = localeInfo.decimalChar,

            numberDeformatter   = new RegExp(((decimalChar === '.') ? "\\" : '') + decimalChar),
            commaDeformatter    = new RegExp(((commaChar === '.') ? "\\" : '') + commaChar, 'g'),
            numberFormatter     = new RegExp("\\."),

            monthsPattern = "JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC",

            yearParse = '(?:19|20)\\d{2}',
            yearParseTwoDigits = '(?:19|20)?\\d{2}',

            monthParseOneDigit = '(?:1[0-2]|\\d|0\\d)',
            monthParse         = '(?:1[0-2]|0\\d)',

            dayParse         = '(?:[0-2]\\d|3[0-1])',
            dayParseOneDigit = '(?:[0-2]\\d|3[0-1]|\\d)',

            yyyymmdd = new RegExp('^' + yearParse + '[^\\w\\s]?' + monthParse + '[^\\w\\s]?' + dayParse + '\\s*$'),
            ddMonthyy = new RegExp("^\\d?\\d[^\\w\\s]?(?:" + monthsPattern + ")[^\\w\\s]?\\d\\d(?:\\d\\d)?\\s*$", "i"),

            localeSpecificDateFormat = localeInfo.isDateMonthFirst
                ? new RegExp('^' + monthParseOneDigit + '[\\/.-]' + dayParseOneDigit + '[\\/.-]' + yearParseTwoDigits + '\\s*$')
                : new RegExp('^' + dayParseOneDigit + '[\\/.-]' + monthParseOneDigit + '[\\/.-]' + yearParseTwoDigits + '\\s*$');
        return {
            localeString : function(string){
                //$string =~ s/%(\d)/$substitutions[$1-1]/ge;
                var localizedString = localeInfo.strings[string] || string,
                    regex = /%(\d)/,
                    match;

                while (regex.test(localizedString)) {
                    match = regex.exec(localizedString);
                    localizedString = localizedString.replace(match[0], arguments[match[1]] || '');
                }
                return localizedString;
            },
            /**
             * @param {number} number
             * @param {number=} decimalPlaces
             */
            formatNumber : function(number, decimalPlaces){
                var digits = parseFloat(number);
                if ((typeof(decimalPlaces) === 'undefined') || (decimalPlaces === null)){
                    decimalPlaces = 2;
                }
                if (isNaN(digits)){
                    digits = '';
                } else {
                    digits = digits.toFixed(decimalPlaces).replace(numberFormatter, decimalChar);
                }
                return digits;
            },
            asNumber     : function(nString){
                var number;
                if (typeof(nString) === "number"){
                    number = nString;
                } else if ((typeof(nString) !== 'string') || (nString === '')){
                    number = NaN;
                } else {
                    number = parseFloat(nString.replace(commaDeformatter, '').replace(numberDeformatter, '.'));
                }
                return number;
            },
            validateValidDate    : function(dateString){
                if (
                    localeSpecificDateFormat.test(dateString)
                    || yyyymmdd.test(dateString)
                    || ddMonthyy.test(dateString)
                ) {
                    return true;
                } else {
                    return false;
                }
            },
            getNumberDeformatter : function(){
                return numberDeformatter;
            },
            getCommaDeformatter : function(){
                return commaDeformatter;
            },
            getDecimalChar : function(){
                return decimalChar;
            },
            getCommaChar : function(){
                return commaChar;
            }
        }
    };
})(this);

