var debug=false;
newCalendarDotjsIncluded=true;
//before screwing up something, learn that the month function calls is in numbers not month js index

function NewCalendar(controlName){
	var _isSingleDate = false;
	var _prefix=controlName;
	var _checkinDate = new Date();
	var _checkoutDate= new Date();
	var _eventOpenCheckIn="";
	var _eventOpenCheckOut="";
	var _selectedCheckIn="";
	var _selectedCheckOut="";
	var _releasePeriod=1;		
	var _duration=3;
	var _panelDrawn=false;
	var _startMonthString = "";
	var _viewableMonth="";
		

	this.set_isSingleDate=function (val){
		_isSingleDate = val;
	}
	this.get_isSingleDate=function (){
		return _isSingleDate ;
	}


	this.set_checkinDate=function(val){
	
		if (this._static_isDate(val)){
			_checkinDate = new Date(val + " 10:0:0"); //month/day/year hours:minutes:seconds
			_checkoutDate = this._static_addDays (_checkinDate,_duration);
			updateDates();
		}else{
			if(debug){
				//alert("invalid date in checkindate assignment");				
			}
		}
	}
	

	this.get_checkinDate=function(){
		return _checkinDate;
	}
	

	this.set_checkoutDate=function(val){
		if (this._static_isDate(val)){
			if (new Date(val)>_checkinDate ){
				if ( this._static_subtractDates(val,_checkinDate)<=30){
					_checkoutDate = new Date(val + " 10:0:0");			
					_duration = this._static_subtractDates(_checkoutDate,_checkinDate);
					updateDates();
				}else{
					showMessage("Duration cannot exceed 30 days.", 3, "", null, null);
				}
			}
			else{
				 showMessage("Checkout Date must be after checkin date.", 3, "", null, null);				
			}
		}else{
			if(debug){
				//alert("invalid date in checkout assignment");				
			}
		}
	}	
	this.get_checkoutDate= function (){
		return _checkoutDate;				
	}
	
	this.get_duration= function (){
		return _duration;		
	}
	
	this.set_duration= function (val){
		if(!isNaN(val)){
			_duration = val;
			_checkoutDate = this._static_addDays(_checkinDate,_duration);
			updateDates();			
		}
		
	}
	
	this.set_releasePeriod = function (val){
		if(!isNaN(val)){
			_releasePeriod = val;			
		}		
	}	
	this.get_releasePeriod = function(){
		return _releasePeriod;		
	}

	this.set_viewableMonth=function (month,year){
		_viewableMonth= month + "," + year;
		getItem (_prefix + "MonthCont1").innerHTML=  buildmonth(month,year,false,true).innerHTML;
		month++;
		if (month ==13){
			year ++;
			month =1;				
		}
		getItem (_prefix + "MonthCont2").innerHTML=  buildmonth(month,year,false,false).innerHTML;
	}
	
	this.get_viewableMonth = function (){
		return _viewableMonth;		
	}
	
		
	function updateDates(){
		if(_panelDrawn){
			getItem(_prefix + "_Checkin_Day").innerHTML = new Date(_checkinDate).getDate();
			getItem(_prefix + "_Checkin_MonthYear").innerHTML = myMonths[new Date(_checkinDate).getMonth()].substr(0,3)+ " " + new Date(_checkinDate).getFullYear().toString().substr(2,2);
			if (!_isSingleDate){
				getItem(_prefix + "_NightsCount").innerHTML =  _duration;
				getItem(_prefix + "_Checkout_Day").innerHTML = new Date(_checkoutDate).getDate();
				getItem(_prefix + "_Checkout_MonthYear").innerHTML =  myMonths[new Date(_checkoutDate).getMonth()].substr(0,3)+ " " + new Date(_checkoutDate).getFullYear().toString().substr(2,2);
			}
		}
	}
	

	this.buildCalendar =function(){
	
		var calendarContainer = document.getElementById(_prefix + "_CalendarContainerDiv");		
			
		if (_isSingleDate){
			calendarContainer.className="SingCalCon";							
		}else{
			calendarContainer.className="CalCon";
			calendarContainer.appendChild(getHeaderContent());
		}
		calendarContainer.appendChild(getScreenContent());
		
		var monthContainer = document.createElement("DIV");
		
		monthContainer.className = "CheckInPreview";
		monthContainer.id= _prefix + "monthContainer";		
		monthContainer.appendChild(buildMonthView());	
			
		monthContainer.appendChild (buildmonth(new Date(_checkinDate).getMonth()+1,new Date(_checkinDate).getFullYear(),true,true))
		var secondMonth =new Date(_checkinDate).getMonth()+2;
		var secondYear =new Date( _checkinDate).getFullYear();
		if (secondMonth ==13){
			secondYear ++;
			secondMonth =1;
		}
		monthContainer.appendChild (buildmonth(secondMonth,secondYear,false,false))
		var CancelButton = document.createElement ("p");
		CancelButton.className = "CalButton";
		var CancelButtonLink = document.createElement ("a");
		CancelButtonLink.innerHTML="Cancel";
		CancelButtonLink.href="javascript:" + _prefix + "_Cal.hideCalendar();";
		CancelButton.appendChild (CancelButtonLink);		
		monthContainer.appendChild (CancelButton);
		monthContainer.style.display='none';
		monthContainer.id=_prefix + "_monthContainer";
		calendarContainer.appendChild(monthContainer);				
 		selectMonths(new Date(_checkinDate).getMonth()+1,new Date(_checkinDate).getFullYear());
		_panelDrawn=true;
		
		
		
	}
	
	
	function getHeaderContent(){
		var headerContainer = document.createElement("div");
		headerContainer.className="CalHeaders";
		
		var checkinHeader= document.createElement("p");
		checkinHeader.className="InHeader";
		checkinHeader.innerHTML="check in";
		headerContainer.appendChild(checkinHeader);
		
		var checkoutHeader= document.createElement("p");
		checkoutHeader.className="OutHeader";
		checkoutHeader.innerHTML="check out";
		headerContainer.appendChild(checkoutHeader);
		

		
		return headerContainer;
	}
	
	function getScreenContent(){
		var container =document.createElement("DIV");
		container.className="CalScrn";
				
		var checkinBlock=document.createElement("DIV");
		checkinBlock.className="CheckIn";
						
		var bigNumP= document.createElement("P");
		bigNumP.className="BigNum";
		
		var bigNumPA = document.createElement("A");
		bigNumPA.href="javascript:" + _prefix + "_Cal.showCalendar(true);";
		bigNumPA.id=_prefix + "_Checkin_Day";
		bigNumPA.innerHTML= new Date(_checkinDate).getDate();
		bigNumP.appendChild(bigNumPA);
		checkinBlock.appendChild(bigNumP);
		

		var smallNumP= document.createElement("P");
		smallNumP.className="SmallNum";
		
		var smallNumPA = document.createElement("A");
		smallNumPA.href="javascript:" + _prefix + "_Cal.showCalendar(true);";
		smallNumPA.id=_prefix + "_Checkin_MonthYear"
		smallNumPA.innerHTML= myMonths[new Date(_checkinDate).getMonth()].substr(0,3)+ " " + new Date(_checkinDate).getFullYear().toString().substr(2,2);
		smallNumP.appendChild(smallNumPA);
		checkinBlock.appendChild(smallNumP);
		
		var openCal= document.createElement("P");
		openCal.className="OpenCal";
		
		var openCalA = document.createElement("A");
		openCalA.href="javascript:" + _prefix + "_Cal.showCalendar(true);";
		openCal.appendChild(openCalA);		
		var arrowImageBlue = document.createElement("img");
		arrowImageBlue.src="/img/calendar/BluArrow.gif";	
		openCalA.appendChild(arrowImageBlue);
				
		checkinBlock.appendChild(openCal);
		
				
		
		container.appendChild(checkinBlock);
		

		if(!_isSingleDate){
			var divnights = document.createElement("DIV");
			divnights.className = "Nights";
			
			var divnightspBigNum = document.createElement("P");
			divnightspBigNum.className = "BigNum";
			divnightspBigNum.id= _prefix + "_NightsCount";
			divnightspBigNum.innerHTML= _duration;
			divnights.appendChild(divnightspBigNum);
			
			var divnightspSmallNum =document.createElement("P");
			divnightspSmallNum.className = "SmallNum";
			divnightspSmallNum.innerHTML="nights";			
			divnights.appendChild(divnightspSmallNum);
			container.appendChild(divnights);

		
					
			checkinBlock=document.createElement("DIV");
			checkinBlock.className="CheckOut";
			
			bigNumP= document.createElement("P");
			bigNumP.className="BigNum";
			
			bigNumPA = document.createElement("A");
			bigNumPA.href="javascript:" + _prefix + "_Cal.showCalendar(false);";
			bigNumPA.id=_prefix + "_Checkout_Day";
			bigNumPA.innerHTML=new Date(_checkoutDate).getDate();
			bigNumP.appendChild(bigNumPA);
			checkinBlock.appendChild(bigNumP);
			
			
			smallNumP= document.createElement("P");
			smallNumP.className="SmallNum";
			
			smallNumPA = document.createElement("A");
			smallNumPA.href="javascript:" + _prefix + "_Cal.showCalendar(false);";
			smallNumPA.id=_prefix + "_Checkout_MonthYear"
			smallNumPA.innerHTML= myMonths[new Date(_checkoutDate).getMonth()].substr(0,3)+ " " + new Date(_checkoutDate).getFullYear().toString().substr(2,2);			
			smallNumP.appendChild(smallNumPA);
			checkinBlock.appendChild(smallNumP);
			
			openCal= document.createElement("P");
			openCal.className="OpenCal";
			
			 openCalA = document.createElement("A");
			openCalA.href="javascript:" + _prefix + "_Cal.showCalendar(false);";
			var arrowImagePink = document.createElement("img");
			arrowImagePink.src="/img/calendar/PinkArrow.gif";		
			openCalA.appendChild(arrowImagePink);
			
			openCal.appendChild(openCalA);
			checkinBlock.appendChild(openCal);	
			
			
			container.appendChild(checkinBlock);			
			
		}
		return container;
	}
	
	function buildMonthView (){
		  var topMonths = document.createElement("div");
		  topMonths.className= "TopMonths";
		  
		  var previousMonths = document.createElement("a");
		  previousMonths.className = "PreviousYear";
		  //topMonths.appendChild(previousMonths);
		  
		  topMonths.appendChild(monthLinksList(new Date(_checkinDate).getMonth()+1,new Date(_checkinDate).getFullYear()));


		  var nextMonths = document.createElement("a");
		  nextMonths.className = "NextYear";
		  nextMonths.href = "javascript:" + _prefix +"_Cal.moveYear(" +  + "," + + ");";
		  //topMonths.appendChild(nextMonths);
		
		  return topMonths;

	}
	
	

	function monthLinksList (startMonth,startYear){
		var container = document.createElement ("UL");
		container.id=_prefix + "_monthView";
		_startMonthString  = startMonth + "," +startYear;
		for (var monthItrerator=0;monthItrerator < 12; monthItrerator++){
			var monthItem = document.createElement ("li")			
			var month = document.createElement ("a");
			month.innerHTML = myMonths[startMonth-1].substr(0,3)+ " " + startYear.toString().substr(2,2);			
			month.id = _prefix + "_month_" + startMonth.toString() + "_" + startYear.toString();			
			month.href =  "javascript:" + _prefix +  "_Cal.monthClick(" + (startMonth) + "," + startYear.toString() + ");";
			monthItem.appendChild (month);
			container.appendChild (monthItem);
			startMonth++;
			if (startMonth ==13){
				startYear ++;
				startMonth =1;				
			}
		}
		return container;		
	}
	
	function selectMonths(startMonth,startYear){
		try{
			getItem ( _prefix + "_month_" + startMonth.toString() + "_" + startYear.toString()).className="Active";
			startMonth++;
			if (startMonth ==13){
				startYear ++;
				startMonth =1;				
			}
			getItem ( _prefix + "_month_" + startMonth.toString() + "_" + startYear.toString()).className="Active";
		}catch(ex){
			if (debug){
				//alert ("month not in UI");				
			}			
		}
				
	}


	function buildmonth(month,year,isCheckin,isFirstMonth){
		var MonthContainer = document.createElement ("div");
		MonthContainer.className= "MonthCont";
		if (isFirstMonth)
			MonthContainer.id=_prefix +  "MonthCont1";
		else
			MonthContainer.id=_prefix +  "MonthCont2";
		var monthName= document.createElement ("P");
		monthName.className = "MonthHeader";
		monthName.innerHTML  = myMonths[month-1] + " " +  year.toString();
		MonthContainer.appendChild (monthName);
		
		var daysNames = document.createElement ("div");
		daysNames.className= "DayName";
		
		var daysNameParagraph  = document.createElement ("P");
		daysNameParagraph.innerHTML = "M T W T F ";
		
		var saturday = document.createElement ("Strong");
		saturday.innerHTML  ="S ";
		daysNameParagraph.appendChild (saturday);		
		
		var sunday  =document.createElement ("Strong");
		sunday.innerHTML = "S ";
		daysNameParagraph.appendChild (sunday);
		daysNames.appendChild (daysNameParagraph);
		
		MonthContainer.appendChild(daysNames);		
		
		var daysCount = document.createElement ("div");
		daysCount.className = "DaysCont";				
		
		var firstDayInMonth = new Date(year,month-1,1,10,0,0);
		var dayStartOfMonth= firstDayInMonth.getDay();
		var BlankCells=0;
		switch(dayStartOfMonth){
			case 1:
				BlankCells=0;
				break;
			case 2:
				BlankCells=1;
				break;
			case 3:
				BlankCells=2;
				break;
			case 4:
				BlankCells=3;
				break;
			case 5:
				BlankCells=4;
				break;
			case 6: 
				BlankCells=5;
				break;
			case 0:
				BlankCells=6;
				break;
		}		
		for (var blankDaysCounter=0;blankDaysCounter<BlankCells;blankDaysCounter++){
			emptyElement= document.createElement("P");
			emptyElement.innerHTML = "&nbsp;";
			daysCount.appendChild (emptyElement);
		}
		var tempCal =new NewCalendar("");
		
		
		var firstEnabledDay = tempCal._static_addDays(new Date(),_releasePeriod + 1); 
		for (var daysCounter=1;daysCounter<=tempCal._static_DaysInMonth(year,month);daysCounter++ ){
			if (firstEnabledDay > firstDayInMonth){
				var dumbElement= document.createElement("P");
				dumbElement.innerHTML = daysCounter.toString();
				daysCount.appendChild (dumbElement);
			}
			else{
				var dumbElement= document.createElement("P");
				dumbElement.id = _prefix + "_day_" + daysCounter.toString() + "_" + firstDayInMonth.getMonth() + "_" + firstDayInMonth.getFullYear(); 
				var clickable = document.createElement("A");
				clickable.href="javascript:" + _prefix + "_Cal.selectDate(" + (firstDayInMonth.getMonth()+1) + "," + daysCounter.toString() +"," + firstDayInMonth.getFullYear() +"," + isCheckin + ")";
				clickable.innerHTML = daysCounter.toString();
				dumbElement.appendChild(clickable);
				daysCount.appendChild (dumbElement);
			}
			firstDayInMonth = tempCal._static_addDays (firstDayInMonth,1);
		}
		MonthContainer.appendChild(daysCount);		
		return MonthContainer;
		
	}	


	this.setEvent=function (eventname,scriptToRun){
		switch(eventname){
			case "_eventOpenCheckIn":
				_eventOpenCheckIn = scriptToRun;
				break;
			case "_eventOpenCheckOut":
				_eventOpenCheckOut = scriptToRun;
				break;
			case "_selectedCheckIn":
				_selectedCheckIn = scriptToRun;
				break;
			case "_selectedCheckOut":
				_selectedCheckOut = scriptToRun;
				break;
			}
	}

	function saveState(){
		
	}
	
	
	function readState(){
		
	}
	
	this.moveYear= function (month,year){
		getItem(_prefix + "_monthView").innerHTML = monthLinksList(month,year).innerHTML;		
	}
		
	this.monthClick= function (month,year){
		var tempMonth =_startMonthString.split(",")[0]; 
		var tempYear =  _startMonthString.split(",")[1];
		for (var monthItrerator=0;monthItrerator < 12; monthItrerator++){
			getItem (_prefix + "_month_"  + tempMonth + "_" + tempYear ).className = "";
			tempMonth++;
			if (tempMonth ==13){
				tempYear ++;
				tempMonth =1;				
			}
		}
		selectMonths(month,year);
		this.set_viewableMonth (month,year);
		if (getItem(_prefix + "_monthContainer").className=="CheckInPreview" ){
			try{
			getItem (_prefix + "_day_" + new Date(_checkinDate).getDate() + "_" + new Date(_checkinDate).getMonth() + "_" + new Date(_checkinDate).getFullYear()).className="Active";
			}catch(ex){}					
		}else{
			try{
			getItem (_prefix + "_day_" + new Date(_checkoutDate).getDate() + "_" + new Date(_checkoutDate).getMonth() + "_" + new Date(_checkoutDate).getFullYear()).className="Active";
			}catch(ex){}
			
		}
	}
	
	
	this.showCalendar = function(isCheckin){
		if (isCheckin){
			getItem(_prefix + "_monthContainer").className="CheckInPreview";
			try{
			getItem (_prefix + "_day_" + new Date(_checkinDate).getDate() + "_" + new Date(_checkinDate).getMonth() + "_" + new Date(_checkinDate).getFullYear()).className="Active";
			}catch(ex){}
			try{
				getItem (_prefix + "_day_" + new Date(_checkoutDate).getDate() + "_" + new Date(_checkoutDate).getMonth() + "_" + new Date(_checkoutDate).getFullYear()).className="";							
			}catch(ex){
				if (debug){
					//alert("day not in viewaqble range1");
				}
			}
		}else{			
			getItem(_prefix + "_monthContainer").className="CheckOutPreview";
			try{
			getItem (_prefix + "_day_" + new Date(_checkoutDate).getDate() + "_" + new Date(_checkoutDate).getMonth() + "_" + new Date(_checkoutDate).getFullYear()).className="Active";
			}catch(ex){}
			try{
				getItem (_prefix + "_day_" + new Date(_checkinDate).getDate() + "_" + new Date(_checkinDate).getMonth() + "_" + new Date(_checkinDate).getFullYear()).className="";											
			}catch(ex){
				if (debug){
					//alert("day not in viewaqble range2");
				}
			}
		}
		getItem(_prefix + "_monthContainer").style.display='block';
				
	}
	
	this.hideCalendar = function(){
		getItem(_prefix + "_monthContainer").style.display='none';		
	}
	
	this.selectDate=function (month,day,year){
		
		var date = month  + "/" + day  + "/" + year;
		
		if (getItem(_prefix + "_monthContainer").className=="CheckInPreview")
		{
			try{
			getItem (_prefix + "_day_" + new Date(_checkinDate).getDate() + "_" + new Date(_checkinDate).getMonth() + "_" + new Date(_checkinDate).getFullYear()).className="";
			}catch(ex){}
			this.set_checkinDate(date);
			eval(_selectedCheckIn);			
		}else{
			try{
			getItem (_prefix + "_day_" + new Date(_checkoutDate).getDate() + "_" + new Date(_checkoutDate).getMonth() + "_" + new Date(_checkoutDate).getFullYear()).className="";
			}catch(ex){}		
			this.set_checkoutDate(date);
			eval(_selectedCheckOut);
		}
		updateDates();
		this.hideCalendar();
		
		
	}	
	
	this._static_OneDay = 1000*60*60*24; 
	
	this._static_subtractDates = function(firstDate,secondDate){		
		return Math.ceil((new Date(firstDate).getTime()-new Date(secondDate).getTime())/(this._static_OneDay));
	}
	
	this._static_addDays = function(dateToAdd,amountInDays){
		return  new Date(dateToAdd.valueOf() + this._static_OneDay * amountInDays);	
	}
	
	this._static_DaysInMonth = function (year,month){		
		var m = [31,28,31,30,31,30,31,31,30,31,30,31];
		if (month != 2) 
			return m[month - 1];
		if (year%4 != 0) 
			return m[1];
		if (year%100 == 0 && year%400 != 0) 
			return m[1];
		return m[1] + 1;
	}
	
	this._static_isDate=function(dateStr){
		var ok;
		try{
			var d = new Date(dateStr);
			return true;
		}catch(x){
			return false;
		}
	}
}
 