﻿/*------------------------------------------------------------------
   complianceValidation.js

   This file contains the submittal validation logic for Gardasil
   3-is-Key form.
     
   This function returns: 
      - true if all data entry is valid; 
      - false otherwise (to cancel form submittal)
   -----------------------------------------------------------------*/
   
  function _3isKey_doClientSidedValidation(theForm, lang) 
  {
  
     ////// "Global" variables //////
  
     var string_age18;
     var string_dosedatewarning;
     var string_requiredinfo;
     var string_emailvalid;
     var string_validdate;
     var string_firstname;
     var string_lastname;
     var string_zip;
     var string_email;
     var string_dosedate;

     if (lang == "en")
     {
        string_age18           = "You must be 18 years or older to receive reminders.";
        string_dosedatewarning = "Based on the date of the first dose, it is too late to send a reminder for the second dose.\n\nPress OK to receive a reminder for the third dose.";
        string_requiredinfo    = "The following information is required";
        string_emailvalid      = "A valid email address is needed to send reminders.";
        string_validdate       = "A valid date of the first dose received is needed to send reminders.";
        string_firstname       = "Patient first name";
        string_lastname        = "Patient last name";
        string_zip             = "ZIP code";
        string_email           = "E-mail address";
        string_dosedate        = "Please enter the date of the patient's first dose of GARDASIL®";
     }
     else //lang == "fr"
     {
        string_age18           = "Vous devez avoir 18 ans ou plus pour vous inscrire.";
        string_dosedatewarning = "En tenant compte de la date de la première dose, il est trop tard pour envoyer un rappel pour la deuxième dose.\n\nCliquer sur OK pour recevoir un rappel pour la troisième dose.";
        string_requiredinfo    = "Les informations suivantes sont requises :";
        string_emailvalid      = "Veuillez inscrire une adresse électronique valide (courriel@courriel.com)";
        string_validdate       = "Une date valide pour la première dose est requise pour envoyer un rappel.";
        string_firstname       = "Veuillez inscrire le prénom de la patiente.";
        string_lastname        = "Veuillez inscrire le nom de la patiente.";
        string_zip             = "ZIP code";
        string_email           = "Veuillez inscrire une adresse électronique valide (courriel@courriel.com)";
        string_dosedate        = "Veuillez inscrire la date à laquelle la première dose de GARDASIL® a été administrée";
     }
 
     var field_check18       = theForm.AGE_18;
     var field_firstname     = theForm.firstname;
     var field_lastname      = theForm.lastname;
     var field_email         = theForm.email;
     var field_dosemonth     = theForm.dose_month;
     var field_doseday       = theForm.dose_day;
     var field_doseyear      = theForm.dose_year;
     var field_vaccin1       = theForm.Vaccin1;
     var field_vaccin2       = theForm.Vaccin2;
     var field_vaccin3       = theForm.Vaccin3;

   /*------------------------------------------------------
      Utility date functions. Returns a date adjusted by
      a number of days. Number of days can be a negative 
      number to get a date in the past.
      Returned date is set to midnight.
     ------------------------------------------------------*/
     function getDatePlusDays(date, days)
     {
        var myDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
              
        myDate = new Date(myDate.setDate(myDate.getDate() + days));                    //apply difference
        myDate = new Date(myDate.getFullYear(), myDate.getMonth(), myDate.getDate());  //remove time element (set to midnight)
   
        return myDate;
     }
     function getCurrentDatePlusDays(days)
     {
        return getDatePlusDays(new Date(), days);
     }
     function getFormattedDateString(date)
     {
        var month  = date.getMonth() + 1;
        var day    = date.getDate();
        var year   = date.getFullYear();

        return "" + 
               (month < 10 ? "0" + month : month.toString()) + "/" +
               (day < 10 ? "0" + day : day.toString()) + "/" +
               year.toString();
     }
     function setVaccineDateFields()
     {
        // get user input for date 1
        var month = parseInt(field_dosemonth.value) - 1;  //zero-based
        var day   = parseInt(field_doseday.value);
        var year  = parseInt(field_doseyear.value);

        var doseDate = new Date(year, month, day);

        field_vaccin1.value = getFormattedDateString(doseDate);
        field_vaccin2.value = getFormattedDateString(getDatePlusDays(doseDate, 61));
        field_vaccin3.value = getFormattedDateString(getDatePlusDays(doseDate, 183));
     }
  
   /*----------------------------------------------------------------
      Check required fields.
      =====================
      Returns: false if required data is missing; otherwise true.
     ----------------------------------------------------------------*/
     function checkRequiredFields()
     {
        var focusField = null;    //used to set focus, and indicates return value
        var message = string_requiredinfo + ":\n";
        var doseDate = new Object();
        
        doseDate.value = "" + field_dosemonth.value + "-" + field_doseday.value + "-" + field_doseyear.value;
        doseDate.value = /[0-9]+\-[0-9]+\-[0-9]/.test(doseDate.value) ? doseDate.value : "";  //blank it out if it's incomplete
        doseDate.focus = function() { field_dosemonth.focus(); }
        
        var fields = 
            [   
              [field_firstname, string_firstname],
              [field_lastname,  string_lastname],
              [field_email,     string_email],
              [doseDate,        string_dosedate]
            ];
        
        //look for missing data...
        for (var i=0; i<fields.length; i++)
        {
           if (fields[i][0].value == "")
           {
              if (focusField == null) focusField = fields[i][0];
              message += "\n    " + fields[i][1];
           }
        }
        
        if (focusField != null)   //if a focus field was identified, it means missing data was found 
        {
           alert( message + "\n " );
		   focusField.focus();  
		   return false;
        }
        
        return true;
     }
  
  
   /*-----------------------------------------------------------------------------
      Check e-mail address format.
      ===========================
      Returns: false if required email address has invalid format; otherwise true.
     ------------------------------------------------------------------------------*/
     function checkEmailFormat()
     {
        //this regex was found on RegExLib.com//
        var re = /([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)/;
        
        var test = re.test(field_email.value);
        
        if (test == false)
        {
           alert(string_emailvalid);
           field_email.focus();
        }
        
        return test;
     }
		
		
   /*---------------------------------------------------------------------
      Check for valid date of first dose.
      ==================================
      Check if dose date is a real date (e.g.: not 4/31/2008 or 2/29/2007), 
      and is in range (154days -> today -> 14days)
   
      Returns: false if the dose date is incorrect or out of range; 
               otherwise true.
      Assumes: date fields are all entered.
     ---------------------------------------------------------------------*/
     function checkDoseDate()
     {
        var m = { feb:1, apr:3, jun:5, sep:8, nov:10 };
        
        var month = parseInt(field_dosemonth.value) - 1;  //zero-based
        var day   = parseInt(field_doseday.value);
        var year  = parseInt(field_doseyear.value);
        
        var bad = false;
     
        if ( (month==m.feb || month==m.apr || month==m.jun || month==m.sep || month==m.nov) && (day>30) )  
           bad = true;
        else
        if ( (month == m.feb) && ((year%4==0 && day>29) || (year%4!=0 && day>28)) )
   	bad = true;
        else
        {
           var doseDate = new Date(year, month, day);
           var pastDate = getCurrentDatePlusDays(-154);
           var futrDate = getCurrentDatePlusDays(14);

           if ((doseDate < pastDate) || (doseDate > futrDate))
           {
              alert(string_validdate);
              field_dosemonth.focus();
              bad = true;
           }
        }
   		
        return !bad;
     }
  
  
   /*---------------------------------------------------------------------------------------
      Warn if dose date is more than 35 days in the past.
      ==================================================
      Assumes dose date fields contain valid data.
      Returns: true if dose date is within 35 days, or user clicks "OK"
               false if the dose date more than 35 days in the past and user clicks "Cancel"
     ---------------------------------------------------------------------------------------*/
     function doseDateWarning()
     {
        var month = parseInt(field_dosemonth.value) - 1;  //zero-based
        var day   = parseInt(field_doseday.value);
        var year  = parseInt(field_doseyear.value);
   
        var doseDate = new Date(year, month, day);
        var pastDate = getCurrentDatePlusDays(-35);
 
        if (doseDate < pastDate)
        {
           var reply = confirm(string_dosedatewarning);
           if (reply == false)
           {
              field_dosemonth.focus();
              return false;
           }
        }
        
        return true;
     }
  
  /* -----------------------------------------------------
      Main processing logic...
     -----------------------------------------------------*/
    
  /*** STEP 1: test the 18-years-or-older flag ***/
      
     if (field_check18.checked == false)
     {
        alert(string_age18);
        field_check18.focus();
        return false;
     }
  
  /*** STEP 2: test required fields  ***/
       
     if (checkRequiredFields() == false)
        return false;
            
  /*** STEP 3: test data validity  ***/
   
     if (checkEmailFormat() == false)
        return false;
         
     if (checkDoseDate() == false)
        return false;
     
  /*** STEP 4: test if dose date is more than 21 days in the past ***/
     
     if (doseDateWarning() == false)
        return false;

  /*** STEP 5: set vaccine date fields to post  ***/
     setVaccineDateFields();
     
     return true;
  }
