function change_recur_options(recur) {
  var daily = document.getElementById('daily_options');
  var weekly = document.getElementById('weekly_options');
  var monthly = document.getElementById('monthly_options');
  var yearly = document.getElementById('yearly_options');
  var end = document.getElementById('recur_end');
  switch(recur.selectedIndex) {
    case 0:
      daily.style.display = "none";
      weekly.style.display = "none";
      monthly.style.display = "none";
      yearly.style.display = "none";
      end.style.display = "none";
      break;
    case 1:
      daily.style.display = "block";
      weekly.style.display = "none";
      monthly.style.display = "none";
      yearly.style.display = "none";
      document.forms['add_event_form'].elements['recur[day_interval]'].focus();
      document.forms['add_event_form'].elements['recur[day_interval]'].select();
      end.style.display = "block";
      break;
    case 2:
      daily.style.display = "none";
      weekly.style.display = "block";
      monthly.style.display = "none";
      yearly.style.display = "none";
      document.forms['add_event_form'].elements['recur[week_interval]'].focus();
      document.forms['add_event_form'].elements['recur[week_interval]'].select();
      end.style.display = "block";
      break;
    case 3:
      daily.style.display = "none";
      weekly.style.display = "none";
      monthly.style.display = "block";
      yearly.style.display = "none";
      document.forms['add_event_form'].elements['recur[month_interval]'].focus();
      document.forms['add_event_form'].elements['recur[month_interval]'].select();
      end.style.display = "block";
      break;
    case 4:
      daily.style.display = "none";
      weekly.style.display = "none";
      monthly.style.display = "none";
      yearly.style.display = "block";
      document.forms['add_event_form'].elements['recur[year_interval]'].focus();
      document.forms['add_event_form'].elements['recur[year_interval]'].select();
      end.style.display = "block";
      break;
  }
}

function change_end_options(end) {
  after = document.getElementById('end_after');
  on = document.getElementById('end_on');
  switch(end.selectedIndex) {
    case 0:
      after.style.display = "none";
      on.style.display = "none";
      break;
    case 1:
      after.style.display = "block";
      on.style.display = "none";
      after_times = document.getElementById('end_after_times');
      after_times.focus();
      after_times.select();
      break;
    case 2:
      after.style.display = "none";
      on.style.display = "block";
      day = document.getElementById('recur_end_day');
      day.focus();
      day.select();
      break;
  }
}

function set_enabled_by_selector(e,s) {
  var elements = document.getElementsBySelector(s);
  for(i=0;i<elements.length;i++) {
    elements[i].disabled = !e;
  }
}

function recur_day_click(label,day,month,year) {

  /* Hide the calendar.
   */
  toggle_visibility('recur_cal');

  /* If the recurrence end date is before the event start date, bail.
   */
  startD = get_date('start');
  startD.setHours(0);
  startD.setMinutes(0);
  recurD = new Date(year,month-1,day,0,0,0);
  if(recurD < startD) {
    return;
  }

  /* Get the fields corresponding to the day, month & year fields.
   */
  d = document.getElementById('recur_end_day');
  m = document.getElementById('recur_end_month');
  y = document.getElementById('recur_end_year');

  /* Correct the day & month values so they'll always be two digits.
   */
  if(day < 10) { day = '0' + day; }
  if(month < 10) { month = '0' + month; }

  /* Set the date values in the form.
   */
  d.value = day;
  m.value = month;
  y.value = year;
}

function recur_month_click(label,month,year) {
  fetchURL("/parts/minical?id=recur&year=" + year + "&month=" + month,
    recur_callback);
}

function recur_callback() {
  if(req.readyState == 4) {
    if(req.status == 200) {
      var cal = document.getElementById('recur_cal');
      cal.innerHTML = req.responseText;
    } else {
      alert("There was an error retrieving the data:\n" + req.statusText);
    }
  }
}

function recur_end_year_filter(evt) {

  /* Get the field object so we can select it later.
   */
  field = document.getElementById('recur_end_year');

  /* Get the key that was pressed.
   */
  evt = (evt) ? evt : event;
  charCode = (evt.charCode) ? evt.charCode :
    ((evt.keyCode) ? evt.keyCode : ((evt.which) ? event.which : 0));

  /* Remember the offset between start and end date.
   */
  endD = get_date('recur_end');

  /* Up arrow or '+' or '=' increments.
   */
  if(charCode == 38 || charCode == 63232 || charCode == 43 || charCode == 61) {
    endD.setYear(endD.getFullYear() + 1);
    set_date('recur_end',endD);
    field.select();
    return false;
  }

  /* Down arrow or '-' decrements.
   */
  else if(charCode == 40 || charCode == 63233 || charCode == 45) {
    endD.setYear(endD.getFullYear() - 1);
    set_date('recur_end',endD);
    field.select();
    return false;
  }

  /* Numbers are allowed.
   */
  if(charCode >= 48 && charCode <= 57) {
    return true;
  }

  /* Letters, symbols and space are blocked.
   */
  if((charCode>=32 && charCode<=47) ||
      (charCode>=58 && charCode<=126)) {
    return false;
  }

  /* Any other character we allow (this lets tabs, return, enter, etc.
   * continue to work correctly.
   */
  return true;
}

function recur_end_month_filter(evt) {

  /* Get the field object so we can select it later.
   */
  field = document.getElementById('recur_end_month');
  
  /* Get the key that was pressed.
   */
  evt = (evt) ? evt : event;
  charCode = (evt.charCode) ? evt.charCode :
    ((evt.keyCode) ? evt.keyCode : ((evt.which) ? event.which : 0));
    
  /* Remember the offset between start and end date.
   */
  endD = get_date('recur_end');
  
  /* Up arrow or '+' or '=' increments.
   */
  if(charCode == 38 || charCode == 63232 || charCode == 43 || charCode == 61) {
    endD.setMonth(endD.getMonth() + 1); 
    set_date('recur_end',endD);
    field.select();
    return false;
  } 
  
  /* Down arrow or '-' decrements.
   */
  else if(charCode == 40 || charCode == 63233 || charCode == 45) {
    endD.setMonth(endD.getMonth() - 1);
    set_date('recur_end',endD);
    field.select();
    return false;
  } 
  
  /* Numbers are allowed.
   */
  if(charCode >= 48 && charCode <= 57) {
    return true; 
  } 
  
  /* Letters, symbols and space are blocked.
   */
  if((charCode>=32 && charCode<=47) ||
      (charCode>=58 && charCode<=126)) {
    return false;
  } 
  
  /* Any other character we allow (this lets tabs, return, enter, etc.
   * continue to work correctly.
   */
  return true;
}

function recur_end_day_filter(evt) {

  /* Get the field object so we can select it later.
   */
  field = document.getElementById('recur_end_day');

  /* Get the key that was pressed.
   */
  evt = (evt) ? evt : event;
  charCode = (evt.charCode) ? evt.charCode :
    ((evt.keyCode) ? evt.keyCode : ((evt.which) ? event.which : 0));

  /* Remember the offset between start and end date.
   */
  startD = get_date('recur_end');

  /* Up arrow or '+' or '=' increments.
   */
  if(charCode == 38 || charCode == 63232 || charCode == 43 || charCode == 61) {
    startD.setDate(startD.getDate() + 1);
    set_date('recur_end',startD);
    field.select();
    return false;
  }

  /* Down arrow or '-' decrements.
   */
  else if(charCode == 40 || charCode == 63233 || charCode == 45) {
    startD.setDate(startD.getDate() - 1);
    set_date('recur_end',startD);
    field.select();
    return false;
  }

  /* Numbers are allowed.
   */
  if(charCode >= 48 && charCode <= 57) {
    return true;
  }

  /* Letters, symbols and space are blocked.
   */
  if((charCode>=32 && charCode<=47) ||
      (charCode>=58 && charCode<=126)) {
    return false;
  }

  /* Any other character we allow (this lets tabs, return, enter, etc.
   * continue to work correctly.
   */
  return true;
}
