/**
 * @author 22492
 */
var HUDHRE = function() {
	var events = [];
	var currentSelectedMonth = "";
	var currentSelectedYear = "";

	var init = function() {
		
		$.extend({//a function to handle url param in jQuery 
		getUrlVars: function() {
			var vars = {};
			var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; });
			return vars;
			}
		});   	
    	
    	var today = new Date();
    	function firstOfMonth(year,month){return (new Date(year, month,1));}
    	function lastOfMonth(year,month){return dd = new Date(year, month, 0);}
		function convertDatePickerStringToDate(strDate){
			if(strDate != null && strDate!= ""){
				var arrGotoDate = new Array(); 
				arrGotoDate= strDate.split('/');
				//necessary bc fullcalendar uses zero based month datepicker uses 1 based months
				var dt = new Date(arrGotoDate[2],arrGotoDate[0]-1,arrGotoDate[1]);
				return dt;
			}
			return '';
		}
		function eventsForMiniCalendar(date){
						 $.ajax({
							type: "GET",
							async: false,
							url: '/index.cfm?do=viewCalendarEvents',
							dataType: 'json',
							data: {
								start: Math.round(firstOfMonth(date.getFullYear(),date.getMonth()) / 1000),
								end: Math.round(lastOfMonth(date.getFullYear(),date.getMonth()+1) / 1000)
							},
							success: function(doc) {
								events = eval(doc);
							}
		});}
    	var year = today.getFullYear();
    	var month = today.getMonth();
    	var lom = lastOfMonth(year,month+1);
    	var fom = firstOfMonth(year,month);
		

		/*******************************entry on HOME Page*******************************/
    	if (!!document.getElementById('miniCalendarWrapper')){
					function sortUl(id){
						var items = $('#'+id+' ul.sortable li').get();
						items.sort(function(a,b){ 
						  var keyA = parseInt($(a).attr('class'));
						  var keyB = parseInt($(b).attr('class'));
						  if (keyA < keyB) return -1;
						  if (keyA > keyB) return 1;
						  return 0;
						});
						var ul = $('#'+id+' ul.sortable');
						$.each(items, function(i, li){
						  ul.append(li);
						});
					}
					function getPresentableTime(hours,minutes){
						var niceTime="";var ampm ="";
						if(hours > 11){ampm=("PM")} else {ampm=("AM")}
						if (minutes < 10){minutes = "0" + minutes}
						if(hours>12){hours = hours-12}	
						niceTime =(hours + ":" + minutes + " "+ampm)
						return niceTime;
					}
					function submitThis(el){
						 window.location.href =el.href;
					}	
					function daysWithEvents(){
					$('#miniCalendar table a').each(function(){
						var link = $(this);
						var localToolTip = '<div class="noDot" id="'+currentSelectedYear+''+currentSelectedMonth+''+link.html()+
											'"><ul class="sortable"></ul></div>'; 
						link.attr('rel','#'+currentSelectedYear+''+currentSelectedMonth+''+link.html());
						
						link.attr('href','/index.cfm?do=viewCalendar&showView=listView&gotoDay='+
								  currentSelectedMonth+'/'+link.html() +'/'+currentSelectedYear);
						$(link).click(function (){submitThis(this)});
						$('#tooltips').append(localToolTip);
						var  hasDeadline =false;
						var  hasHUD =false;
						var  hasNonHUD =false;
						$(events).each(function(i, e) {
							var s = new Date(e.start);
							var ee = new Date(e.end);
							var start = new Date(s.getFullYear(),s.getMonth(),s.getDate(),0,0,0,0);
							var end = new Date(ee.getFullYear(),ee.getMonth(),ee.getDate(),0,0,0,0);
							var pickerDay = link.html();
							var dt = new Date(currentSelectedYear,currentSelectedMonth-1,pickerDay,0,0,0,0); 
							if((start <= dt)&&(end >= dt)){
								var selector = currentSelectedYear+''+currentSelectedMonth+''+link.html();
								var eventDetails='';
								if(e.allDay == true){
									eventDetails= '<p><strong>All Day Event</strong>';
								}
								else{
									eventDetails= '<p><strong>Start:</strong>'+getPresentableTime(s.getHours(),s.getMinutes())+
									' <strong>End:</strong>'+getPresentableTime(ee.getHours(),ee.getMinutes())+ '</p>';
								}
								var twoDigTime =s.getMinutes(); 
								if (s.getMinutes()<10){
									twoDigTime=0+''+s.getMinutes();
								}
								var timeSortBy = s.getHours()+''+twoDigTime;
								$('#'+selector+' ul').append('<li class='+timeSortBy+'><h4 class="jtipHead '+e.className+'">'+
															 e.title+'</h4>'+eventDetails+'</li>');
								link.cluetip({local:true, showTitle: false,arrows: true,cluetipClass:'jtip'});
								if(e.className == "Deadline"){hasDeadline = true}
								else if(e.className == "HUDEvent"){hasHUD =true}
								else if(e.className == "NonHUDEvent"){hasNonHUD =true}}});
						if(hasDeadline == true && hasHUD == false && hasNonHUD == false)
							{$(link).parent().addClass("hasEvent Deadln");}
						else if(hasDeadline == false && hasHUD == true && hasNonHUD == false)
							{$(link).parent().addClass("hasEvent HUDEv");}
						else if(hasDeadline == false && hasHUD == false && hasNonHUD == true)
							{$(link).parent().addClass("hasEvent NonHUDEv");}
						else if(hasDeadline == true && hasHUD == true && hasNonHUD == false)
							{$(link).parent().addClass("hasEvent DeadlnHud");}
						else if(hasDeadline == true && hasHUD == false && hasNonHUD == true)
							{$(link).parent().addClass("hasEvent DeadlnNonHUD");}
						else if(hasDeadline == false && hasHUD == true && hasNonHUD == true)
							{$(link).parent().addClass("hasEvent HUDNonHUD");}
						else if(hasDeadline == true && hasHUD == true && hasNonHUD == true)
							{$(link).parent().addClass("hasEvent DeadlnHUDNonHUD");}
						//sort events by the start date 
						sortUl(currentSelectedYear+''+currentSelectedMonth+''+link.html());
					});}
				
					
					$('#miniCalendar').datepicker({
						 onChangeMonthYear: function(y, m, inst) {
							 currentSelectedMonth = m;
							 currentSelectedYear = y;
							 eventsForMiniCalendar(new Date(y,m-1));
							 $('#tooltips').html('');
							 window.setTimeout(function(){ daysWithEvents() }, 50);
						 }
					});
					//on load
					 currentSelectedMonth = today.getMonth()+1;
					 currentSelectedYear = today.getFullYear();
					 eventsForMiniCalendar(new Date());
					 window.setTimeout(function(){ daysWithEvents() }, 50);
				
					$('#miniCalendarWrapper .ui-datepicker-title').live('click', function(){
						var dt = "";
						if(currentSelectedYear != ""&&currentSelectedMonth != ""){
							dt = currentSelectedMonth +"/1/"+currentSelectedYear;
						}										  
					 window.location.href = '/index.cfm?do=viewCalendar&gotoDate='+ dt;
					});
		}	
		
		/*******************************entry on LOAD Calendar Page*******************************/
		if(!!document.getElementById('calendar')){
			var defaultView = $.getUrlVars()['showView'];
			var refetch = false;
			function preFilterEventsByType(eventTypeId){
				if(eventTypeId != null && eventTypeId != "")
				{
					$('input:radio[value='+eventTypeId+']').attr('checked', 'checked');		
				}
			}
			
			function getCalendarData(start, end, callback) {
						var narrowBy = $.getUrlVars()['narrowBy'];
						preFilterEventsByType(narrowBy);
						
						$.ajax({
							type: "GET",
							async: false,
							url: '/index.cfm?do=viewCalendarEvents',
							dataType: 'json',
							data: {
								start: Math.round(start.getTime() / 1000),
								end: Math.round(end.getTime() / 1000)//,
							},
							success: function(doc) {
								var events = [];
								try{
									events = eval(doc);
									callback(events);
									$("#calendar").fullCalendar("removeEvents", filterEvents);
								} catch(e){
									//alert(e);
								}
							}
						});
				}
				function getTitle(event){
					if (event.allDay){
						return 'All Day Event :' +	event.description; 
					}
					else{
						return ' Start: '+event.start+' End:'+event.end+' Description: '+event.description;					
					}				
				}
				
				function fullCal(target){
					$(target).fullCalendar({
						header: {
							 left:'',
							 center: 'prev,title,next',
							 right: ''
						 },
						events: getCalendarData,
						buttonText: {
							prev: '<< Previous ',
							next: 'Next >>'
						},
						columnFormat: {
							 month: 'dddd'
						},
						editable: false,
						timeFormat: 'h:mm tt ',
						disableDragging: true,
				   	 	eventMouseover: function(event, jsEvent, view) {
							var title = getTitle(event);
			                $(jsEvent.target).attr('title',title);
        				}
						
					});
				}
				function highlightDay(dt){
					var  hasDeadline =false;
					var  hasHUD =false;
					var  hasNonHUD =false;
					var meClass ='';
					$(events).each(function(i, e) {
						var s = new Date(e.start);
						var ee = new Date(e.end);
						var start = new Date(s.getFullYear(),s.getMonth(),s.getDate(),0,0,0,0);
						var end = new Date(ee.getFullYear(),ee.getMonth(),ee.getDate(),0,0,0,0);
										
						if((start <= dt)&&(end >= dt)){
							if(e.className == "Deadline"){hasDeadline = true}
							else if(e.className == "HUDEvent"){hasHUD =true}
							else if(e.className == "NonHUDEvent"){hasNonHUD =true}
						}
					});
										if(hasDeadline == true && hasHUD == false && hasNonHUD == false)
											{meClass= "hasEvent Deadln";}
										else if(hasDeadline == false && hasHUD == true && hasNonHUD == false)
											{meClass= "hasEvent HUDEv";}
										else if(hasDeadline == false && hasHUD == false && hasNonHUD == true)
											{meClass= "hasEvent NonHUDEv";}
										else if(hasDeadline == true && hasHUD == true && hasNonHUD == false)
											{meClass= "hasEvent DeadlnHud";}
										else if(hasDeadline == true && hasHUD == false && hasNonHUD == true)
											{meClass= "hasEvent DeadlnNonHUD";}
										else if(hasDeadline == false && hasHUD == true && hasNonHUD == true)
											{meClass= "hasEvent HUDNonHUD";}
										else if(hasDeadline == true && hasHUD == true && hasNonHUD == true)
											{meClass= "hasEvent DeadlnHUDNonHUD";}
					return [true,meClass];
				}	
				function getEventListView(clicker,dtfrm,dtTo){
						$('#calendar').empty();
						$('.calendartabs li').removeClass('current');
						$(clicker).parent().addClass('current');
						
						refetchListEvents(dtfrm,dtTo);
						if(dtfrm !=''){
							from = firstOfMonth(dtfrm.getFullYear(),dtfrm.getMonth());
						}
						else{
							from = new  Date();
						}
							
						window.setTimeout(function(){ 
									$('#currentMonth').datepicker(
										{defaultDate:from,
											numberOfMonths: 2,	nextText: 'Next >',	prevText: '< Previous',
											beforeShowDay: function(dt)
											{
												return highlightDay(dt); 
											},
											onSelect: function(dateText, inst) { 
												window.location.href =
												'/index.cfm?do=viewCalendar&showView=listView&gotoDay='+dateText;
											},
 										 onChangeMonthYear: 
										 	function(y, m, inst) 
											{
																			
												from = firstOfMonth(y,m-1);
												to	= lastOfMonth(y,m+1);
												eventsForMiniCalendar(new Date(y,m-1));
												 if(refetch){
													refetchListEvents(from,to);
												 }
												 refetch = true;
								 			}
								 });}, 900);
				}
					
				function refetchListEvents(from ,to ){
						if(from == ''){
							var s = Math.round(firstOfMonth(year,month)/1000);
						}
						else{
							var s = Math.round(from/1000);
						}
						if(to ==''){
							var e = Math.round(lastOfMonth(year,month+1)/1000);
						}
						else{
							var e = Math.round(to/1000);
						}	
						var narrowBy =$('input:radio[name=narrow]:checked').val(); 
						var program=$('select#program option:selected').val();  
						var system=$('select#system option:selected').val();  
						var type= $('select#type option:selected').val();
						var topic= $('select#topic option:selected').val();
						
						
						$('#list').load('/index.cfm?do=calendarListView&start='+
											s+'&end='+e+
											'&narrowBy='+narrowBy+
											'&program='+program+
											'&system='+system+
											'&type='+type+
											'&topic='+topic);
				}
				function filterEvents(event) {
					var filterIt = false;
					var narrowBy =$('input:radio[name=narrow]:checked').val(); 
					var program=$('select#program option:selected').val();  
					var system=$('select#system option:selected').val();  
					var type= $('select#type option:selected').val();
					var topic= $('select#topic option:selected').val();
					
					if (narrowBy != "-1"){
						var eventTypesNeeded = new Array();
						eventTypesNeeded = narrowBy.split(',');
						var inCategory = false;
						for(var i in eventTypesNeeded){
							if(eventTypesNeeded[i] == event.eventType){inCategory =true;}
						}
						filterIt = !inCategory;
						if(filterIt){return true}
					}
					if (program != "-1"){
						if(program != event.program){filterIt =true;}
						if(filterIt){return true}
					}
					if (system != "-1"){
						if(system != event.system){filterIt =true;}
						if(filterIt){return true}
					}
					if (type != "-1"){
						if(type != event.type){filterIt =true;}
						if(filterIt){return true}
					}
					if (topic != "-1"){
						if(topic != event.topic){filterIt =true;}
						if(filterIt){return true}
					}
					return filterIt;
				}
				
				$('div.calendartabs').show();//show filter if JS present

				$("div#fullFilter:not(input#reset)").change(function () {		
					if($('#listView').parent().hasClass('current')){
						getEventListView($('#listView'),'','');		
					}
					else if($('#oneMonthView').parent().hasClass('current')){
						$("#calendar").fullCalendar('refetchEvents',function(){});
						$("#calendar").fullCalendar("removeEvents", filterEvents);	
					}
				});
				
				$('div#fullFilter input#reset').click(function (e) {
					e.preventDefault();
					$('input:radio[value=-1]').attr('checked', 'checked');	
					$("#program option:first").attr('selected','selected');
					$("#system option:first").attr('selected','selected');
					$("#type option:first").attr('selected','selected');
					$("#topic option:first").attr('selected','selected');
				
					if($('#listView').parent().hasClass('current')){
						getEventListView($('#listView'),'','');		
					}
					else if($('#oneMonthView').parent().hasClass('current')){
						$("#calendar").fullCalendar('refetchEvents',function(){});
						$("#calendar").fullCalendar("removeEvents", filterEvents);	
					}
				});
				
				function isDate(dateStr) {
						var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
						var matchArray = dateStr.match(datePat); // is the format ok?
			
					if (matchArray == null) {
						return false;
					}
					else
					{
						return true;
					}
				}
				
				//on load the view depends on the url params passed in :list view VS calendar view
				if(defaultView == 'listView' ){
					$('#calendarListView').show();
					var from='';
					var to = '';
					var eventsForDate;
					var viewDay  = $.getUrlVars()['gotoDay'];
					if(viewDay != null && viewDay !='' && isDate(viewDay)){//want to see a single day
						var viewDayDate=convertDatePickerStringToDate(viewDay);
						from = viewDayDate;
						to=viewDayDate;
						eventsForDate = viewDayDate;
						
					}else if(isDate(viewDay)){//want to see a month
						var pickerStrDate  = $.getUrlVars()['gotoDate'];
						eventsForDate=convertDatePickerStringToDate(pickerStrDate);
						from = firstOfMonth(eventsForDate.getFullYear(),eventsForDate.getMonth());
						to = lastOfMonth(eventsForDate.getFullYear(),eventsForDate.getMonth()+1);						
						//eventsForMiniCalendar(eventsForDate);
						//getEventListView($('#listView'),from,to);
					}
					else{
						window.location.href ='/index.cfm?do=viewCalendar';
						//document.write('<span class="maroon">Invalid Date</span>');
					}
					eventsForMiniCalendar(eventsForDate);
					getEventListView($('#listView'),from,to);
						
				}
				else{
					fullCal('#calendar');
					var gotoDate = $.getUrlVars()['gotoDate'];	
	   			    if(gotoDate != null && gotoDate != '' && isDate(gotodate)){
						 gotoDate=convertDatePickerStringToDate(gotoDate);
						$('#calendar').fullCalendar('gotoDate', gotoDate);
					}
				}
				
				//Change the view to list	
				$('#listView').click(function(e){
						e.preventDefault();					
						$('#calendarListView').show();
						var pickerStrDate = ''
						pickerStrDate  = $.getUrlVars()['gotoDate'];
						var foMonth='';loMonth ='';
						
						if(pickerStrDate != null && pickerStrDate!= '' && isDate(pickerStrDate)){
							var pickerDate=convertDatePickerStringToDate(pickerStrDate);
							 foMonth = firstOfMonth(pickerDate.getFullYear(),pickerDate.getMonth());
							 loMonth = lastOfMonth(pickerDate.getFullYear(),pickerDate.getMonth()+1);	
							eventsForMiniCalendar(pickerDate); 
							getEventListView($(this),foMonth,loMonth);
						}
						
						else{
							eventsForMiniCalendar(new Date()); 
							getEventListView($(this),foMonth,loMonth);	
						}
										  
				});	
	
				$('#oneMonthView').click(function(e){	
					e.preventDefault();
					var gotoDate = $.getUrlVars()['gotoDate'];	
					  $('#calendarListView').hide();
						$('.calendartabs li').removeClass('current');
						$('#calendar').empty();
						$(this).parent().addClass('current');
						fullCal('#calendar');
						if(gotoDate != null && gotoDate != '' && isDate(gotoDate)){
						 gotoDate=convertDatePickerStringToDate(gotoDate);
						$('#calendar').fullCalendar('gotoDate', gotoDate);
					}
				});	
				
		}	
    };
    return {
        init: init
    };
}();
jQuery(function($) {
    HUDHRE.init();
});
