var IgeEventsLite = function () {}

IgeEventsLite.prototype.on = function (evtName, fn) {
	if (evtName && fn) {
		this.eventList[evtName] = this.eventList[evtName] || [];
		this.eventList[evtName].push(fn);
	}
}
	
IgeEventsLite.prototype.emit = function (evtName) {
	if (evtName) {
		this.eventList = this.eventList || [];
		var args = [];
		for (var i = 1; i < arguments.length; i++) {
			args.push(arguments[i]);
		}
		if (evtName) {
			var fnList = this.eventList[evtName];
			for (var i in fnList) {
				if (typeof fnList[i] == 'function') {
					fnList[i].apply(this, args);
				}
			}
		}
	}
}

var jquery_lang_js = function () {
	this.events = new IgeEventsLite();
	
	this.on = this.events.on;
	this.emit = this.events.emit;
	
	return this;
}

jquery_lang_js.prototype.lang = {};
jquery_lang_js.prototype.defaultLang = 'en';
jquery_lang_js.prototype.currentLang = 'en';

jquery_lang_js.prototype.run = function () {
	var langElems = $('[lang]');
	var elemsLength = langElems.length;
	
	while (elemsLength--) {
		var elem = langElems[elemsLength];
		var langElem = $(elem);
		
		if (langElem.attr('lang') == this.defaultLang) {
			if (langElem.is("input")) {
				// An input element
				switch (langElem.attr('type')) {
					case 'button':
					case 'submit':
						langElem.data('deftext', langElem.val());
					break;
				}
			} else {
				// Not an input element
				langElem.data('deftext', langElem.html());
			}
		}
	}
	
	this.change(this.currentLang);
}

jquery_lang_js.prototype.loadPack = function (packPath) {
	$('<script type="text/javascript" charset="utf-8" src="' + packPath + '" />').appendTo("head");
}
	
jquery_lang_js.prototype.change = function (lang) {
	//console.log('Changing language to ' + lang);
	if (this.currentLang != lang) { this.update(lang); }
	this.currentLang = lang;
	
	// Get the page HTML
	var langElems = $('[lang]');
	
	if (lang != this.defaultLang) {
		var elemsLength = langElems.length;
		while (elemsLength--) {
			var elem = langElems[elemsLength];
			var langElem = $(elem);
			if (langElem.data('deftext')) {
				if (langElem.is("input")) {
					// An input element
					switch (langElem.attr('type')) {
						case 'button':
						case 'submit':
							// A button or submit, change the value attribute
							var currentText = langElem.val();
							var defaultLangText = langElem.data('deftext');
							
							var newText = this.lang[lang][defaultLangText] || currentText;
							var newHtml = currentText.replace(currentText, newText);
							langElem.val(newHtml);
							
							if (currentText != newHtml) {
								langElem.attr('lang', lang);
							}
						break;
					}
				} else {
					// Not an input element
					var currentText = langElem.html();
					var defaultLangText = langElem.data('deftext');
					
					var newText = this.lang[lang][defaultLangText] || currentText;
					var newHtml = currentText.replace(currentText, newText);
					langElem.html(newHtml);
					
					if (currentText != newHtml) {
						langElem.attr('lang', lang);
					}
				}
			} else {
				//console.log('No language data for element... have you executed .run() first?');
			}
		}
	} else {
		// Restore the deftext data
		langElems.each(function () {
			var langElem = $(this);
			if (langElem.data('deftext')) {
				if (langElem.is("input")) {
					// An input element
					switch (langElem.attr('type')) {
						case 'button':
						case 'submit':
							langElem.val(langElem.data('deftext'));
						break;
					}
				} else {
					langElem.html(langElem.data('deftext'));
				}
			}
		});
	}
}

jquery_lang_js.prototype.update = function (lang) {
	this.emit('update', lang);
}
