function getToday() {
  var oD = new Date();
  return [oD.getFullYear(), (oD.getMonth()+1), oD.getDate()];
}

function fixDateNumeric(aDate) {
  return [parseInt(aDate[0], 10), parseInt(aDate[1], 10), parseInt(aDate[2], 10)];
}

function getNextDay(aDate) {
  aDate = fixDateNumeric(aDate);
  var oD = new Date();
  oD.setFullYear(aDate[0]);
  oD.setMonth(aDate[1]-1);
  oD.setDate(aDate[2]+1);
  return [oD.getFullYear(), (oD.getMonth()+1), oD.getDate()];
}

function getThisDay(nYM, nD) {
  nYM = parseInt(nYM, 10);
  nD = parseInt(nD, 10);
  var nM = nYM%100;
  return [((nYM-nM)/100), nM, nD];
}

function getThisDayById(sIdYM, sIdD) {
  var oSelectYM = document.getElementById(sIdYM);
  var oSelectD = document.getElementById(sIdD);
  return getThisDay(oSelectYM.value, oSelectD.value);
}

function getThisDayByDateISO(sDateISO) {
  return fixDateNumeric(sDateISO.split('-', 3));
}

function getMonthLen(aDate) {
  aDate = fixDateNumeric(aDate);
  var bLeapYear = (((aDate[0]%4 == 0) && (aDate[0]%100 != 0)) || (aDate[0]%400 == 0));
  var aMonthLen = new Array(31,(bLeapYear?29:28),31,30,31,30,31,31,30,31,30,31);
  return aMonthLen[aDate[1]-1];
}

function makeYM(aDate) {
  aDate = fixDateNumeric(aDate);
  return aDate[0]*100+aDate[1];
}

function getMonthStartWeekDay(aDate) {
  aDate = fixDateNumeric(aDate);
  var oD = new Date();
  oD.setFullYear(aDate[0]);
  oD.setMonth(aDate[1]-1);
  oD.setDate(1);
  return oD.getDay();
}

function getMonths4Select(aDate) {
  aDate = fixDateNumeric(aDate);
  var nY = aDate[0];
  var nM = aDate[1]-1;
  var aResult = new Array();

  for(var i = 0; i < 12; i++) {
    if(i > 0 && nM == 0) {
      nY++;
    }
    aResult[i] = [makeYM([nY, nM+1]), aMonthName[nM]+" '"+ String(nY).substr(2,2)];
    nM = (nM+1)%12;
  }
  return aResult;
}

function getDays4Select(aDate) {
  var nLen = getMonthLen(aDate);
  var nWeekDay = getMonthStartWeekDay(aDate);
  var aResult = new Array();

  for(var i = 0; i < nLen; i++) {
    aResult[i] = [i+1, aWeekDayName[(nWeekDay+i)%7]+" "+String(i+1)];
  }
  return aResult;
}

function initSelect(sId, aOptionData) {
  var oSelect = document.getElementById(sId);
  // remove all
  for(var i = oSelect.length; i > 0 ; i--) {
    oSelect.remove(i-1);
  }
  // add new options
  for(var i = 0; i < aOptionData.length; i++) {
    var oOption = document.createElement('option');
    oOption.value = aOptionData[i][0];
    oOption.text = aOptionData[i][1];
    try {
      oSelect.add(oOption, null); // standards compliant
    }
    catch(ex) {
      oSelect.add(oOption); // IE only
    }
  }
}

function selectOption(sId, sDefaultValue) {
  var oSelect = document.getElementById(sId);
  for(var i = 0; i < oSelect.length; i++) {
    oSelect.options[i].selected = (oSelect.options[i].value == sDefaultValue);
  }
}

function initTextDate(oField, aDate) {
  aDate = fixDateNumeric(aDate);
  if(aDate[1] < 10) {
    aDate[1] = "0".concat(aDate[1]);
  }
  if(aDate[2] < 10) {
    aDate[2] = "0".concat(aDate[2]);
  }
  oField.value = aDate.join("-");
}

function cmpDate(aDate1, aDate2) {
  var nDate1 = aDate1[0]*10000+aDate1[1]*100+aDate1[2];
  var nDate2 = aDate2[0]*10000+aDate2[1]*100+aDate2[2];
  return (nDate1 < nDate2) ? 1 : ((nDate1 > nDate2) ? -1 : 0) ;
}

function changeDate1(oContext, sIdYM1, sIdD1, oDIso1, sIdYM2, sIdD2, oDIso2) {
  if(oContext.id == sIdYM1) {
    initSelect(sIdD1, getDays4Select(getThisDay(oContext.value, null)));
  }

  var aDate1 = getThisDayById(sIdYM1, sIdD1);
  initTextDate(oDIso1, aDate1);

  var aDate2c = getThisDayById(sIdYM2, sIdD2); // current selected
  var aDate2 = getNextDay(aDate1); // next to date1
  if(cmpDate(aDate2c, aDate2) > 0) {
    selectOption(sIdYM2, makeYM(aDate2));
    initSelect(sIdD2, getDays4Select(aDate2));
    selectOption(sIdD2, aDate2[2]);
    initTextDate(oDIso2, aDate2);
  }

  return true;
}

function changeDate2(oContext, sIdYM2, sIdD2, oDIso2) {
  if(oContext.id == sIdYM2) {
    initSelect(sIdD2, getDays4Select(getThisDay(oContext.value, null)));
  }

  var aDate2 = getThisDayById(sIdYM2, sIdD2);
  initTextDate(oDIso2, aDate2);

  return true;
}

function initDate(sIdYM1, sIdD1, oDIso1, sIdYM2, sIdD2, oDIso2) {
  var aToday = getToday();
  initSelect(sIdYM1, getMonths4Select(aToday));
  initSelect(sIdYM2, getMonths4Select(aToday));

  var aDate1 = getThisDayByDateISO(oDIso1.value);
  selectOption(sIdYM1, makeYM(aDate1));
  initSelect(sIdD1, getDays4Select(aDate1));
  selectOption(sIdD1, aDate1[2]);

  var aDate2 = getThisDayByDateISO(oDIso2.value);
  selectOption(sIdYM2, makeYM(aDate2));
  initSelect(sIdD2, getDays4Select(aDate2));
  selectOption(sIdD2, aDate2[2]);
}
