function related_categories(internal_id, json_path, container_id, default_minimum_category_count, default_css_width, default_css_class, callback_function) {
	var __this__					= this;
	var $							= jQuery;

	this.internal_id				= internal_id;
	this.json_path					= json_path;
	this.container_id				= container_id;
	this.minimum_category_count		= default_minimum_category_count;
	this.css_width					= default_css_width;
	this.css_class					= default_css_class;
	this.callback_function			= callback_function;
	this.css_inline					= '';
	this.finalize_function;
	this.json_data;
	this.category_count;
	this.html;

	this.bootstrap = function() {
		$('#' + __this__.container_id).empty();

		$.getJSON(__this__.json_path + __this__.internal_id + '.json', function(data) {
			__this__.json_data = data;
			__this__.category_count = 0;

			if ((typeof __this__.json_data.meta_data === 'object') && (typeof __this__.json_data.meta_data.minimum_category_count === 'number')) {
				__this__.minimum_category_count = __this__.json_data.meta_data.minimum_category_count;
			}
			if ((typeof __this__.json_data.meta_data === 'object') && (typeof __this__.json_data.meta_data.css_width === 'number')) {
				__this__.css_width = __this__.json_data.meta_data.css_width;
			}
			if ((typeof __this__.json_data.meta_data === 'object') && (typeof __this__.json_data.meta_data.css_class === 'string')) {
				__this__.css_class = __this__.json_data.meta_data.css_class;
			}
			if ((typeof __this__.json_data.meta_data === 'object') && (typeof __this__.json_data.meta_data.css_inline === 'string')) {
				__this__.css_inline = __this__.json_data.meta_data.css_inline;
			}
			if ((typeof __this__.json_data.meta_data === 'object') && (typeof __this__.json_data.meta_data.finalize === 'string')) {
				eval("__this__.finalize_function = (" + __this__.json_data.meta_data.finalize + ")");
			}

			if (__this__.json_data.related_categories.length > 0) {
					__this__.html = $('<div class="suggestions"><a name="we_suggest"></a><h3></h3><div class="items"></div></div>').width(__this__.css_width);

					var heading = $( __this__.json_data.heading );
					if (heading.length > 0) {
						var heading_image = $('<div></div>').append(heading).find('img:first');
						if (heading_image.length == 1) {
							heading_image.appendTo( __this__.html.find('h3:first') );
						}
					}
					else {
						__this__.html.find('h3:first').remove();
					}

					$.each(__this__.json_data.related_categories, function(i, related_category){
						i++;	// the array is 0-based, whereas the element ids are sequenced using a 1-based naming convention.
						__this__.category_count = i;

						var item = $('<div id="item' +i+ '" class="' +__this__.css_class+ '"><a href=""><img alt="" src="http://www.serenaandlily.com/site/left/x.gif" style="border-style:none; display:block;"></a><p><a href=""></a></p></div>').appendTo( __this__.html.find('.items') );
						if (__this__.css_inline !== ''){
							item.css('cssText', __this__.css_inline);
						}

						var selectors = {
							"category_anchors"	: [['#item' + i + ' a'  , ['attr','href']]],
							"item_images"		: [['#item' + i + ' img', ['attr','src' ]]],
							"item_titles"		: [['#item' + i + ' img', ['attr','alt' ]], ['#item' + i + ' p a', ['text']]]
						};

						var values = {
							"category_anchors"	: (typeof related_category.category_url === 'undefined')? '' : related_category.category_url,
							"item_images"		: (typeof related_category.image_id     === 'undefined')? '' : ( (related_category.image_id.substr(0,2)=='./') || (related_category.image_id.substr(0,1)=='/') || (related_category.image_id.substr(0,5)=='http:') )? related_category.image_id : 'http://s7d5.scene7.com/is/image/SerenaandLily/' + related_category.image_id + '?$thumbList$',
							"item_titles"		: (typeof related_category.title        === 'undefined')? '' : related_category.title
						};

						$.each(selectors, function(key){
							if (values[key] === '') {return true;}

							$.each(selectors[key], function(j){
								var selector = selectors[key][j][0];
								var action   = selectors[key][j][1];

								if (action[0] === 'attr') {
									$(selector, __this__.html).each(function(){ $(this).attr(action[1], values[key]); });
								}
								if (action[0] === 'text') {
									$(selector, __this__.html).each(function(){ $(this).text(values[key]); });
								}
							});
						});

						if (values.item_titles === '') {
							$('#item' + i + ' p', __this__.html).remove();
						}
					});

					if ((typeof __this__.minimum_category_count === 'number') && (__this__.category_count < __this__.minimum_category_count)) {
						for (i=(__this__.category_count + 1); i <= __this__.minimum_category_count; i++) {
							$('<div id="item' +i+ '" class="item"></div>').appendTo( __this__.html.find('.items') );
						}
					}

					if (typeof __this__.finalize_function === 'function') {
						__this__.finalize_function( __this__.html );
					}

					$('#' + __this__.container_id).append(__this__.html);
			}

			if (typeof __this__.callback_function === 'function') {
				__this__.callback_function( __this__.json_data );
			}
		});
	}
}

$(document).ready(function(){
	var json_path = ( (top.location.protocol.toLowerCase() === 'file:')? '' : '/' ) + 'site/related_categories/json/';
	var container_id = 'suggestions';
	var default_minimum_category_count = 5;
	var default_css_width = 721;
	var default_css_class = 'item';

	var category_internal_id;
	var invalid_form = $('form[name=form0]');
	if (invalid_form.children().length === 0) { // FF
		category_internal_id = invalid_form.siblings().find('input[name=category]').first().attr('value');
	}
	else {
		category_internal_id = $('input[name=category]', invalid_form).first().attr('value');
	}
	category_internal_id = parseInt(category_internal_id);

	if (category_internal_id !== 'NaN'){
		if (category_internal_id < 0){ // tab
			category_internal_id = 'tab_' + (0 - category_internal_id); // filepath = "${json_path}tab_${0-category_internal_id}.json"
		}
		var my_related_categories = new related_categories(category_internal_id, json_path, container_id, default_minimum_category_count, default_css_width, default_css_class);
		my_related_categories.bootstrap();
	}
});
