/*
* HYPERNAVIGATION
*/

var Hypernavigation = function(oSettings) {
	
	if (!oSettings) {
		oSettings = {};
	}
	var oConfig = $.extend({}, Hypernavigation.s_oDefaults, {
		sUrl: '',
		sVarName: 'id',
		iMaxLevels: 3
	}, oSettings);

	this.each(function() {
		
		var dThis = this;
		
		dThis.m_oOptions = oConfig;
		
		dThis._Constructor = function() {
			$(dThis).addClass('hypernavigation-root');
			dThis._InitializeEvents($(dThis));
		};
		
		dThis.OnClick = function(eEvent) {
			var jLi = $(this).closest('li');
			if (jLi.is('.active')) {
				dThis.Collapse(jLi);
			}
			else {
				dThis.Uncollapse(jLi);
			}
			return false;
		};
		
		dThis._InitializeEvents = function(jNode) {
			jNode.find('a[rel^="load"]').each(function() {
				if ($(this).parentsUntil('.hypernavigation-root').filter('ul').length < dThis.m_oOptions.iMaxLevels) {
					$(this).click(dThis.OnClick);
				}
			});
		};
		
		dThis.Collapse = function(jLi) {
			jLi.removeClass('active').find('li.active').removeClass('active');
		};
		
		dThis.Uncollapse = function(jLi) {
			jLi.addClass('active');
			if (!jLi.find('ul:first').length) {
				dThis.Load(jLi);
			}
		};
		
		dThis.Load = function(jLi) {
			var sId = (jLi.children('a:first').attr('rel').match(/^load-(.+)$/))[1];
			var oData = {};
			oData[dThis.m_oOptions.sVarName] = sId;
			jLi.addClass('loading');
			$.getJSON(dThis.m_oOptions.sUrl, oData, function(oData, sStatus) {
				var jUl = $('<ul/>');
				var iItems = oData.length;
				for (var i = 0; i < iItems; i++) {
					jUl.append('<li><a href="' + ((oData[i].link != undefined) ? oData[i].link : '#') + '"' + (oData[i].hasChildren ? ' rel="load-' + oData[i].id + '"' : '') + '>' + oData[i].name + '</a></li>');
				}
				jLi.append(jUl);
				dThis._InitializeEvents(jUl);
				jLi.removeClass('loading');
			});
		};
		
		dThis._Constructor();
		
	});

	return this;

};

Hypernavigation.SetDefaults = function(oDefaults) {
	Hypernavigation.s_oDefaults = oDefaults;
};

(function($) {
	$.fn.Hypernavigation = Hypernavigation;
})(jQuery);


