function tabItem() {
  var me = this;
  var _classSelected = arguments[1];
  var _group = arguments[2];
  var _method = arguments[3];
  var _args = arguments[4];
  var _childClassSelected = arguments[5];

  this.tabEl = arguments[0];
  this.selected = false;
  this.children = null;

  this.toggle = function() {
    me.selected = !me.selected;
    me.tabEl.toggleClass(_classSelected);
  }

  this.setMethod = function () {
    _method = arguments[0];
    _args = arguments[1];
  }

  this.addChild = function() {
    if (!me.children) {
      me.children = new tabGroup(_childClassSelected, arguments[3] ? arguments.pop() : null);
    }
    me.children.add(arguments[0], arguments[1], arguments[2]);
  }

  this.tabEl.click(function() {
    if (!me.selected) {
      _group.deselect();
      me.toggle();
      _method(_args);
    }
  });
}

function tabGroup() {
  var me = this;
  var _classSelected = arguments[0];
  var _childClassSelected = arguments[1];

  this.tabs = new Array();

  this.add = function() {
    var newTabEl = arguments[0];
    var method = arguments[1];
    var args = arguments[2];
    me.tabs.push(new tabItem(newTabEl, _classSelected, me, method, args, _childClassSelected));
  }

  this.deselect = function() {
    for (var i=0; i < me.tabs.length; i++) {
      if (me.tabs[i].selected) {
        me.tabs[i].toggle();
        break;
      }
    }
  }

  this.select = function(index) {
    me.tabs[index].tabEl.click();
  }

  if (arguments[2]) {
    for (var i = 0; i < arguments[2].length; i++) {
      me.add(arguments[2][i][0], arguments[2][i][1]);
    }
  }
}
