function custom_select(target) {
	
	var self = this;
	
	var target = $(target);
	this.list = $('<ul></ul>').addClass('replacement-drop');
	var container = $('<div></div>').addClass('replacement-container').hide();
	var inner = $('<div></div>').addClass('replacement-inner');
	this.header = $('<div></div>').addClass('replacement-header');
	var doTriggers = true;
	this.showing = false;
	var loaded = false;
	var justChanged = false;
	var wrapper;
	
	this.isOldBrowser = ((window.XMLHttpRequest)?false:true);
	
	//this.isSafari = (navigator.userAgent.indexOf('Safari')?true:false);
	
	this.blurTimeout;
	this.blueTimeoutSet = false;
	
	this.selectedIndex = 0;
	
	inner.append(self.header);
	inner.append(self.list);
	
	var loaded = false;
	
	this.createSelect = function() {
		
		//if (self.isOldBrowser) return;
		
		var opts = $('option', target);
		
		if (opts.length < 1) return;
		
		container.append(inner).hide();
		container.insertAfter(target);
				
		for(var i = 0;i<opts.length;i++) {
			var li = $('<li></li>');
			if (opts[i].selected) {
				self.selectedIndex = i;
			}
			li.html(opts[i].text);
			
			li.hover(
				function() {
					$(this).addClass('optionHover');
				},
				function() {
					$(this).removeClass('optionHover');
				}
			);
			
			self.list.append(li);
			li.bind('click', {option:i}, self.changeOption);

			self.makeUnselectable(li);
		}
		
		self.header.hover(
			function() {
				$(this).addClass('selectHover');
			},
			function() {
				$(this).removeClass('selectHover');
			}
		);
		
		//self.makeUnselectable(self.header);
		self.header.bind('click', function () { 
			self.showDrop();
			$(target).trigger('focus');
		});
		
		$(target).wrap('<div></div>');
		$(target).parent().css({ overflow: 'hidden', height: '0px', position: 'relative' });
			
		$(target).bind('focus', function() {
			$(self.header).addClass('selectHover');
		}).bind('blur', function() {
			
			if (self.showing) {
				self.blurTimeoutSet = true;
				self.blurTimeout = setTimeout(function() { self.hideDrop(); $(self.header).removeClass('selectHover'); }, 300);
			} else {
				$(self.header).removeClass('selectHover');
			}
			
		}).bind('keyup', function(e) {
			
			self.doChange($(this).attr('selectedIndex'));
			
			self.focusOption(self.selectedIndex);
			
			if (e.keyCode == 32 && !self.showing) {
				self.showDrop();
			} else if ((e.keyCode == 27 || e.keyCode == 13) && self.showing) {
				self.hideDrop();
			}
			if (e.keyCode == 13) {
				return false;
			}
			
		});
		
		self.doChange(self.selectedIndex);
		container.show();
		
		$(target).bind('change', function() {
			self.doTriggers = false;
			self.doChange($(this).attr('selectedIndex'));
		});
		
		$(target).removeClass('replaceme');
	}
	
	this.changeOption = function(e) {
		
		loaded = true;
	
		if (self.blurTimeoutSet == true) {
			clearTimeout(self.blurTimeout);
			self.blurTimeoutSet = false;
		}
	
		var newoption = e.data.option;
		
		self.showDrop();
		self.doChange(newoption);
		
	}
	
	this.doChange = function(newoption) {
		
		var oldSelectedIndex = self.selectedIndex;
		
		self.selectedIndex = newoption;
				
		var lis = $('li', self.list);
		
		$(lis).removeClass('selected');
		$(lis[self.selectedIndex]).addClass('selected');
				
		var opts = $('option', target);
		
		opts[newoption].selected = true;
		
		self.header.html(opts[newoption].text);
		
		//self.justChanged = true;
				
		if ((loaded && oldSelectedIndex != self.selectedIndex) && doTriggers && !self.showing) {
			$(target).trigger('change');
		} else {
			doTriggers = true;
		}
	}
	
	this.showDrop = function() {
				
		if (!self.list.hasClass('selectOpen')) {
			
			var cs_length = custom_selects.length;
			for(var i = 0;i<cs_length;i++) {
				custom_selects[i].hideDrop();
			}
			
			self.list.addClass('selectOpen');
			var maxheight = self.list.css('max-height');
			if (self.list.height() > parseInt(maxheight)) {
				self.list.css('height', maxheight);
			}
			
			container.css('z-index', '50');
			
			self.focusOption(self.selectedIndex);
			
			self.showing = true;
			
		} else {
			self.hideDrop();
		}
			
		if (loaded)
			$(target).trigger('click');
			
		return;
		
	}
	
	this.hideDrop = function() {
		if (self.showing) {
			container.css('z-index', '5');
			self.list.removeClass('selectOpen');
			self.showing = false;
		}
		$(self.header).removeClass('selectHover');
		//$(target).trigger('change');
	}
	
	this.focusOption = function(option) {
		
		var lis = $('li', self.list);
		var lis_length = lis.length;
		
		var scrollHeight = 0;
		
		for(var i = 0; i < lis_length; i++) {
			if (i==option) {
				break;
			}
			scrollHeight += $(lis[i]).outerHeight();
		}
		
		self.list.scrollTop(scrollHeight);
			
	}
	
	this.makeUnselectable = function(el) {
		el = $(el);
		el.onselectstart = function() { return false; }; 
		el.unselectable = "on"; 
		jQuery(el).css('-moz-user-select', 'none'); 
	}
}

var custom_selects = new Array();
function start_custom_selects() {
	$('select.replaceme').each(function(i) {
		custom_selects.push(new custom_select(this));
		custom_selects[custom_selects.length-1].createSelect();
	});
}
start_custom_selects();