function AddClass(aElement,aClass) {
  aElement.className = aElement.className.addClass(aClass);
  return true;
}
function RemoveClass(aElement,aClass) {
  aElement.className = aElement.className.removeClass(aClass);
  return true;
}
String.prototype.addClass = function(aClass) {
  if (this != "") {
    if (!this.classExists(aClass)) {
      return this + " " + aClass;
    }
  }
  else {
    return aClass;
  }
  return this;
}
String.prototype.Trim = function(){
  return this.replace(/^\s*|\s*$/g,'');
}
String.prototype.classExists = function(aClass) {
  var zRegExp = new RegExp('(^|\\s)' + aClass + '\\b');
  return zRegExp.test(this);
}
String.prototype.removeClass = function(aClass) {
  var zRegExp = new RegExp('(^|\\s)' + aClass + '\\b');
  return this.replace(zRegExp, '').Trim();
}
function UniqueVar(){
  return 'u'+ ((new Date().valueOf()) + Math.round(Math.random()*1000000));
}
Array.prototype.append = function () {
  var i;
  for (i=0; i < arguments.length; i++) {
    this[this.length] = arguments[i];
  }
}
if(!Array.push){
  Array.prototype.push = Array.prototype.append;
}
if(!Array.forEach){
  Array.prototype.forEach = function (fnExec , oThis ) {
    var i,l;
    var zProperty = '__forEachFunc__'+ UniqueVar();
    oThis = oThis || window;
    oThis[zProperty] = fnExec;
    for (i=0, l=this.length; i < l; i++) {
      oThis[zProperty](this[i], i, this);
    }
    oThis[zProperty] = null;
  }
}
if(!Array.indexOf){
  Array.prototype.indexOf = function (vItem , iStart ) {
    var i,l;
    if (iStart == null) {
      iStart = 0;
    }
    for (i=iStart, l=this.length; i < l; i++) {
      if (this[i] == vItem) {
        return i;
      }
    }
    return -1;
  }
}
Array.Copy = function(aArray){
  var i,zResult = [];
  for(i=0;i<aArray.length;i++){
    zResult.push(aArray[i]);
  }
  return zResult;
}
function getAbsolutePosition(aElement){
  var zReturn = { x:aElement.offsetLeft, y:aElement.offsetTop };
  if(aElement.offsetParent) {
    var tmp = getAbsolutePosition(aElement.offsetParent);
    zReturn.x += tmp.x;
    zReturn.y += tmp.y;
  }
  return zReturn;
}
function $(){
  if (arguments.length == 1){ return get$(arguments[0]); }
  var i,zElements = [];
  for(i=0;i< arguments.length;i++){
    zElements.push(get$(arguments[i]));
  }
  function get$(el){
    return (typeof el == 'string' ? document.getElementById(el):el);
  }
  return zElements;
}
// written by Dean Edwards, 2005
// with input from Tino Zijdel, Matthias Miller, Diego Perini

// http://dean.edwards.name/weblog/2005/10/add-event/

function addEvent(element, type, handler) {
  if (element.addEventListener) {
    element.addEventListener(type, handler, false);
  } else {
    // assign each event handler a unique ID
    if (!handler.$$guid) handler.$$guid = addEvent.guid++;
    // create a hash table of event types for the element
    if (!element.events) element.events = {};
    // create a hash table of event handlers for each element/event pair
    var handlers = element.events[type];
    if (!handlers) {
      handlers = element.events[type] = {};
      // store the existing event handler (if there is one)
      if (element["on" + type]) {
        handlers[0] = element["on" + type];
      }
    }
    // store the event handler in the hash table
    handlers[handler.$$guid] = handler;
    // assign a global event handler to do all the work
    element["on" + type] = handleEvent;
  }
};
// a counter used to create unique IDs
addEvent.guid = 1;

function removeEvent(element, type, handler) {
  if (element.removeEventListener) {
    element.removeEventListener(type, handler, false);
  } else {
    // delete the event handler from the hash table
    if (element.events && element.events[type]) {
      delete element.events[type][handler.$$guid];
    }
  }
};

function handleEvent(event) {
  var returnValue = true;
  // grab the event object (IE uses a global event object)
  event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
  // get a reference to the hash table of event handlers
  var handlers = this.events[event.type];
  // execute each event handler
  for (var i in handlers) {
    this.$$handleEvent = handlers[i];
    if (this.$$handleEvent(event) === false) {
      returnValue = false;
    }
  }
  return returnValue;
};

function fixEvent(event) {
  // add W3C standard event methods
  event.preventDefault = fixEvent.preventDefault;
  event.stopPropagation = fixEvent.stopPropagation;
  return event;
};
fixEvent.preventDefault = function() {
  this.returnValue = false;
};
fixEvent.stopPropagation = function() {
  this.cancelBubble = true;
};
// assume: equal number of headings and content (and they are in the same order in html)
var sampleViewer = {
  sampleArray:[],
  headingContainer:null,
  navContainer:null,
  contentContainer:null,
  currentIndex:0,
  init:function(){
    var i,headingArray,j=0;
//    sampleViewer.headingContainer = $("sampleHeadingContainer");
    sampleViewer.navContainer = $("sampleNavigationContainer");
    sampleViewer.contentContainer = $("sampleContainer");

    headingArray = sampleViewer.contentContainer.getElementsByTagName('h3');
    for(i=0;i<sampleViewer.contentContainer.childNodes.length;i++){
      if(sampleViewer.contentContainer.childNodes[i].nodeType == 1 && sampleViewer.contentContainer.childNodes[i].tagName.toUpperCase() == "DIV"){
        sampleViewer.sampleArray.push({
          heading:headingArray[j],
          content:sampleViewer.contentContainer.childNodes[i]
        });
        j++;
      }
    }
    if(sampleViewer.sampleArray.length>0){
      sampleViewer.createNavigation();
      sampleViewer.show();
    }
  },
  createNavigation:function(){
    var controls    = $("sampleNavigationContainer");
    var linkPrev    = document.createElement('a');
    var linkNext    = document.createElement('a');
    var pageNumber  = document.createElement('span');
    
    linkPrev.id = "sampleViewerLinkPrevious";
    linkPrev.className = "sampleViewerLink";
    linkPrev.innerHTML = "&lt; previous";
    linkPrev.href = "void(0);";
    pageNumber.id = "sampleViewerPageNumber";
    pageNumber.innerHTML = " | 0 of 0 | ";
    linkNext.id = "sampleViewerLinkNext";
    linkNext.className = "sampleViewerLink";
    linkNext.innerHTML = "next &gt;";
    linkNext.href = "void(0);";

    controls.appendChild(linkPrev);
    controls.appendChild(pageNumber);
    controls.appendChild(linkNext);

    addEvent(linkPrev,"click",sampleViewer.previous);
    addEvent(linkNext,"click",sampleViewer.next);    
  },
  show:function(){
    sampleViewer.sampleArray.forEach(function(sample,i){
      if(sampleViewer.currentIndex === i){
        AddClass(sample.heading,'show');
        AddClass(sample.content,'show');
      }else{
        RemoveClass(sample.heading,'show');
        RemoveClass(sample.content,'show');
      }
    });
    $("sampleViewerPageNumber").innerHTML = " | "+ (sampleViewer.currentIndex+1) +" of "+ sampleViewer.sampleArray.length +" | ";
    sampleViewer.setLinkStatus();
  },
  setLinkStatus:function(){
    if(sampleViewer.currentIndex === 0){
      AddClass($("sampleViewerLinkPrevious"),"Inactive");
    }else{
      RemoveClass($("sampleViewerLinkPrevious"),"Inactive");
    }
    if(sampleViewer.currentIndex == (sampleViewer.sampleArray.length-1)){
      AddClass($("sampleViewerLinkNext"),"Inactive");
    }else{
      RemoveClass($("sampleViewerLinkNext"),"Inactive");
    }
  },
  previous:function(e){
    sampleViewer.currentIndex--;
    if(sampleViewer.currentIndex<0){
      sampleViewer.currentIndex = 0;
    }else{
      sampleViewer.show();
    }
    e.preventDefault();
  },
  next:function(e){
    sampleViewer.currentIndex++;
    if(sampleViewer.currentIndex >= sampleViewer.sampleArray.length){
      sampleViewer.currentIndex = sampleViewer.sampleArray.length-1;
    }else{
      sampleViewer.show();
    }
    e.preventDefault();
  }
};
addEvent(window,'load',sampleViewer.init);
