HCal = function() {

	return {

		init : function(divId, date) {
		    try
		    {
			    HCalendar.init(divId, date, false, HCal.loadData, HCal.loadDataMonth);
			}
			catch(e)
			{
			}
		},

		loadData : function(month, day, year, obj) {

			$('#eventsList').load('CalendarList.aspx', {
				date : (month + '/' + day + '/' + year),
				GetEventsForDay : 1
			});

			$('#evtHead').html('CALENDAR OF EVENTS');
		},

		loadDataMonth : function(month, year) {

            $('#eventsList').load('CalendarList.aspx', { month: month, year: year, GetEventsForMonth: 1 });
			  
            $('#evtHead').html('CALENDAR OF EVENTS');
			 
		},

		LoadEvent : function(id, date) {
			location.href = 'EventDetails.aspx?eid=' + id + '&selDate=' + (date);
		}

	};
}();

// / Base Calendar
HCalendar = function() {
	var calPH;
	var currDate;
	var currMonth;
	var currYear;
	var selDate;
	var selMonth;
	var selYear;

	var dayNames = ['S', 'M', 'T', 'W', 'T', 'F', 'S']; // Names of days starting at Sunday
	var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 
	                  'August', 'September', 'October', 'November', 'December'];
	var monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

	var dayArray;

	var eventsForDay;
	var showERow = true;

	// functions
	var dayDataFn = null;
	var monthDataFn = null;

	return {

		prevMonth : function() {
			if (currMonth == 0) {
				return 11;
			} else {
				return currMonth - 1;
			}
		},

		nextMonth : function() {
			if (currMonth == 11) {
				return 0;
			} else {
				return currMonth + 1;
			}
		},

		init : function(divId, date, showER, dayFn, monthFn) {
			calPH = divId;
			dayDataFn = dayFn;
			monthDataFn = monthFn;
            showERow = (showER == null ? false : showER);
            
			dayArray = new Array();
			eventsForDay = new Array();

			var dt;

			if (date != "")
				dt = new Date(date);
			else
				dt = new Date();

			currMonth = dt.getMonth();
			currDate = dt.getDate();
			currYear = dt.getFullYear();

			selDate = currDate;
			selMonth = currMonth;
			selYear = currYear;

			HCalendar.generateCal();
		},

		initDayArray : function() {
			var ii;
			var startIndex;
			var endIndex;
			var day;

			// Clean the Array
			for (ii = 0;ii < 42; ii++)
				dayArray[ii] = '&nbsp;';

			var dt = new Date(currYear, currMonth, 1);

			startIndex = dt.getDay();
			if (currMonth == 1 && (currYear % 4 == 0)) {
				endIndex = startIndex + 29;
			} else {
				endIndex = startIndex + monthDays[currMonth];
			}

			day = 1;
			for (ii = startIndex;ii < endIndex; ii++) {
				dayArray[ii] = day++;
			}
		},

		getEventsForMonth : function() {

			var res = HWSWeb.CalendarList.GetEventDatesForMonth(currMonth + 1, currYear);

			if (res != null && res.value != null) {
				eval('eventsForDay = [' + res.value + ']');
			}
		},

		generateCal : function() {
			var html;
			var ii;

			html = '<div class="cal_control">';

			html += '<div class="cal_month_nav">';

			html += '<div class="cal_prev_month">';
			html += '<a href="javascript:void(0);" onclick="HCalendar.goPrev();" class="mo-prev">&nbsp;</a>';
			html += '</div>';

			html += '<div class="cal_next_month">';
			html += '<a href="javascript:void(0);" onclick="HCalendar.goNext();" class="mo-next">&nbsp;</a>';
			html += '</div>';

			html += '<div class="cal_current_month">';
			html += '<a href="javascript:void(0);" onclick="HCalendar.onMonthClick(' 
			     + (currMonth + 1) + ',' + (currYear) + ');">' + monthNames[currMonth] + ' ' + currYear + '</a>';
			html += '</div>';

			html += '</div>'; // month_nav

			html += '<table cellspacing="0" cellpadding="0" border="0" class="cal_table">';

			html += '<tr>'
			for (ii = 0;ii < dayNames.length; ii++) {
				html += '<td class="cal_day_head">' + dayNames[ii] + '</td>';
			}
			html += '</tr>' // Calendar Day Head

			HCalendar.initDayArray();
			HCalendar.getEventsForMonth();

			var first = true;
			var reachedEnd = false;
			var dayLink;

			for (ii = 0;ii < dayArray.length; ii++) {
				if (ii % 7 == 0) {
					if (reachedEnd)
						break; // skip generation of last empthy row

					if (first == false) {
						html += '</tr>';
					}

					html += '<tr>';
					first = false;
				}

				if (HCalendar.hasEventsForDay(dayArray[ii])) {
					dayLink = '<a href="javascript:void(0);" onclick="HCalendar.dayData(' 
					+ (currMonth + 1) + ',' + dayArray[ii] + ',' + currYear + ', this);">' + dayArray[ii] + '</a>';
				} else {
					dayLink = dayArray[ii];
				}

				if ((dayArray[ii] == selDate) && (currMonth == selMonth) && (currYear == selYear)) {
					html += '<td class="cal_day_cell day-sel">' + dayLink + '</td>';
				} else {
					html += '<td class="cal_day_cell">' + dayLink + '</td>';
				}

				if (dayArray[ii] >= monthDays[currMonth]) {
				    if(!showERow)
				    {
					    reachedEnd = true;
					}
				}
			}

			html += '</tr>';

			html += '</table>'; // calendar table

			html += '</div>' // cal_control

			$('#' + calPH).html(html);
			
		},

		goPrev : function() {

			if (currMonth != 0) {
				currMonth = currMonth - 1;
			} else {
				currMonth = 11;
				currYear = currYear - 1;
			}

			HCalendar.generateCal();
		},

		goNext : function() {

			if (currMonth != 11) {
				currMonth = currMonth + 1;
			} else {
				currMonth = 0;
				currYear = currYear + 1;
			}

			HCalendar.generateCal();
		},

		hasEventsForDay : function(date) {

			var ii;

			for (ii = 0;ii < eventsForDay.length; ii++) {
				if (eventsForDay[ii] == date)
					return true;
			}

			return false;
		},

		dayData : function(month, day, year, obj) {

			$(".day-sel").removeClass("day-sel");
			$(obj).parent().addClass('day-sel');

			if (dayDataFn != null) {
				dayDataFn(month, day, year, obj)
			}

			selMonth = month - 1, selDate = day;
			selYear = year;
		},

		onMonthClick : function(month, year) {
			if (monthDataFn != null) {
				monthDataFn(month, year);
			}
		},
		
		getMonth: function() {
		    return (currMonth + 1);
		},
		
		getYear: function() {
		    return currYear;
		}

	};
}();
