// Events object
var eventObj = {
	// Variables
	events   	: [],
	months		: ["Januar","Februar","Mars","April","Mai","Juni","Juli","August","September","Oktober","November","Desember"],
	days 		: ["Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag","Søndag"],
			
	// Find the amount of days in a month
	daysInMonth : function(iMonth, iYear) {
		return 32 - new Date(iYear, iMonth-1, 32).getDate();
	},
			
	// Filter dates
	filterDate : function(year, month, day) {
		return year+' '+this.months[parseInt(month)-1]+' '+day;
	},
			
	// Split the date from dialog form
	splitDate  : function(date) {
		var dateParts 	= date.split(' ');
		var year 		= dateParts[0];
		var month 		= parseInt($.inArray(dateParts[1], this.months));
		var day 		= dateParts[2];
		return [year,month+1,day];
	},
			
	// A function for converting a datetime to date + time
	convertDatetimeToDate : function(datetime) {
		if (datetime != undefined) {
			var dateParts = datetime.split(' ');
			var date = dateParts[0];
			var time = dateParts[1];
			
			// Date
			var dateParts = date.split('-');
			var year = dateParts[0];
			var month = dateParts[1];
			var day = dateParts[2];
			if (day.substr(0, 1) == 0) 
				day = day.substr(1, 1);
			
			// Time
			var timeParts = time.split(':');
			var hours = timeParts[0];
			var minutes = timeParts[1];
			
			return [this.filterDate(year, month, day), day, hours, minutes, month, year];
		}
	},
	
	// Convert a date back to datetime
	convertDateToDatetime : function(date) {
		var dateParts = date.split(' ');
		var year	  = dateParts[0];
		var month	  = $.inArray(dateParts[1], this.months)+1;
		if(month <= 9) month = '0'+month;
		var day		  = dateParts[2];
		return year+'-'+month+'-'+day;
	},
			
	// Add a event to the events array
	add : function(eventRecord) {
			
		var eventH = [];
		
		// Loop trough the event objects and create one object for the events array
		$.each(eventRecord, function(index, data) {
			eventH.push(data.value);
		});
				
		// Setup the event object to pass over to the events array
		var eventO = {
			fromDate 	: eventH[0],
			fromTime	: eventH[1]+':'+eventH[2],
			toDate		: eventH[3],
			toTime		: eventH[4]+':'+eventH[5],
			repeat		: eventH[6]
		};
		
		// Set the correct date from the datepicker
		var date 	= eventO.fromDate.split(' ');
		var month 	= $.inArray(date[1], this.months);
			month 	= month+1;
			
		eventO.month = month;
		eventO.year  = date[0];
		eventO.day	 = date[2];
			
		// The repeat counter
		var repeatCount = eventH[7];
				
		var year 		= parseInt(eventO.year);
		var month 		= parseInt(eventO.month);
		var day			= parseInt(eventO.day);
		eventO.fromDate = this.filterDate(year, month, day);
				
		if (month == 1 || month == 12) {
			var daysInMonth = 31;
		}
		else {
			var daysInMonth = this.daysInMonth(month, year);
		}
				
		var totalDays = 0;
				
		// If we are going to repeat the event
		switch(eventO.repeat) {
			case "daily" :
				// Only do this on insert
				eventH[9] = "insert";
				this.remove(eventH[10]);
						
				var dateParts = this.splitDate(eventH[3]);
						
				for(var i=1; i <= repeatCount; i++) {
					if (month == 1 || month == 12) {
						daysInMonth = 31;
					}
					else {
						daysInMonth = this.daysInMonth(month, year);
					}
							
					if(day > daysInMonth) {
						day = 1;
						if(month == 12) {
							month = 1;
							dateParts[1] = 1;
							dateParts[0]++;
							year++;
						}
						else {
							dateParts[1]++;
							month++;
						}			
					}
							
					eventO = {
						month		: month,
						year		: year,
						day			: day,
						fromDate 	: '',
						fromTime	: eventH[1]+':'+eventH[2],
						toDate		: eventH[3],
						toTime		: eventH[4]+':'+eventH[5],
						repeat		: ''
					};
					eventO.fromDate = this.filterDate(year,month,day);
					eventO.toDate	= this.filterDate(dateParts[0],dateParts[1],dateParts[2]);
							
					this.insert(eventO, eventH[9], eventH[10]);
					dateParts[2]++;
					day++;	
				}
			break;
			case "weekly" :
				// Only do this on insert
				eventH[9] = "insert";
				this.remove(eventH[10]);
						
				var dateParts = this.splitDate(eventH[3]);
						
				var weekDay = new Date(year, month-1, day).getDay();
				daysInMonth = this.daysInMonth(month, year);
				var counter = 1;
						
				for (var a = 0; a <= daysInMonth; a++) {
					var currentWeekDay = new Date(year, month-1, day).getDay();
					if (currentWeekDay == weekDay) {
						if (counter <= repeatCount) {
							eventO = {
								month		: month,
								year		: year,
								day			: day,
								fromDate	: '',
								fromTime	: eventH[1] + ':' + eventH[2],
								toDate		: eventH[3],
								toTime		: eventH[4] + ':' + eventH[5],
								repeat		: ''
							};
							eventO.fromDate = this.filterDate(year,month,day);
							eventO.toDate	= this.filterDate(dateParts[0],dateParts[1],dateParts[2]);
									
							this.insert(eventO, eventH[9], eventH[10]);
							counter++;
						}
						else {
							break;
						}
					}
								
					if (day == daysInMonth) {
						day = 1;
						dateParts[2] = 1;
						dateParts[1]++;
						month++;
						if (month == 12) {
							month = 1;
							dateParts[1] = 1;
							dateParts[0]++;
							year++;
						}
						a = 0;
					}
					else {
						dateParts[2]++;
						day++;	
					}
				}
			break;
			case "monthly" :
				// Only do this on insert
				eventH[9] = "insert";
				this.remove(eventH[10]);
						
				var dateParts = this.splitDate(eventH[3]);
						
				repeatCount--; // Repeat the amount from the current point
				for(var i=0; i <= repeatCount; i++) {
					if(month > 12) {
						month = 1;
						dateParts[1] = 1;
						dateParts[0]++;
						year++;
					}
							
					eventO = {
						month		: month,
						year		: year,
						day			: eventH[8],
						fromDate 	: '',
						fromTime	: eventH[1]+':'+eventH[2],
						toDate		: eventH[3],
						toTime		: eventH[4]+':'+eventH[5],
						repeat		: ''
					};
					eventO.fromDate = this.filterDate(year,month,eventH[8]);
					eventO.toDate	= this.filterDate(dateParts[0],dateParts[1],dateParts[2]);
							
					// We dont want to insert event into array
					daysInMonth = this.daysInMonth(month, year);
					day 		= parseInt(eventO.day);
					if (day <= daysInMonth) {
						this.insert(eventO, eventH[9], eventH[10]);
					}
					dateParts[1]++;
					month++;
				}
			break;
			case "yearly" :
				// Only do this on insert
				eventH[9] = "insert";
				this.remove(eventH[10]);
						
				var dateParts = this.splitDate(eventH[3]);
						
				for (var i = 0; i <= repeatCount; i++) {	
					eventO = {
						month		: $('#monthChange').val(),
						year		: year,
						day			: eventH[8],
						fromDate 	: '',
						fromTime	: eventH[1]+':'+eventH[2],
						toDate		: eventH[3],
						toTime		: eventH[4]+':'+eventH[5],
						repeat		: ''
					};
					eventO.fromDate = this.filterDate(year,month,eventH[8]);
					eventO.toDate	= this.filterDate(dateParts[0],dateParts[1],dateParts[2]);
							
					// We dont want to insert event into array
					daysInMonth = this.daysInMonth(month, year);
					day 		= parseInt(eventO.day);
					if (day <= daysInMonth) {
						this.insert(eventO, eventH[9], eventH[10]);
					}
					dateParts[0]++;
					year++;
				}
			break;
			default :
				this.insert(eventO, eventH[9], eventH[10]);
			break;
		}
				
		// Set the current event
		this.setCurrentEventDates();
	},
			
	// Insert into array
	insert : function(eventO, type, index) {
		if(type == "insert") {
			// Add the event
			this.events.push(eventO);
		}
		else {
			var index = parseInt(index);
			this.events[index] = eventO;
		}
		
		$('#monthChange').val(eventO.month);
		$('#yearChange').val(eventO.year);
		
		// Load the calendar again!
		$('#calendarPlaceholder').load('/intranett1/index.php?t=registration.calendar&month='+eventO.month+'&year='+eventO.year+'&RegistrationRecurringID='+RecID+'&RegistrationID='+RegistrationID, function() {
			eventObj.populateCurrentCalendar(); // Re populate the calendar
		});
	},
			
	// A simple function to populate the current event fromdate and todate
	setCurrentEventDates : function() {
		var fromDate = $('.RegistrationFromDateTime');
		var toDate	 = $('.RegistrationToDateTime');
		var e		 = this.events[0];
				
		if (e != null) {
			fromDate.val(e.fromDate + ' ' + e.fromTime);
			toDate.val(e.toDate + ' ' + e.toTime);	
			if(this.events.length > 1) {
				// Set recurring events to true
				$("#recurring").val('true');
			}
			else {
				$("#recurring").val('false');
			}
		}
		else {
			// Set recurring events to false
			$("#recurring").val('false');
		}
	},
			
	// Remove a object based on the index
	remove : function(index) {
		if(index != "") {
			this.events.splice(index, 1); // Unset the index/date	
		}
		this.setCurrentEventDates();
	},
			
	// Get an event from the event array
	getEvent : function(day, fromTime, toTime) {
		var month = $('#monthChange').val();
		var year  = $('#yearChange').val();
		var dataO = {};
		$.each(this.events, function(index, data) {
			if(data.month == month && data.year == year && day == data.day && fromTime == data.fromTime && toTime == data.toTime) {
				dataO = {
					i	  : index,
					dataH : data
				};
			}
		});
		return dataO;
	},
	
	// To retrive an object from the event array
	getEventByIndex : function(index) {
		return this.events[index];
	},
			
	// Populate the calendar table
	populateCurrentCalendar : function() {
		// Clear out the current calendar
		this.clearCurrentCalendar();
				
		var month = $('#monthChange').val();
		var year  = $('#yearChange').val();
		var days  = $('#calendarPlaceholder').find('.day');
		var title = $('.current_event_title').val();
		
		$.each(this.events, function(index, data) {
			if(data.month == month && data.year == year) {
				$.each(days, function(i, d) {
					if(data.day == d.innerHTML) {
						var dayO = $(d);
						// Add the content to the div
						if (data.fromDate == data.toDate) {
							if (data.activeDate == true) {
								dayO.parent().find('div.events').append('<div class="dated_time activity_time" title="Click to edit time for event"><span class="fromTime">' + data.fromTime + '</span> - <span class="toTime">' + data.toTime + '</span> <span class="registrationTitle">' + title + '</span></div>');
							}
							else {
								dayO.parent().find('div.events').append('<div class="dated_time instance_time" title="Click to edit time for event copy"><span class="fromTime">' + data.fromTime + '</span> - <span class="toTime">' + data.toTime + '</span> <span class="registrationTitle">' + title + '</span></div>');
							}
						}
						else {
							if (data.activeDate == true) {
								dayO.parent().find('div.events').append('<div class="dated_time activity_time" title="Click to edit time for event"><div class="eventTime"><span class="fromTime">' + data.fromTime + '</span> -  <span class="toTime">' + data.toTime + '</span> <span class="toDate">(' + data.toDate + ')</span> <span class="registrationTitle">' + title + '</span></div>');
							}
							else {
								dayO.parent().find('div.events').append('<div class="dated_time instance_time" title="Click to edit time for event copy"><div class="eventTime"><span class="fromTime">' + data.fromTime + '</span> -  <span class="toTime">' + data.toTime + '</span> <span class="toDate">(' + data.toDate + ')</span> <span class="registrationTitle">' + title + '</span></div>');
							}
						}
					}
				});
			}
		});
	},
			
	// Clear out the current calendar view
	clearCurrentCalendar : function() {
		$(document).find('.events').empty();
	},
			
	// Return all the events array
	returnAllEvents : function() {
		return this.events;
	},
			
	// Set the active event date
	setActiveDate : function() {
		// fikse slik at denne ikke kjører ved første gangs opprettelse!
		var fromDatetime 	= this.convertDatetimeToDate($(".RegistrationFromDateTime").val());
		var toDatetime 		= this.convertDatetimeToDate($(".RegistrationToDateTime").val());
		
		if (fromDatetime != undefined && toDatetime != undefined) {
			// Setup the event object to pass over to the events array
			var eventO = {
				month: $('#monthChange').val(),
				year: $('#yearChange').val(),
				day: fromDatetime[1],
				fromDate: fromDatetime[0],
				fromTime: fromDatetime[2] + ':' + fromDatetime[3],
				toDate: toDatetime[0],
				toTime: toDatetime[2] + ':' + toDatetime[3],
				repeat: '',
				activeDate: true
			};
			this.events.push(eventO);
			this.populateCurrentCalendar();
		}
	},
	
	// Edit the current event
	currentEventEdit: function(eventRecord){
		
		var eventH = [];
				
		// Loop trough the event objects and create one object for the events array
		$.each(eventRecord, function(index, data) {
			eventH.push(data.value);
		});
		
		var fromDate = eventH[0];
		var fromTime = eventH[1]+':'+eventH[2];
		var toDate	 = eventH[3];
		var toTime	 = eventH[4]+':'+eventH[5];
		
		// Set the current date
		$(".RegistrationFromDateTime").val(this.convertDateToDatetime(fromDate)+' '+fromTime);
		$(".RegistrationToDateTime").val(this.convertDateToDatetime(toDate)+' '+toTime);
		
		var date 	= fromDate.split(' ');
		var month 	= $.inArray(date[1], this.months);
			month 	= month+1;
			
		var eventO 		= this.getEventByIndex(0);
		eventO.day 		= date[2];
		eventO.month	= month;
		eventO.year		= date[0];
		eventO.fromDate = fromDate;
		eventO.toDate	= toDate;
		eventO.fromTime	= fromTime;
		eventO.toTime	= toTime;
		
		// Update current
		this.insert(eventO, 'update', 0);
	}
};

