  /*
   * Performs validation of the given contact form.  Upon failure,
   * a message with all errors is displayed to the user and the
   * return is 'false'. Upon success, the return is 'true'.
   */
  function validateContactForm(form) {

      var is_valid = true;
      var user_error_msg = "";

      var firstname_required = "First name is required (eg. David)"
      var lastname_required = "Last name is required (eg. Thomas)"
      var zipcode_required = "Zipcode is required (eg. (95060)"
      var zipcode_format_length = "Zip code format is 5 digits (eg. 95060)"
      var zipcode_format_content = "Invalid characters in your zip code.";
      var phone_required = "Phone number is required (eg. 555-432-9871)";
      var email_required = "Email is required (eg. name@some.domain.com)";
      var email_format_content = "Valid email format required (eg. name@some.domain.com)";
      var phone_format_length = "Invalid phone number.  Please include area code (eg. 123-456-7890)";
      var phone_format_content = "Invalid phone number.  Use digits and hyphens only (eg. 111-222-3333)";

      var analysis_address_required = "Property address required (eg. 151 Augusta Ln)";
      var analysis_zipcode_format_length = "Property address zip code format is 5 digits (eg. 95060)"
      var analysis_zipcode_format_content = "Invalid characters in your property zip code.";
      var analysis_city_required = "Property city required (eg. Santa Cruz)";
      var analysis_state_required = "Property state requird (eg. CA)";
      var analysis_zipcode_required = "Property zipcode rquired (eg. 95060)";

      var partner_site_name_required = "Website name required (eg. My Agent Website)";
      var partner_site_url_required = "Partner website URL required (eg. http://www.something.com)";
      var partner_site_description_required = "Partner website description required.";
      var spam_block_required = "Valid spam block word is required (see image on right).";

      // partner website name required
      if (form.partner_site_name && form.partner_site_name.value == "") {
        is_valid = false;
        user_error_msg += partner_site_name_required + "\n";
      }

      // partner website url required
      if (form.partner_site_url && form.partner_site_url.value == "") {
        is_valid = false;
        user_error_msg += partner_site_url_required + "\n";
      }

      // partner website description required
      if (form.partner_site_description && form.partner_site_description.value == "") {
        is_valid = false;
        user_error_msg += partner_site_description_required + "\n";
      }

      // firstname is required
      if (form.firstname && form.firstname.value == "") {
        is_valid = false;
        user_error_msg += firstname_required + "\n";
      }

      // lastname is required
      if (form.lastname && form.lastname.value == "") {
        is_valid = false;
        user_error_msg += lastname_required + "\n";
      }

      // zipcode is required
      if (form.zipcode) {
        value = form.zipcode.value;
        length = value.length;

        // required field
        if (value == "") {
          is_valid = false;
          user_error_msg += zipcode_required + "\n";
        // zipcode format
        } else if (length != 5) {
          is_valid = false;
          user_error_msg += zipcode_format_length + "\n";
        }

        valid = "01234567890";
        for (var i=0; i < length; i++) {
          temp = "" + value.substring(i, i+1);
          if (valid.indexOf(temp) == "-1") {
            is_valid = false;
            user_error_msg += zipcode_format_content + "\n";
            break;
          }
        }
      }

      // phone is required
      if (form.phone && form.phone.value == "") {
        is_valid = false;
        user_error_msg += phone_required + "\n";
      }

      // test phone value
      if (form.phone && form.phone.value != "") {
        value = form.phone.value;
        stripped = value.replace(/[\(\)\.\-\ ]/g, '');
        length = stripped.length;

        // test invalid characters
        if (isNaN(parseInt(stripped))) {
            is_valid = false;
            user_error_msg += phone_format_content + "\n";
        }
        // test length; inclusion of area code
        if (stripped.length != 10) {
            is_valid = false;
            user_error_msg += phone_format_length + "\n";
        }
        // test numbers only
        valid = "01234567890";
        for (var i=0; i < length; i++) {
          temp = "" + stripped.substring(i, i+1);
          if (valid.indexOf(temp) == "-1") {
            is_valid = false;
            user_error_msg += phone_format_content + "\n";
            break;
          }
        }
      }

      // email is required
      if (form.email && form.email.value == "") {
        is_valid = false;
        user_error_msg += email_required + "\n";
      }

      // email format is name@domain.com
      if (form.email && form.email.value != "") {
        value = form.email.value;
        size = value.length;
        apos = value.indexOf("@");
        dotpos = value.lastIndexOf(".");
        // prevent '@' and '.' from being close; prevent '.' at end
        if (apos < 1 || dotpos - apos < 2 || size - dotpos < 2) {
          is_valid = false;
          user_error_msg += email_format_content + "\n";
        }
      }

      // CMA property address is required
      if (form.analysis_address && form.analysis_address.value == "") {
        is_valid = false;
        user_error_msg += analysis_address_required + "\n";
      }

      // CMA property city is required
      if (form.analysis_city && form.analysis_city.value == "") {
        is_valid = false;
        user_error_msg += analysis_city_required + "\n";
      }

      // CMA property state is required
      if (form.analysis_state && form.analysis_state.value == "") {
        is_valid = false;
        user_error_msg += analysis_state_required + "\n";
      }

      // CMA property zipcode is required
      if (form.analysis_zipcode && form.analysis_zipcode.value == "") {
        is_valid = false;
        user_error_msg += analysis_zipcode_required + "\n";
      }

      if (form.analysis_zipcode && form.analysis_zipcode.value != "") {

        value = form.analysis_zipcode.value;
        length = value.length;

        // zipcode format
        if (length != 5) {
          is_valid = false;
          user_error_msg += analysis_zipcode_format_length + "\n";
        }

        valid = "01234567890";
        for (var i=0; i < length; i++) {
          temp = "" + value.substring(i, i+1);
          if (valid.indexOf(temp) == "-1") {
            is_valid = false;
            user_error_msg += analysis_zipcode_format_content + "\n";
            break;
          }
        }
      }
      // spam block is required
      if (form.spam_block && form.spam_block.value != "home") {
        is_valid = false;
        user_error_msg += spam_block_required + "\n";
      }


      if (!is_valid) {
        alert(user_error_msg);
      }

      return is_valid;
  }
