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

/*jslint white: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true */

AZCAT.events = (function () {
    function selectDate(type, args, obj) {
        // Calander Specific Date Select
        var allDatesCheck, displayCheck, my_date, day, month, year;
        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 = "(" + 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, month, year;
        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();
            }
        }

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

    return function (config) {
        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,

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

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

        return that;
    };
}());
