(function(){
	
var instance = null;

var TranslationManager = this.TranslationManager = new Class({
	
	Implements: [Options, Storage, Events],
	
	options: {
		url: '/translation/domain/',
		lang: 'en'
	},

	initialize: function(options){
		if (instance) return instance;
		instance = this;
		this.setOptions(options);
	},
	
	load: function(resource, composite){
		if (!this.retrieve(resource)) {
			TranslationManager[composite || 'static'].bind(this, resource)();
		}
		return this;
	},
	
	setLanguage: function(lang){
		this.options.lang = lang;
	},
	
	setDomain: function(domain){
		this.domain = domain;
	},
	
	_read: function(result){
		if ($chk(result)) {
			this.store(this.domain, result.data);
		}
	},
	
	translate: function(message, domain){
		var resource = this.retrieve(domain || this.domain);
		return resource ? resource[message] || message : message;
	},
	
	dump: function(domain){
		return this.retrieve(domain || this.domain);
	},
	
	_failure: function(){
		throw new Error('There was an error loading Translation resource `' + this.domain + '` could not be loaded.');
	}
	
});

TranslationManager.request = function(resource){
	var loader = Controller.getInstance().ajax.getWrapper('json');
	loader.setOption('method', 'get').addEvents({
		'success': function(){
			this.domain = resource;
			this._read.apply(this, arguments);
		}.bind(this),
		'failure': this._failure.bind(this),
		'complete': this.fireEvent.pass('load', this)
	});
	loader.execute(this.options.lang + this.options.url + resource);
};

TranslationManager.static = function(resource){
	this.domain = resource;
	if ('translations' in window) {
		var result = {data: translations[resource]};
		this._read(result);
	}
};

TranslationManager.prototype._ = TranslationManager.prototype.translate;

})();