var fids  = Array( "fui" , "fue" , "ffn" , "fln",
                   "fco" , "fsr" , "fcy" , "fst",
                   "fzp" , "fcn" , "fph" , "ffx" );
var maxl  = { "fui" : 20 ,     "fue" : 50 ,
              "ffn" : 40 ,     "fln" : 40 ,
              "fco" : 100 ,    "fsr" : 50 ,
              "fcy" : 50 ,     "fst" : 50 ,
              "fzp" : 10 ,     "fcn" : 50 ,
              "fph" : 50 ,     "ffx" : 50 };
var fuiValid, fuiRequired, fueValid, fueRequired,
    ffnValid, ffnRequired, flnValid, flnRequired,
    fcoValid, fcoRequired, fsrValid, fsrRequired,
    fcyValid, fcyRequired, fstValid, fstRequired,
    fzpValid, fzpRequired, fcnValid, fcnRequired,
    fphValid, fphRequired, ffxValid, ffxRequired;
var errorMessages = {
  "fue" : {
    "required" : "Email Address is a required field.",
    "length"   : "Email Address is a maximum of 50 characters."
  },
  "ffn" : {
    "required" : "First Name is a required field.",
    "length"   : "First Name is a maximum of 40 characters."
  },
  "fln" : {
    "required" : "Last Name is a required field.",
    "length"   : "Last Name is a maximum of 40 characters."
  },
  "fco" : {
    "required" : "Company Name is a required field.",
    "length"   : "Company Name is a maximum of 100 characters."
  },
  "fsr" : {
    "required" : "Street is a required field.",
    "length"   : "Street is a maximum of 50 characters."
  },
  "fcy" : {
    "required" : "City is a required field.",
    "length"   : "City is a maximum of 50 characters."
  },
  "fst" : {
    "required" : "State/Provence is a required field.",
    "length"   : "State/Provence is a maximum of 50 characters."
  },
  "fzp" : {
    "required" : "Zip/Postal Code is a required field.",
    "length"   : "Zip/Postal Code is a maximum of 10 characters."
  },
  "fcn" : {
    "required" : "Country is a required field.",
    "length"   : "Country is a maximum of 50 characters."
  },
  "fue" : {
    "required" : "Email Address is a required field.",
    "length"   : "Email Address is a maximum of 50 characters."
  },
  "fph" : {
    "required" : "Phone is a required field.",
    "length"   : "Phone is a maximum of 50 characters."
  },
  "ffx" : {
    "required" : "Fax is a required field.",
    "length"   : "Fax is a maximum of 50 characters."
  }
}

function initPage() {
// Disable the buttons
  dgeid('forgot').disabled = true;

  fuiValid    = false;
  fuiRequired = true;
  addEventHandler(dgeid("fui"),"blur",checkUserName);
  
  fueValid    = false;
  fueRequired = true;
  addEventHandler(dgeid("fue"),"blur",testEmailAddress);

  for (var i = 2 ; i < fids.length ; i++ ) {
    eval(fids[i]+'Required = false;');
    eval(fids[i]+'Valid    = false;');
    addEventHandler(dgeid(fids[i]),"blur",testForEntry);
  }

  dgeid('fui').focus();
  dgeid('fui').select();
}
// End of Page Initialization function
/*
 * runOnLoad.js: portable registration for onload event handlers.
 * 
 * This module defines a single runOnLoad() function for portably registering
 * functions that can be safely invoked only when the document is fully loaded
 * and the DOM is available.
 *
 * Functions registered with runOnLoad() will not be passed any arguments when
 * invoked. They will not be invoked as a method of any meaningful object, and
 * the this keyword should not be used.  Functions registered with runOnLoad()
 * will be invoked in the order in which they were registered.  There is no
 * way to deregister a function once it has been passed to runOnLoad().
 *
 * In old browsers that do not support addEventListener() or attachEvent(),
 * this function relies on the DOM Level 0 window.onload property and will not
 * work correctly when used in documents that set the onload attribute
 * of their <body> or <frameset> tags.
 */
function runOnLoad(f) {
    if (runOnLoad.loaded) f();    // If already loaded, just invoke f() now.
    else runOnLoad.funcs.push(f); // Otherwise, store it for later
}

runOnLoad.funcs = [initPage];     // The array of functions to call
runOnLoad.loaded = false;         // The functions have not been run yet.

// Run all registered functions in the order in which they were registered.
// It is safe to call runOnLoad.run() more than once: invocations after the
// first do nothing. It is safe for an initialization function to call
// runOnLoad() to register another function.
runOnLoad.run = function() {
    if (runOnLoad.loaded) return;  // If we've already run, do nothing

    for(var i = 0; i < runOnLoad.funcs.length; i++) {
        try { runOnLoad.funcs[i](); }
        catch(e) { /* An exception in one shouldn't stop the rest */ }
    }
    
    runOnLoad.loaded = true; // Remember that we've already run once.
    delete runOnLoad.funcs;  // But don't remember the functions themselves.
    delete runOnLoad.run;    // And forget about this function too!
};

// Register runOnLoad.run() as the onload event handler for the window
if (window.addEventListener)
    window.addEventListener("load", runOnLoad.run, false);
else if (window.attachEvent) window.attachEvent("onload", runOnLoad.run);
else window.onload = runOnLoad.run;
// END of onLoad programs ---------------------------------------------

// Function to test to see if any button should be enabled and
// to enable it.
function testForEnable() {
  // If the required fields are entered,
  // enable the button.
  var enable = true;
  for (var i = 0 ; i < fids.length ; i++ ) {
    var req = eval(fids[i]+'Required');
    var val = eval(fids[i]+'Valid');
    if (req && !val) {
      enable = false;
    }
  }

  if (enable) {
    dgeid("forgot").disabled = false;
  } else {
    dgeid("forgot").disabled = true;
  }
}

function checkUserName() {
  var username = dgeid("fui").value.toUpperCase();
  var para = dgeid("fuierr");
  removeChildren(para);
  if (testUserName(username)) {
    usernameRequest = createRequest();
    if (usernameRequest == null)
      alert("Unable to create request");
    else {
      var url= "checkUsernameV2.php?username=" + username;
      usernameRequest.onreadystatechange = showUsernameStatus;
      usernameRequest.open("GET", url, true);
      usernameRequest.send(null);
    }
  }
}
function testUserName(username) {
  clearErrors();
  var msg = "";
  var para = dgeid("fuierr");
  removeChildren(para);
  if ((20 >= username.length) && // Must be between 8 and 20 chars
      ( 1 <= username.length)){
    if (fieldIsNotAlphaNumeric(username)) { // must be alphanumeric only
      fuiValid = false;
      msg = "Only letters, numbers, . and - are allowed in the User Name.";
    } else {
      var firstchar = username.charAt(0);
      if (fieldIsNotAlpha(firstchar)) {
        fuiValid = false;
        msg = "The first character of the user name must be a letter.";
      } else {
        fuiValid = true;
      }
    }
  } else {
    fuiValid = false;
    msg = "User Name is required, must be between 1 and 20 letters, numbers, . or - and must begin with a letter.";
  }
  if (!fuiValid) {
    textNode = document.createTextNode(msg);
    para.appendChild(textNode);
    dgeid("fui").focus();
    dgeid("fui").select();
  }
  return fuiValid;
}
function showUsernameStatus() {
  if (usernameRequest.readyState == 4) {
    if (usernameRequest.status == 200) {
      clearErrors();
      var rt = usernameRequest.responseText;
      var rfl = rt.split(';');
      if ("1" == rfl[0]) {
        fuiValid = false;
        textNode = document.createTextNode("The User Name you entered is not on file.");
        var para = dgeid('fuierr');
        para.appendChild(textNode);
        dgeid("fui").focus();
        dgeid("fui").select();
      } else {
        for (var i = 2 ; i < fids.length ; i++ ) {
          if ('0' == rfl[i]) {
            eval(fids[i]+'Required = true;');
            eval(fids[i]+'Valid    = false;');
            var textNode = document.createTextNode(eval('errorMessages.'+fids[i]+'.required'));
            var para = dgeid(fids[i]+'err');
            para.appendChild(textNode);
          }
        }
        fuiValid = true;
      }
      testForEnable();
    }
  }
}
function testForEntry(e) {
  var me    = getActivatedObject(e);
  var fid   = me.id;
  var errid = fid + "err";
  var para  = dgeid(errid);
  removeChildren(para);
  var val   = me.value;
  if ("" == val) {
    if (eval(fid+'Required')) { // field is required
      // empty string
      textNode = document.createTextNode(eval('errorMessages.'+fid+'.required'));
      para.appendChild(textNode);
      eval(fid+'Valid = false;');
    }
  } else {
    var ml = eval('maxl.' + fid);
    if (ml < val.length) {
      textNode = document.createTextNode(eval('errorMessages.'+fid+'.length'));
      para.appendChild(textNode);
    } else {
      eval(fid+'Valid = true;');
    }
  }
  testForEnable();
}

function fieldIsNotAlpha(field) {
  var nonAlphaChars = /[^a-zA-Z]/;
  return (nonAlphaChars.test(field));
}

function fieldIsNotNumeric(field) {
  var nonNumericChars = /[^0-9]/;
  return (nonNumericChars.test(field));
}
function fieldIsNotAlphaNumeric(field) {
  var nonAlphaNumericChars = /[^a-zA-Z0-9.\-]/;
  return (nonAlphaNumericChars.test(field));
}
function testEmailAddress() {
  emailAddress = dgeid("fue").value;
  para = dgeid("fueerr");
  removeChildren(para);
  if (!/^[\w\.-_\+]+@[\w-]+(\.\w{2,4})+$/.test(emailAddress)) {
    // Invalid email address
    fueValid = false;
    textNode = document.createTextNode("Please enter a valid email address in the form of user@company.com");
    para.appendChild(textNode);
    dgeid("fue").focus();
    dgeid("fue").select();
  } else {
    //   Valid email address
    fueValid = true;
  }
  testForEnable();
}

function removeChildren(node) {
  while (node.childNodes.length > 0) {
    node.removeChild(node.childNodes[0]);
  }
}
function clearErrors() {
  for (var i = 0 ; i < fids.length ; i++ ) {
    var para = dgeid(fids[i]+'err');
    removeChildren(para);
  }
}