(function($) {

$('.sp-widget-events').live('registered', function(e) {
    var $widget = $(this);
    var $list = $('.sp-event-list', $widget);
    var $calendar = $('.sp-event-calendar .sp-calendar', $widget);

    var activeYear = -1;
    var activeMonth = -1;

    $widget.bind('update', function(e, id, control) {
        var good = false;

        if ($widget.data("widget")["calendar"]) {
            if ($widget.data("widget")["year"] != activeYear || $widget.data("widget")["month"] != activeMonth) {
                return;
            }

            log(id + ": Loading calendar data");
            $widget.trigger('loadCalendar', [ $widget.data("widget")["calendar"] ]);
            delete $widget.data("widget")["calendar"];
            good = true;
        }
        
        if ($widget.data("widget")["list"]) {
            log(id + ": Loading list data");
            $widget.trigger('loadList', [ $widget.data("widget")["list"] ]);
            delete $widget.data("widget")["list"];
            good = true;
        }

        if (good) {
            $widget.trigger('updated');
        } else {
            log("Unknown event triggered");
        }
    }).bind('loadList', function(e, events) {
        $('li', $list).each(function(idx) {
            var $li = $(this);
            if (events[idx]) {
                log("  - loading item [" + idx + "]: " + events[idx].title);

                $('.sp-event-title', $li).html('<a href="/events/' + encodeURIComponent(events[idx].id) + '" title="' + events[idx].title.replace(/"/g, '\\"') + '">' + events[idx].title + '</a>');
                $('.sp-event-date', $li).text(events[idx].period);
            } else {
                $('.sp-event-title, .sp-event-date', $li).text('');
            }
        });
    }).bind('loadCalendar', function(e, events) {
        $('a', $calendar).unbind('click');

        $.each(events, function() {
            var start_ts = this.start_ts * 1000;
            var end_ts = this.end_ts * 1000;
            var start = new Date(start_ts);
            var end = new Date(end_ts);

            if (start.getMonth() != end.getMonth() || start.getFullYear() != end.getFullYear()) {
                if (start.getMonth() + 1 != activeMonth || start.getFullYear() != activeYear) {
                    // assume start is before active month, set start to first day
                    start = new Date(start.getFullYear(), start.getMonth() + 1, 1);
                } else if (end.getMonth() + 1 != activeMonth || end.getFullYear() != activeYear) {
                    // assume end is after active month, set end to last day
                    end = new Date(start.getFullYear(), start.getMonth() + 1, 0);
                } else {
                    // unknown condition!
                }
            }

            var start_date = start.getDate();
            var end_date = end.getDate();

            this.year = start.getFullYear();
            this.month = start.getMonth() + 1;

            $widget.trigger("addCalendarItem", [ start_date, end_date, this ]);
        });
    }).bind('addCalendarItem', function(e, start_date, end_date, event) {
        log("  - loading item [" + start_date + " => " + end_date + "]: " + event.title);

        var $days = $('table td:not(.ui-datepicker-other-month)', $calendar).slice(start_date - 1, end_date);
        
        $days.each(function(idx) {
            var $day = $(this);
            var date = start_date + idx;

            if (!$day.is(".sp-state-active")) {
                $day.tooltip({
                    keepOnHover: true,
                    cls: 'sp-event-tooltip',
                    content: '<a href="/events/' + event.year + '/' + event.month + '/' + date + '">See this days event\'s &rarr;</a>'
                }).addClass("sp-state-active");
            }

            $('a', $day.tooltip('content')).before('<div class="sp-event-title"><a href="/events/' + encodeURIComponent(event.id) + '">' + event.title + '</a></div>');
        });
    });


    // initialize event list
    if ($list.length > 0) {
        shiftpress.widgetapi($widget, "list", {
            page: 1
        });
    }

    // initialize event calendar
    if ($calendar.length > 0) {
        $calendar.calendar({
            onChangeMonthYear: function(year, month, inst) {
                activeYear = year;
                activeMonth = month;

                shiftpress.widgetapi($widget, "calendar", {
                    year: year,
                    month: month
                });
            }
        });

        var d = $calendar.calendar("getDate");

        activeYear = d.getFullYear();
        activeMonth = d.getMonth() + 1;

        shiftpress.widgetapi($widget, "calendar", {
            year: d.getFullYear(),
            month: d.getMonth() + 1
        });
    }
});

})(jQuery);

