
var com = com || {};
com.resmark = {

	/**
		regex for date formats:
	*/
	DATE_FORMAT: /(0[1-9]|1[0-2])\/(([0-2][0-9])|(3[0-1]))\/20[0-9]{2}/,
	startDateId: 'startDate',
	endDateId: 'endDate',
	
	/**
		YAHOO.calendar createDateSelector(String inputId)
		Creates and returns a new YUI calendar object
	*/
	createDateSelector: function (inputId)
	{
		var config = {pages:2, title:'Please select a date:', mindate: new Date()};
		var dateSelector = new YAHOO.widget.CalendarGroup('_' + inputId, inputId + 'Container', config);
		dateSelector.selectEvent.subscribe(com.resmark.onDateSelected, dateSelector, true);
		this['mouseActive_' + inputId] = false;
		dateSelector.renderEvent.subscribe(function() {
			YAHOO.util.Event.addListener(inputId + 'Container', 'mouseover', com.resmark.mouseEntered, dateSelector, true);
			YAHOO.util.Event.addListener(inputId + 'Container', 'mouseout', com.resmark.mouseExited, dateSelector, true);
		}, dateSelector, true);
		
		dateSelector.render();
		return dateSelector;
	},
	
	mouseEntered: function()
	{
		com.resmark['mouseActive' + this.id] = true;
		console.log("mouseActive" + this.id + ": " + com.resmark['mouseActive' + this.id]);
	},
	
	mouseExited: function ()
	{
		com.resmark['mouseActive' + this.id] = false;
		//this.mouseActive = false;
		console.log("mouseActive" + this.id + ": " + com.resmark['mouseActive' + this.id]);
	},
	
	/**
		boolean isValidDate(String mmddyyyy)
		Returns true if the supplied argument matches the month pattern MM/dd/yyyy
	*/
	isValidDate: function (mmddyyyy)
	{
		mmddyyyy = mmddyyyy || '';
		if (mmddyyyy.match(this.DATE_FORMAT))
		{
			var isValid = false;
			var fields = mmddyyyy.split('/') || [];
			if (fields.length == 3)
			{
				var month = Number(fields[0]) - 1;
				var day   = Number(fields[1]);
				var year  = Number(fields[2]);
				
				var testDate = new Date(year, month, day);
				testDate.setFullYear(year);
				isValid = testDate.getFullYear() == year && testDate.getMonth() == month && testDate.getDate() == day;
			}
		}
		
		return isValid;
	},
	
	/**
		Date getDateValue(mmddyyyy)
		Returns a valid Date object with the proper full year set
		or null (if the supplied date is not valid.
	*/
	getDateValue: function (mmddyyyy)
	{
		var result = null;
		if (this.isValidDate(mmddyyyy))
		{
			var fields = mmddyyyy.split('/') || [];
			if (fields.length == 3)
			{
				var month = Number(fields[0]) - 1;
				var day   = Number(fields[1]);
				var year  = Number(fields[2]);
				
				result = new Date(year, month, day);
				result.setFullYear(year);
			}
		}
		
		return result;
	},
	
	/**
		String getMMDDYYYY(Date dateObject)
		Returns an MM/dd/yyyy formatted date string
		that reflects the value of the supplied dateObject.
	*/
	getMMDDYYYY: function (dateObject)
	{
		var result = null;
		if (dateObject)
		{
			var month = dateObject.getMonth() + 1;
			var day   = dateObject.getDate();
			var year  = dateObject.getFullYear();
			if (month < 10)
			{
				month = '0' + month;
			}
			if (day < 10)
			{
				day = '0' + day;
			}
			
			result = month + '/' + day + '/' + year;
		}
		
		return result;
	},
	
	/**
		void updateDateValue(String eventType, int[] dateFields, YUICalendarGroup calendarObject)
		Event listening function that executes when a yui.CalendarGroup
		object makes a selection.  The "this" context of this method
		is the instance of the yui.CalendarGroup this function was registered on.
	*/
	onDateSelected: function (eventType, dateFields, calendarObject)
	{
		var myId = calendarObject.id;
		var inputId = myId.substring(1, myId.length);
		var theDates = this.getSelectedDates();
		var selectedDate = theDates[0] || new Date();
		
		var myInput = document.getElementById(inputId);
		if (selectedDate)
		{
			myInput.value = com.resmark.getMMDDYYYY(selectedDate);
		}
		
		var myContainer = document.getElementById(calendarObject.containerId);
		myContainer.style.display = 'none';
		if (inputId == com.resmark.startDateId)
		{
			com.resmark.refreshEndDate();
		}
		else
		{
			com.resmark.refreshStartDate();
		}
	},
	
	/**
		void showCalendar(String inputId, YUICalendarGroup calendarObject)
	*/
	showCalendar: function (inputId, calendarObject)
	{
		var myInput = document.getElementById(inputId);
		var myContainer = document.getElementById(inputId + 'Container');
		var selectedDate = this.getDateValue(myInput.value);// || new Date();
		
		calendarObject.cfg.setProperty('selected', myInput.value);
		calendarObject.setMonth(selectedDate.getMonth());
		calendarObject.setYear(selectedDate.getFullYear());
		calendarObject.render();
		//calendarObject.cfg.setProperty('pagedate', selectedDate.getMonth() + '/' + selectedDate.getFullYear());
		
		var xyArray = YAHOO.util.Dom.getXY(myInput);
		var myX = xyArray[0] - 200;
		var myY = xyArray[1] + 20;
		myContainer.style.display = 'block';
		YAHOO.util.Dom.setXY(myContainer, [myX, myY]);
	},
	
	/**
		void hideCalendar(String inputId)
	*/
	hideCalendar: function (inputId)
	{
		if (!this['mouseActive_' + inputId])
		{
			var myContainer = document.getElementById(inputId + 'Container');
			myContainer.style.display = 'none';
		}
	},
	
	refreshStartDate: function ()
	{
		var startInput = document.getElementById(this.startDateId);
		var endInput   = document.getElementById(this.endDateId);
		var startDate  = this.getDateValue(startInput.value) || new Date();
		var endDate    = this.getDateValue(endInput.value) || new Date();
		
		if (startDate > endDate)
		{
			startDate = endDate;
		}
		
		startInput.value = this.getMMDDYYYY(startDate);
	},
	
	refreshEndDate: function (startDateId, endDateId)
	{
		var startInput = document.getElementById(this.startDateId);
		var endInput   = document.getElementById(this.endDateId);
		var startDate  = this.getDateValue(startInput.value) || new Date();
		var endDate    = this.getDateValue(endInput.value) || new Date();
		
		if (endDate < startDate)
		{
			endDate = startDate;
		}
		
		endInput.value = this.getMMDDYYYY(endDate);
	}

};






