YAHOO.widget.CalendarGroup.prototype.renderCellNotThisMonth = function(workingDate, cell)  {
	YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_OOM); 
	return YAHOO.widget.Calendar.STOP_RENDER;
}

YAHOO.namespace("calendarUtil");
YAHOO.calendarUtil.module = function () {
	//private shorthand references to YUI utilities:
	var yue = YAHOO.util.Event,
		yud = YAHOO.util.Dom,
		yuc = YAHOO.widget.CalendarGroup,
		yum = YAHOO.widget.DateMath;
	var calendarFocus = false;
	var currentField = "";
	var minDate = "";
	var maxDate = "";
	var dateFormatPattern = "";
	var dateRange = "";
	var section = "";
	var yearMonthDisplay = "";
	var monthPosition = "1";	
	var yearPosition = "2";	
	var yearSuffix = "";
	var fromAndToDtHash = new Array() ;

	return  {
		init: function () {
			var monthNames = "" ;
			var weekDays   = "" ;
			
			var elParent = document.body.firstChild;
			var calContainer = document.createElement("DIV");
			
			calContainer.id = "calContainer";
			elParent.parentNode.insertBefore(calContainer,elParent);
			
			if(yud.get("monthNames")) {
				monthNames = yud.get("monthNames").value.split(",");
			}
			
			if(yud.get("weekDays")) {
				weekDays = yud.get("weekDays").value.split(",");
			}
			if(yud.get("minDate")) {
				minDate = yud.get("minDate").value;
			}
			if(yud.get("maxDate")) {
				maxDate = yud.get("maxDate").value;
			}

			if(yud.get("section")) {
				section = yud.get("section").value;
			}

			if(yud.get("yearMonthDisplay")) {
				yearMonthDisplay = yud.get("yearMonthDisplay").value;
				if(yearMonthDisplay == 'Y'){
					yearPosition = "1";	
					monthPosition = "2";	
				}
				yearSuffix =  yud.get("yearSuffix").value;
			}

			dateFormatPattern = this.getDateFormatPattern() ;

			dateRange = {
				from:new Date(minDate), 
				to:new Date(maxDate)
			}
			var attributes = {
				pages : 2,
				mindate : minDate,
				maxdate : maxDate,
				MONTHS_LONG : monthNames,
				WEEKDAYS_1CHAR : weekDays,
				HIDE_BLANK_WEEKS : true,
				LOCALE_WEEKDAYS : "1char",
				MY_LABEL_YEAR_POSITION: yearPosition,
				MY_LABEL_MONTH_POSITION: monthPosition,
				MY_LABEL_YEAR_SUFFIX: yearSuffix, 
				close: true
			};
			var cal = new yuc("calendarObj", calContainer.id, attributes);
			cal.beforeRenderEvent.subscribe(this.setDateRange, cal, true)
			cal.renderEvent.subscribe(this.displayDateRange, cal, true);
			cal.selectEvent.subscribe(this.selectedDate, cal, true);
			yue.on(cal.containerId, 'mouseover', this.over, cal, true);
    		yue.on(cal.containerId, 'mouseout', this.out, cal, true);
			yue.on(this.getDateFields(), 'click', this.show, cal, true);
			yue.on(this.getDateFields(), 'focus', this.show, cal, true);
			yue.on(this.getDateFields(), 'blur', this.hide, cal, true);

			//Events and meeting specific functionality. Honestly, I never wanted to build this functionality into this file,
			//but there was no other way of implementing and hadddddd to code it here (:-
			if(section == "emsearch"){
				yue.on(this.getDateFields(), 'change', this.performEMSearchFormDtOnChange, cal, true);
			}else if(section != "emrfp"){
				//For E&M RFP, the E&M js defines the onchange function
				yue.on(this.getDateFields(), 'change', this.hideAndPrePop, cal, true);
			}
			
			//This is required in order to populate the todate based on fromdate value
			fromAndToDtHash = this.getDateFiedsHashTable() ;

			cal.render();
		},
		over: function (type, args, cal) {
			calendarFocus = true; 
		},
		out: function (type, args, cal) {
			calendarFocus = false; 
		},
		selectedDate: function(type, args, cal) {
			var calDate = this.getSelectedDates()[0];
			calDate = (calDate.getMonth() + 1) + '/' + calDate.getDate() + '/' + calDate.getFullYear();
			currentField.value = formatDate(calDate,dateFormatPattern);
			//If defaultToDateDays is not null ,prepopulate the toDate field based on the from date value
			YAHOO.calendarUtil.module.prePopToDate(calDate,currentField,false) ;

			calendarFocus = false;
			YAHOO.calendarUtil.module.hide(type, args, cal);
			//Events and meeting specific functionality
			if(section == "emsearch"){
				YAHOO.calendarUtil.module.performEMEventOnDtSelection(currentField);
			}else if(section == "emrfp"){
				YAHOO.calendarUtil.module.performEMRfpEvent();
			}
		},
		show: function(type, args, cal) {
			var tar = yue.getTarget(type);
    		currentField = tar;
    		var xy = yud.getXY(tar);
    		var date = yud.get(tar).value;
			var container = yud.get(this.containerId); 
			var dateObj ;
			var coordinates = YAHOO.calendarUtil.module.getPosition(tar, container) ;

    		if (date) {
				var validDate = true ;
				if(!isDateValid(date,dateFormatPattern) || 
				isDateLessThanDate1(date,formatDate(minDate,dateFormatPattern),dateFormatPattern) || 
				isDateGreaterThanDate1(date,formatDate(maxDate,dateFormatPattern),dateFormatPattern) ){
					validDate = false ;
				}

				if(validDate){
					//If the user enters date in different format, convert to 
					//'mm/dd/yy' in order for the calendar to render properly.
					date = dateInMMDDYYFormat(date,dateFormatPattern) ;
					this.cfg.setProperty('selected', date);
					dateObj = new Date(date) ;
				}
				else {
					this.cfg.setProperty('selected', '');
					//On travel agents commission search page, the calendar needs to displayed backwards
					if(section == "tacomm"){
						dateObj = new Date(maxDate) ;
					}else{
						dateObj = new Date() ;
					}
				}
				this.setMonth(dateObj.getMonth());
				this.setYear(dateObj.getFullYear());
        		this.render();
    		} 
			else {
        		this.cfg.setProperty('selected', '');
				//For travel agents commission search page, the calendar needs to displayed backwards
				if(section == "tacomm"){
					dateObj = new Date(maxDate) ;
				}else{
					dateObj = new Date() ;
				}
				this.setMonth(dateObj.getMonth());
				this.setYear(dateObj.getFullYear());
        		this.render();
    		}
    		yud.setStyle(this.containerId, 'display', 'block');
			yud.setX(this.containerId, coordinates.x);
			yud.setY(this.containerId, coordinates.y);
			
		},
		hideAndPrePop: function(type, args, cal) {
			if (!calendarFocus) {
				yud.setStyle(this.containerId, 'display', 'none');
			}

			var currentField = yue.getTarget(type);
			YAHOO.calendarUtil.module.prePopToDate('',currentField,true) ;

		},
		hide: function(type, args, cal) {
			if (!calendarFocus) {
				if(cal != undefined){
					yud.setStyle(cal.containerId, 'display', 'none');
				}else{
					yud.setStyle(this.containerId, 'display', 'none');
				}
			}
		},
		setDateRange: function (type, args, cal) {
			var pagedate = this.cfg.getProperty("pagedate");
			if (yum.before(pagedate, dateRange.from)) {
				this.cfg.setProperty("pagedate", dateRange.from);
			}
			if (yum.after(pagedate, dateRange.to)) {
				this.cfg.setProperty("pagedate", dateRange.to);
			}
		},
		displayDateRange: function (type, args, cal) {
			var leftArrow = yud.getElementsByClassName(this.Style.CSS_NAV_LEFT, null, this.oDomContainer)[0];
			var rightArrow = yud.getElementsByClassName(this.Style.CSS_NAV_RIGHT, null, this.oDomContainer)[0];

			var pagedate0 = cal.pages[0].cfg.getProperty("pagedate");
			var pagedate1 = cal.pages[1].cfg.getProperty("pagedate");

			if (pagedate0.getMonth() == dateRange.from.getMonth() && pagedate0.getFullYear() == dateRange.from.getFullYear()) {
				yud.setStyle(leftArrow, "visibility", "hidden");
			} else {
				yud.setStyle(leftArrow, "visibility", "visible");
			}

			if (pagedate1.getMonth() == dateRange.to.getMonth() && pagedate1.getFullYear() == dateRange.to.getFullYear()) {
				yud.setStyle(rightArrow, "visibility", "hidden");
			} else {
				yud.setStyle(rightArrow, "visibility", "visible");
			}
			
			if (pagedate0.getMonth() == dateRange.to.getMonth() && pagedate0.getFullYear() == dateRange.to.getFullYear()) {
				yud.setStyle(rightArrow, "visibility", "hidden");
			}
		},
		getPosition: function (target, obj) {
			var x = yud.getX(target);
			var y = yud.getY(target);
			
			var containerHeight = obj.offsetHeight;

			var maxXPos = x+330;
			var maxYPos = y + containerHeight;

			var screenWidth = 0 ;
			var screenWidth = yud.getViewportWidth();
			var screenHeight = yud.getViewportHeight();

			var top = (document.documentElement.scrollTop ? document.documentElement.scrollTop :document.body.scrollTop);
			var left = (document.documentElement.scrollLeft ? document.documentElement.scrollLeft :document.body.scrollLeft);
			var viewTop = parseInt(screenHeight + top);
			var viewLeft = parseInt(screenWidth + left);
			var coordinates = new Object();

			if(viewLeft >= maxXPos){
				coordinates.x = x;
			} 
			else {
				coordinates.x = x - 325;
			}

			if ( viewTop >= maxYPos ) {
				coordinates.y = y + 16;
			}
			else {
				coordinates.y = y - (containerHeight - 1);
			}
			return coordinates ;
		},
		getDateFields: function () {
			var date1Fields = this.getDate1Fields() ;
			var date2Fields = this.getDate2Fields() ;
			var dateFields = date1Fields.concat(date2Fields) ;
			return dateFields ;
		},
		getDate1Fields: function () {
			var date1Fields = new Array() ;
			date1Fields = document.getElementsByName("date1Field") ;
			var length = date1Fields.length ;
			var tempArray = new Array() ;
			for (var i = 0; i < length; i++) 
			{
				tempArray[i] = date1Fields[i].value ;
			}
			return tempArray ;
		},
		getDate2Fields: function () {
			var date2Fields = new Array() ;
			date2Fields = document.getElementsByName("date2Field") ;
			var length = date2Fields.length ;
			var tempArray = new Array() ;
			for (var i = 0; i < length; i++) 
			{
				tempArray[i] = date2Fields[i].value ;
			}

			return tempArray ;
		},
		getDateFormatPattern: function () {
			var dateFormatPattern = "" ;
			var dfpFields = new Array() ;
			dfpFields = document.getElementsByName("dateFormatPattern") ;
			if(dfpFields != null && dfpFields.length > 0){
				dateFormatPattern = dfpFields[0].value.toLowerCase() ;
			}
			
			return dateFormatPattern ;
		},
		getDateFiedsHashTable: function () {
			var fromAndToDtHash = new Array() ;
			var keys = new Array() ;

			var datelFields = this.getDate1Fields() ;
			var date2Fields = this.getDate2Fields() ;
			var date1FielsLen = datelFields.length ;
			for(i=0;i<date1FielsLen;i++){
				this.put(fromAndToDtHash,keys,datelFields[i],date2Fields[i]) ;
			}
			return fromAndToDtHash ;
		},
		put: function (fromAndToDtHash,keys,key,value){
			if (value == null)
				return null;

			if (fromAndToDtHash[key] == null){
				fromAndToDtHash[keys.length] = key;
			}

			fromAndToDtHash[key] = value;
		},
		prePopToDate: function (calDate,currentField,onblurEvent){
			if(yud.get("defaultToDateDays")) {
				var defaultToDateDays = yud.get("defaultToDateDays");
				var toDateFld = fromAndToDtHash[currentField.id] ;

				if(toDateFld != undefined){
					if(yud.get(toDateFld)){
						var currentToDate = '' ;
						if(onblurEvent){
							calDate = yud.get(currentField).value ;
							if(calDate != null && calDate != '' && isDateValid(calDate,dateFormatPattern)){
								var commaDelimitedDate = getCommaDelimitedDate(calDate,dateFormatPattern) ;
								var dateArr = commaDelimitedDate.split(",") ;
								calDate = dateArr[1]+"/"+dateArr[2]+"/"+dateArr[0] ;
							}else{
								calDate = ''; 
							}
						}
						if((calDate != null && calDate.length > 0) && 
							isDateLessThanOrEqualToDate1(calDate,maxDate,"mm/dd/yy")){
							//If to date is null,invalid or is less than from date, make todate = fromDate + defaultToDateDays
							currentToDate = yud.get(toDateFld).value ;
							if((currentToDate == null || currentToDate == '' ) || 
								!isDateValid(currentToDate,dateFormatPattern) ||
								!isDateGreaterThanDate1(dateInMMDDYYFormat(currentToDate,dateFormatPattern),calDate,"mm/dd/yy") ){
								var toDate = new Date(calDate) ;
								toDate.setDate(toDate.getDate()+parseInt(defaultToDateDays.value)) ;
								toDate = (toDate.getMonth() + 1) + '/' + toDate.getDate() + '/' + toDate.getFullYear();
								yud.get(toDateFld).value = formatDate(toDate,dateFormatPattern);
							}
						}
					}
				}
			}
		},
		performEMSearchFormDtOnChange: function (type, args, cal) {
			this.hide() ;
			var tar = yue.getTarget(type);
			YAHOO.calendarUtil.module.performEMEvent(tar.id) ;
		},
		performEMEventOnDtSelection: function (fieldName) {
			YAHOO.calendarUtil.module.performEMEvent(fieldName.id) ;
		},
		performEMEvent: function (fieldName) {
			var date1Fields =  YAHOO.calendarUtil.module.getFromDateHashTable() ;
			var date2Fields = YAHOO.calendarUtil.module.getToDateHashTable() ;
			var searchType = '' ;
			if(fieldName.indexOf("_")){
				var splitValue = fieldName.split("_");
				searchType = splitValue[1] ;
			}
			if(fieldName in date1Fields){
				arrivaldate_onchange('true',searchType) ;
			}else if(fieldName in date2Fields){
				departuredate_onchange('true',searchType) ;
			}
		},
		performEMRfpEvent: function () {
			marriott.meetings.groupSales.eventdates.validateEventDate();
		},
		getFromDateHashTable: function () {
			var fromDtHash = new Array() ;
			var keys = new Array() ;

			var datelFields = this.getDate1Fields() ;
			var date1FielsLen = datelFields.length ;
			for(i=0;i<date1FielsLen;i++){
				this.put(fromDtHash,keys,datelFields[i],datelFields[i]) ;
			}
			return fromDtHash ;
		},

		getToDateHashTable: function () {
			var toDtHash = new Array() ;
			var keys = new Array() ;

			var date2Fields = this.getDate2Fields() ;
			var date2FielsLen = date2Fields.length ;
			for(i=0;i<date2FielsLen;i++){
				this.put(toDtHash,keys,date2Fields[i],date2Fields[i]) ;
			}
			return toDtHash ;
		}

	};
}();

YAHOO.util.Event.onAvailable("minDate",YAHOO.calendarUtil.module.init, YAHOO.calendarUtil.module, true,true);
