/**
 * LanguageBar object
 *
 * @author Alex Ganov
 */
var LanguageBar = Class.create();
LanguageBar.prototype = {
	initialize: function(element, options) {
		this.options = Object.extend({
			defaultLang: 'OFF',
			onSwithLang: null
		}, options || {});

		this.element = $(element);
		if(typeof this.element == 'undefined') {
			throw("Target language bar element is undefined");
		}

		this.element.setStyle({
			backgroundColor: '#CC3333',
			border: '1px solid #CC3333',
			color: '#FFFFFF',
			cursor: 'pointer',
			fontFamily: 'arial,helvetica,geneva,tahoma',
			fontSize: '9px',
			marginRight: '2px',
			padding: '2px',
			textDecoration: 'none'
		});

		this.currentLang = '';
		this.languages = new Array();
		this.registerLang({
			name: 'OFF',
			dName: 'OFF', //display name
			map: '',
			rData: ''
		});
		this.registerLang({
			name: 'Кирилица Фонетика',
			dName: 'PHO',
			map: 'aAbBwWgGdDeEvVzZiIjJkKlLmMnNoOpPrRsStTuUfFhHcC`~[{]}yYxX\\|qQ',
			rData: 'аАбБвВгГдДеЕжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩъЪьЬюЮяЯ'
		});
		this.registerLang({
			name : 'Кирилица БДС',
			dName : 'BDS',
			map : 'dD/?lLhHoOeEgGpPrRxXuU.>;:kKfFmM,<iIjJwWbBnN[{\'"tTyYcCaAzZsSvVqQ]}',
			rData : 'аАбБвВгГдДеЕжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩъЪьЬюЮяЯэЭыЫ;§'
		});

		this.switchLang(this.options.defaultLang);
		this.addObservers();
	},

	addObservers: function() {
		$$('input[type=text]', 'input[type=password]', 'textarea').each(function(element) {
			element.observe('keypress', this.processKey.bind(this));
		}.bind(this));

		this.element.observe('click', this.toggleLang.bind(this));
	},

	registerLang: function(lang) {
		this.languages[lang.dName] = lang;
	},

	switchLang: function(lang) {
		if (typeof (this.languages[lang]) != 'undefined') {
			this.currentLang = this.languages[lang];
		}
		if (this.options.onSwithLang != null) {
			this.options.onSwitchLang(lang);
		}
		this.element.update(lang);
		this.element.writeAttribute('title', this.languages[lang].name);
		this.currentLangID = lang;
	},

	getNextLang: function() {
		var found = false;
		for (langID in this.languages) {
			if (typeof(this.languages[langID]) == 'function')
				continue;
			if (found == true)
				return langID;
			if (this.currentLangID == langID)
				found = true;
		}

		if (found == true)
			return 'OFF';
	},

	toggleLang: function() {
		this.switchLang(this.getNextLang());
	},

	processKey: function(event) {
		var keyCode = event.keyCode ? event.keyCode : event.charCode ? event.charCode : event.which ? event.which : void 0;
		if((event.charCode != null) && (event.charCode != keyCode))
			return;

		var charCode = String.fromCharCode(keyCode);
		var charPos = this.currentLang.map.indexOf(charCode);
		if (charPos >= 0 && !event.ctrlKey && !event.altKey) {
			var replaceChar = this.currentLang.rData.charAt(charPos);
			if (Prototype.Browser.IE) {
				window.event.keyCode = replaceChar.charCodeAt();
			} else {
				var newEvent = document.createEvent("KeyEvents");
				newEvent.initKeyEvent("keypress", true, true, document.defaultView,
					event.ctrlKey, event.altKey, event.shiftKey,
					event.metaKey, 0, replaceChar.charCodeAt(0));
				event.preventDefault();
				event.target.dispatchEvent(newEvent);
			}
		}
	}
};
