/**
 * Validate date.
 *
 * @param {String} date Date string of (mm/dd/yyyy)
 */
function validateDate(date)
{
  // make sure it is in the expected format
  var arDate = date.split("/");
  if (3 != arDate.length) return false;
  var iM = parseInt(arDate[0].replace(/^0/, '')), iD = parseInt(arDate[1].replace(/^0/, '')), iY = parseInt(arDate[2]);

  // Validate year.
  var curDate = new Date();
  if (1970 == iY || 1 < (curDate.getFullYear() - iY)) return false;
  var leapYear = ((iY % 4 == 0) || (iY % 100 == 0) || (iY % 400 == 0));

  // Validate month.
  if (1 > iM || 12 < iM) return false;

  // Validate february.
  if ((iM == 2) && leapYear && (iD > 29)) return false;
  if ((iM == 2) && ! leapYear && (iD > 28)) return false;

  // Validate other months.
  if ((iD > 31) && ((iM == 1) || (iM == 3) || (iM == 5) || (iM == 7) || (iM == 8) || (iM == 10) || (iM == 12))) return false;
  if ((iD > 30) && ((iM == 4) || (iM == 6) || (iM == 9) || (iM == 11))) return false;

  return true;
}

/**
 * Set date value of element.
 *
 * @todo Add format date for value.
 *
 * @param {String} id Element id
 * @param {Date} date Date object for set value.
 */
function setFieldDate(id, date)
{
  var fieldNode;
  if (null !== (fieldNode = YAHOO.util.Dom.get(id)))
  {
    var year = date.getFullYear(), month = date.getMonth() + 1, day = date.getDate();
    if(day < 10){day = '0' + day;}
    if(month < 10) {month = '0' + month;}
    fieldNode.value = month + "/" + day + "/" + year;

    if (null !== (fieldNode = YAHOO.util.Dom.get(id + '_error')))
      YAHOO.util.Dom.replaceClass(id + '_error', 'show', 'hide');
  }
}

/**
 * Default callback select clendar.
 */
function defaultSelectCal(type, args, obj)
{
  var dates = args[0];
  var date = dates[0];
  setFieldDate(obj.id + '_val', this.toDate(dates[0]));
  obj.hide();
}

/**
 * Callback for calendar in yaVisaHistoryPageForm
 */
function searchFlightSelectCal(type, args, obj)
{
  var dates = args[0];
  var date = dates[0];
  var selDate = this.toDate(dates[0]);

  var id_parts = obj.id.match(/(depart|retur)(\w+)/i);
  var cnode = (id_parts.length ? id_parts[1] : obj.id);
  var cix = (id_parts.length ? id_parts[2] : '');

  switch(cnode)
  {
    case 'depart':
      var cout = 'retur' + cix;
      var validDateMin = YAHOO.widget.DateMath.add(selDate, 'D', 1);
      eval('\
      YAHOO.' + cout + '.cal.cfg.setProperty("MINDATE", validDateMin); \
      YAHOO.' + cout + '.cal.setYear(validDateMin.getFullYear()); \
      YAHOO.' + cout + '.cal.setMonth(validDateMin.getMonth()); \
      YAHOO.' + cout + '.cal.cfg.setProperty("MAXDATE", YAHOO.widget.DateMath.add(YAHOO.' + cout + '.cal.cfg.getProperty("MINDATE"), "Y", 1)); \
      YAHOO.' + cout + '.cal.render();');
    break;
  }

  setFieldDate(cnode + '_val' + cix, selDate);
  obj.hide();
}

