var MONTH_NAMES = new Array(
  'Janeiro',
  'Fevereiro',
  'Março',
  'Abril',
  'Maio',
  'Junho',
  'Julho',
  'Agosto',
  'Setembro',
  'Outubro',
  'Novembro',
  'Dezembro');
var WEEKDAY_NAMES = new Array("Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab");

// ---
// getDateFromFormat( date_string , format_string )
//
// This function takes a date string and a format string. It matches
// If the date string matches the format string, it returns the 
// getTime() of the date. If it does not match, it returns 0.
// 
// This function uses the same format strings as the 
// java.text.SimpleDateFormat class, with minor exceptions.
// 
// The format string consists of the following abbreviations:
// 
// Field        | Full Form          | Short Form
// -------------+--------------------+-----------------------
// Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
// Month        | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
// Day of Month | dd (2 digits)      | d (1 or 2 digits)
// Hour (0-12)  | hh (2 digits)      | h (1 or 2 digits)
// Hour (0-23)  | HH (2 digits)      | H (1 or 2 digits)
// Minute       | mm (2 digits)      | m (1 or 2 digits)
// Second       | ss (2 digits)      | s (1 or 2 digits)
// AM/PM        | a                  |
//
// Examples:
//  "MMM d, y" matches: January 01, 2000
//                      Dec 1, 1900
//                      Nov 20, 00
//  "m/d/yy"   matches: 01/20/00
//                      9/2/00
//  "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
// ------------------------------------------------------------------
function getDateFromFormat( val, format ) {
  val    = ""+val;
  format = ""+format;
  var i_val    = 0;
  var i_format = 0;
  var c      = "";
  var token  = "";
  var token2 = "";
  var x,y;
  var now   = new Date();
  var year  = now.getYear();
  var month = now.getMonth()+1;
  var date  = now.getDate();
  var hh    = 0;
  var mm    = 0;
  var ss    = 0;
  var ampm  = "";
  while (i_format < format.length) {
    // Get next token from format string
	c = format.charAt(i_format);
    token = "";
    while ((format.charAt(i_format) == c) && (i_format < format.length)) {
      token += format.charAt(i_format);
	  i_format++;
    }
	// Extract contents of value based on format token
	switch (token) {
	  case "yyyy":
	  case "yy":
	  case "y":
        if (token=="yyyy") { 
		  x=4; 
		  y=4; 
		} // 4-digit year
        if (token=="yy") {
		  x=2;
		  y=2;
		} // 2-digit year
	    if (token=="y") { 
		  x=2;
		  y=4;
		} // 2-or-4-digit year
        year = _getInt(val,i_val,x,y);
        if (year == null) { return 0; }
        i_val += year.length;
        if (year.length == 2) {
          if (year > 70) {
            year = 1900+parseInt(year,10);
          } else {
            year = 2000+parseInt(year,10);
          }
        } else {
		  year = parseInt(year,10);
		}
		break;
      case "MMM":
	    month = 0;
	    for (var i=0; i<MONTH_NAMES.length; i++) {
          var month_name = MONTH_NAMES[i];
          if (val.substring(i_val,i_val+month_name.length).toLowerCase() == month_name.toLowerCase()) {
            month = i+1;
            i_val += month_name.length;
		    break;
		  }
	    }
	    if (month == 0) { return 0; }
	    if ((month < 1) || (month>12)) { return 0; }
        break;
      case "MM":
	  case "M":
        x=token.length; 
		y=2;
        month = _getInt(val,i_val,x,y);
        if (month == null) { return 0; }
        if ((month < 1) || (month > 12)) { return 0; }
        i_val += month.length;
        month = parseInt(month,10);
		break;
      case "dd":
	  case "d":
        x=token.length; y=2;
        date = _getInt(val,i_val,x,y);
        if (date == null) { return 0; }
        if ((date < 1) || (date>31)) { return 0; }
        i_val += date.length;
		date = parseInt(date,10);
		break;
	  case "hh":
	  case "h":
        x=token.length; 
		y=2;
        hh = _getInt(val,i_val,x,y);
        if (hh == null) { return 0; }
        if ((hh < 1) || (hh > 12)) { return 0; }
        i_val += hh.length;
		hh = parseInt(hh,10);
		break;
	  case "HH":
	  case "H":
        x=token.length;
		y=2;
        hh = _getInt(val,i_val,x,y);
        if (hh == null) { return 0; }
        if ((hh < 0) || (hh > 23)) { return 0; }
        i_val += hh.length;
		break;
      case "mm":
	  case "m":
        x=token.length;
		y=2;
        mm = _getInt(val,i_val,x,y);
        if (mm == null) { return 0; }
        if ((mm < 0) || (mm > 59)) { return 0; }
        i_val += mm.length;
		mm = parseInt(mm,10);
		break;
      case "ss":
	  case "s":
        x=token.length;
		y=2;
        ss = _getInt(val,i_val,x,y);
        if (ss == null) { return 0; }
        if ((ss < 0) || (ss > 59)) { return 0; }
        i_val += ss.length;
		ss = parseInt(ss,10);
		break;
      case "a":
        if (val.substring(i_val,i_val+2).toLowerCase() == "am") {
          ampm = "AM";
		  if (hh==12) { hh = 0; }
        } else if (val.substring(i_val,i_val+2).toLowerCase() == "pm") {
          ampm = "PM";
		  if ( hh<12 ) { hh += 12 }
        } else {
          return 0;
        }
	    i_val += 2;
		break;
      default:
        if (val.substring(i_val,i_val+token.length) != token) {
          return 0;
        } else {
          i_val += token.length;
        }
    }
  }
  // If there are any trailing characters left in the value, it doesn't match
  if (i_val != val.length) { return 0; }
  // A data é válida para o mês?
  if (month == 2) {
    // Check for leap year
    if ( ( (year%4 == 0)&&(year%100 != 0) ) || (year%400 == 0) ) { // ano bissexto
      if (date > 29){ return 0; }
    } else {
      if (date > 28) { return 0; }
    }
  }
  if ((month==4)||(month==6)||(month==9)||(month==11)) {
    if (date > 30) { return 0; }
  }
  var newdate = new Date(year,month-1,date,hh,mm,ss);
  return newdate.getTime();
} // getDateFromFormat()

// ---
// isDate ( date_string, format_string )
// ---
function isDate(val,format) {
  var date = getDateFromFormat(val,format);
  if (date == 0) { 
    return false; 
  }
  return true;
} // isDate

// ---
// _isInteger()
// ---
function _isInteger(val) {
  var digits = "1234567890";
  for (var i=0; i < val.length; i++) {
    if (digits.indexOf(val.charAt(i)) == -1) { return false; }
  }
  return true;
} // _IsInteger()

// ---
// _getInt()
// ---
function _getInt(str,i,minlength,maxlength) {
  for (x=maxlength; x>=minlength; x--) {
    var token = str.substring(i,i+x);
    if (token.length < minlength) {
	  return null;
    }
    if (_isInteger(token)) { 
      return token;
    }
  }
  return null;
} // _getInt()

// -------------------------------------------------------------------
// compareDates(date1,date1format,date2,date2format)
//   Compare two date strings to see which is greater.
//   Returns:
//   1 if date1 is greater than date2
//   0 if date2 is greater than date1 of if they are the same
//  -1 if either of the dates is in an invalid format
// -------------------------------------------------------------------
function compareDates(date1,dateformat1,date2,dateformat2) {
  var d1 = getDateFromFormat(date1,dateformat1);
  var d2 = getDateFromFormat(date2,dateformat2);
  if (d1==0 || d2==0) {
    return -1;
  } else if (d1 > d2) {
    return 1;
  }
  return 0;
}

// ---
// formatDate (date_object, format)
// --
// Returns a date in the output format specified.
// The format string uses the same abbreviations as in getDateFromFormat()
// ---
function formatDate( date, format ) {
  if (date=="NaN"||isNaN(date)||date=="") { return ""; }
  format = ""+format;
  var result   = "";
  var i_format = 0;
  var c        = "";
  var token    = "";
  var ano      = date.getFullYear();
  var mes      = date.getMonth()+1;
  var dia      = date.getDate();
  var hora     = date.getHours();
  var minuto   = date.getMinutes();
  var segundo  = date.getSeconds();
  var yyyy,yy,MMM,MM,dd,hh,h,HH,H,mm,ss,ampm;
  // Conversão para os diversos formatos
  // Year
  y    = "" + ano;
  yyyy = "" + ano;
  yy   = y.substring(2,4);
  // Month
  M = "" + mes;
  if (mes < 10) { MM = "0"+mes; } else { MM = ""+mes }; 
  MMM = MONTH_NAMES[mes-1];
  // Date
  d = "" + dia;
  if (dia < 10) { dd = "0" + dia; } else { dd = "" + dia }; 
  // Hour
  H = "" + hora;
  if (hora < 10) { HH = "0" + hora } else { HH = "" + hora };
  if (hora == 0) {
    ampm = "AM";
	h = hh = "12";
  } else if (hora < 12) {
    ampm = "AM";
	h = ""+hora;
	if (hora<10) { hh = "0"+hora; } else { hh = "" + hora };
  } else if (hora == 12) {
    ampm = "PM";
	h = hh = "12";
  } else {
    hora -= 12;
	h  = "" + hora;
	if (hora<10) { hh = "0"+hora; } else { hh = "" + hora };
  }
  // Minute
  m = "" + minuto;
  if (minuto < 10) { mm = "0" + minuto; } else { mm = "" + minuto; }
  // Second
  s = "" + segundo;
  if (segundo < 10) { ss = "0" + segundo; } else { ss = "" + segundo; }
  // Now put them all into an object!
  var value = new Object();
  value["yyyy"] = yyyy;
  value["yy"]   = yy;
  value["y"]    = y;
  value["MMM"]  = MMM;
  value["MM"]   = MM;
  value["M"]    = M;
  value["dd"]   = dd;
  value["d"]    = d;
  value["hh"]   = hh;
  value["h"]    = h;
  value["HH"]   = HH;
  value["H"]    = H;
  value["mm"]   = mm;
  value["m"]    = m;
  value["ss"]   = ss;
  value["s"]    = s;
  value["a"]    = ampm;
  while (i_format < format.length) {
    // Get next token from format string
    c = format.charAt(i_format);
    token = "";
    while ((format.charAt(i_format) == c) && (i_format < format.length)) {
      token += format.charAt(i_format);
      i_format++;
    } 
    if (value[token] != null) {
      result = result + value[token];
    } else {
      result = result + token;
    }
  }
  return result;
} // formatDate()

// --
// DateAdd
// --
function DateAdd(startDate, numDays, numMonths, numYears) {
  var returnDate = new Date(startDate.getTime());
  var hours   = startDate.getHours();
  var minutes = startDate.getMinutes();
  var seconds = startDate.getSeconds();
  var yearsToAdd = numYears;
  var month = returnDate.getMonth()	+ numMonths;
  if (month > 11) {
    yearsToAdd = Math.floor((month+1)/12);
    month -= 12*yearsToAdd;
    yearsToAdd += numYears;
  }
  returnDate.setMonth(month);
  returnDate.setFullYear(returnDate.getFullYear() + yearsToAdd);
  returnDate.setTime(returnDate.getTime()+60000*60*24*numDays);
  // -- Fugindo dos Acertos de Horário de Verão
  returnDate.setHours(startDate.getHours());
  returnDate.setMinutes(startDate.getMinutes());
  returnDate.setSeconds(startDate.getSeconds());
  return returnDate;
} // DateAdd()

// --
// HourAdd()
//
function HourAdd(startDate, numHours) {
  var returnDate = new Date(startDate.getTime());
  returnDate.setTime(returnDate.getTime()+60000*60*numHours);
  return returnDate;
}  // HoursAdd()

// --
// MinuteAdd()
//
function MinuteAdd(startDate, numMinutes) {
  var returnDate = new Date(startDate.getTime());
  returnDate.setTime(returnDate.getTime()+60000*numMinutes);
  return returnDate;
}  // MinuteAdd()

// --
// SecondAdd()
//
function SecondAdd(startDate, numSeconds) {
  var returnDate = new Date(startDate.getTime());
  returnDate.setTime(returnDate.getTime()+1000*numSeconds);
  return returnDate;
}  // SecondAdd()

// --
// YearAdd()
// --
function YearAdd(startDate, numYears) {
  return DateAdd(startDate,0,0,numYears);
} // YearAdd()

// --
// MonthAdd()
// --
function MonthAdd(startDate, numMonths) {
  return DateAdd(startDate,0,numMonths,0);
} // MonthAdd()

// --
// DayAdd()
// --
function DayAdd(startDate, numDays) {
  return DateAdd(startDate,numDays,0,0);
} // DayAdd()

// --
// whenIs()
// --
function whenIs(anyDate, n) {
  //-- Returns the date that is n days from any date object.
  var newDate = new Date();
  newDate.setTime(anyDate.getTime()+(n*1000*60*60*24));
  return newDate;
} // whenIs

// --
// newDate()
// --
function newDate(passedValue) {
  var makeDate = new Date();
  var firstSlash=passedValue.indexOf("/");
  var lastSlash=passedValue.lastIndexOf("/");
  var day=passedValue.substr(0,firstSlash);
  var month=passedValue.substring(firstSlash+1,lastSlash)-1;
  var year=passedValue.substr(lastSlash+1);
  var newDate = new Date(year,month,day);
  return newDate;
} // newDate()

// --
// daysBetween()
// --
function daysBetween(earlyDate,laterDate){
  //-- Retorna o Número de Dias entre Dois Objetos da Classe Date
  var earlySecs = earlyDate.getTime();
  var laterSecs = laterDate.getTime();
  return Math.floor ((((((laterSecs-earlySecs)/1000)/60)/60)/24));
} // daysBetween()

// --
// minutesBetween()
// --
function minutesBetween(earlyDate,laterDate){
  //-- Retorna a Diferença entre Duas Datas
  var earlySecs = earlyDate.getTime();
  var laterSecs = laterDate.getTime();
  return Math.floor(((laterSecs-earlySecs)/1000)/60);
} // minutesBetween()

// --
// hoursBetween()
// --
function hoursBetween(earlyDate,laterDate){
  //-- Retorna a Diferença entre Duas Datas
  var earlySecs = earlyDate.getTime();
  var laterSecs = laterDate.getTime();
  return Math.floor ((((((laterSecs-earlySecs)/1000)/60)/60)));
} // hoursBetween()

// --
// StrToDateTime()
// --
function StrToDateTime(vl, ft) {
  var d = new Date();
  d.setTime( getDateFromFormat(vl, ft) );
  if ( d==0 ) { d = NaN };
  return d;
} // StrToDateTime()