var dropdownDayPrefix;
var dropdownMonthPrefix;
var dropdownYearPrefix;
var dropdownHourPrefix;
var dropdownMinutePrefix;
var dropdownSecondPrefix;

var yearMin;
var yearMax;
var maxDisplayYears = 100;

var INIT_MIN = 1;
var INIT_MAX = 2;



function setYearMin(minimalYear) {
  yearMin = minimalYear;
}



function setYearMax(maximalYear) {
  yearMax = maximalYear;
}



function setMaxDisplayYears(displayYears) {
  maxDisplayYears = displayYears;
}



//function initDropdowns(baseHiddenInputName, value, initMinOrMax, minutesInterval) {
function initDropdowns(baseHiddenInputName, initMinOrMax, minutesInterval) {
  var hiddenValue = document.getElementById(baseHiddenInputName).value;
  
  // 1. INIT DATE
  var dayObject = document.getElementById(dropdownDayPrefix + baseHiddenInputName);
  var monthObject = document.getElementById(dropdownMonthPrefix + baseHiddenInputName);
  var yearObject = document.getElementById(dropdownYearPrefix + baseHiddenInputName);
  
  var currentYear = (new Date()).getFullYear();

  if (!(yearMax > 0)) {
    yearMax = currentYear;
  }
  
  if (!(yearMin > 0)) {
    yearMin = yearMax-maxDisplayYears;
  }
  
  var dateFields = getDateFieldsFromString(hiddenValue);
  
  var valueYear = dateFields[0];
  var valueMonth = dateFields[1];
  var valueDay = dateFields[2];
  
  //alert(hiddenValue+'---'+valueYear+'-'+valueMonth+'-'+valueDay);

  
  // JK: handle defult 0 DATE value
  if (valueDay == 0 || isNaN(valueDay)) {
    if (initMinOrMax == INIT_MIN) {
      valueDay = 1;
    }
    else if (initMinOrMax == INIT_MAX) {
      valueDay = 31;
    }
  }
  
  if (valueMonth == 0 || isNaN(valueMonth)) {
    if (initMinOrMax == INIT_MIN) {
      valueMonth = 1;
    }
    else if (initMinOrMax == INIT_MAX) {
      valueMonth = 12;
    }
  }
  
  if (valueYear == 0 || isNaN(valueYear)) {
    if (initMinOrMax == INIT_MIN) {
      valueYear = yearMin;
    }
    else if (initMinOrMax == INIT_MAX) {
      valueYear = yearMax;
    }
  }
  
  var daysInSelectedMonth = numDaysIn((valueMonth -1),valueYear);
  
  // day
  if (dayObject) {
    for (i=1; i<=daysInSelectedMonth; i++) {
      var optionElement = document.createElement("OPTION");
      dayObject.options.add(optionElement);
      optionElement.text = i;
      optionElement.value = i;
    }
    dayObject.selectedIndex = (valueDay - 1);
  }
  
  // month
  if (monthObject) {
    for (i=1; i<=12; i++) {
      var optionElement = document.createElement("OPTION");
      monthObject.options.add(optionElement);
      optionElement.text = i;
      optionElement.value = i;
    }
    monthObject.selectedIndex = (valueMonth - 1);
  }
  
  // display last 150 years only (is it enough??)
  if (yearObject) {
    for (i=(yearMin); i<=yearMax; i++) {
      var optionElement = document.createElement("OPTION");
      yearObject.options.add(optionElement);
      optionElement.text = i;
      optionElement.value = i;
    }
    yearObject.selectedIndex = 0;
    if (valueYear > yearMin) {
      yearObject.selectedIndex = (valueYear - yearMin);
    }
  }
  
  
  // 2. INIT TIME (IF AVAILABLE)
  var hourObject = document.getElementById(dropdownHourPrefix + baseHiddenInputName);
  var minuteObject = document.getElementById(dropdownMinutePrefix + baseHiddenInputName);
  var secondObject = document.getElementById(dropdownSecondPrefix + baseHiddenInputName);
  
  if (hourObject && minuteObject && (hiddenValue.length>18)) {
    var valueHour = dateFields[3];
    var valueMinute = dateFields[4];
    var valueSecond = dateFields[5];
    
    // hour
    for (i=0; i<=23; i++) {
      var optionElement = document.createElement("OPTION");
      hourObject.options.add(optionElement);
      optionElement.text = ((i<10) ? "0" : "") + i;
      optionElement.value = i;
    }
    hourObject.selectedIndex = valueHour;
    
    // minute
    for (i=0; i<=59; i++) {
      if ((i%minutesInterval) == 0) {
        var optionElement = document.createElement("OPTION");
        minuteObject.options.add(optionElement);
        optionElement.text = ((i<10) ? "0" : "") + i;
        optionElement.value = i;
      }
    }
    minuteObject.selectedIndex = valueMinute/minutesInterval;
    
    // second
    if (secondObject) {
      for (i=0; i<=59; i++) {
        var optionElement = document.createElement("OPTION");
        secondObject.options.add(optionElement);
        optionElement.text = ((i<10) ? "0" : "") + i;
        optionElement.value = i;
      }
      secondObject.selectedIndex = valueSecond;
    }
  }
  
  
  // 3. UPDATE HIDDEN FIELD
  setBaseHiddenInputValue(baseHiddenInputName, dayObject, monthObject, yearObject, hourObject, minuteObject, secondObject);
}



function updateHiddenValue(baseHiddenInputName, correctDropdowns) {
  var dayObject = document.getElementById(dropdownDayPrefix + baseHiddenInputName);
  var monthObject = document.getElementById(dropdownMonthPrefix + baseHiddenInputName);
  var yearObject = document.getElementById(dropdownYearPrefix + baseHiddenInputName);
  var hourObject = document.getElementById(dropdownHourPrefix + baseHiddenInputName);
  var minuteObject = document.getElementById(dropdownMinutePrefix + baseHiddenInputName);
  var secondObject = document.getElementById(dropdownSecondPrefix + baseHiddenInputName);
  
  if (correctDropdowns) {
    var dayFirstOptionSet = ((dayObject.options[0] && dayObject.options[0].value == 0) ? 1 : 0);
    var monthFirstOptionSet = ((monthObject.options[0] && dayObject.options[0].value == 0) ? 1 : 0);
    var yearFirstOptionSet = ((yearObject.options[0] && dayObject.options[0].value == 0) ? 1 : 0);
  
    // correct days in month
    var daysInSelectedMonth = numDaysIn(monthObject.selectedIndex-monthFirstOptionSet,yearObject.options[yearObject.selectedIndex].value);
    
    dayObject.options.length = daysInSelectedMonth + dayFirstOptionSet;
    for (i=27;i<(daysInSelectedMonth);i++) {
        dayObject.options[i+dayFirstOptionSet].text = (i+1);
    }
  }
  
  setBaseHiddenInputValue(baseHiddenInputName, dayObject, monthObject, yearObject, hourObject, minuteObject, secondObject);
}



function setBaseHiddenInputValue(baseHiddenInputName, dayObject, monthObject, yearObject, hourObject, minuteObject, secondObject) {
  var hiddenValue = document.getElementById(baseHiddenInputName).value;
  
  var dateFields = getDateFieldsFromString(hiddenValue);
  
  var valueYear = dateFields[0].toString();
  var valueMonth = dateFields[1].toString();
  var valueDay = dateFields[2].toString();
  
  //alert(hiddenValue+'-A-'+valueYear+'-'+valueMonth+'-'+valueDay);
  
  if (yearObject) {
    valueYear = yearObject.options[yearObject.selectedIndex].value;
  }
  
  if (monthObject) {
    valueMonth = monthObject.options[monthObject.selectedIndex].value;
  }
  
  if (dayObject) {
    valueDay = dayObject.options[dayObject.selectedIndex].value;
  }
  
  if (valueMonth.length == 1) {
    valueMonth = "0" + valueMonth;
  }
  
  if (valueDay.length == 1) {
    valueDay = "0" + valueDay;
  }
  
  //alert(hiddenValue+'-B-'+valueYear+'-'+valueMonth+'-'+valueDay);
  
  var baseHiddenInputObject = document.getElementById(baseHiddenInputName);
  baseHiddenInputObject.value = valueYear + "-" + valueMonth + "-" + valueDay;
  
  if (hourObject)  {
    var valueHour = hourObject.options[hourObject.selectedIndex].value;
    var valueMinute = "0";
    var valueSecond = "0";
    
    if (minuteObject) {
      valueMinute = minuteObject.options[minuteObject.selectedIndex].value;
    }
    
    if (secondObject) {
      valueSecond = secondObject.options[secondObject.selectedIndex].value;
    }
    
    if (valueHour.length == 1) {
      valueHour = "0" + valueHour;
    }  
    if (valueMinute.length == 1) {
      valueMinute = "0" + valueMinute;
    }
    if (valueSecond.length == 1) {
      valueSecond = "0" + valueSecond;
    }
    
    baseHiddenInputObject.value = baseHiddenInputObject.value + " " + valueHour + ":" + valueMinute + ":" + valueSecond;
  }
}



// PRIVATE FUNCTIONS

function numDaysIn(month, year) {
  if (month==3 || month==5 || month==8 || month==10) {
    return 30;
  }
	else if ((month==1) && leapYear(year)) {
    return 29;
  }
	else if (month==1) {
    return 28;
  }
	else {
    return 31;
  }
}



function leapYear(year) {
  if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
    return true;
  }
  else {
    return false;
  }
}


function getDateFieldsFromString(stringDate) {
  // value is supposed to be in this format yyyy-MM-dd
  // TODO: JK: check if date is valid
  
  var strValueDay = stringDate.substring(8,10);
  var strValueMonth = stringDate.substring(5,7);
  var strValueYear = stringDate.substring(0,4);
  
  //alert(strValueDay);
  
  // JK: this is workaround because of bug in javaScript 
  //     parseInt cannot parse values '08' and '09' -> it returns 0 instead of 8 or 9  (lesser values are OK, strange)
  if (strValueDay.charAt(0) == "0") {
    strValueDay = strValueDay.charAt(1);
  }
  
  //alert(strValueDay);
  //alert(parseInt(strValueDay));
  
  if (strValueMonth.charAt(0) == "0") {
    strValueMonth = strValueMonth.charAt(1);
  }
  
  var dateFields = new Array();
  
  dateFields[0] = parseInt(strValueYear);
  dateFields[1] = parseInt(strValueMonth);
  dateFields[2] = parseInt(strValueDay);
  
  dateFields[3] = 0;
  dateFields[4] = 0;
  dateFields[5] = 0;
  
  if (stringDate.length>18) {
    var strValueHour = stringDate.substring(11,13);
    var strValueMinute = stringDate.substring(14,16);
    var strValueSecond = stringDate.substring(17,19);
    
    if (strValueHour.charAt(0) == "0") {
        strValueHour = strValueHour.charAt(1);
    }
  
    if (strValueMinute.charAt(0) == "0") {
        strValueMinute = strValueMinute.charAt(1);
    }
    
    if (strValueSecond.charAt(0) == "0") {
        strValueSecond = strValueSecond.charAt(1);
    }
    
    dateFields[3] = parseInt(strValueHour);
    dateFields[4] = parseInt(strValueMinute);
    dateFields[5] = parseInt(strValueSecond);
  }
  
  return dateFields;
}
