/*global Date, JSON, YAHOO, document, window */

AZCAT.events = function () {
  // Shared private functions


  // Shared public functions
  function selectDate(type, args, obj) {
      // Calander Specific Date Select
      var allDatesCheck, displayCheck, my_date, day, month, year, events;
      my_date = args[0][0];
      day = my_date[2].toString().length > 1 ? my_date[2] : "0" + my_date[2];
      month = my_date[1].toString().length > 1 ? my_date[1] : "0" + my_date[1];
      year = my_date[0];

      allDatesCheck = document.getElementById("all_events_checkbox");
      displayCheck = document.getElementById("selectedDayCheckbox");

      if (displayCheck) {
          allDatesCheck.checked = false;
          if (displayCheck.disabled) {
              displayCheck.disabled = false;
          }
          if (displayCheck.checked) {
              displayCheck.checked = false;
          }
          displayCheck.value = year + "/" + month + "/" + day;
          document.getElementById("selectedDateText").innerHTML = "Selected Date (" + year + "/" + month + "/" + day + ")";
          displayCheck.checked = true;
          window[obj.searchAjaxVarName].submitSearch({"target" : displayCheck});    
      }
      window.location.href = obj.eventsURL + "#date=" + day + "/" + month + "/" + year;
  }

  function updateCalendar(type, args, obj) {
      // Variables
      var expire_date, cookie_date, day_id, my_date, day, month, year, events, old_tip, event_text, tooltip, n, m;

      // Save the Date as a Cookie
      if (obj.cookie_loaded)
      {
          expire_date = new Date();
          expire_date.setDate(expire_date.getDate() + 1);
          cookie_date = obj.calendar.cfg.getProperty("PAGEDATE");
          YAHOO.util.Cookie.set("date", cookie_date, { expires: expire_date });
      }
      obj.cookie_loaded = true;

      // Create Tool Tips
      for (n = 0; n < 42; n += 1)
      {
          day_id = YAHOO.util.Dom.get("has_event_cell" + n).id;
          my_date = obj.calendar.getDateFieldsByCellId(day_id);

          day = my_date[2] > 9 ? my_date[2] : "0" + my_date[2];
          month = my_date[1] > 9 ? my_date[1] : "0" + my_date[1];
          year = my_date[0];

          events = obj.jsonDates.event_days[year + "/" + month + "/" + day];

          // Delete Old Tool Tips so they don't stack on new ones
          old_tip = document.getElementById("event_tooltip_" + "has_event_cell" + n);
          if (old_tip)
          {
              old_tip.parentNode.removeChild(old_tip);
          }
          if (events && my_date[1] === obj.calendar.cfg.getProperty("pagedate").getMonth() + 1)
          {
              // Create New Tool Tips
              event_text = "";
              for (m = 0; m < events.length; m += 1)
              {
                  event_text += events[m] + "<br/>";
              }
              tooltip = new YAHOO.widget.Tooltip("event_tooltip_" + "has_event_cell" + n, { context : "has_event_cell" + n, text : event_text });
          }
      }
  }

  function init(json) {
    var hash, date, obj, date_cookie, date_data, months, month, year, filter_button, event_form, filter_text, inputs, n;
    this.jsonDates = JSON.parse(json.responseText);

    // Javascript form actually submits
    this.calendar = new YAHOO.widget.Calendar("has_event", "azcat_event_calendar", {navigator : true, title : "Events Calendar", close : false});
    this.calendar.changePageEvent.subscribe(this.updateCalendar, this);

    // Render YUI Calendar
    this.calendar.selectEvent.subscribe(this.selectDate, this);
    this.calendar.addRenderer(this.jsonDates.events.toString(), this.calendar.renderCellStyleHighlight1);
    this.calendar.render();

    // Pre Selected Date From URL
    if ((/#date=[0-9]{2}\/[0-9]{2}\/[0-9]{4}/g).test(window.location.hash)) {

        hash = (/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/g).exec(window.location.hash);
        date = hash.toString().split("/");
        date = [date[2], date[1], date[0]];
        obj = { 0 : { 0 : date} };

        this.calendar.cfg.setProperty("pagedate", date[1] + "/" + date[0]);
        this.calendar.select(date[1] + "/" + date[2] + "/" + date[0]);
        this.calendar.render();

    } else {
        // Check if there's a Date Cookie

        date_cookie = YAHOO.util.Cookie.get("date");

        if (date_cookie) {
            date_data = new Date(date_cookie);
            month = date_data.getMonth() + 1;
            year = date_data.getFullYear();
            date_cookie = month + "/" + year;

            this.calendar.cfg.setProperty("pagedate", date_cookie);
            this.calendar.render();
        }
        // Lets throw up a All Event Dates and Types search
        // Have to do it only if whatever
//                this.updateSearchResults();
    }

    // Populate the Calendar with Tool Tips
    this.updateCalendar(null, null, this);
  }

  return function (config) {
    // My resources, this instance
    // Private varables, actual
    if (!config) {
      config = {};
    }
    var that = {//Private varables, by convention not actually hidden
      eventsURL : config.eventsURL,
      cookie_loaded : false,
      jsonDates : null,
      calendar : null,
      searchAjaxVarName : config.searchAjaxVarName,

      //Private Methods

      // Public methods
      init : init,
      updateCalendar : updateCalendar,
      selectDate : selectDate

      // Public Variables

      // Public Events
    };

    // Init
    YAHOO.util.Connect.asyncRequest('GET', "getCalendarJSON", {success : that.init, scope : that});

    return that;
  };
}();
