// Kahana Sunset rental document support class
function LoadSlideHost(imageArrayInd, slideInd, imgName)
{
    parent.contents.imageArrayIndex=imageArrayInd;
    parent.contents.slideInd=slideInd;
    parent.contents.singleImageName=imgName;
    if(this.name!="main" || FileName(this.location.pathname)!="main.html")
        this.location.href="main.html";
    slideHostDocument=document;
    LoadSlideImage(imgName, true);
    return document;
}
function OnLoadKS()
{
    OnLoadPageWithSlides(0, 90, 800, 72);
    if(this.name!="main" || FileName(this.location.pathname)!="main.html")
        return;
	if(parent && parent.contents && parent.contents.imageArrayIndex)
	    imageArrayIndex=parent.contents.imageArrayIndex;
	if(parent && parent.contents && parent.contents.slidePeriod)
	    slidePeriod=parent.contents.slidePeriod;
	if(imageArrayIndex>=0)
	    RunSlides(imageArrayIndex, slidePeriod);
	else
	    SetSingleImage(parent.contents.singleImageName);
}
function StartSlides(imageArrayInd, period)
{   // starting slides from "contents" frame
    parent.contents.imageArrayIndex=imageArrayInd;
    parent.contents.slidePeriod=period;
    if(imageArrayInd==0)
        this.location.href="main.html#bigPicture";
    else if(imageArrayInd==1)
        this.location.href="VRBO_E7.html#bigPicture";//floorplan
    else if(imageArrayInd==2)
        this.location.href="VRBO_D1D.html#bigPicture";
//    var pn=FileName(this.location.pathname);
//    if(pn!="main.html")
//    {
//        if(imageArrayInd==1 && pn!="VRBO_E7.html")
//            this.location.href="VRBO_E7.html#bigPicture";//floorplan
//        else if(imageArrayInd==2 && pn!="VRBO_D1D.html")
//            this.location.href="VRBO_D1D.html#bigPicture";
//        else    // show slides in main page
//            this.location.href="main.html#bigPicture";
//    }
//    //setTimeout("RunSlides('imageArrayInd', 'period')", 500);
}
function WriteArea(coordinates, image)
{
	var nameRect=FileName(image);
	document.writeln("<AREA alt='"+nameRect+"' shape=\"rect\" coords=\""+coordinates+"\" onclick=\"SetSingleImage('"+image+
	    "')\" onmouseover=\"HighBorder('"+nameRect+"');DelayValidatedSingleImage('"+image+"')\" onmouseout=\"lastSelectedImg=null\">");
}
function PageHeader(title)
{
	document.writeln("<table name=\"pagetitle\"><TR><td width=\"50%\"></td>");
	document.writeln("<td nowrap><h1>&nbsp;"+title+"&nbsp;</h1></td>");
	document.writeln("<td width=\"50%\"></td></TR></table>");
}
function TitleRow(title)
{
	document.writeln("<table><TR><td width=\"50%\"><HR></td>");
	document.writeln("<TD nowrap><BR><H2>&nbsp;"+title+"&nbsp;</H2></TD>");
	document.writeln("<td width=\"50%\"><HR></td></TR></table>");
}
function ImageRow(images, location)
{
	document.writeln("<TABLE><TR>");
	for(var i=0; i<images.length; i++)
	{
		document.writeln("<TD align=\"center\">");
	    document.writeln(PreviewImage(images[i]+".jpg", location, 72, "_small"));
	    document.writeln("</TD>");
    }
	document.writeln("</TR></TABLE>");
}

// calendar class
var todayDate=new Date();
function DayOfYear(date)
{
	var t1=Date.parse(date);
	var y=date.getFullYear();
	var t2=Date.parse("January 1, "+y);
	d=Math.round((t1-t2)/(1000*60*60*24))+1; // jan 1 is the first day
	if(y%4==0 && date.getMonth()>1)
		d--;
	return d;
}
function DaysDifference(date1, date2)
{
	var t1=Date.parse(date1);
	var t2=Date.parse(date2);
	return Math.round((t1-t2)/(1000*60*60*24));
}
function AddDays(date, days)
{
	var t1=Date.parse(date);
	var t2=t1+days*(1000*60*60*24);
	var newDate=new Date(t2);
	return newDate;
}

//var oneTimeFee=new Array(150, 35);
//var rateSchedule=new Array(295, 245, 220, 245, 220, 295);
// discount and rate charts class
var longStayDiscount=new Array(0.0, 0.20);
var longStayThreshold=new Array(7, 28);
var longStayPoints=longStayThreshold.length;
var lateBookingDiscount=new Array(0.25, 0.1);
var lateBookingThreshold=new Array(0, 90);
var lateBookingPoints=lateBookingThreshold.length;
var gapFillAjustment=new Array(-.75, .5, 0.);
var gapFillThreshold=new Array(0, 3, 6);
var gapFillPoints=gapFillThreshold.length;
var oneTimeThreshold=new Array(0, 7);
var oneTimePoints=oneTimeThreshold.length;
var rateThreshold=new Array(0, 6, 121, 167, 248, 349);
var ratePoints=rateThreshold.length;
function InterpolationValue(argument, x, y, points)
{
	if(points<=0)
		return 0;
	if(points==1)
		return y[0];
	var i;
	for(i=0; i<points; i++)
	{
		if(x[i]==argument) 
			return y[i];
		if(x[i]>argument) 
			break;
	}
	if(i==0)
		return y[0];
	if(i==points)
		return y[points-1];
	var coeff=(argument-x[i-1])/(x[i]-x[i-1]);
	return y[i-1]*(1-coeff)+y[i]*coeff;
}
function StepValue(argument, x, y, points)
{
	if(points==0)
		return 0;
	if(points==1)
		return y[0];
	var i;
	var sv=y[0];		// first value left extrapolation logic
	for(i=0; i<points; i++)
	{
		if(argument<x[i]) 
			break;
		sv=y[i];
	}
	return sv;
}

// reservation class
var arrivalDate=new Date();		// selected arrival date
var departureDate=new Date();	// selected departure date
var arrivalDateID="";			// element id of the selected arrival date
var departureDateID="";			// element id of the selected departure date
var arrivalDateColor="";		// original background color of the selected arrival date
var departureDateColor="";		// original background color of the selected departure date
var beginDate=new Date();		// opening begin
var endDate=new Date();			// opening end
var lengthOfStay=3;				// length of stay in days
var priceTotal=0.;				// estimated total price for stay
var discount=0.;				// rate for stay
var discountedPrice=0.;			// total price for stay with discounts
var rate=0.;					// avarage daily rate including taxes
var discountedRate=0.;			// discounted avarage daily rate including taxes
var taxes=0.11417;				// taxes on regular rates
var setArrival=true;

function TotalRate(dayOfTheYear)
{
	var total=0;
	var i;
	for(i=dayOfTheYear; i<dayOfTheYear+lengthOfStay; i++)
		total+=StepValue(i, rateThreshold, rateSchedule, ratePoints);
	return total;
}
function SetDates(id, sDate)
{
	if(setArrival)
	{
		arrivalDate=new Date(sDate);
		FindOpening(arrivalDate);
		Element("requestMail").href="mailto:yushm@cox.net?subject=Reservation request&amp;BODY=";
		ResetCalendarDay(arrivalDateID, arrivalDateColor);
		ResetCalendarDay(departureDateID, departureDateColor);
		arrivalDateID=id;
		arrivalDateColor=Element(id).style.backgroundColor;
		if(DaysDifference(endDate, arrivalDate)>=4)
		{
			Element("result").value="Arrival date: "+arrivalDate.toDateString()+". \n => Select DEPARTURE date.";
			Element(id).innerHTML="AR";
			Element(id).style.backgroundColor="yellow";
			setArrival=false;
		}
		else
		{
			Element("result").value="You've chosen arrival date too close to the end of the opening.\nMinimum stay is 4 nights.\n => Select ARRIVAL date again.";
			Element(id).style.backgroundColor="orange";
		}
	}
	else
	{
		ResetCalendarDay(departureDateID, departureDateColor);
		departureDate=new Date(sDate);
		lengthOfStay=DaysDifference(departureDate, arrivalDate);
		departureDateID=id;
		departureDateColor=Element(id).style.backgroundColor
		setArrival=true;
		if(SetReservation())
		{
			Element(id).innerHTML="DE";
			Element(id).style.backgroundColor="yellow";
		}
		else
		{
			ResetCalendarDay(arrivalDateID, arrivalDateColor);
			Element(id).style.backgroundColor="orange";
		}
	}
}
function ResetCalendarDay(id, color)
{
	if(id!="")
	{
		Element(id).style.backgroundColor=color;
		Element(id).innerHTML=id%100;
	}
}
function FindOpening(tDate)
{
    var numOpenings=openingBegin.length;
	for(i=0; i<numOpenings; i++)
	{
		beginDate=new Date(openingBegin[i]);
		endDate=new Date(openingEnd[i]);
		if(DaysDifference(tDate, beginDate)>=0 && DaysDifference(endDate, tDate)>=0)
			break;
	}
}
function SetReservation()
{
	if(lengthOfStay<0)
	{
		Element("result").value="Departure date is before arrival.\n => Select ARRIVAL date again.";
		return false;
	}
	if(DaysDifference(endDate, departureDate)<0)
	{
		Element("result").value="Some days between arrival and departure are already booked.\n => Select ARRIVAL date again.";
		return false;
	}
	if(lengthOfStay<4)
	{
		Element("result").value="Minimum stay is 4 nights.\n => Select ARRIVAL date again.";
		return false;
	}
	SetRatesAndDiscounts(arrivalDate, departureDate);
	/*	
	var ref="http://64.75.161.242/asp/availability/mulUnits.asp?unitLimit=1&"
		+"afterunit=&rategroup=&month="+arrivalDate.Month
		+"&day="+arrivalDate.Day+"&year="+arrivalDate.year+"&nights="+lengthOfStay
		+"&unittype7=1&selectunit=KSE7&radiobutton=radiobutton&Submit1="
		+"Search+for+my+accommodations+now%21&SEARCHBLOCK=N&TA=&myAdults=1";
	verifyPrice.href=ref;
	*/
	SetRequestMail();
	return true;
}
function SetRatesAndDiscounts(date1, date2)
{ 
	arrivalDate=date1;
	departureDate=date2;
	lengthOfStay=DaysDifference(departureDate, arrivalDate);
	var advanceDays=DaysDifference(arrivalDate, todayDate);
	var lateBooking=InterpolationValue(advanceDays, lateBookingThreshold, lateBookingDiscount, lateBookingPoints);
	var longStay=InterpolationValue(lengthOfStay, longStayThreshold, longStayDiscount, longStayPoints);
	var beforeGap=DaysDifference(arrivalDate, beginDate);
	var afterGap=DaysDifference(endDate, departureDate);
	var daysAdjustment=InterpolationValue(beforeGap, gapFillThreshold, gapFillAjustment, gapFillPoints)+
			InterpolationValue(afterGap, gapFillThreshold, gapFillAjustment, gapFillPoints);
	discount=1-(1-lateBooking)*(1-longStay)*(1+daysAdjustment/lengthOfStay);
	if(discount<lateBooking*.5) // minimum discount
		discount=lateBooking*.5;

	var dayOfYear=DayOfYear(arrivalDate);
	var rateTotal=TotalRate(dayOfYear, lengthOfStay);
	var fee=StepValue(lengthOfStay, oneTimeThreshold, oneTimeFee, oneTimePoints);
	priceTotal=Math.round(rateTotal*(1+taxes)+fee);
	discountedPrice=Math.round(priceTotal*(1-discount));
	discount=Math.round(1000*discount)/10;
	rate=Math.round(priceTotal/lengthOfStay);
	discountedRate=Math.round(discountedPrice/lengthOfStay);
	Element("result").value="Total price for staying "+lengthOfStay+" nights ("+arrivalDate.toDateString()+" - "+
		departureDate.toDateString()+")\n is $"+discountedPrice+" or $"+
		discountedRate+"/night (discount "+discount+"% off $"+priceTotal+").";
}
function SetRequestMail()
{
	var amauntDueAtReservation=500;
	if(amauntDueAtReservation<discountedPrice*.15)
		amauntDueAtReservation=discountedPrice*.15;
	var balanceDue=discountedPrice-amauntDueAtReservation;
	var balanceDueDaysAdvanse=30;
	var daysAdvance=DaysDifference(arrivalDate, todayDate);
	if(daysAdvance>balanceDueDaysAdvanse)
	{
		var dueDate=AddDays(arrivalDate, -balanceDueDaysAdvanse);
        Element("requestMail").href="mailto:yushm@cox.net?subject=Reservation request&BODY=Please reserve Kahana Sunset "+
		unitName+" for <<Enter your NAME and PHONE NUMBER here>> from "+
		arrivalDate.toDateString()+" to "+departureDate.toDateString()+" ("+lengthOfStay+
		" nights). I agree to pay $"+discountedPrice+" for this stay, $"+amauntDueAtReservation+
		" of which is due at reservation time. I'll pay full balance ($"+balanceDue+") by "+dueDate.toDateString()+
		". I understand that check-in time is 3PM and check-out time is 11AM. "+
		"I also agree to comply with other terms and conditions of the management company.";
	}
	else
	{
		Element("requestMail").href="mailto:yushm@cox.net?subject=Reservation request&BODY=Please reserve Kahana Sunset "+
		unitName+" for <<Enter your NAME and PHONE NUMBER here>> from "+
		arrivalDate.toDateString()+" to "+departureDate.toDateString()+" ("+lengthOfStay+
		" nights). I agree to pay $"+discountedPrice+" for this stay, which is due at reservation time."+
		". I understand that check-in time is 3PM and check-out time is 11AM. "+
		"I also agree to comply with other terms and conditions of the management company.";
	}
}
