function EnhancedCategoriesPlugin() {

	this._settings = {

		expandText		: '&raquo;',

		contractText	: '&laquo;',

		leafText		: '-',

		expandImage		: '',	

		contractImage	: '',

		leafImage		: '',

		buttonColor		: '#CC0000',

		buttonWidth		: '10px',

		buttonMargin	: '0 5px 0 0',

		isButtonAfter	: false

	};

}



jQuery.extend(EnhancedCategoriesPlugin.prototype, {

	setSettings: function(newSettings) {

		jQuery.extend(this._settings, newSettings || {});

	},

	

	getSettings: function() {

		return this._settings;

	},

	

	getButtonText: function(text, image) {

		var output = '';

		if (image=='') {

			output += text;

		} else {

			output += '<img src="' + image + '" alt="' + text + '" title="' + text + '" />';

		}

		

		return output;

	}

});



jQuery(document).ready(function() {

	enhancedCategoriesPlugin = new EnhancedCategoriesPlugin();

});



jQuery.fn.enhancedCategories = function(args) { 

	var defaults = enhancedCategoriesPlugin.getSettings(); 

	jQuery.extend(defaults, args);

	

	return jQuery('li.cat-item', this).each(function() {	

		var childrenUl = jQuery(this).children('ul');

		var hasChildren = (childrenUl.length > 0);

		var button = '';

		

		// Add some padding to the RSS images

		jQuery('img', this)

			.css({	margin: '0 5px', 

					padding: '0'

				});



		// Make button text

		if (hasChildren) {

			if (defaults.contractChildren==1) {

				button += '<span class="button is_expanded" style="cursor: pointer;">';

				button += enhancedCategoriesPlugin.getButtonText(defaults.expandText, defaults.expandImage);

				button += '</span>';

			} else {

				button += '<span class="button is_contracted" style="cursor: pointer;">';

				button += enhancedCategoriesPlugin.getButtonText(defaults.contractText, defaults.contractImage);

				button += '</span>';

			}

		} else {

			button += '<span class="button" style="">';

			button += enhancedCategoriesPlugin.getButtonText(defaults.leafText, defaults.leafImage);

			button += '</span>';

		}

		

		// Add the button before or after the category

		if (defaults.isButtonAfter) {		

			if (hasChildren) {

				jQuery(this).children('ul').before(button);

			} else {

				jQuery(this).append(button);

			}			

		} else {

			jQuery(this).prepend(button);

		}

		

		// Behaviour of the category

		jQuery(this)

			.css({listStyleType: 'none'})

			.children('span.button')

				.css({ 	width: 	defaults.buttonWidth, 

						margin: defaults.buttonMargin, 

						color: 	defaults.buttonColor 

					})

				.click(function() {

						jQuery(this)

							.siblings('ul')

								.slideToggle()

							.end()

							.each(function() {

								if (jQuery(this).hasClass('is_expanded')) {

									jQuery(this)

										.html(enhancedCategoriesPlugin.getButtonText(defaults.contractText, defaults.contractImage))

										.removeClass('is_expanded')

										.addClass('is_contracted');

								} else {

									jQuery(this)

										.html(enhancedCategoriesPlugin.getButtonText(defaults.expandText, defaults.expandImage))

										.removeClass('is_contracted')

										.addClass('is_expanded');

								}

								return this;

							});

					});

					

		jQuery(this).children('ul')

			.css({ 	paddingLeft: defaults.buttonWidth });



		// Contract child categories if asked

		if (defaults.contractChildren==1) {

			jQuery(this).children('ul').hide();

		}



		return this;

	});

};