/*
tabs.js.php

Copyright (c) Gareth Hadfield 2008
*/
var highlight_not_empty = true;
var MAX_TABS = 4;

function strip_spaces(aString){
  var result = aString.replace(/\s/g, "");
  return(result);
}

function tab_element_off(aTab){
  aTab.style.backgroundColor = "#F0F0F0";
  aTab.style.marginTop = "2px";
  aTab.style.paddingBottom = "0px";
  aTab.style.borderTop = "solid #A0A0A0 1px";
  aTab.style.marginRight = "1px";
}

function tab_element_on(aTab){
  aTab.style.backgroundColor = "#FFFFFF";
  aTab.style.marginTop = "0px";
  aTab.style.paddingBottom = "2px";
  aTab.style.borderTop = "solid orange 2px";
  aTab.style.marginRight = "0px";
}

function tab_element_adjacent(aTab){
  aTab.style.marginRight = "0px";
}

function TTab(aTabName, aTabField, aOnClick){
  this.name = aTabName;
  this.tab_id = strip_spaces(aTabName);
  this.field = aTabField;
  this.onclick = aOnClick;

  this.onClickTab = bind(this, function(){
    this.parent.show_tab(this);
    if(this.onclick != undefined){
      eval(this.onclick);
    }
  });

  this.hide = bind(this, function(){
    tab_element_off(this.tabElement);
    var atab = document.getElementById(this.tab_id);
    if(atab != undefined){
      atab.style.display = "none";
    }
  });

  this.show = bind(this, function(){
    tab_element_on(this.tabElement);
    var atab = document.getElementById(this.tab_id);
    if(atab != undefined){
      atab.style.display = "block";
    }
  });

  this.adjacent = bind(this, function(){
    tab_element_adjacent(this.tabElement);
  });
}

function TTabControl(aTabControlName){
  this.name = aTabControlName;
  this.tab_control_id = strip_spaces(aTabControlName);
  this.tabArray = new Array();

  this.activate = bind(this, function(aIndex){
    this.show_tab(this.tabArray[aIndex]);
  });

  this.previousTab = bind(this, function(){
    if(this.activeTabIndex > 0){
      this.activate(this.activeTabIndex-1);
    }
    else{
      this.activate(this.tabArray.length-1);
    }
  });

  this.nextTab = bind(this, function(){
    if(this.activeTabIndex < (this.tabArray.length-1)){
      this.activate(this.activeTabIndex+1);
    }
    else{
      this.activate(0);
    }
  });

  this.show_tab = bind(this, function(aShowTab){
    var aPrevTab = null;
    for(var i=0; i<this.tabArray.length; i++){
      var aTab = this.tabArray[i];
      if(aTab==aShowTab){
        aTab.show();
        this.activeTabIndex = i;
        if(aPrevTab!=null){
          aPrevTab.adjacent();
        }
      }
      else{
        aTab.hide();
        aPrevTab = aTab;
      }
    }
  });

  this.hide_all = bind(this, function(){
    for(var i=0; i<this.tabArray.length; i++){
      var aTab = this.tabArray[i];
      aTab.hide();
    }
  });

  this.add = bind(this, function(aTabName, aTabField, aOnClick){
    var aTab = new TTab(aTabName, aTabField, aOnClick);
    aTab.parent = this;
    this.tabArray[this.tabArray.length] = aTab;
    this.buildTD(aTab);
    return(aTab);
  });

  this.buildCSS = bind(this, function(){
    var aCssText = "";
    aCssText += '.tabs{cursor: pointer;padding: 0px;margin: 0px;margin-top: 6px;border-collapse: collapse;border: none;}';
    aCssText += '.tabs td{padding: 0px;margin: 0px;border: none;}';
    aCssText += '.tabs div{padding-left: 6px;padding-right: 6px;border-top: solid #A0A0A0 2px;border-left: solid #A0A0A0 1px;border-right: solid #A0A0A0 1px;background-color: #F0F0F0; margin-right: 1px;}'
    aCssText += '.tabs div:hover{border-top: solid orange 2px;background-color: #FFFFFF;}'

    var aStyle = document.createElement("style");
    aStyle.setAttribute("type", "text/css");
    document.getElementsByTagName("head")[0].appendChild(aStyle);

    if(IS_IE){
      aStyle.styleSheet.cssText = aCssText;
    }
    else{
      aStyle.appendChild(document.createTextNode(aCssText));
    }
  });

  this.buildTD = bind(this, function(aTab){
    var not_empty;
    if((!highlight_not_empty)||(aTab.field==undefined)){
      not_empty = "";
    }
    else{
      not_empty = " *";
    }

    var aTD = document.createElement("td");

    assert(this.TR.childNodes.length <= MAX_TABS);
    if(this.TR.childNodes.length == MAX_TABS){
      this.addTR();
    }

    this.TR.appendChild(aTD);
    var aDiv = document.createElement("div");
    aDiv.tab = aTab;
    aDiv.id = this.tab_control_id + ":" + aTab.tab_id + " Tab";
    aDiv.innerHTML = capitalise_first_letter(aTab.name)+not_empty;
    aDiv.onclick = bind(aDiv, function(){
      this.tab.onClickTab();
    });

    aTD.appendChild(aDiv);

    aTab.tabElement = aDiv;
  });

  this.buildTable = bind(this, function(){
    var aTable = document.createElement("table");
    aTable.className = "tabs";
    var aTBody = document.createElement("tbody");
    aTable.appendChild(aTBody);

    var aTR = document.createElement("tr");
    aTBody.appendChild(aTR);
    this.TR = aTR;

    return(aTable);
  });

  this.addTR = bind(this, function(){
    var aTR = document.createElement("tr");
    this.TR.parentNode.insertBefore(aTR, this.TR.nextSibling);
    this.TR = aTR;

    return(aTR);
  });

  this.init = bind(this, function(){
    this.buildCSS();

    this.mainDiv = document.createElement("div");
    this.mainDiv.appendChild(this.buildTable());
  });

  this.init();
}
