/**
* --- Javascrtipt Rental Calendar avalialbility module ---
* --- Michael Cooling 09/01/09 ---
* (c) Infocasa IT, www.infocasa.com
*/


//Global parameters

//Maximum Number of DAYS we can search availability by into the future
var _maxNumDaysInFuture = 1825;

//Default style variables
var _calCellFont="Tahoma";
var _calCFontSize="11px";
var _calTxtFont="Tahoma";
var _calTxtFntSz="11px";
var _calTxtClr="black";
var _calCWidth=20;
var _calCHeight=20;
var _calDOWBG="#dddddd";
var resultVarName="";
var selectedLabel="";

//Change the value of this variable to 0 to be able to display weeks starting on sunday, 1 for weeks starting on monday
var firstDayOfWeek=1;
var input_id='';
var ctrlClickedName='';
var toRunOnSelect='';

//array with month names in english used for php date/time functions
var _monthfullNames=new Array("NA","January","February","March","April","May","June","July","August","September","October","November","December");
var _cal_today_day=0;
var _cal_today_month=0;
var _cal_today_year=0;

//store max and min date that the calendar is allowed to display
var minDateMonth;
var minDateYear;
var maxDateMonth;
var maxDateYear;


/**	
*-- BrowseDate
* Displays an dhtml calendar to select a date
*
* string inputid		 	:ctrlname to show innerHTML with the returned date from the calendar.
* string dateVarName		:variable name as a string of the javascript variable to hold the value of the returned date.
* string selectedText		:text to display when over the selected date
* string ctrlClicked			:name of the control that was clicked
* minDateString 	date		:minimum date the user can select
* maxDate 		date		:maximum date a user can select
* runOnSelect	string		:javascript expresion that will be evaluated when the user clicks on a date
*/

//BrowseDate('checkInResult','checkInDate','Selected Check-in date',this,new Date(),new Date('30/07/09'),180,'ShowNights(checkInDate,checkOutDate,\'nightsResult\')');

function BrowseDate(inputId,dateVarName,selectedText,ctrlClicked,initialDate,maximumDays,maximumDaysInRange,runOnSelect) {
	var maximumDate=new Date();
	var minimumDate=new Date();
	var startDate= new Date();
	var dateValue= eval(dateVarName);
	
	//Hold values in global variables for future use
	//add a day to the minimum date
	minimumDate.setDate(minimumDate.getDate()+1);
	minDateMonth=parseInt(minimumDate.getMonth())+1;
	minDateYear=parseInt(minimumDate.getFullYear());
	
	
	//Determine the maximum month/year to display for the calendar
	
	if(dateVarName=='checkOutDate'){
		if(document.getElementById('datepanelcheckOutDate')!=null) {
			document.getElementById('datepanelcheckInResult').style.display = 'none';
			removeListener(document,"click",ShowHide);
		}
		//alert('initialDate = ' + initialDate + ' MyValue = ' + dateValue);
		if(initialDate<dateValue){
			initialDate=dateValue;
		}
		maximumDays=maximumDays-1;
		startDate=new Date(initialDate.getFullYear(),initialDate.getMonth(),initialDate.getDate());

		var dateB=addDays(startDate,maximumDays);
		var dateA=addDays(startDate,maximumDaysInRange);
		//alert('dateA =' + dateA);
		if(dateA<dateB){
			maximumDate=dateA;
		}
		else{
			maximumDate=dateB;
		}
		
		//Allow and date in the future as long as it maintains the maximumDaysInRange
		//if (maximumDate>addDays(new Date(),maximumDaysInRange))	maximumDate =addDays(new Date(),maximumDaysInRange);
	}else{
		//Allow checkInDate to be up to 3 years in the future
		//maximumDate=addDays(maximumDate,maximumDays);
		maximumDate=addDays(maximumDate,_maxNumDaysInFuture);
		 //Remove the onclick listener
		if(document.getElementById('datepanelcheckOutResult')!=null) {
			document.getElementById('datepanelcheckOutResult').style.display = 'none';
			removeListener(document,"click",ShowHide);
		}
		  
	}
	
	maxDateMonth=parseInt(maximumDate.getMonth())+1;
	maxDateYear=parseInt(maximumDate.getFullYear());
	toRunOnSelect = runOnSelect
	ctrlClickedName=ctrlClicked.id
	input_id = inputId;
	selectedLabel=selectedText;
	
	today=new Date();
	resultVarName = dateVarName;
	
	var arrParts= new Array();
	
	arrParts[0] = dateValue.getDate();
	arrParts[1] = dateValue.getMonth();
	arrParts[2] = dateValue.getFullYear();
	
	//Store the selected date
	cal_selected_day=arrParts[0];
	cal_selected_month=arrParts[1];
	cal_selected_year=arrParts[2];
	
	//Store todays date
	cal_today_day=today.getDate();
	cal_today_month=today.getMonth();
	cal_today_year=today.getYear();
	
	//Open the calendar on the initial dates month
	OpenCalendar(initialDate.getFullYear(), initialDate.getMonth(), initialDate.getDate(), input_id);
}

function CalendarCallback(strSelectedDate,input_id) {
	var date=new Date(strSelectedDate);
	//set the javascript variable whose name was passes to BrowseDate ( dateVarName) to the new value
	eval(resultVarName + "=date");
	//set the input_id's innerHTML to the new date in format dd/mm/yyy
	document.getElementById(input_id).innerHTML = Right("0" + date.getDate(),2)+"/"+Right("0" + (date.getMonth()+1),2) + "/" + date.getFullYear();
	
	//If a function call has been sent to do when the user clicks on a date then evaluate that call
	if (toRunOnSelect.length>0){
		eval(toRunOnSelect);
	}
}

function OpenCalendar(Year, defMonth, defDay, input_id) {
	var inputobj=document.getElementById(input_id);
	inputobj._cal_year=Year;
	inputobj._cal_month=defMonth;
	inputobj._cal_day=defDay;
	FillCalendar(Year, defMonth+1, defDay, input_id);
	var x=0;
	
	x+=inputobj.clientWidth;
	
	while ( inputobj != null) {
		x+= inputobj.offsetLeft;
		x+=2;
		inputobj = inputobj.offsetParent;
		}
	var y=0;	
	var inputobj=document.getElementById(input_id);
	while ( inputobj != null) {
		y+= inputobj.offsetTop;
		inputobj = inputobj.offsetParent;
		}

	var objPanel = document.getElementById('datepanel' + input_id);
	objPanel.style.display = "block";
	document.getElementById(input_id).position="absolute";
	objPanel.style.left = x+"px";
	objPanel.style.top = y+"px";
	addListener(document,"click",ShowHide);
}

function stdBtn(objRow,func,txt) {
	var cel=stdCell(objRow);
	cel.onmousedown=eval(func);
	cel.innerHTML=txt;
	return (cel);
}

function stdCell(objRow) {
	var objCell=objRow.insertCell(objRow.cells.length);
	return (objCell);
}

function FillCalendar(year, month, day, input_id) {
	var daysCount=DaysInMonth(year, month);
	var objPanel = document.getElementById('datepanel' + input_id);
	var inputobj=document.getElementById(input_id);
	if (!objPanel) {
		objPanel = document.createElement("div");
		objPanel.id = 'datepanel' + input_id;
		objPanel.style.position = "absolute";
		objPanel.style.display = "none";
		objPanel.input_id=input_id;
		document.body.appendChild(objPanel);
	}
	objPanel._currentYear=year;
	objPanel._currentMonth=month-1;
	while (objPanel.childNodes.length > 0) objPanel.removeChild(objPanel.childNodes[0]);
	var currentDay=1;
	var objTable=document.createElement("table");
	objTable.onselectstart=new Function("return false;");
	objTable.onmousedown=new Function("return false;");
	objTable.cellPadding='0';
	objTable.cellSpacing='0';
	objTable.border='0';
	objTable.input_id=input_id;
	objTable.className="calTable";
	objRow=objTable.insertRow(objTable.rows.length);

	var objCell=stdBtn(objRow,'ShowSelected','S');
	objCell.title='Selected date';
	var objCell=stdBtn(objRow,'PreviousMonthClick','&lt;');
	objCell.title=prevMonthLabel;
	objCell.className= "calMonthBtn";
	var objCell=objRow.insertCell(objRow.cells.length);
	objCell.colSpan="3";
	objCell.innerHTML = monthNames[month-1] + " " + year;
	objCell.id= "calMonthName";
	objCell.className= "calMonthName";
	var objCell=stdBtn(objRow,'NextMonthClick','&gt;');
	objCell.title=nextMonthLabel;
	objCell.className= "calMonthBtn";
	var objCell=stdBtn(objRow,'HideCalendar','X');
	//set the close button label
	objCell.title=closeLabel;

	var objRow=0;
	var foundMonthStart=0;
	month_text=_monthfullNames[month];
	f_dom=month_text + " 01, " + year;
	firstDay=new Date(eval('"'+f_dom+'"'));
	//added use monday as the first day of the week
	var tmpVal = firstDay.getDay()-firstDayOfWeek%7;
	month_start_dow=tmpVal<0?7+tmpVal:tmpVal;
	

	var x=0;
	objRow=objTable.insertRow(objTable.rows.length);
	//Build a week day names row
	for (x=0; x<7; x++) {
		var objCell=objRow.insertCell(objRow.cells.length);
		//Set the classnames fot weekend days and weekdas
		if((x+firstDayOfWeek)%7==0 || (x+firstDayOfWeek)%7==6){
			objCell.className="calWeekEndLabel";
		}else{
				objCell.className="calWeekDayLabel";
		}
		
		objCell.innerHTML = weekDayNames[(x+firstDayOfWeek)%7];
		}	
	//Set to use firstdayofweek monday
	month_start_dow
	current_dow=0;
	while (currentDay <= daysCount) {
		if ((current_dow%7) == 0) {
			objRow=objTable.insertRow(objTable.rows.length);
			current_dow=0;
			}
		for (var i=1; i<=7; i++) {
			if (current_dow==month_start_dow) foundMonthStart=1;
			
			if (foundMonthStart==0) {
				var objCell=stdCell(objRow);
				//objCell.style.cursor="default";
				//objCell.style.border="0px solid black";
			} else{
					if (currentDay > daysCount) break;
					var objCell=stdCell(objRow);
					
					//Set the class of the weekenddays or weekdays
					if (((current_dow+firstDayOfWeek)%7==0)||((current_dow+firstDayOfWeek)%7==6))
						objCell.className="calWeekEnd";
					else
						objCell.className="calWeekDay";
					//Set the class of the today cell
					if (currentDay==cal_today_day) 
						if ((month-1)==cal_today_month) 
							if (year==cal_today_year){
								objCell.className="calToday";
								objCell.title=todayLabel;
							}
					//Set the class of the selected date cell
					if (currentDay==cal_selected_day)
						if ((month-1)==cal_selected_month) 
							if (year==cal_selected_year){
								objCell.className="calSelected";
								objCell.title=selectedLabel;
							}
					objCell.onmouseover = new Function("this.className='calDayOver'");
					objCell.onmouseout = new Function("this.className='" + objCell.className +"'");
					objCell.onclick = new Function("CalendarCellClick(this);");
					objCell.innerHTML = currentDay;
					currentDay++;
				}
			current_dow++;
			}
	}		
	objPanel.appendChild(objTable);
}

function ShowSelected() {
	FillCalendar(cal_selected_year, cal_selected_month + 1, 1, input_id);
}

function CalendarCellClick(objCell) {
	var id=objCell.parentNode.parentNode.parentNode.input_id;
	HideCalendar(id);
	var date=new Date('March 14, 1969');
	panelobject=document.getElementById('datepanel' + id);
	date.setFullYear(panelobject._currentYear, panelobject._currentMonth, parseInt(objCell.innerHTML));
	CalendarCallback(date,id);
}

function HideCalendar(id) {
	var objPanel = document.getElementById('datepanel' + input_id);
	objPanel.style.display = "none";
}
	
//User clicks on previous month cell
function PreviousMonthClick() {
	id=this.parentNode.parentNode.parentNode.input_id;
	panelobject=document.getElementById('datepanel' + id);
	//Do not reload previous month if it's before the minimumDate parameter
	if(panelobject._currentYear>minDateYear || (panelobject._currentMonth>=minDateMonth && panelobject._currentYear==minDateYear)){
		
		panelobject._currentMonth--;
		if (panelobject._currentMonth < 0) {
			panelobject._currentMonth = 11;
			panelobject._currentYear--;
		}
		
	}
	FillCalendar(panelobject._currentYear, panelobject._currentMonth+1, 1, id);
}
function NextMonthClick() {
	id=this.parentNode.parentNode.parentNode.input_id;
	panelobject=document.getElementById('datepanel' + id);
	if(panelobject._currentYear<maxDateYear ||(panelobject._currentMonth<maxDateMonth-1 &&  panelobject._currentYear==maxDateYear)){
		panelobject._currentMonth++;
		if (panelobject._currentMonth > 11){
			panelobject._currentMonth = 0;
			panelobject._currentYear++;
		}
	}
	FillCalendar(panelobject._currentYear, panelobject._currentMonth+1, 1,id);
}

function DaysInMonth(year, month) {
	var date=new Date();
	var result=27;
	date.setFullYear(year, month-1, 28);
	while ((date.getFullYear() <= year)&&(date.getMonth() <= (month-1))) {
		result++;
		if (result > 31) {
			alert("error getting days in month!\nyear: "+year+", month: "+month);
			return 0;
			}
		date.setFullYear(year, month-1, date.getDate()+1);
		}
	return result;
}

/**	
*-- ShowNights
*  pCheckin	date
* CheckOut	date
* ctrlName	string
*
* Updates the contol specified in parameter ctrlName with the day difference between pCheckIn and pCheckOut	
*
*/
function ShowNights(pCheckIn,pCheckOut,ctrlName){
	//Calculate difference btw the two dates, and convert to days
	var date1_ms = pCheckIn.getTime()
    var date2_ms = pCheckOut.getTime()
    document.getElementById(ctrlName).innerHTML= Math.abs(Math.round((date1_ms-date2_ms)/86400000));
}


//Returns the n right characters of a string
function Right(str, n){
    if (n <= 0)
       return "";
    else if (n > String(str).length)
       return str;
    else {
       var iLen = String(str).length;
       return String(str).substring(iLen, iLen - n);
    }
}

//Returns a date as a string in format yyyy-mm-dd
function WSDate(tmpDate){
	return tmpDate.getFullYear() + "-" + Right("0" + (tmpDate.getMonth()+1),2) + "-" + Right("0" + tmpDate.getDate(),2);
}

function getParent (src, tgName)
{
     while (src.parentNode != null)
     {
          if (src.parentNode.tagName == tgName)
          {
               return src.parentNode;
          }
          src = src.parentNode;
     }
     return src;
}

//function that gets added to the event handler 'click' of the dom document
//called when the user clicks on something that is not the calendar
var ShowHide= function showHide(evt) {
    if (!evt) { evt = window.event; }
    if (document.all) {
		trgObj = evt.srcElement; 
	}else{ 
		trgObj = evt.target; 
	}
    if (!trgObj) { return; }
	
    if (!trgObj.id) {
			tObj =getParent(trgObj, 'DIV');
            if (tObj) { trgObj = tObj; }
			if (!trgObj.id) {
				//Hide the calendar
				document.getElementById('datepanel'+input_id).style.display = 'none';
				//remove the listener
				removeListener(document,"click",ShowHide);
				return;
			}
    }
	
     if ( (trgObj.tagName == 'DIV') && (trgObj.id != 'datepanel'+input_id))
     {
           var tObj=null;
           tObj =getParent(trgObj, 'DIV');
           if (tObj) { trgObj = tObj; }
     }
	
     if (trgObj.id != 'datepanel'+input_id && trgObj.id != 'parentDiv'+input_id && trgObj.id != ctrlClickedName && trgObj.id!='calMonthName') {
		  //Hide the calendar
          document.getElementById('datepanel'+input_id).style.display = 'none';
		  //REmove the onclick listener
		  removeListener(document,"click",ShowHide);
     }
     else {
     }
}

//Adds an event listener depending on browser compatibility
function addListener(obj,evt,func) {
    if (obj.attachEvent)
        obj.attachEvent('on' + evt, func);

    else {
        if (obj.addEventListener) {
            obj.addEventListener(evt,func,true);
        }
        else {
            if (obj.eval) {
                obj["on"+evt] = func;
            } else {
                alert("Error adding listener\nObject:"+obj+"ID:"+obj.id+" Name:"+obj.name+" TagName:"+obj.tagName+"\nEvent:"+evt);
            }
        }
    }
}

//Removes an event listener depending on browser compatibility
function removeListener(obj,evt,func) {
    if (obj.detachEvent){
        obj.detachEvent('on' + evt, func);
	} else {
        if (obj.removeEventListener) {
            obj.removeEventListener(evt,func,true);
        }
        else {
            if (obj.eval) {
                obj["on"+evt] = func;
            } else {
                alert("Error removing listener\nObject:"+obj+"ID:"+obj.id+" Name:"+obj.name+" TagName:"+obj.tagName+"\nEvent:"+evt);
            }
        }
    }
}

//Sets the dates from the rental details component to the controls datIn,dateOut value
function SetRentalDatesInRequestInfo(){
	var frm = document.requestForm;
	//alert('setting');
	if(frm!=null){
		
		if(frm.elements['checkInDate']!=null){
			//alert('setting checkinDate=' + checkInDate);
			frm.elements['checkInDate'].value = Right("0" + checkInDate.getDate(),2)+"/"+Right("0" + (checkInDate.getMonth()+1),2) + "/" + checkInDate.getFullYear();
		} 
		if(frm.elements['checkOutDate']!=null){
			//alert('setting checkinDate=' + checkOutDate);
			frm.elements['checkOutDate'].value = Right("0" + checkOutDate.getDate(),2)+"/"+Right("0" + (checkOutDate.getMonth()+1),2) + "/" + checkOutDate.getFullYear();
		} 
		removeListener(window,"load",SetRentalDatesInRequestInfo);
	}
	
}

function addDays(myDate,days) {
    return new Date(myDate.getTime() + days*24*60*60*1000);
}
