/* Date Validation Constants */

var k_DATE_DEPART = 1;
var k_DATE_RETURN = 2;
var k_MAX_DAYS = 329;     // number of days into the future that we can search; should be 330, but I'm subtracting one to get rid of time issues
var k_STR_INVALID_DATE_MSG = "is not valid";

var k_NO_DATE_ERR = 0;
var k_ERR_DATE_IN_PAST = 64;
var k_ERR_DATE_LIMIT = 128;
var k_ERR_DATE_ORDER = 512;
var k_ERR_INVALID_DATE = 1024;

// core validation function
function validateDates(depart_date, return_date)
{
	var departDateErr = validateDate(depart_date);
	var returnDateErr = validateDate(return_date);
	var dateOrderErr = "";
	
	// Don't call the rest of the validation if we have invalid dates.
	if( (departDateErr + returnDateErr) == 0 )
  {
	  dateOrderErr = validateDateOrder(depart_date, return_date);
	}
	
	if (departDateErr + returnDateErr + dateOrderErr == 0)
		return true;
	else
	{
	  addDateValidationErrors(departDateErr, returnDateErr, dateOrderErr);
		return false;
	}
		
}

// validate a single date
function validateDate(strDte)
{
	var err = k_NO_DATE_ERR;
	
  if (!isDateString(strDte))
  {
    	return k_ERR_INVALID_DATE;
  }
  else if( new Date() > new Date(strDte) )  // if strDate is earlier than today
	  return k_ERR_DATE_IN_PAST;
  else
  {
    return validateDateLimit(strDte);
  }
}

// get the maximum date limit: currently today + 330 days
function getMaxDate()
{
  var DateMath=YAHOO.widget.DateMath; 
  var today = new Date();
  
	return DateMath.add(today, DateMath.DAY, k_MAX_DAYS);  
}

// validate that the date does not exceed the maximum limit
function validateDateLimit(strDte)
{
  	if( new Date(strDte) > getMaxDate() )  // if user-specified date is after than the latest searchable date 
      return k_ERR_DATE_LIMIT;  
    else
      return k_NO_DATE_ERR;
}

// validate that the return date is after the depart date
function validateDateOrder(depart_date, return_date)
{
  if( new Date(depart_date) > new Date(return_date) )   //if depart date after return date
    return k_ERR_DATE_ORDER;  
  else
    return k_NO_DATE_ERR;
}

// get the error messages for a specific date
function getDateErrorMessages(err, which)
{
  var strVerb = "";
  var strAdj = "";
  
  if( which == k_DATE_DEPART )
  {
    strVerb = "start";
    strAdj = "departure";
  }
  else
  {
    strVerb = "end";
    strAdj = "return";
  }
  
  switch(err)
  {
    case k_ERR_INVALID_DATE:
      return "The " + strAdj + " date " + k_STR_INVALID_DATE_MSG + ".<br />";
      break;
    case k_ERR_DATE_LIMIT:
      return "Your trip must " + strVerb + " on or before " + formatDate(getMaxDate(), true, true) + ".<br />";
      break;
    case k_ERR_DATE_IN_PAST:
      return "Your trip cannot " + strVerb + " in the past.<br />";
      break;
  }

  return "";
}

// add the error messages to the div
function addDateValidationErrors(departDateErr, returnDateErr, dateOrderErr)
{
  var strNewMessage = "";
  
  strNewMessage += getDateErrorMessages(departDateErr, k_DATE_DEPART);
  strNewMessage += getDateErrorMessages(returnDateErr, k_DATE_RETURN);
  
  if( dateOrderErr == k_ERR_DATE_ORDER)
   strNewMessage +=  "You can't return before you leave." + "<br />";

  $('client_validation_message').innerHTML += strNewMessage;
    
	return true;
}
