// Fertility Calendar
// Author: apatten@einsteinindustries.com

EI.namespace("EI.DocShop.Tools");

EI.DocShop.Tools.FertilityCalendar = function() {
	var _currentDate, _fertilityCalElm, _displayedDays, _displayMonth, _displayYear, _container_id, _monthTextualRep, _resultId, _language;
	
	var PREV_MONTH = 0;
	var CURR_MONTH = 1;
	var NEXT_MONTH = 2;
	
	function initialize() {
		_language = document.location.pathname.split('/').indexOf('es') == true ? 'es' : 'en';
		_currentDate = new Date();
		_displayedDays = [];
		_displayMonth = _currentDate.getMonth();
		_displayYear  = _currentDate.getFullYear();
		_fertilityCalElm = $('fertility_cal');
		_resultId = 'fertility_cal_results';
		_monthTextualRep = { 
		  'en' : ['January',	'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
		  'es' : ['Enero',	'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Augosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre']
		};
		
		draw();
	}
	
	// Draw Calendar based off of month and year
	function draw(month, year) {
		month = typeof(month) != 'undefined' ? month : _displayMonth;
		year = typeof(year) != 'undefined' ? year : _displayYear;
		clear();

		var prevMonth_div = new Element('div', { 'class': 'prev_month_arrow'});
		var nextMonth_div = new Element('div', { 'class': 'next_month_arrow'});
		var title_div = new Element('div', { 'class': 'month_title'});
		var week_container = new Element('div', { 'class': 'weeks'});
		var footer_div = new Element('div', { 'class': 'footer'});
		
		Event.observe(prevMonth_div, 'click', function() { drawPreviousMonth(); }.bindAsEventListener(this));
		Event.observe(nextMonth_div, 'click', function() { drawNextMonth(); }.bindAsEventListener(this));
		
		title_div.appendChild(document.createTextNode(_monthTextualRep[_language][month]));
		
		_fertilityCalElm.appendChild(prevMonth_div);
		_fertilityCalElm.appendChild(title_div);
		_fertilityCalElm.appendChild(nextMonth_div);

		displayDays();

		var dayOfWeek = 0;
		var weekDiv;
		_displayedDays.each(function (day) {	
			if(dayOfWeek === 0) {
				weekDiv = new Element('div', { 'class': 'week'});
			}

			ddiv = createDayDiv(day);				
			weekDiv.appendChild(ddiv);

			if(dayOfWeek === 6) {
				week_container.appendChild(weekDiv);
				dayOfWeek = 0;
			} else {
				dayOfWeek++;
			}
		}.bind(this));

		_fertilityCalElm.appendChild(week_container);
		_fertilityCalElm.appendChild(footer_div);		
	}

	function drawPreviousMonth() {
		_displayMonth = (_displayMonth === 0)? 11 : _displayMonth - 1;
		_displayYear = (_displayMonth === 11)? _displayYear - 1: _displayYear;
		draw();
	}

	function drawNextMonth() {
		_displayMonth = (_displayMonth === 11)? 0 : _displayMonth + 1;
		_displayYear = (_displayMonth === 0)? _displayYear + 1: _displayYear;
		draw();
	}

	function clear() {
		_fertilityCalElm.innerHTML = '';
	}

	// Populates _displayedDays array with day objects to be displayed
	function displayDays(month, year) {
		month = typeof(month) != 'undefined' ? month : _displayMonth;
		year = typeof(year) != 'undefined' ? year : _displayYear;

		_displayedDays = [];

		// init some vars
		var startDate;
		var endDate;
		var firstDayOffset = new Date(year, month, 1).getDay();
		var prevMonth = (month === 0)? 11 : month - 1;
		var prevYear = (prevMonth === 11)? year - 1: year;
		var nextMonth = (month === 11)? 0 : month + 1;
		var nextYear = (nextMonth === 0)? year + 1: year;

		// Days From Previous Month
		startDate = daysInMonth(prevMonth, prevYear) - firstDayOffset + 1;
		endDate = daysInMonth(prevMonth, prevYear);
		for(i=startDate; i <= endDate; i++) {
			_displayedDays.push(createDay(PREV_MONTH, i, prevMonth, prevYear));
		}

		// Days From Current Month
		startDate = 1;
		endDate = daysInMonth(month, year);
		for(i=startDate; i <= endDate; i++) {
			_displayedDays.push(createDay(CURR_MONTH, i, month, year));
		}

		// Days From Next Month
		startDate = 1;
		endDate = 7 - (_displayedDays.length % 7) + 14;
		for(i=startDate; i <= endDate; i++) {
			_displayedDays.push(createDay(NEXT_MONTH, i, nextMonth, nextYear));
		}
	}

	// Creates a day object
	function createDay(type, day, month, year) {
		month = typeof(month) != 'undefined' ? month : _displayMonth;
		year = typeof(year) != 'undefined' ? year : _displayYear;

		var dayObject = {};
		dayObject.classes = [];
		dayObject.type = type;
		dayObject.dateObj = new Date(year,month,day);

		switch(dayObject.type) {
			case PREV_MONTH :
				dayObject.classes.push('prev_month');
			break;

			case CURR_MONTH :
				if (dateEqual(dayObject.dateObj, _currentDate)) {
					dayObject.classes.push('today');
				}
			break;

			case NEXT_MONTH :
				dayObject.classes.push('next_month');
			break;
		}

		return dayObject;
	}

	// formats a day object for display
	function createDayDiv(dayObj) {
		var dayDiv = new Element('div');

		dayObj.classes.each(function(classname) {
			dayDiv.addClassName(classname);
		});

		dayDiv.appendChild(document.createTextNode(dayObj.dateObj.getDate()));

		dayObj.element = dayDiv;

		Event.observe(dayDiv, 'click', function() { dayClick(dayObj); }.bindAsEventListener(this));

		return dayDiv;
	}

	function dayClick(dayObj) {
		switch(dayObj.type) {
			case PREV_MONTH :
				drawPreviousMonth();
			break;

			case CURR_MONTH :
				draw();
			break;

			case NEXT_MONTH :
				drawNextMonth();
			break;
		}		

		var firstDayOffset = new Date(_displayYear, _displayMonth, 1).getDay();
		var dateLocation = firstDayOffset + dayObj.dateObj.getDate() - 1;

		_displayedDays[dateLocation].element.addClassName('selected');
		_displayedDays[dateLocation + 13].element.addClassName('fertile');
		_displayedDays[dateLocation + 14].element.addClassName('most_fertile');
		_displayedDays[dateLocation + 15].element.addClassName('fertile');

		textResults(dateLocation);
	}

	function textResults(dateLocation) {
		var startDate = _monthTextualRep[_language][_displayedDays[dateLocation].dateObj.getMonth()] + " " + _displayedDays[dateLocation].dateObj.getDate();
		var fertileDate = _monthTextualRep[_language][_displayedDays[dateLocation+14].dateObj.getMonth()] + " " + _displayedDays[dateLocation+14].dateObj.getDate();
 		var results = {
 		  'en' : '<p>If your period starts on <strong class="selected">' + startDate + '</strong> then your most fertile day is <strong class="most_fertile">' + fertileDate + '</strong>.</p>',
 		  'es' : '<p>Si su menstruación comienza en <strong class="selected">' + startDate + '</strong>, el día más fértil es <strong class="most_fertile">' + fertileDate + '</strong>.</p>'
 		};
		if (_resultId) {
			$(_resultId).removeClassName('hidden');
			$(_resultId).update(results[_language]);
			new Effect.Highlight($(_resultId), {startcolor:'#fff600'});
		}
	}

	function daysInMonth(month, year) {
		return 32 - new Date(year, month, 32).getDate();
	}

	function dateEqual(date1, date2) {
		var year_compare = (date1.getFullYear() === date2.getFullYear());
		var month_compare = (date1.getMonth() === date2.getMonth());
		var day_compare = (date1.getDate() === date2.getDate());
		
		return (year_compare && month_compare && day_compare);
	}

	document.observe('dom:loaded', initialize);
}();