/* v.2.0 */

/*GENERIC FUNCTIONS*/

//Allow you to add multiple events to the onload event handler - simon willison
function addLoadEvent(func) {
 var oldonload = window.onload;
 if (typeof window.onload != 'function') {
  window.onload = func;
 } else {
  window.onload = function() {
   oldonload();
   func();
  }
 }
}

//Get elements by class name - dustin diaz
function getElementsByClass(searchClass,node,tag) {
 var classElements = new Array();
 if ( node == null )
  node = document;
 if ( tag == null )
  tag = '*';
 var els = node.getElementsByTagName(tag);
 var elsLen = els.length;
 var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
 for (i = 0, j = 0; i < elsLen; i++) {
  if ( pattern.test(els[i].className) ) {
   classElements[j] = els[i];
   j++;
  }
 }
 return classElements;
}

//Determine if a class is present on a target element
function hasClass(target, classValue) {
    var pattern = new RegExp("(^| )" + classValue + "( |$)");
    
 if (target.className.match(pattern)) {
     return true;
    } 
    
 return false;
}

//Remove a class from a target element
function removeClass(target, classValue) {
    var removedClass = target.className;
    var pattern = new RegExp("(^| )" + classValue + "( |$)");
 
    removedClass = removedClass.replace(pattern, "$1");
    removedClass = removedClass.replace(/ $/, "");
    target.className = removedClass;

    return true;
}

//Add a class to a target element
function addClass(target, classValue) {
    if (!hasClass(target, classValue)) {
        if (target.className == "") {
            target.className = classValue;
        }
        else {
            target.className += " " + classValue;
        }
    }
    return true;
}

//Makes creating arrays easier and shorter
function makeArray() {
     for (i = 0; i<makeArray.arguments.length; i++)
          this[i + 1] = makeArray.arguments[i];
}

function replaceText(dest,element,att,value,text){
 /*LOCATE DESTINATION IN HTML*/
 var textDest = document.getElementById(dest);
 /*remove old text (if an existing child node already exists)*/ 
 if (textDest.childNodes[0]) {
  textDest.removeChild(textDest.childNodes[0]);
 }
 /*MAKE NEW HTML DATA*/
 var newelmt = document.createElement(element);
 var newtext = document.createTextNode(text);
 newelmt.appendChild(newtext);
 newelmt.setAttribute(att,value);
 /*OUTPUT NEW HTML DATA TO DETINATION*/
 textDest.appendChild(newelmt); //append
 return false;
}

/*SITE SPECIFIC*/

//Makes link elements with class 'popup' open in a new browser window
function doPopups() {
  if (!document.getElementsByTagName) return false;
  var links = document.getElementsByTagName("a");
  for (var i=0; i < links.length; i++) {
    if (links[i].className.match("popup") || links[i].className.match("ext")) {
      links[i].onclick = function() {
        window.open(this.getAttribute("href"));
        return false;
      }
    }
  }
}
addLoadEvent(doPopups);

//Performs main nav rollovers in IE which due to cack CSS2 support cannot render the CSS rollovers on span elements. 
function navRollovers () {
  if (!document.getElementsByTagName) return false;
  var r = document.getElementById("nav-main").getElementsByTagName("span");  
  for (var i=0; i < r.length; i++) {
  //var pre = r[i].style.backgroundPosition; //determine bg position prior to roll
  //rollover
  r[i].onmouseover = function() {
   this.style.backgroundPosition = "-300px 0";
   return false;
  }
  //rollout
  r[i].onmouseout = function() {
   this.style.backgroundPosition = "-150px 0";
   return false;
  }
  }
}
addLoadEvent(navRollovers);

/* FORM FUNCTIONS */

//Brings associated form field into focus when the text within a label is clicked (and makes the field blank)
function focusLabels() {
 if (!document.getElementsByTagName) return false;
 var labels = document.getElementsByTagName("label");
 for (var i=0; i<labels.length; i++) {
  if (!labels[i].getAttribute("for")) continue;
  labels[i].onclick = function() {
   var id = this.getAttribute("for");
   if (!document.getElementById(id)) return false;
   var element = document.getElementById(id);
   element.focus();
  }
 }
}
addLoadEvent(focusLabels);

//Creates default placeholder text, which disappears and reappears automatically
function resetFields(whichform) {
 for (var i=0; i<whichform.elements.length; i++) {
  var element = whichform.elements[i];
  if (element.type == "reset"||element.type == "submit") continue;
  if (!element.defaultValue) continue;
  element.onfocus = function() {
   if (this.value == this.defaultValue) {
    this.value = "";
   }
  }
  element.onblur = function() {
   if (this.value == "") {
    this.value = this.defaultValue;
   }
  }
 }
}

//Determines whether the input field has been completed, based on whether the default still exists
function isFilled(field) {
 if (field.value.length < 1 || field.value == field.defaultValue) {
  return false;
 } else {
  return true;
 }
}

//Determines whether the email field has been completed correctly, based on the existence of certain characters
function isEmail(field) {
 if (field.value.indexOf("@") == -1 || field.value.indexOf(".") == -1)
 {
  return false;
 } else {
  return true;
 }
}

//Adds form checking to email submission forms - places error msg in a div with id="formError"
//Draws upon the previous two functions to validate all form fields, based on whether the class "required" or "email" is present
function validateForm(whichform) {
 var status = true;
 for (var i=0; i<whichform.elements.length; i++) {
  var element = whichform.elements[i];
  if (hasClass(element,"email")) {
   if (!isEmail(element)) {
    if (document.getElementById("formError")){;
     if (status == true) { //only highlight this error if all other errors resolved first
      document.getElementById("formError").style.display = "block";
      replaceText("formError","p","class","errmsg","Oops! An invalid email address was given.  Please re-enter your email address.");
      var elmtID = ""+element.id+"";
      var elmt = document.getElementById(elmtID);
      addClass(elmt,"error");
     }
     
     status = false;
    }
    else {
     alert("Please enter a valid e-mail address.");
     return false;
    }
   }
  }
  if (hasClass(element,"required")) { //or can use:  if(element.className.indexOf("required") != -1)
   if (!isFilled(element)) {
    if (document.getElementById("formError")){
     document.getElementById("formError").style.display = "block";
     replaceText("formError","p","class","errmsg","Oops! Fields marked with an asterisk are required.  Please complete these.");
     var elmtID = ""+element.id+"";
     var elmt = document.getElementById(elmtID);
     addClass(elmt,"error");
     status = false;
    }
    else {
     alert("You have not filled in the required field '"+element.id+"'.");
     return false;
    }
   }
  }
 }
 return status;
}

//clears the error message boxes once focused on again.
function prepareClearErrors(whichform) {
  if (!document.getElementsByTagName) return false;
  var inputs = document.getElementsByTagName("input");
  for (var i=0; i < inputs.length; i++) {
 if (inputs[i].className.match("required")) {
   inputs[i].onblur = function() {
  if (isFilled(this)) {
   removeClass(this,'error');
  }
  return false;
   }
 }
  }
}

//The function to prepare the previous form enhancements for each form on a page
function prepareForms() {
 for (var i=0; i<document.forms.length; i++) {
  var thisform = document.forms[i];
  resetFields(thisform);
  prepareClearErrors(thisform);
  thisform.onsubmit = function() {
   return validateForm(this);
  }
 }
}
addLoadEvent(prepareForms);