var Calendar = {
  calendarUrlTemplate :'http://calendar.ehawaii.gov/calendar/html/event/{date}/?eventCollectionCode={code}&viewtype=2&currentViewtype=2&event={eventId}&viewperiod=1',
  _currentDate : null,
  _calendar : null,
  
  init : function() {
     var today = new Date();
     var currMonth = today.getMonth();
	 var year = today.getYear();
	 var calendar = null;
	 
	 Portal.onInit(function() {
	     $('#column1').prepend('<div class="block"><div class="calendar"></div></div>');
		 
		 setTimeout(function() {
			 Calendar._initCalendarWidget();
			 
			 Portal.onThemeChanged(function() {
			   setTimeout(function() {
					Calendar._initCalendarWidget();
			   }, 1000);
			 });
			 
		 }, 1000);

	 });
	 
	 $.address.change(function(event) {
		   var date = $.address.parameter('date');
		   var evt = $.address.parameter('evt');
		   var calendar = Calendar._calendar;
		   
		   if (Calendar._currentDate != date) {
			   Calendar._currentDate = date;
			   
			   $('#calendar-events li').remove();
			   Calendar.buildDetailedEventList('#calendar-events', date,
				 function(data) {
				   if (evt) {
					 var eventLink = $('#event-' + evt).find('a');
					 
					 if (eventLink.length > 0) {
					   Calendar.viewEventDetail(eventLink, evt);
					 }
				   }
				 }
			   );
			   
			   var dt = date.replace(/-/g, "/");
			   Calendar._initCalendarEventMarkers(dt);
			   $('.current-date').text(Calendar._toLongDate(dt));
		  } else if (evt) {
			var eventLink = $('#event-' + evt).find('a');
			
			if (eventLink.length > 0) {
			   Calendar.viewEventDetail(eventLink, evt);
			}
		  }

	 });
		 
	 
	 $('.calendar-prev').button(
	   {icons : {primary: 'ui-icon-circle-arrow-w'}}
	  ).click(function() {
	   var date = Calendar._calendar.datepicker("getDate");
	   date.setDate(date.getDate() - 1);
	   $.address.parameter('date', $.datepicker.formatDate('mm-dd-yy', date));
	   Calendar.markDaysWithEvents('.calendar');
	 });
	 
	 $('.calendar-next').button(
	   {icons : {secondary: 'ui-icon-circle-arrow-e'}}
	 ).click(function() {
	   var date = Calendar._calendar.datepicker("getDate");
	   date.setDate(date.getDate() + 1);
	   $.address.parameter('date', $.datepicker.formatDate('mm-dd-yy', date));
	   Calendar.markDaysWithEvents('.calendar');
	 });

  },
  
  _initCalendarWidget : function() {
     var calendar = $('#column1 .calendar');
	 
	 if (calendar.find('.ui-datepicker').length > 0) {
	   calendar.datepicker("destroy");
	 }
	 
	 calendar.datepicker({
	   onChangeMonthYear : function(year, month,inst) {
		setTimeout(function() {
			Calendar.updateDaysWithEvents(month, year, function() {
			  Calendar.markDaysWithEvents('.calendar');
			});
		}, 1000);
	   },
	   onSelect : function(dateText) {
		 if (dateText) {
			var date = dateText.replace(/\//g, "-");
			$.address.parameter('date', date);
			$('.current-date').text(Calendar._toLongDate(dateText));
			setTimeout(function() {
				Calendar.markDaysWithEvents('.calendar');
			}, 500);
		 }
	   }
	 });
     Calendar._calendar = calendar;
  },
  
  _initCalendarEventMarkers : function(dt) {
    var date = $.address.parameter('date');

    var calendar = Calendar._calendar;
	
    if (calendar) {
	   Calendar.markDaysWithEvents('.calendar');
	   calendar.datepicker("setDate", dt);
    } else {
	   setTimeout(function() {
		 var calendar = Calendar._calendar;
		 
		 if (!calendar) {
		   Calendar._initCalendarEventMarkers(dt);
		 } else {
		   calendar.datepicker("setDate", dt);
		   var calDate = calendar.datepicker("getDate");
			 
		  Calendar.updateDaysWithEvents(
				 calDate.getMonth() + 1, 
				 calDate.getYear() < 1900 ? calDate.getYear()  + 1900 : calDate.getYear(),
				 function() {
					Calendar.markDaysWithEvents('.calendar');
				 });
		 }
		  
	   }, 1000);
    }
  },
  
  buildCalendarPage : function() {
     var today = new Date();
     var currMonth = today.getMonth();
	 var year = today.getYear();
	 
	 $.address.init(function(event) {
	 
	 }).change(function(event) {
	   var path = $.address.path();
	   var value = $.address.value();
	   var queryString = $.address.queryString();
	   var parameterNames = $.address.parameterNames();
	   var pathNames = $.address.pathNames();
	 });

  },
  
  buildTodaysEventList: function(selector) {
    var elem = $(selector);
	elem.find("li").remove();
	var today = $.datepicker.formatDate("mm-dd-yy", new Date());
    Portal.readJsonFeed(10, {}, function(data) {
	  if (data.length > 0) {
		  $.each(data, function(i, eventData) {
		    if (eventData) {
				var start = eventData.start_time.substring(11);
				elem.append('<li><span class="event-start">' + start + '</span><span class="event-title"><a href="/government/calendar.html#?date=' + today + '&evt='+eventData.event_id+'">' + eventData.title + '</a></span></li>');
			}
		  });
	  } else {
	    elem.append('<li>No further events are scheduled for today</li>');
	  }
	});
  },
  
  buildEventList: function(selector) {
    var elem = $(selector);
	elem.find("li").remove();
    Portal.readJsonFeed(10, {}, function(data) {
	  $.each(data, function(i, eventData) {
	    var start = eventData.start_time.substring(11);
	    elem.append('<li><span class="event-start">' + start + '</span><span class="event-title">' + eventData.title + '</span></li>');
	  });

	});
  },
  
  buildDetailedEventList: function(selector, date, callback) {
    var elem = $(selector);
    Portal.readJsonFeed(12, {'date' : date, 'max' : 100}, function(data) {
	  if (data.length > 0) {
	      elem.find("li").remove();
		  $.each(data, function(i, eventData) {
			 var start = eventData.start_time.substring(11);
			 var startDate = eventData.start_date.replace(/\//g, '-');
			
			 var url = '/government/calendar.html#?date=' + startDate + '&evt=' + eventData.event_id;
			 elem.append('<li id="event-'+eventData.event_id+'" class="clearfix"><span class="event-start">' + start + '</span><span class="event-title"><a href="' + url + '" >' + eventData.title + '</a></span></li>');
		  });
	  } else {
	    elem.append('<li class="none">No events scheduled.</li>');
	  }
	  
	  if (callback) {
	    callback.apply(this, [data]);
	  }
	});
  },
  
  viewEventDetail : function(elem, eventId) {
	 var eventTable = elem.parents('li').find('div');
	 var statuses = {'handicap_access' : 'Handicap Access', 'hearing_impaired' : 'Hearing Impaired'};
	 
	 elem.parents('ul').find('div').each(function() {
	    var $this = $(this);
	    var id = $this.attr('id');
		if (id != eventTable.attr('id')) {
			$this.slideUp("fast");
		 }
	  });
	 
	 if (eventTable.length == 0) {
		 Portal.readJsonFeed(15, {'eventId' : eventId}, function(eventData) {
		   
		   var detailTable = '<div id="event-detail-'+eventId+'" style="display:none"><table>';
		   detailTable += '<tr><td class="first">Date</td><td>' + eventData.date + '</td></tr>';
		   detailTable += '<tr><td class="first">Time</td><td>' + eventData.time + '</td></tr>';
		   detailTable += '<tr><td class="first">Title</td><td>' + eventData.title + '</td></tr>';
		   detailTable += '<tr><td class="first">Location</td><td>' + eventData.location + '</td></tr>';
		   
		   var status = [];
		   $.each(statuses, function(key, value) {
		     if (eventData[key]) {
			   status.push(value);
			 }
		   });
		   
		   if (status.length > 0) {
			detailTable += '<tr><td class="first">Event Status</td><td>' + status.join(", ") + '</td></tr>';
		   }
		   
		   detailTable += '</table>';
		   
		   var dateParts = eventData.start_date.split('/');
		   var startDate = dateParts[2] + '/' + dateParts[0] + '/' + dateParts[1];
		   var url = Calendar.calendarUrlTemplate.replace(/{date}/, startDate).replace(/{eventId}/,eventData.event_id).replace(/{code}/, eventData.code);
		   detailTable += '<span class="official-calendar"><a href="' + url + '" target="_blank">View In Official State Calendar</a></span>';
		   detailTable += '</div>';
		   
		   elem.after(detailTable);
		   eventTable = elem.parents('li').find('div');
		   eventTable.slideDown('fast');
		   
		});
	} else {
	  eventTable.slideDown("fast");
	}
  },
  
  markDaysWithEvents: function(selector) {
	  var elem = $(selector);
	  var len = elem.find('.ui-state-default').length;
	  elem.find('.ui-state-default').each(function() {
		  var dayElem = $(this);
		  var day = parseInt(dayElem.text(),10);
		  var cell = dayElem.parents('td');
		  cell.removeClass('has-event');
		  if ($.inArray(day, Calendar.daysWithEvents) > -1) {
		    cell.addClass('has-event');
			var link = cell.find('a');
			link.addClass('ui-state-highlight');
		  }
	  });
	  elem.find('.ui-state-active').removeClass('ui-state-highlight');
  },
  
  updateDaysWithEvents: function(month, year, callback) {
    Portal.readJsonFeed(11, {'month' : (month <= 9 ? "0" +month : month), 'year' : year}, function(data) {
	  Calendar.daysWithEvents = data;
	  if (callback) {
	    callback.apply(this, [Calendar.daysWithEvents]);
	  }
	});
  },
  
  _toLongDate : function(date) {
    var dt = $.datepicker.parseDate('mm/dd/yy', date);
	var fmtDt = $.datepicker.formatDate('MM d, yy', dt);
	return fmtDt;
  }
}
