// Form validation
function validate(form) {
  var $form = $(form);
  
  var required_text = '<span class="error">This field is required</span>';
  
  // Remove error messages
  $form.find('span.error').remove();
  $form.find('.error').removeClass('error');
  
  // Get form elements
  $contact_surname                    = $form.find('input#contact_surname');
  $contact_first_name                 = $form.find('input#contact_first_name');
  $contact_preferred_name             = $form.find('input#contact_preferred_name');
  $contact_id_number                  = $form.find('input#contact_id_number');
  $contact_date_of_birth_mm           = $form.find('input#contact_date_of_birth_mm');
  $contact_date_of_birth_dd           = $form.find('input#contact_date_of_birth_dd');
  $contact_date_of_birth_yyyy         = $form.find('input#contact_date_of_birth_yyyy');
  $contact_organisation               = $form.find('input#contact_organisation');
  $contact_occupation                 = $form.find('input#contact_occupation');
  $contact_phone                      = $form.find('input#contact_phone');
  $contact_mobile                     = $form.find('input#contact_mobile');
  $contact_email_address              = $form.find('input#contact_email_address');
  $contact_email_address_confirm      = $form.find('input#contact_email_address_confirm');
  $postal_street_1                    = $form.find('input#postal_street_1');
  $postal_street_2                    = $form.find('input#postal_street_2');
  $postal_city                        = $form.find('input#postal_city');
  $postal_state                       = $form.find('input#postal_state');
  $postal_code                        = $form.find('input#postal_code');
  $postal_country                     = $form.find('input#postal_country');
  $referrers                          = $form.find('input[id^="referrer"]:checked');
  $payment_scheme                     = $form.find('select#payment_scheme');
  $payment_method                     = $form.find('select#payment_method');
  $vat                                = $form.find('input#vat');
  $vat_organisation_name              = $form.find('input#vat_organisation_name');
  $vat_organisation_number            = $form.find('input#vat_organisation_number');
  $vat_organisation_address_street_1  = $form.find('input#vat_organisation_address_street_1');
  $vat_organisation_address_street_2  = $form.find('input#vat_organisation_address_street_2');
  $vat_organisation_city              = $form.find('input#vat_organisation_address_city');
  $vat_organisation_state             = $form.find('input#vat_organisation_address_state');
  $vat_organisation_code              = $form.find('input#vat_organisation_address_code');
  $vat_organisation_country           = $form.find('input#vat_organisation_address_country');
  
  // Surname is required
  if ($contact_surname.val() == '') {
    $contact_surname.addClass('error');
    $contact_surname.after(required_text);
    $contact_surname.focus();
    
    return false;
  }
  // First name is required
  if ($contact_first_name.val() == '') {
    $contact_first_name.addClass('error');
    $contact_first_name.after(required_text);
    $contact_first_name.focus();
    
    return false;
  }
  // Preferred name is required
  if ($contact_preferred_name.val() == '') {
    $contact_preferred_name.addClass('error');
    $contact_preferred_name.after(required_text);
    $contact_preferred_name.focus();
    
    return false;
  }
  // ID number is required
  if ($contact_id_number.val() == '') {
    $contact_id_number.addClass('error');
    $contact_id_number.after(required_text);
    $contact_id_number.focus();
    
    return false;
  }
  // ID Number must be numeric
  if (!$contact_id_number.val().match(/[0-9]+/i)) {
    $contact_id_number.addClass('error');
    $contact_id_number.after('<span class="error">This field may only contain numeric characters</span>');
    $contact_id_number.focus();
    
    return false;
  }
  // DoB is required
  if ($contact_date_of_birth_mm.val() == '' ||
      $contact_date_of_birth_dd.val() == '' ||
      $contact_date_of_birth_yyyy.val() == '') {
    $contact_date_of_birth_mm.addClass('error');
    $contact_date_of_birth_dd.addClass('error');
    $contact_date_of_birth_yyyy.addClass('error');
    $contact_date_of_birth_yyyy.after(required_text);
    $contact_date_of_birth_mm.focus();
    
    return false;
  }
  // DoB must be in the format DD/MM/YYYY
  if (!($contact_date_of_birth_dd.val() +'/'+ $contact_date_of_birth_mm.val() +'/'+ $contact_date_of_birth_yyyy.val()).match(/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/i)) {
    $contact_date_of_birth_mm.addClass('error');
    $contact_date_of_birth_dd.addClass('error');
    $contact_date_of_birth_yyyy.addClass('error');
    $contact_date_of_birth_yyyy.after('<span class="error">This field must be in the format DD/MM/YYYY (numeric characters only)</span>');
    $contact_date_of_birth_mm.focus();
    
    return false;
  }
  // Organisation is required
  if ($contact_organisation.val() == '') {
    $contact_organisation.addClass('error');
    $contact_organisation.after(required_text);
    $contact_organisation.focus();
    
    return false;
  }
  // Occupation is required
  if ($contact_occupation.val() == '') {
    $contact_occupation.addClass('error');
    $contact_occupation.after(required_text);
    $contact_occupation.focus();
    
    return false;
  }
  // Phone is required
  if ($contact_phone.val() == '') {
    $contact_phone.addClass('error');
    $contact_phone.after(required_text);
    $contact_phone.focus();
    
    return false;
  }
  // Phone must be numeric
  if (!$contact_phone.val().match(/[0-9 ]+/i)) {
    $contact_phone.addClass('error');
    $contact_phone.after('<span class="error">This field may only contain numeric characters and spaces</span>');
    $contact_phone.focus();
    
    return false;
  }
  // Mobile is required
  if ($contact_mobile.val() == '') {
    $contact_mobile.addClass('error');
    $contact_mobile.after(required_text);
    $contact_mobile.focus();
    
    return false;
  }
  // Phone must be numeric
  if (!$contact_mobile.val().match(/[0-9 ]+/i)) {
    $contact_mobile.addClass('error');
    $contact_mobile.after('<span class="error">This field may only contain numeric characters and spaces</span>');
    $contact_mobile.focus();
    
    return false;
  }
  // Email address is required
  if ($contact_email_address.val() == '') {
    $contact_email_address.addClass('error');
    $contact_email_address.after(required_text);
    $contact_email_address.focus();
    
    return false;
  }
  // Email address must be a valid email address
  if (!$contact_email_address.val().match(/[a-z0-9\-\_\.]+@[a-z0-9\-\_\.]+\.[a-z\.]+/i)) {
    $contact_email_address.addClass('error');
    $contact_email_address.after('<span class="error">This field must contain a valid email address</span>');
    $contact_email_address.focus();
    
    return false;
  }
  // Confirm Email address is required
  if ($contact_email_address_confirm.val() == '') {
    $contact_email_address_confirm.addClass('error');
    $contact_email_address_confirm.after(required_text);
    $contact_email_address_confirm.focus();
    
    return false;
  }
  // Confirm Email address must be a valid email address
  if (!$contact_email_address_confirm.val().match(/[a-z0-9\-\_\.]+@[a-z0-9\-\_\.]+\.[a-z\.]+/i)) {
    $contact_email_address_confirm.addClass('error');
    $contact_email_address_confirm.after('<span class="error">This field must contain a valid email address</span>');
    $contact_email_address_confirm.focus();
    
    return false;
  }
  // Confirm Email address must be the same as email address
  if ($contact_email_address_confirm.val() != $contact_email_address.val()) {
    $contact_email_address_confirm.addClass('error');
    $contact_email_address_confirm.after('<span class="error">This field must have the same value as Email Address</span>');
    $contact_email_address_confirm.focus();
    
    return false;
  }
  // Postal street 1 is required
  if ($postal_street_1.val() == '') {
    $postal_street_1.addClass('error');
    $postal_street_1.after(required_text);
    $postal_street_1.focus();
    
    return false;
  }
  // Postal city is required
  if ($postal_city.val() == '') {
    $postal_city.addClass('error');
    $postal_city.after(required_text);
    $postal_city.focus();
    
    return false;
  }
  // Postal state is required
  if ($postal_state.val() == '') {
    $postal_state.addClass('error');
    $postal_state.after(required_text);
    $postal_state.focus();
    
    return false;
  }
  // Postal code is required
  if ($postal_code.val() == '') {
    $postal_code.addClass('error');
    $postal_code.after(required_text);
    $postal_code.focus();
    
    return false;
  }
  // Postal code must be numeric
  if (!$postal_code.val().match(/[0-9]+/i)) {
    $postal_code.addClass('error');
    $postal_code.after('<span class="error">This field may only contain numeric characters</span>');
    $postal_code.focus();
    
    return false;
  }
  // Postal country is required
  if ($postal_country.val() == '') {
    $postal_country.addClass('error');
    $postal_country.after(required_text);
    $postal_country.focus();
    
    return false;
  }
  // Referrers is required
  if ($referrers.length <= 0) {
    $form.find('input[id^="referrer"]:first').focus();
    $form.find('p#referrer_label').append(required_text);
    
    return false;
  }
  // Payment Scheme is required
  if ($payment_scheme.val() == '') {
    $payment_scheme.addClass('error');
    $payment_scheme.after(required_text);
    $payment_scheme.focus();
    
    return false;
  }
  // Payment Method is required
  if ($payment_method.val() == '') {
    $payment_method.addClass('error');
    $payment_method.after(required_text);
    $payment_method.focus();
    
    return false;
  }
  // If user requires a VAT invoice the fields below are required
  if ($vat.is(':checked')) {
    // Organisation Name is required
    if ($vat_organisation_name.val() == '') {
      $vat_organisation_name.addClass('error');
      $vat_organisation_name.after(required_text);
      $vat_organisation_name.focus();
      
      return false;
    }
    // VAT Number is required
    if ($vat_organisation_number.val() == '') {
      $vat_organisation_number.addClass('error');
      $vat_organisation_number.after(required_text);
      $vat_organisation_number.focus();
      
      return false;
    }
    // Organisation Address Street 1 is required
    if ($vat_organisation_address_street_1.val() == '') {
      $vat_organisation_address_street_1.addClass('error');
      $vat_organisation_address_street_1.after(required_text);
      $vat_organisation_address_street_1.focus();
      
      return false;
    }
    // Organisation Address City is required
    if ($vat_organisation_city.val() == '') {
      $vat_organisation_city.addClass('error');
      $vat_organisation_city.after(required_text);
      $vat_organisation_city.focus();
      
      return false;
    }
    // Organisation Address State is required
    if ($vat_organisation_state.val() == '') {
      $vat_organisation_state.addClass('error');
      $vat_organisation_state.after(required_text);
      $vat_organisation_state.focus();
      
      return false;
    }
    // Organisation Address Postal Code is required
    if ($vat_organisation_code.val() == '') {
      $vat_organisation_code.addClass('error');
      $vat_organisation_code.after(required_text);
      $vat_organisation_code.focus();
      
      return false;
    }
    // Organisation Address Country is required
    if ($vat_organisation_country.val() == '') {
      $vat_organisation_country.addClass('error');
      $vat_organisation_country.after(required_text);
      $vat_organisation_country.focus();
      
      return false;
    }
  }
  
  return true;
}