/* CNU: Combined Namespace Unification */
if (typeof CNU == 'undefined') CNU = {};

CNU.calendar = function () {

  var DATE_FORMAT = 'mm/dd/yy';
  var CALENDAR_CLASS_NAME = 'calendar';
  var BUTTON_IMAGE_SRC = "/images/calendar.png"
  var DEFAULT_OPTIONS = {
    beforeShow: read_linked, 
    onSelect: update_linked, 

    altField: '',
    altFormat: '',
    appendText: '',
    buttonImage: BUTTON_IMAGE_SRC, 
    buttonImageOnly: true,
    buttonText: '...',
    changeMonth: false,
    changeYear: false,
    closeText: 'Done',
    constrainInput: true,
    currentText: 'Today',
    dateFormat: DATE_FORMAT,
    dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
    dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
    defaultDate: null,
    duration: 'fast',
    firstDay: 0,
    gotoCurrent: false,
    hideIfNoPrevNext: false,
    isRTL: false,
    maxDate: null,
    minDate: null,
    monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
    monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    navigationAsDateFormat: false,
    nextText: 'Next',
    numberOfMonths: 1,
    prevText: 'Prev',
    shortYearCutoff: '+10',
    showAnim: 'show',
    showButtonPanel: false,
    showCurrentAtPos: 0,
    showMonthAfterYear: false,
    showOn: "button",
    showOptions: {},
    showOtherMonths: false,
    stepMonths: 1,
    yearRange: '-10:+10'
  };

  if (CNU.config.language == 'es')
  {
    DEFAULT_OPTIONS['monthNames'] = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
    DEFAULT_OPTIONS['dayNamesMin'] = ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa'];
    DEFAULT_OPTIONS['monthNamesShort'] = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];
  }
    

  // list of fields and their options
  // to be populated from the backend.
  var fields = {};

  function date_format(field) {
    if ((fields[field.id] != null) && (fields[field.id].dateFormat != null)) { 
      return fields[field.id].dateFormat; 
    }
    return DEFAULT_OPTIONS.dateFormat;
  }

  function read_linked() { 
    var selects = get_selects(this);
    var linked_value = '';

    $j(this).trigger('select_in', this);

    switch(date_format(this)) {
    case 'mm/dd/yy':
      linked_value = selects.month.val() + '/' + selects.day.val() + '/' + selects.year.val();
      break;
    case 'dd/mm/yy':
      linked_value = selects.day.val() + '/' + selects.month.val() + '/' + selects.year.val();
      break;
    }

    $j(this).val(linked_value); 
    
  }

  function update_linked(date) { 
    var day = ''; 
    var month = ''; 
    var year = '';

    switch(date_format(this)) {
    case 'mm/dd/yy':
      day = date.substring(3, 5);
      month = date.substring(0, 2);
      year = date.substring(6, 10);
      break;

    case 'dd/mm/yy':
      day = date.substring(0, 2);
      month = date.substring(3, 5);
      year = date.substring(6, 10);
      break;

    default:
      throw "unknown date_format";
    }

    day = day.replace(/^0/, '');
    month = month.replace(/^0/, '');

    var selects = get_selects(this);
    selects.month.val(month);
    selects.day.val(day);
    selects.year.val(year);

    // FrontEnd Only
    CNU.Assistant.validate(this);
    $j(this).trigger('alter', this);
    $j(this).trigger('select_out', this);

  }

  function check_linked_days() { 

    var selects = get_selects(this);
    var day_id = selects.day.id;
    var daysInMonth = 33 - new Date(selects.year.val(), selects.month.val() - 1, 33).getDate(); 

    $j('#' + day_id + ' option').attr('disabled', ''); 
    $j('#' + day_id + ' option:gt(' + (daysInMonth) +')').attr('disabled', 'disabled'); 

    if (selects.day.val() > daysInMonth) { selects.day.val(daysInMonth); } 

  }

  function get_selects(field) { 

    var all_selects = $j(field.parentNode.getElementsByTagName("select"));
    var all_inputs = '';
    var selects = { day: '', month: '', year: '' };
    var re = '';

    for (s in selects) {

      re = new RegExp("_"+s+"$");

      all_selects.each(function () {
        if (this.id.match(re)) {
          selects[s] = $j(this);
          return false;
        }
      });

      if (selects[s] == '') {

        if (all_inputs == '') all_inputs = $j(field.parentNode.getElementsByTagName("input"));

        all_inputs.each(function () { 
          if (this.id.match(re)) {
            selects[s] = $j(this);
            return false;
          }
        });

        // if it's still empty...
        if (selects[s] == '') { 
          var hidden_s = document.createElement("input");
          hidden_s.type = "hidden";
          hidden_s.id = field.id + "_" + s;
          field.parentNode.appendChild(hidden_year);
          select[s] = $j("#"+hidden_s.id);
        }
      }
    }

    return selects;
  }

  function customized_options(field) { 
    var options = {};

    if (fields[field.id] != null) {
      for (key in DEFAULT_OPTIONS) { 
        if (fields[field.id][key] != null) options[key] = fields[field.id][key];
        else options[key] = DEFAULT_OPTIONS[key];
      };
    } else {
      options = DEFAULT_OPTIONS;
    }

    return options;
  }



  // public
  return {

    init: function () { 
      $j("input."+CALENDAR_CLASS_NAME).each(function () {
        $j(this).datepicker(customized_options(this)); 
        var selects = get_selects(this);
        selects.month.change(check_linked_days);
        selects.year.change(check_linked_days);
      });
    },

    button_image_src: BUTTON_IMAGE_SRC,
    fields: fields
  
  } // end return

}();
