var BCzIndexLog  = new Array(); // zIndex
var BCstatusLog  = new Array(); // hidden / visible

// Function: baseChange()
// Alter the style/properties of an object

function baseChange(objectID, objectAction, setValue) {

  var thisObject    = document.getElementById(objectID);

  if( typeof(thisObject) == "object" ) {

    switch(objectAction) {
    case 'index':
    // Change the zIndex of the object to setValue
    // If no set value is specified, use previous
    // If no previous value is available, do nothing ...
      useIndex      = (setValue != null && typeof(setValue) == "number") ? setValue : BCzIndexLog[objectID];
      if( typeof(useIndex) == "number" ) {
        // Set the new zIndex value
        thisObject.style.zIndex  = useIndex;
        BCzIndexLog[objectID]    = useIndex; // log this value
        return true;
      } // ! got a value to set?
    return false;
    break;
    case 'status':
    // Change the visibility of an object to either show or hide
    // If no set value is specified, use previous
    // If no previous value is available, do nothing ...
      useStatus     = (setValue == "visible" || setValue == "hidden") ? setValue : BCstatusLog[objectID];
      if( typeof(useStatus) == "string" ) {
        // Set the new status value
        thisObject.style.visibility  = useStatus;
        BCstatusLog[objectID]        = useStatus;
        return true;
      } // ! got a value to set?
    return false;
    break;
    case 'shift':
    // Shift the position of an element based on setValue
    // Because top/left is most common, the values are: L T R B
    // If no value is passed, nothing is done ...
      var objectPositions   = new Array();
      setValue              = setValue + ''; // make sure setValue is a string

      objectPositions       = setValue.split(' ');
      var objectPosLeft     = objectPositions[0];
      var objectPosTop      = objectPositions[1];
      var objectPosRight    = objectPositions[2];
      var objectPosBottom   = objectPositions[3];

      // Shift the position
      if( objectPosLeft != undefined ) { thisObject.style.left = objectPosLeft + 'px'; }
      if( objectPosTop != undefined ) { thisObject.style.top = objectPosTop + 'px'; }
      if( objectPosRight != undefined ) { thisObject.style.right = objectPosRight + 'px'; }
      if( objectPosBottom != undefined ) { thisObject.style.bottom = objectPosBottom + 'px'; }

      return true;

    break;
    default:
      // do nothing ...
    } // ! switch (action)

  } // ! valid object?

} // ! baseChange()



// Function: swapObjects()
// Swaps the visibility of two objects. If the objects don't have values:
// oldObject is hidden and newObject is set visible via baseChange().

var oldObjectLast;
var newObjectLast;

function swapObjects(oldObject, newObject) {

  // Use the previous objects if no objects are passed
  oldObject    = (oldObject != null) ? oldObject : oldObjectLast;
  newObject    = (newObject != null) ? newObject : newObjectLast;

  // Read the object styles
  oldElement   = document.getElementById(oldObject);
  newElement   = document.getElementById(newObject);

  if( typeof(oldElement) == "object" && typeof(newElement) == "object" ) {

    oldStatus  = oldElement.style.visibility;
    newStatus  = newElement.style.visibility;

    if( oldStatus == "" || newStatus == "" ) {
    // Never been changed before, so swap them now
      baseChange(oldObject, 'status', 'hidden');
      baseChange(newObject, 'status', 'visible');
    } else {
    // Swap the visibility values of the two objects
      oldStatusTMP = oldStatus;
      oldElement.style.visibility = newStatus;
      newElement.style.visibility = oldStatusTMP;
    } // ! change?

  } // ! valid objects?

  oldObjectLast   = oldObject;
  newObjectLast   = newObject;

} // ! swapObjects



// Function: swapNav()
// Changes the status of a nav entry and shows/hides the dropdown

var navStatus;
var navHoverColor = '#FCDC06';

function swapNav(navName, navAction, navSub) {

  navAction     = (navAction != null) ? navAction : navStatus;

  var subNavName    = 'subnav' + navName;
  var subNavObject  = document.getElementById(subNavName);
  subNavObject      = (subNavObject != undefined) ? 'object' : null;

  var selectShowObj = document.getElementById('sbox-show');
  selectShowObj     = (selectShowObj != undefined) ? 'object' : null;

  var selectEpiObj  = document.getElementById('sbox-episode');
  selectEpiObj      = (selectEpiObj != undefined) ? 'object' : null;

  var selectLocObj  = document.getElementById('sbox-state');
  selectLocObj      = (selectLocObj != undefined) ? 'object' : null;

  switch(navAction) {
  case 'show':
  // Activate the nav using swapObjects() and baseChange()
  // Also ensure that on sub-menus the navHoverColor stays on
    // 1. Set the primary navigation to on
    var navMaster     = 'nav' + navName;
    var navSlave      = 'nav' + navName + 'roll';
    swapObjects(navMaster, navSlave);

    // 2. If there is a sub-nav, activate it
    if( subNavObject == "object" ) {
      baseChange(subNavName, 'status', 'visible');
      // 3. If this is a sub-nav entry, keep the primary nav lit


      // 3. If there are any select boxes to hide (Internet Explorer fix)
      if( selectShowObj == "object" ) {
        document.getElementById('sbox-show').style.visibility = 'hidden';
      }
      if( selectEpiObj == "object" ) {
        document.getElementById('sbox-episode').style.visibility = 'hidden';
      }
      if( selectLocObj == "object" ) {
        document.getElementById('sbox-state').style.visibility = 'hidden';
      }

    } // ! valid subNav?

  navStatus = 'hide'; // this will be the action to do next
  break;
  default:
  // Default behaviour is hiding the nav
    // 1. Set the primary navigation to off
    swapObjects();

    // 2. If there is a sub-nav, de-activate it
    if( subNavObject == "object" ) {
      baseChange(subNavName, 'status', 'hidden');
      document.getElementById('navlink' + navName).style.backgroundColor = '';

      // 3. If there are any select boxes to show (Internet Explorer fix)
      if( selectShowObj == "object" ) {
        document.getElementById('sbox-show').style.visibility = 'visible';
      }
      if( selectEpiObj == "object" ) {
        document.getElementById('sbox-episode').style.visibility = 'visible';
      }
      if( selectLocObj == "object" ) {
        document.getElementById('sbox-state').style.visibility = 'visible';
      }

    }

  navStatus = 'show'; // this will be the action to do next
  } // ! switch (action)

} // ! setNav

// Smooth Scrolling Script

/* Smooth scrolling
   Changes links that link to other parts of this page to scroll
   smoothly to those links rather than jump to them directly, which
   can be a little disorienting.
   
   sil, http://www.kryogenix.org/
   
   v1.0 2003-11-11
   v1.1 2005-06-16 wrap it up in an object
*/

var ss = {
  fixAllLinks: function() {
    // Get a list of all links in the page
    var allLinks = document.getElementsByTagName('a');
    // Walk through the list
    for (var i=0;i<allLinks.length;i++) {
      var lnk = allLinks[i];
      if ((lnk.href && lnk.href.indexOf('#') != -1) && 
          ( (lnk.pathname == location.pathname) ||
	    ('/'+lnk.pathname == location.pathname) ) && 
          (lnk.search == location.search)) {
        // If the link is internal to the page (begins in #)
        // then attach the smoothScroll function as an onclick
        // event handler
        ss.addEvent(lnk,'click',ss.smoothScroll);
      }
    }
  },

  smoothScroll: function(e) {
    // This is an event handler; get the clicked on element,
    // in a cross-browser fashion
    if (window.event) {
      target = window.event.srcElement;
    } else if (e) {
      target = e.target;
    } else return;

    // Make sure that the target is an element, not a text node
    // within an element
    if (target.nodeName.toLowerCase() != 'a') {
      target = target.parentNode;
    }
  
    // Paranoia; check this is an A tag
    if (target.nodeName.toLowerCase() != 'a') return;
  
    // Find the <a name> tag corresponding to this href
    // First strip off the hash (first character)
    anchor = target.hash.substr(1);
    // Now loop all A tags until we find one with that name
    var allLinks = document.getElementsByTagName('a');
    var destinationLink = null;
    for (var i=0;i<allLinks.length;i++) {
      var lnk = allLinks[i];
      if (lnk.name && (lnk.name == anchor)) {
        destinationLink = lnk;
        break;
      }
    }
    if (!destinationLink) destinationLink = document.getElementById(anchor);

    // If we didn't find a destination, give up and let the browser do
    // its thing
    if (!destinationLink) return true;
  
    // Find the destination's position
    var destx = destinationLink.offsetLeft; 
    var desty = destinationLink.offsetTop;
    var thisNode = destinationLink;
    while (thisNode.offsetParent && 
          (thisNode.offsetParent != document.body)) {
      thisNode = thisNode.offsetParent;
      destx += thisNode.offsetLeft;
      desty += thisNode.offsetTop;
    }
  
    // Stop any current scrolling
    clearInterval(ss.INTERVAL);
  
    cypos = ss.getCurrentYPos();
  
    ss_stepsize = parseInt((desty-cypos)/ss.STEPS);
    ss.INTERVAL =
setInterval('ss.scrollWindow('+ss_stepsize+','+desty+',"'+anchor+'")',10);
  
    // And stop the actual click happening
    if (window.event) {
      window.event.cancelBubble = true;
      window.event.returnValue = false;
    }
    if (e && e.preventDefault && e.stopPropagation) {
      e.preventDefault();
      e.stopPropagation();
    }
  },

  scrollWindow: function(scramount,dest,anchor) {
    wascypos = ss.getCurrentYPos();
    isAbove = (wascypos < dest);
    window.scrollTo(0,wascypos + scramount);
    iscypos = ss.getCurrentYPos();
    isAboveNow = (iscypos < dest);
    if ((isAbove != isAboveNow) || (wascypos == iscypos)) {
      // if we've just scrolled past the destination, or
      // we haven't moved from the last scroll (i.e., we're at the
      // bottom of the page) then scroll exactly to the link
      window.scrollTo(0,dest);
      // cancel the repeating timer
      clearInterval(ss.INTERVAL);
      // and jump to the link directly so the URL's right
      location.hash = anchor;
    }
  },

  getCurrentYPos: function() {
    if (document.body && document.body.scrollTop)
      return document.body.scrollTop;
    if (document.documentElement && document.documentElement.scrollTop)
      return document.documentElement.scrollTop;
    if (window.pageYOffset)
      return window.pageYOffset;
    return 0;
  },

  addEvent: function(elm, evType, fn, useCapture) {
    // addEvent and removeEvent
    // cross-browser event handling for IE5+,  NS6 and Mozilla
    // By Scott Andrew
    if (elm.addEventListener){
      elm.addEventListener(evType, fn, useCapture);
      return true;
    } else if (elm.attachEvent){
      var r = elm.attachEvent("on"+evType, fn);
      return r;
    } else {
      alert("Handler could not be removed");
    }
  } 
}

ss.STEPS = 25;

ss.addEvent(window,"load",ss.fixAllLinks);


// New Window

// Pop open a new window
function newWindow(name, url, width, height, settings) {

  if( settings == 'undefined' ) {
  // Set default settings for the new window
    settings = 'toolbar=0, menubar=0, location=0, status=0, scrollbars=0, resizable=0';
  }

  // Open the new window
  window.open(url, name, 'width=' + width + ', height=' + height + ', ' + settings);
  return false;

} // ! newWindow