var TabHandler = Class.create();
TabHandler.prototype = {
  initialize: function(elements, options, observers) {
    this.elements = $(elements) || [];
    this.tabs = [];
    this.options = Object.extend({
      selectedClass: 'selectedTab',
      unselectedClass: 'unselectedTab',
      selectedClassPrefix: false,
      unselectedClassPrefix: false
    }, options || {});

    for (var i = 0; i < this.elements.length; i++) {
      var el = $(this.elements[i]);
      if (el && el.id)
      {
        var tab = new Tab(el, this.options, observers || []);

        if (tab.tab) tab.tab.onclick = this.select.bind(this, tab);
        this.tabs.push(tab);
      }
    }
  },

  select: function(tab) {
    for (var i = 0; i < this.tabs.length; i++) {
      (tab == this.tabs[i]) ? this.tabs[i].select() : this.tabs[i].unselect();
    }
  }
};

var Tab = Class.create();
Tab.prototype = {
  initialize: function(element, options, observers) {
    this.element = $(element);
    var tabId = this.element.id + "Tab";
    this.tab = $(tabId);
    this.options = options;
    this.observers = observers || [];
  },

  select: function() {
    if (this.tab) this.tab.className = this.options.selectedClass;
    this.element.style.display = 'block';
    this._notifyObservers('onSelect');
  },

  unselect: function() {
    if (this.tab) this.tab.className = this.options.unselectedClass;
    this.element.style.display = 'none';
    this._notifyObservers('onUnselect');
  },

  _notifyObservers: function(eventName) {
    var tab = this;
    this.observers.each( function(o) {
      if(o[eventName]) o[eventName](tab);
    });
  },

  addObserver: function(obs) {
    this.observers.push(obs);
  }
};

var TabCurvedEdgeObserver = Class.create();
TabCurvedEdgeObserver.prototype = {
  initialize: function (options) {
    this.options = Object.extend({
      selectedClassPrefix: false,
      unselectedClassPrefix: 'greyHeader'
    }, options);
  },

  onSelect: function(tab) {
    if (this.options.selectedClassPrefix && tab.tab)
      this._setCurvedEdges(tab, this.options.selectedClassPrefix);
  },

  onUnselect: function(tab) {
    if (this.options.unselectedClassPrefix && tab.tab)
      this._setCurvedEdges(tab, this.options.unselectedClassPrefix);
  },

  _setCurvedEdges: function(tabContainer, classPrefix) {
    var prev = (tabContainer.tab.previousSibling.nodeType == "1") ? tabContainer.tab.previousSibling : tabContainer.tab.previousSibling.previousSibling;
    var next = (tabContainer.tab.nextSibling.nodeType == "1") ? tabContainer.tab.nextSibling : tabContainer.tab.nextSibling.nextSibling;

    if (prev)
      prev.className = classPrefix + "Left";
    if (next)
      next.className = classPrefix + "Right";
  }
};
