/* idTabs ~ Sean Catchpole - Version 2.2 - MIT/GPL */
(function()
{
	var dep={"jQuery":"http://code.jquery.com/jquery-latest.min.js"};
	var s;
	var init=function()
	{

	/* Options (in any order):
	
	 start (number|string)
	    Index number of default tab. ex: $(...).idTabs(0)
	    String of id of default tab. ex: $(...).idTabs("tab1")
	    default: class "selected" or index 0
	    Passing null will force it to not select a default tab
	
	 change (boolean)
	    True - Url will change. ex: $(...).idTabs(true)
	    False - Url will not change. ex: $(...).idTabs(false)
	    default: false
	
	 click (function)
	    Function will be called when a tab is clicked. ex: $(...).idTabs(foo)
	    If the function returns true, idTabs will show/hide content (as usual).
	    If the function returns false, idTabs will not take any action.
	    The function is passed four variables:
	      The id of the element to be shown
	      an array of all id's that can be shown
	      the element containing the tabs
	      and the current settings
	
	 selected (string)
	    Class to use for selected. ex: $(...).idTabs(".current")
	    default: ".selected"
	
	 event (string)
	    Event to trigger idTabs on. ex: $(...).idTabs("!mouseover")
	    default: "!click"
	    To bind multiple event, call idTabs multiple times
	      ex: $(...).idTabs("!click").idTabs("!focus")
	
	*/
		(function($)
		{
			$.fn.idTabs=function()
			{

				//Loop Arguments matching options
				var s={};
				for(var i=0;i<arguments.length;++i)
				{
					var a=arguments[i];
					switch(a.constructor)
					{
						case Object: $.extend(s,a); break;
						case Boolean: s.change=a; break;
						case Number: s.start=a; break;
						case Function: s.click=a; break;
						case String:
							if(a.charAt(0)=='.') s.selected=a;
							else if(a.charAt(0)=='!') s.event=a;
							else s.start=a;
							break;
					}
				}

				if(typeof s['return']=="function") //backwards compatible
					s.change=s['return'];
				
				return this.each(function(){ $.idTabs(this,s); }); //Chainable
			}
			$.idTabs=function(tabs,options)
			{

				//Settings
				var meta=($.metadata)?$(tabs).metadata():{};
				s=$.extend({},$.idTabs.settings,meta,options);
				
				//Play nice
				if(s.selected.charAt(0)=='.') s.selected=s.selected.substr(1);
				if(s.event.charAt(0)=='!') s.event=s.event.substr(1);
				if(s.start==null) s.start=-1; //no tab selected

				//Setup Tabs
				var showId=function()
				{
					if(s.disabled)
					{
						if(s.message!="") {alert(s.message);}
						return;
					}

					if($(this).is('.'+s.selected))
						return s.change; //return if already selected
					var id="#"+this.href.split('#')[1];
					var aList=[]; //save tabs
					var idList=[]; //save possible elements
					$("a",tabs).each(function()
					{
						if(this.href.match(/#/))
						{
							aList.push(this);
							idList.push("#"+this.href.split('#')[1]);
						}
					});

					if(s.click&&!s.click.apply(this,[id,idList,tabs,s])) return s.change;
					//Clear tabs, and hide all
      				for(i in aList) $(aList[i]).removeClass(s.selected);
					/*
					for(i in idList)
					{
						if(typeof(idList[i] ) == "string")
							$(idList[i]).hide();
						
					}
					*/
					for(i in idList)
					{
						if(typeof(idList[i]) == "function")
							continue;
							
						if(!s.isFlash)
						{
							$(idList[i]).hide();
						}
						else
						{
							$(idList[i]).flashHide();
						}
					}
					if(!s.isFlash)
					{
						$(id).show();
					}
					else
					{
						$(id).flashShow();
					}
      				//Select clicked tab and show content

					$(this).addClass(s.selected);
					
					

					/* Assign functions by class <a class='function_action'>*/
					var classes = $(this).attr('class');
					classes && $.each(classes.split(' '), function()
					{
						if(this.indexOf("function_")!=-1)
						{
							var temp_function = this.replace(/function_/, "").split(":");
							var function_name = temp_function[0];
							if(typeof(window[function_name]) == "function")
							{
								window[function_name](temp_function.slice(1));
							}
						}
					});

					return s.change; //Option for changing url
				}

    			//Bind idTabs
				var list=$("a[href*='#']",tabs).unbind(s.event,showId).bind(s.event,showId);
				list.each(function()
				{
//					$("#"+this.href.split('#')[1]).hide();
					if(!s.isFlash)
					{
						$("#"+this.href.split('#')[1]).hide();
					}
					else
					{
						$("#"+this.href.split('#')[1]).flashHide();
					}
				});

				//Select default tab
				var test=false;
				
				if((test=list.filter('.'+s.selected)).length);  //Select tab with selected class
				else if(typeof s.start=="number"&&(test=list.eq(s.start)).length);  //Select num tab
				else if(typeof s.start=="string" //Select tab linking to id
					&&(test=list.filter("[href*='#"+s.start+"']")).length);
					
				if(test)
				{
					test.removeClass(s.selected);
					test.trigger(s.event);
				}  //Select tab

				return s; //return current settings (be creative)
			}

			//Defaults
			$.idTabs.settings=
			{
				start:0,
				change:false,
				click:null,
				selected:".selected",
				event:"!click",
				disabled: false,
				message: "",
				isFlash: false
			};
			
			$.idTabs.setOptions = function(options)
			{
				if(options.disabled != undefined)
				{
					if(options.disabled)
					{

						$(".idTabs a").each(function()
						{
							if(this.href.match(/#/) && !$(this).hasClass("selected"))
							{
								$(this).addClass("disabledTab");
							}
						});
					}
					else
					{
						$(".idTabs a").each(function()
						{
							if(this.href.match(/#/))
							{
								$(this).removeClass("disabledTab");
							}
						});
					}
				}
				s = $.extend(s, options);
			};
			
  			//Version
 			$.idTabs.version = "2.2";

			//Auto-run
			$(function(){$(".idTabs").idTabs();});

		})(jQuery);
	}  //init
		
	// Check Dependencies
	var check = function(o,s)
	{
		s=s.split('.');
		while(o&&s.length)o=o[s.shift()];
		return o;
	}
	// Add Script
	var head=document.getElementsByTagName("head")[0];
	var add=function(url)
	{
		var s=document.createElement("script");
		s.type="text/javascript"; s.src=url;
		head.appendChild(s);
	}

	// Save Self
	var s=document.getElementsByTagName('script');
	var src=s[s.length-1].src;
	// Load Dependencies
	var ok=true;
	for(d in dep)
	{
		if(check(this,d)) continue;
		ok=false;
		add(dep[d]);
	}
	if(ok) return init();

	// Reload Self
	add(src);
})();
