Number.prototype.zeroFormat = function(n, f, r) {
  f = f ? f : true;
  return n = new Array((++n, f ? (f = (this + "").length) < n ? n - f : 0 : n)).join(0), r ? this + n : n + this;
};

function strftime(format, timestamp) {
  if (strftime_locale == undefined) {
    var strftime_locale = {
      weekday: ['domingo', 'segunda-feira', 'ter&ccedil;a-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 's&aacute;bado'],
      month:   ['janeiro', 'fevereiro', 'mar&ccedil;o', 'abril', 'maio', 'junho',
                'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],
      date:     '%d/%m/%Y',
      time:     '%H:%M:%S',
      datetime: '%d/%m/%Y %H:%M:%S',
      meridiem: ['am', 'pm']
    };
  }
  var date = new Date(timestamp * 1000);
  var result = '';
  for (var i = 0; i < format.length; i++) {
    if (format.charAt(i) != '%') {
      result += format.charAt(i);
      continue;
    }
    if (i+1 >= format.length) break;
    switch (format.charAt(++i)) {
      case 'a': // dia da semana abrev
        result += strftime_locale.weekday[date.getDay()].substr(0, 3);
        break;
      case 'A': // dia da semana
        result += strftime_locale.weekday[date.getDay()];
        break;
      case 'h':
      case 'b': // nome do mês abrev
        result += strftime_locale.month[date.getMonth()].substr(0, 3);
        break;
      case 'B': // nome do mês
        result += strftime_locale.month[date.getMonth()];
        break;
      case 'c': // representação da data e hora preferida pela a localidade 
        result += strftime(strftime_locale.datetime, timestamp);
        break;
      case 'C': // século
        result += Math.ceil(date.getFullYear() / 100);
        break;
      case 'd': // dia do mês 01-31
        result += date.getDate().zeroFormat(2);
        break;
      case 'e': // dia do mês 1-31
        result += date.getDate();
        break;
      case 'I': // h // hora 01-12
        if (date.getHours() > 12) {
          result += (date.getHours() - 12).zeroFormat(2);
          break;
        }
      case 'H': // hora 00-23
        result += date.getHours().zeroFormat(2);
        break;
      case 'j': // dia do ano 001-366
        yearDay = date - new Date(date.getFullYear(), 0, 1);
        yearDay = Math.ceil(Number(yearDay) / 86400000);
        result += yearDay.zeroFormat(3);
        break;
      case 'm': // mês 01-12
        result += (date.getMonth() + 1).zeroFormat(2);
        break;
      case 'M': // minutos 00-59
        result += date.getMinutes().zeroFormat(2);
        break;
      case 'r':
      case 'p': // meridiano am|pm
        if (date.getHours() < 12) result += strftime_locale.meridiem[0];
        else result += strftime_locale.meridiem[1];
        break;
      case 'S': // segundos 00-59
        result += date.getSeconds().zeroFormat(2);
        break;
      case 'T': // hora %H:%M:%S
        result += date.getHours().zeroFormat(2)+':'+date.getMinutes().zeroFormat(2)+':'+date.getSeconds().zeroFormat(2);
        break;
      case 'u': // dia da semana 1-7; 1 = segunda-feira
        result += (date.getDay()) ? date.getDay() : 7;
        break;
      case 'w': // dia da semana 0-6; 0 = domingo
        result += date.getDay();
        break;
      case 'x': // representação preferida para a data para a localidade corrente sem a hora
        result += strftime(strftime_locale.date, timestamp);
        break;
      case 'X': // representação preferida para a data para a localidade corrente sem a hora
        result += strftime(strftime_locale.time, timestamp);
        break;
      case 'y': // ano sem o século 00-99
        result += String(date.getFullYear()).substr(2);
        break;
      case 'Y': // ano incluindo o século
        result += date.getFullYear();
        break;
      case '%':
        result += '%';
    }
  }
  return result;
}

function autoDate(output, format, timestamp) {
  var time = 0;
  window.setInterval(function() {
    output.html(strftime(format, timestamp + time++));
  }, 1000);
}

function checkdate(year, month, day) {
  if (year < 1 && year > 32767) return false;
  if (month < 1 && month > 12) return false;
  if (day < 1) return false;
  
  switch (month) {
    case 4:
    case 6:
    case 9:
    case 11:
      return day <= 30;
    case 2:
      return day <= ((year % 4) ? 28 : 29);
    default:
      return day <= 31;
  }
}
