$.fn.txtabs = function()
{
  var $box = this;

  switch(typeof(arguments[0]))
  {
    //{{{case "string":
    case "string":
      switch(arguments[0])
      {
        case "select":
          select(arguments[1]);
          break;
        case "remove":
          remove(arguments[1]);
          break;
        case "add":
          add(arguments[1] , arguments[2] , arguments[3] || {});
          break;
        case "size":
          return size();
          break;
        case "current":
          return current();
          break;
        case "unbind":
          unbind(arguments[1]);
          break;
        case "bind":
          bind(arguments[1] , arguments[2]);
          break;
        case "click":
          doClick(arguments[1]);
          break;
        case "getIdByIndex":
          return getIdByIndex(arguments[1]);
          break;
      }
      break;
    //}}}
    //{{{default:
    default:
      init(arguments[0] || {});
      break;
    //}}}
  }
  //{{{function init(option)
  function init(option)
  {
    var $ul = $("ul:first" , $box);
    var $div = $("> div" , $box);

    $ul.addClass("tx-tabs-title");
    $div.addClass("tx-tabs-content");

    var height = $box.height();
    $ul.height(height - 20);//20 is padding top and bottom
    $div.height(height);

    if(option.titleWidth){ $ul.width(option.titleWidth); }
    if(option.contentWidth){ $div.width(option.contentWidth); }
    if(option.titleWidth){ $div.css("margin-left" , option.titleWidth + 20); }

    $("a" , $ul).click(click);
    $("a:first" , $ul).click();
  }
  //}}}
  //{{{function click()
  function click()
  {
    var $this = $(this);
    var id = $this.attr("href");
    $("li.tx-tabs-title-selected").removeClass("tx-tabs-title-selected");
    $this.parent().addClass("tx-tabs-title-selected");

    $("div.tx-tabs-content-selected").removeClass("tx-tabs-content-selected");
    $(id).addClass("tx-tabs-content-selected");
    return false;
  }
  //}}}
  //{{{function select(target)
  function select(target)
  {
    var index;
    switch(typeof(target))
    {
      case "number":
        index = target;
        break;
      case "string":
        index = getIndexById(target);
        break;
    }
    selectByIndex(index);
  }
  //}}}
  //{{{function selectByIndex(index)
  function selectByIndex(index)
  {
    //click()を呼ばないのはunbindされた場合に、selectできなくなるため
    //$("ul:first li" , $box).eq(index).children("a").click();
    
    var id = getIdByIndex(index);

    $("li.tx-tabs-title-selected").removeClass("tx-tabs-title-selected");
    $("ul:first li" , $box).eq(index).addClass("tx-tabs-title-selected");

    $("div.tx-tabs-content-selected").removeClass("tx-tabs-content-selected");
    $("#" + id).addClass("tx-tabs-content-selected");
  }
  //}}}
  //{{{function remove(target)
  function remove(target)
  {
    var index;
    switch(typeof(target))
    {
      case "number":
        index = target;
        break;
      case "string":
        index = getIndexById(target);
        break;
    }
    removeByIndex(index);
  }
  //}}}
  //{{{function removeByIndex(index)
  function removeByIndex(index)
  {
    var id = getIdByIndex(index);
    $("ul:first li" , $box).eq(index).hide("slow" , function()
    {
      $(this).remove();
      if(index >= size() ) { index--; }
      //select(index);
      doClick(index);
    });

    $("#" + id).fadeOut("slow" , function()
    {
      $(this).remove();
    });
  }
  //}}}
  //{{{function add(id , title , option)
  function add(id , title , option)
  {
    var $li = $("ul:first li:first" , $box).clone();
    $li.removeClass("tx-tabs-title-selected").removeAttr("id").css("display" , "none");
    $li.children("a").removeAttr("id").html(title).attr("href" , "#" + id).click(click);

    //add title
    var position = option.position || 0;
    $("ul:first li" , $box).eq(position).before($li);

    //move content
    $("#" + id).addClass("tx-tabs-content").appendTo($box);
    
    //show
    if(option.select){ $li.show("slow" , function(){select(id);}); }
    else{ $li.show("slow"); }
  }
  //}}}
  //{{{function getIndexById(id)
  function getIndexById(id)
  {
    var selector = "ul:first li a:[href='#" + id + "']";
    var li = $(selector , $box).parent("li").get(0);
    var index = $("ul:first li" , $box).index(li);
    return index;
  }
  //}}}
  //{{{function getIdByIndex(index)
  function getIdByIndex(index)
  {
    var id = $("ul:first li" , $box).eq(index).children("a").attr("href").replace("#" , "");
    return id;
  }
  //}}}
  //{{{function size()
  function size()
  {
    return $("ul:first li" , $box).size();
  }
  //}}}
  //{{{function current()
  function current()
  {
    var $li = $("ul:first li.tx-tabs-title-selected" , $box);
    var id = $li.children("a").attr("href").replace("#" , "");
    var index = $("ul:first li").index($li);
    return {id:id , index:index};
  }
  //}}}
  //{{{function unbind(target)
  function unbind(target)
  {
    var index;
    switch(typeof(target))
    {
      case "number":
        index = target;
        break;
      case "string":
        index = getIndexById(target);
        break;
    }
    $("ul:first li" , $box).eq(index).children("a").unbind("click");
  }
  //}}}
  //{{{function bind(target , func)
  function bind(target , func)
  {
    var index;
    switch(typeof(target))
    {
      case "number":
        index = target;
        break;
      case "string":
        index = getIndexById(target);
        break;
    }

    var id = getIdByIndex(index);
    $("ul:first li" , $box).eq(index).children("a").click(function(){ return func(id); });
  }
  //}}}
  //{{{function doClick(target)
  function doClick(target)
  {
    var index;
    switch(typeof(target))
    {
      case "number":
        index = target;
        break;
      case "string":
        index = getIndexById(target);
        break;
    }
    $("ul:first li" , $box).eq(index).children("a").click();
  }
  //}}}
  return this;
}

