$.fn.categories = function(options) {		
	options = $.extend({
		container: '#Categories' + Math.floor(Math.random()*11),
		max: null,
		model: 'ListingCategory',
		field: 'ListingCategory',
		label: 'Categories',
		note: null,
		existing: []
	}, options);

	options.type = $(this).attr('method').toLowerCase();
	if(options.type == 'get') {
		var fieldName = options.field;
	} else {
		var fieldName = 'data['+options.model+']['+options.field+']';
	}
	
	var 	
		that = this,
		inputId = options.model+options.field,
		input = '<input type="text" name="'+fieldName+'" id="'+inputId+'">',
		inputDiv = $('<div class="input text"><label for="'+inputId+'">'+options.label+'</label></div>').append(input),
		input = $('input', inputDiv),
		hiddenInput = $('<input type="hidden" name="'+fieldName+'[]" value="">'),
		ul = $('<ul class="selected_categories"></ul>'),
		selectedCategories = 0
	;

	$(options.container).append(inputDiv, hiddenInput, ul);
	
	if(options.note) {
		$(options.container).prepend('<p class="note category_message">'+options.note+'</p>');
	}
	
	input.autocomplete('/listing_categories/json', {
		multiple: false,
		dataType: "json",
		formatItem: function(item) {
			return item.name;
		},
		parse: function(data) {
			return $.map(data, function(row) {
				return {
					data: row,
					value: row.id,
					result: row.name
				}
			});
		}
	}).result(function(e, item) {
		addItem(item);
	});
	
	function addItem(item) {
		selectedCategories += 1;
		var li = '<li><a data-itemId="'+item.id+'" href="javascript:;">(delete)</a> ' + item.name + '</li>';

		ul
			.append(li)
			.after('<input class="cat_value" type="hidden" name="'+fieldName+'[]" value="'+item.id+'">')
		input.val('');	
		
		if(options.max && selectedCategories >= options.max) {
			input.attr('disabled', 'disabled').css('background', '#ddd');
			$('label', options.container).css('color', '#555');
			$('.category_message span', options.container).css('color', 'red');
			input.blur();
		}
	}
	
	function removeItem(itemId, link) {
		$('.cat_value[value="'+itemId+'"]', that).remove();
		$(link).parents('li:first').remove();
		selectedCategories -= 1;
		
		if(options.max && selectedCategories < options.max) {
			input.removeAttr('disabled').css('background', 'white');
			$('label', options.container).css('color', 'black');
			$('.category_message span', options.container).css('color', 'black');
		}
	}

	$('.selected_categories a').live('click', function() {
		removeItem($(this).attr('data-itemId'), this);
		return false;
	});
	
	$(options.existing).each(function() {
		addItem(this);
	})
	return that;
}
