(function($){
	$.fn.slidemenu = function(options) {
		var defaults = {
			configURL: '',
			root: '',
			backTitle: '',
			callback: null
		}
		settings = $.extend({}, defaults, options); 
		
		var out = $.ajax({
			type: 'GET',
			url: settings.configURL,
			dataType: 'json',
			success: function () {},
			data: {},
			async: false
		});
		menus = eval(out.responseText);
		
		// apply to each element
		this.each(function () {
			var base = this;	
			var $this = $(this);
			
			this.container = null;
			$this.css("overflow-x", "hidden")
                .css("position", "relative");
			this.container = $("<div>")
				.css("width", "1580px")
				.css("position", "relative")
				.appendTo($this);

			this.renderMenu = function (menuId, depth) {
				if (depth > 1) {
					base.container.animate({ 
						left: '-=294' 
					}, 100);
				}
				
				// default to first menu if menuId is empty
				if (menuId == "")
					menuId = menus[0].id;
				
				for (var i=0; i<menus.length; i++) {
					if (menus[i].id == menuId) {
						var menu = menus[i];
						var menuFrame = $("<div>")
							.addClass("menuPanel")
							.css("width", "279px")
							.css("margin-right", "15px")
							.css("float", "left")
							.appendTo(this.container);
							
						$("<p>").html(menu.title).appendTo(menuFrame);
						var ul = $("<ul>").appendTo(menuFrame);
						for (var j=0; j<menu.items.length; j++) {
							$("<li>").html(menu.items[j].item)
								.attr("link", menu.items[j].link)
								.click(function () {
									var link = $(this).attr("link");
									if (link.substring(0, 1) == "#") {
										base.renderMenu(link.substring(1), ++depth);
									} else {
										if (typeof settings.callback == 'function') {
											settings.callback(link);
										}
									}
								}).appendTo(ul);
						}
						if (settings.backTitle != '' && depth > 1) {
							$("<li>").html(settings.backTitle)
								.addClass("back")
								.click(function () {
									base.container.animate({ 
										left: '+=294' 
									}, 100);
									menuFrame.remove();
								}).appendTo(ul);
						}
					}
				}
			}	

			this.renderMenu(settings.root, 1);
		});
		
		// return for chaining
		return this;
	}
})(jQuery);

