// This function from "DOM Scripting" by Jeremy Keith 2005
// Provides background color for alternate rows of a table
// by adding a class to every other row.
function stripeTables() {
  if (!document.getElementsByTagName) return false;
  var tables = document.getElementsByTagName("table");
  for (var i=0; i<tables.length; i++) {
    var odd = false;
    var rows = tables[i].getElementsByTagName("tr");
    for (var j=0; j<rows.length; j++) {
      if (odd == true) {
        addClass(rows[j],"odd");
        odd = false;
      } else {
        odd = true;
      }
    }
  }
}

// This function from "DOM Scripting" by Jeremy Keith 2005
// Adds a class to an element
// element - the element that is to become a member of the class
// value - text string containing the name of the class
function addClass(element, value) {
  if (!element.className) {
    element.className = value;
  } else {
    newClassName = element.className;
    newClassName+= " ";
    newClassName+= value;
    element.className = newClassName;
  }
}

// This function from "DOM Scripting" by Jeremy Keith 2005
// Assigns sibling elements to a class
// tag - text string containing tag name
// theclass - text string containing class name to assign
function styleElementSiblings(tag, theclass) {
  // Sets some styles on the first element following each h1 element
  var elems = document.getElementsByTagName(tag);
  var elem_size = headers.length;
  if( !elem_size ) return false;

  for( var i=0; i < elem_size; i++ ) {
    var elem = getNextElement(elems[i].nextSibling);
	 addClass(elem, theclass);
  }
}

// This function from "DOM Scripting" by Jeremy Keith 2005
// Inserts newelement into the HTML after targetElement.
// Both arguments are elements.
function insertAfter(newElement, targetElement) {
  var parent = targetElement.parentNode;
  if( parent.lastChild == targetElement ) {
    parent.appendChild(newElement);
  } else {
    parent.insertBefore(newElement, targetElement.nextSibling);
  }
}

// This function from "DOM Scripting" by Jeremy Keith 2005
// Returns the first sibling node (starting with the one passed in)
// that is an element node.  Returns null if it can't find one.
function getNextElement(node) {
  if( node.nodeType == 1 ) {
    return node;
  }
  if( node.nextSibling ) {
    return getNextElement(node.nextSibling);
  }
  return null;
}

// Written by Simon Willison (http://simon.incutio.com/)
// Concatenates a function onto the queue of functions that are
// run once the page is loaded
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

// Written by Dustin Diaz (http://www.dustindiaz.com/getelementsbyclass/)
// node can be "document" for the entire document.
// searchClass is the class our looking for.
// tag restricts searches to a specific tag.  Use "*"
// for all tags.
function getElementsByClass(node,searchClass,tag) {
  var classElements = new Array();
  var els = node.getElementsByTagName(tag);
  var elsLen = els.length;
  var pattern = new RegExp(searchClass);
  for (i = 0, j = 0; i < elsLen; i++) {
    if ( pattern.test(els[i].className) ) {
      classElements[j] = els[i];
      j++;
    }
  }
return classElements;
}

//  Authored by Mark Eackloff December 4, 2009
//  Basically, this is a javascript version of the
//  PHP function by the same name.
//  Auguments: all numeric
//  Returns:  Boolean true if date is valid, else false;
function checkdate( month, day, year ) {

  // Check year
  if( isNaN(year) ) {
    return false;
  }

  // Check month
  if( isNaN(month) ) {
    return false;
  }

  if( month < 1 || month > 12 ) {
    return false;
  }

  var daysInMonth;

  if( month == 2 ) {
    daysInMonth = isLeapYear(Number(year)) ? 29 : 28;
  }

  if( month == 1 || month == 3 || month == 5 ||
      month == 7 || month == 8 || month == 10 ||
      month == 12 ) {
    daysInMonth = 31;
  }

  if( month == 4 || month == 6 || month == 9 ||
      month == 11 ) {
    daysInMonth = 30;
  }

  if( day < 1 || day > daysInMonth ) {
    return false;
  }

  // Check day
  if( isNaN(month) ) {
    is_ok = false;
  }
  
  return true;
}


// Authored by Mark Eackloff October 2009
function isLeapYear(year) {
  var retVal = false;
  if( year % 4 == 0 ) {
    retVal = true;
  } else {
    return false;
  }

  if( year % 100 == 0) {
    retVal = false;
  } else {
    return true;
  }

  if( year % 400 == 0) {
    return true;
  }

  return retVal;
}


function viewBackground() {
  // Remove everything but background
  var divHideArray = new Array("picture", "sitenav", "entry");
  var hideArrayLen = divHideArray.length;
  for(var i = 0; i < hideArrayLen; i++) {
    var div = document.getElementById(divHideArray[i]);
    div.style.display = "none";
  }
  var bod = document.getElementsByTagName("body");
  bod[0].style.height = "1919px";
  bod[0].style.width  = "1944px";

  // Make the background title and the goback button visible
  var divViewArray = new Array("goback", "nebulaTitle");
  var viewArrayLen = divViewArray.length;
  for(var i = 0; i < viewArrayLen; i++) {
    var div = document.getElementById(divViewArray[i]);
    div.style.display = "inherit";
  }
  return true;
}


function restoreStyles() {
  var divViewArray = new Array("picture", "sitenav", "entry");
  var viewArrayLen = divViewArray.length;
  for(var i = 0; i < viewArrayLen; i++) {
    var div = document.getElementById(divViewArray[i]);
    div.style.display = "inherit";
  }
  var bod = document.getElementsByTagName("body");
  bod[0].style.height = "inherit";
  bod[0].style.width  = "inherit";

  var divHideArray = new Array("goback", "nebulaTitle");
  var hideArrayLen = divHideArray.length;
  for(var i = 0; i < hideArrayLen; i++) {
    var div = document.getElementById(divHideArray[i]);
    div.style.display = "none";
  }
  return true;
}

