(function(){
	
	$.fn.samplePlans = function(options) {
		var isMethodCall = (typeof options == "string") || false;
		var args = arguments;
		if (!isMethodCall)
			var options = $.extend({}, options, {});
		
		$(this).each(function(){
			var cat = $.data(this, "samplePlans");
			if (isMethodCall && cat) {
				if (cat[options] && typeof cat[options] == "function"){
					cat[options].apply(cat, $.makeArray(args).slice(1));
				}
				return;
			} else {
				cat = new $.samplePlans(this, options);
				$.data(this, "samplePlans", cat);
			}
		});
		return this;
	};
	
	$.samplePlans = function(elem, options) {
		this.elem = elem;
		this.options = $.extend({}, $.samplePlans.defaults, options );
		this.init();
	};
	
	$.extend($.samplePlans, {
		defaults: {
			triggerSelector: ".trigger",
			contentSelector: ".content",
			activeClass: "active",
			showSpeed: 600,
			hideSpeed: 400,
			onClick: function(obj, event) {
				var toHide = undefined,
					toShow = undefined;
					
				if (obj.animate) return false;
				
				if ( $(this).parents("li").is("."+obj.options.activeClass) ) {
					toHide = $( obj.options.contentSelector, $(this).parents("li") );
				} else {
					toShow = $( obj.options.contentSelector, $(this).parents("li") );
					toHide = $( obj.options.contentSelector, $( "." + obj.options.activeClass, obj.elem ) );
				}
				
				if ( toHide != undefined && toHide.length ) {
					obj.animate = true;
					toHide = $(toHide[0]);
					toHide.parents("li").removeClass(obj.options.activeClass);
					toHide.slideUp({
						duration:obj.options.hideSpeed,
						queue:false,
						complete:function(){
							if ( toShow != undefined && toShow.length ) {
								toShow = $(toShow[0]);
								toShow.parents("li").addClass(obj.options.activeClass);
								toShow.slideDown({
									duration:obj.options.showSpeed,
									queue:false,
									complete: function(){
										obj.animate = false;
									}
								});
								
							} else {
								obj.animate = false;
							}
						}
					});
				} else if ( toShow != undefined && toShow.length ) {
					toShow = $(toShow[0]);
					toShow.parents("li").addClass(obj.options.activeClass);
					toShow.slideDown({
						duration:obj.options.showSpeed,
						queue:false,
						complete:function(){
							obj.animate=false;
						}
					});
				}
				
				return false;
			},
			
			onOptionClick: function(obj, rel, event) {
				var optionValue, targetID, targetElem;
				
				if (rel == undefined || rel == "") return;
				
				//optionValue = $(this).attr("value");
				optionValue = this.value;
				targetID = rel + "-" + optionValue;
				targetElem = $("#" + targetID);
				
				
				if (!targetElem.length) {
					
					obj.animate=true;
					var cur = $("." + obj.options.activeClass, $(this).parent().parent());
					if (cur.length) {
						cur.removeClass(obj.options.activeClass);
						cur.slideUp({
							duration:obj.options.hideSpeed,
							queue:false,
							complete:function(){
								obj.animate=false;
							}
						});
					}
					return;
				}
				
				if (!targetElem.is("." + obj.options.activeClass)) {
					
					obj.animate=true;
					var cur = $("." + obj.options.activeClass, $(this).parent().parent());
					if (cur.length) {
						cur.removeClass(obj.options.activeClass);
						cur.slideUp({
							duration:obj.options.hideSpeed,
							queue:false,
							complete:function(){
								targetElem.addClass(obj.options.activeClass);
								targetElem.slideDown({
									duration:obj.options.showSpeed,
									queue:false,
									complete: function(){
										obj.animate = false;
									}
								});
							}
						});
					} else {
						obj.animate=true;
						targetElem.addClass(obj.options.activeClass);
						targetElem.slideDown({
							duration:obj.options.showSpeed,
							queue:false,
							complete: function(){
								obj.animate = false;
							}
						});
					}
				}
			}
		},
		prototype: {
			init: function() {
				var self = this;
				this.items = $(">ul>li", this.elem);
				this.itemsCount = this.items.length;
				this.shortCircuit = false;
				this.animate = false;
				
				if (!this.itemsCount) {
					this.shortCircuit = true;
					return;
				}
				
				$(this.options.triggerSelector, this.items).bind("click", function(event){
					self.options.onClick.apply(this, [self, event]);
					return false;
				});
				
				//select
				$ ("select", $( this.options.contentSelector, this.items)).each(function(){
					$(this).bind("click", function(event){
						var rel = $(this).attr("rel");
						self.options.onOptionClick.apply(this, [self, rel, event]);
					});
					
					targetElem = $("#" + $(this).attr("rel") + "-" + this.value);
					if (targetElem.length) {
						targetElem.addClass(self.options.activeClass).show();
					}
				});
			}
		}
	});
})(jQuery);