$.fn.equals = function(compareTo) {
        if (!compareTo || !compareTo.length || this.length!=compareTo.length)
{
                return false;
        }
        for (var i=0; i<this.length; i++) {
                if (this[i]!==compareTo[i]) {
                        return false;
                }
        }
        return true;

} 

jQuery.fn.customSelect = function()
{
	
//Change Layout
	jQuery(this).each(function(e)
	{
		jQuery(this).not("[multiple=multiple]").hide();
		newSelect = '<span class="custom-select ' + jQuery(this).attr("class") + '"><span class="custom-select-inner"><a href="#" class="custom-select-current">';
		newSelect += jQuery(this).find(":selected").text() + "</a><ul>";
		currentElement = jQuery(this).find("option").index(jQuery(this).find("option:selected"));
		jQuery(this).children().each(function(i)
		{
			if (i == currentElement)
				newSelect += "<li class='current'>" + jQuery(this).text() + "</li>";
			else
				newSelect += "<li>" + jQuery(this).text() + "</li>";
		});
		newSelect += "</ul></span></span>";
		jQuery(this).before(newSelect);
		
		//Fix for IE6 max-height bug
		if (jQuery(this).is(":disabled"))
		{
			jQuery(this).prev().addClass("disabled");
			jQuery(this).prev().find("a.custom-select-current").removeAttr("href");
		}
		
//Toggles dropdown on click
		jQuery(this).prev().click(function(event)
		{
			if (event.target.nodeName == "UL") return false;
			jQuery(this).not(".disabled").find("ul").toggle(
				0,
				function()
				{
					if (jQuery(this).is(':visible'))
					{
						jQuery(this).parent().css({'position': 'relative'});
						if (jQuery(this).hasClass("focused"))
						{
							//Scrolls to the current element
							jQuery(this).scrollTop(0);
							var scrollingOffset = jQuery(this).find("li.current").offset().top - jQuery(this).offset().top;
							jQuery(this).scrollTop(scrollingOffset - 50);
							
							var current = jQuery(this);
							jQuery(".custom-select ul:visible").each(function()
							{
								if (!jQuery(this).equals(current))
								{
									jQuery(this).parent().css({'position': ''});
									jQuery(this).hide();
								}
							});
						}
						else
						{
							var current = jQuery(this);
							jQuery(".custom-select ul:visible").each(function()
							{
								if (!jQuery(this).equals(current))
								{
									jQuery(this).parent().css({'position': ''});
									jQuery(this).hide();
								}
							});
						}
					}
					else
					{
						jQuery(this).parent().css({'position': ''});
					}
				}
			);
			return false;
		});
		
//Adds .focused to the focusted element
		jQuery(this).prev().find(".custom-select-current").blur(
			function()
			{
				jQuery(this).next().removeClass("focused");
			}
			).focus(function()
			{                
				jQuery(this).next().addClass("focused");
			}
		);

		
//Hover Event		
		jQuery(this).prev().find("ul li").hover(
			function()
			{
				jQuery(this).parent().find(".hovered").each(function() { jQuery(this).removeClass("hovered"); } );
				jQuery(this).addClass("hovered");
			},
			function()
			{
				jQuery(this).removeClass("hovered");
			}
		);
		
//Click Event
		jQuery(this).prev().find("ul li").each(function(i)
		{
			jQuery(this).click(function(event)
			{
				event.preventDefault();
				jQuery(this).parent().parent().find(".custom-select-current").html(jQuery(this).html());
				jQuery(this).parent().find("li").each(function()
				{
					jQuery(this).removeClass("current");
				});
				jQuery(this).addClass("current");
				jQuery(this).parent().parent().parent().next().find("option:eq(" + i + ")").attr("selected", "selected");
				jQuery(this).parent().parent().parent().next().trigger('change');
			});
		});
	});
	
//Hides the dropdowns on click somewhere on the webpage
	jQuery(document).click(function(event)
	{
		jQuery(".custom-select ul").each(function()
		{
			jQuery(this).hide();
		});
	});
	
//Keyboard events
	jQuery(document).keydown(function(e)
	{		
		//If the dropdown is opened
		jQuery(".custom-select ul.focused").each(function()
		{
			var object = jQuery(this);
			var objectParent = object.parent();
			switch(e.which)
			{
				case 37: case 38:
					//Up arrow
					object.find("li.current").each(function()
					{
						var previousElement = jQuery(this).prev();
						
						if (previousElement.length > 0)
						{
							previousElement.addClass("current");
							jQuery(this).removeClass("current");
							
							if (jQuery(this).is(":visible"))
							{
								var scrollingOffset = jQuery(this).offset().top - object.offset().top;
								var scrollingOffsetTotal = (scrollingOffset - object.height() < -jQuery(this).height()*2)?scrollingOffset - object.height() + jQuery(this).height()*4:0;
								jQuery(this).parent().scrollTop(scrollingOffsetTotal + jQuery(this).parent().scrollTop());
							}
							objectParent.find(".custom-select-current").html(object.find("li.current").html());
							objectParent.next().find("option:eq(" + object.find("li").index(object.find("li.current")) + ")").attr("selected", "selected");
						}
					});
					e.preventDefault();
					break;
				case 39: case 40:
					//Down arrow
					object.find("li.current").each(function()
					{
						var nextElement = jQuery(this).next();
						
						if (nextElement.length > 0)
						{
							nextElement.addClass("current");
							jQuery(this).removeClass("current");
							
							if (jQuery(this).is(":visible"))
							{
								var scrollingOffset = nextElement.offset().top - object.offset().top;
								var scrollingOffsetTotal = (scrollingOffset - object.height() > -jQuery(this).height()*4)?scrollingOffset - object.height() + jQuery(this).height()*4:0;
								jQuery(this).parent().scrollTop(scrollingOffsetTotal + jQuery(this).parent().scrollTop());
							}
							objectParent.find(".custom-select-current").html(object.find("li.current").html());
							objectParent.next().find("option:eq(" + object.find("li").index(object.find("li.current")) + ")").attr("selected", "selected");
						}
					});
					e.preventDefault();
					break;
				case 13:
					//Enter
					objectParent.find(".custom-select-current").html(object.find("li.current").html());
					objectParent.next().find("option:eq(" + object.find("li").index(object.find("li.current")) + ")").attr("selected", "selected");
					object.toggle();
					e.preventDefault();
					objectParent.parent().next().trigger('change');
					
					if (jQuery(this).is(":visible"))
					{
						//Scrolls to the current element
						jQuery(this).scrollTop(0);
						var scrollingOffset = jQuery(this).find("li.current").offset().top - jQuery(this).offset().top;
						jQuery(this).scrollTop(scrollingOffset - 50);
					}
					
					return false;
					break;
				case 27:
					//Escape
					object.find("li.hovered").removeClass("hovered");
					object.hide();
					break;
				case 9:
					//Tab
					object.find("li.hovered").removeClass("hovered");
					object.hide();
					break;
			}
		});
	});
}
