// showXMLItems jQuery plugin
// (c) 2009 Dave Stofka, Stofka Creative Ltd.  -  http://www.stofkacreative.com/
jQuery.fn.showXMLItems = function(itemSelector, options) {

	var jqOutputArea = $(this);

	// establish function settings (can be overridden by passing options to this function)
	var settings = jQuery.extend({
		xmlURL:				"/_data/catalog.xml"
		, template:			"-----"
		, count:			undefined
		, randomize:		false
	}, options);

	// go get the data
	$.ajax({
		type: "GET"
		, url: settings.xmlURL
		, dataType: "xml"
		, success: transformXML
		, error: showError
	});

	// show the data [default success function]
	function transformXML (xmlSrc) {

		var jqItemList = $(itemSelector, xmlSrc);
		var itemCount = jqItemList.length;
		
		// randomize item order if specified
		if (settings.randomize) jqItemList = shuffle(jqItemList);
		
		// limit number of items shown if so specified in the settings
		var maxItems = Math.min(settings.count || itemCount, itemCount);
		
		if (itemCount > 0) {
			// remove template whitespace
			settings.template = settings.template.replace(/\t/g, "");
			
			// loop thru each item matched by itemSelector, and generate HTML with variables interpolated per the item
			jqItemList
				.each(function(i){
					if (i < maxItems) {
						var jqItem = $(this);
						var parsedTemplate = settings.template.replace(/{([^{}]*)}/g, function (matchedStr, selector) {
							var elementSelector, attrSelector, value;
							if (selector.match(/\[.+\]$/)) {
								elementSelector = selector.replace(/ ?\[.+\]$/, "");
								attrSelector = selector.replace(/.*\[(.+)]/, "$1");
							} else {
								elementSelector = selector;
							}
							
							if (!elementSelector) {
								value = jqItem.attr(attrSelector);
							} else {
								if (!attrSelector)	value = $(elementSelector, jqItem).text();
								else				value = $(elementSelector, jqItem).attr(attrSelector);
							}
							return value;
						});
						var jqItem = $(parsedTemplate);
						jqOutputArea.append(jqItem);
					}
				})
			;
		}
	}
	
	// show an error message [default error function]
	function showError (XMLHttpRequest, textStatus, errorThrown) {
		alert("XMLHttpRequest: " + XMLHttpRequest + "\ntextStatus = " + textStatus + "\nerrorThrown = " + errorThrown);
	}



	// ARRAY SHUFFLING ALGORITHM
	//+ Jonas Raoni Soares Silva
	//@ http://jsfromhell.com/array/shuffle [rev. #1]
	shuffle = function(v){
		for(var j, x, i = v.length; i; j = parseInt(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
		return v;
	};

};
