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

/*jslint unparam: true, sloppy: true, maxerr: 80, indent: 4 */

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("event_dates__all_dates");
        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.toString()).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.toString()
            );
            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.toString(),
                    {
                        context : "has_event_cell" + n.toString(),
                        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.toString() + "/" + year.toString();

                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',
            context_url + "/getCalendarJSON",
            {success : that.init, scope : that}
        );

        return that;
    };
}());

