// list of functions to call once page is loaded
var rtr_initializers = new Array();
var rtr_inited = false;

// add a function to be called when page is loaded
function addInitializer (func) {
  rtr_initializers.push(func);
}

// call all initializers, setup menus
function init () {
  if (rtr_inited == false) {
    for (var i = 0; i < rtr_initializers.length; i++) {
      rtr_initializers[i]();
    }
    rtr_inited = true;
  }
}

// a little JavaScript magic to make CSS menus work in IE
function initMenus () {
  addMouseEventsToMenus("menu-list");
}

// more JavaScript magic, this time for languages menu
function initLinks () {
  addMouseEventsToMenus("links");
}

// add mouse-over and mouse-out functions to menu LI elements
function addMouseEventsToMenus (name) {
  if (document.all && document.getElementById) {
    navRoot = document.getElementById(name);
    for (i = 0; i < navRoot.childNodes.length; i++) {
      node = navRoot.childNodes[i];
      if (node.nodeName == "LI") {
        node.onmouseover = function() {
          this.className += " hover";
        }
        node.onmouseout = function() {
          this.className = this.className.replace(" hover", "");
        }
      }
    }
  }
}

// list of validators to run when form submitted
var validators = new Array();
var error_msgs;

// add a validator function to the list
function addValidator (v) {
  validators.push(v);
}

// run all validators, return false if any errors
function validate () {
  error_msgs = "";
  var r = true;
  for (var i = 0; i < validators.length; i++) {
    if (!validators[i]()) {
      r = false;
    }
  }
  return r;
}

// validate, alert if there are errors
function validateAndAlert () {
  var valid = validate();
  if (!valid)
    alert('Please correct the following errors:\n' + error_msgs);
  return valid;
}

// validate the given form fields, build up error messages
function validateFormFields () {
  var i, id, obj, name, mask, args = validateFormFields.arguments;
  var errors = "";
  for (i = 0; i < (args.length-2); i += 3) {
    obj = document.getElementById(args[i]);
    if (obj) {
      name = args[i+1];
      mask = args[i+2];
      done = false;
      if (mask.substring(0,1) == "R") {
        mask = mask.substring(1);
        if (trim(obj.value) == "") {
          errors += "- " + name + " is required\n";
          done = true;
        }
      }
      if (!done && mask.length > 0 && obj.value.length > 0) {
        switch (mask.substring(0,1)) {
          case "I":
            var val = parseInt(obj.value);
            if (isNaN(val)) {
              errors += "- " + name + " must be an integer\n";
            }
            else if (mask.length > 1) {
              var op  = mask.substring(1,2);
              var lim = parseInt(mask.substring(2));
              switch (op) {
                case ">":
                  if (val <= lim) {
                    errors += "- " + name + " must be an integer greater than " + lim + "\n";
                  }
                  break;
                case "<":
                  if (val >= lim) {
                    errors += "- " + name + " must be an integer less than " + lim + "\n";
                  }
                  break;
              }
            }
            break;
          case "F":
            if (isNaN(parseFloat(obj.value.replace(/,/, "")))) {
              errors += "- " + name + " must be a number\n";
            }
            break;
          case "E":
            if (!obj.value.match(/[0-9a-zA-Z_.%-]+@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)+/)) {
              errors += "- " + name + " must be a valid email address\n";
            }
            break;
          case "S":
            var op  = mask.substring(1,2);
            var lim = parseInt(mask.substring(2));
            var len = obj.value.length;
            switch (op) {
              case ">":
                if (len < lim) {
                  errors += "- " + name + " must be a minimum of " + lim + " characters (" + len + ")\n";
                }
                break;
              case "<":
                if (len > lim) {
                  errors += "- " + name + " must be a maximum of " + lim + " characters (" + len + ")\n";
                }
                break;
            }
            break;
          case "/":
            mask = mask.substring(1).split("/");
            var re = new RegExp("^" + mask[0] + "$");
            if (!re.test(obj.value)) {
              errors += "- " + name + " " + mask[1] + "\n";
            }
            break;
        }
      }
    }
  }
  if (errors != "")
    error_msgs += errors;
  return (errors == "");
}

// set the visibility of the given element based on flag
// return true if the visibility was actually changed
function setVisible (id, flag) {
  var obj = document.getElementById(id);
  var chg = false;
  if (obj) {
    var old = obj.style.display;
    var val = flag ? '' : 'none';
    obj.style.display = val;
    chg = (old != val);
  }  
  return chg;
}

// clears the given input field
function clearField (id) {
  var obj = document.getElementById(id);
  if (obj) {
    obj.value = "";
  }
}

// remove non-digits from an input field
function stripNonDigits (field) {
  field.value = field.value.replace(/\D/g, '');
}

// remove non-numeric characters from an input field
function stripNonNumerics (field) {
  field.value = field.value.replace(/[^0-9.,]/g, '');
}

// process the "How did you hear about us?" popup
function processHowHeardMenuChoice (menu) {
  setVisible('how_heard_text', (menu.selectedIndex > menu.length - 4));
}

// inserts email link for the given account; domain and label
// default to "roomtoread.org" and email address if not given
function insertEmailLink (account, domain, label)
{
  var email = account + '@' + domain;
  if (insertEmailLink.arguments.length < 3)
    var label = email;
  document.write('<a href="mailto:' + email + '">' + label + '</a>');
}

function preloadImages () { 
  var d = document;
  if (d.images) {
    if(!d.MM_p)
      d.MM_p = new Array();
    var i, j = d.MM_p.length, a = preloadImages.arguments;
    for(i = 0; i < a.length; i++)
      if (a[i].indexOf("#") != 0) {
        d.MM_p[j] = new Image;
        d.MM_p[j++].src = a[i];
      }
  }
}

function findObj (n, d) {
  var p, i, x;
  if (!d)
    d = document;
  if ((p=n.indexOf("?")) > 0 && parent.frames.length) {
    d = parent.frames[n.substring(p+1)].document;
    n=n.substring(0,p);
  }
  if (!(x=d[n]) && d.all)
    x=d.all[n];
  for (i = 0; !x && i < d.forms.length; i++)
    x = d.forms[i][n];
  for (i = 0; !x && d.layers && i < d.layers.length; i++)
    x = findObj(n,d.layers[i].document);
  if (!x && d.getElementById)
    x = d.getElementById(n);
  return x;
}

function swapImage () {
  var i, j = 0, x, a = swapImage.arguments;
  document.MM_sr = new Array;
  for (i = 0; i < (a.length-2); i += 3) {
    if ((x = findObj(a[i])) != null) {
      document.MM_sr[j++] = x;
      if (!x.oSrc)
        x.oSrc = x.src;
      x.src = a[i+2];
    }
  }
}

function swapImgRestore () {
  var i, x, a = document.MM_sr;
  for (i = 0; a && i < a.length && (x=a[i]) && x.oSrc; i++)
    x.src = x.oSrc;
}

function trim (str) {
  return str.replace(/^\s*(.*?)\s*$/, "$1");
};

