// Utility
Date._zeroPad = function(num) {
var s = '0' + num;
return s.substring(s.length - 2);
};
Date.prototype.asString = function(pattern) {
return (pattern || "yyyymmdd")
.split('yyyy').join(this.getFullYear())
.split('yy').join((this.getFullYear() + '').substring(2))
.split('mm').join(Date._zeroPad(this.getMonth() + 1))
.split('dd').join(Date._zeroPad(this.getDate()))
};
Date.prototype.asYMString = function() {
return this.asString("yyyymm");
};
Date.prototype.asYString = function() {
return this.asString("yyyy");
};
Date.prototype.asMString = function() {
return this.asString("mm");
};
Date.prototype.asDateString = function() {
return this.asString("dd");
};
Date.parse = function(date) {
var m = date.match(/(\d{4})(\d{2})(\d{2})/);
if (m && m.length > 3) {
return new Date(m[1], m[2] - 1, m[3]);
}
return null; //new Date;
};
Date.prototype.nextDate = function() {
this.setDate(this.getDate() + 1);
return this;
};
Date.prototype.nextMonth = function() {
this.setDate(1);
this.setMonth(this.getMonth() + 1);
return this;
};
Date.prototype.daysInMonth = function() {
var year = this.getFullYear(), month = this.getMonth() + 1;
var dd = new Date(year, month, 0);
return dd.getDate();
};
Date.prototype.addDate = function(days) {
this.setDate(this.getDate() + days);
return this;
};


$(function() {

// from query string or today.
var specified = (function(d) {
  var m = decodeURIComponent(String(location.search)).match(/date_ymd=(\d{4}\d{2}\d{2})/);
  if (m && m.length > 0) {
    return Date.parse(m[1]);
  }
  return d;
})(new Date);

var now = new Date;
var mindate = new Date(now.getFullYear(), now.getMonth(), now.getDate());
var maxdate = new Date(now.getFullYear(), now.getMonth() + 6, 0);
if (specified < mindate || specified > maxdate) {
specified = now;
}

$('#date_ymd').datepicker({
beforeShow: readSelected,
onSelect: updateSelected,
minDate: mindate, //new Date(y, m - 1, d),
maxDate: maxdate, //new Date(y, m + 5, 0),
//showOn: 'both',
showOn: 'button',
buttonImageOnly: true,
numberOfMonths: 3,
buttonImage: '/images/btn_calender.gif',
showButtonPanel: true
});

function readSelected() {
$('#date_ymd').val($('#date_y').val() + $('#date_m').val() + $('#date_d').val());
return {};
}

function updateSelected() {
  var selected = $('#date_ymd').val();
  var date = Date.parse(selected);
  var ym = date.asYMString();
  var y = date.asYString();
  var m = date.asMString();

  var select = $('#date_y').get(0);
    for (var i = 0; i < select.options.length; i++) {
      if (select.options[i].value == y) {
        select.selectedIndex = i;
        break;
      }
    }
  createMPullDown(selected);
}

function createYMPullDown(date) {
  var dd = Date.parse(date);
  var select = $('#date_y').get(0);
  var yy = null;
  var j = 0;
  for (var i = 0; i < 6; i++) {
    if (yy != dd.asYString()) {
      yy = dd.asYString();
      select.options[j] = new Option(dd.asYString() + '年', dd.asYString());      
      j = j + 1;
    }
    dd.nextMonth();
  }
  createMPullDown(date);
}

function createMPullDown(date) {
  var nowdate = new Date;
  var dd = Date.parse(date);
  var select = $('#date_m').get(0);
  var yy = dd.asYString();
  var j = 0;

  while (select.options.length > 0) select.remove(0);

  for (var i = 0; i < 6; i++) {
    if (yy == nowdate.asYString()) {
      select.options[j] = new Option(nowdate.asMString() + '月', nowdate.asMString());
      if (dd.asMString() == nowdate.asMString()) {
        select.selectedIndex = j;
      }
      j = j + 1;
    }
    nowdate.nextMonth();
  }
  createDatePullDown(date);
}

function createDatePullDown(date) {
  var dd = Date.parse(date);
  var selectedDate = dd.getDate();
  var select = $('#date_d').get(0);
  dd.setDate(1);

  if(Date.parse(date) < mindate) {
    selectedDate = now.getDate();
  }

  while (select.options.length > 0) select.remove(0);

  var past = 0;
    if(now.getFullYear()==dd.getFullYear()
      && now.getMonth()==dd.getMonth()) {
      past = now.getDate() - 1;
      dd.addDate(past);
    }

  //for (var i = 0, days = dd.daysInMonth(); i < days; i++) {
  for (var i = 0, days = dd.daysInMonth() - past; i < days; i++) {
    select.options[i] = new Option(dd.asDateString() + '日', dd.asDateString());
    dd.nextDate();
  }

  //select.selectedIndex = selectedDate - 1;
  select.selectedIndex = selectedDate - 1 - past;
}


// Initialize
createYMPullDown(now.asString());
$('#date_ymd').val(specified.asString());
updateSelected();

$('#date_y').change(function() {
    createMPullDown($('#date_y :selected').val() + $('#date_m :selected').val() + $('#date_d :selected').val());
});
$('#date_m').change(function() {
    createDatePullDown($('#date_y :selected').val() + $('#date_m :selected').val() + $('#date_d :selected').val());
});

});


