/* idTabs ~ Sean Catchpole - Version 2.0 */

/* 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"

 action (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); if(a.start==null) s.start=-1; 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.action = 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 s = $.extend({},$.idTabs.settings,options);

    //Play nice
    //TODO: might have to replace [0] with .charAt(0)
    if(s.selected.charAt(0)=='.') s.selected=s.selected.substr(1);
    if(s.action.charAt(0)=='!') s.action=s.action.substr(1);
    
    //Setup Tabs
    var showId = function(){
      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) $(idList[i]).hide();
      //Select clicked tab and show content
      $(this).addClass(s.selected);
      $(id).show();
      return s.change; //Option for changing url
    };

    //Bind idTabs
    var list = $("a[href*='#']",tabs).unbind(s.action,showId).bind(s.action,showId);

    //Select default tab
    var test=false;
    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);
    else if((test=list.filter(s.selected)).length); //Select tab with selected class
    if(test) test.removeClass(s.selected.substr(1)).click(); //Select tab

    return s; //return current settings (be creative)
  };

  //Defaults
  $.idTabs.settings = {
    start:0,
    change:false,
    click:null,
    selected:".selected",
    action:"!click"
  };

  //Version
  $.idTabs.version = "1.1";

  //Auto-run
  $(function(){ $(".idTabs").idTabs(); });

})(jQuery);
