jQuery(document).ready(function($) {
    var offset = 22; // sprite height/width, used for day images
    var otherMonthOffset = -offset;
    var activeOffset = -(offset * 2);
    var currDate = new Date();
    var currMonth = currDate.getMonth();
    var currYear = currDate.getFullYear();
    var selMonth = currDate.getMonth();
    var selYear = currDate.getFullYear();
    var selDay = currDate.getDate();
    var currentSelection;
    var currSel_orig_position;
    var loaded = false;
    var orig_position;
    calendarGen(currMonth, currYear);

    function calDateAllBtnGen(month, day, year) {
	    var siteAddr = _CalendarOptions["siteAddr"];
        var monthday = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][month] + ' ' + day;
        $('#calDateAllBtn').html("Showing events from: " + monthday + ". Click for more.");
        var lnk = siteAddr + "Events/Date/" + (month + 1) + "/" + day + "/" + year;
        $('#calDateAllBtn').attr("href", lnk);
    }

    function calendarGen(month, year) {
        var cal = new Calendar(month, year, offset);
        cal.generateHTML();
        $('#calendar').html(cal.getHTML());

        if (!loaded) {
            var currDay = currDate.getDate();
            currentSelection = $('td.calendar-day.currentmonth a.day' + currDay);
            currSel_orig_position = currentSelection.css('background-position');
            currentSelection.css('background-position', -((currDay - 1) * offset) + 'px ' + activeOffset + 'px').data('selected', true);
            $('#cal-selection span').html(currDay);
            calDateAllBtnGen(month, currDay, year)
            loaded = true;
        }

        $('td.calendar-day a').not(currentSelection).data('selected', false);
    }

    // hover effect for days
    $('td.calendar-day a').live("mouseover",
		function() {
		    //orig_position = $(this).css('background-position');
		    var day = $(this).attr('class').replace(/[^0-9]/g, '') - 1;
		    orig_position = -(day * offset)
				+ 'px '
				+ (($(this).parent('td').hasClass('nextprevmonth')) ? otherMonthOffset : 0)
				+ 'px';

		    $(this).css('background-position', -(day * offset) + 'px ' + activeOffset + 'px');
		});
    $('td.calendar-day a').live("mouseout",
		function() {
		    if (!$(this).data('selected'))
		        $(this).css('background-position', orig_position);
		});

    // day click handler
    $('td.calendar-day a').live("click",
		function() {
		    currentSelection.data('selected', false).css('background-position', currSel_orig_position); // reset former selection to its initial state

		    currentSelection = $(this).data('selected', true);
		    var day = currentSelection.attr('class').replace(/[^0-9]/g, '');
		    currSel_orig_position = -((parseInt(day, 10) - 1) * offset)
				+ 'px '
				+ ((currentSelection.parent('td').hasClass('nextprevmonth')) ? otherMonthOffset : 0)
				+ 'px';

		    $('#cal-selection span').html(day);
		    calDateAllBtnGen(currMonth, day, currYear);
		    selDay = day;
		    selYear = currYear;
		    selMonth = currMonth;

		    var parentTd = currentSelection.parent('td');
		    if (parentTd.hasClass('prevMonth')) {
		        selMonth--;
		        if (selMonth < 0) {
		            selMonth = 11;
		            selYear--;
		        }
		    } else if (parentTd.hasClass('nextMonth')) {
		        selMonth++;
		        if (selMonth > 11) {
		            selMonth = 0;
		            selYear++;
		        }
		    }
		    // update the result table
		    getCalWidgetMainResults(selYear, selMonth, selDay);
		    return false;
		});

    // previous month click handler
    $('#prevMonthArrow, #prevMonthLink').live("click", function() {
        currMonth--;
        if (currMonth < 0) {
            currMonth = 11;
            currYear--;
        }
        calendarGen(currMonth, currYear);
        if (currMonth === selMonth && currYear === selYear) {
            $('td.currentmonth a.day' + selDay).click().mouseover();
        }
        return false;
    });

    // next month click handler
    $('#nextMonthArrow, #nextMonthLink').live("click", function() {
        currMonth++;
        if (currMonth > 11) {
            currMonth = 0;
            currYear++;
        }
        calendarGen(currMonth, currYear);
        if (currMonth === selMonth && currYear === selYear) {
            $('td.currentmonth a.day' + selDay).click().mouseover();
        }
        return false;
    });
});

var currDate = new Date();
var cal_months_labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
function Calendar(month, year, offset) {
	this.month = (isNaN(month) || month === null) ? currDate.getMonth() : month;
	this.year  = (isNaN(year) || year === null) ? currDate.getFullYear() : year;
	this.html = '';
	this.offset = offset;
}
Calendar.prototype.generateHTML = function() {
	var firstDay = new Date(this.year, this.month, 1);
	var startingDay = firstDay.getDay(); // day of week of first day of month
	var monthLength = daysInMonth(this.year, this.month);
	var day = nextprev_day = nextmonth_day = 1;
	
	var prevmonth = (this.month - 1 < 0) ? 11 : (this.month - 1);
	var prevmonth_numdays = daysInMonth(this.year, prevmonth);
	var nextmonth = (this.month + 1 > 11) ? 0 : (this.month + 1);
	
	var monthName = cal_months_labels[this.month];
	var prevMonthName = cal_months_labels[prevmonth];
	var nextMonthName = cal_months_labels[nextmonth];
	var nextPrevClass = "prevMonth";
	
	var html = new Array();
	html.push('<table class="calendar-table"><tr>');
	html.push('<th colspan="7"><a id="prevMonthArrow" class="arrow">&#9668;</a> ');
	html.push('<a id="prevMonthLink">' + prevMonthName + '</a> <span class="divider">|</span> ');
	html.push('<a id="currMonthLink">' + monthName + '</a> <span class="divider">|</span> ');
	html.push('<a id="nextMonthLink">' + nextMonthName + '</a> <a id="nextMonthArrow" class="arrow">&#9658;</a></th></tr><tr>');
	for (var i = 0; i < 9; i++) { // rows (weeks)
		for (var j = 0; j <= 6; j++) { // cells (days)
			if (day <= monthLength && (i > 0 || j >= startingDay)) {
				html.push('<td class="calendar-day currentmonth">');
				html.push('<a href="#" class="day' + day + '" style="background-position: -' + (this.offset*(day-1)) + 'px 0"></a>');
				day++;
			} else {
				if(i === 0 && j < startingDay) { // previous month
					nextprev_day = prevmonth_numdays - (startingDay - j) + 1;
				} else {
					nextprev_day = nextmonth_day++;
					nextPrevClass = "nextMonth";
				}
				html.push('<td class="calendar-day nextprevmonth ' + nextPrevClass + '">');
				html.push('<a href="#" class="day' + nextprev_day + '" style="background-position: -' + (this.offset*(nextprev_day-1)) + 'px ' + -this.offset + 'px"></a>');
			}
			html.push('</td>');
		} // days
		// stop making rows if we've run out of days
		if (day > monthLength) {
			break;
		} else {
			html.push('</tr><tr>');
		}
	} // weeks

	html.push('</tr></table>');

	this.html = html.join('');
};

Calendar.prototype.getHTML = function() {
	return this.html;
};

var daysInMonth = function(year, month) {
	return 32 - new Date(year, month, 32).getDate();
}



var getCalWidgetMainResults = function(selYear, selMonth, selDay) {

    var makeRequestStr = function() {
        var userOptions = _CalendarOptions;
        requestStr = "";
        if (userOptions.hasOwnProperty("siteAddr")) {
            siteAddr = userOptions["siteAddr"];
        };
        if (userOptions.hasOwnProperty("ucColumns")) {
            requestStr += "ucColumns=" + userOptions["ucColumns"] + "&";
        };
        if (typeof (userOptions["ucEntityId"]) !== "undefined") {
            requestStr += "ucEntityId=" + userOptions["ucEntityId"] + "&";
        };
        if (typeof (userOptions["ucEntityJoin"]) !== "undefined") {
            requestStr += "ucEntityJoin=" + userOptions["ucEntityJoin"] + "&";
        };
        if (typeof (userOptions["ucInitialViewSetting"]) !== "undefined") {
            requestStr += "ucInitialViewSetting=" + userOptions["ucInitialViewSetting"] + "&";
        };
        if (typeof (userOptions["ucIsExpandable"]) !== "undefined") {
            requestStr += "ucIsExpandable=" + userOptions["ucIsExpandable"] + "&";
        };
        if (typeof (userOptions["ucIsPageable"]) !== "undefined") {
            requestStr += "ucIsPageable=" + userOptions["ucIsPageable"] + "&";
        };
        if (typeof (userOptions["ucItemEndDate"]) !== "undefined") {
            requestStr += "ucItemEndDate=" + userOptions["ucItemEndDate"] + "&";
        };
        if (typeof (userOptions["ucItemStartDate"]) !== "undefined") {
            requestStr += "ucItemStartDate=" + userOptions["ucItemStartDate"] + "&";
        };
        if (typeof (userOptions["ucResultFormat"]) !== "undefined") {
            requestStr += "ucResultFormat=" + userOptions["ucResultFormat"] + "&";
        };
        if (typeof (userOptions["ucResultLimit"]) !== "undefined") {
            requestStr += "ucResultLimit=" + userOptions["ucResultLimit"] + "&";
        };
        if (typeof (userOptions["ucResultList"]) !== "undefined") {
            requestStr += "ucResultList=" + userOptions["ucResultList"] + "&";
        };
        if (typeof (userOptions["ucSelection"]) !== "undefined") {
            requestStr += "ucSelection=" + userOptions["ucSelection"] + "&";
        };
        if (typeof (userOptions["ucTemplate"]) !== "undefined") {
            requestStr += "ucTemplate=" + userOptions["ucTemplate"] + "&";
        };
        if (typeof (userOptions["ucTitle"]) !== "undefined") {
            requestStr += "ucTitle=" + userOptions["ucTitle"] + "&";
        };
        if (typeof (userOptions["ucViewAllLink"]) !== "undefined") {
            requestStr += "ucViewAllLink=" + userOptions["ucViewAllLink"] + "&";
        };
        if (typeof (userOptions["ucViewAllStr"]) !== "undefined") {
            requestStr += "ucViewAllStr=" + userOptions["ucViewAllStr"] + "&";
        };
        if (typeof (userOptions["ucViewLessStr"]) !== "undefined") {
            requestStr += "ucViewLessStr=" + userOptions["ucViewLessStr"] + "&";
        };


        if (userOptions.hasOwnProperty("ucCssClass")) {
            requestStr += "ucCssClass=" + userOptions["ucCssClass"] + "&";
        };
        if (userOptions.hasOwnProperty("ucSpecified")) {
            requestStr += "ucSpecified=" + userOptions["ucSpecified"] + "&";
        };

        // filter ones
        if (userOptions.hasOwnProperty("ucNameTitleLike")) {
            requestStr += "ucNameTitleLike=" + userOptions["ucNameTitleLike"] + "&";
        };
        if (userOptions.hasOwnProperty("ucNeighborhood")) {
            requestStr += "ucNeighborhood=" + userOptions["ucNeighborhood"] + "&";
        };
        if (userOptions.hasOwnProperty("ucCity")) {
            requestStr += "ucCity=" + userOptions["ucCity"] + "&";
        };
        if (userOptions.hasOwnProperty("ucPostalCode")) {
            requestStr += "ucPostalCode=" + userOptions["ucPostalCode"] + "&";
        };
        if (userOptions.hasOwnProperty("ucCategory")) {
            requestStr += "ucCategory=" + userOptions["ucCategory"] + "&";
        };
        if (userOptions.hasOwnProperty("ucTypeCategory")) {
            requestStr += "ucTypeCategory=" + userOptions["ucTypeCategory"] + "&";
        };
        if (userOptions.hasOwnProperty("ucTag")) {
            requestStr += "ucTag=" + userOptions["ucTag"] + "&";
        };
        if (userOptions.hasOwnProperty("ucSubject")) {
            requestStr += "ucSubject=" + userOptions["ucSubject"] + "&";
        };
        if (userOptions.hasOwnProperty("ucVenue")) {
            requestStr += "ucVenue=" + userOptions["ucVenue"] + "&";
        };
        if (userOptions.hasOwnProperty("ucEvent")) {
            requestStr += "ucEvent=" + userOptions["ucEvent"] + "&";
        };
        if (userOptions.hasOwnProperty("ucVenueName")) {
            requestStr += "ucVenueName=" + userOptions["ucVenueName"] + "&";
        };
        if (userOptions.hasOwnProperty("ucEventName")) {
            requestStr += "ucEventName=" + userOptions["ucEventName"] + "&";
        };
        if (userOptions.hasOwnProperty("ucAttribute1")) {
            requestStr += "ucAttribute1=" + userOptions["ucAttribute1"] + "&";
        };
        if (userOptions.hasOwnProperty("ucAttribute2")) {
            requestStr += "ucAttribute2=" + userOptions["ucAttribute2"] + "&";
        };
        if (userOptions.hasOwnProperty("ucAttribute3")) {
            requestStr += "ucAttribute3=" + userOptions["ucAttribute3"] + "&";
        };
        if (userOptions.hasOwnProperty("ucField1")) {
            requestStr += "ucField1=" + userOptions["ucField1"] + "&";
        };
        if (userOptions.hasOwnProperty("ucFieldValue1")) {
            requestStr += "ucFieldValue1=" + userOptions["ucFieldValue1"] + "&";
        };
        if (userOptions.hasOwnProperty("ucField2")) {
            requestStr += "ucField2=" + userOptions["ucField2"] + "&";
        };
        if (userOptions.hasOwnProperty("ucFieldValue2")) {
            requestStr += "ucFieldValue2=" + userOptions["ucFieldValue2"] + "&";
        };
        if (userOptions.hasOwnProperty("ucField3")) {
            requestStr += "ucFieldValue3=" + userOptions["ucFieldValue3"] + "&";
        };
        if (userOptions.hasOwnProperty("ucFieldValue3")) {
            requestStr += "ucFieldValue3=" + userOptions["ucFieldValue3"] ;
        };
        return requestStr;
    };

    _CalendarOptions["ucItemStartDate"] = selYear + '-' + (selMonth + 1) + '-' + selDay;
    _CalendarOptions["ucItemEndDate"] = _CalendarOptions["ucItemStartDate"];
    var requestStr = makeRequestStr();

    jQuery.ajax({
        url: 'userControls/CalendarMain/results.aspx?' + requestStr,
        dataType: "jsonp",
        jsonpCallbackString: "resultCBFN",
        success: function(data) {
            jQuery("#mainCalendar").find(".calendarEvents").parent().html(data);
        }
    });
};

var resultCBFN = function(data) {
    jQuery("#mainCalendar").find(".calendarEvents").parent().html(data);
};
