/* StyleSelect - Created by Istvan Jano - i386@kronet.hu - 2008 */

var styleSelect_className = "styleSelect";
var styleSelect_bodyPrefix = "&nbsp;"; // FIXME - padding
var styleSelect_shownItems = 8;
var styleSelect_itemHeight = 24;
var styleSelect_data;


styleSelect_init = function() {
	
	styleSelect_data = new Array($$('select.' + styleSelect_className).length);
	
	$$('select.' + styleSelect_className).each(function(o,i) {
		
		styleSelect_data[i] = new StyleSelect(o,i);
	});
	
	Event.observe(document.body, 'click', function(e) {
		
		for(var i = 0; i < styleSelect_data.length; i++)
			if(e.target.id != "styleSelect_" + styleSelect_data[i].index)
				styleSelect_data[i].setOpen(false);
	});
};

styleSelect_getByName = function(name) {
	
	for(var i = 0; i < styleSelect_data.length; i++) {
		if(styleSelect_data[i].name == name)
			return styleSelect_data[i];
	}
	return null;
}

var StyleSelect = Class.create();

StyleSelect.prototype = {
	initialize: function(parent,index) {
		
		if(!parent)
			return false;
		
		this.parent = Object.isString(parent) ? $(parent) : parent;
		this.index = index;
		this.id = this.parent.id;
		this.name = this.parent.name;
		this.value = this.parent.value;
		this.data = this.parent.options;
		this.className = this.parent.classNames().toString().sub(styleSelect_className,"").strip();
		this.onchange = this.parent.onchange;
		this.isOpen = false;
		this.shownItems = styleSelect_shownItems > this.data.length ? this.data.length : styleSelect_shownItems;
		this.itemHeight = styleSelect_itemHeight;
		
		this.hiddenField = Builder.node(
			'input', {
				id: this.id,
				type: 'hidden',
				name: this.name,
			//	class: 'styleSelectHidden',
				value: this.data[this.data.selectedIndex].value
			}
		);
		this.styleSelectContainer = Builder.node(
			'div', {
				className: 'styleSelectContainer styleSelectContainer_'+ this.className,
				style: 'z-index:'+ (512 - index) +';width:'+ this.parent.style.width +';'
			}
		);
		this.styleSelectBody = Builder.node(
			'div', {
				className: 'styleSelectBody styleSelectBody_'+ this.className,
				onclick: 'styleSelect_data['+index+'].toggle();',
				style: 'width:'+ this.parent.style.width +';',
				id: "styleSelect_"+index
			}
		);
		
		this.styleSelectListContainer = Builder.node(
			'div', {
				className: 'styleSelectListContainer styleSelectListContainer_'+ this.className,
				style: 'width:'+ this.parent.style.width +';height:'+ this.shownItems*this.itemHeight +'px;overflow:'+ (styleSelect_shownItems > this.data.length ? 'hidden' : 'auto') +';'
			}
		);
		
		this.styleSelectList = Builder.node(
			'ul', {
				className: 'styleSelectList'
			}
		);
		this.styleSelectListItems = new Array(this.data.length);
		
		for(var i = 0; i < this.data.length; i++) {
			
			this.styleSelectListItems[i] = Builder.node(
				'li', {
					id: 'styleSelectListItem_'+ index +'_'+ i,
					className: 'styleSelectListItem' + (i == this.data.selectedIndex ? " selected" : ""),
					onclick: 'styleSelect_data['+ index +'].itemClick('+ i +');',
					onmouseover: 'styleSelect_data['+ index +'].itemMouseOver('+ i +');',
					onmouseout: 'styleSelect_data['+ index +'].itemMouseOut('+ i +');'
				},
				this.data[i].text
			);
			
			this.styleSelectList.appendChild(this.styleSelectListItems[i]);
		}
		
		this.styleSelectListContainer.appendChild(this.styleSelectList);
		this.styleSelectContainer.appendChild(this.styleSelectBody);
		this.styleSelectContainer.appendChild(this.styleSelectListContainer);
		Element.hide(this.styleSelectListContainer);
		this.setText(this.data[this.data.selectedIndex].text);
		this.parent.up(0).insert(this.hiddenField, {position: "after"});
		this.parent.replace(this.styleSelectContainer);
		$('styleSelectListItem_'+ this.index +'_'+ this.data.selectedIndex).addClassName(""); // BUGFIX FOR IE
	},
	
	setText: function(text) {
		
		this.styleSelectBody.innerHTML = styleSelect_bodyPrefix + text; //update();
	},
	
	setValue: function(value) {
		
		this.value = value;
		this.hiddenField.value = value;
	},
	
	setSelected: function(index) {
		
		this.styleSelectListItems[this.data.selectedIndex].removeClassName("selected");
		this.styleSelectListItems[index].addClassName("selected");
		this.data.selectedIndex = index;
		this.setText(this.data[index].text);
		this.setValue(this.data[index].value);
	},
	
	setOpen: function(isOpen) {
		
		if(this.isOpen == isOpen)
			return;
		
		this.isOpen = isOpen;
		
		if(isOpen) {
			
			Effect.BlindDown(this.styleSelectListContainer, { duration: 0.3 });
			this.styleSelectListContainer.hide();
			
		} else {
			
			Effect.BlindUp(this.styleSelectListContainer, { duration: 0.3 });
			setTimeout('styleSelect_data['+ this.index +'].styleSelectListContainer.hide();',275);
		}
	},
	
	toggle: function() {
		
		this.setOpen(!this.isOpen);
	},
	
	itemClick: function(index) {
		
		if(!this.isOpen)
			return;
		
		this.toggle();
		this.setSelected(index);
		
		if(this.onchange)
			this.onchange();
	},
	
	itemMouseOver: function(index) {
		
		//this.styleSelectListItems[this.data.selectedIndex].removeClassName("selected");
		$('styleSelectListItem_'+ this.index +'_'+ index).addClassName("over");
	},
	
	itemMouseOut: function(index) {
		
		$('styleSelectListItem_'+ this.index +'_'+ index).removeClassName("over");
	}
};
