//**********************************************************************************************
// Arquivo: DATE.JS
// Data: Novembro de 2002
// Caiuby N. de Freitas
//
// Rotinas:
//
// function IsvalidDate(dia, mes, ano){
// DateFormat(vDateName, vDateValue, e, dateCheck, dateType)
//    Uso: onFocus="javascript:vDateType='3'" onKeyUp="DateFormat(this,this.value,event,false,'3')" onBlur="DateFormat(this,this.value,event,true,'3')" 
// function LeapYear(intYear)
// function DateDiff(d1,d2)
//    Uso: inicio = new Date(2003, 01, 10)  // 10/01/2003
//         fim    = new Date(2003, 01, 12)  // 12/02/2003
//         document.write(DateDiff(inicio, fim));
//**********************************************************************************************

function IsvalidDate(dia, mes, ano){
   if((dia == 0) || (mes == 0) || (ano == 0)) return false;
   // Ano bissexto
   if (mes == 2) { 
     var isleap = (ano % 4 == 0 && (ano % 100 != 0 || ano % 400 == 0));
     if (dia>29 || (dia==29 && !isleap)) return false;
   }     
   else {
     var vetmeses = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
     if (dia > vetmeses[mes-1]) return false;
   }
   return true;
}

var isNav4 = false, isNav5 = false, isIE4 = false
var strSeperator = "/"; 
var vDateType = 3; // Global value for type of date format
var vYearType = 4; //Set to 2 or 4 for number of digits in the year for Netscape
var vYearLength = 4; // Set to 4 if you want to force the user to enter 4 digits for the year before validating.
var err = 0; // Set the error code to a default of zero
if(navigator.appName == "Netscape") {
  if (navigator.appVersion < "5") {
     isNav4 = true;
     isNav5 = false;
  }
  else
     if (navigator.appVersion > "4") {
        isNav4 = false;
        isNav5 = true;
     }
  }
else {
  isIE4 = true;
}

//Uso: onFocus="javascript:vDateType='3'" onKeyUp="DateFormat(this,this.value,event,false,'3')" onBlur="DateFormat(this,this.value,event,true,'3')"
function DateFormat(vDateName, vDateValue, e, dateCheck, dateType) {
   vDateType = dateType;
   // vDateName = object name
   // vDateValue = value in the field being checked
   // e = event
   // dateCheck 
   // True  = Verify that the vDateValue is a valid date
   // False = Format values being entered into vDateValue only
   // vDateType
   // 1 = mm/dd/yyyy
   // 2 = yyyy/mm/dd
   // 3 = dd/mm/yyyy
   //Enter a tilde sign for the first number and you can check the variable information.
   if (vDateValue == "~") {
      alert("AppVersion = "+navigator.appVersion+" \nNav. 4 Version = "+isNav4+" \nNav. 5 Version = "+isNav5+" \nIE Version = "+isIE4+" \nYear Type = "+vYearType+" \nDate Type = "+vDateType+" \nSeparator = "+strSeperator);
      vDateName.value = "";
      vDateName.focus();
      return true;
   }
   var whichCode = (window.Event) ? e.which : e.keyCode;
   if (vDateValue.length > 8 && isNav4) {
      if ((vDateValue.indexOf("-") >= 1) || (vDateValue.indexOf("/") >= 1))
      return true;
   }

   //Eliminate all the ASCII codes that are not valid
   var alphaCheck = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/-";
   if (alphaCheck.indexOf(vDateValue) >= 1) {
      if (isNav4) {
         vDateName.value = "";
         vDateName.focus();
         vDateName.select();
         return false;
      }
      else {
         vDateName.value = vDateName.value.substr(0, (vDateValue.length-1));
         return false;
      }
   }
   if (whichCode == 8 || whichCode == 9 || whichCode == 16 || whichCode == undefined) //Ignore the Netscape value for backspace. IE has no value
   return false;
   else {

//alert(whichCode);

      var strCheck = '47,48,49,50,51,52,53,54,55,56,57,58,59,86,95,96,97,98,99,100,101,102,103,104,105';
      if (strCheck.indexOf(whichCode) != -1) {
      if (isNav4) {
         if (((vDateValue.length < 6 && dateCheck) || (vDateValue.length == 7 && dateCheck)) && (vDateValue.length >=1)) {
            alert("Data Inválida");
            vDateName.value = "";
            vDateName.focus();
            vDateName.select();
            return false;
         }
         if (vDateValue.length == 6 && dateCheck) {
            var mDay = vDateName.value.substr(2,2);
            var mMonth = vDateName.value.substr(0,2);
            var mYear = vDateName.value.substr(4,4)
            //Turn a two digit year into a 4 digit year
            if (mYear.length == 2 && vYearType == 4) {
               var mToday = new Date();
               //If the year is greater than 30 years from now use 19, otherwise use 20
               var checkYear = mToday.getFullYear() + 30; 
               var mCheckYear = '20' + mYear;
               if (mCheckYear >= checkYear)
                  mYear = '19' + mYear;
               else
                  mYear = '20' + mYear;
            }
            var vDateValueCheck = mMonth+strSeperator+mDay+strSeperator+mYear;
            if (!dateValid(vDateValueCheck)) {
               alert("Data Inválida");
               vDateName.value = "";
               vDateName.focus();
               vDateName.select();
               return false;
            }
            return true;
         }
         else {
            // Reformat the date for validation and set date type to a 1
            if (vDateValue.length >= 8  && dateCheck) {
               if (vDateType == 1) { // mmddyyyy
                  var mDay = vDateName.value.substr(2,2);
                  var mMonth = vDateName.value.substr(0,2);
                  var mYear = vDateName.value.substr(4,4)
                  vDateName.value = mMonth+strSeperator+mDay+strSeperator+mYear;
               }
               if (vDateType == 2) { // yyyymmdd
                  var mYear = vDateName.value.substr(0,4)
                  var mMonth = vDateName.value.substr(4,2);
                  var mDay = vDateName.value.substr(6,2);
                  vDateName.value = mYear+strSeperator+mMonth+strSeperator+mDay;
               }
               if (vDateType == 3) { // ddmmyyyy
                  var mMonth = vDateName.value.substr(2,2);
                  var mDay = vDateName.value.substr(0,2);
                  var mYear = vDateName.value.substr(4,4)
                  vDateName.value = mDay+strSeperator+mMonth+strSeperator+mYear;
               }
               //Create a temporary variable for storing the DateType and change
               //the DateType to a 1 for validation.
               var vDateTypeTemp = vDateType;
               vDateType = 1;
               var vDateValueCheck = mMonth+strSeperator+mDay+strSeperator+mYear;
               if (!dateValid(vDateValueCheck)) {
                  alert("Data Inválida");
                  vDateType = vDateTypeTemp;
                  vDateName.value = "";
                  vDateName.focus();
                  vDateName.select();
                  return false;
               }
               vDateType = vDateTypeTemp;
               return true;
            }
            else {
               if (((vDateValue.length < 8 && dateCheck) || (vDateValue.length == 9 && dateCheck)) && (vDateValue.length >=1)) {
                  alert("Data Inválida");
                  vDateName.value = "";
                  vDateName.focus();
                  vDateName.select();
                  return false;
               }
            }
         }
      }
      else {
         // Non isNav Check
         if (((vDateValue.length < 8 && dateCheck) || (vDateValue.length == 9 && dateCheck)) && (vDateValue.length >=1)) {
            alert("Data Inválida");
            vDateName.value = "";
            vDateName.focus();
            return true;
         }
         // Reformat date to format that can be validated. mm/dd/yyyy
         if (vDateValue.length >= 8 && dateCheck) {
            // Additional date formats can be entered here and parsed out to
            // a valid date format that the validation routine will recognize.
            if (vDateType == 1) { // mm/dd/yyyy
               var mMonth = vDateName.value.substr(0,2);
               var mDay = vDateName.value.substr(3,2);
               var mYear = vDateName.value.substr(6,4)
            }
            if (vDateType == 2) { // yyyy/mm/dd
               var mYear = vDateName.value.substr(0,4)
               var mMonth = vDateName.value.substr(5,2);
               var mDay = vDateName.value.substr(8,2);
            }
            if (vDateType == 3) { // dd/mm/yyyy
               var mDay = vDateName.value.substr(0,2);
               var mMonth = vDateName.value.substr(3,2);
               var mYear = vDateName.value.substr(6,4)
            }
            if (vYearLength == 4) {
               if (mYear.length < 4) {
                   alert("Data Inválida");
                   vDateName.value = "";
                   vDateName.focus();
                   return true;
               }
            }
            // Create temp. variable for storing the current vDateType
            var vDateTypeTemp = vDateType;
            // Change vDateType to a 1 for standard date format for validation
            // Type will be changed back when validation is completed.
            vDateType = 1;

            // Store reformatted date to new variable for validation.
            var vDateValueCheck = mMonth+strSeperator+mDay+strSeperator+mYear;
            if (mYear.length == 2 && vYearType == 4 && dateCheck) {
               //Turn a two digit year into a 4 digit year
               var mToday = new Date();
               //If the year is greater than 30 years from now use 19, otherwise use 20
               var checkYear = mToday.getFullYear() + 30; 
               var mCheckYear = '20' + mYear;
               if (mCheckYear >= checkYear)
                  mYear = '19' + mYear;
               else
                  mYear = '20' + mYear;
               vDateValueCheck = mMonth+strSeperator+mDay+strSeperator+mYear;
               // Store the new value back to the field.  This function will
               // not work with date type of 2 since the year is entered first.
               if (vDateTypeTemp == 1) // mm/dd/yyyy
                  vDateName.value = mMonth+strSeperator+mDay+strSeperator+mYear;
               if (vDateTypeTemp == 3) // dd/mm/yyyy
                  vDateName.value = mDay+strSeperator+mMonth+strSeperator+mYear;
            } 
            if (!dateValid(vDateValueCheck)) {
               alert("Data Inválida");
               vDateType = vDateTypeTemp;
               vDateName.value = "";
               vDateName.focus();
               return true;
            }
            vDateType = vDateTypeTemp;
            return true;
         }
         else {
            if (vDateType == 1) {
               if (vDateValue.length == 2) {
                  vDateName.value = vDateValue+strSeperator;
               }
               if (vDateValue.length == 5) {
                  vDateName.value = vDateValue+strSeperator;
               }
            }
            if (vDateType == 2) {
               if (vDateValue.length == 4) {
                  vDateName.value = vDateValue+strSeperator;
               }
               if (vDateValue.length == 7) {
                  vDateName.value = vDateValue+strSeperator;
               }
            } 
            if (vDateType == 3) {
               if (vDateValue.length == 2) {
                  vDateName.value = vDateValue+strSeperator;
               }
               if (vDateValue.length == 5) {
                   vDateName.value = vDateValue+strSeperator;
               }
            }
            return true;
         }
      }
      if (vDateValue.length == 10&& dateCheck) {
         if (!dateValid(vDateName)) {
            // Un-comment the next line of code for debugging the dateValid() function error messages
            //alert(err);  
            alert("Data Inválida");
            vDateName.focus();
            vDateName.select();
         }
      }
      return false;
   }
   else {
      // If the value is not in the string return the string minus the last
      // key entered.
      if (isNav4) {
         vDateName.value = "";
         vDateName.focus();
         vDateName.select();
         return false;
      }
      else {

         vDateName.value = vDateName.value.substr(0, (vDateValue.length-1));
         return false;
      }
   }
   }
}

function dateValid(objName) {
   var strDate;
   var strDateArray;
   var strDay;
   var strMonth;
   var strYear;
   var intday;
   var intMonth;
   var intYear;
   var booFound = false;
   var datefield = objName;
   var strSeparatorArray = new Array("-"," ","/",".");
   var intElementNr;
   // var err = 0;
   var strMonthArray = new Array(12);
   strMonthArray[0] = "01";
   strMonthArray[1] = "02";
   strMonthArray[2] = "03";
   strMonthArray[3] = "04";
   strMonthArray[4] = "05";
   strMonthArray[5] = "06";
   strMonthArray[6] = "07";
   strMonthArray[7] = "08";
   strMonthArray[8] = "09";
   strMonthArray[9] = "10";
   strMonthArray[10] = "11";
   strMonthArray[11] = "12";
   //strDate = datefield.value;
   strDate = objName;
   if (strDate.length < 1) {
      return true;
   }
   for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
      if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {
         strDateArray = strDate.split(strSeparatorArray[intElementNr]);
         if (strDateArray.length != 3) {
            err = 1;
            return false;
         }
         else {
            strDay = strDateArray[0];
            strMonth = strDateArray[1];
            strYear = strDateArray[2];
         }
         booFound = true;
      }
   }
   if (booFound == false) {
      if (strDate.length>5) {
         strDay = strDate.substr(0, 2);
         strMonth = strDate.substr(2, 2);
         strYear = strDate.substr(4);
      }
   }
   //Adjustment for short years entered
   if (strYear.length == 2) {
      strYear = '20' + strYear;
   }
   strTemp = strDay;
   strDay = strMonth;
   strMonth = strTemp;
   intday = parseInt(strDay, 10);
   if (isNaN(intday)) {
      err = 2;
      return false;
   }
   intMonth = parseInt(strMonth, 10);
   if (isNaN(intMonth)) {
      for (i = 0;i<12;i++) {
         if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) {
            intMonth = i+1;
            strMonth = strMonthArray[i];
            i = 12;
         }
      }
      if (isNaN(intMonth)) {
         err = 3;
         return false;
      }
   }
   intYear = parseInt(strYear, 10);
   if (isNaN(intYear)) {
      err = 4;
      return false;
   }
   if (intMonth>12 || intMonth<1) {
      err = 5;
      return false;
   }
   if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
      err = 6;
      return false;
   }
   if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
      err = 7;
      return false;
   }
   if (intMonth == 2) {
      if (intday < 1) {
         err = 8;
         return false;
      }
      if (LeapYear(intYear) == true) {
         if (intday > 29) {
            err = 9;
            return false;
         }
      }
      else {
         if (intday > 28) {
            err = 10;
            return false;
         }
      }
   }
   return true;
}

function LeapYear(intYear) {
   if (intYear % 100 == 0) {
      if (intYear % 400 == 0) { return true; }
   }
   else {
      if ((intYear % 4) == 0) { return true; }
   }
   return false;
}

function DateDiff(d1,d2){
   diffMilli = d2.getTime()-d1.getTime();
   return Math.round(diffMilli/(1000*60*60*24));
}
