/*
* Create calender and carousel style nav for it
*/

(function($) { 
$.ti.createTripCalendar = {
	
	// Width of single grid block activity
	activityWidth: 102,
	
	// Width of each extra grid block in an activity - the extra 3 px covers margin
	// i.e. a 3 day activity would be 102 + 105 + 105 px wide
	activityWidthMultiple: 105,
	
//	dayCharacterLimit: 30,
    dayCharacterLimit: 24,
	
	lock: false,
	
	hasErrors: false,
	
	hasProductErrors: false,
	
	hasDummyActivities: true,
	
	currentView: {
		firstDay: 1,
		lastDay: 7,
		duration: 7
	},
	
	setNavState: function() {
		if($.ti.tripData.trip.tripStartDate) {
			if(this.currentView.firstDay === 1) {
				$('#previousDay, #previousWeek').addClass('disabled');	
			} else {
				$('#previousDay, #previousWeek').removeClass('disabled');
			}		
			if(this.currentView.lastDay === this.currentView.duration) {
				$('#nextDay, #nextWeek').addClass('disabled');				
			} else {
				$('#nextDay, #nextWeek').removeClass('disabled');
			}
			if(this.currentView.duration < 7) {
				$('#nextDay, #nextWeek').addClass('disabled');
			}
		} else {
			if(this.currentView.firstDay === 1) {
				$('#previousDay, #previousWeek').addClass('disabled');	
			} else {
				$('#previousDay, #previousWeek').removeClass('disabled');
			}		
				$('#nextDay, #nextWeek').removeClass('disabled');
		}
	},
	
	setNavEvents: function() {
		// Previous Day
		$('#previousDay:not(.disabled)').die('click.previousDay');
		$('#previousDay:not(.disabled)').live('click.previousDay', function() {
			if($.ti.createTripCalendar.lock === false) {
				$.ti.createTripCalendar.lock = true;
				$.ti.createTripCalendar.previousDay();	
			}			
		});
		// Previous Week
		$('#previousWeek:not(.disabled)').die('click.previousWeek');
		$('#previousWeek:not(.disabled)').live('click.previousWeek', function() {
			if($.ti.createTripCalendar.lock === false) {
				$.ti.createTripCalendar.lock = true;
				$.ti.createTripCalendar.previousWeek();
			}
		});
		// Next Day
		$('#nextDay:not(.disabled)').die('click.nextDay');
		$('#nextDay:not(.disabled)').live('click.nextDay', function() {
			if($.ti.createTripCalendar.lock === false) {
				$.ti.createTripCalendar.lock = true;
				$.ti.createTripCalendar.nextDay();
			}
		});
		// Next Week
		$('#nextWeek:not(.disabled)').die('click.nextWeek');
		$('#nextWeek:not(.disabled)').live('click.nextWeek', function() {
			if($.ti.createTripCalendar.lock === false) {
				$.ti.createTripCalendar.lock = true;
				$.ti.createTripCalendar.nextWeek();
			}
		});
	},
	
	previousDay: function() {
		var dayAdded = false;
		if(!dayAdded) {
			$.ti.createTripCalendar.move(+1);
		}
	},
	
	previousWeek: function() {
		var actualMove, daysAvailable, daysAdded = false;
		
		actualMove = 7;
		
		daysAvailable = $.ti.createTripCalendar.currentView.firstDay -1;
		
		if(daysAvailable < 7) {
			actualMove = daysAvailable;
		}
		
		if(!daysAdded) {
			$.ti.createTripCalendar.move(+actualMove);	
		}		
	},
	
	nextDay: function() {
		if(!$.ti.tripData.trip.tripStartDate) {
			if($.ti.createTripCalendar.currentView.lastDay === $.ti.createTripCalendar.currentView.duration) {
				$.ti.createTripDay.addDay('future', 1, 0);
				$.ti.createTripCalendar.currentView.duration += 1;
			}
		}
		
		$.ti.createTripCalendar.move(-1);			
	},
	
	nextWeek: function() {
		var actualMove, daysAvailable;
		
		actualMove = 7;
		
		daysAvailable = ($.ti.createTripCalendar.currentView.duration - $.ti.createTripCalendar.currentView.lastDay);
		
		if(!$.ti.tripData.trip.tripStartDate) {
			if(daysAvailable < actualMove) {
				$.ti.createTripDay.addDay('future', (actualMove-daysAvailable), 0);
				$.ti.createTripCalendar.currentView.duration += (actualMove-daysAvailable);				
			}
		} else {
			if(daysAvailable < 7) {
				actualMove = daysAvailable;
			}			
		}
		
		$.ti.createTripCalendar.move(-actualMove);	
	},
	
	// Move calender function
	// Accepts: days either a positive or negative number of days depending on the direction you wish to scroll.
	move: function(days) {
		var distance = $.ti.createTripCalendar.activityWidthMultiple * days;						
		$('#calendarDays').animate({
			"left": '+=' + distance + 'px'
		}, 'slow', 'easeOutQuart', function(){$.ti.createTripCalendar.lock = false;});
		
		// Update view data
		$.ti.createTripCalendar.currentView.firstDay -= days;
		
		$.ti.createTripCalendar.currentView.lastDay -= days;
		
		// Check and set nav state
		$.ti.createTripCalendar.setNavState();
	},
	
	// Clear the calender and repopulate without actually touching the data object
	resetCalender: function() {
		$('#calendarDays').css({"left": "-3px"});
		$.ti.recalculateCalendarGrid.clearGrid();
		$('.day', '#calendarDays').remove();
		if($.ti.tripData.trip) {
			$.ti.createTripCalendar.populateCalendar();
		}
	},
	
	populateCalendar: function() {	
		// Render days in calender
		if($.ti.tripData.trip.tripDuration) {
			this.currentView.duration = $.ti.tripData.trip.tripDuration;
			$.ti.createTripDay.addDay('creation', $.ti.tripData.trip.tripDuration);
			if($.ti.tripData.trip.tripDuration < 7) {
				$.ti.createTripDay.addDay('empty', (7 - $.ti.tripData.trip.tripDuration));	
			}			
		}
		else {
			$.ti.createTripDay.addDay('creation', 7);
		}
		
		
		//console.log($.ti.tripData.trip.tripActivities);
		if($.ti.tripData.trip.tripActivities) {
				$.ti.createTripCalendar.getActivities();
		} else {
			$.ti.createCalendarActivity.createDummyActivities();
		}
		
		// Reset view data
		$.ti.createTripCalendar.currentView.firstDay = 1;
		$.ti.createTripCalendar.currentView.lastDay = 7;
		
		$.ti.createTripCalendar.currentView.duration = $.ti.tripData.trip.tripDuration;
		
		this.setNavState();
		this.setNavEvents();
	},
	
	// Get all activities that are referenced as on the grid in the data object and add them to the calender.
	getActivities: function() {
		
		var activity, positions, count, length, gridReference, validDate;
		
		var activityCount = 0;
		this.hasDummyActivities = true; //console.log('start activity');
	
		// Search through activities for those with positions on the calender
	
		for(activity in $.ti.tripData.trip.tripActivities.activity) {		
	
			if($.ti.tripData.trip.tripActivities.activity.hasOwnProperty(activity)) {				
	
				if($.ti.tripData.trip.tripActivities.activity[activity].actRowColumnDays) {
	
					if($.ti.tripData.trip.tripActivities.activity[activity].actProductId == 'DELETED'){
				
							
						if(!$.ti.calendarErrors.errorProducts) {
			
							$.ti.calendarErrors.errorProducts = new Array;	
						}								
						$.ti.calendarErrors.errorProducts.push([$.ti.tripData.trip.tripActivities.activity[activity].id, $.ti.tripData.trip.tripActivities.activity[activity].actName]);
						$.ti.tripData.trip.tripActivities.activity.splice(activityCount, 1);		
					}
					if($.ti.utils.objectLength($.ti.calendarErrors.errorProducts) > 0){

						$.ti.createTripCalendar.hasProductErrors = true;
					}
					
					// Create array of positions

					positions = $.ti.tripData.trip.tripActivities.activity[activity].actRowColumnDays.split(',');					
					// loop through positions to add to calender
	
					length = positions.length;					
					for(count = 0; count < length; count += 1) {
					
						validDate = true;
						// Todo - reference and duration should probable be handled in the createActivity function - doing here for now.
						gridReference = positions[count].split('_');
						
						// Check if activity has a date						
						if($.ti.tripData.trip.tripActivities.activity[activity].actStartDate && $.ti.tripData.trip.tripStartDate) {	
	
							validDate = $.ti.calendarErrors.checkDates($.ti.tripData.trip.tripActivities.activity[activity].actStartDate, $.ti.tripData.trip.tripActivities.activity[activity].actEndDate, $('#' + gridReference[0]).closest('.day').data('date'), gridReference[1]);
							if(!validDate) {
	
								// Save error reference, it doesn't matter what count is it's just a unique value to assign								
								if(!$.ti.calendarErrors.errorPositions[activity]) {
	
									$.ti.calendarErrors.errorPositions[activity] = {};	
								}								
								$.ti.calendarErrors.errorPositions[activity][count] = gridReference[0];
							}
						}						
						$.ti.createCalendarActivity.createActivity(gridReference[0], gridReference[1], $.ti.tripData.trip.tripActivities.activity[activity].id, $.ti.tripData.trip.tripActivities.activity[activity], validDate);
					}
					this.hasDummyActivities = false;
				}
				activityCount++;
	
			}
		}
		
		if (this.hasDummyActivities) $.ti.createCalendarActivity.createDummyActivities();
		
	}
};
})(jQuery);

