(function($) {

	var jqSelectToList = function(select, opt)
	{
		this.busy = false;

		this.opt = opt;
		this.select = select;
		this.options = $('option', this.select);

		this.createInput();
		this.createList();
		this.animateList();
	};

/********************************************************************************************************* createInput */
	jqSelectToList.prototype.createInput = function()
	{
	    var self = this;

	    $('<div id="selecttolist-div"><input type="text" readonly="readonly" id="selecttolist-input"/></div>').insertAfter($(this.select));

	    this.div = $('div#selecttolist-div');
	    this.input = $('input#selecttolist-input', this.div);

	    $(this.div).css({
		width: $(self.input).outerWidth(true),
		position: 'relative'
	    });
	};

/********************************************************************************************************* createList */
	jqSelectToList.prototype.createList = function()
	{
	    var self = this;

	    $(this.select).css({
		visibility: 'hidden',
		position: 'absolute',
		left: 0
	    });
	    
	    $(this.div).append($(this.select));
	    $(this.div).append($('<ul id="selecttolist-ul"></ul>'));
	    
	    this.ul = $('ul#selecttolist-ul', this.div);
	    
	    for(var i = 0; i < this.options.length; i++)
		$(this.ul).append($('<li id="' + $(this.options).eq(i).val() + '">' + $(this.options).eq(i).html() + '</li>'));

	    $(this.ul).css({
		display: 'none',
		position: 'absolute',
		top: $(self.input).height(),
		left: 0,
		zIndex: 100
	    });
	    this._init();
	};
	
/********************************************************************************************************* animateList */
	jqSelectToList.prototype.animateList = function()
	{
	    var self = this;

	    $('li', this.ul).mouseenter(function() { $(this).addClass('current') });
	    $('li', this.ul).mouseleave(function() { $(this).removeClass('current') });
	    
	    $(this.input).click(function() {
		if(self.busy == false) {
		    $(self.ul).slideDown(150);
		    self.busy = true;
		    return false;
		}
		if(self.busy == true) {
		    $(self.ul).slideUp(150);
		    self.busy = false;
		    return false;
		}
	    });

	    $('li', this.ul).click(function() {
		$(self.input).val($(this).html());
		$('option', self.select).attr('selected', '');
		$('option[value=' + $(this).attr('id') + ']', self.select).attr('selected', 'selected');
		$(self.ul).slideUp();
		self.busy = false;
	    });

	    $('body, html').click(function(event) {
		$(self.ul).slideUp();
		self.busy = false;
	    });
	};

/********************************************************************************************************* _init */
	jqSelectToList.prototype._init = function()
	{
	    var self = this;

	    $(this.input).val($(self.options).eq(0).html());
	    $('option', self.select).eq(0).attr('selected', 'selected');
	};

/********************************************************************************************************* fn.selectToList */
	$.fn.selectToList = function(options)
	{
		if(this.length < 1)
			return this;
		var options = $.extend($.fn.selectToList.defaults, options);
		new jqSelectToList(this, options);
		return this;
	};
	$.fn.selectToList.defaults = {};

})(jQuery);
