function Calendar(intFirstDayOfWeek, strDateStr, onSelected, onClose, strDateFormat,Separator,oCalendarTemplate,oDateCellTemplate,arrSpecialDate,oDayEventParamObject,arrWeekDayForEvents,intNoOfDays,strAfterDateClick,blnChangeFirstDayForFlatDisplay)
{
	// member variables
	this.strActiveDiv = null;
	this.currentDateEl = null;
	this.getDateStatus = null;
	this.timeout = null;
	this.onSelected = onSelected || null;
	this.onClose = onClose || null;
	this.blnIsDragging = false;
	this.blnIsHidden = false;
	this.intMinYear = 1970;
	this.strActiveDiv = null;
	this.currentDateEl = null;
	this.getDateStatus = null;
	this.strTimeOut = null;
	this.onSelected = onSelected || null;
	this.onClose = onClose || null;
	this.blnIsDragging = false;
	this.blnIsHidden = false;
	this.intMinYear = 1970;
	this.intMaxYear = 2050;
	this.strDateFormat = Calendar._TT["DEF_DATE_FORMAT"];
	this.strTimeDateFormat = Calendar._TT["TT_DATE_FORMAT"];
	this.blnIsPopUp = true;
	this.blnDisplayWeekNumbers = true;
	this.intFirstDayOfWeek = intFirstDayOfWeek; // 0 for Sunday, 1 for Monday, etc.
	this.blnShowsOtherMonths = false;
	this.strDateStr = strDateStr;
	this.oArrOfDays = null;
	this.blnShowTime = true;
	this.blnIsTime24 = true;
	this.intYearStep = 2;
	//$$ added by meghna
	this.strAfterDateClick = strAfterDateClick;
	this.oCalendarTemplate = oCalendarTemplate;
	this.oDateCellTemplate = oDateCellTemplate;
	this.arrSpecialDate = arrSpecialDate;
	this.oDayEventParamObject = oDayEventParamObject;
	this.arrWeekDayForEvents = arrWeekDayForEvents;
	this.intNoOfDays = intNoOfDays;
	this.blnChangeFirstDayForFlatDisplay = blnChangeFirstDayForFlatDisplay;

	var tdWkDay1 = null;
	var tdWkDay2 = null;
	var tdWkDay3 = null;
	var tdWkDay4 = null;
	var tdWkDay5 = null;
	var tdWkDay6 = null;
	var tdWkDay7 = null;
	var tdCalendarHelp		= null;
	var tdCalendarCurrMonth = null;
	var tdCalendarCurrYear  = null;
	var tdCalendarClose		= null;
	var tdCalendarPrevYear	= null;
	var tdCalendarPrevMonth	= null;
	var tdCalendarNextMonth	= null;
	var tdCalendarNextYear	= null;
	var tdCalendarToday = null;
	//var oBackingIFrame = null;
	
	
	// HTML elements
	this.table = null;
	this.element = null;
	this.tbody = null;
	this.firstdayname = null;
	// Combo boxes
	this.oCboOfMonths = null;
	this.oCboOfYears = null;
	this.strHilitedMonth = null;
	this.strActiveMonth = null;
	this.strHilitedYear = null;
	this.strActiveYear = null;
	// Information
	this.blnIsDateClicked = true;
	
	this.fnAddEvent=Calendar_fnAddEvent;
	this.fnFindMonth=Calendar_fnFindMonth;
	this.fnFindYear=Calendar_fnFindYear;
	this.fnShowMonthsCombo=Calendar_fnShowMonthsCombo;
	this.fnShowYearsCombo=Calendar_fnShowYearsCombo; 
	this.fnTableMouseUp=Calendar_fnTableMouseUp;  
	this.fnTableMouseOver=Calendar_fnTableMouseOver; 
	this.fnTableMouseDown=Calendar_fnTableMouseDown;
	this.fnCalDragIt=Calendar_fnCalDragIt; 
	this.fnCalDragEnd =Calendar_fnCalDragEnd; 

	this.fnDayMouseDown =Calendar_fnDayMouseDown;	 
	this.fnDayMouseDblClick =Calendar_fnDayMouseDblClick;
	this.fnDayMouseOver=Calendar_fnDayMouseOver; 
	this.fnDayMouseOut=Calendar_fnDayMouseOut;
	this.fnCellClick =Calendar_fnCellClick; 
	
	this.fnCreate =Calendar_fnCreate; 
	this.fnKeyEvent=Calendar_fnKeyEvent;
	this.fnInit=Calendar_fnInit; 
	this.fnSetDate =Calendar_fnSetDate;
	this.fnRefresh =Calendar_fnRefresh; 
	this.fnSetFirstDayOfWeek =Calendar_fnSetFirstDayOfWeek;
	this.fnSetDateStatusHandler =Calendar_fnSetDateStatusHandler;
	this.fnSetDisabledHandler=Calendar_fnSetDisabledHandler;
	this.fnSetRange=Calendar_fnSetRange;
	this.fnCallHandler =Calendar_fnCallHandler;
	//////////
	this.fnCallCloseHandler =Calendar_fnCallCloseHandler;
	this.fnDestroy=Calendar_fnDestroy;
	this.fnReparent=Calendar_fnReparent;
	this.fnCheckCalendar=Calendar_fnCheckCalendar;
	this.fnShow=Calendar_fnShow ;
	this.fnHide =Calendar_fnHide ;
	this.fnShowAt =Calendar_fnShowAt ;
	this.fnShowAtElement =Calendar_fnShowAtElement;
	this.fnSetDateFormat =Calendar_fnSetDateFormat;
	this.fnSetTtDateFormat =Calendar_fnSetTtDateFormat;
	this.fnParseDate=Calendar_fnParseDate;
	this.fnHideShowCovered =Calendar_fnHideShowCovered;
	this.fnDisplayWeekdays =Calendar_fnDisplayWeekdays;
	this.fnHideCombos=Calendar_fnHideCombos ;
	this.fnDragStart =Calendar_fnDragStart;
	this.fnAddToolTips = Calendar_fnAddToolTips;
	//this.validateDateTxBx=Calendar_validateDateTxBx;
	//this.fnCheckDate=Calendar_fnCheckDate;
	
	//$$Added by Meghna
	this.SelectNavType = Calendar_SelectNavType;
	this.fnMakeBodyTemplate = Calendar_fnMakeBodyTemplate;
	
	
	
	// one-time initializations
	if (typeof Calendar._SDN == "undefined") 
	{
		// table of short day names
		if (typeof Calendar._SDN_len == "undefined")
			Calendar._SDN_len = 3;
		var oArrOfDaysAndMonths =oJSFW.fnObjectInitializer('Array','',[]);
		for (var intDayCtr = 8; intDayCtr > 0;) 
		{
			oArrOfDaysAndMonths[--intDayCtr] = Calendar._DN[intDayCtr].substr(0, Calendar._SDN_len);
		}
		Calendar._SDN = oArrOfDaysAndMonths;
		// table of short strMonth names
		if (typeof Calendar._SMN_len == "undefined")
			Calendar._SMN_len = 3;
		oArrOfDaysAndMonths =oJSFW.fnObjectInitializer('Array','',[]);
		for (var intMonthCtr = 12; intMonthCtr > 0;) 
		{
			oArrOfDaysAndMonths[--intMonthCtr] = Calendar._MN[intMonthCtr].substr(0, Calendar._SMN_len);
		}
		Calendar._SMN = oArrOfDaysAndMonths;
	}
 /* ------------------------------------------------------------------
 *
 * The DHTML Calendar, version 0.9.6 "Keep cool but don't freeze"
 *
 * Details and latest version at:
 * http://dynarch.com/mishoo/calendar.epl
 *
 * This script is distributed under the GNU Lesser General Public License.
 * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
 */

// $Id: calendar.js,v 1.34 2004/02/06 18:53:11 mishoo Exp $

/** The Calendar object constructor. */


	// member variables
	
	

//Added by Kavita starts
enumDateFormat = {	
								// '/' is a default seperator, if user has given seperator then that would be replaced with this.
	ddmmyy      :  '%d/%m/%y',    ///-- 02/01/06
	ddmmyyyy    :  '%d/%m/%Y',    ///-- 02/01/2006
	ddmmmyy     :  '%d/%b/%y',    ///-- 02/Jan/06
	ddmmmyyyy   :  '%d/%b/%Y',    ///-- 02/Jan/2006
	ddmmmmyy    :  '%d/%B/%y',    ///-- 02/January/06
	ddmmmmyyyy  :  '%d/%B/%Y',    ///-- 02/January/2006
	mmddyy      :  '%m/%d/%y',    ///-- 01/02/06
	mmddyyyy    :  '%m/%d/%Y',    ///-- 01/02/2006
	mmmddyy     :  '%b/%d/%y',    ///-- Jan/02/06
	mmmddyyyy   :  '%b/%d/%Y',    ///-- Jan/02/2006
	mmmmddyy    :  '%B/%d/%y',    ///-- January/02/06
	mmmmddyyyy  :  '%B/%d/%Y'     ///-- January/02/2006
						};
//Added by Kavita ends

// ** constants

/// "static", needed for event handlers.
Calendar._C = null;

/// detect a special case of "web browser"
Calendar.is_ie = ( /msie/i.test(navigator.userAgent) &&
		   !/opera/i.test(navigator.userAgent) );

Calendar.is_ie5 = ( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) );

/// detect Opera browser
Calendar.is_opera = /opera/i.test(navigator.userAgent);

/// detect KHTML-based browsers
Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);


// BEGIN: CALENDAR STATIC FUNCTIONS
/// <memberMethod name="fnAddEvent">
///	<param name=oElement>The element to which the event is going to be added</param>
/// <summary>adds a set of events to make some element behave like a button..</summary>
/// </memberMethod>

function Calendar_fnAddEvent(oElement) 
{
	with (Calendar) 
	{
		addEvent(oElement, "mouseover", Calendar_fnDayMouseOver);
		addEvent(oElement, "mousedown", Calendar_fnDayMouseDown);
		addEvent(oElement, "mouseout", Calendar_fnDayMouseOut);
		//if (is_ie) 
		//{
		    /* Change by Abhishek on 17/11/08 to close calender after change the date in one click. */
			//addEvent(oElement, "dblclick", Calendar_fnDayMouseDblClick);
			addEvent(oElement, "click", Calendar_fnDayMouseDblClick);
			oElement.setAttribute("unselectable", true);
		//}
	}
}
/// <memberMethod name="fnFindMonth">
///	<param name=oElement>The element from which the month of date will be taken</param>
/// <summary>It will find a month from the given date into any element.</summary>
/// </memberMethod>

//Fires on onclick of every element ( td) but returns parent node in case Some month is selected
// from Month combo
function Calendar_fnFindMonth(oElement) 
{
	//alert(oElement.innerHTML);
	if (oJSFW.fnGetAttribute(oElement,"strMonth") != null) 
	{
		return oElement;
	} 
	else if (oJSFW.fnGetAttribute(oElement.parentNode,"strMonth") != null) 
	{
		//alert(oElement.parentNode);
		return oElement.parentNode;
	}
	return null;
}
/// <memberMethod name="fnFindYear">
///	<param name=oElement>The element from which the year of date will be taken</param>
/// <summary>It will find a year from the given date into any element..</summary>
/// </memberMethod>

function Calendar_fnFindYear(oElement) 
{
	if (typeof oElement.year != "undefined") 
	{
		return oElement;
	} 
	else if (typeof oElement.parentNode.year != "undefined") 
	{
		return oElement.parentNode;
	}
	return null;
}
/// <memberMethod name="fnShowMonthsCombo">
/// <summary>It will be used to show the Combo of the month through which user can select the month</summary>
/// </memberMethod>

function Calendar_fnShowMonthsCombo() 
{
    //alert('In Calendar_fnShowMonthsCombo');
	if(oJSFW.objBrowserInfo.IsIE)
		var cal = Calendar._C;
	else
		var cal = window.calendar;
	var oDateCellTemplate = window.calendar.oDateCellTemplate;
	if (!cal) 
	{
		return false;
	}
	var cal = cal;
	var strCalanderDiv = cal.strActiveDiv.parentNode;
	var strMonthCombo = cal.oCboOfMonths;
	//alert(strMonthcombo);
	if (cal.strHilitedMonth) 
	{
		Calendar.removeClass(cal.strHilitedMonth, oDateCellTemplate.strMouseHoverDateClass);
	}
	if (cal.strActiveMonth) 
	{
		Calendar.removeClass(cal.strActiveMonth, oDateCellTemplate.strDateOverClass);
	}
	
	var strMonth = cal.oCboOfMonths.getElementsByTagName("div")[cal.date.getMonth()];
	Calendar.addClass(strMonth, oDateCellTemplate.strDateOverClass);
	cal.strActiveMonth = strMonth;
	var strComboStyle = strMonthCombo.style;
	oJSFW.fnSetDisplayStyle(strMonthCombo,true);
	//strComboStyle.display = "block";
	if (strCalanderDiv.navtype < 0)
		strComboStyle.left = strCalanderDiv.offsetLeft + "px";
	else 
	{
		var intMonthComboWidth = strMonthCombo.offsetWidth;
		if (typeof intMonthComboWidth == "undefined")
		{
			// Konqueror brain-dead techniques
			intMonthComboWidth = 50;
		}
		strComboStyle.left = (strCalanderDiv.offsetLeft + strCalanderDiv.offsetWidth - intMonthComboWidth) + "px";
	}
	strComboStyle.top = (strCalanderDiv.offsetTop + strCalanderDiv.offsetHeight) + "px";
}
/// <memberMethod name="fnShowYearsCombo">
/// <param name=blnForward>It will indicate whether the year is next to the current year or previous to the given year</param name>
/// <summary>It will be used to show the Combo of the year through which user can select the year</summary>
/// </memberMethod>

function Calendar_fnShowYearsCombo(blnForward) 
{
	blnForward = blnParam;
	//**//alert(blnForward);
	var cal = null;
	if(oJSFW.objBrowserInfo.IsIE)
	    cal = Calendar._C;
	else
	    cal = window.calendar;
	var oDateCellTemplate = window.calendar.oDateCellTemplate;
	if (!cal) 
	{
		return false;
	}
	//var cal = cal;
	
	var strCalanderDiv = cal.strActiveDiv.parentNode;
	var strYearsCombo = cal.oCboOfYears;
	if (cal.strHilitedYear) 
	{
		Calendar.removeClass(cal.strHilitedYear, oDateCellTemplate.strMouseHoverDateClass);
	}
	if (cal.strActiveYear) 
	{
		Calendar.removeClass(cal.strActiveYear, oDateCellTemplate.strDateOverClass);
	}
	cal.strActiveYear = null;
	var year = cal.date.getFullYear() + (blnForward ? 1 : -1);
	var oYearsDiv = strYearsCombo.firstChild;
	var blnIsShow = false;
	var oTempYearsDiv = null;
	
	for (var i = 12; i > 0; --i) 
	{
		if (year >= cal.intMinYear && year <= cal.intMaxYear) 
		{
			oYearsDiv.firstChild.data = year;
			oYearsDiv.year = year;
			oYearsDiv.style.display = "";
			blnIsShow = true;
		} 
		else 
		{
			oYearsDiv.style.display = "none";
		}
		
		oTempYearsDiv = oYearsDiv.nextSibling;
		if(oTempYearsDiv  == null)
		   oTempYearsDiv = oYearsDiv.nextSibling;
		oYearsDiv = oTempYearsDiv ;    
		year += blnForward ? cal.intYearStep : -cal.intYearStep;
	}
	if (blnIsShow) 
	{
		var strComboStyle = strYearsCombo.style;
		strComboStyle.display = "";
		if (strCalanderDiv.navtype < 0)
			strComboStyle.left = strCalanderDiv.offsetLeft + 160 + "px";
		else 
		{
			var intComboWidth = strYearsCombo.offsetWidth;
			if (typeof intComboWidth == "undefined")
			{
				// Konqueror brain-dead techniques
				intComboWidth = 50;
			}
			strComboStyle.left = (strCalanderDiv.offsetLeft+ 160 + strCalanderDiv.offsetWidth - intComboWidth) + "px";
		}
		strComboStyle.top = (strCalanderDiv.offsetTop + strCalanderDiv.offsetHeight) + "px";
	}
}


/// event handlers
/// <memberMethod name="fnTableMouseUp">
///	<param name=oEvent>It will accept the Event name</param>
/// <summary>It will be called at mouse up event and also if user clicks on any cell it will call cellClick event</summary>
/// </memberMethod>


function Calendar_fnTableMouseUp(oEvent) 
{
	//alert('fnTableMouseUp');
	if(window.calendar!=null)
	    var oDateCellTemplate = window.calendar.oDateCellTemplate;
	var cal = Calendar._C;
	if (!cal) 
	{
		return false;
	}
	if (cal.strTimeOut) 
	{
		///--It will clear the time out which has been set
		clearTimeout(cal.strTimeOut);
	}
	var oElement = cal.strActiveDiv;
	if (!oElement) 
	{
		return false;
	}
	var oTargetElement = Calendar.getTargetElement(oEvent);
	oEvent || (oEvent = window.event);
	Calendar.removeClass(oElement, oDateCellTemplate.strDateOverClass);
	if (oTargetElement == oElement || oTargetElement.parentNode == oElement) 
	{
		Calendar_fnCellClick(oElement, oEvent,true,true);
	}

	var strMonth = Calendar_fnFindMonth(oTargetElement);
		
	var date = null;
	if (strMonth) 
	{
		date = new Date(cal.date);
		if (oJSFW.fnGetAttribute(strMonth,"strMonth") != date.getMonth()) 
		{
			date.setMonth(oJSFW.fnGetAttribute(strMonth,"strMonth") );
			cal.fnSetDate(date);
			cal.blnIsDateClicked = false;
			cal.fnCallHandler();
		}
	} 
	else 
	{
		var year = Calendar_fnFindYear(oTargetElement);
		//alert(year);
		if (year) 
		{
		
			date = new Date(cal.date);
			if (year.year != date.getFullYear()) 
			{
				date.setFullYear(year.year);
				cal.fnSetDate(date);
				cal.blnIsDateClicked = false;
				cal.fnCallHandler();
			}
		}
		
	}
	with (Calendar) 
	{
		removeEvent(document, "mouseup", Calendar_fnTableMouseUp);
		removeEvent(document, "mouseover", Calendar_fnTableMouseOver);
		removeEvent(document, "mousemove", Calendar_fnTableMouseOver);
		cal.fnHideCombos();
		_C = null;
		return stopEvent(oEvent);
	}

}
/// <memberMethod name="fnTableMouseOver">
///	<param name=oEvent>It will accept the Event name</param>
/// <summary>It will be called at mouse over event and also change the class name</summary>
/// </memberMethod>

function Calendar_fnTableMouseOver(oEvent) 
{
	//alert('fnTableMouseOver');
	var cal = Calendar._C;
	var oDateCellTemplate = window.calendar.oDateCellTemplate;
	if (!cal) 
	{
		return;
	}
	var oElement = cal.strActiveDiv;
	var oTargetElement = Calendar.getTargetElement(oEvent);
	if (oTargetElement == oElement || oTargetElement.parentNode == oElement) 
	{
		Calendar.addClass(oElement, oDateCellTemplate.strHoverSelectedDateClass);
		Calendar.addClass(oElement.parentNode, oDateCellTemplate.strSelectedRowClass);
	} 
	else 
	{
		if (typeof oElement.navtype == "undefined" || (oElement.navtype != 50 && (oElement.navtype == 0 || Math.abs(oElement.navtype) > 2)))
			Calendar.removeClass(oElement, oDateCellTemplate.strDateOverClass);
		///--It will remove the class of the element
		Calendar.removeClass(oElement, oDateCellTemplate.strMouseHoverDateClass);
		///--It will remove the class name of the parent node of a given element
		Calendar.removeClass(oElement.parentNode,  oDateCellTemplate.strSelectedRowClass);
	}
	oEvent || (oEvent = window.event);
	if (oElement.navtype == 50 && oTargetElement != oElement) 
	{
		var intPos = Calendar.getAbsolutePos(oElement);
		var intOffsetWidth = oElement.offsetWidth;
		var x = oEvent.clientX;
		var dx;
		var decrease = true;
		if (x > intPos.x + intOffsetWidth) 
		{
			dx = x - intPos.x - intOffsetWidth;
			decrease = false;
		} 
		else
			dx = intPos.x - x;

		if (dx < 0) 
			dx = 0;
		
		var range = oElement._range;
		var current = oElement._current;
		var count = Math.floor(dx / 10) % range.length;
		for (var i = range.length; --i >= 0;)
		{
			if (range[i] == current)
				break;
		}
		while (count-- > 0)
		{
			if (decrease) 
			{
				if (--i < 0)
					i = range.length - 1;
			} 
			else if ( ++i >= range.length )
				i = 0;
		}
		var newval = range[i];
		oElement.firstChild.data = newval;

		cal.onUpdateTime();
	}
	///--It will give a month from the date given in any element
	var strMonth = this.fnFindMonth(oTargetElement);
	if (strMonth) 
	{
		if (strMonth.strMonth != cal.date.getMonth()) 
		{
			if (cal.strHilitedMonth) 
			{
				Calendar.removeClass(cal.strHilitedMonth, oDateCellTemplate.strMouseHoverDateClass);
			}
			Calendar.addClass(strMonth, oDateCellTemplate.strMouseHoverDateClass);
			cal.strHilitedMonth = strMonth;
		} 
		else if (cal.strHilitedMonth) 
		{
			Calendar.removeClass(cal.strHilitedMonth, oDateCellTemplate.strMouseHoverDateClass);
		}
	} 
	else 
	{
		if (cal.strHilitedMonth) 
		{
			Calendar.removeClass(cal.strHilitedMonth, oDateCellTemplate.strMouseHoverDateClass);
		}
		var year = this.fnFindYear(oTargetElement);
		if (year) 
		{
			if (year.year != cal.date.getFullYear()) 
			{
				if (cal.strHilitedYear) 
				{
					Calendar.removeClass(cal.strHilitedYear, oDateCellTemplate.strMouseHoverDateClass);
				}
				Calendar.addClass(year, oDateCellTemplate.strMouseHoverDateClass);
				cal.strHilitedYear = year;
			} 
			else if (cal.strHilitedYear) 
			{
				Calendar.removeClass(cal.strHilitedYear, oDateCellTemplate.strMouseHoverDateClass);
			}
		} 
		else if (cal.strHilitedYear) 
		{
			Calendar.removeClass(cal.strHilitedYear,oDateCellTemplate.strMouseHoverDateClass);
		}
	}
	return Calendar.stopEvent(oEvent);
}
/// <memberMethod name="fnTableMouseDown">
///	<param name=oEvent>It will accept the Event </param>
/// <summary>It will be called at mouse down event it will stop the event which has been attached</summary>
/// </memberMethod>

function Calendar_fnTableMouseDown(oEvent) 
{
	//alert('fnTableMouseDown');
	if (Calendar.getTargetElement(oEvent) == Calendar.getElement(oEvent)) 
	{
		return Calendar.stopEvent(oEvent);
	}
}
/// <memberMethod name="fnCalDragIt">
///	<param name=oEvent>It will accept the Event </param>
/// <summary>It will be called to drag the calander which has been generated</summary>
/// </memberMethod>

function Calendar_fnCalDragIt(oEvent) 
{
	var cal = Calendar._C;
	if (!(cal && cal.blnIsDragging)) 
	{
		return false;
	}
	var intXPosition;
	var intYPosition;
	if (Calendar.is_ie) 
	{
		intYPosition = window.event.clientY + document.body.scrollTop;
		intXPosition = window.event.clientX + document.body.scrollLeft;
	} 
	else 
	{
		intXPosition = oEvent.pageX;
		intYPosition = oEvent.pageY;
	}
	cal.fnHideShowCovered();
	var st = cal.element.style;
	st.left = (intXPosition - cal.xOffs) + "px";
	st.top = (intYPosition - cal.yOffs) + "px";
	return Calendar.stopEvent(oEvent);
}
/// <memberMethod name="fnCalDragEnd">
///	<param name=oEvent>It will accept the Event </param>
/// <summary>It will be called at the end of the drag event</summary>
/// </memberMethod>

function Calendar_fnCalDragEnd(oEvent) 
{
	var cal = Calendar._C;
	if (!cal) 
	{
		return false;
	}
	cal.blnIsDragging = false;
	with (Calendar) 
	{
		removeEvent(document, "mousemove", Calendar_fnCalDragIt);
		removeEvent(document, "mouseup", Calendar_fnCalDragEnd);
		Calendar_fnTableMouseUp(oEvent);
	}
	cal.fnHideShowCovered();
}
/// <memberMethod name="fnDayMouseDown">
///	<param name=oEvent>It will accept the Event </param>
/// <summary>It will be called at mouse down of the elements which are for displaying days,next year,Previous year</summary>
/// </memberMethod>

var blnParam = false;
function Calendar_fnDayMouseDown(oEvent) 
{
	var oDateCellTemplate = window.calendar.oDateCellTemplate;
	var oElement = Calendar.getElement(oEvent);
	if (oElement.disabled) 
	{
		return false;
	}
	var cal = oElement.calendar;
	cal.strActiveDiv = oElement;
	Calendar._C = cal;
	if (oElement.navtype != 300) 
	{
		with (Calendar) 
		{
			if (oElement.navtype == 50) 
			{
				oElement._current = oElement.firstChild.data;
				addEvent(document, "mousemove", Calendar_fnTableMouseOver);
			} 
			else
				addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", Calendar_fnDayMouseOver);
			addClass(oElement,oDateCellTemplate.strHoverSelectedDateClass);
			addEvent(document, "mouseup", Calendar_fnTableMouseUp);
		}
	}
	else if (cal.blnIsPopUp) 
	{
		cal.fnDragStart(oEvent);
	}
	if (oElement.navtype == -1 || oElement.navtype == 1) 
	{
		if (cal.strTimeOut) 
			clearTimeout(cal.strTimeOut);
		cal.strTimeOut = setTimeout(Calendar_fnShowMonthsCombo, 250);
	} 
	else if (oElement.navtype == -2 || oElement.navtype == 2) 
	{
		if (cal.strTimeOut) 
			clearTimeout(cal.strTimeOut);
			//if(oElement.navtype > 0) { cal.fnShowYearsCombo(true);}else {cal.fnShowYearsCombo(false);}
		
					
		//**//cal.strTimeOut = setTimeout((oElement.navtype > 0) ? 'Calendar_fnShowYearsCombo(true)' : 'Calendar_fnShowYearsCombo(false)', 250);
		
		blnParam = false;
		if(oElement.navtype > 0)
			blnParam = true;
		//**//cal.strTimeOut = setTimeout('Calendar_fnShowYearsCombo(' + blnParam + ')', 250);
		cal.strTimeOut = setTimeout(Calendar_fnShowYearsCombo, 250);
		
	} 
	else 
	{
		cal.strTimeOut = null;
	}
	return Calendar.stopEvent(oEvent);
}
/// <memberMethod name="fnDayMouseDblClick">
///	<param name=oEvent>It will accept the Event </param>
/// <summary>It will be called at double click of mouse,it will change the date in the element to the selected date and it will close the calander</summary>
/// </memberMethod>


function Calendar_fnDayMouseDblClick(oEvent) 
{	
	Calendar_fnCellClick(Calendar.getElement(oEvent), oEvent || window.event,false);
	if (Calendar.is_ie) 
	{		
		document.selection.empty();
	}
}
/// <memberMethod name="fnDayMouseOver">
///	<param name=oEvent>It will accept the Event </param>
/// <summary>It will be called on mouse over from the calendar control</summary>
/// </memberMethod>

function Calendar_fnDayMouseOver(oEvent) 
{  
    if(window.calendar!=null)
	    var oDateCellTemplate = window.calendar.oDateCellTemplate;
	var oElement = Calendar.getElement(oEvent);
	
	if(oElement!=null)
	{
	    if (Calendar.isRelated(oElement, oEvent) || Calendar._C || oElement.disabled) 
	    {
		    return false;
	    }
	    if (oElement.ttip) // && oElement.caldate!=null
	    {
		    if (oElement.ttip.substr(0, 1) == "_") 
		    {
			    oElement.ttip = oElement.caldate.print(oElement.calendar.strTimeDateFormat) + oElement.ttip.substr(1);
		    }
		    oElement.calendar.tooltips.firstChild.data = oElement.ttip;
	    }
	    if (oElement.navtype != 300) 
	    {
		    if(oElement.navtype!=null || oElement.ttip!=null)
			    Calendar.addClass(oElement,oDateCellTemplate.strMouseHoverDateClass);
		    if (oElement.caldate) 
		    {
			    Calendar.addClass(oElement.parentNode, oDateCellTemplate.strSelectedRowClass);
		    }
	    }
	}
	return Calendar.stopEvent(oEvent);
}
/// <memberMethod name="fnDayMouseOut">
///	<param name=oEvent>It will accept the Event</param>
/// <summary>It will be called at mouse out event ,By default it will be captioned as 'Select Date' when
/// Mouse is out to any date then it will display the selected date</summary>
/// </memberMethod>

function Calendar_fnDayMouseOut(oEvent) 
{
	var oDateCellTemplate = window.calendar.oDateCellTemplate;
	//alert('fnDayMouseOut');
	with (Calendar) 
	{
		var oElement = getElement(oEvent);
		//alert(oElement.innerHTML);
		if (isRelated(oElement, oEvent) || _C || oElement.disabled) 
		{
			return false;
		}
		removeClass(oElement,oDateCellTemplate.strMouseHoverDateClass);
		if (oElement.caldate) 
		{
			removeClass(oElement.parentNode,oDateCellTemplate.strSelectedRowClass);
		}
		if(oElement.calendar!=null)
			oElement.calendar.tooltips.firstChild.data = _TT["SEL_DATE"];
		return stopEvent(oEvent);
	}
}
/// <memberMethod name="fnCellClick">
///	<param name=oEvent>It will accept the Event</param>
/// <summary> A generic "click" handler ,handles all types of buttons defined in this
///   calendar.</summary>
/// </memberMethod>

function Calendar_fnCellClick(oElement, oEvent,MonthChange,YearChange) 
{
	var cal = oElement.calendar;
	var oDateCellTemplate = window.calendar.oDateCellTemplate;
	var blnClosing = false;
	var blnIsNewDate = false;
	var date = null;
	if (typeof oElement.navtype == "undefined") 
	{
		Calendar.removeClass(cal.currentDateEl, oDateCellTemplate.strSelectedDateClass);
		Calendar.addClass(oElement,  oDateCellTemplate.strSelectedDateClass);
		
		blnClosing = (cal.currentDateEl == oElement);
		if (!blnClosing) 
		{
			cal.currentDateEl = oElement;
		}
		cal.date = new Date(oElement.caldate);
		date = cal.date;
		blnIsNewDate = true;
		
		// a date was clicked
		if(cal.strAfterDateClick!=null)
		{
			eval(cal.strAfterDateClick);
		}
		if (!(cal.blnIsDateClicked = !oElement.otherMonth))
		{
			var NewDate = String(date);
			strTemplate = cal.fnMakeBodyTemplate(cal.intFirstDayOfWeek,date);
			var otbodyNew = oJSFW.fnGetElementsFromHTMLString("<table>"+strTemplate+"</table>")(0).childNodes(0);
			var otbody = oJSFW.fnGetElementById('Calendartbody');
			for(var i=0;i<otbody.childNodes.length;i++)
			{
				oJSFW.fnRemoveChild(otbody.childNodes(i));
				i--;
			}
			
			for(var i=0;i<otbodyNew.childNodes.length;i++)
			{
				oJSFW.fnAppendChild(otbody,otbodyNew.childNodes(i));
				i--;
			}
			
			date = new Date(NewDate);
			cal.fnInit(cal.intFirstDayOfWeek, date);
		}
	} 
	else 
	{
		if (oElement.navtype == 200) 
		{
			Calendar.removeClass(oElement, oDateCellTemplate.strMouseHoverDateClass);
			cal.fnCallCloseHandler();
			return;
		}
		date = (oElement.navtype == 0) ? new Date() : new Date(cal.date);
		// unless "today" was clicked, we assume no date was clicked so
		// the selected handler will know not to close the calendar when
		// in single-click mode.
		// cal.blnIsDateClicked = (oElement.navtype == 0);
		cal.blnIsDateClicked = false;
		var year = date.getFullYear();
		var strMonth = date.getMonth();
				
		function setMonth(m) 
		{
			var day = date.getDate();
			var max = date.getMonthDays(m);
			if (day > max) 
			{
				date.setDate(max);
			}
			date.setMonth(m);
		};
		//alert(oElement.navtype);
		switch (oElement.navtype) 
		{
		    case 400:
				Calendar.removeClass(oElement,  oDateCellTemplate.strMouseHoverDateClass);
				var strHelpText = Calendar._TT["ABOUT"];
				if (typeof strHelpText != "undefined") 
				{
					strHelpText += cal.blnShowTime ? Calendar._TT["ABOUT_TIME"] : "";
				} 
				else 
				{
					// FIXME: this should be removed as soon as lang files get updated!
					strHelpText = "Help and about oDivBox text is not translated into this language.\n" +
						"If you know this language and you feel generous please update\n" +
						"the corresponding file in \"lang\" subdir to match calendar-en.js\n" +
						"and send it back to <mishoo@infoiasi.ro> to get it into the distribution  ;-)\n\n" +
						"Thank you!\n" +
						"http://dynarch.com/mishoo/calendar.epl\n";
				}
				oJSFW.fnAlert(strHelpText);
				return;
			case -2:
				if (year > cal.intMinYear) 
				{
					date.setFullYear(year - 1);
				}
				break;
		    case -1:
				if (strMonth > 0) 
				{
					setMonth(strMonth - 1);
				} 
				else if (year-- > cal.intMinYear) 
				{
					date.setFullYear(year);
					setMonth(11);
				}
				break;
		    case 1:
		    {
		        if(MonthChange)
		        {
				    if (strMonth < 11) 
				    {
					    setMonth(strMonth + 1);
				    } 
				    else if (year < cal.intMaxYear) 
				    {
					    date.setFullYear(year + 1);
					    setMonth(0);
				    }
				}
				break;
				
			}
		    case 2:
		    {
		        if(YearChange)
		        {
				    if (year < cal.intMaxYear) {
					    date.setFullYear(year + 1);
				    }
				}
				break;
			}
		    case 100:
				cal.fnSetFirstDayOfWeek(oElement.fdow);
				return;
		    case 50:
				var range = oElement._range;
				var current = oElement.firstChild.data;
				for (var i = range.length; --i >= 0;)
					if (range[i] == current)
						break;
				if (oEvent && oEvent.shiftKey) {
					if (--i < 0)
						i = range.length - 1;
				} else if ( ++i >= range.length )
					i = 0;
				var newval = range[i];
				oElement.firstChild.data = newval;
				cal.onUpdateTime();
				return;
		    case 0:
				// TODAY will bring us here
				if ((typeof cal.getDateStatus == "function") && cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) 
				{
					// remember, "date" was previously set to new
					// Date() if TODAY was clicked; thus, it
					// contains today date.
					return false;
				}
				break;
		}
		if (!date.equalsTo(cal.date)) 
		{
			cal.fnSetDate(date);
			blnIsNewDate = true;
			
		}
	}
	if (blnIsNewDate) {
		cal.fnCallHandler();
		
	}
	if (blnClosing) {
		Calendar.removeClass(oElement, oDateCellTemplate.strMouseHoverDateClass);
		cal.fnCallCloseHandler();
	}		

	return Calendar.stopEvent(oEvent);	
}

// END: CALENDAR STATIC FUNCTIONS

// BEGIN: CALENDAR OBJECT FUNCTIONS
/// <memberMethod name="fnCreate">
///	<param name=oParent>It will accept the Parent if parent is given then the calender will be created as the child of the elemnt</param>
/// <summary> This function creates the calendar inside the given parent.  If oParent is
/// null then it creates a popup calendar inside the BODY element.  If oParent is
/// an element, be it BODY, then it creates a non-popup calendar (still
/// hidden).  Some properties need to be set before calling this function.
///</summary>
/// </memberMethod>

var strDays="";
//$$added by meghna

function Calendar_SelectNavType(oElementId)
{
	switch(oElementId)
	{
		case 'tdCalendarHelp' :
						return 400;
						break;
		case 'tdCalendarClose':
						return 200;
						break;
		case 'tdCalendarTFoot':
						return 300;
						break;
		case 'tdCalendarCurrMonth':
						return 300;
						break;
		case 'tdCalendarCurrYear':
						return 300;
						break;
		case 'weekName' :
						return 100;
						break;
		case 'tdCalendarPrevYear' :
						return -2;
						break;
		case 'tdCalendarPrevMonth':
						return -1;
						break;
		case 'tdCalendarNextMonth':
						return 1;
						break;
		case 'tdCalendarNextYear' :
						return 2;
						break;
		case 'tdCalendarToday' :
						return 0;
						break;
		
								
	}
}


function Calendar_fnCreate(oParent) 
{
	
	var parent = null;
	var oCalTemplate = this.oCalendarTemplate;
	var oDateCellTemplate = this.oDateCellTemplate;
	var intCtr = 0;
	
	if (! oParent) 
	{
		// default parent is the document body, in which case we create
		// a popup calendar.
		parent = document.getElementsByTagName("body")[0];
		this.blnIsPopUp = true;
	} 
	else 
	{
		parent = oParent;
		this.blnIsPopUp = false;
	}
	
	this.date = this.strDateStr ? new Date(this.strDateStr) : new Date();
	///--It will create a table
	
	//$$Code added by meghna
	
	var oDiv = Calendar.createElement("div");
	
	//oDiv.className = "calendar";
	//oDiv.id = "calendarDiv";
	if (this.blnIsPopUp) 
	{
		oDiv.style.position = "absolute";
		oDiv.style.display = "none";
	}
	
	if(this.intNoOfDays>this.date.getMonthDays())
	{
		this.intNoOfDays = this.date.getMonthDays();
	}
	
	
	if(oCalTemplate!=null)
	{
		var MainTemplate = oCalTemplate.CalendarMainTemplate;
		//Code Before the Template is appended to the document
		MainTemplate = MainTemplate.replace("##Visbility##","Visibility:Visible");		
	/*	if(this.blnDisplayWeekNumbers)
		{
			MainTemplate =MainTemplate.replace("##CurrMonthCS##","6");		
			MainTemplate =MainTemplate.replace("##TodayColspan##","4");	
			MainTemplate =MainTemplate.replace("##FootColspan##","8");	
		}
		else
		{
			MainTemplate =MainTemplate.replace("##CurrMonthCS##","5");		
			MainTemplate =MainTemplate.replace("##TodayColspan##","3");
			MainTemplate =MainTemplate.replace("##FootColspan##","7");		
		}*/
		
		if(this.blnIsPopUp)
		{
			MainTemplate =MainTemplate.replace("##CloseDisplayStyle##","");		
		}
		else
		{
			MainTemplate =MainTemplate.replace("##CurrMonthCS##","none");		
		}
		//To create the cells for THead rows 3
		var strWkDayTitleTemplate = oCalTemplate.strWeekDayTitle;
		var strWeekDayTitle = "";
		var strFinalWeekTemplate = "";
		for(intCtr=0;intCtr<this.intNoOfDays;intCtr++)
		{	var tempctr = intCtr+1;		
			strWeekDayTitle += oCalTemplate.strWeekDayTitle;
			strWeekDayTitle	= strWeekDayTitle.replace("##tdWeekDayTitle##","tdWeekDayTitle"+tempctr);
			//strWeekDayTitle	= strWeekDayTitle.replace("##WeekDayTitleFdow##",tempctr);
		}
		
		
		if(this.blnDisplayWeekNumbers)
		{
			strFinalWeekTemplate = oCalTemplate.strWeekNoTitle;
			
		}
		
		strFinalWeekTemplate += strWeekDayTitle;
		MainTemplate = MainTemplate.replace("##WeekDaysList##",strFinalWeekTemplate);
		
		//To create the cells of TBody
		var strCalendarBodyTemplate = oCalTemplate.strCalendarBodyTemplate;
		var strFinalBodyTemplate = "";
		var innerCtr = 0;
		strFinalBodyTemplate = this.fnMakeBodyTemplate(this.intFirstDayOfWeek,this.date);
		MainTemplate = MainTemplate.replace("##CalendarBody##",strFinalBodyTemplate);
		var strShowTimeTemplate = oCalTemplate.strCalendarShowTimeTemplate;
		if(this.blnShowTime)
		{
			strShowTimeTemplate = strShowTimeTemplate.replace('##DisplayTimeColspan##','6');
			MainTemplate=MainTemplate.replace("##CalendarShowTime##",strShowTimeTemplate);
		}
		else
		{
			strShowTimeTemplate = strShowTimeTemplate.replace('##DisplayTimeColspan##','5');
			MainTemplate=MainTemplate.replace("##CalendarShowTime##","");
		}
		
		oDiv.innerHTML = MainTemplate;
		
		//$$Changed
		document.body.appendChild(oDiv);
	
		var cal = this;
		this.table = oJSFW.fnGetElementById('tblMainTable');
		oDiv.innerHTML = oJSFW.fnGetOuterHTML(this.table);
		this.element = oDiv;
		oJSFW.fnGetElementById('tblMainTable').calendar = this;
		//Code After the Template is appended to the document
		
		//To Add event to the cells for THead rows 1 & 2
		//tdWkDay1 = null;
		//tdWkDay2 = null;
		//tdWkDay3 = null;
		//tdWkDay4 = null;
		//tdWkDay5 = null;
		//tdWkDay6 = null;
		//tdWkDay7 = null;
		tdCalendarHelp		= oJSFW.fnGetElementById('tdCalendarHelp');
		tdCalendarCurrMonth = oJSFW.fnGetElementById('tdCalendarCurrMonth');
		tdCalendarCurrYear = oJSFW.fnGetElementById('tdCalendarCurrYear');
		tdCalendarClose		= oJSFW.fnGetElementById('tdCalendarClose');
		tdCalendarToday		= oJSFW.fnGetElementById('tdCalendarToday');
		tdCalendarPrevYear	= oJSFW.fnGetElementById('tdCalendarPrevYear');
		tdCalendarPrevMonth	= oJSFW.fnGetElementById('tdCalendarPrevMonth');
		tdCalendarNextMonth	= oJSFW.fnGetElementById('tdCalendarNextMonth');
		tdCalendarNextYear	= oJSFW.fnGetElementById('tdCalendarNextYear');
		if(tdCalendarHelp!=null)
		{	
			tdCalendarHelp.navtype = Calendar_SelectNavType('tdCalendarHelp');
			tdCalendarHelp.calendar = this;
			Calendar_fnAddEvent(tdCalendarHelp);
		}
		if(tdCalendarCurrMonth!=null)
		{	
			tdCalendarCurrMonth.navtype = Calendar_SelectNavType('tdCalendarCurrMonth');
			tdCalendarCurrMonth.calendar = this;
			Calendar_fnAddEvent(tdCalendarCurrMonth);
		}
		if(tdCalendarToday!=null)
		{	
			tdCalendarToday.navtype = Calendar_SelectNavType('tdCalendarToday');
			tdCalendarToday.calendar = this;
			Calendar_fnAddEvent(tdCalendarToday);
		}
		
		if(tdCalendarCurrYear!=null)
		{	
			tdCalendarCurrYear.navtype = Calendar_SelectNavType('tdCalendarCurrYear');
			tdCalendarCurrYear.calendar = this;
			Calendar_fnAddEvent(tdCalendarCurrYear);
		}
		
		if(tdCalendarClose!=null)
		{
			tdCalendarClose.navtype = Calendar_SelectNavType('tdCalendarClose');
			tdCalendarClose.calendar = this;
			//oJSFW.fnAttachEvent('click',Calendar_fnDestroy,false,tdCalendarClose);
			Calendar_fnAddEvent(tdCalendarClose);
		}
		
		if(tdCalendarPrevYear!=null)
		{
			tdCalendarPrevYear.navtype = Calendar_SelectNavType('tdCalendarPrevYear');
			tdCalendarPrevYear.calendar = this;
			Calendar_fnAddEvent(tdCalendarPrevYear);
		}
		
		if(tdCalendarPrevMonth!=null)
		{
			tdCalendarPrevMonth.navtype = Calendar_SelectNavType('tdCalendarPrevMonth');
			tdCalendarPrevMonth.calendar = this;
			Calendar_fnAddEvent(tdCalendarPrevMonth);
		}
		if(tdCalendarNextMonth!=null)
		{
			tdCalendarNextMonth.navtype = Calendar_SelectNavType('tdCalendarNextMonth');
			tdCalendarNextMonth.calendar = this;
			Calendar_fnAddEvent(tdCalendarNextMonth);
		}
		if(tdCalendarNextYear!=null)
		{
			tdCalendarNextYear.navtype = Calendar_SelectNavType('tdCalendarNextYear');
			tdCalendarNextYear.calendar = this;
			Calendar_fnAddEvent(tdCalendarNextYear);
		}
		for(intCtr=0;intCtr<this.intNoOfDays;intCtr++)
		{
			var intTempCtr = intCtr + 1;
			var otdWeekTitle = oJSFW.fnGetElementById('tdWeekDayTitle'+intTempCtr );
			otdWeekTitle.navtype = Calendar_SelectNavType('weekName');
			otdWeekTitle.calendar = this;
			Calendar_fnAddEvent(otdWeekTitle);	
		}
		
		this.firstdayname = oJSFW.fnGetElementById('tdWeekDayTitle1');
		this.fnDisplayWeekdays();
		
	
		///--If user wants to see the timings 
		if (this.blnShowTime) 
		{
			(function()
			{
				function makeTimePart(strElementId,className, init, range_start, range_end) 
				{
					var oSpanPart = oJSFW.fnGetElementById(strElementId);
					oSpanPart.calendar = cal;
					oSpanPart.ttip = Calendar._TT["TIME_PART"];
					oSpanPart.navtype = 50;
					oSpanPart._range = [];
					
					if (typeof range_start != "number")
						oSpanPart._range = range_start;
					else 
					{
						for (var i = range_start; i <= range_end; ++i) 
						{
							var strText;
							if (i < 10 && range_end >= 10) 
								strText = '0' + i;
							else 
								strText = '' + i;
							oSpanPart._range[oSpanPart._range.length] = strText;
						}
					}
					Calendar_fnAddEvent(oSpanPart);
					return oSpanPart;
				};
				
				var strHours = cal.date.getHours();
				var strMiniutes = cal.date.getMinutes();
				var t12 = !cal.blnIsTime24;
				var pm = (strHours > 12);
				
				if (t12 && pm) 
					strHours -= 12;
				var strHour = makeTimePart("spHour","hour", strHours, t12 ? 1 : 0, t12 ? 12 : 23);
				
				var strMinute = makeTimePart("spMinute","minute", strMiniutes, 0, 59);
				var strTimeSlot = null;
				
				if (t12)
					strTimeSlot = makeTimePart("spTimeSlot","ampm", pm ? "pm" : "am", ["am", "pm"]);
				else
					oJSFW.fnGetElementById('spTimeSlot').innerHTML = "&nbsp;";

				cal.onSetTime = function() 
				{
					var strHours = this.date.getHours();
					var strMiniutes = this.date.getMinutes();
					var pm = (strHours > 12);
					if (pm && t12) strHours -= 12;
					strHour.innerText = (strHours < 10) ? ("0" + strHours) : strHours;
					strMinute.innerText = (strMiniutes < 10) ? ("0" + strMiniutes) : strMiniutes;
					if (t12)
						strTimeSlot.innerText = pm ? "pm" : "am";
				};

				cal.onUpdateTime = function() 
				{
					var date = this.date;
					var h = parseInt(strHour.innerText, 10);
					if (t12) 
					{
						if (/pm/i.test(strTimeSlot.innerText) && h < 12)
							h += 12;
						else if (/am/i.test(strTimeSlot.innerText) && h == 12)
							h = 0;
					}
					var d = date.getDate();
					var m = date.getMonth();
					var y = date.getFullYear();
					date.setHours(h);
					date.setMinutes(parseInt(strMinute.innerText, 10));
					date.setFullYear(y);
					date.setMonth(m);
					date.fnSetDate(d);
					this.blnIsDateClicked = false;
					this.fnCallHandler();
				};
			})();
		} 
		else 
		{
			this.onSetTime = this.onUpdateTime = function() {};
		}

	}
	
	this.fnAddToolTips();

	//var tfoot = Calendar.createElement("tfoot");
	////table.appendChild(tfoot);
	//oJSFW.fnAppendChild(oTable,tfoot);
	//oRow = Calendar.createElement("tr", tfoot);
	//oRow.className = "footrow";
	if(oJSFW.fnGetElementById('tdCalendarTFoot')!=null)
	{
		oJSFW.fnGetElementById('tdCalendarTFoot').innerHTML = Calendar._TT["SEL_DATE"];
		oJSFW.fnGetElementById('tdCalendarTFoot').calendar = this;
		if (this.blnIsPopUp) 
		{
			oJSFW.fnGetElementById('tdCalendarTFoot').ttip = Calendar._TT["DRAG_TO_MOVE"];
			oJSFW.fnGetElementById('tdCalendarTFoot').style.cursor = "move";
		}
		this.tooltips = oJSFW.fnGetElementById('tdCalendarTFoot');

	}
	//For Month Combo	
	var strMainComboOuterDivTemplate = oCalTemplate.strMainMonthComboTemplate;
	var MainComboDivTemplate = oCalTemplate.strInnerMonthComboTemplate;
	var strFinalComboData = "";
	for (i = 0; i < Calendar._MN.length; ++i) 
	{
		var strComboData = MainComboDivTemplate;
		strComboData = strComboData.replace('##strMonth##',i);
		strComboData = strComboData.replace('##InnerMonthId##','InnerMthId'+(i+1));
		strComboData =strComboData.replace('##MonthComboData##', Calendar._SMN[i]);
		strFinalComboData += strComboData;
	}
	strMainComboOuterDivTemplate = strMainComboOuterDivTemplate.replace('##MonthMainComboData##',strFinalComboData);
	//var oDiv = oJSFW.fnGetElementsFromHTMLString("<table>"+strMainComboOuterDivTemplate+"</table>",document);
	if(oJSFW.objBrowserInfo.IsIE)
	{
		var oDiv = oJSFW.fnGetElementsFromHTMLString("<table>"+strMainComboOuterDivTemplate+"</table>",document);
		this.oCboOfMonths = oDiv(0).childNodes(0).childNodes(0);
		oJSFW.fnAppendChild(this.element,oDiv(0).childNodes(0).childNodes(0));
	}
	else
	{
		var oDIV = oJSFW.fnCreateElement("DIV");
		//oJSFW.fnAppendChild(document.body,oDIV);
		oDIV.innerHTML = strMainComboOuterDivTemplate;
		if(oDIV.childNodes[0].nodeType == 1)
		    this.oCboOfMonths = oDIV.childNodes[0];
		else
		    this.oCboOfMonths = oDIV.childNodes[1];		
		oJSFW.fnAppendChild(this.element,oDIV);
	}
	
	//For Year Combo
	
	var strMainComboOuterDivTemplate = oCalTemplate.strMainYearComboTemplate;
	var MainComboDivTemplate = oCalTemplate.strInnerYearComboTemplate;
	var strFinalComboData = "";
	for (i = 12; i > 0; --i) 
	{
		var strComboData = MainComboDivTemplate;
		strComboData = strComboData.replace('##InnerYearId##','InnerYearId'+i);		
		strFinalComboData += strComboData;
	}
	strMainComboOuterDivTemplate = strMainComboOuterDivTemplate.replace('##YearMainComboData##',strFinalComboData);
	if(oJSFW.objBrowserInfo.IsIE)
	{
		var oDiv = oJSFW.fnGetElementsFromHTMLString("<table>"+strMainComboOuterDivTemplate+"</table>",document);
		this.oCboOfYears = oDiv[0].childNodes[0].childNodes[0];
		oJSFW.fnAppendChild(this.element,oDiv[0].childNodes[0].childNodes[0]);
	}
	else
	{
		var oDIV = oJSFW.fnCreateElement("DIV");
		//oJSFW.fnAppendChild(document.body,oDIV);
		oDIV.innerHTML = strMainComboOuterDivTemplate;
		if(oDIV.childNodes[0].nodeType == 1)
		    this.oCboOfYears = oDIV.childNodes[0];
		else
		    this.oCboOfYears = oDIV.childNodes[1];
		   
		oJSFW.fnAppendChild(this.element,oDIV);
	}
	
	this.fnInit(this.intFirstDayOfWeek, this.date);
	//parent.appendChild(this.element);
	oJSFW.fnAppendChild(parent,this.element);
}

function Calendar_fnAddToolTips()
{
	var intCtr = 0;
	if(oJSFW.fnGetElementById('tdCalendarHelp')!=null)
	{
		oJSFW.fnGetElementById('tdCalendarHelp').ttip = Calendar._TT["INFO"];
	}
	if(oJSFW.fnGetElementById('tdCalendarCurrMonth')!=null)
	{
		oJSFW.fnGetElementById('tdCalendarCurrMonth').ttip = Calendar._TT["DRAG_TO_MOVE"];
	}
	if(oJSFW.fnGetElementById('tdCalendarCurrYear')!=null)
	{
		oJSFW.fnGetElementById('tdCalendarCurrYear').ttip = Calendar._TT["DRAG_TO_MOVE"];
	}
	if(oJSFW.fnGetElementById('tdCalendarClose')!=null)
	{
		oJSFW.fnGetElementById('tdCalendarClose').ttip = Calendar._TT["CLOSE"];
	}
	if(oJSFW.fnGetElementById('tdCalendarPrevYear')!=null)
	{
		 oJSFW.fnGetElementById('tdCalendarPrevYear').ttip =  Calendar._TT["PREV_YEAR"];
	}
	if(oJSFW.fnGetElementById('tdCalendarPrevMonth')!=null)
	{
		oJSFW.fnGetElementById('tdCalendarPrevMonth').ttip = Calendar._TT["PREV_MONTH"];
	}
	if(oJSFW.fnGetElementById('tdCalendarToday')!=null)
	{
		oJSFW.fnGetElementById('tdCalendarToday').ttip = Calendar._TT["GO_TODAY"];
		oJSFW.fnGetElementById('tdCalendarToday').calendar = this;
	}
	if(oJSFW.fnGetElementById('tdCalendarNextMonth')!=null)
	{
		oJSFW.fnGetElementById('tdCalendarNextMonth').ttip = Calendar._TT["NEXT_MONTH"];
	}
	if(oJSFW.fnGetElementById('tdCalendarNextYear')!=null)
	{
		oJSFW.fnGetElementById('tdCalendarNextYear').ttip = Calendar._TT["NEXT_YEAR"];
	}
	if(this.blnDisplayWeekDays)
	{
		for(intCtr=0;intCtr<7;intCtr++)
		{
			if(oJSFW.fnGetElementById('tdweekno'+(intCtr+1))==null)
				continue;
			oJSFW.fnGetElementById('tdweekno'+(intCtr+1)).ttip = Calendar._TT["WK"];
		}
	}
	//document.getElementById('').ttip = '';	
	
}


function Calendar_fnMakeBodyTemplate(intFirstDayOfWeek,date)
{
	var oCalTemplate = this.oCalendarTemplate;
	var oDateCellTemplate = this.oDateCellTemplate;
	var arrSpecialDates = this.arrSpecialDate;
	var strDateCellTemplate = oDateCellTemplate.strWeekDateCell;
	var strDateEmptyCellTemplate = oDateCellTemplate.strWeekDateEmptyCell;
	var strDateWeekendCellTemplate = oDateCellTemplate.strWeekEndDate;
	var strWeekNoCell = oCalTemplate.strWeekNoCell;
	var strBodyRowTemplate = oCalTemplate.strCalendarBodyTemplate;
	var strCurrDateWeekEnd = oDateCellTemplate.strWeekEndCurrDate;
	var blnCurrDate =false;
	var intCtr = 0;
	var strCurrentDate = new Date();
	var strYear = date.getFullYear();
	if (strYear < this.intMinYear) 
	{
		strYear = this.intMinYear;
		date.setFullYear(strYear);
	} 
	else if (strYear > this.intMaxYear) 
	{
		strYear = this.intMaxYear;
		date.setFullYear(strYear);
	}
	this.intFirstDayOfWeek = intFirstDayOfWeek;
	this.date = new Date(date);
	var strMonth = date.getMonth();
	var mday = date.getDate();
	var no_days = date.getMonthDays();

	

	// calendar  for computing the first day that would actually be
	// displayed in the calendar, even if it'strComboStyle from the previous strMonth.
	
	date.setDate(1);
	var day1 = (date.getDay() - this.intFirstDayOfWeek) % 7;
	if (day1 < 0)
		day1 += 7;
	date.setDate(-day1);
	date.setDate(date.getDate() + 1);

	var MN = Calendar._SMN[strMonth];
	var oArrOfDays =oJSFW.fnObjectInitializer('Array','',[]);
	var weekend = Calendar._TT["WEEKEND"];
	var MainTemplate = "";
	if(date==strCurrentDate)
		blnCurrDate= true;
	
	for (intCtr = 0; intCtr < 6; intCtr++) 
	{
		var MaintdTemplate = "";
		var rowTemplate = strBodyRowTemplate;
		rowTemplate = rowTemplate.replace('##CalendarBodyRow##','trCalendarBodyRow'+(intCtr+1));
		if (this.blnDisplayWeekNumbers && this.intNoOfDays==7) 
		{
			var weekNoTemplate = strWeekNoCell;
			weekNoTemplate = weekNoTemplate.replace('##CalendarWeekNo##','tdweekno'+(intCtr+1));
			weekNoTemplate = weekNoTemplate.replace('##WeekNo##',date.getWeekNumber());
			MaintdTemplate += weekNoTemplate;
		}
		var hasdays = false;
		for (var j = 0; j < this.intNoOfDays; ++j,date.setDate(date.getDate() + 1)) 
		{
			var iday = date.getDate();
			var wday = date.getDay();
			var current_month = (date.getMonth() == strMonth);
			var weekDateTemplate = strDateCellTemplate;
			var blnSpecialDate = false;
			weekDateTemplate = weekDateTemplate.replace('##CalendarWeekDate##','tdweekdate'+(intCtr+1)+(j+1));
				
			if (!current_month) 
			{
				if (this.blnShowsOtherMonths ) 
				{
					var weekDateOtherMonthTemplate = oDateCellTemplate.strWeekDateCellOtherMonth;
					weekDateTemplate = weekDateOtherMonthTemplate.replace('##CalendarWeekDate##','tdweekdate'+(intCtr+1)+(j+1));
					
				} 
				else 
				{
					var weekDateEmptyCellTemplate = oDateCellTemplate.strWeekDateEmptyCell;
					weekDateEmptyCellTemplate = weekDateEmptyCellTemplate.replace('##CalendarWeekDate##','tdweekdate'+(intCtr+1)+(j+1));
					weekDateEmptyCellTemplate = weekDateEmptyCellTemplate.replace('##WeekEmptyDate##','&nbsp;');
					weekDateTemplate = weekDateEmptyCellTemplate.replace('##WeekDateEmptyDisabled##','disabled');
					MaintdTemplate += weekDateTemplate;
					continue;
				}
			} 
			else 
			{
				hasdays = true;
			}
			//oCell.firstChild.data = iday;
			if (typeof this.getDateStatus == "function") 
			{
				var blnStatus = this.getDateStatus(date, strYear, strMonth, iday);
				if (blnStatus === true) 
				{
					weekDateTemplate = weekDateTemplate.replace('##WeekDateEmptyDisabled##','disabled');
				} 
				else 
				{
					if (/disabled/i.test(blnStatus))
						weekDateTemplate = weekDateTemplate.replace('##WeekDateEmptyDisabled##','disabled');
					
				}
			}
			//if (weekDateTemplate.indexOf('disabled')!=-1) 
			//{
			
				if(arrSpecialDates!=null)
				{
					var m = arrSpecialDates[strMonth];
					for (var i in m) 
					{
						if (m[i] == iday)
						{
							weekDateTemplate = oDateCellTemplate.strWeekSpecialDateCell;
							weekDateTemplate = weekDateTemplate.replace('##CalendarWeekDate##','tdweekdate'+(intCtr+1)+(j+1));
							blnSpecialDate = true;
						}
					}
					
				}
			
				if (current_month && iday == mday && blnSpecialDate==false) 
				{
					weekDateTemplate = oDateCellTemplate.strCurrDateCell;
					weekDateTemplate = weekDateTemplate.replace('##CalendarWeekDate##','tdweekdate'+(intCtr+1)+(j+1));
				}
				if (date.getFullYear() == strCurrentDate.getFullYear() && date.getMonth() == strCurrentDate.getMonth() && iday == strCurrentDate.getDate() && blnSpecialDate==false) 
				{
					if(blnCurrDate==true)
					{
						weekDateTemplate = oDateCellTemplate.strCurrDateCell;
						weekDateTemplate = weekDateTemplate.replace('##CalendarWeekDate##','tdweekdate'+(intCtr+1)+(j+1));	
					}
				}
				if (weekend.indexOf(wday.toString()) != -1 && blnSpecialDate==false) 
				{
					if(mday == iday)
					{
						//weekDateTemplate = weekDateTemplate.replace('##CalendarWeekDate##','tdweekdate'+(i+1)+(j+1));
						weekDateTemplate = strCurrDateWeekEnd;
					}
					else
						weekDateTemplate = oDateCellTemplate.strWeekEndDate;
					weekDateTemplate = weekDateTemplate.replace('##CalendarWeekDate##','tdweekdate'+(intCtr+1)+(j+1));
				}
			//}
			weekDateTemplate= weekDateTemplate.replace('##WeekDateCell##',iday);
			MaintdTemplate += weekDateTemplate;
			
		}
		rowTemplate = rowTemplate.replace('##WeekDate##',MaintdTemplate);	
		if ((hasdays || this.blnShowsOtherMonths ))
			MainTemplate += rowTemplate;
		
	}
	//alert(MainTemplate);
	return MainTemplate;
	
}


/// <memberMethod name="fnKeyEvent">
///	<param name=oEvent>It will accept the Event</param>
/// <summary>This function is used for keyboard navigation, only for popup calendars 
///</summary>
/// </memberMethod>

function Calendar_fnKeyEvent(oEvent) 
{

	var oDateCellTemplate = window.calendar.oDateCellTemplate;
	if (!window.calendar) 
	{
		return false;
	}
	(Calendar.is_ie) && (oEvent = window.event);
	var cal = window.calendar;
	var act = (Calendar.is_ie || oEvent.type == "keypress");
	if (oEvent.ctrlKey) 
	{
		switch (oJSFW.fnGetKeyCode(oEvent)) 
		{
		    case 37: ///-- KEY left
				act && this.fnCellClick(cal._nav_pm);
				break;
		    case 38: ///-- KEY up
				act && this.fnCellClick(cal._nav_py);
				break;
		    case 39: ///-- KEY right
				act && this.fnCellClick(cal._nav_nm);
				break;
		    case 40: ///-- KEY down
				act && this.fnCellClick(cal._nav_ny);
				break;
		    default:
				return false;
		}
	} 
	else 
	{
		switch (oJSFW.fnGetKeyCode(oEvent)) 
		{
			case 32: ///-- KEY space (now)
				this.fnCellClick(cal._nav_now);
				break;
			case 27: ///-- KEY esc
				act && cal.fnCallCloseHandler();
				break;
			case 37: ///-- KEY left
			case 38: ///-- KEY up
			case 39: ///-- KEY right
			case 40: ///-- KEY down
				if (act) 
				{
					var date = cal.date.getDate() - 1;
					var oElement = cal.currentDateEl;
					var strNextDay = null;
					var strPrevDay = (oJSFW.fnGetKeyCode(oEvent) == 37) || (oJSFW.fnGetKeyCode(oEvent) == 38);
					switch (oJSFW.fnGetKeyCode(oEvent)) 
					{
						case 37: ///-- KEY left
							(--date >= 0) && (strNextDay = cal.oArrOfDays[date]);
							break;
						case 38: ///-- KEY up
							date -= 7;
							(date >= 0) && (strNextDay = cal.oArrOfDays[date]);
							break;
						case 39: ///-- KEY right
							(++date < cal.oArrOfDays.length) && (strNextDay = cal.oArrOfDays[date]);
							break;
						case 40: ///-- KEY down
							date += 7;
							(date < cal.oArrOfDays.length) && (strNextDay = cal.oArrOfDays[date]);
							break;
					}
					if (!strNextDay) 
					{
						if (strPrevDay) 
						{
							Calendar_fnCellClick(cal._nav_pm,false,false);
						} 
						else 
						{
							Calendar_fnCellClick(cal._nav_nm,false,false);
						}
						date = (strPrevDay) ? cal.date.getMonthDays() : 1;
						oElement = cal.currentDateEl;
						strNextDay = cal.oArrOfDays[date - 1];
					}
					Calendar.removeClass(oElement, oDateCellTemplate.strSelectedDateClass);
					Calendar.addClass(strNextDay, oDateCellTemplate.strSelectedDateClass);
					cal.date = new Date(strNextDay.caldate);
					cal.fnCallHandler();
					cal.currentDateEl = strNextDay;
				}
				break;
			case 13: // KEY enter
				if (act) 
				{
					cal.fnCallHandler();
					cal.fnHide();
				}
				break;
			default:
				return false;
		}
	}
	return Calendar.stopEvent(oEvent);
}
/// <memberMethod name="fnInit">
///	<param name=intFirstDayOfWeek>It will accept the first day of week</param>
///	<param name=date>It will accept the date</param>
/// <summary>This function will Initializes the calendar to the given date and intFirstDayOfWeek 
///</summary>
/// </memberMethod>
function Calendar_fnInit(intFirstDayOfWeek, date) 
{
	var strCurrentDate = new Date();
	var strYear = date.getFullYear();
	if (strYear < this.intMinYear) 
	{
		strYear = this.intMinYear;
		date.setFullYear(strYear);
	} 
	else if (strYear > this.intMaxYear) 
	{
		strYear = this.intMaxYear;
		date.setFullYear(strYear);
	}

	this.intFirstDayOfWeek = intFirstDayOfWeek;
	this.date = new Date(date);
	var strMonth = date.getMonth();
	var mday = date.getDate();
	var no_days = date.getMonthDays();
	var arrSpecialDates = this.arrSpecialDate;
	var oDayEventParamObject = this.oDayEventParamObject;
	var arrWeekDayForEvents = this.arrWeekDayForEvents;
	// calendar  for computing the first day that would actually be
	// displayed in the calendar, even if it'strComboStyle from the previous strMonth.
	
	date.setDate(1);
	var day1 = (date.getDay() - this.intFirstDayOfWeek) % 7;
	if (day1 < 0)
		day1 += 7;
	date.setDate(-day1);
	date.setDate(date.getDate() + 1);

	
	var MN = Calendar._SMN[strMonth];
	var oArrOfDays =oJSFW.fnObjectInitializer('Array','',[]);
	var weekend = Calendar._TT["WEEKEND"];
	var blnSpecialDate = false;
	
	
	for (var i = 0; i < 6; ++i) 
	{
		if(oJSFW.fnGetElementById('trCalendarBodyRow'+(i+1))==null)
			continue;
		oRow = oJSFW.fnGetElementById('trCalendarBodyRow'+(i+1));
		var oCell = oRow.firstChild;
		if (this.blnDisplayWeekNumbers) 
		{
			oCell = oCell.nextSibling;
			oCell.calendar = this;
			Calendar_fnAddEvent(oCell);
		}
		var hasdays = false;
		for (var j = 0; j < this.intNoOfDays; ++j, oCell = oCell.nextSibling, date.setDate(date.getDate() + 1)) 
		{
			if(oCell!=null)
			{
				var iday = date.getDate();
				var wday = date.getDay();
				var blnSpecialDate = false;
				var blnIsWeekEnd = false;
				var current_month = (date.getMonth() == strMonth);
				if (!current_month) 
				{
					if (this.blnShowsOtherMonths ) 
					{
						oCell.otherMonth = true;
						oCell.calendar = this;
						
					} 
					else 
					{
						oCell.disabled = true;
						oCell.calendar = this;
						continue;
					}
				} 
				else 
				{
					oCell.otherMonth = false;
					oCell.calendar = this;
					oCell.caldate = new Date(date);
					Calendar_fnAddEvent(oCell);
					hasdays = true;
				}
				oCell.disabled = false;
				oCell.calendar = this;
				if (typeof this.getDateStatus == "function") 
				{
					var blnStatus = this.getDateStatus(date, strYear, strMonth, iday);
					if (blnStatus === true) 
					{
						oCell.disabled = true;
						oCell.calendar = this;
					} 
					else 
					{
						if (/disabled/i.test(blnStatus))
						{
							oCell.disabled = true;
							oCell.calendar = this;
						}
						
					}
				}
				
				if (weekend.indexOf(wday.toString()) != -1 && blnSpecialDate==false) 
				{
					//code for adding events to weekend
					if(arrWeekDayForEvents!=null && oParamDayEvent!==null)
					{
						for (var intWeekDayCtr=0;intWeekDayCtr<arrWeekDayForEvents.length;intWeekDayCtr++) 
						{
							if(oDayEventParamObject.fnIsExists('Weekend'))
							{
								var oParamDayEvent = oDayEventParamObject.fnGetValue('Weekend','DateType');			
								var arrEvents = oParamDayEvent.fnGetAllKeys();
								
								for(var intParamCtr=0;intParamCtr<oParamDayEvent.fnGetLength();intParamCtr++)
								{
									var strDayEvent = "";
									if(arrEvents[intParamCtr].indexOf('on')!=-1)
									{
										strDayEvent = arrEvents[intParamCtr].substring(2,arrEvents[intParamCtr].length);
									}
									else
										strDayEvent = arrEvents[intParamCtr];
									
									oJSFW.fnAttachEvent(strDayEvent,eval(oParamDayEvent.fnGetValue(arrEvents[intParamCtr],'Event')),false,oCell);	
									//oJSFW.fnAttachEvent(strDayEvent,fnTemp1,false,oCell);	
								}
							}
							blnIsWeekEnd = true;
								
						}
					}
						
				}
					
				if(arrSpecialDates!=null)
				{
					var m = arrSpecialDates[strMonth];
					for (var sd in m) 
					{
						if (m[sd] == iday)
						{
							oCell.caldate = new Date(date);
							oCell.ttip = "_";
							oCell.calendar = this;
							oCell.disabled=false;
							Calendar_fnAddEvent(oCell);
							var oParamDayEvent = oDayEventParamObject.fnGetValue('Special','DateType');			
							var arrEvents = oParamDayEvent.fnGetAllKeys();
							
							for(var intParamCtr=0;intParamCtr<oParamDayEvent.fnGetLength();intParamCtr++)
							{
								var strDayEvent = "";
								if(arrEvents[intParamCtr].indexOf('on')!=-1)
								{
									strDayEvent = arrEvents[intParamCtr].substring(2,arrEvents[intParamCtr].length);
								}
								else
									strDayEvent = arrEvents[intParamCtr];
								
								oJSFW.fnAttachEvent(strDayEvent,eval(oParamDayEvent.fnGetValue(arrEvents[intParamCtr],'Event')),false,oCell);	
								//oJSFW.fnAttachEvent(strDayEvent,fnTemp2,false,oCell);
							}
							blnSpecialDate = true;
						}
					}
					
				}
				if (!oCell.disabled && blnSpecialDate==false) //else Added by **********
				{
					oArrOfDays[oArrOfDays.length] = oCell;
					oCell.caldate = new Date(date);
					oCell.ttip = "_";
					oCell.calendar = this;
					Calendar_fnAddEvent(oCell);
					//code to add code for weekdays
					var m = arrWeekDayForEvents;
					if(arrWeekDayForEvents!=null && oParamDayEvent!==null && blnIsWeekEnd==false)
					{
						for (var intWeekDayCtr=0;intWeekDayCtr<arrWeekDayForEvents.length;intWeekDayCtr++) 
						{
							if(j==arrWeekDayForEvents[intWeekDayCtr])
							{
								var oParamDayEvent = oDayEventParamObject.fnGetValue('Weekday','DateType');			
								var arrEvents = oParamDayEvent.fnGetAllKeys();
								
								for(var intParamCtr=0;intParamCtr<oParamDayEvent.fnGetLength();intParamCtr++)
								{
									var strDayEvent = "";
									if(arrEvents[intParamCtr].indexOf('on')!=-1)
									{
										strDayEvent = arrEvents[intParamCtr].substring(2,arrEvents[intParamCtr].length);
									}
									else
										strDayEvent = arrEvents[intParamCtr];
									
									oJSFW.fnAttachEvent(strDayEvent,eval(oParamDayEvent.fnGetValue(arrEvents[intParamCtr],'Event')),false,oCell);	
									//oJSFW.fnAttachEvent(strDayEvent,fnTemp,false,oCell);	
								}
								//fnAttachEvent(strEvent,fnFunctionPointer,bCapture,oElement)
								
							}
						}
					}
					//end code to add code for weekdays
					if (current_month && iday == mday) 
					{
					
						this.currentDateEl = oCell;
						//Calendar.removeClass(oCell,this.strDateOverClass);
						
					}
				}
			}
				
		}
		
	}
	if(oJSFW.fnGetElementById('MainMonthCombo')!=null)
	{
		for(var intCtr=0;intCtr<12;intCtr++)
		{
			oJSFW.fnGetElementById('InnerMthId'+(intCtr+1)).calendar = this;
			var oElement = oJSFW.fnGetElementById('InnerMthId'+(intCtr+1));
			Calendar_fnAddEvent(oElement);
		}
	}
	
	
	if(oJSFW.fnGetElementById('MainYearCombo')!=null)
	{
		for(var intCtr=0;intCtr<12;intCtr++)
		{
			oJSFW.fnGetElementById('InnerYearId'+(intCtr+1)).calendar = this;
			var oElement = oJSFW.fnGetElementById('InnerYearId'+(intCtr+1));
			Calendar_fnAddEvent(oElement);
			
		}
	}
	this.oArrOfDays = oArrOfDays;
	if(oJSFW.fnGetElementById('tdCalendarCurrMonth')!=null)
		oJSFW.fnGetElementById('tdCalendarCurrMonth').innerHTML = Calendar._MN[strMonth];
	if(oJSFW.fnGetElementById('tdCalendarCurrYear')!=null)
		oJSFW.fnGetElementById('tdCalendarCurrYear').innerHTML = strYear;
	this.onSetTime();	
}


/// <memberMethod name="fnSetDate">
///	<param name=date>It will accept the date</param>
/// <summary>Calls fnInit function above for going to a certain date,but only if the
///  date is different than the currently selected one. 
///</summary>
/// </memberMethod>

function Calendar_fnSetDate(date) 
{
	var NewDate = String(date);
	if (!date.equalsTo(this.date)) 
	{
		strTemplate = this.fnMakeBodyTemplate(this.intFirstDayOfWeek,date);
		var otbodyNew = oJSFW.fnGetElementsFromHTMLString("<table>"+strTemplate+"</table>")[0].firstChild;
		var otbody = oJSFW.fnGetElementById('Calendartbody');
		
		for(var i=0;i<otbody.childNodes.length;i++)
		{
			oJSFW.fnRemoveChild(otbody.childNodes[i]);
			i--;
		}
		
		for(var i=0;i<otbodyNew.childNodes.length;i++)
		{
			oJSFW.fnAppendChild(otbody,otbodyNew.childNodes[i]);
			i--;
		}
		
		date = new Date(NewDate);
		
		this.fnInit(this.intFirstDayOfWeek,date);
	}
}
/// <memberMethod name="fnRefresh">
/// <summary>*  Refreshes the calendar.  Useful if the "disabledHandler" function is
///  dynamic, meaning that the list of disabled date can change at runtime.
///  Just * call this function if you think that the list of disabled dates
///  should * change.
/// </summary>
/// </memberMethod>
function Calendar_fnRefresh() 
{
	//this.fnInit(this.intFirstDayOfWeek, this.date);
}
/// <memberMethod name="fnSetFirstDayOfWeek">
/// <summary>Modifies the "intFirstDayOfWeek" parameter (pass 0 for Synday, 1 for Monday, etc.). 
/// </summary>
/// </memberMethod>
function Calendar_fnSetFirstDayOfWeek(intFirstDayOfWeek) 
{
	var date = this.date;
	strTemplate = this.fnMakeBodyTemplate(intFirstDayOfWeek,date);
		var otbodyNew = oJSFW.fnGetElementsFromHTMLString("<table>"+strTemplate+"</table>")[0].firstChild;
		var otbody = oJSFW.fnGetElementById('Calendartbody');
	
	for(var i=0;i<otbody.childNodes.length;i++)
	{
		oJSFW.fnRemoveChild(otbody.childNodes[i]);
		i--;
	}
	
	for(var i=0;i<otbodyNew.childNodes.length;i++)
	{
		oJSFW.fnAppendChild(otbody,otbodyNew.childNodes[i]);
		i--;
	}
	this.fnInit(intFirstDayOfWeek, this.date);
	this.fnDisplayWeekdays();
}
/// <memberMethod name="fnSetDateStatusHandler">
///	<param name=unaryFunction>It will accept the function </param>
/// <summary>Allows customization of what dates are enabled.  The "unaryFunction"
///  parameter must be a function object that receives the date as a JS Date
///  object and returns a boolean value.  If the returned value is true then
///  the passed date will be marked as disabled.
/// </summary>
/// </memberMethod>
function Calendar_fnSetDateStatusHandler(unaryFunction) 
{
	this.getDateStatus = unaryFunction;
}
/// <memberMethod name="fnSetDisabledHandler">
///	<param name=unaryFunction>It will accept the function </param>
/// <summary>Allows customization of what dates are enabled.  The "unaryFunction"
///  parameter must be a function object that receives the date as a JS Date
///  object and returns a boolean value.  If the returned value is true then
///  the passed date will be marked as disabled.
/// </summary>
/// </memberMethod>
function Calendar_fnSetDisabledHandler(unaryFunction)
{
	this.getDateStatus = unaryFunction;
}
/// <memberMethod name="fnSetRange">
///	<param name=intMinRange>It will accept the Minimum range of the year</param>
///	<param name=intMinRange>It will accept the Maximum range of the year</param>
/// <summary>Customization of allowed year range for the calendar.
/// </summary>
/// </memberMethod>
function Calendar_fnSetRange(intMinRange, intMaxRange) 
{
	this.intMinYear = intMinRange;
	this.intMaxYear = intMaxRange;
}
/// <memberMethod name="fnCallHandler">
/// <summary>Calls the first user handler that is selectedHandler.
/// </summary>
/// </memberMethod>
function Calendar_fnCallHandler() 
{
	if (this.onSelected) 
	{
		try
		{
			this.onSelected(this, this.date.print(this.strDateFormat));
		}
		catch(e)
		{}
	}
}
/// <memberMethod name="fnCallCloseHandler">
/// <summary>Calls the second user handler that is closeHandler. 
/// </summary>
/// </memberMethod>

function Calendar_fnCallCloseHandler() 
{
	if (this.onClose) 
	{
		this.onClose(this);
	}
	this.fnHideShowCovered();
}
/// <memberMethod name="fnDestroy">
/// <summary> Removes the calendar object from the DOM tree and destroys it. 
/// </summary>
/// </memberMethod>

function Calendar_fnDestroy() 
{
	oJSFW.fnRemoveChild(this.element);
	Calendar._C = null;
	window.calendar = null;
}
/// <memberMethod name="fnReparent">
///	<param name=new_parent>It will accept the parent Elemnet</param>
/// <summary>Moves the calendar element to a different section in the DOM 
///  tree ,that is it will change its parent.
/// </summary>
/// </memberMethod>

function Calendar_fnReparent(new_parent) 
{
	var oElement = this.element;
	oJSFW.fnRemoveChild(oElement);
	oJSFW.fnAppendChild(new_parent,oElement);
}
/// <memberMethod name="Calendar_fnCheckCalendar">
///	<param name=oEvent>It will accept the  Elemnet</param>
/// <summary>This gets called when the user presses a mouse button anywhere in the
/// document, if the calendar is shown.  If the click was outside the open
/// calendar this function closes it.
/// </summary>
/// </memberMethod>

function Calendar_fnCheckCalendar(oEvent) 
{
	if (!window.calendar) 
	{
		return false;
	}
	var oElement = Calendar.is_ie ? Calendar.getElement(oEvent) : Calendar.getTargetElement(oEvent);
	for (; oElement != null && oElement != calendar.element; oElement = oElement.parentNode);
	if (oElement == null) 
	{
		///-- calls closeHandler which should fnHide the calendar.
		window.calendar.fnCallCloseHandler();
		return Calendar.stopEvent(oEvent);
	}
}
/// <memberMethod name="Calendar_fnShow">
/// <summary>It will Shows the calendar. 
/// </summary>
/// </memberMethod>

function Calendar_fnShow() 
{
	//var oDateCellTemplate = this.oDateCellTemplate;
	this.element.style.display = "";
	//this.element.style.zIndex = oJSFW.intHighestZIndex += 5;
	
	/*
	var oCalZIndex = oJSFW.fnObjectInitializer('cZindex');
	oCalZIndex.fnSetIndex(this.element,"DRAGDROP");*/

	//oJSFW.fnSetDisplayStyle(this.element,true);
	this.blnIsHidden = false;
	/*if (this.blnIsPopUp) 
	{
		window.calendar = this;
		Calendar.addEvent(document, "keydown", this.fnKeyEvent);
		Calendar.addEvent(document, "keypress", this.fnKeyEvent);
		Calendar.addEvent(document, "mousedown", this.fnCheckCalendar);
	}
	this.fnHideShowCovered();*/
	this.fnHideShowCovered();
}
/// <memberMethod name="Calendar_fnHide">
/// <summary>It will Hides the calendar.  Also removes any "hilite" from the class of any TD
///  element.
/// </summary>
/// </memberMethod>

function Calendar_fnHide() 
{
	if (this.blnIsPopUp) 
	{
	//	Calendar.removeEvent(document, "keydown", this.fnKeyEvent);
	//	Calendar.removeEvent(document, "keypress", this.fnKeyEvent);
		Calendar.removeEvent(document, "mousedown", this.fnCheckCalendar);
		Calendar.removeEvent(document,"mouseover",this.fnDayMouseOver);
		oJSFW.fnDetachEvent("mouseover",this.fnDayMouseOver);
	}
	this.element.style.display = "none";
	this.blnIsHidden = true;
	this.fnHideShowCovered();
}
/// <memberMethod name="Calendar_fnShowAt">
///	<param name=intXPos>It will accept the  X Coordinate</param>
///	<param name=intYPos>It will accept the  Y Coordinate</param>
/// <summary>Shows the calendar at a given absolute position. depending on
///  the calendar element style -- position property -- this might be relative
///  to the parent'strComboStyle containing rectangle.
///  element.
/// </summary>
/// </memberMethod>
function Calendar_fnShowAt(intXPos, intYPos) 
{
	var strComboStyle = this.element.style;
	strComboStyle.left = intXPos + "px";
	strComboStyle.top = intYPos + "px";
	this.fnShow();
}
/// <memberMethod name="Calendar_fnShowAtElement">
///	<param name=oElement>It will accept the  Element</param>
///	<param name=opts>It will accept the option like top,bottom etc</param>
/// <summary>It will Shows the calendar near a given element.
/// </summary>
/// </memberMethod>

function Calendar_fnShowAtElement(oElement, opts) 
{
	var self = this;
	var intAbsolutePos = Calendar.getAbsolutePos(oElement);
	
	this.element.style.top = intAbsolutePos.y  + oElement.offsetHeight;
	this.element.style.left = intAbsolutePos.x;
	
	
	if (!opts || typeof opts != "string") 
	{
		this.fnShowAt(intAbsolutePos.x, intAbsolutePos.y + oElement.offsetHeight);
		return true;
	}
	
	function fixPosition(oDivBox) 
	{
		if (oDivBox.x < 0)
			oDivBox.x = 0;
		if (oDivBox.y < 0)
			oDivBox.y = 0;
		var oDivElement = oJSFW.fnCreateElement("div",document);
		var strComboStyle = oDivElement.style;
		strComboStyle.position = "absolute";
		strComboStyle.right = strComboStyle.bottom = strComboStyle.width = strComboStyle.height = "0px";
		oJSFW.fnAppendChild(document.body,oDivElement);
		var intAbsolutePosition = Calendar.getAbsolutePos(oDivElement);
		document.body.removeChild(oDivElement);
		if (Calendar.is_ie) 
		{
			intAbsolutePosition.y += document.body.scrollTop;
			intAbsolutePosition.x += document.body.scrollLeft;
		} 
		else 
		{
			intAbsolutePosition.y += window.scrollY;
			intAbsolutePosition.x += window.scrollX;
		}
		var tmp = oDivBox.x + oDivBox.width - intAbsolutePosition.x;
		if (tmp > 0) oDivBox.x -= tmp;
		tmp = oDivBox.y + oDivBox.height - intAbsolutePosition.y;
		if (tmp > 0) oDivBox.y -= tmp;
	};
	
	this.element.style.display = "";
	
	Calendar.continuation_for_the_khtml_browser = function() 
	{
		var intOffsetWidth = self.element.offsetWidth;
		var h = self.element.offsetHeight;
		self.element.style.display = "none";
		var valign = opts.substr(0, 1);
		var halign = "l";
		if (opts.length > 1) 
		{
			halign = opts.substr(1, 1);
		}
		///-- vertical alignment
		switch (valign) 
		{
		    case "T": 
				intAbsolutePos.y -= h; 
				break;
		    case "B": 
				intAbsolutePos.y += oElement.offsetHeight; 
				break;
		    case "C": 
				intAbsolutePos.y += (oElement.offsetHeight - h) / 2; 
				break;
		    case "t": 
				intAbsolutePos.y += oElement.offsetHeight - h; 
				break;
		    case "b": 
				break; // already there
		}
		///-- horizontal alignment
		switch (halign) 
		{
		    case "L": 
				intAbsolutePos.x -= intOffsetWidth; 
				break;
		    case "R": 
				intAbsolutePos.x += oElement.offsetWidth; 
				break;
		    case "C": 
				intAbsolutePos.x += (oElement.offsetWidth - intOffsetWidth) / 2; 
				break;
		    case "r": 
				intAbsolutePos.x += oElement.offsetWidth - intOffsetWidth; 
				break;
		    case "l": 
				break; // already there
		}
		intAbsolutePos.width = intOffsetWidth;
		intAbsolutePos.height = h + 40;
		self.oCboOfMonths.style.display = "none";
		fixPosition(intAbsolutePos);
		self.fnShowAt(intAbsolutePos.x, intAbsolutePos.y);
	};
	
	if (Calendar.is_khtml)
		setTimeout("Calendar.continuation_for_the_khtml_browser()", 10);
	else
		Calendar.continuation_for_the_khtml_browser();
}
/// <memberMethod name="Calendar_fnSetDateFormat">
///	<param name=strDateFromat>It will accept the date format</param>
/// <summary>Customizes the date format.
/// </summary>
/// </memberMethod>

function Calendar_fnSetDateFormat(strDateFromat) 
{
	this.strDateFormat = strDateFromat;
}
/// <memberMethod name="Calendar_fnSetTtDateFormat">
///	<param name=strTimeDateFormat>It will accept the time-date format</param>
/// <summary>It will Customizes the tooltip date format.
/// </summary>
/// </memberMethod>

function Calendar_fnSetTtDateFormat(strTimeDateFormat) 
{
	this.strTimeDateFormat = strTimeDateFormat;
}
/// <memberMethod name="Calendar_fnParseDate">
///	<param name=str>It will accept the date string</param>
///	<param name=fmt>It will accept the format of date</param>
/// <summary>It will identify the date represented in a string.  If successful it also
///  calls this.fnSetDate which moves the calendar to the given date.
/// </summary>
/// </memberMethod>
function Calendar_fnParseDate(str, fmt) 
{
	var y = 0;
	var m = -1;
	var d = 0;
	var a = str.split(/\W+/);
	if (!fmt) 
	{
		fmt = this.strDateFormat;
	}
	var b = fmt.match(/%./g);
	var i = 0, j = 0;
	var hr = 0;
	var min = 0;
	for (i = 0; i < a.length; ++i) 
	{
		if (!a[i])
			continue;
		switch (b[i]) 
		{
		    case "%d":
		    case "%e":
				d = parseInt(a[i], 10);
				break;
		    case "%m":
				m = parseInt(a[i], 10) - 1;
				break;
		    case "%Y":
		    case "%y":
				y = parseInt(a[i], 10);
				(y < 100) && (y += (y > 29) ? 1900 : 2000);
				break;
		    case "%b":
		    case "%B":
				for (j = 0; j < 12; ++j) 
				{
					if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; }
				}
				break;
		    case "%H":
		    case "%I":
		    case "%k":
		    case "%l":
				hr = parseInt(a[i], 10);
				break;
		    case "%P":
		    case "%p":
				if (/pm/i.test(a[i]) && hr < 12)
					hr += 12;
				break;
		    case "%M":
				min = parseInt(a[i], 10);
				break;
		}
	}
	if (y != 0 && m != -1 && d != 0) 
	{
		this.fnSetDate(new Date(y, m, d, hr, min, 0));
		return;
	}
	y = 0; m = -1; d = 0;
	for (i = 0; i < a.length; ++i) 
	{
		if (a[i].search(/[a-zA-Z]+/) != -1) 
		{
			var t = -1;
			for (j = 0; j < 12; ++j) 
			{
				if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
			}
			if (t != -1) 
			{
				if (m != -1) 
				{
					d = m+1;
				}
				m = t;
			}
		} 
		else if (parseInt(a[i], 10) <= 12 && m == -1) 
		{
			m = a[i]-1;
		} 
		else if (parseInt(a[i], 10) > 31 && y == 0) 
		{
			y = parseInt(a[i], 10);
			(y < 100) && (y += (y > 29) ? 1900 : 2000);
		} 
		else if (d == 0) 
		{
			d = a[i];
		}
	}
	if (y == 0) 
	{
		var strCurrentDate = new Date();
		y = strCurrentDate.getFullYear();
	}
	if (m != -1 && d != 0) 
	{
		this.fnSetDate(new Date(y, m, d, hr, min, 0));
	}
}
/// <memberMethod name="Calendar_fnHideShowCovered">
/// <summary>
/// </summary>
/// </memberMethod>

function Calendar_fnHideShowCovered() 
{
	var self = this;
	
	Calendar.continuation_for_the_khtml_browser = function() 
	{
		function getVisib(obj)
		{
			var value = obj.style.visibility;
			if (!value) 
			{
				if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") 
				{ // Gecko, W3C
					if (!Calendar.is_khtml)
						value = document.defaultView.getComputedStyle(obj, "").getPropertyValue("visibility");
					else
						value = '';
				} 
				else if (obj.currentStyle) 
				{ // IE
					value = obj.currentStyle.visibility;
				} 
				else
					value = '';
			}
			return value;
		};

		var oArrTags =oJSFW.fnObjectInitializer('Array',"",["select"]);
		var oElement = self.element;

		var p = Calendar.getAbsolutePos(oElement);
		var EX1 = p.x;
		var EX2 = oElement.offsetWidth + EX1;
		var EY1 = p.y;
		var EY2 = oElement.offsetHeight + EY1;

		for (var k = oArrTags.length; k > 0; ) 
		{
			var oArrOfTagName = oJSFW.fnGetElementsByTagName(oArrTags[--k],document);
			var strTagName = null;

			for (var i = oArrOfTagName.length; i > 0;) 
			{
				strTagName = oArrOfTagName[--i];

				p = Calendar.getAbsolutePos(strTagName);
				var CX1 = p.x;
				var CX2 = strTagName.offsetWidth + CX1;
				var CY1 = p.y;
				var CY2 = strTagName.offsetHeight + CY1;

				if (self.blnIsHidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) 
				{
					if (!strTagName.__msh_save_visibility) 
					{
						strTagName.__msh_save_visibility = getVisib(strTagName);
					}
					strTagName.style.visibility = strTagName.__msh_save_visibility;
				} 
				else 
				{
					if (!strTagName.__msh_save_visibility) 
					{
						strTagName.__msh_save_visibility = getVisib(strTagName);
					}
					strTagName.style.visibility = "hidden";
				}
			}
		}
	};
	
	if (Calendar.is_khtml)
		setTimeout("Calendar.continuation_for_the_khtml_browser()", 10);
	else
		Calendar.continuation_for_the_khtml_browser();
}
/// <memberMethod name="Calendar_fnDisplayWeekdays">
/// <summary>It will displays the bar with the names of the weekday
/// </summary>
/// </memberMethod>

function Calendar_fnDisplayWeekdays() 
{
	var fdow = this.intFirstDayOfWeek;
//	var oCell = this.firstdayname;
	var oCell;
	var oCalTemplate = this.oCalendarTemplate;
	var weekend = Calendar._TT["WEEKEND"];
	for (var i = 0; i < this.intNoOfDays; ++i) 
	{
		oCell = oJSFW.fnGetElementById('tdWeekDayTitle'+(i+1));
		oCell.className = oCalTemplate.enumClassesForWeekDays.WeekDayClass;
		var realday = (i + fdow) % 7;
		if (i) 
		{
			
			oCell.ttip = Calendar._TT["DAY_FIRST"].replace("%strComboStyle", Calendar._DN[realday]);
			oCell.navtype = 100;
			oCell.calendar = this;
			oCell.fdow = realday;
			this.fnAddEvent(oCell);
		}
		if (weekend.indexOf(realday.toString()) != -1) 
		{
			if(weekend.indexOf(realday.toString())==0)
			{
				oJSFW.fnGetElementById('tdWeekDayTitle1').fdow = 0;
			}
			else if(weekend.indexOf(realday.toString())==6)
			{
				oJSFW.fnGetElementById('tdWeekDayTitle6').fdow = 6;
			}
			Calendar.addClass(oCell,oCalTemplate.enumClassesForWeekDays.WeekEndClass);
		}
		oJSFW.fnSetInnerText(oCell,Calendar._SDN[(i + fdow) % 7]);
		//oCell.innerText = Calendar._SDN[(i + fdow) % 7];
		
	}
}
/// <memberMethod name="Calendar_fnHideCombos">
/// <summary>Hides all combo boxes that might be displayed.
/// </summary>
/// </memberMethod>

function Calendar_fnHideCombos() 
{
	this.oCboOfMonths.style.display = "none";
	this.oCboOfYears.style.display = "none";
}
/// <memberMethod name="Calendar_fnDragStart">
///	<param name=oEvent>It will accept the  Element</param>
///	<param name=opts>It will accept the option like top,bottom etc</param>
/// <summary>It will Starts Dragging the element.
/// </summary>
/// </memberMethod>

function Calendar_fnDragStart(oEvent) 
{
	if (this.blnIsDragging) 
	{
		return;
	}
	
	//Commented By Viral Shah for Removing Dragging Functionality of Calender.
	//this.blnIsDragging = true;
	var intXPosition;
	var intYPosition;
	if (Calendar.is_ie) 
	{
		intYPosition = window.event.clientY + document.body.scrollTop;
		intXPosition = window.event.clientX + document.body.scrollLeft;
	} 
	else 
	{
		intYPosition = oEvent.clientY + window.scrollY;
		intXPosition = oEvent.clientX + window.scrollX;
	}
	var oElementStyle = this.element.style;
	this.xOffs = intXPosition - parseInt(oElementStyle.left);
	this.yOffs = intYPosition - parseInt(oElementStyle.top);
	with (Calendar) 
	{
		addEvent(document, "mousemove", this.fnCalDragIt);
		addEvent(document, "mouseup", this.fnCalDragEnd);
	}
}

}

Date._MD = oJSFW.fnObjectInitializer('Array','',[31,28,31,30,31,30,31,31,30,31,30,31]);

/** Constants used for time computations */
Date.SECOND = 1000 /* milliseconds */;
Date.MINUTE = 60 * Date.SECOND;
Date.HOUR   = 60 * Date.MINUTE;
Date.DAY    = 24 * Date.HOUR;
Date.WEEK   =  7 * Date.DAY;

/** Returns the number of days in the current strMonth */
Date.prototype.getMonthDays = function(strMonth) 
{
	var strYear = this.getFullYear();
	if (typeof strMonth == "undefined") 
	{
		strMonth = this.getMonth();
	}
	if (((0 == (strYear%4)) && ( (0 != (strYear%100)) || (0 == (strYear%400)))) && strMonth == 1) 
	{
		return 29;
	} 
	else 
	{
		return Date._MD[strMonth];
	}
};

/** Returns the number of day in the year. */
Date.prototype.getDayOfYear = function() 
{
	var strCurrntDate = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
	var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
	var strTime = strCurrntDate - then;
	return Math.floor(strTime / Date.DAY);
};

/** Returns the number of the week in year, as defined in ISO 8601. */
Date.prototype.getWeekNumber = function() 
{
	var dtDate = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
	var DoW = dtDate.getDay();
	dtDate.setDate(dtDate.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
	var ms = dtDate.valueOf(); // GMT
	dtDate.setMonth(0);
	dtDate.setDate(4); // Thu in Week 1
	return Math.round((ms - dtDate.valueOf()) / (7 * 864e5)) + 1;
};

/** Checks dates equality (ignores time) */
Date.prototype.equalsTo = function(date) 
{
	return ((this.getFullYear() == date.getFullYear()) &&
		(this.getMonth() == date.getMonth()) &&
		(this.getDate() == date.getDate()) &&
		(this.getHours() == date.getHours()) &&
		(this.getMinutes() == date.getMinutes()));
};

/** Prints the date in a string according to the given format. */
Date.prototype.print = function (str) 
{
	var m = this.getMonth();
	var d = this.getDate();
	var y = this.getFullYear();
	var wn = this.getWeekNumber();
	var w = this.getDay();
	var strComboStyle = {};
	var hr = this.getHours();
	var pm = (hr >= 12);
	var ir = (pm) ? (hr - 12) : hr;
	var dy = this.getDayOfYear();
	if (ir == 0)
		ir = 12;
	var min = this.getMinutes();
	var sec = this.getSeconds();
	strComboStyle["%a"] = Calendar._SDN[w]; // abbreviated weekday name [FIXME: I18N]
	strComboStyle["%A"] = Calendar._DN[w]; // full weekday name
	strComboStyle["%b"] = Calendar._SMN[m]; // abbreviated strMonth name [FIXME: I18N]
	strComboStyle["%B"] = Calendar._MN[m]; // full strMonth name
	// FIXME: %c : preferred date and time representation for the current locale
	strComboStyle["%C"] = 1 + Math.floor(y / 100); // the century number
	strComboStyle["%d"] = (d < 10) ? ("0" + d) : d; // the day of the strMonth (range 01 to 31)
	strComboStyle["%e"] = d; // the day of the strMonth (range 1 to 31)
	// FIXME: %D : american date style: %m/%d/%y
	// FIXME: %E, %F, %G, %g, %h (man strftime)
	strComboStyle["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
	strComboStyle["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
	strComboStyle["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
	strComboStyle["%k"] = hr;		// hour, range 0 to 23 (24h format)
	strComboStyle["%l"] = ir;		// hour, range 1 to 12 (12h format)
	strComboStyle["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); // strMonth, range 01 to 12
	strComboStyle["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
	strComboStyle["%n"] = "\n";		// a newline character
	strComboStyle["%p"] = pm ? "PM" : "AM";
	strComboStyle["%P"] = pm ? "pm" : "am";
	// FIXME: %r : the time in am/pm notation %I:%M:%S %p
	// FIXME: %R : the time in 24-hour notation %H:%M
	strComboStyle["%strComboStyle"] = Math.floor(this.getTime() / 1000);
	strComboStyle["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
	strComboStyle["%t"] = "\t";		// a tab character
	// FIXME: %T : the time in 24-hour notation (%H:%M:%S)
	strComboStyle["%U"] = strComboStyle["%W"] = strComboStyle["%V"] = (wn < 10) ? ("0" + wn) : wn;
	strComboStyle["%u"] = w + 1;	// the day of the week (range 1 to 7, 1 = MON)
	strComboStyle["%w"] = w;		// the day of the week (range 0 to 6, 0 = SUN)
	// FIXME: %x : preferred date representation for the current locale without the time
	// FIXME: %X : preferred time representation for the current locale without the date
	strComboStyle["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99)
	strComboStyle["%Y"] = y;		// year with the century
	strComboStyle["%%"] = "%";		// a literal '%' character

	var re = /%./g;
	if (!Calendar.is_ie5)
		return str.replace(re, function (par)
								{ 
									return strComboStyle[par] || par; 
								});

	var a = str.match(re);
	for (var i = 0; i < a.length; i++) 
	{
		var tmp = strComboStyle[a[i]];
		if (tmp) 
		{
			re = new RegExp(a[i], 'g');
			str = str.replace(re, tmp);
		}
	}

	return str;
};

Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;

Date.prototype.setFullYear = function(strYear) 
{
	var dtDate = new Date(this);
	dtDate.__msh_oldSetFullYear(strYear);
	if (dtDate.getMonth() != this.getMonth())
		this.fnSetDate(28);
	this.__msh_oldSetFullYear(strYear);
};
//Added by Kavita

Calendar.validateDateTxBx = function(strFunction,strTxtToValidate,blnAutoValidate) 
{

	if (blnAutoValidate == false)//false)
	{
		eval(strFunction + "(strTxtToValidate)");
			
	}	
	else
	{
		var strFormat="";
		var strSeperator="";
		eval(Calendar.fnCheckDate(strTxtToValidate,strFormat,strSeperator));
	}
	
};




// BEGIN: DATE OBJECT PATCHES

/** Adds the number of days array to the Date object. */

// END: DATE OBJECT PATCHES

//Added by Kavita



// global object that remembers the calendar
window.calendar = null;

