//alert(Class);

var Scheduler = Class.create(EventClass, {	
	'initialize': function($super, container) {
		// this.schedulerData = [{
			// 'Date': new Date(2011, 1, 3),
			// 'Meals': {
				// 'Main': {
					// 'Items': [{
						// 'ProductID': 1,
						// 'Name': 'Shepherds Pie',
						// 'Quantity': 1
					// }, {
						// 'ProductID': 2,
						// 'Name': 'Steak and Chips',
						// 'Quantity': 1
					// }]
				// },
				// 'Dessert': {
					// 'Items': [{
						// 'ProductID': 1,
						// 'Name': 'Apple Pie',
						// 'Quantity': 1
					// }]
				// }
			// }
		// },{
			// 'Date': new Date(2011, 1, 4),
			// 'Meals': {
				// 'Main': {
					// 'Items': [{
						// 'ProductID': 1,
						// 'Name': 'Shepherds Pie',
						// 'Quantity': 1
					// }, {
						// 'ProductID': 2,
						// 'Name': 'Steak and Chips',
						// 'Quantity': 1
					// }, {
						// 'ProductID': 2,
						// 'Name': 'Steak and Chips',
						// 'Quantity': 1
					// }]
				// },
				// 'Dessert': {
					// 'Items': [{
						// 'ProductID': 1,
						// 'Name': 'Apple Pie',
						// 'Quantity': 1
					// },{
						// 'ProductID': 1,
						// 'Name': 'Apple Pie',
						// 'Quantity': 1
					// }]
				// }
			// }
		// }];	
		this.schedulerData = ScheduleData;  // Copy from global variable set in view
		
		this.container = jQuery(container);
		this.schedulerDays = [];
	
		this.render();
	},
	/*'setFoodType': function(foodType) {
		this.foodType = foodType;
	},*/
	'getDates': function() {
		var dates = [];
		
		for (var index = 0; index < this.schedulerData.length; index++) {
			var schedulerDayData = this.schedulerData[index];			
			dates.push(schedulerDayData.Date);
		}
		
		return dates;
	},
	'addDates': function(dates) {
		for (var index = 0; index < dates.length; index++) {
			var date = dates[index];
			this.addDate(date);
		}
		
		this.render();
	},
	'removeDates': function(dates) {
		for (var dateIndex = 0; dateIndex < dates.length; dateIndex++) {
			var date = dates[dateIndex];
			
			for (var schedulerDayIndex = 0; schedulerDayIndex < this.schedulerData.length; schedulerDayIndex++) {
				var schedulerDay = this.schedulerDays[schedulerDayIndex];
				var schedulerDayData = schedulerDay.schedulerDayData;
				
				if (schedulerDayData.Date - date == 0) {
					this.removeDay(schedulerDay);
				}
			}
		}
		
		this.render();
	},
	'addDate': function(date) {
		var newScheduleDayData = {
			'Date': date,
			'Meals': {
				'Main': {
					'Items': []
				},
				'Dessert': {
					'Items': []
				}
			}
		};
		
		this.schedulerData.push(newScheduleDayData);
		
		this.render();
	},
	'removeDay': function(day) {
		this.schedulerDays.removeValue(day);
		this.schedulerData.removeValue(day.schedulerDayData);
		this.trigger('change');
	},
	'getDayByDate': function(date) {
		for (var index = 0; index < this.schedulerDays.length; index++) {
			var schedulerDay = this.schedulerDays[index];
			if (schedulerDay.schedulerDayData.Date - date == 0) {
				return schedulerDay;
			}
		}
		return null;
	},
	'addProduct': function(date, mealTypeName, product) {
		var schedulerDay = this.getDayByDate(date);		
		schedulerDay.addProduct(mealTypeName, product);
		this.trigger('change');
	},
	'render': function() {
		var schedulerDaysUl = this.container.find('.SchedulerDays');
		var schedulerDayPrototypeLi = schedulerDaysUl.find('.SchedulerDay.Prototype');
	
		schedulerDaysUl.find('> li').not('.Prototype, .PlaceHolderDay').remove();
		this.schedulerDays = [];
	
		schedulerDaysUl.find('.PlaceHolderDay').toggle(!this.schedulerData.length);
	
		for (var schedulerDayIndex = 0; schedulerDayIndex < this.schedulerData.length; schedulerDayIndex++) {
			var schedulerDayData = this.schedulerData[schedulerDayIndex];			
			var schedulerDayLi = schedulerDayPrototypeLi.clone().removeClass('Prototype');
			schedulerDaysUl.append(schedulerDayLi);
			
			var schedulerDay = new SchedulerDay(schedulerDayData, schedulerDayLi[0]);
			this.schedulerDays.push(schedulerDay);
			
			if (schedulerDayIndex == this.schedulerData.length - 1) schedulerDayLi.addClass('Last');
		}
		
		this.bindEvents();
	},
	'bindEvents': function() {
		for (var i = 0; i < this.schedulerDays.length; i++) {
			var schedulerDay = this.schedulerDays[i];
			
			schedulerDay.bind('removed', this.callback(function(e) {				
				this.removeDay(e.sender);
				this.render();
			}));
			
			schedulerDay.bind('add_meal_click', this.callback(function(e, e2) {
				this.trigger('add_meal_click', e2);
			}));
			
			schedulerDay.bind('quantity_changed', this.callback(function(e, e2) {
				this.trigger('change', e2);
			}));
		}
	},
	'getData': function() {
		return this.schedulerData;
	},
	'toString': function() {
		return 'Scheduler';
	}
});

var SchedulerDay = Class.create(EventClass, {
	'initialize': function($super, schedulerDayData, schedulerDayLi) {
		this.schedulerDayData = schedulerDayData;
		this.container = jQuery(schedulerDayLi);
		
		this.mealTypes = [];
	
		this.render();
	},
	'render': function() {
		var mealTypesUl = this.container.find('.SchedulerFields');
		var mealTypePrototypeLi = mealTypesUl.find('.MealTypeField.Prototype');
		
		mealTypesUl.find('.MealTypeField').not('.Prototype').remove();
		//this.mealTypes.each(function() { delete this; });
		this.mealTypes = [];
		
		this.container.find('.DateField span.Date').html(this.schedulerDayData.Date.getDayName() + '<br />' + this.schedulerDayData.Date.toDateMonthString());
		
		for (var mealTypeName in this.schedulerDayData.Meals) {
			var mealTypeData = this.schedulerDayData.Meals[mealTypeName];
			var mealTypeLi = mealTypePrototypeLi.clone().removeClass('Prototype');
			mealTypesUl.append(mealTypeLi);
		
			mealTypeLi.addClass(mealTypeName + 'MealField');			
			if (mealTypeName != 'Main') mealTypeLi.find('.AddMealButton .ButtonText').text('Add ' + mealTypeName);
		
			var mealType = new MealType(mealTypeData, mealTypeName, mealTypeLi[0]);
			this.mealTypes.push(mealType);
		}
		
		this.bindEvents();
	},
	'getMealTypeByName': function(mealTypeName) {
		for (var i = 0; i < this.mealTypes.length; i++) {
			var mealType = this.mealTypes[i];
			
			if (mealType.mealTypeName == mealTypeName) {
				return mealType;
			}
		}
		return null;
	},
	'bindEvents': function() {
		this.container.find('.DateField .RemoveButton').unbind();
		this.container.find('.DateField .RemoveButton').click(this.callback(function(e) {
			this.remove();
		}));
	
		for (var i = 0; i < this.mealTypes.length; i++) {
			var mealType = this.mealTypes[i];
			mealType.bind('add_meal_click', this.callback(function(e, e2) {
				e2.Date = this.schedulerDayData.Date;
				this.trigger('add_meal_click', e2);
			}));
			
			mealType.bind('quantity_changed', this.callback(function(e, e2) {
				this.trigger('quantity_changed', e2);
			}));
		}
	},
	'addProduct': function(mealTypeName, product) {
		var mealType = this.getMealTypeByName(mealTypeName);
		mealType.addProduct(product);
	},
	'remove': function() {
		this.trigger('removed');
	},
	'toString': function() {
		return 'SchedulerDay';
	}
});

var MealType = Class.create(EventClass, {
	'initialize': function($super, mealTypeData, mealTypeName, mealTypeLi) {
		this.mealTypeData = mealTypeData;
		this.mealTypeName = mealTypeName;
		this.container = jQuery(mealTypeLi);
	
		this.container.disableSelection();
	
		this.container.find('.AddMealButton').click(this.callback(function(e) {
			var e2 = {};			
			e2['MealTypeName'] = this.mealTypeName;			
			this.trigger('add_meal_click', e2);
		}));
	
		this.render();
	},
	'render': function() {
		var mealsUl = this.container.find('.Meals');
		var mealPrototypeLi = mealsUl.find('.Meal.Prototype');
		
		mealsUl.toggle(!!this.mealTypeData.Items.length);
		mealsUl.find('li:not(.Prototype)').remove();
		
		for (var mealIndex = 0; mealIndex < this.mealTypeData.Items.length; mealIndex++) {
			var mealData = this.mealTypeData.Items[mealIndex];
			var mealLi = mealPrototypeLi.clone().removeClass('Prototype');
			mealsUl.append(mealLi);
			
			mealLi.data('mealData', mealData);
			mealLi.find('.MealName').text(mealData.Name + ' (' + mealData.Quantity + ')');
		}
		
		this.container.find('.AddMealButton').data('mealTypeData', this.mealTypeData);
		
		this.bindEvents();
	},
	'bindEvents': function() {
		this.container.find('.IncButton').click(this.callback(function(e) {
			var mealLi = jQuery(e.sender).closest('li');
			var mealData = mealLi.data('mealData');
			
			mealData.Quantity += 1;
			this.render();			
			this.trigger('quantity_changed');
		}));
		this.container.find('.DecButton').click(this.callback(function(e) {
			var mealLi = jQuery(e.sender).closest('li');
			var mealData = mealLi.data('mealData');
			
			mealData.Quantity -= 1;
			if (mealData.Quantity == 0) this.mealTypeData.Items.removeValue(mealData);
			
			this.render();			
			this.trigger('quantity_changed');
		}));
	},
	'addProduct': function(product) {
		var item = {};
		item.ProductID = product.ProductID;
		item.Name = product.Name;
		item.Quantity = product.Quantity;
		item.FoodType = product.FoodType;
		this.mealTypeData.Items.push(item);
		
		this.render();
	},
	'toString': function() {
		return 'MealType';
	}
});
















