/**
 * Tabbed fieldset plugin
 *
 * Copyright (c) 2007 tictoc family (tictocfamily.com)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * Version: 0.1
 */

/*
 * Call using:
 * $("form.admin").tabbed_form({tab_menu_id: 'fstabs'});
 * 
 * Or override defaults using:
 * $.fn.tabbed_form.defaults.tab_menu_id = 'tabs';
 */



// Create closure
(function($) {
	// Plugin definition
	$.fn.tabbed_form = function(options) {
		// Build main options before element iteration
		var opts = $.extend({}, $.fn.tabbed_form.defaults, options);
		
		// Iterate and reformat each matched element
		return this.each(function() {
			$this = $(this);
			
			// Build element specific options to support the metadata plugin:
			// http://docs.jquery.com/Plugins/Metadata/metadata
			var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
			
			// Add tab bar before form
			$this.before("<div id=\"" + o.tab_menu_id + "\"></div>");
			var tabs = $("#" + o.tab_menu_id);
			var show_advanced = $("fieldset.advanced", this).length == 1 ? 1 : 0;
			var tab_count = 0;
			
			// Build tab for each marked fieldset
			$("fieldset." + o.fieldset_class, this).each(function(i){
				build_tab(this, tabs);
				var tab = $($("a", tabs)[i]);
				
				if (this.className.match(/advanced/)) {
					tab.addClass("advanced");
					if (show_advanced == 0) show_advanced = 2
				}
				
				if ($(".field_error", $(this)).length > 0) {
					tab.addClass("error");
					if (tab.attr('className').match(/advanced/)) show_advanced = 1;
				}
				if (i == o.active_tab) { 
					tab.addClass("active");
					if (tab.attr('className').match(/advanced/)) show_advanced = 1;
				}
				if (i != o.active_tab) $(this).hide();
				tab_count++;
			});
			
			// Create advanced tab
			if (show_advanced == 2) {
				$("a.advanced", tabs).hide();
				tabs.append('<a href="#adv_tab">Advanced</a>');
			}
			
			// Make sure the action tab is at the end of the tab list
			$("a.tab_action").each(function(i){
		       tabs.append($(this).clone());
		       $(this).remove();
		    });
			
			// Show continue buttons
			if (o.continue_buttons && tab_count > 1) {
				$(o.button_fieldset).prepend('<a href="#' + o.tab_menu_id + '"  id="fieldset_continue_button" class="continue_buttons">Continue</a>');
				$(o.button_fieldset).prepend('<a href="#' + o.tab_menu_id + '"  id="fieldset_back_button" class="continue_buttons">Back</a>');
				
				$("#fieldset_back_button").hide();
				$("#fieldset_continue_button").click(function(){
					$.fn.tabbed_form.switch_tabs($("#fstabs a")[1]);
				});
				$("input:submit", $(o.button_fieldset)).hide();
			}
			
			$("a",tabs[0]).not($("a.add",tabs)).click($.fn.tabbed_form.switch_tabs);
		});
	};
	
	
	//
	// Private functions
	//
	
	// Build tab
	function build_tab(fs, tabs) {
		var l = $("legend", fs);
		var n = $("a",tabs).not($("a.add",tabs)).length;
		tabs.append('<a href="#tab'+ n +'" id="fstab'+ n +'" class="fstab">' + l.text() + '</a>');
		l.hide();
	};
	
	// Show debug info
	function debug($obj) {
		if (window.console && window.console.log) {
			window.console.log('Selection count: ' + $obj.size());
		}
	};
	
	
	//
	// Public functions
	//
	
	// Add tab
	$.fn.tabbed_form.add_tab = function(fs) {
		var tabs = $("#" + $.fn.tabbed_form.defaults.tab_menu_id);
		var l = $("legend", fs);
		var n = $("a",tabs).not($("a.add",tabs)).length;
		var tab = '<a href="#tab'+ n +'" class="active" id="fstab'+ n +'" class="fstab">' + l.text() + '</a>';
		$("a.add:last", tabs).before(tab);
        $("#fstab"+ n).click($.fn.tabbed_form.switch_tabs);
        $("#fstab"+ n).trigger("click");
	}
	
	// Switch tabs
	$.fn.tabbed_form.switch_tabs = function(_this) {
		if (!_this.href) { _this = this; }
		
		if (_this.href.match(/#adv_tab/)) {
			var t = $("#fstabs a:hidden")[0];
			$("#fstabs a:hidden").show();
			$(_this).hide();
			_this = t;
		}
		
		var t1 = $.fn.tabbed_form.defaults.active_tab;
		var t2 = _this.href.match(/#tab(\d)$/i);
		
		if (t2) {
		    t2 = parseInt(t2[1]);
			if (t1 != t2) {
                $("#fstabs a").removeClass("active");
                $("#fstabs #fstab"+t2).addClass("active");
                
                $($("fieldset.tabbed")[t1]).hide();
				$($("fieldset.tabbed")[t2]).show();
				$($("fieldset.tabbed legend")[t2]).hide();
				$.fn.tabbed_form.defaults.active_tab = t2
			}
		}
		
		// Show/hide continue buttons
		if ($("#fieldset_continue_button").length > 0) {
			var tc = $("#fstabs a:visible").length - 1;
			
			$("input:submit", $($.fn.tabbed_form.defaults.button_fieldset)).hide();
			$("#fieldset_back_button").unbind().hide();
			$("#fieldset_continue_button").unbind().hide();
			
			if (t2 == tc) {
				$("#fieldset_back_button").show().click(function(){
					$.fn.tabbed_form.switch_tabs($("#fstabs a")[t2-1]);
				});
				$("input:submit", $($.fn.tabbed_form.defaults.button_fieldset)).show();
			} else if (t2 == 0){	
				$("#fieldset_continue_button").show().click(function(){
					$.fn.tabbed_form.switch_tabs($("#fstabs a")[t2+1]);
				});
			} else {
				$("#fieldset_back_button").show().click(function(){
					$.fn.tabbed_form.switch_tabs($("#fstabs a")[t2-1]);
				});
				$("#fieldset_continue_button").show().click(function(){
					$.fn.tabbed_form.switch_tabs($("#fstabs a")[t2+1]);
				});
			}
		}
		return false;
	}
	
	
	// Defaults
	$.fn.tabbed_form.defaults = {
		tab_menu_id: 'fstabs',
		fieldset_class: 'tabbed',
		adv_fieldset_class: 'advanced',
		continue_buttons: false,
		button_fieldset: 'fieldset.buttons',
		active_tab: 0
	};
//
// end of closure
//
})(jQuery);
