
/*
	Booking (Find Course) Google Maps Integration.
*/

var map = null;
var mapLength = 0;
var mapTop = 0;
var clubData = null;
var regionData = null;
var courseData = null;
var offerData = null;
var clubAvail = null
var availData = null;
var overallLowPrice;
var overallHighPrice;
var isHistoryRestoreTried = false;
var clubMarkers = null;
var clubInfoOpen = null;
var regionMarkers = null;
var maxBounds = null;
var helperHtml = '';
var helperCoords = null;
var initCoords = null;
var initZoom = null;
var oldZoom = 0;
var clubPopup = null;

var baseIcon = null;
var smallBaseIcon = null;
var priceIcons = new Array(4);
var smallPriceIcons = new Array(4);
var elabelPriceIcons = new Array(4);
var elabelSmallPriceIcons = new Array(4);
var unavailableIcon = null;
var smallUnavailableIcon = null;
var unavailableImage = null;
var smallUnavailableImage = null;

var startDate = new Date();
var endDate = new Date();
var selectedDate = new Date();

var dateInputElem = null;
var clubCourseList = null;

var dateNavPageSize = 14;
var dateNavPageIndex = 0;
var displayMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var dateNavHeads = new Array();
var dateNavItems = new Array();

// Column defs for data structures
		
var CLUB_ID = 0;
var CLUB_REGIONID = 1;
var CLUB_NAME = 2;
var CLUB_CURRAVAIL = 3;
var CLUB_CURRLOW = 4;
var CLUB_CURRHIGH = 5;
var CLUB_PERAVAIL = 6;
var CLUB_PERLOW = 7;
var CLUB_PERHIGH = 8;
var CLUB_MAPLAT = 9;
var CLUB_MAPLNG = 10;
var CLUB_VOUCHERS = 11;

var COURSE_ID = 0;
var COURSE_NAME = 1;
var COURSE_CLUBID = 2;
var COURSE_CLUBNAME = 3;
var COURSE_REGIONID = 4;

var REG_ID = 0;
var REG_NAME = 1;
var REG_PERIODLOW = 2;
var REG_PERIODHIGH = 3;
var REG_MAPLAT = 4;
var REG_MAPLNG = 5;
var REG_MAPZOOM = 6;

var OFR_CLUBID = 0;
var OFR_CLUBNAME = 1;
var OFR_TEXT = 2;
var OFR_4FOR3 = 3;


function load()
{
	if (GBrowserIsCompatible())
	{
		// Get variables from server		
		setupFromServer();		
		selectedDate = startDate;
		setup();//setupdate
	
		// Setup map
		setupMap();
		
		// Setup DateNav/Input
		dateNavSetup();
		dateInputSetup();
		
		// Setup region select
		regionSelectRefresh();
		
		// Attempt to restore historical page state
		var historyRestored = restoreHistory();
		isHistoryRestoreTried = true;
		
		if(!historyRestored)
		{		
			// Refresh datenav
			dateNavRefresh(dateNavPageIndex);
			
			// Display offer data
			offersRefresh();
		}
	}
	else
	{
		// TODO: Some type of error message/fallback for no google maps functionality
		alert('Your web browser is not capable of displaying this page.');
	}
}

/* ============== MAP FUNCTIONS ==================== */

function setupMap()
{
	// Setup map
	map = new GMap2(ge("map"));
	map.addControl(new GSmallMapControl());
	initLocation();
	oldZoom = initZoom;
	
	// Move map position back to initial if out of bounds.
	GEvent.addListener(map, "moveend", checkBounds);
	
	// After zoom possible refresh of region/club drilldown
	GEvent.addListener(map, "zoomend", mapZoomed);
	
	// Setup Icons	
	baseIcon = new GIcon(G_DEFAULT_ICON);
    baseIcon.shadow = "../images/golfmarker_shadow.png";
    baseIcon.iconSize = new GSize(20, 34);
    baseIcon.shadowSize = new GSize(34, 34);
    baseIcon.iconAnchor = new GPoint(8, 34);
    baseIcon.infoWindowAnchor = new GPoint(6, 2);
    baseIcon.infoShadowAnchor = new GPoint(15, 25);     
    
    smallBaseIcon = new GIcon(G_DEFAULT_ICON);
    smallBaseIcon.shadow = "../images/golfmarker_shadow_small.png";
    smallBaseIcon.iconSize = new GSize(12, 20);
    smallBaseIcon.shadowSize = new GSize(20, 20);
    smallBaseIcon.iconAnchor = new GPoint(4, 20);
    smallBaseIcon.infoWindowAnchor = new GPoint(6, 2);
    smallBaseIcon.infoShadowAnchor = new GPoint(15, 25);
        
    priceIcons[3] = new GIcon(baseIcon);
    priceIcons[3].image = "../images/trans_flagbig.png";
    priceIcons[2] = new GIcon(baseIcon);
    priceIcons[2].image = "../images/trans_flagbig.png";
    priceIcons[1] = new GIcon(baseIcon);
    priceIcons[1].image = "../images/trans_flagbig.png";
    priceIcons[0] = new GIcon(baseIcon);
    priceIcons[0].image = "../images/trans_flagbig.png";
    
    //UPDATED
    elabelPriceIcons[0] = "<img src='../images/golf_flag_big_orange.gif' />";
    elabelPriceIcons[1] = "<img src='../images/golf_flag_big_lime.gif' />";
    elabelPriceIcons[2] = "<img src='../images/golf_flag_big_green.gif' />";
    elabelPriceIcons[3] = "<img src='../images/golf_flag_big_blue.gif' />";
        
    smallPriceIcons[3] = new GIcon(baseIcon);
    smallPriceIcons[3].image = "../images/trans_flagbig.png";
    smallPriceIcons[2] = new GIcon(baseIcon);
    smallPriceIcons[2].image = "../images/trans_flagbig.png";
    smallPriceIcons[1] = new GIcon(baseIcon);
    smallPriceIcons[1].image = "../images/trans_flagbig.png";
    smallPriceIcons[0] = new GIcon(baseIcon);
    smallPriceIcons[0].image = "../images/trans_flagbig.png";
    
     //UPDATED
    elabelSmallPriceIcons[0] = "<img src='../images/golf_flag_big_orange.gif' />";
    elabelSmallPriceIcons[1] = "<img src='../images/golf_flag_big_lime.gif' />";
    elabelSmallPriceIcons[2] = "<img src='../images/golf_flag_big_blue.gif' />";
    //elabelSmallPriceIcons[3] = "<img src='../images/golf_flag_big_blue.gif' />";
    
    unavailableIcon = new GIcon(baseIcon);
    unavailableIcon.image = "../images/trans_flagbig.png";
    
    smallUnavailableIcon = new GIcon(baseIcon);
    smallUnavailableIcon.image = "../images/trans_flagbig.png";
    
    unavailableImage = "<img src='../images/golf_flag_big_grey_s.gif' />";
    smallUnavailableImage = "<img src='../images/golf_flag_big_grey_s.gif' />";
    
    // Display initial map data
	displayMapData(clubData, regionData, false);
    
    // Show the welcome info window
 
    //map.openInfoWindowHtml(map.getCenter(), helperHtml);
    
}

// Sets initial map location/zoom
function initLocation()
{
	map.setCenter(initCoords, initZoom);
}

// Check if the map is out of bounds - correct if neccessary
function checkBounds()
{
	var currentBounds = map.getBounds();
						
	if(!maxBounds.containsBounds(currentBounds))
		initLocation();
}

// Map zoomed, refresh markers
function mapZoomed()
{
	var refresh = (expandRegions() != expandRegions(oldZoom));
	oldZoom = map.getZoom();
	
	if(refresh)
		displayMapData(clubData, regionData, expandRegions());
}

// Should regions be expanded?
function expandRegions(zoom)
{
	if(zoom)
		return(zoom >= 8);
	else
		return(map.getZoom() >= 8);
}

// Display map club/region data
function displayMapData(clubs, regions, expandRegions)
{	
	
	var saveClubInfoOpen = clubInfoOpen;
	
	map.clearOverlays();
	
	if(regions != null && expandRegions == false)
	{
		regionMarkers = new Array(regions.length);
		
		for(var i = 0; i < regions.length; i++)
		{
			var region = regions[i];
			regionMarkers[i] = makeRegionMarker(region);
			map.addOverlay(regionMarkers[i]);
			
			//UPDATED: THIRD PARTY SOFTWARE TO ENABLE ANIMATED GIF IN IE
			//CREATE ANIMATED GIF ON TOP OF THAT
			var regionImage = unavailableImage;	
			//var iconIndex = Math.ceil((club[CLUB_CURRLOW] / overallHighPrice) * 4) - 1;
			if(region[REG_PERIODLOW] != 0 && region[REG_PERIODHIGH] != 0)			
				regionImage = elabelPriceIcons[1];
				
			var label = new ELabel(new GLatLng(region[REG_MAPLAT], region[REG_MAPLNG]), regionImage, null, new GSize(-5, -1), null, true);
			map.addOverlay(label); 			
		}
	}
	
	if(clubs != null)
	{
		clubMarkers = new Array(clubs.length);

		for(var i = 0; i < clubs.length; i++)
		{
			var club = clubs[i];
		
			if(club[CLUB_REGIONID] == 0 || club[CLUB_REGIONID] == null || (club[CLUB_REGIONID] != 0 && expandRegions == true))
			{							
				clubMarkers[i] = makeClubMarker(club);
				if(club[CLUB_PERAVAIL] != -1 || club[CLUB_VOUCHERS] == true)//ONLY DISPLAY CLUB AVAILABLE IN THE RANGE 28 DAYS
				{
					map.addOverlay(clubMarkers[i]);
					
					//UPDATED: THIRD PARTY SOFTWARE TO ENABLE ANIMATED GIF IN IE
					//CREATE ANIMATED GIF ON TOP OF THAT
					var clubImage = smallUnavailableImage;	
					if(club[CLUB_CURRAVAIL] == true)
					{				
						//var iconIndex = Math.ceil((club[CLUB_CURRLOW] / overallHighPrice) * 4) - 1;
						var iconIndex = 0;
						if(club[CLUB_CURRLOW] >= 100)
							iconIndex = 2;
						else if(club[CLUB_CURRLOW] > 50 &&  club[CLUB_CURRLOW] < 100)
							iconIndex = 1;
						else
							iconIndex = 0;
						
						clubImage = elabelSmallPriceIcons[iconIndex];
					}				
			
					var label = new ELabel(new GLatLng(club[CLUB_MAPLAT], club[CLUB_MAPLNG]), clubImage, null, new GSize(-3, 0), null, true);
					map.addOverlay(label);	
				}
						
			}			
		}
		displayListOfClubsAvail();
		
	}
	
	if(saveClubInfoOpen)
	{
		var marker = arrayLookup(clubMarkers, "ClubID", saveClubInfoOpen);
		//var club = subarrayBinLookup(clubData, CLUB_ID, saveClubInfoOpen);
		var club = subarrayLookup(clubData, CLUB_ID, saveClubInfoOpen);
		
		marker.openInfoWindowHtml(getClubMarkerInfo(club));
	}
	//setTimeout("clearCursor()",1);
	clearCursor();
	
}

function displayListOfClubsAvail()
{	
	var regionSelectElem = ge('regionSelect');
	var regionId = regionSelectElem.value;
	clubCourseList = ge('dvCourseResults');
	
	clubCourseList.innerHTML = "";//clear data first
	var HTML = "";
	if(clubData != null)
	{		
		for(var i = 0; i < clubData.length; i++)
		{			
			var club = clubData[i];
		
			if(club[CLUB_CURRAVAIL] == true || club[CLUB_VOUCHERS] == true)
			{				
				if(club[CLUB_REGIONID] == regionId)
				{				
					HTML += "<tr><td width=\"120px\" style='color:green;cursor:pointer'><a href=\"javascript:displayClubMarkerInfo(" + club[CLUB_ID] + ");\">";					
					HTML +=  club[CLUB_NAME] + "</a></td>";
					HTML += "<td style='color:green;cursor:pointer' ><a href=\"javascript:displayClubMarkerInfo(" + club[CLUB_ID] + ");\">From: " + formatPriceRange(club[CLUB_CURRLOW],club[CLUB_CURRHIGH]) + "</span></td></tr>\n";														
				}
			}
		}
	}	
	if(HTML != "")
	{		
		clubCourseList.innerHTML = "<br><table cellpadding='0' cellspacing='0'>" + HTML + "</table><br>";
	
	}
}

function displayClubMarkerInfo(clubid)
{
	var club = subarrayLookup(clubData, CLUB_ID, clubid);	
	refreshClubSelect(club);
	courseSelectChange();
}

// Makes the map marker for a club
function makeClubMarker(club)
{
	// Get icon
	var clubIcon = smallUnavailableIcon;
	
	if(club[CLUB_CURRAVAIL] == true)
	{
		var iconIndex = Math.ceil((club[CLUB_CURRLOW] / overallHighPrice) * 4) - 1;
		clubIcon = smallPriceIcons[iconIndex];
	}

	// Create the marker
	var clubMarker = new GMarker(
			new GLatLng(club[CLUB_MAPLAT], club[CLUB_MAPLNG]),
			{icon: clubIcon, title: club[CLUB_NAME]}
		);
	clubMarker.ClubID = club[CLUB_ID];
		
	// Create the marker popup data
	GEvent.addListener(clubMarker, "click",
		function() { clubMarkerClick(clubMarker, club); }
	);
	
	GEvent.addListener(clubMarker, "infowindowopen",
		function() { clubInfoOpen = club[CLUB_ID]; if(clubAvail != club[CLUB_ID]) ajaxRefreshClubAvail(club[CLUB_ID]); else dateNavRefresh(dateNavPageIndex); }
	);
	
	//UPDATED *NO NEED TO FIRE DateNavRefresh WHEN CLOSE*
	
	GEvent.addListener(clubMarker, "infowindowclose",
		function() { clubInfoOpen = null; }//dateNavRefresh(dateNavPageIndex);  }
	);
		
	return clubMarker;
}

// Club marker clicked
function clubMarkerClick(marker, club)
{	
	marker.openInfoWindowHtml(getClubMarkerInfo(club));
	refreshClubSelect(club);
	courseSelectChange();
}

// Get club marker info html
function getClubMarkerInfo(club)
{
	var html = '<a style="text-decoration:underline" href="#" onclick="openClubPopup(' + club[CLUB_ID] + '); return false;"><b>' + club[CLUB_NAME] + '</b> - <i>click for profile</i></a><br>';
	if(club[CLUB_CURRAVAIL] == true)
		html += "<span style='width=70'>" + formatDate(selectedDate) + "</span>: " + "<a style=\"text-decoration:underline\" href=\"BookingChoosePositions.aspx?ClubID=" + club[CLUB_ID] + "&Date=" + formatDateForQS(selectedDate) + "\">" +"From " + formatPriceRange(club[CLUB_CURRLOW], club[CLUB_CURRHIGH]) + " - Book now!<br>" + "</a>";
	else
		html += "<span style='width=70'>" + formatDate(selectedDate) + "</span>: Unavailable<br>";
	if(club[CLUB_PERAVAIL] != -1)
	{		
		if(club[CLUB_CURRAVAIL] == false)
			html += "<span style='width=70'>Other Days</span>: " + "<a href=\"#\" style=\"text-decoration:underline\" onclick=\"dateInputElem.value = '" + club[CLUB_PERAVAIL] +"';dateInputChanged();return false;\">From " + formatPriceRange(club[CLUB_PERLOW], club[CLUB_PERHIGH]) + " </a></br>";
		else
			html += "<span style='width=70'>Other Days</span>: From " + formatPriceRange(club[CLUB_PERLOW], club[CLUB_PERHIGH]) +"<br/>";
	}
	//if(club[CLUB_CURRAVAIL] == true)
	//	html += '<div align="left"><a style="text-decoration:underline" href="BookingChoosePositions.aspx?ClubID=' + club[CLUB_ID] + '&Date=' + formatDateForQS(selectedDate) + '">Click to book a time on this date</a></div>';
	
	//If Club sells vouchers add this to infoBox
	if(club[CLUB_VOUCHERS] == true)
	{
		html += "<span style='width=140'><a href=\"voucherfindcourse.aspx?from=ttimemap&clubid="+club[CLUB_ID]+"\" class=\"voucherlnk\">Tee Times Vouchers</a></span>";
		html += "<br/><span style='width=140'><a href=\"stayplayenquiry.aspx?from=ttimemap&course="+DoEncode(club[CLUB_NAME])+"\" class=\"voucherlnk\">Stay & Play</a></span>";
	}
	return html;
}

function DoEncode(str){
	str = encodeURIComponent(str);
	//str = escape(str);
	//str = str.replace('%','%*');
	return str;
}

      
// Makes the map marker for a region
function makeRegionMarker(region)
{
	// Get icon
	//var regionIcon = unavailableIcon;
	
	//if(region[REG_PERIODLOW] != 0 && region[REG_PERIODHIGH] != 0)
	//	regionIcon = priceIcons[3];
	//var regionIcon = new GIcon(G_DEFAULT_ICON,"../images/golf_flag_big_orange.gif");
	//var regionIcon = new GIcon(baseIcon,"../images/trans_flagbig.png");

	var regionIcon = priceIcons[3];

	// Create the marker
	var regionMarker = new GMarker(
			new GLatLng(region[REG_MAPLAT], region[REG_MAPLNG]),
			{icon: regionIcon, title: region[REG_NAME]}
		);
	
	regionMarker.RegionID = region.RegionID;
		
	// Create the marker popup data
	GEvent.addListener(regionMarker, "click",
		function()
		{
			zoomRegion(region);
			refreshRegionSelect(region);
			regionSelectChange();	
			//UPDATED *	
			//ajaxRefreshRegionAvail(region[REG_ID]);		
		}
	);
	
		
	return regionMarker;
}

// Open a club popup window
function openClubPopup(id)
{
	clubPopup = window.open('ClubPopup.aspx?ClubID='+id,'','width=500,height=400,scrollbars=1');
	if (window.focus) {clubPopup.focus()}
}

// Zoom into map region
function zoomRegion(region)
{
	if(region)
		map.setCenter(new GLatLng(region[REG_MAPLAT], region[REG_MAPLNG]), region[REG_MAPZOOM]);
	else
		initLocation();
}

function zoomClub(club, region)
{
	if(club && region)
		map.setCenter(new GLatLng(club[CLUB_MAPLAT], club[CLUB_MAPLNG]), region[REG_MAPZOOM]);
	else
		initLocation();
}

/* ============== END MAP FUNCTIONS ==================== */

/* ============== DATE INPUT FUNCTIONS ==================== */

// Initial setup for date input
function dateInputSetup()
{
	dateInputElem = ge('dateInput');
	setDateInputVal(selectedDate);
}

// Date input changed
function dateInputChanged()
{	
	var result = parseDate(dateInputElem.value);
	
	if(!result)
	{
		alert('Date must be in format [dd/mm/yyyy]');
		setDateInputVal(selectedDate);
	}
	else
	{
		if(isDateDisabled(result))
		{
			alert('Date must be in range: ' + formatDate(startDate) + ' - ' + formatDate(endDate));
			setDateInputVal(selectedDate);
		}
		else
			dateNavSelectDate(result);
	}
}

// Set displayed value of the date input
function setDateInputVal(date)
{
	dateInputElem.value = formatDate(date);
}

// Is a date disabled?
function isDateDisabled(date)
{
    if ((date < startDate && !dateEqual(date, startDate)) || (date > endDate && !dateEqual(date, endDate)))
		return true;
    else
		return false;
};

/* ============== END DATE INPUT FUNCTIONS ==================== */

/* ============== DATENAV FUNCTIONS ==================== */

// Sets up datenav element cache
function dateNavSetup()
{
	for(var i = 0; i < dateNavPageSize; i++)
	{
		dateNavItems[i] = ge("dateNav_I_" + i);
		dateNavHeads[i] = ge("dateNav_H_" + i);
	}	
}

// Date nav refresh
function dateNavRefresh(pageIndex)
{
	var pageCount = dateNavGetPageCount();

	var firstDate = addDays(startDate, (pageIndex * dateNavPageSize));
	var curDate = firstDate;
	var curMonth = "";
	
	for(var i = 0; i < dateNavPageSize; i++)
	{	
		if(curMonth != curDate.getMonth())
		{
			curMonth = curDate.getMonth();
			dateNavHeads[i].innerHTML = displayMonths[curMonth];
		}
		else if(curDate.getDay() == 0)
			dateNavHeads[i].innerHTML = '<div class="dateNavHeadWE">Sun</div>';
		else if(curDate.getDay() == 6)
			dateNavHeads[i].innerHTML = '<div class="dateNavHeadWE">Sat</div>';
		else
			dateNavHeads[i].innerHTML = "";
				
		dateNavItems[i].innerHTML = curDate.getDate();
		dateNavItems[i].blur();
		dateNavItems[i].className = "";
		
		curDate = addDays(curDate, 1);
	}
	
	if(selectedDate >= firstDate)
	{
		var selIndex = daysDiff(firstDate, selectedDate);
		if(selIndex < dateNavPageSize)
			dateNavItems[selIndex].className = "dateNavItemSel";
	}
	
	if(availData )//&& (clubInfoOpen == clubAvail)) // *BUG FIXED*
	{

		for(var i = 0; i < availData.length; i++)
		{
			
			if(availData[i] >= firstDate)
			{
				var availIndex = daysDiff(firstDate, availData[i]);
				
				if(availIndex < dateNavPageSize)
					dateNavItems[availIndex].className += " dateNavItemAvail";				
			}
		}
	}

	// Refresh nav arrows
	setVis(ge('dateNav_Next'), (pageIndex == 0));
	setVis(ge('dateNav_NextGrey'), !(pageIndex == 0));
	setVis(ge('dateNav_Prev'), (pageIndex == (pageCount-1)));
	setVis(ge('dateNav_PrevGrey'), !(pageIndex == (pageCount-1)));
}

// Get total page count
function dateNavGetPageCount()
{
	return Math.ceil(daysDiff(startDate, endDate) / dateNavPageSize);
}

// Get index of page selection is in
function dateNavGetSelectedPage()
{
	//UPDATED 13 September
	dateNavPageIndex = Math.floor((daysDiff(startDate, selectedDate) / dateNavPageSize)); 
	return dateNavPageIndex;
}

function openCursor()
{	
	//document.body.style.cursor = 'wait';	
	document.getElementById("plswait").style.visibility = "visible";
	document.getElementById("plswait").style.top = mapTop + 50;	
	document.getElementById("plswait").style.left = mapLength + 375;
}

function clearCursor()
{	
	//document.body.style.cursor = '';
	document.getElementById("plswait").style.visibility = "hidden";
}


// Date nav item selected
function dateNavSelect(sel)
{	
	openCursor();	
	selectedDate = addDays(startDate, (dateNavPageIndex * dateNavPageSize) + sel);		
	dateNavRefresh(dateNavGetSelectedPage());//CHANGE THE ORDER *BUG FOUND*
	setDateInputVal(selectedDate);	
	ajaxRefreshMapData(selectedDate);	
	recordHistory();	
		
}

// Date nav item selected (by date)
function dateNavSelectDate(date)
{
	selectedDate = date;		
	dateNavRefresh(dateNavGetSelectedPage());	
	ajaxRefreshMapData(selectedDate);
	recordHistory();
}

// Next page
function dateNavNext()
{
	var pageCount = dateNavGetPageCount();
	
	if(dateNavPageIndex >= pageCount)
		dateNavPageIndex = pageCount-1;
	else
		dateNavPageIndex++;	
	
	dateNavRefresh(dateNavPageIndex);
}

// Prev page
function dateNavPrev()
{
	if(dateNavPageIndex < 0)
		dateNavPageIndex = 0;
	else
		dateNavPageIndex--;	
		
	dateNavRefresh(dateNavPageIndex);
}

/* ============== END DATENAV FUNCTIONS ==================== */

/* ============== REGION & COURSE FUNCTIONS ==================== */

// Refresh region select dropdown
function regionSelectRefresh()
{
	var regionSelectElem = ge('regionSelect');
	var added = 0;
	clearOptions(regionSelectElem);
	
	//set all region *UPDATED*
	regionSelectElem.options[0] = new Option('Australia-wide','');
	
	for(var i = 0; i < regionData.length; i++)
	{
		
		var region = regionData[i];		
		regionSelectElem.options[added+1] = new Option(region[REG_NAME], region[REG_ID]);
		added++;
	}
	
	regionSelectChange();
}

// Selected region changed.
function regionSelectChange()
{
	clubInfoOpen = null; //always clear it when region change
	var regionSelectElem = ge('regionSelect');
	var regionId = regionSelectElem.value;
	//var region = subarrayBinLookup(regionData, REG_ID, regionId);
	var region = subarrayLookup(regionData, REG_ID, regionId);
	
	var courseSelectElem = ge('courseSelect');
	var added = 0;
	clearOptions(courseSelectElem);
	
	var regionClubs;
	if(regionId == "")
		regionCourses = courseData;
	else
		regionCourses = subarraySelect(courseData, COURSE_REGIONID, regionId);
	
	for(var i = 0; i < regionCourses.length; i++)
	{
		var course = regionCourses[i];
		if(course[COURSE_CLUBNAME] == course[COURSE_NAME])
			courseSelectElem.options[added+1] = new Option(course[COURSE_CLUBNAME] , course[COURSE_ID]);
		else
			courseSelectElem.options[added+1] = new Option(course[COURSE_CLUBNAME] + " - " + course[COURSE_NAME], course[COURSE_ID]);
		added++;
	}
		
	zoomRegion(region);
	displayListOfClubsAvail();
	//UPDATED
	ajaxRefreshRegionAvail(regionId)
	//dateNavRefresh(dateNavPageIndex);
	recordHistory();	
}

// Display a region as selected
function refreshRegionSelect(region)
{
	var val;
	if(region)
		val = region[REG_ID];
	else
		val = null;

	selectOptionByVal('regionSelect', val);	
}

// Display first course of club as selected
function refreshClubSelect(club)
{
	var val;
	
	if(club)
	{
		//var course = subarrayBinLookup(courseData, COURSE_CLUBID, club[CLUB_ID]);
		var course = subarrayLookup(courseData, COURSE_CLUBID, club[CLUB_ID]);
		val = course[COURSE_ID];
	}
	else
		val = null;

	selectOptionByVal('courseSelect', val);
}

// Selected course changed
function courseSelectChange()
{
	var courseSelectElem = ge('courseSelect');
	var courseId = courseSelectElem.value;
	//var course = subarrayBinLookup(courseData, COURSE_ID, courseId);
	var course = subarrayLookup(courseData, COURSE_ID, courseId);	
	
	if(courseId != "" )
	{
		//var club = subarrayBinLookup(clubData, CLUB_ID, course[COURSE_CLUBID]);
		var club = subarrayLookup(clubData, CLUB_ID, course[COURSE_CLUBID]);
		//var region = subarrayBinLookup(regionData, REG_ID, club[CLUB_REGIONID]);
		var region = subarrayLookup(regionData, REG_ID, club[CLUB_REGIONID]);
		
		zoomClub(club, region);
			
		var clubMarker = arrayLookup(clubMarkers, "ClubID", club[CLUB_ID]);
		clubMarker.openInfoWindowHtml(getClubMarkerInfo(club));
		
		refreshRegionSelect(region);
		//UPDATED
		//ajaxRefreshRegionAvail(region[REG_ID])		
		//dateNavRefresh(dateNavPageIndex);
	}
	
	recordHistory();
}

/* ============== END REGION & COURSE FUNCTIONS ==================== */

/* ============== OFFER FUNCTIONS ==================== */

function offersRefresh()
{
	/*
	setVis(ge('offerHead'), (offerData.length > 0));
	setVis(ge('offers'), (offerData.length > 0));

	var offersHTML = '';
	
	if(offerData.length > 0)
	{
		for(var i = 0; i < offerData.length; i++)
		{
			var offer = offerData[i];
			offersHTML += '<div class="offer"><a href="#" onclick="offersSelect(' + offer[OFR_CLUBID] + '); return false;">' + offer[OFR_CLUBNAME] + '</a><br>';
			offersHTML += offer[OFR_TEXT] + '</div>';
			offersHTML += '<div class="offer"><div class="greenLine">&nbsp;</div></div>';			
		}
		
		ge('offers').innerHTML = offersHTML;
	}*/
}

function offersSelect(clubID)
{
	// Refresh display
	//var club = subarrayBinLookup(clubData, CLUB_ID, clubID);
	var club = subarrayLookup(clubData, CLUB_ID, clubID);
	
	//var region = subarrayBinLookup(regionData, REG_ID, club[CLUB_REGIONID]);
	var region = subarrayLookup(regionData, REG_ID, club[CLUB_REGIONID]);
	
	refreshRegionSelect(region);
	regionSelectChange();
	refreshClubSelect(club);
	courseSelectChange();	
}

/* ============== END OFFER FUNCTIONS ==================== */

/* ============== HISTORY FUNCTIONS ==================== */

// Record current page state for history
function recordHistory()
{
	if(!isHistoryRestoreTried)
		return;
		
	var date = "";
	if(selectedDate)
		date = selectedDate.toDateString();
	
	var region = "";
	if(ge('regionSelect').value != "")
		region = ge('regionSelect').value;
	
	var course = "";
	if(ge('courseSelect').value != "")
		course = ge('courseSelect').value;
		
	ge('historyContainer').value = date + "|" + region + "|" + course;
}

// Restore page state from history container
function restoreHistory()
{
	var cont = ge('historyContainer').value;
	var parts = cont.split("|");
	
	if(parts.length == 4)
	{	
		var restoredDate = new Date();
		restoredDate.setTime(startDate.getTime());
		if(parts[0] != "")
			restoredDate.setTime(Date.parse(parts[0]));
			
		setDateInputVal(restoredDate);
		dateNavSelectDate(restoredDate);
			
		var courseID = parts[2];
		var clubID = parts[3];
		if(courseID && courseID > 0)
		{
			// Course selected
			//var course = subarrayBinLookup(courseData, COURSE_ID, courseID);
			var course = subarrayLookup(courseData, COURSE_ID, courseID);
			
			//var club = subarrayBinLookup(clubData, CLUB_ID, course[COURSE_CLUBID]);
			var club = subarrayLookup(clubData, CLUB_ID, course[COURSE_CLUBID]);
			
			//var region = subarrayBinLookup(regionData, REG_ID, club[CLUB_REGIONID]);
			var region = subarrayLookup(regionData, REG_ID, club[CLUB_REGIONID]);
			
			zoomClub(club, region);
				
			var clubMarker = arrayLookup(clubMarkers, "ClubID", club[CLUB_ID]);
			clubMarker.openInfoWindowHtml(getClubMarkerInfo(club));
			clubInfoOpen = club[CLUB_ID];
			
			refreshRegionSelect(region);			
			//*BUGFIXED* 
			regionSelectChange();
			refreshClubSelect(club);
			
		}
		else if(clubID && clubID > 0){
			var club = subarrayLookup(clubData, CLUB_ID, clubID);
			
			var region = subarrayLookup(regionData, REG_ID, club[CLUB_REGIONID]);
			
			zoomClub(club, region);
				
			var clubMarker = arrayLookup(clubMarkers, "ClubID", club[CLUB_ID]);
			clubMarker.openInfoWindowHtml(getClubMarkerInfo(club));
			clubInfoOpen = club[CLUB_ID];
			
			refreshRegionSelect(region);			
			//*BUGFIXED* 
			regionSelectChange();
			refreshClubSelect(club);		
		}	
		else
		{
		
			var regionID = parts[1];
			if(regionID && regionID > 0)
			{
				// Region selected
				//var region = subarrayBinLookup(regionData, REG_ID, regionID);
				var region = subarrayLookup(regionData, REG_ID, regionID);
				
				refreshRegionSelect(region);
				regionSelectChange();	
				//UPDATED
				//ajaxRefreshRegionAvail(region[REG_ID])
				//dateNavRefresh(dateNavPageIndex);
			}
		}
		
		return true;
	}
	else
		return false;
}

/* ============== END HISTORY FUNCTIONS ==================== */

/* ============== AJAX FUNCTIONS ==================== */

// Fetch & display map data
function ajaxRefreshMapData(selectedDate)
{
	ScoreHistory.teetimes.BookingFindCourseMap.GetMapData(selectedDate, ajaxRefreshMapDataCallback);
}

// Fetch & display map data results
function ajaxRefreshMapDataCallback(res)
{
	// Clubs
	var newData = res.value[0];
	
	for(var i = 0; i < clubData.length; i++)
	{
		// Put in new pricing data
		var club = clubData[i];
		
		//var newClub = subarrayBinLookup(newData, CLUB_ID, club[CLUB_ID]);
		var newClub = subarrayLookup(newData, CLUB_ID, club[CLUB_ID]);
		
		
		if(newClub)
		{
			club[CLUB_CURRAVAIL] = newClub[CLUB_CURRAVAIL];
			club[CLUB_CURRLOW] = newClub[CLUB_CURRLOW];
			club[CLUB_CURRHIGH] = newClub[CLUB_CURRHIGH];
		}
		else
		{
			club[CLUB_CURRAVAIL] = false;
			club[CLUB_CURRLOW] = 0;
			club[CLUB_CURRHIGH] = 0;
		}
	}
	//clubData = newData;
	
	// Offers
	offerData = res.value[1];
	
	// Refresh display
	displayMapData(clubData, regionData, expandRegions());	
	offersRefresh();
	
	
}

// Get region availability
// UPDATED
function ajaxRefreshRegionAvail(regionID)
{
	if(regionID == "")
		regionID = 0;
	ScoreHistory.teetimes.BookingFindCourseMap.GetRegionAvailability(regionID, ajaxRefreshRegionAvailCallback);
}

// Region availability returned
// UPDATED
function ajaxRefreshRegionAvailCallback(res)
{	

	var availDates = res.value[1];
	
	if(availDates.length > 0)
	{
		availData = new Array();
		for(var i = 0; i < availDates.length; i++)
		{
			var date = new Date();
			date.setTime(Date.parse(availDates[i]));
			availData[i] = date;
		}
	}
	else
		availData = null;
	
	
	dateNavRefresh(dateNavPageIndex);
}

// Get club availability
function ajaxRefreshClubAvail(clubID)
{
	ScoreHistory.teetimes.BookingFindCourseMap.GetClubAvailability(clubID, ajaxRefreshClubAvailCallback);
}

// Club availability returned
function ajaxRefreshClubAvailCallback(res)
{
	clubAvail = res.value[0];	
	
	
	var availDates = res.value[1];
	
	if(availDates.length > 0)
	{
		availData = new Array();
		for(var i = 0; i < availDates.length; i++)
		{
			var date = new Date();
			date.setTime(Date.parse(availDates[i]));
			availData[i] = date;
		}
	}
	else
		availData = null;
	
	
	dateNavRefresh(dateNavPageIndex);
}

/* ============== END AJAX FUNCTIONS ==================== */
