(function($) {

    var DAYS = ["Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat"];
    var MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    var ONE_DAY = 1000 * 60 * 60 * 24;

    /* Single date regular expression: Saturday, (Dec)ember (10), (2011) */
    var SINGLE_REGEXP = /[A-Z]{3,9}, ([A-Z]{3})[A-Z]{0,6} ([0-9]{1,2}), ([0-9]{4})(.*)/i;
    /* Range of dates regular expression: Saturday, (Dec)ember (10)[, (2011)] to Sunday, (Dec)ember (11), (2011) */
    var RANGE_REGEXP = /[A-Z]{3,9}, ([A-Z]{3})[A-Z]{0,6} ([0-9]{1,2})(?:, ([0-9]{4}))? to [A-Z]{3,9}, ([A-Z]{3})[A-Z]{0,6} ([0-9]{1,2}), ([0-9]{4})(.*)/i;

    $(document).ready(function() {

        var events = [];

        $("#calendarwiz").find(".cwuceeventtitle").each(function() {
            var titleCell = $(this),
                title = $.trim(titleCell.text()),
                onClick = titleCell.children("a").attr("onclick"),
                dateCell = titleCell.parent("tr").next("tr").children("td"),
                dateText = $.trim(dateCell.text()),
                range = dateText.match(RANGE_REGEXP),
                single, start, end, details;

            if (range) {
                start = {month: $.inArray(range[1], MONTHS), day: range[2], year: range[3] || range[6]};
                end = {month: $.inArray(range[4], MONTHS), day: range[5], year: range[6]};
                details = $.trim(range[7]);
            } else {
                single = dateText.match(SINGLE_REGEXP);
                if (single) {
                    start = end = {month: $.inArray(single[1], MONTHS), day: single[2], year: single[3]};
                    details = $.trim(single[4]);
                }
            }

            if (start && end) {
                var startDate = new Date(start.year, start.month, start.day),
                    endDate = new Date(end.year, end.month, end.day);
                events.push({title: title, start: startDate, end: endDate, details: details, onClick: onClick});
            }
        });

        /* Populate The Week Ahead calendar */
        var today = new Date();
        today.setHours(0, 0, 0, 0);

        for (var i = 0, j = 0; i < 7; i++) {
            var date = addTo(today, i),
                day = date.getDate(),
                dow = DAYS[date.getDay()],
                month = MONTHS[date.getMonth()];

            if (dow == DAYS[0] || dow == DAYS[6]) continue;

            $("#calendar").append(
                $("<div/>").addClass("day").toggleClass("selected", j++ == 0).append(
                    $("<a/>").attr("href", "#").data("date", date).append(
                        $("<div/>").addClass("dow").text(dow),
                        $("<div/>").addClass("date").text(month + " " + day)
                    ).click(function(event) {
                        var date = $(this).data("date"),
                            count = 0;

                        $("#events").empty();
                        $("#calendar .selected").removeClass("selected");
                        $(this).parent(".day").addClass("selected");

                        $.each(events, function(k, event) {
                            var time = date.getTime();

                            if (time >= event.start.getTime() && time <= event.end.getTime()) {
                                count++;
                                $("#events").append(
                                    $("<p/>").append(
                                        $("<a/>").attr("href", "#").attr("title", "Click for event details").text(event.title).click(event.onClick),
                                        $("<span/>").text(event.details)
                                    )
                                );
                            }
                        });

                        if (count == 0) {
                            $("#events").append(
                                $("<p/>").text("No events scheduled on this day")
                            )
                        }

                        $(this)[0].blur();
                        event.preventDefault();
                        return false;
                    })
                )
            );
        }

        $("#calendar .selected a").trigger("click");
    });

    function addTo(date, days) {
        return days == 0 ? date : new Date(date.getTime() + (days * ONE_DAY));
    }

})(jQuery);

