var I18nTranslator = function(translations, options) {

    this.translations = translations;

    this.settings = jQuery.extend(I18nTranslator.defaults, options || {});
};

I18nTranslator.defaults = {
    defaultCatalogue: 'common'
};

I18nTranslator.prototype = {

    replaceParameters: function(source, params) {

        if (params !== null && params !== undefined && typeof params === 'object') {
            jQuery.each(params, function(search, replace){
                source = source.replace(search, replace);
            });
        }

        return source;
    },

    translate: function(source, params, catalogue) {

        catalogue = catalogue || this.settings.defaultCatalogue;

        logParams = [];
        for (var paramName in params) {
            if (params.hasOwnProperty(paramName)) {
                logParams.push(paramName);
            }
        }

        var logData = {
            source:    source,
            params:    logParams,
            catalogue: catalogue
        };
        jQuery(document).trigger('i18n.log', [logData]);

        if (!this.translations.hasOwnProperty(catalogue) || !this.translations[catalogue].hasOwnProperty(source)) {

            return this.replaceParameters(source, params);
        }

        return this.replaceParameters(this.translations[catalogue][source], params);
    }
};

// wrap translator functionality in anonymous function
function __(source, params, catalogue) {

    return i18nTranslator.translate(source, params, catalogue);
}
