framework.widget.calendar = {
init:function(calendarId, allowableDates, dateFormat, headerTextFormat, startingDate, range, dateChangeHandler, beforeCalendarShownHandler, afterCalendarCloseHandler)
{
	if (!framework.util.isType(calendarId, framework.DataType.STRING) ||
		!framework.util.isType(allowableDates, framework.DataType.ARRAY) ||
		!framework.util.isType(dateFormat, framework.DataType.STRING) ||
		!framework.util.isType(headerTextFormat, framework.DataType.STRING) || 
		!framework.util.isType(startingDate, framework.DataType.NUMBER) ||
		!framework.util.isType(range, framework.DataType.BOOLEAN) ||
		!framework.util.isType(dateChangeHandler, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	if (framework.util.isEmpty(calendarId) ||
		framework.util.isEmpty(allowableDates) ||
		framework.util.isEmpty(dateFormat) ||
		framework.util.isEmpty(headerTextFormat) ||
		!framework.util.isType(startingDate, framework.DataType.FINITE) ||
		(!framework.util.isUndefinedOrNull(beforeCalendarShownHandler) && !framework.util.isType(beforeCalendarShownHandler, framework.DataType.FUNCTION)) || 
		(!framework.util.isUndefinedOrNull(afterCalendarCloseHandler) && !framework.util.isType(afterCalendarCloseHandler, framework.DataType.FUNCTION)))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var calendar = document.getElementById(calendarId);
	framework.widget.calendar._getCalendarAttributes(calendar);
	framework.widget.calendar._buildDIVs(calendar);
	calendar._isPopupWindowVisible = false;
	var statusCode = framework.widget.calendar._closePopupWindow(calendarId);
	if (statusCode != framework.Status.SUCCESS)
	{
		return statusCode;
	}
	statusCode = framework.eventmodel.addElementEvent(calendarId+"._icon", framework.EventType.CLICK, framework.widget.calendar._iconOnClickEventHandler);
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	statusCode = framework.eventmodel.addElementEvent(calendarId+"._text", framework.EventType.BLUR, framework.widget.calendar._textOnBlurEventHandler);
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	statusCode = framework.eventmodel.addElementEvent(calendarId+"._text", framework.EventType.FOCUS, framework.widget.calendar._textOnClickEventHandler);		
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	statusCode = framework.eventmodel.addElementEvent(calendarId+"._body", framework.EventType.CLICK, framework.widget.calendar._dateOnClickEventHandler);
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	statusCode = framework.eventmodel.addElementEvent(calendarId+"._body", framework.EventType.MOUSEOVER, framework.widget.calendar._dateOnMouseOverEventHandler);
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	statusCode = framework.eventmodel.addElementEvent(calendarId+"._body", framework.EventType.MOUSEOUT, framework.widget.calendar._dateOnMouseOutEventHandler);			
	if (statusCode != framework.Status.SUCCESS)		
	{
		return statusCode;
	}
	statusCode = framework.eventmodel.addElementEvent(calendarId+"._window", framework.EventType.MOUSEOUT, framework.widget.calendar._windowOnMouseOutEventHandler);	
	if (statusCode != framework.Status.SUCCESS)		
	{
		return statusCode;
	}
	statusCode = framework.eventmodel.addElementEvent(calendarId+"._nextMonth", framework.EventType.CLICK, framework.widget.calendar._nextOnClickEventHandler);	
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	statusCode = framework.eventmodel.addElementEvent(calendarId+"._previousMonth", framework.EventType.CLICK, framework.widget.calendar._previousOnClickEventHandler);			
	if (statusCode != framework.Status.SUCCESS)		
	{
		return statusCode;
	}
	if (calendar._showYearButtons)
	{
		statusCode = framework.eventmodel.addElementEvent(calendarId+"._nextYear", framework.EventType.CLICK, framework.widget.calendar._nextYearOnClickEventHandler);	
		if (statusCode != framework.Status.SUCCESS)	
		{
			return statusCode;
		}
		statusCode = framework.eventmodel.addElementEvent(calendarId+"._previousYear", framework.EventType.CLICK, framework.widget.calendar._previousYearOnClickEventHandler);			
		if (statusCode != framework.Status.SUCCESS)	
		{
			return statusCode;
		}
	}
	var localizedDayOfWeekNames = framework.widget.calendar._localizedDayOfWeekNames;
	var dayOfTheWeekOne = framework.widget.calendar._calculateAppropriateDay(framework.WidgetConstants.SUNDAY, startingDate);
	if (framework.util.isUndefinedOrNull(dayOfTheWeekOne))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var dayOfTheWeekTwo = framework.widget.calendar._calculateAppropriateDay(framework.WidgetConstants.MONDAY, startingDate);
	if (framework.util.isUndefinedOrNull(dayOfTheWeekTwo))
	{
			
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var dayOfTheWeekThree = framework.widget.calendar._calculateAppropriateDay(framework.WidgetConstants.TUESDAY, startingDate);
	if (framework.util.isUndefinedOrNull(dayOfTheWeekThree))
	{
			
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var dayOfTheWeekFour = framework.widget.calendar._calculateAppropriateDay(framework.WidgetConstants.WEDNESDAY, startingDate);
	if (framework.util.isUndefinedOrNull(dayOfTheWeekFour))
	{
			
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var dayOfTheWeekFive = framework.widget.calendar._calculateAppropriateDay(framework.WidgetConstants.THURSDAY, startingDate);
	if (framework.util.isUndefinedOrNull(dayOfTheWeekFive))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var dayOfTheWeekSix = framework.widget.calendar._calculateAppropriateDay(framework.WidgetConstants.FRIDAY, startingDate);
	if (framework.util.isUndefinedOrNull(dayOfTheWeekSix))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var dayOfTheWeekSeven = framework.widget.calendar._calculateAppropriateDay(framework.WidgetConstants.SATURDAY, startingDate);
	if (framework.util.isUndefinedOrNull(dayOfTheWeekSeven))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	statusCode = framework.util.setInnerHTML((calendarId + "._daysoftheweek1"), localizedDayOfWeekNames[dayOfTheWeekOne].toString());
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	statusCode = framework.util.setInnerHTML((calendarId + "._daysoftheweek2"), localizedDayOfWeekNames[dayOfTheWeekTwo].toString());
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	statusCode = framework.util.setInnerHTML((calendarId + "._daysoftheweek3"), localizedDayOfWeekNames[dayOfTheWeekThree].toString());
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	statusCode = framework.util.setInnerHTML((calendarId + "._daysoftheweek4"), localizedDayOfWeekNames[dayOfTheWeekFour].toString());
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	statusCode = framework.util.setInnerHTML((calendarId + "._daysoftheweek5"), localizedDayOfWeekNames[dayOfTheWeekFive].toString());
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	statusCode = framework.util.setInnerHTML((calendarId + "._daysoftheweek6"), localizedDayOfWeekNames[dayOfTheWeekSix].toString());
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	statusCode = framework.util.setInnerHTML((calendarId + "._daysoftheweek7"), localizedDayOfWeekNames[dayOfTheWeekSeven].toString());
	if (statusCode != framework.Status.SUCCESS)	
	{
		return statusCode;
	}
	calendar = document.getElementById(calendarId);
	if (framework.util.isUndefinedOrNull(calendar))	
	{
		
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	calendar._allowableDates = allowableDates;
	calendar._dateFormat = dateFormat;  
	calendar._headerTextFormat = headerTextFormat;
	calendar._dateChangeHandler = dateChangeHandler;
	calendar._currentCalendarDateOnWidget = null;
	calendar._startingDate = startingDate;	
	calendar._insideWindow = false;
	calendar._range = range;
	if (framework.util.isUndefinedOrNull(beforeCalendarShownHandler))
	{
		calendar._beforeOpenHandler = null;
	}
	else
	{
		calendar._beforeOpenHandler = beforeCalendarShownHandler;
	}
	if (framework.util.isUndefinedOrNull(afterCalendarCloseHandler))
	{
		calendar._afterCloseHandler = null;
	}
	else
	{
		calendar._afterCloseHandler = afterCalendarCloseHandler;
	}
	return framework.Status.SUCCESS;
},
setSelectableDates:function(calendarId, allowableDates, range)
{
	if (!framework.util.isType(calendarId, framework.DataType.STRING) ||
		!framework.util.isType(allowableDates, framework.DataType.ARRAY) ||
		!framework.util.isType(range, framework.DataType.BOOLEAN))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	if (framework.util.isEmpty(calendarId) ||
		framework.util.isEmpty(allowableDates))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var calendar = document.getElementById(calendarId);
	if (framework.util.isUndefinedOrNull(calendar))	
	{
		
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	calendar._allowableDates = allowableDates;
	calendar._range = range;
	return framework.Status.SUCCESS;
},
getSelectedDateObject:function(calendarId)
{
	if (!framework.util.isType(calendarId, framework.DataType.STRING))
	{
		
		return null;
	}
	if (framework.util.isEmpty(calendarId))
	{
		
		return null;
	}
	var selectedDateStr = document.getElementById(calendarId+"._date");
	if (framework.util.isUndefinedOrNull(selectedDateStr))
	{
		
		return null;
	}
  	var reggie = /\d\d\/\d\d\/\d\d\d\d/;	
	if (reggie.test(selectedDateStr.value))
	{
		var month = selectedDateStr.value.slice(0,2);
		var day = selectedDateStr.value.slice(3,5);
		var year = selectedDateStr.value.slice(6,10);	
		var aDate = new Date();	
		aDate.setFullYear(year, month - 1, day);
		return aDate;
	}
	else
	{
		
		return null;
	}
},
setSelectedDateObject:function(calendarId, newDate)
{
	if (!framework.util.isType(calendarId, framework.DataType.STRING) ||
		!framework.util.isType(newDate, framework.DataType.DATE))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	if (framework.util.isEmpty(calendarId))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var calendar = document.getElementById(calendarId);
	if (framework.util.isUndefinedOrNull(calendar))
	{
				
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	if (framework.widget.calendar._validateAllowableDate(newDate, calendarId))
	{	
		if (newDate != framework.widget.calendar.getSelectedDateObject(calendarId)) 
		{
			var calendarIdTexteElement = document.getElementById(calendarId+"._text");
			if (framework.util.isUndefinedOrNull(calendarIdTexteElement))
			{	
						
				return framework.Status.ELEMENT_DOES_NOT_EXIST;
			}
			calendarIdTexteElement.value = framework.widget.calendar.setDateFormat(calendar._dateFormat, newDate);
			var calendarIdDateElement = document.getElementById(calendarId+"._date");
			if (framework.util.isUndefinedOrNull(calendarIdDateElement))
			{	
						
				return framework.Status.ELEMENT_DOES_NOT_EXIST;
			}
			calendarIdDateElement.value = framework.widget.calendar.setDateFormat("%mm/%dd/%yyyy", newDate);
			if (framework.util.isUndefinedOrNull(calendarIdDateElement.value))
			{
						
				return framework.Status.INVALID_ARGUMENT_VALUE;
			}
		}
		else
		{
					
			return framework.Status.INVALID_ARGUMENT_VALUE;
		}
	}
	else
	{
				
		return framework.Status.INVALID_DATE;
	}
	return framework.Status.SUCCESS;
},
setFirstAvailableDate:function(calendarId, newDate)
{
	if (!framework.util.isType(calendarId, framework.DataType.STRING) ||
		!framework.util.isType(newDate, framework.DataType.DATE))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	if (framework.util.isEmpty(calendarId))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var calendar = document.getElementById(calendarId);
	if (framework.util.isUndefinedOrNull(calendar))
	{
				
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	calendar._allowableDates.sort(framework.widget.calendar._sortDateArray);
	var firstAvailableDate = new Date();
	if (framework.widget.calendar.beforeDate(newDate, calendar._allowableDates[0], true, true)) 
	{
		firstAvailableDate = framework.util.clone(calendar._allowableDates[0]);
	}
	if (framework.widget.calendar.beforeDate(newDate, calendar._allowableDates[calendar._allowableDates.length - 1], true, true)) 
	{
		if(calendar._range)
		{
			firstAvailableDate = framework.util.clone(newDate);
		}
		else
		{
			for (var index = 0; index < calendar._allowableDates.length; index += 1)
			{
				if ((calendar._allowableDates[index].getFullYear() == newDate.getFullYear()) &&
					(calendar._allowableDates[index].getMonth() == newDate.getMonth()) &&
					(calendar._allowableDates[index].getDate() == newDate.getDate()))
				{
					firstAvailableDate = framework.util.clone(newDate);
					break;
				}
				else if (framework.widget.calendar.afterDate(calendar._allowableDates[index], newDate, true, false)) 
				{
					firstAvailableDate = framework.util.clone(calendar._allowableDates[index]);
					break;
				}
			}
		}
	}
	else
	{
				
		return framework.Status.INVALID_DATE;
	}	
	if (firstAvailableDate != framework.widget.calendar.getSelectedDateObject(calendarId)) 
	{
		var calendarIdTextElement = document.getElementById(calendarId+"._text");
		if (framework.util.isUndefinedOrNull(calendarIdTextElement))
		{	
					
			return framework.Status.ELEMENT_DOES_NOT_EXIST;
		}
		calendarIdTextElement.value = framework.widget.calendar.setDateFormat(calendar._dateFormat, firstAvailableDate);
		var calendarIdDateElement = document.getElementById(calendarId+"._date");
		if (framework.util.isUndefinedOrNull(calendarIdDateElement))
		{	
					
			return framework.Status.ELEMENT_DOES_NOT_EXIST;
		}
		calendarIdDateElement.value = framework.widget.calendar.setDateFormat("%mm/%dd/%yyyy", firstAvailableDate);
		if (framework.util.isUndefinedOrNull(calendarIdDateElement.value))
		{
					
			return framework.Status.INVALID_ARGUMENT_VALUE;
		}
	}
	return framework.Status.SUCCESS;
},
resetSelectedDateObject:function(calendarId)
{
	if (!framework.util.isType(calendarId, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	if (framework.util.isEmpty(calendarId))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var calendar = document.getElementById(calendarId);
	if (framework.util.isUndefinedOrNull(calendar))
	{	
		
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	var calendarIdTexteElement = document.getElementById(calendarId+"._text");
	if (framework.util.isUndefinedOrNull(calendarIdTexteElement))
	{	
		
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	calendarIdTexteElement.value = "";
	var calendarIdDateElement = document.getElementById(calendarId+"._date");
	if (framework.util.isUndefinedOrNull(calendarIdDateElement))
	{	
		
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	calendarIdDateElement.value = "";
	return framework.Status.SUCCESS;
},
clearTime:function(dateObject)
{
	if (!framework.util.isType(dateObject, framework.DataType.DATE))
	{
		return null;
	}
	dateObject.setHours(0);
	dateObject.setMinutes(0);
	dateObject.setSeconds(0);
	dateObject.setMilliseconds(0);
	return dateObject;
},
beforeDate:function(dateObjectA, dateObjectB, clearTime, equals)
{
	if (!framework.util.isType(dateObjectA, framework.DataType.DATE) &&
		!framework.util.isType(dateObjectB, framework.DataType.DATE) &&
		!framework.util.isType(equals, framework.DataType.BOOLEAN) &&
		!framework.util.isType(clearTime, framework.DataType.BOOLEAN))
	{
		return null;
	}
	if (clearTime)
	{
		framework.widget.calendar.clearTime(dateObjectA);
		framework.widget.calendar.clearTime(dateObjectB);
	}
	if (equals)
	{
		return dateObjectA.getTime() <= dateObjectB;
	}
	else
	{
		return dateObjectA.getTime() < dateObjectB.getTime();
	}
	return null;
},
afterDate:function(dateObjectA, dateObjectB, clearTime, equals)
{
	if (!framework.util.isType(dateObjectA, framework.DataType.DATE) &&
		!framework.util.isType(dateObjectB, framework.DataType.DATE) &&
		!framework.util.isType(equals, framework.DataType.BOOLEAN) &&
		!framework.util.isType(clearTime, framework.DataType.BOOLEAN))
	{
		return null;
	}
	if (clearTime)
	{
		framework.widget.calendar.clearTime(dateObjectA);
		framework.widget.calendar.clearTime(dateObjectB);
	}
	if (equals)
	{
		return dateObjectA.getTime() >= dateObjectB;
	}
	else
	{
		return dateObjectA.getTime() > dateObjectB.getTime();
	}
	return null;
},
setLocalizedMonthNames:function(monthsNameString)
{
	if (!framework.util.isType(monthsNameString, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	var monthsNameArray = framework.widget.calendar._splitArray(monthsNameString);
	if (monthsNameArray.length != 12 && !framework.util.isEmpty(monthsNameArray))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	framework.widget.calendar._localizedMonthNames = monthsNameArray;
},
setLocalizedMonthNamesAbr:function(abreviatedmonthsNameString)
{
	if (!framework.util.isType(abreviatedmonthsNameString, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	var abreviatedmonthsNameArray = framework.widget.calendar._splitArray(abreviatedmonthsNameString);
	if (abreviatedmonthsNameArray.length != 12 && !framework.util.isEmpty(abreviatedmonthsNameArray))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	framework.widget.calendar._localizedMonthNamesAbr = abreviatedmonthsNameArray;
},
setLocalizedDayOfWeekNames:function(dayOfWeekNameString)
{
	if (!framework.util.isType(dayOfWeekNameString, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	var dayOfWeekNameArray = framework.widget.calendar._splitArray(dayOfWeekNameString);
	if (dayOfWeekNameArray.length != 7 && !framework.util.isEmpty(dayOfWeekNameArray))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	framework.widget.calendar._localizedDayOfWeekNames = dayOfWeekNameArray;
},
setLocalizedDayOfWeekNamesAbr:function(dayOfWeekNameAbbreviatedString)
{
	if (!framework.util.isType(dayOfWeekNameAbbreviatedString, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	var dayOfWeekNameAbbreviatedArray = framework.widget.calendar._splitArray(dayOfWeekNameAbbreviatedString);
	if (dayOfWeekNameAbbreviatedArray.length != 7 && !framework.util.isEmpty(dayOfWeekNameAbbreviatedArray))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	framework.widget.calendar._localizedDayOfWeekNamesAbr = dayOfWeekNameAbbreviatedArray;
},
setLocalizedAntePostMeridiem:function(antePostMeridiemNameString)
{
	if (!framework.util.isType(antePostMeridiemNameString, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	var antePostMeridiemNameArray = framework.widget.calendar._splitArray(antePostMeridiemNameString);
	if (antePostMeridiemNameArray.length != 2 && !framework.util.isEmpty(antePostMeridiemNameArray))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	framework.widget.calendar._localizedAntePostMeridiem = antePostMeridiemNameArray;
},
setLocalizedHourSuffix:function(hourSuffixString)
{
	if (!framework.util.isType(hourSuffixString, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	framework.widget.calendar._localizedHourSuffix = hourSuffixString;
},
setLocalizedMinuteSuffix:function(minuteSuffixString)
{
	if (!framework.util.isType(minuteSuffixString, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	framework.widget.calendar._localizedMinuteSuffix = minuteSuffixString;	
},
setMilitaryTime:function(militaryTimeFlag)
{
	if (!framework.util.isType(militaryTimeFlag, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	if (!framework.util.isEmpty(militaryTimeFlag) && militaryTimeFlag != "false" && militaryTimeFlag != "true")
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	framework.widget.calendar._MilitaryTime = new Boolean(militaryTimeFlag);
},
setLocalizedYearSuffix:function(yearSuffixString)
{
	if (!framework.util.isType(yearSuffixString, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	framework.widget.calendar._localizedYearSuffix = yearSuffixString;
},
setLocalizedDaySuffix:function(daySuffixString)
{
	if (!framework.util.isType(daySuffixString, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	framework.widget.calendar._localizedDaySuffix = daySuffixString;
},
setDateFormat:function(dateFormat, dateObject)
{
	if (!framework.util.isType(dateFormat, framework.DataType.STRING) ||
		!framework.util.isType(dateObject, framework.DataType.DATE))
	{
		
		return null;
	}
	if (framework.util.isEmpty(dateFormat, framework.DataType.STRING))
	{
		
		return null;
	}
	dateFormat = dateFormat.replace("%sm", framework.widget.calendar._localizedMonthNames[dateObject.getMonth()]);
	dateFormat = dateFormat.replace("%sn", framework.widget.calendar._localizedMonthNamesAbr[dateObject.getMonth()]);
	dateFormat = dateFormat.replace("%sy", framework.widget.calendar._localizedYearSuffix);
	dateFormat = dateFormat.replace("%sd", framework.widget.calendar._localizedDaySuffix);
	dateFormat = dateFormat.replace("%sw", framework.widget.calendar._localizedDayOfWeekNames[dateObject.getDay()]);
	dateFormat = dateFormat.replace("%so", framework.widget.calendar._localizedDayOfWeekNamesAbr[dateObject.getDay()]);
	var tempMeridien;
	if (dateObject.getHours() < 12)
	{
		tempMeridien = 0;
	}
	else 
	{
		tempMeridien = 1;
	}
	dateFormat = dateFormat.replace("%sa", framework.widget.calendar._localizedAntePostMeridiem[tempMeridien]);
	dateFormat = dateFormat.replace("%si", framework.widget.calendar._localizedMinuteSuffix);
	dateFormat = dateFormat.replace("%sh", framework.widget.calendar._localizedHourSuffix);
	var tempMinute;
	if (dateObject.getMinutes() < 10)
	{
		tempMinute = "0" + (dateObject.getMinutes());
	}
	else 
	{
		tempMinute = (dateObject.getMinutes());
	}
	dateFormat = dateFormat.replace("%ii", tempMinute);
	dateFormat = dateFormat.replace("%i", dateObject.getMinutes());
	var tempHours;
	if (framework.widget.calendar._MilitaryTime)
	{
		if (dateObject.getHours() < 10)
		{
			tempHours = "0" + (dateObject.getHours());
		}
		else 
		{
			tempHours = (dateObject.getHours());
		}
	}
	else
	{
		if (dateObject.getHours() === 0)
		{
			tempHours = 12;
		}
		if (dateObject.getHours() > 12)
		{
			tempHours = dateObject.getHours() - 12;
		}
		else
		{
			tempHours = dateObject.getHours();
		}
		if (dateObject.getHours() < 10)
		{
			tempHours = "0" + tempHours;
		}
		else 
		{
			tempHours = (dateObject.getHours());
		}
	}
	dateFormat = dateFormat.replace("%hh", tempHours);
	dateFormat = dateFormat.replace("%h", dateObject.getHours());
	var tempMonth;
	if (dateObject.getMonth() + 1 < 10)
	{
		tempMonth = "0" + (dateObject.getMonth() + 1);
	}
	else 
	{
		tempMonth = (dateObject.getMonth() + 1);
	}
	dateFormat = dateFormat.replace("%mm", tempMonth);
	dateFormat = dateFormat.replace("%m", dateObject.getMonth() + 1);
	var tempDate;
	if (dateObject.getDate() < 10)
	{
		tempDate = "0" + dateObject.getDate();
	}
	else 
	{
		tempDate = dateObject.getDate();
	}
	dateFormat = dateFormat.replace("%dd", tempDate);
	dateFormat = dateFormat.replace("%d", dateObject.getDate());
	dateFormat = dateFormat.replace("%yyyy", dateObject.getFullYear());
	dateFormat = dateFormat.replace("%yy", dateObject.getFullYear().toString().slice(2,4));	
	return dateFormat.toString();
},
isPopupWindowVisible:function(calendarId)
{
	if (framework.util.isUndefinedOrNull(calendarId))
	{
		
		return null;
	}
	if (!framework.util.isType(calendarId, framework.DataType.STRING))
	{
		
		return null;
	}
	var calendar = document.getElementById(calendarId);
	if (framework.util.isUndefinedOrNull(calendar))
	{
		
		return null;
	}
	return calendar._isPopupWindowVisible;
},
closePopupWindow:function(calendarId)
{
	var retVal = framework.widget.calendar._closePopupWindow(calendarId);
	if (retVal == framework.Status.SUCCESS)
	{
		var calendar = document.getElementById(calendarId);
		if (!framework.util.isUndefinedOrNull(calendar))
		{
			if (!framework.util.isUndefinedOrNull(calendar._afterCloseHandler))
			{
				calendar._afterCloseHandler(calendar._position, calendarId);
			}
		}
	}
	return retVal;
},
_closePopupWindow:function(calendarId)
{
	if (framework.util.isUndefinedOrNull(calendarId))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	if (!framework.util.isType(calendarId, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	var retVal = framework.widget.calendar.isPopupWindowVisible(calendarId);
	if (framework.util.isUndefinedOrNull(retVal))
	{
		
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	if (retVal === true)
	{
		var calendar = document.getElementById(calendarId);
		retVal = framework.util.showSelects(calendarId);
		if (retVal != framework.Status.SUCCESS)
		{
			return retVal;
		}
		framework.util.hideElement(calendarId + "._window");
		calendar._isPopupWindowVisible = false;
	}
	return framework.Status.SUCCESS;
},
_windowOnMouseOutEventHandler:function(event)
{
	var calendarId = framework.widget.calendar._sliceOutMainId(this.id);
	var calendar = document.getElementById(calendarId);
   	if (framework.util.mouseInsideElement(calendarId + "._window", event))
   	{
		calendar._insideWindow = true;
	}
	else
	{
		calendar._insideWindow = false;
		var textElement = document.getElementById(calendarId + "._text");
		if (!framework.util.isUndefinedOrNull(textElement))
		{
			calendar._blurred = false;
			textElement.blur();
		}
		if (calendar._blurred === false)
		{
			return framework.widget.calendar.closePopupWindow(calendarId);
		}
	}
	return framework.Status.SUCCESS;
},
_textOnBlurEventHandler:function(event)
{
    var calendarId = framework.widget.calendar._sliceOutMainId(this.id);
    var calendar = document.getElementById(calendarId);
    if (!calendar._insideWindow)
	{
		var retVal = framework.widget.calendar.closePopupWindow(calendarId);
		if (retVal != framework.Status.SUCCESS)
		{
			return retVal;
		}
	}
	calendar._blurred = true;
	return framework.Status.SUCCESS;
},
_iconOnClickEventHandler:function(event)
{
	event.stopPropagation();  
	var calendarId = framework.widget.calendar._sliceOutMainId(this.id);
	var textElement = document.getElementById(calendarId + "._text");
	if (!framework.util.isUndefinedOrNull(textElement))
	{
		textElement.focus();
	}
},
_textOnClickEventHandler:function(event)
{
	var calendarId = framework.widget.calendar._sliceOutMainId(this.id);
	var calendar = document.getElementById(calendarId);	
	framework.widget.calendar._showCalendar(calendarId);
	if (!framework.util.isUndefinedOrNull(calendar._beforeOpenHandler))
	{
		calendar._beforeOpenHandler(calendar._position, calendarId);
	}
	event.stopPropagation();  
},
_dateOnClickEventHandler:function(event)
{
	var eventTarget = framework.eventmodel.getEventTarget(event);
	if (!framework.util.isEmpty(eventTarget.innerHTML) && eventTarget.calendarDateEnabled === true)
	{
		var calendarId = framework.widget.calendar._sliceOutMainId(this.id);
		var calendar = document.getElementById(calendarId);
		var retVal = framework.widget.calendar._closePopupWindow(calendarId);
		if (retVal != framework.Status.SUCCESS)
		{
			return retVal;
		}
		var currentCalendarDateOnWidgetClone = framework.util.clone(calendar._currentCalendarDateOnWidget);
		currentCalendarDateOnWidgetClone.setDate(eventTarget.innerHTML);
		framework.widget.calendar.setSelectedDateObject(calendarId, currentCalendarDateOnWidgetClone);  
		if (!framework.util.isUndefinedOrNull(calendar._dateChangeHandler))
		{
			var dateChangeHandler = calendar._dateChangeHandler + "('" + calendarId +  "')";
			eval(dateChangeHandler);
		}
		if (!framework.util.isUndefinedOrNull(calendar._afterCloseHandler))
		{
			calendar._afterCloseHandler(calendar._position, calendarId);
		}
	}
	event.stopPropagation();  
	return framework.Status.SUCCESS;
},
_nextOnClickEventHandler:function(event)
{
	if (this.enabled === true)
	{
		var calendarId = framework.widget.calendar._sliceOutMainId(this.id);
		var calendar = document.getElementById(calendarId);
		var nextCalendarDate = framework.util.clone(calendar._currentCalendarDateOnWidget);
		nextCalendarDate.setMonth(nextCalendarDate.getMonth() + 1);  
		framework.util.showElement(calendarId + "._week6");
		framework.widget.calendar._showMonth(calendarId, nextCalendarDate.getMonth(), nextCalendarDate.getFullYear());
	}
	event.stopPropagation();
},
_previousOnClickEventHandler:function(event)
{
	if (this.enabled === true)
	{
		var calendarId = framework.widget.calendar._sliceOutMainId(this.id);
		var calendar = document.getElementById(calendarId);
		var previousCalendarDate = framework.util.clone(calendar._currentCalendarDateOnWidget);
		previousCalendarDate = new Date(previousCalendarDate.setMonth(previousCalendarDate.getMonth() - 1));  
		framework.util.showElement(calendarId + "._week6");
		framework.widget.calendar._showMonth(calendarId, previousCalendarDate.getMonth(), previousCalendarDate.getFullYear());
	}
	event.stopPropagation();
},
_nextYearOnClickEventHandler:function(event)
{
	if (this.enabled === true)
	{
		var calendarId = framework.widget.calendar._sliceOutMainId(this.id);
		var calendar = document.getElementById(calendarId);
		var nextCalendarDate = framework.util.clone(calendar._currentCalendarDateOnWidget);
		nextCalendarDate.setFullYear(nextCalendarDate.getFullYear() + 1);  
		framework.util.showElement(calendarId + "._week6");
		framework.widget.calendar._showMonth(calendarId, nextCalendarDate.getMonth(), nextCalendarDate.getFullYear());
	}
	event.stopPropagation();
},
_previousYearOnClickEventHandler:function(event)
{
	if (this.enabled === true)
	{
		var calendarId = framework.widget.calendar._sliceOutMainId(this.id);
		var calendar = document.getElementById(calendarId);
		var previousCalendarDate = framework.util.clone(calendar._currentCalendarDateOnWidget);
		previousCalendarDate.setFullYear(previousCalendarDate.getFullYear() - 1);  
		framework.util.showElement(calendarId + "._week6");
		framework.widget.calendar._showMonth(calendarId, previousCalendarDate.getMonth(), previousCalendarDate.getFullYear());
	}
	event.stopPropagation();
},
_dateOnMouseOverEventHandler:function(event)
{
	var eventTarget = framework.eventmodel.getEventTarget(event);
	if (!framework.util.isEmpty(eventTarget.innerHTML) && eventTarget.calendarDateEnabled === true)
	{
		framework.util.setClassName(eventTarget.id, "mouseOverDateStyle");
	}
},
_dateOnMouseOutEventHandler:function(event)
{
	var eventTarget = framework.eventmodel.getEventTarget(event);
	if (eventTarget.innerHTML !== "" && eventTarget.calendarDateEnabled === true)
	{
		var calendarId = framework.widget.calendar._sliceOutMainId(eventTarget.id);
		var calendar = document.getElementById(calendarId);
		var currentTargetDate = framework.util.clone(calendar._currentCalendarDateOnWidget);
		currentTargetDate.setDate(eventTarget.innerHTML);
		currentTargetDate = framework.widget.calendar.clearTime(currentTargetDate); 
		var selectedDateObject = framework.widget.calendar.getSelectedDateObject(calendarId);
		var selectedDate = null;
		if (!framework.util.isUndefinedOrNull(selectedDateObject))
		{
			selectedDate = framework.util.clone(selectedDateObject);
			selectedDate = framework.widget.calendar.clearTime(selectedDate); 
		}
		if (!framework.util.isUndefinedOrNull(selectedDate) && selectedDate.getTime() == currentTargetDate.getTime())
		{
			framework.util.setClassName(eventTarget.id, "selectedDateStyle");
		}
		else
		{
			framework.util.setClassName(eventTarget.id, "enabledDateStyle");
		}
	}
},
_validateAllowableDate:function(dateObject, calendarId)
{
	if (!framework.util.isType(dateObject, framework.DataType.DATE) || 
		!framework.util.isType(calendarId, framework.DataType.STRING))
	{
		
		return null;
	}
	if (framework.util.isEmpty(calendarId))
	{
		
		return null;
	}
	var calendar = document.getElementById(calendarId);
	if (framework.util.isUndefinedOrNull(calendar))
	{	
		
		return null;
	}
	if (calendar._range === false)
	{
		for (var index = 0; index < calendar._allowableDates.length; index += 1)
		{
			if ((calendar._allowableDates[index].getFullYear() == dateObject.getFullYear()) &&
				(calendar._allowableDates[index].getMonth() == dateObject.getMonth()) &&
				(calendar._allowableDates[index].getDate() == dateObject.getDate()))
			{
				return true;
			}
		}
	}
	else 
	{
		var startingDate = framework.util.clone(calendar._allowableDates[0]);
		var endDate = framework.util.clone(calendar._allowableDates[1]);
		if (framework.widget.calendar.beforeDate(startingDate, dateObject, true, true) &&
		    framework.widget.calendar.afterDate(endDate, dateObject, true, true))
		{
			return true;
		}
	}
	return false;
},
_sliceOutMainId:function(childId)
{
	if (!framework.util.isType(childId, framework.DataType.STRING))
	{
		
		return null;
	}
	if (framework.util.isEmpty(childId))
	{
		
		return null;
	}
	return childId.substring(0, childId.lastIndexOf("."));
},
_calculateAppropriateDay:function(dayOfTheWeek, startingDay)
{
	if (!framework.util.isType(dayOfTheWeek, framework.DataType.NUMBER) ||
		!framework.util.isType(startingDay, framework.DataType.NUMBER))
	{
		
		return null;
	}
	var appropriateDay = dayOfTheWeek + startingDay;
	if (appropriateDay < 0)
	{
		appropriateDay = appropriateDay + 7;
	}
	if (appropriateDay > 6)
	{
		appropriateDay = appropriateDay - 7;
	}
	return appropriateDay;
},
_showCalendar:function(calendarId)
{
	if (!framework.util.isType(calendarId, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	if (framework.util.isEmpty(calendarId))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var statusCode;
	var selectedDate = framework.widget.calendar.getSelectedDateObject(calendarId);
	var todaysDate = new Date();
	var calendar = document.getElementById(calendarId);
	if (framework.util.isUndefinedOrNull(calendar))
	{
		
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	if (framework.util.isUndefinedOrNull(selectedDate) && (framework.widget.calendar._validateAllowableDate(todaysDate, calendarId)))
	{
		selectedDate = todaysDate;
	}
	else if (framework.util.isUndefinedOrNull(selectedDate) && (!framework.widget.calendar._validateAllowableDate(todaysDate, calendarId)))
	{
		calendar._allowableDates.sort(framework.widget.calendar._sortDateArray);
		selectedDate = calendar._allowableDates[0];
	}
	statusCode = framework.util.showElement(calendarId + "._week6"); 
	if (statusCode != framework.Status.SUCCESS)
	{
		return statusCode;
	}
	statusCode = framework.widget.calendar._showMonth(calendarId, selectedDate.getMonth(), selectedDate.getFullYear());
	if (statusCode != framework.Status.SUCCESS)
	{
		return statusCode;
	}
	statusCode = framework.widget.calendar._calculatePosition(calendarId);
	if (statusCode != framework.Status.SUCCESS)
	{
		return statusCode;
	}
	statusCode = framework.util.showElement(calendarId + "._window"); 
	if (statusCode != framework.Status.SUCCESS)
	{
		return statusCode;
	}
	calendar._isPopupWindowVisible = true;
	return framework.Status.SUCCESS;
},
_sortDateArray:function(first, second)
{
	return first.getTime() - second.getTime();
},
_getCalendarAttributes:function(calendar)
{
	if (calendar.getAttribute("includeYearButtons") == "true")
	{
		calendar._showYearButtons = true;
	}
	else
	{
		calendar._showYearButtons = false;	
	}
	return framework.Status.SUCCESS;
},
_showMonth:function(calendarId, month, year)
{
	if (!framework.util.isType(calendarId, framework.DataType.STRING) ||
		!framework.util.isType(month, framework.DataType.NUMBER) ||
		!framework.util.isType(year, framework.DataType.NUMBER))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	if (framework.util.isEmpty(calendarId) ||
		!framework.util.isType(month, framework.DataType.FINITE) ||
		!framework.util.isType(year, framework.DataType.FINITE))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var currentCalendarDate = new Date();
	currentCalendarDate.setDate(1); 
	currentCalendarDate.setMonth(month);  
	currentCalendarDate.setFullYear(year);
	currentCalendarDate = framework.widget.calendar.clearTime(currentCalendarDate);
	if (framework.util.isUndefinedOrNull(currentCalendarDate))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var calendar = document.getElementById(calendarId);
	if (framework.util.isUndefinedOrNull(calendar))
	{
		
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	calendar._currentCalendarDateOnWidget = currentCalendarDate;
	var statusCode = framework.util.setInnerHTML(calendarId+ "._title", framework.widget.calendar.setDateFormat(calendar._headerTextFormat, currentCalendarDate));
	if (statusCode != framework.Status.SUCCESS)
	{
		return statusCode;
	}
	var lastDayForFebInLeapYear;
	if (((year % 4 === 0) && 
	     (year % 100 !== 0)) || 
    	 (year % 400 === 0)) 
	{
	     lastDayForFebInLeapYear = 29;
	}
	else
	{
		lastDayForFebInLeapYear = 28;
	}
	var lastDayinMonth = [31, lastDayForFebInLeapYear, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	var currentWeekDay = currentCalendarDate.getDay();
	currentWeekDay = currentWeekDay - calendar._startingDate;  
	if (currentWeekDay < 0)
	{
		currentWeekDay = currentWeekDay + 7;
	}
	if (currentWeekDay > 6)
	{
		currentWeekDay = currentWeekDay - 7;
	}
	var monthDayArray = 
	[document.getElementById(calendarId+"._week1day1"),document.getElementById(calendarId+"._week1day2"),document.getElementById(calendarId+"._week1day3"),document.getElementById(calendarId+"._week1day4"),document.getElementById(calendarId+"._week1day5"),document.getElementById(calendarId+"._week1day6"), document.getElementById(calendarId+"._week1day7"),
	document.getElementById(calendarId+"._week2day1"),document.getElementById(calendarId+"._week2day2"),document.getElementById(calendarId+"._week2day3"),document.getElementById(calendarId+"._week2day4"),document.getElementById(calendarId+"._week2day5"),document.getElementById(calendarId+"._week2day6"), document.getElementById(calendarId+"._week2day7"),
	document.getElementById(calendarId+"._week3day1"),document.getElementById(calendarId+"._week3day2"),document.getElementById(calendarId+"._week3day3"),document.getElementById(calendarId+"._week3day4"),document.getElementById(calendarId+"._week3day5"),document.getElementById(calendarId+"._week3day6"), document.getElementById(calendarId+"._week3day7"),
	document.getElementById(calendarId+"._week4day1"),document.getElementById(calendarId+"._week4day2"),document.getElementById(calendarId+"._week4day3"),document.getElementById(calendarId+"._week4day4"),document.getElementById(calendarId+"._week4day5"),document.getElementById(calendarId+"._week4day6"), document.getElementById(calendarId+"._week4day7"),
	document.getElementById(calendarId+"._week5day1"),document.getElementById(calendarId+"._week5day2"),document.getElementById(calendarId+"._week5day3"),document.getElementById(calendarId+"._week5day4"),document.getElementById(calendarId+"._week5day5"),document.getElementById(calendarId+"._week5day6"), document.getElementById(calendarId+"._week5day7"),
	document.getElementById(calendarId+"._week6day1"),document.getElementById(calendarId+"._week6day2"),document.getElementById(calendarId+"._week6day3"),document.getElementById(calendarId+"._week6day4"),document.getElementById(calendarId+"._week6day5"),document.getElementById(calendarId+"._week6day6"), document.getElementById(calendarId+"._week6day7")];
	var calendarPreviousMonthElement = document.getElementById(calendarId + "._previousMonth");	
	if (framework.util.isUndefinedOrNull(calendarPreviousMonthElement))
	{
		
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	var calendarNextMonthElement = document.getElementById(calendarId + "._nextMonth");
	if (framework.util.isUndefinedOrNull(calendarNextMonthElement))
	{
		
		return framework.Status.ELEMENT_DOES_NOT_EXIST;
	}
	if (calendar._showYearButtons)
	{
		var calendarPreviousYearElement = document.getElementById(calendarId + "._previousYear");	
		if (framework.util.isUndefinedOrNull(calendarPreviousYearElement))
		{
			
			return framework.Status.ELEMENT_DOES_NOT_EXIST;
		}
		var calendarNextYearElement = document.getElementById(calendarId + "._nextYear");
		if (framework.util.isUndefinedOrNull(calendarNextYearElement))
		{
			
			return framework.Status.ELEMENT_DOES_NOT_EXIST;
		}
	}
	statusCode = framework.util.setClassName((calendarId + "._previousMonth"), "calendarDisablePreviousMonthButton");	
	if (statusCode != framework.Status.SUCCESS)
	{
		return statusCode;
	}
	statusCode = framework.util.setClassName((calendarId + "._nextMonth"), "calendarDisableNextMonthButton");		
	if (statusCode != framework.Status.SUCCESS)
	{
		return statusCode;
	}
	if (calendar._showYearButtons)
	{
		statusCode = framework.util.setClassName((calendarId + "._previousYear"), "calendarDisablePreviousYearButton");	
		if (statusCode != framework.Status.SUCCESS)
		{
			return statusCode;
		}
		statusCode = framework.util.setClassName((calendarId + "._nextYear"), "calendarDisableNextYearButton");		
		if (statusCode != framework.Status.SUCCESS)
		{
			return statusCode;
		}
		calendarPreviousYearElement.enabled = false;
		calendarNextYearElement.enabled = false;
	}
	calendarPreviousMonthElement.enabled = false;
	calendarNextMonthElement.enabled = false;
	var allowabledates = [];
	if (calendar._range === false)
	{
		for (var index = 0; index < calendar._allowableDates.length; index += 1)
		{
			var iteratedAllowableDate = framework.widget.calendar.clearTime(calendar._allowableDates[index]);
			if (framework.util.isUndefinedOrNull(iteratedAllowableDate))
			{
				
				return framework.Status.INVALID_ARGUMENT_VALUE;
			}
			if (currentCalendarDate.getFullYear() == iteratedAllowableDate.getFullYear() &&
				currentCalendarDate.getMonth() == iteratedAllowableDate.getMonth())
			{
				allowabledates.push(calendar._allowableDates[index].getDate());
			}	
			else
			{
				if (currentCalendarDate.getTime() > iteratedAllowableDate.getTime())
				{
					calendarPreviousMonthElement.enabled = true;
					statusCode = framework.util.setClassName((calendarId + "._previousMonth"), "calendarEnablePreviousMonthButton");
					if (statusCode != framework.Status.SUCCESS)
					{
						return statusCode;
					}
				}
				if (currentCalendarDate.getTime() < iteratedAllowableDate.getTime())
				{
					calendarNextMonthElement.enabled = true;
					statusCode = framework.util.setClassName((calendarId + "._nextMonth"), "calendarEnableNextMonthButton");
					if (statusCode != framework.Status.SUCCESS)
					{
						return statusCode;
					}
				}
				if (calendar._showYearButtons)
				{
					if (currentCalendarDate.getFullYear() > iteratedAllowableDate.getFullYear())
					{
						calendarPreviousYearElement.enabled = true;
						statusCode = framework.util.setClassName((calendarId + "._previousYear"), "calendarEnablePreviousYearButton");
						if (statusCode != framework.Status.SUCCESS)
						{
							return statusCode;
						}
					}
					if (currentCalendarDate.getFullYear() < iteratedAllowableDate.getFullYear())
					{
						calendarNextYearElement.enabled = true;
						statusCode = framework.util.setClassName((calendarId + "._nextYear"), "calendarEnableNextYearButton");
						if (statusCode != framework.Status.SUCCESS)
						{
							return statusCode;
						}
					}
				}
			}
		}	
	}
	else 
	{
		var dateToStart = 1;
		var dateToEnd = 31;	
		if (currentCalendarDate.getFullYear() == calendar._allowableDates[0].getFullYear() &&
			currentCalendarDate.getMonth() == calendar._allowableDates[0].getMonth())	
		{
			dateToStart = calendar._allowableDates[0].getDate();
		}
		if (currentCalendarDate.getFullYear() == calendar._allowableDates[1].getFullYear() &&
				currentCalendarDate.getMonth() == calendar._allowableDates[1].getMonth())
		{
			dateToEnd = calendar._allowableDates[1].getDate();
		}
		var lastEndDate = lastDayinMonth[currentCalendarDate.getMonth()] < dateToEnd ? lastDayinMonth[currentCalendarDate.getMonth()] : dateToEnd;
		for (var allowedDates = dateToStart; allowedDates <= lastEndDate; allowedDates += 1)
		{
			allowabledates.push(allowedDates);
		}
		var prevLastMonthDate = framework.util.clone(currentCalendarDate);
		prevLastMonthDate.setDate(1);
		prevLastMonthDate.setDate(prevLastMonthDate.getDate() - 1);
		var nextFirstMonthDate = framework.util.clone(currentCalendarDate);
		nextFirstMonthDate.setDate(lastDayinMonth[nextFirstMonthDate.getMonth()]);
		nextFirstMonthDate.setDate(nextFirstMonthDate.getDate() + 1);
		if (framework.widget.calendar.beforeDate(calendar._allowableDates[0], prevLastMonthDate, true, true))
		{
			calendarPreviousMonthElement.enabled = true;
			statusCode = framework.util.setClassName((calendarId + "._previousMonth"), "calendarEnablePreviousMonthButton");
			if (statusCode != framework.Status.SUCCESS)
			{
				return statusCode;
			}
		}
		if (framework.widget.calendar.beforeDate(nextFirstMonthDate, calendar._allowableDates[1], true, true))
		{
			calendarNextMonthElement.enabled = true;
			statusCode = framework.util.setClassName((calendarId + "._nextMonth"), "calendarEnableNextMonthButton");
			if (statusCode != framework.Status.SUCCESS)
			{
				return statusCode;
			}
		}
		if (calendar._showYearButtons)
		{
			var prevLastYearDate = framework.util.clone(currentCalendarDate);
			prevLastYearDate.setDate(1);  
			prevLastYearDate.setFullYear(prevLastYearDate.getFullYear() - 1);
			if (prevLastYearDate.getFullYear() == calendar._allowableDates[0].getFullYear() &&
				prevLastYearDate.getMonth() == calendar._allowableDates[0].getMonth())	
			{
				prevLastYearDate.setDate(calendar._allowableDates[0].getDate());
			}
			if (framework.widget.calendar.beforeDate(calendar._allowableDates[0], prevLastYearDate, true, true))
			{
				calendarPreviousYearElement.enabled = true;
				statusCode = framework.util.setClassName((calendarId + "._previousYear"), "calendarEnablePreviousYearButton");
				if (statusCode != framework.Status.SUCCESS)
				{
					return statusCode;
				}
			}
			var nextLastYearDate = framework.util.clone(currentCalendarDate);
			nextLastYearDate.setDate(1);
			nextLastYearDate.setFullYear(nextLastYearDate.getFullYear() + 1);
			if (framework.widget.calendar.beforeDate(nextLastYearDate, calendar._allowableDates[1], true, true))
			{
				calendarNextYearElement.enabled = true;
				statusCode = framework.util.setClassName((calendarId + "._nextYear"), "calendarEnableNextYearButton");
				if (statusCode != framework.Status.SUCCESS)
				{
					return statusCode;
				}
			}
		}
	}
	var day = 1;  
	for (index = 0; index < currentWeekDay; index += 1) 
	{
		statusCode = framework.util.setInnerHTML(monthDayArray[index].id, " ");
		if (statusCode != framework.Status.SUCCESS)
		{
			return statusCode;
		}
		monthDayArray[index].calendarDateEnabled = false;
		statusCode = framework.util.setClassName(monthDayArray[index].id, "disabledDateStyle");
		if (statusCode != framework.Status.SUCCESS)
		{
			return statusCode;
		}
	}
	for (var startDate = currentWeekDay; startDate < (lastDayinMonth[month] + currentWeekDay); startDate += 1)
	{
		statusCode = framework.util.setInnerHTML(monthDayArray[startDate].id, day.toString());
		if (statusCode != framework.Status.SUCCESS)
		{
			return statusCode;
		}
		var searchAllowableDatesString = "," + allowabledates.toString() + ",";
		if (searchAllowableDatesString.indexOf(","+day+",") > -1)
		{
			statusCode = framework.util.setClassName(monthDayArray[startDate].id, "enabledDateStyle");
			if (statusCode != framework.Status.SUCCESS)
			{
				return statusCode;
			}
			monthDayArray[startDate].calendarDateEnabled = true;
		}
		else 
		{
			statusCode = framework.util.setClassName(monthDayArray[startDate].id, "disabledDateStyle");
			if (statusCode != framework.Status.SUCCESS)
			{
				return statusCode;
			}
			monthDayArray[startDate].calendarDateEnabled = false;
		}
		var selected = framework.widget.calendar.getSelectedDateObject(calendarId);
		if ((!framework.util.isUndefinedOrNull(selected)) && (selected.getFullYear() == year) && (selected.getMonth() == month) && (selected.getDate() == day))
		{
			if (searchAllowableDatesString.indexOf(selected.getDate()+",") > -1 )
			{
				monthDayArray[startDate].calendarDateEnabled = true;
				statusCode = framework.util.setClassName(monthDayArray[startDate].id, "selectedDateStyle");
				if (statusCode != framework.Status.SUCCESS)
				{
					return statusCode;
				}
			}
			else
			{
			}
		}
		day += 1;
	}
	for (var postindex = lastDayinMonth[month] + currentWeekDay; postindex < 42; postindex += 1)
	{
		statusCode = framework.util.setInnerHTML(monthDayArray[postindex].id, "");
		if (statusCode != framework.Status.SUCCESS)
		{
			return statusCode;
		}
		monthDayArray[postindex].calendarDateEnabled = false;
		statusCode = framework.util.setClassName(monthDayArray[postindex].id, "disabledDateStyle");
		if (statusCode != framework.Status.SUCCESS)
		{
			return statusCode;
		}
	}
	if ((42 - (lastDayinMonth[month] + currentWeekDay)) >= 7) 
	{
		statusCode = framework.util.hideElement(calendarId + "._week6");
		if (statusCode != framework.Status.SUCCESS)
		{
			return statusCode;
		}
	}
	return framework.Status.SUCCESS;
},
_splitArray:function(stringArray)
{
	if (!framework.util.isType(stringArray, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	if (framework.util.isEmpty(stringArray))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var allowedCommaArray = framework.widget.calendar._allowedComma;
	var delimiter = ",";
	for (var index = 0; index < allowedCommaArray.length; index += 1)
	{
		if (stringArray.indexOf(allowedCommaArray[index]) > -1)
		{
			delimiter = allowedCommaArray[index];
			break;
		}
	}
	return stringArray.split(delimiter);
},
_calculatePosition:function(calendarId)
{
	if (!framework.util.isType(calendarId, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	if (framework.util.isEmpty(calendarId))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var calendar = document.getElementById(calendarId);
	var calendarIdWindowElement = document.getElementById(calendarId + "._window");
	var calendarIdTextElement = document.getElementById(calendarId + "._text");
	var textboxPositionArray = framework.util.getElementPosition(calendarId+"._text");
	if (framework.util.isUndefinedOrNull(textboxPositionArray))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var calendarIdWindowElementTop = textboxPositionArray[1];
	var calendarIdWindowElementLeft = textboxPositionArray[0];
	var calendarIdBottomPositionTop = calendarIdWindowElementTop + calendarIdTextElement.offsetHeight + framework.WidgetConstants.CALENDAR_MAX_HEIGHT;
	var browserViewPort; 
	if (framework.util.isUndefinedOrNull(window.pageYOffset))
	{
		browserViewPort = document.documentElement.scrollTop + document.documentElement.clientHeight;
	}
	else
	{
		browserViewPort = window.pageYOffset + self.innerHeight;
	}
	var position;
	if (calendarIdBottomPositionTop < browserViewPort)
	{
		calendarIdWindowElementTop = calendarIdWindowElementTop + calendarIdTextElement.offsetHeight;
		position = framework.WidgetConstants.POSITION_BELOW;
		calendar._position = framework.WidgetConstants.POSITION_BELOW;
	}
	else
	{
		calendarIdWindowElementTop = textboxPositionArray[1] - framework.WidgetConstants.CALENDAR_MAX_HEIGHT;
		position = framework.WidgetConstants.POSITION_ABOVE;
		calendar._position = framework.WidgetConstants.POSITION_ABOVE;
	}
	calendarIdWindowElement.style.top = calendarIdWindowElementTop + "px";
	calendarIdWindowElement.style.left = calendarIdWindowElementLeft + "px";
	if (framework.util.isInternetExplorer() && !framework.util.isIE7())
	{
		statusCode = framework.widget.calendar._hideDropDowns(calendarId, position);
		if (statusCode != framework.Status.SUCCESS)
		{
			return statusCode;
		}
	}
	return framework.Status.SUCCESS;
},
_hideDropDowns:function(calendarId, position)
{
	if (!framework.util.isType(calendarId, framework.DataType.STRING))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	if (framework.util.isEmpty(calendarId))
	{
		
		return framework.Status.INVALID_ARGUMENT_VALUE;
	}
	var calendarIdWindowElement = document.getElementById(calendarId + "._window");
	var topRange = parseInt(calendarIdWindowElement.style.top);
	if (framework.util.isType(topRange, framework.DataType.NAN))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	var bottomRange = 0;
	if (position == framework.WidgetConstants.POSITION_ABOVE)
	{
		var textboxPositionArray = framework.util.getElementPosition(calendarId+"._text");
		bottomRange = textboxPositionArray[1]; 
	}
	else
	{
		bottomRange = topRange + framework.WidgetConstants.CALENDAR_MAX_HEIGHT;	
	}
	var leftRange = parseInt(calendarIdWindowElement.style.left);
	if (framework.util.isType(leftRange, framework.DataType.NAN))
	{
		
		return framework.Status.UNDEFINED_ARGUMENT;
	}
	var rect = [
		topRange,
		leftRange + framework.WidgetConstants.CALENDAR_MAX_WIDTH,
		bottomRange,
		leftRange
	];
	return framework.util.hideSelects(calendarId, rect);
},
_buildDIVs:function(element)
{
	var divs = new Array(),
		idPrefix = element.id,
		divId = "",
		divId2 = "",
		i = 0,
		j = 0;
	divs.push('<div id="' + idPrefix + '._window" class="calendarWindow">');
	divs.push('<div id="' + idPrefix + '._header" class="calendarHeader">');
	if (element._showYearButtons === true)
	{
		divs.push('<div id="' + idPrefix + '._previousYear" class="calendarDisablePreviousYearButton"></div>');
		divs.push('<div id="' + idPrefix + '._previousMonth" class="calendarDisablePreviousMonthButton"></div>');
		divs.push('<div id="' + idPrefix + '._title" class="calendarTitleWithYearButtons"></div>');
		divs.push('<div id="' + idPrefix + '._nextMonth" class="calendarDisableNextMonthButton"></div>');
		divs.push('<div id="' + idPrefix + '._nextYear" class="calendarDisableNextYearButton"></div>');
	}
	else
	{
		divs.push('<div id="' + idPrefix + '._previousMonth" class="calendarDisablePreviousMonthButton"></div>');
		divs.push('<div id="' + idPrefix + '._title" class="calendarTitle"></div>');
		divs.push('<div id="' + idPrefix + '._nextMonth" class="calendarDisableNextMonthButton"></div>');
	}
	divs.push('</div>');
	divId = '<div id="' + idPrefix + '._daysoftheweek';
	divs.push(divId + '" class="calendarDaysOfTheWeek">');
	for (i = 1; i <= 7; i += 1)
	{
		divs.push(divId + i + '" class="calendarWeekDay"></div>');
	}
	divs.push('</div>');
	divs.push('<div id="' + idPrefix + '._body" class="calendarBody">');
	divId = '<div id="' + idPrefix + '._week';
	for (i = 1; i <= 6; i += 1)
	{
		divs.push(divId + i + '" class="calendarWeek">');
		divId2 = divId + i + 'day';
		for (j = 1; j <= 7; j += 1)
		{
			divs.push(divId2 + j + '" class="enabledDateStyle"></div>');
		}
		divs.push('</div>');
	}
	divs.push('</div></div>');
	element.innerHTML += divs.join("");
},
_localizedMonthNames:[],
_localizedDaySuffix:"",
_localizedYearSuffix:"",
_localizedMinuteSuffix:"",
_MilitaryTime:false,
_localizedMonthNamesAbr:[],
_localizedDayOfWeekNames:[],
_localizedDayOfWeekNamesAbr:[],
_localizedAntePostMeridiem:[],
_localizedHourSuffix:"",
_allowedComma:['\u002c', '\uff0c', '\u060c', '\u201a', '\u3001'],
loaded:true
};//Version 3.4
