/**
 * Class: languageSelector
 * Creates the locale selector in the page header
 *
 */

if(MooTools.version == '1.11'){
	var LangSelector = new Class({
		/*
		 * Method: initialize
		 * Initialize class, build selection combo boxes and bind events on them
		 *
		 */
		initialize:function(){
			/* Bind Events */
			$('Language').removeClass('rpc').removeProperty('href');
			$('LanguageSelection').addEvent('change',this.setLangPref.bind(this));
			$('CountrySelection').addEvent('change',function(e){
				var ev = new Event(e);
				this.getCountryValues(ev.target.value);
			}.bind(this));
			$('Language').addEvent('click',this.toggleLangSelector.bindWithEvent(this));
			$('CancelLang').addEvent('click',this.toggleLangSelector.bindWithEvent(this));
			$E('a','MoreOptions').addEvent('click',this.swapLangSelector.bindWithEvent(this));
			$ES('li a','CountryList').addEvent('click',this.setCountryCode.bindWithEvent(this));
	
			this.buildComboBoxes();
			this.visible = !$('LangSelect').hasClass('Hidden');
			// Add event to close ILAL selector if user clicked outside
			document.addEvent('mousedown', this.onClickOutside.bindWithEvent(this));
			this.toggleActiveState();
		},
		/*
		 * Method: buildComboBoxes
		 * Build language selection combo boxes
		 *
		 */
		buildComboBoxes: function() {
			new Hash(headerObj.Langs.countries).buildCombo('CountrySelection');
			new Hash(headerObj.Langs.lang).buildCombo('LanguageSelection');
			new Hash(headerObj.Langs.langPref).buildCombo('LanguagePreference');
		},
		/*
		 * Method: getCountryValues
		 * Get country languages by country code
		 *
		 */
		getCountryValues:function(value){
			var url = "/ajax_services/language_location.php?country="+value;
	        new Ajax(url, {
	            method:'get',
				onRequest:function(){$('LangAjax').toggleClass('Hidden')},
	            onComplete:this.buildLangPref.bind(this)
	        }).request();
		},
		/*
		 * Method: buildLangPref
		 * building language selection from AJAX response
		 *
		 */
		buildLangPref:function(response){
			$('LangAjax').toggleClass('Hidden');
			var select = new Element('select',{
				id:'LanguageSelection',
				name:'language'
			});
		    var parts = response.split("|");
		    for(var i=0;i<parts.length;i++){
		        var p = parts[i].split(",");
		        var v = '';
				var t = '';
		        if(p != ""){
		            for(var j=0;j<p.length;j+=2){
		                v += p[j]+",";
		                t += p[j+1]+",";
		            }
		            v = v.substr(0,v.length-1);
		            t = t.substr(0,t.length-1);
		            var opt = new Element('option',{
						value:v
					}).setHTML(t);
			        select.appendChild(opt);
		        }
		    }
			$('LanguageSelection').replaceWith(select);
			$('LanguageSelection').addEvent('change',this.setLangPref.bind(this));
			if(this.LanguageIndex != undefined) $('LanguageSelection').selectedIndex = this.LanguageIndex;
		    this.setLangPref();
		},
		/*
		 * Method: setLangPref
		 * build language settings combo
		 *
		 */
		setLangPref:function(e){
			var select = new Element('select',{
				id:'LanguagePreference',
				name:'preference'
			});
		    var t = $('LanguageSelection').getChildren()[$('LanguageSelection').selectedIndex].firstChild.nodeValue;
		    var v = $('LanguageSelection').value;
		    t = t.split(',');
		    v = v.split(',');
		    for(i=0;i<v.length;i++){
		        var opt = new Element('option',{
					value:v[i]
				}).setHTML(t[i]);
		        select.appendChild(opt);
		    }
			$('LanguagePreference').replaceWith(select);
			if(this.PrefIndex != undefined) $('LanguagePreference').selectedIndex = this.PrefIndex;
		},
		/*
		 * Method: toggleLangSelector
		 * Toggle ILAL selector on/off
		 *
		 */
		toggleLangSelector:function(ev){
			ev.preventDefault();
		    $('LangSelect').toggleClass('Hidden');
			this.visible = !this.visible;
			this.toggleActiveState();
		},
		/*
		 * Method: swapLangSelector
		 * Toggle ILAL selector modes (minimal / expanded)
		 *
		 */
		swapLangSelector:function(ev){
			ev.preventDefault();
			$('CountryList').toggleClass('Hidden');
			$('LangSelectForm').toggleClass('Hidden');
		},
		/*
		 * Method: setCountryCode
		 * In minimal mode, set selected country code and submit the language selection form
		 *
		 */
		setCountryCode:function(ev){
			ev.preventDefault();
			for(el = ev.target; el.getTag() != 'li'; el = el.getParent());
			$('cCode1').value = el.getProperty('id').substr(5,el.getProperty('id').length);
			$('LangForm1').submit();
		},
		/*
		 * Method: setILALPrefs
		 * Update language flag image according to selected language
		 *
		 */
		setILALPrefs:function(CountryIndex,LanguageIndex,PrefIndex,FlagImage){
			this.LanguageIndex = LanguageIndex;
			this.PrefIndex = PrefIndex;
			$('CountrySelection').selectedIndex = CountryIndex;
			this.getCountryValues($('CountrySelection').value);
			$E('img','Language').setProperty('src',FlagImage);
		},
		onClickOutside:function(e){
			if(this.visible){
				var ev = new Event(e);
				try{
					for(el = new Element(ev.target); el.nodeName != 'BODY' && el.id != 'LangSelect' && el.id != 'Language'; el = el.parentNode);
					if(el.nodeName == 'BODY') this.toggleLangSelector(e);
				}catch(e){}
			}
		},
		toggleActiveState:function(){
			$('Language').toggleClass('On');
		}
	});
} else {
	/**
	 * Class: languageSelector
	 * Creates the locale selector in the page header
	 *
	 */
	var LangSelector = new Class({
		/*
		 * Method: initialize
		 * Initialize class, build selection combo boxes and bind events on them
		 *
		 */
		initialize:function(){
			/* Bind Events */
			$('Language').removeClass('rpc').erase('href').addEvent('click',this.toggleLangSelector.bindWithEvent(this));
			$('LanguageSelection').addEvent('change',this.setLangPref.bind(this));
			$('CountrySelection').addEvent('change',function(ev){
				this.getCountryValues($(ev.target).value);
			}.bindWithEvent(this));
			$('CancelLang').addEvent('click',this.toggleLangSelector.bindWithEvent(this));
			$('MoreOptions').getElements('a').addEvent('click',this.swapLangSelector.bindWithEvent(this));
			$('CountryList').getElements('li a').addEvent('click',this.setCountryCode.bindWithEvent(this));
			$('CountryList').show();
			$('LangSelectForm').hide();
			$('LangSelect').show();
			this.buildComboBoxes();
			this.visible = !$('LangSelect').hasClass('Hidden');
			// Add event to close ILAL selector if user clicked outside
			document.addEvent('mousedown', this.onClickOutside.bindWithEvent(this));
			this.toggleActiveState();
		},
		/*
		 * Method: buildComboBoxes
		 * Build language selection combo boxes
		 *
		 */
		buildComboBoxes: function() {
			new Hash().fromArray(headerObj.Langs.countries).buildCombo('CountrySelection');
			new Hash().fromArray(headerObj.Langs.lang).buildCombo('LanguageSelection');
			new Hash().fromArray(headerObj.Langs.langPref).buildCombo('LanguagePreference');
		},
		/*
		 * Method: getCountryValues
		 * Get country languages by country code
		 *
		 */
		getCountryValues:function(value){
			var url = "/ajax_services/language_location.php?country="+value;
	        new Request({
				url:url,
	            method:'get',
				onRequest:function(){$('LangAjax').toggle()},
	            onSuccess:this.buildLangPref.bind(this)
	        }).send();
		},
		/*
		 * Method: buildLangPref
		 * building language selection from AJAX response
		 *
		 */
		buildLangPref:function(response){
			$('LangAjax').toggle();
			var select = new Element('select',{
				id:'LanguageSelection',
				name:'language'
			});
		    var parts = response.split("|");
		    for(var i=0;i<parts.length;i++){
		        var p = parts[i].split(",");
		        var v = '';
				var t = '';
		        if(p != ""){
		            for(var j=0;j<p.length;j+=2){
		                v += p[j]+",";
		                t += p[j+1]+",";
		            }
		            v = v.substr(0,v.length-1);
		            t = t.substr(0,t.length-1);
		            var opt = new Element('option',{
						value:v
					}).set('html',t);
			        select.appendChild(opt);
		        }
		    }
			select.replaces($('LanguageSelection'));
			$('LanguageSelection').addEvent('change',this.setLangPref.bind(this));
			if($defined(this.LanguageIndex)) $('LanguageSelection').selectedIndex = this.LanguageIndex;
		    this.setLangPref();
		},
		/*
		 * Method: setLangPref
		 * build language settings combo
		 *
		 */
		setLangPref:function(e){
			var select = new Element('select',{
				id:'LanguagePreference',
				name:'preference'
			});
		    var t = $('LanguageSelection').getChildren()[$('LanguageSelection').selectedIndex].firstChild.nodeValue;
		    var v = $('LanguageSelection').value;
		    t = t.split(',');
		    v = v.split(',');
		    for(i=0;i<v.length;i++){
		        var opt = new Element('option',{
					value:v[i]
				}).set('html',t[i]);
		        select.appendChild(opt);
		    }
			select.replaces($('LanguagePreference'));
			if($defined(this.PrefIndex)) $('LanguagePreference').selectedIndex = this.PrefIndex;
		},
		/*
		 * Method: toggleLangSelector
		 * Toggle ILAL selector on/off
		 *
		 */
		toggleLangSelector:function(ev){
			ev.preventDefault();
		    $('LangSelect').toggle();
			this.visible = !this.visible;
			this.toggleActiveState();
		},
		/*
		 * Method: swapLangSelector
		 * Toggle ILAL selector modes (minimal / expanded)
		 *
		 */
		swapLangSelector:function(ev){
			ev.preventDefault();
			$('CountryList').toggle();
			$('LangSelectForm').toggle();
		},
		/*
		 * Method: setCountryCode
		 * In minimal mode, set selected country code and submit the language selection form
		 *
		 */
		setCountryCode:function(ev){
			ev.preventDefault();
			for(el = ev.target; el.get('tag') != 'li'; el = el.getParent());
			$('cCode1').value = el.get('id').substr(5,el.get('id').length);
			$('LangForm1').submit();
		},
		/*
		 * Method: setILALPrefs
		 * Update language flag image according to selected language
		 *
		 */
		setILALPrefs:function(CountryIndex,LanguageIndex,PrefIndex,FlagImage){
			this.LanguageIndex = LanguageIndex;
			this.PrefIndex = PrefIndex;
			$('CountrySelection').selectedIndex = CountryIndex;
			this.getCountryValues($('CountrySelection').value);
			$('Language').getElement('img').set('src',FlagImage);
		},
		onClickOutside:function(e){
			if(this.visible){
				var ev = new Event(e);
				try{
					for(el = new Element(ev.target); el.nodeName != 'BODY' && el.id != 'LangSelect' && el.id != 'Language'; el = el.parentNode);
					if(el.nodeName == 'BODY') this.toggleLangSelector(e);
				}catch(e){}
			}
		},
		toggleActiveState:function(){
			$('Language').toggleClass('On');
		}
	});
}

var langSelector = new LangSelector();