var ulSelectClass = Class.create();
ulSelectClass.prototype = {
	//Properties
	ulselect: null,
	uloptions: null,
	hiddeninput: null,
	selectedIndex: null,
	value: null,
	
	//Constructor
	initialize: function(el) {
		this.ulselect = el;
		this.uloptions = document.createElement('ul');
		this.hiddeninput = document.createElement('input');
		this.initializeOptions();
		this.initializeHiddenInput();
		this.initializeOnBlur();
		$A(this.ulselect.getElementsByTagName('li')).each(this.findSelected.bind(this));
		if (!this.selectedIndex)
		{
			this.selectedIndex = 0;
			this.selectOption(this.ulselect.getElementsByTagName('li')[0], 0);
		}
		$A(this.ulselect.getElementsByTagName('li')).each(this.selectOption.bind(this));
		this.initializeSelect();
	},
	
	//Methods
	initializeOptions: function() {
		Element.addClassName(this.uloptions, 'form_options');
		Element.hide(this.uloptions);
		this.uloptions.innerHTML = this.ulselect.innerHTML;
		this.uloptions.style.position = 'absolute';
		this.uloptions.style.zIndex = 100;
		document.body.appendChild(this.uloptions);
		$A(this.uloptions.getElementsByTagName('li')).each(this.observeOptions.bind(this));
	},
	initializeHiddenInput: function() {
		this.hiddeninput.type = 'hidden';
		this.ulselect.parentNode.insertBefore(this.hiddeninput,this.ulselect);
	},
	initializeOnBlur: function() {
		Event.observe(document.body, 'click', this.onBlur.bind(this), false);
		Event.observe(window, 'blur', this.onBlur.bind(this), false);
	},
	initializeSelect: function() {
		Event.observe(this.ulselect, 'click', this.clickSelect.bind(this), false);
	},
	clickSelect: function (e) {
		var el = Event.element(e);
		if (typeof(el.blur) == 'function')
			el.blur();
		var tmp = Position.cumulativeOffset(this.ulselect); //Get its coords.
		this.uloptions.style.top = (tmp[1]+Element.getHeight(this.ulselect))+'px';
		this.uloptions.style.left = tmp[0]+'px';
		Element.toggle(this.uloptions);
		Event.stop(e);
	},
	clickOption: function (e) {
		var el = Event.handler(e, 'li');
		this.selectedIndex = $A(this.uloptions.getElementsByTagName('li')).indexOf(el);
		if (this.selectedIndex > 0) {
			$A(this.ulselect.getElementsByTagName('li')).each(this.selectOption.bind(this));
			Element.hide(this.uloptions);
			Event.stop(e);
			var qsParams = 'return=' + document.location.href + '&lang=' + (this.selectedIndex);
			document.location.href='/languageSwitcher.asp?' + qsParams;
		}
	},
	onBlur: function (e) {
		Element.hide(this.uloptions);
	},
	observeOptions: function (node) {
		Event.observe(node, 'click', this.clickOption.bind(this), false);
		if (document.all)
		{
			Event.observe(node, 'mouseover', this.hoverOption.bind(this), false);
			Event.observe(node, 'mouseout', this.hoverOption.bind(this), false);
		}
	},
	selectOption: function (node, index) {
		if (this.selectedIndex == index)
		{
			Element.show(node);
			this.hiddeninput.value = index;
			Element.addClassName(node, 'selected');
		}
		else
		{
			Element.hide(node);
			Element.removeClassName(node, 'selected');
		}
	},
	findSelected: function (node, index) {
		$A(node.getElementsByTagName('a')).each(function (node) {node.href="javascript:void(0);";});
		if (Element.hasClassName(node, 'selected'))
		{
			Element.show(node);
			this.hiddeninput.value = index;
			this.selectedIndex = index;
		}
		else if (node)
		{
			Element.hide(node);
			Element.removeClassName(node, 'selected');
		}
	},
	hoverOption: function (e) {
		var el = Event.handler(e, 'li');
		if (Element.hasClassName(el, 'over') && e.type == 'mouseout')
			Element.removeClassName(el, 'over');
		else if (e.type == 'mouseover')
			Element.addClassName(el, 'over');
	}
}

//instantiate and use the object 
var ulSelectClass_Rules = {
	'ul.form_select' : function(el) {
		new ulSelectClass (el);
	}
}
Behaviour.register(ulSelectClass_Rules);
