﻿var app = Sys.Application;
app.add_load(applicationLoadHandler);
var g_image;
var PrevX;
var PrevY;
//var Msg = "Hover For Details";
var HoverTimeout;
var SaveR;
var SaveC;
var State = 0;
var SelStat;
var SelR;
var SelCStart;
var SelCEnd;
var SelStart;
var SelEnd;

function applicationLoadHandler(sender, args) {
	g_image = $get("imgSchedule");
	if (!g_image) return;
	window.onresize = HighlightCells;
	Sys.UI.DomEvent.addHandler(g_image, "mouseover", HandleMouseMove);
	Sys.UI.DomEvent.addHandler(g_image, "mousemove", HandleMouseMove);
	Sys.UI.DomEvent.addHandler(g_image, "click", ImageClick);
	Sys.UI.DomEvent.addHandler(g_image, "mouseout", HideTooltip);
	Params.StartDate = new Date(Params.StartDate);
	for (var i = 0; i < Params.Resources.length; i++) {
		Params.Resources[i].PrevStatusChange = new Date(Params.Resources[i].PrevStatusChange);
		Params.Resources[i].NextStatusChange = new Date(Params.Resources[i].NextStatusChange);
	}
	PrevX = -1;
	PrevY = -1;
	CheckRefNeeded();
	SetHeader();
}

function CheckRefNeeded() {
	var RefNeeded = GetControl("hidRefreshNeeded")
	if (RefNeeded)
		if (RefNeeded.value == "1") {
			State = 0;
			RefNeeded.value = "0";
			RefreshCalendar();
		}
}

function SetHeader() {
	var Instr;
	var divInstructions = GetControl("divInstructions");
	switch (State) {
		case 1:	// Resource and start date selected
			if (Params.isAdmin) {
				if (Params.Resources[SelR].isGroupRow) {
					Instr = "Now, select your end date on the GROUP LEVEL row.  To start over click the 'Clear Selection' button.";
				} else if (SelStat == 2) {
					Instr = "Cancel the reservation or to start over, click the 'Clear Selection' button.";
					SetCtlVis("btnCancelRes", 1);
					SetCtlVis("btnForceCancelRes", 1);
					State = 2;
				} else 
					Instr = "Now, select your end date for the selected Villa.  To start over click the 'Clear Selection' button.";
			} else if (Params.isOwner)
				Instr = "Now, select your end date for the selected Villa.  To start over click the 'Clear Selection' button.";
			else
				Instr = "Now, select your end (leaving) date for the selected Villa.  To start over click the 'Clear Selection' button.";
			SetLabel("lblChoices", "Your Selection:  " + Params.Resources[SelR].ResourceName + " From " + SelStart.format('dddd, MMMM d, yyyy') + " To ???");
			SetCtlVis("btnClear", 1);
			SetValue("hidResourceID", Params.Resources[SelR].ResourceID);
			SetValue("hidStartDate", SelStart.format('d'));
			SetValue("hidEndDate", SelEnd.format('d'));
			divInstructions.style.backgroundColor="Yellow";
			divInstructions.style.color="Black";
			break;
		case 2:	// Resource and both dates selected
			if (Params.isAdmin) {
				if (Params.Resources[SelR].isGroupRow) {
					Instr = "Change group rules as required and press the Set Group Rules button.  To start over click the 'Clear Selection' button.";
					SetLabel("lblDailyRate", "Minimum Daily Rate");
					SetLabel("lblWeeklyRate", "Minimum Weekly Rate");
					//SetValue("txtDailyRate", "500");
					//SetValue("txtWeeklyRate", "2500");
					SetValue("btnSetRates", "Set Group Rules");
					SetCtlVis("divGroupRules", 1);
					SetValue("txtMinDays",Params.DateRules[SelCStart].MinDays)
					var Cntr = GetControl("chkNoSplitWE");
					if (Params.DateRules[SelCStart].NoSplitWE)
						Cntr.checked = "on";
					else
						Cntr.checked = "off";
					SetCtlVis("divRates", 1);
				} else {
					Instr = "To update the selected villa for the dates specified, press the button for the action you require.  To start over click the 'Clear Selection' button.";
					SetLabel("lblDailyRate", "Daily Rate");
					SetLabel("lblWeeklyRate", "Weekly Rate");
					SetValue("btnSetRates", "Set Rates");
					SetCtlVis("divGroupRules", 0);
					if (SelStat == 3)				
						SetCtlVis("btnCreateRes", 1);
				}
			} 
			if (Params.Resources[SelR].isOwner) {
				Instr = "To update the selected villa for the dates specified, press the button for the action you require.  To start over click the 'Clear Selection' button.";
				if (SelStat == 3) {				
					SetCtlVis("btnBlock", 1);
					SetCtlVis("divRates", 1);
				}
				if (SelStat == 1) 				
					SetCtlVis("btnMakeAvail", 1);
			} 
			if ((!Params.isAdmin) && (!Params.Resources[SelR].isOwner)) {
				Instr = "To reserve the selected villa for the dates specified, press 'Reserve Now'.  To start over click the 'Clear Selection' button.";
				SetCtlVis("btnReserve", 1);
				GetPrice();
			}
			SetLabel("lblChoices", "Your Selection:  " + Params.Resources[SelR].ResourceName + " From " + SelStart.format('dddd, MMMM d, yyyy') + " To " + SelEnd.format('dddd, MMMM d, yyyy') + ".");
			SetCtlVis("btnClear", 1);
			SetValue("hidResourceID", Params.Resources[SelR].ResourceID);
			SetValue("hidStartDate", SelStart.format('d'));
			SetValue("hidEndDate", SelEnd.format('d'));
			divInstructions.style.backgroundColor="Green";
			divInstructions.style.color="White";
			divInstructions.style.borderStyle="solid";
			divInstructions.style.borderColor="Black";
			break;
		default:	//Anything else, assume State is 0: No Selections
			if ((Params.isAdmin) || (Params.isOwner))
				Instr = "To perform any scheduling function for a Villa, first select your Villa and Start Date by clicking on any of the squares for your Villa(s) below.";
			else
				Instr = "To Reserve a Villa, first select your Villa and Start (Arrive) Date by clicking on any of the available (green) squares below.";
			SetLabel("lblChoices", "");
			SetCtlVis("btnReserve", 0);
			SetCtlVis("btnBlock", 0);
			SetCtlVis("btnMakeAvail", 0);
			SetCtlVis("divRates", 0);
			SetCtlVis("btnCreateRes", 0);
			SetCtlVis("btnCancelRes", 0);
			SetCtlVis("btnForceCancelRes", 0);
			SetCtlVis("btnClear", 0);
			SetLabel("lblPrice", "");
			divInstructions.style.backgroundColor="White";
			divInstructions.style.color="Black";
	}
	SetLabel("lblInstructions", Instr);
	HighlightCells();
}

function HighlightCells() {
	if (!g_image)
		return;
	CheckRefNeeded();
	var divHighlight = GetControl("divHighlight");
	if (divHighlight) {
		if (State == 0) 
			divHighlight.style.display="none";
		else {
			if ((State == 1) && (SelStart < Params.StartDate))
				divHighlight.style.display="none";
			else {
				var GridLeft = TotalOffsetLeft(g_image) + Params.Image.LabelWidth + 2;
				var GridTop = TotalOffsetTop(g_image) + Params.Image.HeaderHeight - 2;
				if (SelStart < Params.StartDate)
					divHighlight.style.left = GridLeft;
				else
					divHighlight.style.left = GridLeft + (SelCStart * Params.Image.CellWidth);
				divHighlight.style.top = GridTop + (SelR * Params.Image.CellHeight) + 1;
				//divHighlight.style.width = Params.Image.CellWidth * (SelCEnd - SelCStart + 1);
				var PendingBar = $get("imgPendingBar");
				if ((State == 1) && ((Params.DateRules[SelCStart].MinDays == 1) || (Params.isOwner)))
					PendingBar.width = (Params.Image.CellWidth / 2) - 1;
				else
					if (SelStart < Params.StartDate)
						PendingBar.width = (Params.Image.CellWidth * (SelCEnd + 1)) - 2;
					else
						PendingBar.width = (Params.Image.CellWidth * (SelCEnd - SelCStart + 1)) - 2;
				PendingBar.height = 12;
				divHighlight.style.display="block";
			}
		}
	}
}

function TotalOffsetLeft(el) {
	if (el.offsetParent != null)
		return el.offsetLeft + TotalOffsetLeft(el.offsetParent);
	else
		return el.offsetLeft;
}

function TotalOffsetTop(el) {
	if (el.offsetParent)
		return el.offsetTop + TotalOffsetTop(el.offsetParent);
	else
		return el.offsetTop;
}

function SetCtlVis(ButtonName, Visible) {
	var ctl = GetControl(ButtonName);
	var display;
	if (Visible == 1)
		display = "block";
	else
		display = "none";
	ctl.style.display=display;
}

function SetLabel(LabelName, Text) {
	var lbl = GetControl(LabelName);
	lbl.innerText = Text;
}

function SetValue(ServerName, Text) {
	var Cntr = GetControl(ServerName);
	Cntr.value = Text;
}

function GetControl(ServerID) {
	var i = 0;
	var ClientID = '';
	do	{
		if (Params.ControlIDs[i].ServerID == ServerID)
			ClientID = Params.ControlIDs[i].ClientID;
		i++;
	} while ((ClientID == '') && (i < Params.ControlIDs.length));
	if (ClientID != '')
		return $get(ClientID);
	else 
		return $get(ServerID);	// Works when ID specified is actually a Client control
}

function ImageClick(e) {
	if ((g_image.style.cursor == 'default') || (State == 2))
		return;
	if (!e) e = window.event;
	var BodyOffsetY = e.offsetY - Params.Image.HeaderHeight;
	var BodyOffsetX = e.offsetX - Params.Image.LabelWidth;
    var r = parseInt(BodyOffsetY / Params.Image.CellHeight);
    var c = parseInt(BodyOffsetX / Params.Image.CellWidth);
	if ((BodyOffsetX >= 0) && (r == -2) && (c == 0) && (!Params.DisablePrev)) {
		RefreshCalendar('Prev');
	} else {
		if ((r == -2) && (c == Params.NumDays - 1)) {
			RefreshCalendar('Next');
		} else {
			if ((BodyOffsetX < 0) && (r >=0)) {
				GotoVillaDetails(r);
			} else {
				if ((BodyOffsetY >= 0) && (BodyOffsetX >= 0) && (r < Params.Resources.length) && (c < Params.NumDays)) {
					//SetClickMsg();
					State += 1;
					SelR = SaveR;
					if (State == 1) {
						SelStart = AddDays(Params.StartDate,SaveC);
						SelEnd = AddDays(Params.StartDate,SaveC);	// Set end = start so Cancel Res can be done.
						SelCStart = SaveC;
						SelCEnd = SaveC;
					} else {	//State == 2
						SelEnd = AddDays(Params.StartDate,SaveC);
						SelCEnd = SaveC;
					}
					SetHeader();
				}
			}
		}
	}
}

function ClearSelection() {
	State = 0;
	SetHeader();
}

function HandleMouseMove(e) {
	if (!e) e = window.event;
	var BodyOffsetY = e.offsetY - Params.Image.HeaderHeight;
	var BodyOffsetX = e.offsetX - Params.Image.LabelWidth;
    var r = parseInt(BodyOffsetY / Params.Image.CellHeight);
    var c = parseInt(BodyOffsetX / Params.Image.CellWidth);
    var Hovering = false;
    if ((BodyOffsetY >= 0) && (BodyOffsetX >= 0) && (r < Params.Resources.length) && (c < Params.NumDays)) {
		if ((BodyOffsetY == PrevY) && (BodyOffsetX == PrevX)) {
		} else {
			PrevY = BodyOffsetY;
			PrevX = BodyOffsetX;
			//PrevY = e.clientY;
			//PrevX = e.clientX;
			SaveR = r;
			SaveC = c;
			var NoHand;
			var Msg;
			var DoHover = 0
			switch (State) {
				case 0: // Nothing Selected
					SelStat = Params.Resources[r].Status[c];
					switch (SelStat) {
						case 1:		// Blocked
							if (Params.Resources[r].isOwner)  {
								NoHand = false;
								Msg = 'Click to make changes starting on this date';
							} else if ((Params.isAdmin) && (Params.Resources[r].isGroupRow)) {
								NoHand = false;
								DoHover = 1;
								Msg = 'Click to make GROUP LEVEL changes starting on this date';
							} else {
								NoHand = true;
								Msg = '';
							}
							break;
						case 2:  // Rented
							if (Params.isAdmin)  {
								NoHand = false;
								DoHover = 1;
								Msg = 'Click to make changes starting on this date';
							} else {
								NoHand = true;
								Msg = '';
							}
							break;
						case 3:		// Available
							if ((Params.isAdmin) ||(Params.Resources[r].isOwner)) {
								NoHand = false;
								Msg = 'Click to make changes starting on this date';
								DoHover = 1;
							} else if (Params.DateRules[c].NoSplitWE && (Weekday(c) == 0)) {
								NoHand = true;
								Msg = 'Weekends cannot be split';
							} else if (MinNotAvail(r,c)) {
								NoHand = true;
								Msg = 'You must reserve at least ' + Params.DateRules[c].MinDays + ' days';
							} else {
								NoHand = false;
								Msg = 'Click to reserve starting on this date';
								DoHover = 1;
							}
							break;
						case 4:		// Held
							if (Params.isAdmin)
								DoHover = 1;
							NoHand = true;
							Msg = '';
							break;
					}
					SetPopup(e, r, c, Msg, NoHand, DoHover);
					break;
				case 1:	// Resource and start date selected
//					if (GoodEndDate(r, c)) {
//						NoHand = false;
//						Msg = 'Click to set your ending date';
//					} else {
//						NoHand = true;
//						Msg = '';
//					}
					Msg = CheckEndDate(r, c);
					NoHand = (Msg != 'Click to set your ending date');
					SetPopup(e, r, c, Msg, NoHand, DoHover);
					break;
				case 2:	// Everything selected
					SetSimplePopup(e, "You're selections have been made.  Choose an action above or click 'Clear Selections'.", true);
					break;
			}
//			if (DoHover == 1)
//				SetHover();
//			else
//				divPopBody.innerText = '';
		}
    } else {
		if ((BodyOffsetX >= 0) && (r == -2) && (c == 0) && (!Params.DisablePrev)) {
			if (State == 2)
				SetSimplePopup(e, 'Calandar is locked until selections are cleared', true);
			else
				SetSimplePopup(e, 'Previous Month');
		} else {
			if ((r == -2) && (c == Params.NumDays - 1)) {
				if (State == 2)
					SetSimplePopup(e, 'Calandar is locked until selections are cleared', true);
				else
					SetSimplePopup(e, 'Next Month');
			} else {
				if ((BodyOffsetX < 0) && (r >=0)) {
					SetSimplePopup(e, 'Click on Villa for description and photos.');
				} else {
					HideTooltip();
					PrevX = -1;
				}
			}
		}
    }
}

function MinNotAvail(r, c) {
	var Min = Params.DateRules[c].MinDays;
	var WorkStartDate = AddDays(Params.StartDate,c);
	var EndC;
	if (c + Min > Params.NumDays) {
		EndC = Params.NumDays;
		if (Params.Resources[r].NextStatusChange < AddDays(WorkStartDate, Min))
			return true;
	} else 
		EndC = c + Min;
	var i;
	for (i = c; i < EndC; i++)
		if (Params.Resources[r].Status[i] != 3)
			return true;
	return false;
}

function CheckEndDate(r, c) {
	if (SelStart < Params.Resources[r].PrevStatusChange)
		return 'There are days not available in this time period';
	var WorkSelC = (Params.StartDate > SelStart) ? 0 : SelCStart;
	var WorkEndDate = AddDays(Params.StartDate,c);
	if ((r == SelR) && (WorkEndDate >= SelStart)) {
		var i;
		var MaxMin = 0;
		var NoSplit = false;
		for (i = WorkSelC; i <= c; i++) {		// Check intermediate Status and Gather the rules
			if (Params.Resources[r].Status[i] != SelStat)
				return 'There are days not available in this time period';
			if (Params.DateRules[i].MinDays > MaxMin)
				MaxMin = Params.DateRules[i].MinDays;
			NoSplit = Params.DateRules[i].NoSplitWE
		}
		if ((!Params.isAdmin) &&(!Params.isOwner) && (!Params.Resources[r].isOwner)) {
			//Must be a user making a reservation.  Enforce rules.
			var NumDays = DiffDays(SelStart, WorkEndDate) + 1;           //c - SelCStart + 1;
			if (NumDays < MaxMin)
				return 'You must reserve at least ' + MaxMin + ' days'
			if (NoSplit &&(Weekday(c) == 6)) 	//Saturday
				return 'Weekends cannot be split';
		}
		return 'Click to set your ending date';
	} else
		return 'Select an available date after ' + SelStart.format('MMMM d, yyyy') + ' on ' + Params.Resources[SelR].ResourceName;
}

function Weekday(c) {
	return (Params.StartDate.getDay() + c) % 7;
}

function SetSimplePopup(e, Text, NoHand) {
	clearTimeout(HoverTimeout);
	divPop.style.display="none";
	if (NoHand)
		g_image.style.cursor = 'default';
	else
		g_image.style.cursor = 'hand';
	var x;
	var LeftEdge = TotalOffsetLeft(g_image);
	if (e.offsetX + divSimplePop.scrollWidth + 10 > g_image.width)
		x = LeftEdge + g_image.width - divSimplePop.scrollWidth - 4;
	else
		x = LeftEdge + e.offsetX + 5;
	var y = e.offsetY + TotalOffsetTop(g_image) + 10;
	divSimplePop.style.left = x;
	divSimplePop.style.top = y;
	divSimplePop.innerText = Text;
	divSimplePop.style.display="block";
}

function SetPopup(e, R, C, Instr, NoHand, DoHover) {
	divSimplePop.style.display="none";
	if (NoHand)
		g_image.style.cursor = 'default';
	else
		g_image.style.cursor = 'hand';
	var x;
	var LeftEdge = TotalOffsetLeft(g_image);
	if (e.offsetX + divPop.scrollWidth + 10 > g_image.width)
		x = LeftEdge + g_image.width - divPop.scrollWidth - 4;
	else
		x = LeftEdge + e.offsetX + 5;
	var y = e.offsetY + TotalOffsetTop(g_image) + 10;
	divPop.style.left = x;
	divPop.style.top = y;
	divPopHdr.innerText = Params.Resources[R].ResourceName;
	var DisplayDate = AddDays(Params.StartDate,C);
	if (State == 1)
		if (DisplayDate < SelStart)
			divPopDate.innerText = SelStart.format('dddd, MMMM d, yyyy') + ' to ' + DisplayDate.format('dddd, MMMM d, yyyy') + ' (Invalid Time Period)';
		else
			divPopDate.innerText = SelStart.format('dddd, MMMM d, yyyy') + ' to ' + DisplayDate.format('dddd, MMMM d, yyyy');
	else
		divPopDate.innerText = DisplayDate.format('dddd, MMMM d, yyyy');
	divPopStat.innerText = GetStatus(R,C);
	if (DoHover == 1)
		SetHover();
	else {
		divPopBody.innerText = '';
		clearTimeout(HoverTimeout);
	}
	divPopFtr.innerText = Instr;
	divPop.style.display="block";
}

//function GetToolTip(R, C, Msg) {
//	var TT = Params.Resources[R].ResourceName + '\n' + AddDays(Params.StartDate,C).format('dddd, MMMM d, yyyy') + '\n' + GetStatus(R,C);
//	if (Msg)
//		TT += '\n' + Msg;
//	return TT;
//}

function GetStatus(R, C) {
	if (Params.Resources[R].isGroupRow) {
		return "Group Row";
	} else {
		switch (Params.Resources[R].Status[C]) {
			case 1:
				if ((Params.isAdmin) || (Params.isOwner))
					return "Blocked";
				else
					return "Unavailable";
			case 2:
				if ((Params.isAdmin) || (Params.isOwner))
					return "Rented";
				else
					return "Unavailable";
			case 3:
				return "Available";
			case 4:
				return "Reservation Pending (check back later to see if it is released)";
		}
	}
}

function AddDays(aDate, Days) {
	return new Date(aDate.getTime() + (Days * 86400000) + 3600000); //Extra hour added so it will still work on daylight savings fall-back.
}

function DiffDays(FromDate, ToDate) {
	return (ToDate.getTime() - FromDate.getTime()) / 86400000;
}

function SetHover() {
	divPopBody.innerHTML = "<br/>Pause To Retrieve Details<br/><br/>";
	clearTimeout(HoverTimeout);
	HoverTimeout = setTimeout("SetHoverMsg();",400);
}

function SetHoverMsg() {
	divPopBody.innerHTML = '<br/>Retrieving...<br/><br/>';
	var ResourceID = Params.Resources[SaveR].ResourceID;
	var SelectedDate = AddDays(Params.StartDate,SaveC);
	var ServiceParams = {"ResourceID":ResourceID, "SelectedDate":SelectedDate};
	Sys.Net.WebServiceProxy.invoke(Params.ScheduleService,"ScheduleInfo", false,
		ServiceParams, 
		ScheduleReturn, OnFailed,"User Context",1000000);
}

function ScheduleReturn(result, eventArgs) {
	divPopBody.innerHTML = result.HTML;
}

function OnFailed(error)
{
    divPopBody.innerHTML = "Service Error: " + error.get_message();
}

function GetPrice() {
	SetLabel("lblPrice", "Retrieving Price...");
	var ServiceParams = {"ResourceID":Params.Resources[SaveR].ResourceID, "StartDate":SelStart, "EndDate":SelEnd};
	Sys.Net.WebServiceProxy.invoke(Params.ScheduleService,"GetPrice", false,
		ServiceParams, 
		PriceReturn, PriceFailed,"User Context",1000000);
}

function PriceReturn(result, eventArgs) {
	SetLabel("lblPrice", "Price: " + result);
}

function PriceFailed(error)
{
	SetLabel("lblResults", "Service Error retriving price: " + error.get_message());
	SetLabel("lblPrice", "");
}

function HideTooltip()
{
//	if (Msg != 'Retrieving...') {
		divPop.style.display="none";
		divSimplePop.style.display="none";
		clearTimeout(HoverTimeout);
		g_image.style.cursor = 'default';
//	}
}

//function PostBack2(Arg)
//{
//    var wRequest = new Sys.Net.WebRequest();
//    wRequest.set_url("Schedule.aspx");
//    wRequest.set_httpVerb("POST");
//    wRequest.add_completed(OnWebRequestCompleted);
//    var requestBody = "Message=" + Arg;
//    wRequest.set_body(requestBody);
//    wRequest.get_headers()["Content-Length"] = requestBody.length;
//    wRequest.invoke();              
//}

//function OnWebRequestCompleted(executor, eventArgs) 
//{
//	document.body.innerHTML = executor.get_responseData(); 

//	g_image = $get("imgSchedule");
//	Sys.UI.DomEvent.addHandler(g_image, "mouseover", HandleMouseMove);
//	Sys.UI.DomEvent.addHandler(g_image, "mousemove", HandleMouseMove);
//	Sys.UI.DomEvent.addHandler(g_image, "click", ImageClick);
//	Sys.UI.DomEvent.addHandler(g_image, "mouseout", HideTooltip);
//	Params.StartDate = new Date(Params.StartDate);
//	PrevX = -1;
//	PrevY = -1;
//}


function RefreshCalendar(Arg) {
//	__doPostBack('btnGo',Arg);
	var divHighlight = GetControl("divHighlight");
	divHighlight.style.display="none";
	if (Arg == 'Prev') {
		Params.StartDate = AddDays(Params.StartDate,Params.NumDays * -1)
	} else if (Arg == 'Next') {
		Params.StartDate = AddDays(Params.StartDate,Params.NumDays)
	}
	if ((!Params.isAdmin) && (!Params.isOwner)) {
		var today = new Date();
		if (Params.StartDate < today) 
			Params.StartDate = today ;
		if (Params.StartDate == today) {
			Params.DisablePrev = true;
		} else {
			Params.DisablePrev = false;
		}
	}
//	var ResourceID;
//	if (Params.Resources.length > 1) 
//		ResourceID = 0;
//	else
//		ResourceID = Params.Resources[0].ResourceID;
//	var Now = new Date();
//	g_image.src="../Modules/Schedule/ScheduleImage.aspx?Start=" + Params.StartDate.format('d') + "&Days=" + Params.NumDays + "&Resource=" + ResourceID + "&RG=" + Params.ResourceGroupID + "&P=" + Params.DisablePrev + "&T=" + Now.getTime();
	GetControl("txtSelectDate").innerText = Params.StartDate.format('d');
	SetValue("hidResourceID", "");
	var button = GetControl("btnGo");
	if (button.click) {
		// IE
		button.click();
	} else {
		// FireFox
		var e = document.createEvent("MouseEvents");
		e.initEvent("click", true, true);
		button.dispatchEvent(e);
	}
}

function GotoVillaDetails(r) {
	SetValue("hidResourceID", Params.Resources[r].ResourceID);
	var button = GetControl("btnGo");
	if (button.click) {
		// IE
		button.click();
	} else {
		// FireFox
		var e = document.createEvent("MouseEvents");
		e.initEvent("click", true, true);
		button.dispatchEvent(e);
	}
}


if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();