jQuery.fn.categories_dropdown = function(config) {
	var c = {};
	$.extend(c, {
		
	}, config);
	
	var _getHiddenElementWidth = function(element) {
		var props = { position: "absolute", visibility: "hidden", display: "block" }, hiddenItemWidth = 0;
		$.swap($(element).get(0), props, function(){
			hiddenItemWidth = element.width();
		});
		return hiddenItemWidth;
	};
	
	var _renderItems = function(optgroup, container) {
		var optionsCount = optgroup.items.length, selectedIndex = (optionsCount>0)?optgroup.items[0].parentNode.parentNode.selectedIndex:-1;
		container.empty();
		$('<li>' + optgroup.label + '</li>').addClass('label').appendTo(container);
		for (var i=0;i<optionsCount;i++) {
			var li = $('<li>' + optgroup.items[i].text + '</li>').wrapInner('<a href="#' + optgroup.items[i].text + '"></a>').appendTo(container);
			if (optgroup.items[i].className != '') li.addClass(optgroup.items[i].className);
			if (optgroup.items[i].index == selectedIndex) li.addClass('selected');
			$('a', li).get(0).linkedOption = optgroup.items[i];
		}
	};
	
	var _hide = function(container) {
		if (container.is(':hidden')) return false;
		container.animate({height:0}, {duration:200, complete: function() {
			$(this).css({height:'auto', visibility:'hidden'}).removeClass('dd-visible').hide();
		}});
	};
	
	return this.each(function() {
		if (this.tagName.toLowerCase() != 'select') return false;
		var optionsCount = this.length, options = [], optgroups = [], 
			selectedIndex = this.selectedIndex, selectedItem = firstLetter = '', jThis = $(this);
		
		var thisClass = this.className;
		
		var selectBoxContainer = $('<div class="dd-select ' + thisClass + '"></div>').html('&nbsp;').addClass('dropdown'), 
			selectBoxDropDownContainer = $('<div class="dd-dropdown c-dropdown"></div>').hide(),
			resetButton = $('<span class="dd-reset">&nbsp;</span>'),
			closeButton = $('<span class="dd-close">&nbsp;</span>');
		
		selectBoxContainer.append(resetButton);
		
		$('optgroup', this).each(function(index, value) {
			var list = $('<ul class="dd-items"></ul>'), optgroup = {
				'label':this.label,
				'items':this.children
			};
			optgroups.push(optgroup);
			_renderItems(optgroup, list);
			list.appendTo(selectBoxDropDownContainer);
		});
		
		jThis.css({
			position:'absolute',
			top:'-10000px'
		});
		
		jThis.after(selectBoxContainer);
		$(document.body).append(selectBoxDropDownContainer);
		selectBoxDropDownContainer.append(closeButton);
		
		closeButton.wrap('<div style="float:left;overflow:hidden;"><div class="dd-close-container"></div><span class="dd-close-dummy">&nbsp;</span></div>');
		
		$('ul', selectBoxDropDownContainer).last().addClass('last');
		
		resetButton.click(function(e) {
			if (selectBoxContainer.hasClass('selected')) {
				jThis.trigger('dropdown-reset');
				e.stopImmediatePropagation();
				return false;
			}
		});
		
		selectBoxContainer.click(function(e) {
			var _this = $(this), o = _this.offset(), h = selectBoxDropDownContainer.height();
			
			if (selectBoxDropDownContainer.hasClass('dd-visible')) {
				_hide(selectBoxDropDownContainer);
				selectBoxContainer.removeClass('opened');
				jThis.trigger('dropdown-close');
			}
			else {
				selectBoxContainer.addClass('opened');
				o.top += (_this.outerHeight() + 1);
				o.left = (c.left)?c.left:o.left + _this.outerWidth() - selectBoxDropDownContainer.width();
				o.height = 0;
				o.visibility = 'visible';
				
				selectBoxDropDownContainer.show().css(o).animate({height:h}, {duration:200, complete: function() {
					$(this).addClass('dd-visible');
					jThis.trigger('dropdown-open');
				}});
			}
		});
		
		$(document).click(function(e){
			if (selectBoxDropDownContainer.get(0) == e.target || selectBoxContainer.get(0) == e.target || $(e.target).hasClass('label')) return false;
			selectBoxContainer.removeClass('opened');
			_hide(selectBoxDropDownContainer);
		});
		
		closeButton.click(function() {
			if (selectBoxDropDownContainer.hasClass('dd-visible')) {
				_hide(selectBoxDropDownContainer);
				selectBoxContainer.removeClass('opened');
				jThis.trigger('dropdown-close');
			}
			return false;
		});
		
		$('a', selectBoxDropDownContainer).click(function(e) {
			if (this.linkedOption) {
				jThis.get(0).selectedIndex = this.linkedOption.index;
				$('li.selected', selectBoxDropDownContainer).removeClass('selected');
				$(this).parent().addClass('selected');
				selectBoxContainer.removeClass('opened').addClass('selected');
				jThis.trigger('change');
			}
			return false;
		});
		
		this.dd_BoxContainer = selectBoxContainer;
		this.dd_DropDown = selectBoxDropDownContainer;
		
		jThis.trigger('dropdown-render');
		
		return jThis;
	});
};