var tabberObj = Class.create();

Object.extend(tabberObj, {
	tabberAutomatic : function (tabberArgs)	{

	  /* Temporary tabber object */
	  var tempObj;

	  if (!tabberArgs) { tabberArgs = {}; }

	  /* Create a tabber object so we can get the value of classMain */
	  tempObj = new tabberObj(tabberArgs);

	  /* Find all DIV elements in the document that have class=tabber */
	  $A(document.getElementsByTagName('div')).each(function (e) {
	  /* First get an array of all DIV elements and loop through them */
	    /* Is this DIV the correct class? */
	    if (Element.hasClassName(e, 'tabber')) {
	      /* Now tabify the DIV */
	      tabberArgs.div = e;
	      e.tabber = new tabberObj(tabberArgs);
	  	}
	  })
	  return this;
	}
})

Event.observe(window,'load',tabberObj.tabberAutomatic);

/*--------------------------------------------------
  Methods for tabberObj
  --------------------------------------------------*/
tabberObj.prototype = {
	initialize:function (argsObj) {
	  var arg; /* name of an argument to override */

	  this.div = null;

	  /* Class of the main tabber div */
	  this.classMain = "tabber";

	  this.classMainLive = "tabberlive";

	  /* Class of each DIV that contains a tab */
	  this.classTab = "tabbertab";

	  /* Class to indicate which tab should be active on startup */
	  this.classTabDefault = "tabbertabdefault";

	  /* Class for the navigation UL */
	  this.classNav = "tabbernav";

	  this.classTabHide = "tabbertabhide";

	  /* Class to set the navigation LI when the tab is active, so you can
	     use a different style on the active tab.
	  */
	  this.classNavActive = "tabberactive";

	  /* Elements that might contain the title for the tab, only used if a
	     title is not specified in the TITLE attribute of DIV classTab.
	  */
	  this.titleElements = ['h2','h3','h4','h5','h6'];

	  /* Should we strip out the HTML from the innerHTML of the title elements?
	     This should usually be true.
	  */
	  this.titleElementsStripHTML = true;

	  this.removeTitle = true;

	  /* If you want to add an id to each link set this to true */
	  this.addLinkId = false;

	  this.linkIdFormat = '<tabberid>nav<tabnumberone>';

	  /* You can override the defaults listed above by passing in an object:
	     var mytab = new tabber({property:value,property:value});
	  */
	  for (arg in argsObj) { this[arg] = argsObj[arg]; }

	  /* Array of objects holding info about each tab */
	  this.tabs = new Array();

	  /* If the main tabber div was specified, call init() now */
	  if (this.div) {
	    this.init(this.div);
	    this.div = null;
	  }
	},
	init: function(e) {
	  var
	  i, i2, /* loop indices */
	  t, /* object to store info about a single tab */
	  defaultTab=0, /* which tab to select by default */
	  DOM_ul, /* tabbernav list */
	  DOM_li, /* tabbernav list item */
	  DOM_a, /* tabbernav link */
	  aId, /* A unique id for DOM_a */
	  headingElement; /* searching for text to use in the tab */

	  /* Verify that the browser supports DOM scripting */
	  if (!document.getElementsByTagName) { return false; }

	  /* If the main DIV has an ID then save it. */
	  if (e.id) {
	    this.id = e.id;
	  }

	  /* Clear the tabs array (but it should normally be empty) */
	  this.tabs.length = 0;

	  /* Loop through an array of all the child nodes within our tabber element. */
	  //alert($A(e.childNodes));
	$A(e.childNodes).each(function (e) {
	  /* First get an array of all DIV elements and loop through them */
	    /* Is this DIV the correct class? */
	    if (e.nodeType == 1 && Element.hasClassName(e, this.classTab)) {
	      /* Now tabify the DIV */
	      t = new Object();
	      t.div = e;
	      this.tabs[this.tabs.length] = t;
	      if (Element.hasClassName(e, this.classTabDefault)) {
		  	defaultTab = this.tabs.length-1;
	      }
	  	}
	  }.bind(this));

	  /* Create a new UL list to hold the tab headings */
	  DOM_ul = document.createElement("ul");
	  DOM_ul.className = this.classNav;

	  /* Loop through each tab we found */
	  for (i=0; i < this.tabs.length; i++) {
	    t = this.tabs[i];

	    t.headingText = t.div.title;

	    /* Remove the title attribute to prevent a tooltip from appearing */
	    if (this.removeTitle) { t.div.title = ''; }

	    if (!t.headingText) {

	      for (i2=0; i2<this.titleElements.length; i2++) {
		headingElement = t.div.getElementsByTagName(this.titleElements[i2])[0];
		if (headingElement) {
		  t.headingText = headingElement.innerHTML;
		  if (this.titleElementsStripHTML) {
		    t.headingText.replace(/<br>/gi," ");
		    t.headingText = t.headingText.replace(/<[^>]+>/g,"");
		  }
		  break;
		}
	      }
	    }

	    if (!t.headingText) {
	      /* Title was not found (or is blank) so automatically generate a
	         number for the tab.
	      */
	      t.headingText = i + 1;
	    }

	    /* Create a list element for the tab */
	    DOM_li = document.createElement("li");

	    /* Save a reference to this list item so we can later change it to
	       the "active" class */
	    t.li = DOM_li;

	    /* Create a link to activate the tab */
	    DOM_a = document.createElement("a");
	    DOM_a.appendChild(document.createTextNode(t.headingText));
	    DOM_a.href = "javascript:void(null);";
	    DOM_a.title = t.headingText;
	    DOM_a.onmouseover = this.navClick;

	    /* Add some properties to the link so we can identify which tab
	       was clicked. Later the navClick method will need this.
	    */
	    DOM_a.tabber = this;
	    DOM_a.tabberIndex = i;

	    /* Do we need to add an id to DOM_a? */
	    if (this.addLinkId && this.linkIdFormat) {

	      /* Determine the id name */
	      aId = this.linkIdFormat;
	      aId = aId.replace(/<tabberid>/gi, this.id);
	      aId = aId.replace(/<tabnumberzero>/gi, i);
	      aId = aId.replace(/<tabnumberone>/gi, i+1);
	      aId = aId.replace(/<tabtitle>/gi, t.headingText.replace(/[^a-zA-Z0-9\-]/gi, ''));

	      DOM_a.id = aId;
	    }

	    /* Add the link to the list element */
	    DOM_li.appendChild(DOM_a);

	    /* Add the list element to the list */
	    DOM_ul.appendChild(DOM_li);
	  }

	  /* Add the UL list to the beginning of the tabber div */
	  e.insertBefore(DOM_ul, e.firstChild);

	  /* Make the tabber div "live" so different CSS can be applied */
	  e.removeClassName(this.classMain).addClassName(this.classMainLive);

	  /* Activate the default tab, and do not call the onclick handler */
	  this.tabShow(defaultTab);

	  /* If the user specified an onLoad function, call it now. */
	  if (typeof this.onLoad == 'function') {
	    this.onLoad({tabber:this});
	  }
	  return this;
	},
	navClick : function(event) {
	  var
	  rVal, /* Return value from the user onclick function */
	  a, /* element that triggered the onclick event */
	  self, /* the tabber object */
	  tabberIndex, /* index of the tab that triggered the event */
	  onClickArgs; /* args to send the onclick function */

	  a = this;
	  if (!a.tabber) { return false; }

	  self = a.tabber;
	  tabberIndex = a.tabberIndex;
	  a.blur();

	  /* If the user specified an onClick function, call it now.
	     If the function returns false then do not continue.
	  */
	  if (typeof self.onClick == 'function') {

	    onClickArgs = {'tabber':self, 'index':tabberIndex, 'event':event};

	    /* IE uses a different way to access the event object */
	    if (!event) { onClickArgs.event = window.event; }

	    rVal = self.onClick(onClickArgs);
	    if (rVal === false) { return false; }
	  }

	  self.tabShow(tabberIndex);

	  return false;
	},
	tabHideAll : function() {
	  var i; /* counter */

	  /* Hide all tabs and make all navigation links inactive */
	  for (i = 0; i < this.tabs.length; i++) {
	    this.tabHide(i);
	  }
	},
	tabHide : function(tabberIndex) {
	  var div;

	  if (!this.tabs[tabberIndex]) { return false; }

	  /* Hide a single tab and make its navigation link inactive */
	  div = this.tabs[tabberIndex].div;

	  /* Hide the tab contents by adding classTabHide to the div */
	  if (!Element.hasClassName(div, this.classTabHide)) {
	    div.addClassName(this.classTabHide);
	  }
	  this.navClearActive(tabberIndex);
	  return this;
	},
	tabShow : function(tabberIndex) {
	  /* Show the tabberIndex tab and hide all the other tabs */
	  var div;

	  if (!this.tabs[tabberIndex]) { return false; }

	  /* Hide all the tabs first */
	  this.tabHideAll();

	  /* Get the div that holds this tab */
	  div = this.tabs[tabberIndex].div;

	  /* Remove classTabHide from the div */
	  div.removeClassName("tabbertabhide");

	  /* Mark this tab navigation link as "active" */
	  this.navSetActive(tabberIndex);

	  /* If the user specified an onTabDisplay function, call it now. */
	  if (typeof this.onTabDisplay == 'function') {
	    this.onTabDisplay({'tabber':this, 'index':tabberIndex});
	  }
	  return this;
	},
	navSetActive : function(tabberIndex) {
	  /* Set classNavActive for the navigation list item */
	  this.tabs[tabberIndex].li.className = this.classNavActive;
	  return this;
	},
	navClearActive : function(tabberIndex) {
	  /* Remove classNavActive from the navigation list item */
	  this.tabs[tabberIndex].li.className = '';
	  return this;
	}
}
