global.calendar.dateValue = global.calendar.dateValue?global.calendar.dateValue:new Object();
var gCalToday = new Date();
var daysLimit;
var dateFormat = rm.dateformat;
var shownDate;
var c1cells = new Array(43);
var c2cells = new Array(43);
var monthlong = rm.monthlong;
var monthshort = rm.monthshort;
var departureField = "";
var arrivalField = "";
var currentDateField = null;
var previousDate = new Object();
var isEndReached = false;
var isAtBeginning = true;
var digits = "0123456789";

function cmonthselect(){selectDate(this, 0);}
function nmonthselect(){selectDate(this,1);}
function incmonth(){changeMonth(1);};
function decmonth(){changeMonth(-1);};
function hovering(){this.oldName = this.className;  this.className = this.className + "_hov"; };
function leaving(){this.className = this.oldName;};

function initCalendar(departure, arrival) {
    configCalendar();
	//Create the bastard
	var dacal = document.createElement("TABLE");
		dacal.cellSpacing = 0;
		dacal.cellPadding = 0;
	
	//TOPROW
	var tbody = dacal.appendChild(document.createElement("TBODY"));
	var tr = tbody.appendChild(document.createElement("TR"));		
		tr.className = "calheader";
	var td = tr.appendChild(document.createElement("TD"));
		td.appendChild(document.createTextNode(nbsp));
		td.onclick =decmonth;
		td.id = "calprev";
		td.className = "calprev";
		td.onmouseover = hovering;
		td.onmouseout = leaving;
		td.colSpan = 2;
		
	td = tr.appendChild(document.createElement("TD"));
		td.id = "caltitle1";
		td.className = "caltitle";
		td.colSpan = 4;
	td = tr.appendChild(document.createElement("TD"));
		td.appendChild(document.createTextNode(""));
		td.className = "caltitle";
	td = tr.appendChild(document.createElement("TD"));
		td.className="calspacer1";
		td.rowSpan = 10;
		td.appendChild(document.createTextNode(nbsp));
	td = tr.appendChild(document.createElement("TD"));
		td.className="calspacer2";
		td.rowSpan = 10;
		td.appendChild(document.createTextNode(nbsp));
	tr.appendChild(document.createElement("TD")).appendChild(document.createTextNode(""));
	td = tr.appendChild(document.createElement("TD"));
		td.id = "caltitle2";
		td.className = "caltitle";
		td.colSpan = 4;
	td = tr.appendChild(document.createElement("TD"));	
		td.appendChild(document.createTextNode(nbsp));
		td.onclick =incmonth;
		td.id = "calnext";
		td.className = "calnext"
		td.onmouseover = hovering;
		td.onmouseout = leaving;
		td.colSpan = 2;
	//H-BORDER
	tr = tbody.appendChild(document.createElement("TR"));
		tr.className = "calhborder";
		td = tr.appendChild(document.createElement("TD"));
		td.colSpan = "7";
		td.appendChild(document.createTextNode(""));
		td = tr.appendChild(document.createElement("TD"));
		td.colSpan = "7";
		td.appendChild(document.createTextNode(""));
	//WEEKDAYS
	tr = tbody.appendChild(document.createElement("TR"));
		tr.className = "calweekdays";
	var i,j;
	for(i = 0; i < 2; i++)
	{
		tr.appendChild(document.createElement("TD")).appendChild(document.createTextNode(rm.weekdaysI[1]));
		tr.appendChild(document.createElement("TD")).appendChild(document.createTextNode(rm.weekdaysI[2]));
		tr.appendChild(document.createElement("TD")).appendChild(document.createTextNode(rm.weekdaysI[3]));
		tr.appendChild(document.createElement("TD")).appendChild(document.createTextNode(rm.weekdaysI[4]));
		tr.appendChild(document.createElement("TD")).appendChild(document.createTextNode(rm.weekdaysI[5]));
		td = tr.appendChild(document.createElement("TD"));
			td.appendChild(document.createTextNode(rm.weekdaysI[6]));
			td.className = "calweekend";
		td = tr.appendChild(document.createElement("TD"));
			td.appendChild(document.createTextNode(rm.weekdaysI[0]));
			td.className = "calweekend";
	}
	for(i = 1; i < 7; i++)
	{
		tr = tbody.appendChild(document.createElement("TR"));
			tr.className = "caldays";
		for(j = 1; j < 8; j++)
		{
			td = tr.appendChild(document.createElement("TD"));
			td.onclick = cmonthselect;
			td.onmouseover = hovering;
			td.onmouseout = leaving;
			c1cells[((i-1)*7)+j] = td;
		}
		for(j = 1; j < 8; j++)
		{
			td = tr.appendChild(document.createElement("TD"));
			td.onclick = nmonthselect;
			td.onmouseover = hovering;
			td.onmouseout = leaving;
			c2cells[((i-1)*7)+j] = td;
		}
		
	}
	//F-BORDER
	tr = tbody.appendChild(document.createElement("TR"));
		tr.className = "calfborder";
		td = tr.appendChild(document.createElement("TD"));
		td.colSpan = "16";
		td.appendChild(document.createTextNode(""));
	// FOOTER
	tr = tbody.appendChild(document.createElement("TR"));
		tr.className = "calfooter";
	td = tr.appendChild(document.createElement("TD"));
		td.colSpan = 16;
	var a = td.appendChild(document.createElement("A"));
		a.appendChild(document.createTextNode(rm.close));
		a.href = "javascript:void(0);";
		a.onclick = function(){popdown(true);} ;

    departureField = document.getElementById(departure);
    arrivalField = document.getElementById(arrival);

	// NECCESSARY?
	currentDateField = departureField;
	//dateChange(departureField);
	currentDateField = arrivalField;
	//dateChange(arrivalField);
	currentDateField = null;
	return dacal;

}


function configCalendar() {
    gCalToday = new Date();
    daysLimit = rm.calendarLimit;
    shownDate = new Date(gCalToday.getFullYear(), gCalToday.getMonth(), 1);
    //alert("ConfigCalendar:shownDate="+shownDate);
}


function setInputToLastCorrectDate()
{
	if (global.calendar.dateValue[currentDateField.id] != null)
		currentDateField.value = formatDate(global.calendar.dateValue[currentDateField.id], dateFormat);
	else
		currentDateField.value = dateFormat.toLowerCase();
	return;
}


function dateChange(o) {
    if (o.value.length == 0)
        o.value = dateFormat.toLowerCase();
    //o.className = "";

	if (o.value == dateFormat) {
		setInputToLastCorrectDate();
		return;
	}
        
    var theDate = parseDate(o.value);

	if (theDate == null)
	{
		setInputToLastCorrectDate();
		return;
    }
    
    var ParentControl="";
    if(o.id.indexOf("_")!=-1)
		ParentControl=o.id.substring(0, o.id.indexOf("_")+1);

    if (isDateBeforeToday(theDate))
    {
		setInputToLastCorrectDate();
		var lblPastDate = getElementById_s(ParentControl+"ctlPopUpCalendarScripts_hdnlblPastDate").value;
		alert(lblPastDate);
		return;
	}
     
    if(isDateTooFar(theDate, 1)) 
    {
		setInputToLastCorrectDate();
		//alert("Can not book vehicles that far in the future!");
		var lblFutureDate= new String(getElementById_s(ParentControl+"ctlPopUpCalendarScripts_hdnlblFutureDate").value);
		var d = new Date()
		//d.setDate(gCalToday.getDate()+daysLimit);
		d.setDate(gCalToday.getDate()+rm.calendarLimit);
		alert(lblFutureDate.replace("EASYCAR_VAR_DATE", formatDate(d,dateFormat)));
		return;
    }

    doAdjustDates(theDate);
}


function changeMonth(i) {
    shownDate.setMonth(shownDate.getMonth() + i);
    displayDates();    
    currentDateField.focus();
}

function selectDate(o, monthOffset) {
    if (o.className == "past" || o.className == "weekendpast" || o.className == "past_hov" || o.className == "weekendpast_hov" || ! Number(o.innerHTML) > 0) {
        currentDateField.focus();
        return;
    }
    
    var newDate = new Date(shownDate.getFullYear(), shownDate.getMonth() + monthOffset, o.innerHTML);
    doAdjustDates(newDate);

	// advance shown-month if user choices the later month when choosing depart-date
	if (monthOffset == 1 && currentDateField.id == "departDate")
		shownDate.setMonth(shownDate.getMonth() + 1);	

	popdown(true);
		
}

function doAdjustDates(newDate) {
    global.calendar.dateValue[currentDateField.id] = newDate;
		
    currentDateField.value = formatDate(newDate, dateFormat);
   // currentDateField.className = "";

    // Change one of the dates if departure is later than arrival.
    var depDate = global.calendar.dateValue[departureField.id];
    var arrDate = global.calendar.dateValue[arrivalField.id];

    if (depDate != null && arrDate != null && depDate.getTime() > arrDate.getTime()) {
        if (currentDateField.id == departureField.id) {
			previousDate[arrivalField.id]=arrivalField.value;
            arrivalField.value = departureField.value;
            // need to do setTime to that value of date is copied rather than the reference
            global.calendar.dateValue[arrivalField.id].setTime(global.calendar.dateValue[departureField.id].valueOf());
        }
        else if (currentDateField.id == arrivalField.id) {
            
			previousDate[departureField.id]=departureField.value;
            departureField.value = arrivalField.value;
            // need to do setTime to that value of date is copied rather than the reference
            global.calendar.dateValue[departureField.id].setTime(global.calendar.dateValue[arrivalField.id].valueOf());            
        }
    }

    var dtTomorrow = new Date();
    dtTomorrow.setDate(dtTomorrow.getDate()+1);

    // set drop off date 7 days after pick-up date but only for front page and only if date hasn't been changed (doesn't equal tomorrow)
    if(currentDateField.id==departureField.id && (document.location.pathname.toString().toLowerCase().indexOf("default")!=-1 || document.location.pathname.toString()=='/' || document.location.pathname.toString().toLowerCase().indexOf("ssl")==-1) && previousDate[departureField.id]==formatDate(dtTomorrow, dateFormat))
    {
        previousDate[arrivalField.id]=arrivalField.value;
        var d = new Date(global.calendar.dateValue[departureField.id]);

        // easyvan add 2 day else add 7 days
        try
        {
            if(document.location.hostname.toString().toLowerCase().indexOf("easyvan")!=-1)
                d.setDate(d.getDate()+2);
            else
                d.setDate(d.getDate()+7);
        }
        catch(e)
        {
            d.setDate(d.getDate()+7);
        }
        
        global.calendar.dateValue[arrivalField.id]=d;
        arrivalField.value=formatDate(global.calendar.dateValue[arrivalField.id],dateFormat);
    }
	
	DateChange('',false);    
    
}

function DateChange(sSelectedPeriod, bAvailableFrom)
{

    var ParentLocation, DropOffLocation='', BookingNumber='0';
    //hdnTP_ParentLocation is set on the PriceComparison page from the previous page
	var hdnTP_ParentLocation=getElementById_s("hdnTP_ParentLocation");
	if(hdnTP_ParentLocation==null)
	{
	    var txtLocationPickUp=getElementById_s(ParentControl+"txtLocationPickUp");
	    if(txtLocationPickUp==null)
	    {
	        var trLocationPickUpAddress = getElementById_s(ParentControl+"trLocationPickUpAddress");
            var ListBoxLocation=getElementById_s(ParentControl+"ListBoxLocation");
	        
	        if(trLocationPickUpAddress==null)
	            Location=ListBoxLocation.options[ListBoxLocation.selectedIndex].value;
	        else if (trLocationPickUpAddress.className == "")
	            Location="UKTMLHRXXA";
            else
	            Location=ListBoxLocation.options[ListBoxLocation.selectedIndex].value;
	    }    
	    else
        {
	        //Location=txtLocationPickUp.value;
	        //var hdnTP_CurrentlySelectedLocationPickUp=getElementById_s(ParentControl+"hdnTP_CurrentlySelectedLocationPickUp");
	        var hdnSelectedLocation=getElementById_s(ParentControl+"hdnSelectedLocation");
            //Location=hdnTP_CurrentlySelectedLocationPickUp.value;
            Location=hdnSelectedLocation.value;
	    }
	}
	else
	{
	    Location=hdnTP_ParentLocation.value;
	}
	    
	var hdnTP_DropOffLocation = getElementById_s("hdnTP_DropOffLocation");
	if(hdnTP_DropOffLocation==null)
	{
	    var txtLocationDropOff=getElementById_s(ParentControl+"txtLocationDropOff");
	    if(txtLocationDropOff==null)
	    {
	        var ListBoxLocation=getElementById_s(ParentControl+"lstOneWayDropOffLocations");
	        //if not found, probably due to not being a one way rather than an error
	        if(ListBoxLocation!=null)
	            DropOffLocation=ListBoxLocation.options[ListBoxLocation.selectedIndex].value;
	    }    
	    else
        {
	        //Location=txtLocationPickUp.value;
	        //var hdnTP_CurrentlySelectedLocation=getElementById_s(ParentControl+"hdnTP_CurrentlySelectedLocationDropOff");	        
            //DropOffLocation=hdnTP_CurrentlySelectedLocationPickUp.value;
            var hdnSelectedDropOffLocation=getElementById_s(ParentControl+"hdnSelectedDropOffLocation");	        
            DropOffLocation=hdnSelectedDropOffLocation.value;
	    }
	}
	else
	{
	    DropOffLocation=hdnTP_DropOffLocation.value;
	}
	    
	var sStartDate = document.getElementById(ParentControl+"txtStartDate").value;
	var sEndDate = document.getElementById(ParentControl+"txtEndDate").value;
	
	var dStart = parseDate(sStartDate);
	var dEnd = parseDate(sEndDate);
	
	var hdnMaxRentalPeriod = getElementById_s("hdnMaxRentalPeriod")
	if(hdnMaxRentalPeriod!=null)
	    var MaxRentalDays = hdnMaxRentalPeriod.value;

	var hdnTP_BookingNumber = getElementById_s("hdnTP_BookingNumber")
	if(hdnTP_BookingNumber!=null)
	    BookingNumber=hdnTP_BookingNumber.value;
	
	var CanonicalStartDate = parseDateCanonical(sStartDate); //formatYYYYMMDD(sStartDate);
	var CanonicalEndDate = parseDateCanonical(sEndDate); //formatYYYYMMDD(sEndDate);

	if(Math.abs(Math.round((dStart-dEnd)/(24*60*60*1000)))>MaxRentalDays)
	{
		var sErrMsg = new String(getElementById_s("hdnMaxRentalPeriodErrMsg").value);
		alert(sErrMsg.replace("EASYCAR_VARIABLE_MAXPERIOD", MaxRentalDays));
		// Adjust the End date to the start date + MaxRentalDays for location*/
		dEnd=dStart;
		dEnd.setDate(dStart.getDate()+(MaxRentalDays-0));
		document.getElementById("txtEndDate").value = formatDate(dEnd, dateFormat);
		global.calendar.dateValue[currentDateField.id] = dEnd;
	}
	//else
	//{	
		/*var tbl = document.getElementById("tblOpeningHours");
		var s = getInnerText(tbl.tBodies[0].rows[0].cells[0]);*/
		var bUpdatePrices = false;
		if((previousDate[departureField.id]!=sStartDate)||(typeof previousDate[departureField.id]=="undefined"))
		{
			previousDate[departureField.id]=sStartDate;
			var PickUpPeriodPicker=getElementById_s(ParentControl+'uc_PickUpPeriodPicker_PeriodPickerDropDownList');
			if(PickUpPeriodPicker!=null)
			{
			    PickUpPeriodPicker.disabled=true;
			    AJAXcallback("OpeningHoursPickUp", location.protocol+"//"+location.hostname+":"+location.port+"/services/misc.asmx/GetOpeningHours?Location="+Location+"&DateToCheck="+CanonicalStartDate+"&BookingNumber="+BookingNumber+"&CalledForDropDown=True&CalledForPickUpPeriod=True&OnRequestBooking=False&DropOffLocation=", function(){updateOpeningHours('', 'PickUp', aXmlHttp['OpeningHoursPickUp'].responseXML.documentElement, sSelectedPeriod);});
			}
			bUpdatePrices=true;
		}
		else
		{
			//Date hasn't changed but the selected period has changed due to an "available from" click
			// loop through existing options and select the correct one
			if((sSelectedPeriod!=null)&&(sSelectedPeriod!=''))
			{
				list=document.getElementById("uc_PickUpPeriodPicker_PeriodPickerDropDownList");
				if(list.options[list.selectedIndex].value!=sSelectedPeriod)
					for(i=0; i<list.options.length; i++)
						if(list.options[i].value==sSelectedPeriod)
						{
							list.options[i].selected=true;
							bUpdatePrices=true;
							break;
						}
						
				// if dates are equal but dropoff time is earlier than the pickup time, set them the same, otherwise
				// service will report no availability?
				listDropOffPeriod=document.getElementById("uc_DropOffPeriodPicker_PeriodPickerDropDownList");
				if((sStartDate==sEndDate)&&(listDropOffPeriod.selectedIndex<list.selectedIndex)&&(listDropOffPeriod.selectedIndex>0))
					listDropOffPeriod.selectedIndex=list.selectedIndex;
			}
		}

		if((previousDate[arrivalField.id]!=sEndDate)||(typeof previousDate[arrivalField.id]=="undefined"))
		{
			previousDate[arrivalField.id]=sEndDate;
			var DropOffPeriodPicker=getElementById_s(ParentControl+'uc_DropOffPeriodPicker_PeriodPickerDropDownList');
			if(DropOffPeriodPicker!=null)
			{
			    DropOffPeriodPicker.disabled=true;
    			AJAXcallback("OpeningHoursDropOff", location.protocol+"//"+location.hostname+":"+location.port+"/services/misc.asmx/GetOpeningHours?Location="+((DropOffLocation=='')?Location:DropOffLocation)+"&DateToCheck="+CanonicalEndDate+"&BookingNumber="+BookingNumber+"&CalledForDropDown=True&CalledForPickUpPeriod=True&OnRequestBooking=False&DropOffLocation=", function(){updateOpeningHours('', 'DropOff', aXmlHttp['OpeningHoursDropOff'].responseXML.documentElement);});
    	    }
			bUpdatePrices=true;
		}
						
//		if(bUpdatePrices&&(document.location.pathname.substring(document.location.pathname.length-20)=='PriceComparison.aspx'))
//			GetPriceComparison(sSelectedPeriod, bAvailableFrom, bUpdatePrices);	
	//}	
}

function displayDates() {

	// first enable return-date checkbox if neccessary
	//if (currentDateField.id.substring(currentDateField.id.lastIndexOf("_"), currentDateField.id.length) == "txtEndDate") //arrivalDate")
	//{
	//	var el = document.getElementById("arrivalDate");
	//	if(el) el.className = "active";
	//	el = document.getElementById("returns");
	//	if(el) el.checked = true;
	//	dateChange(arrivalField);
	//}

	var nextMonthDate = new Date(shownDate.getFullYear(), shownDate.getMonth() + 1, 1);
    // Display calendar titles.
    document.getElementById("caltitle1").innerHTML = ""; // First set to empty string, required for IE 5 Mac
    document.getElementById("caltitle1").innerHTML = monthshort[shownDate.getMonth()].toUpperCase() + " " + shownDate.getFullYear();
    document.getElementById("caltitle2").innerHTML = ""; // First set to empty string, required for IE 5 Mac
    document.getElementById("caltitle2").innerHTML = monthshort[nextMonthDate.getMonth()].toUpperCase() + " " + nextMonthDate.getFullYear();

    isEndReached = false;
    isAtBeginning = false;

	//alert(arguments.callee.caller);
    displayMonth(c1cells, shownDate);
    displayMonth(c2cells, nextMonthDate);

    // disable if we are going too far
    var prev = document.getElementById("calprev");
	// see http://www.alanwood.net/demos/wgl4.html for special char codes
	prev.innerHTML = "";prev.innerHTML = "&#9668;" + monthshort[(shownDate.getMonth()+11)%12];
	if (isAtBeginning)
	{
		prev.onclick = null;
		prev.className = "calprev_old";
		// must set the old classname because the event order is: hovering, onclick (current event), leaving
		prev.oldName = "calprev_old";
	}
	else 
	{
		prev.onclick = decmonth;
		prev.className = "calprev";
	}
    var next = document.getElementById("calnext");
	next.innerHTML = "";next.innerHTML = monthshort[(shownDate.getMonth()+2)%12] + "&#9658;";
	next.onclick = (isEndReached) ? null : incmonth;
	next.className = "calnext";

}

var msInDay = 24*60*60*1000;

function displayMonth(cells, monthDate) {
    var lastDate = getMonthDays(monthDate);
    var offset = getCalendarOffset(monthDate);
    var cell = null;
	var dw;
    // Wipe first and last rows.
    for (var i = 1; i  <= offset; i++) {
        cell = cells[i];
        cell.innerHTML = ""; // First set to empty string, required for IE 5 Mac
        cell.innerHTML = "&nbsp;";
		dw = i % 7;
        if (dw == 6 || dw == 0)
            cell.className = "weekend_none";
        else
            cell.className = "weekday_none";
    }
    for (i = offset + lastDate; i <= 42; i++) {
        cell = cells[i];
        cell.innerHTML = ""; // First set to empty string, required for IE 5 Mac
        cell.innerHTML = "&nbsp;";
		dw = i % 7;
        if (dw == 6 || dw == 0)
            cell.className = "weekend_none";
        else
            cell.className = "weekday_none";
    }

    // Display dates.
    var isTodayMonth    = isSameMonth(monthDate, gCalToday);
    var isSelectedMonth = isSameMonth(monthDate, global.calendar.dateValue[currentDateField.id]);
    var isDate1Month    = isSameMonth(monthDate, global.calendar.dateValue[departureField.id]);
    var isDate2Month    = isSameMonth(monthDate, global.calendar.dateValue[arrivalField.id]);

    for (i = 1; i <= lastDate; i++) {
        // Display day of month.
        cell = cells[i + offset];
        cell.innerHTML = ""; // First set to empty string, required for IE 5 Mac
        cell.innerHTML = i;
        
        if (monthDate.getTime() <= gCalToday.getTime()) {
            isAtBeginning = true;
        }

        var normalClass = "weekday";
        var pastClass = "past";
		dw = ((i + offset) % 7);
        var isWeekEnd = ((dw == 6)||(dw==0));
        if (isWeekEnd) {
            normalClass = "weekend";
            pastClass = "weekendpast";
        }
        

        // Select display class.
        if (isTodayMonth && gCalToday.getDate() > i) {
            cell.className = pastClass;
            isAtBeginning = true;
        }
        else if (isSelectedMonth && global.calendar.dateValue[currentDateField.id].getDate() == i) {
            // This is the currently selected date.
            cell.className = "current";
        }
        else if (isDate1Month && global.calendar.dateValue[departureField.id].getDate() == i) {
            cell.className = "selected";
        }
        else if (isDate2Month && global.calendar.dateValue[arrivalField.id].getDate() == i) {
            cell.className = "selected";
        }
        else if (isDateTooFar(monthDate, i)) {
            cell.className = pastClass;
            isEndReached = true;
        }
        else {
            cell.className = normalClass;
        }
    }
}

/****************************************
*    HELPERS
****************************************/
function isDateBeforeToday(theDate) {
    if (theDate.getFullYear() != gCalToday.getFullYear())
        return theDate.getFullYear() < gCalToday.getFullYear();
    if (theDate.getMonth() != gCalToday.getMonth())
        return theDate.getMonth() < gCalToday.getMonth();
    return theDate.getDate() < gCalToday.getDate();
}

function isDateTooFar(theDate, offset) {
    var days = Math.ceil((theDate.getTime() - gCalToday.getTime()) / msInDay) + offset - 1;
    //return days > daysLimit;
    return days > rm.calendarLimit;
}

function getMonthDays(theDate) {
    var lastDate = new Date(theDate.getFullYear(), theDate.getMonth() + 1, 0);
    return lastDate.getDate();
}


function getCalendarOffset(theDate) {
    var firstDay = new Date(theDate.getFullYear(), theDate.getMonth(), 1);
    return (firstDay.getDay()+6)%7;
}

function isSameMonth(firstDate, secondDate) {
    if (firstDate == null || secondDate == null)
        return false;
    return firstDate.getFullYear() == secondDate.getFullYear() &&
           firstDate.getMonth() == secondDate.getMonth();
}


// format:
//   yyyy -> year long, ie. 2005
//	 yy   -> year short, ie. 05
//   mm   -> month number, ie. 12
//   mmm  -> month short, ie. Dec
//   mmmm -> month long, ie. December
//   dd   -> day number, ie. 24
//   ww   -> weekday short, ie. Mon 
function formatDate(theDate, format) 
{
    var result = format.toLowerCase();
    result = result.replace(/yyyy/, theDate.getFullYear());
	result = result.replace(/yy/, formatToTwoDigits(theDate.getFullYear()%100));
	
	//Only do one month regexp replacement so that we don't end up replace in m if it appears in a monthname
    if(result.indexOf('mmmm')!=-1)
		result = result.replace(/mmmm/, monthlong[theDate.getMonth()]);
	else
	{
		if(result.indexOf('mmm')!=-1)
			result = result.replace(/mmm/, monthshort[theDate.getMonth()]);
		else
		{
			if(result.indexOf('mm')!=-1)
				result = result.replace(/mm/, formatToTwoDigits(theDate.getMonth() + 1));
			else
				result = result.replace(/m/, theDate.getMonth() + 1);
		}
	}
    result = result.replace(/dd/, formatToTwoDigits(theDate.getDate()));
    result = result.replace(/d/, theDate.getDate());
	result = result.replace(/ww/, rm.weekdays[theDate.getDay()]);
    return result;
}

function formatToTwoDigits(n) {
    if (n >= 0 && n < 10)
        return "0" + n;
    else
        return n;
}
function parseDateFormat(txt,format)
{
	var reg = format.toLowerCase();
	var ya = reg.match(/^(y+|m+|d+)[^`ymd]?(y+|m+|d+)[^ymd]?(y+|m+|d+)$/);
	if(ya)
	{

		var y,m,d,t,b;
		var pos = 0;
		for(var i = 1; i < ya.length && pos < txt.length;i++)
		{
			b = txt.substring(pos,pos+ya[i].length).replace(/^0/,'');
			t =  parseInt(b);
			pos+=ya[i].length;
			if(ya[i].charAt(0)== 'y')
				y = t.length<4?2000+t:t;
			else if(ya[i].charAt(0) == 'm')
				m = t;
			else if(ya[i].charAt(0) == 'd')
			    d = t;	
			while(digits.indexOf(txt.charAt(pos))==-1)pos++;
		}
		if(y&&m&&d)
			return new Date(y,m-1,d);
	}
	return null;

}
function parseDateCanonical(txt)
{
	var reg = dateFormat.toLowerCase();
	var ya = reg.match(/^(y+|m+|d+)[^`ymd]?(y+|m+|d+)[^ymd]?(y+|m+|d+)$/);
	if(ya)
	{

		var y,m,d,t,b;
		var pos = 0;
		for(var i = 1; i < ya.length && pos < txt.length;i++)
		{
			b = txt.substring(pos,pos+(ya[i].length==1?2:pos+ya[i].length)).replace(/^0/,'');
			t =  parseInt(b);
			pos+=(ya[i].length==1?2:pos+ya[i].length); //ya[i].length;
			if(ya[i].charAt(0)== 'y')
				//y = ya[i].length==2?2000+t:t;
				y = b.length<4?2000+t:t;
			else if(ya[i].charAt(0) == 'm')
				m = t;
			else if(ya[i].charAt(0) == 'd')
			    d = t;	
			while(digits.indexOf(txt.charAt(pos))==-1)pos++;
		}
		if(y&&m&&d)
			return y+''+formatToTwoDigits(m)+''+formatToTwoDigits(d);

	}
	return null;

}
// also called by flights.js
function parseDate(text) {
    var parts = text.split(/[-\/\.]/);
    var origPartsLenght = parts.length;
    // Validate.
    if (parts.length < 2 || parts.length > 3)
        return null;
    if (parts.length == 2)
        parts[2] = String((new Date()).getFullYear());
    else if (parts[2].length <= 2)
        parts[2] = String(2000 + Number(parts[2]));
    if (parts[0].length < 1 || parts[0].length > 2 || ! parts[0].match(/[0-9]+/))
        return null;
    if (parts[1].length < 1 || parts[1].length > 2 || ! parts[1].match(/[0-9]+/))
        return null;

    if (parts[2].length == 0 || parts[2].length == 3 ||
        parts[2].length > 4  || ! parts[2].match(/[0-9]+/))
        return null;
    var newDate = new Date(parts[2], Number(parts[1]) - 1, parts[0]);

	if (Number(parts[0]) != newDate.getDate())
		return null;

    if (origPartsLenght == 2 && newDate.getTime() < gCalToday.getTime()) {
        var dateYearAdjusted = new Date(newDate.getTime());
        dateYearAdjusted.setFullYear(dateYearAdjusted.getFullYear() + 1);
        if (! isDateTooFar(dateYearAdjusted, 1))
    	    newDate = dateYearAdjusted;
    }

	// for birth dates
	/* if (newDate.getFullYear() > gCalToday.getFullYear()+5)
		newDate.setFullYear(newDate.getFullYear()-100); */

    return newDate;
}

function leaveCalendar(calEl)
{
	currentDateField = calEl;
	dateChange(calEl);
}

function returnchecked()
{
	var el = document.getElementById("arrivalDate");

	if (el.className == "active")
	{
		el.className = "inactive";
		global.calendar.dateValue[arrivalField.id] = null;
	}
	else
	{
		el.className = "active";
	}
}
