var map = null;
var actionID = 1001;
var ajaxurl = "ajax/build_trip_ajax.php";
var routes = [];
var itineraries = [];
var calendars = [];
var hotels = [];
var curhotelmarker = null;
var winpopup = null;
var hotelicon = null;
var hotelicons = [];
var hotelPopupTimeout = null;
var canProceed = false;

function sendAjaxRequest(url, obj, callback)
{
	$.post(url, "ajax=ajax&ajaxargs=" + escape($.toJSON(obj)), callback, "json");
}

function getQueryString(key)
{
	var q = window.location.search.substring(1);
	var parms = q.split("&");
	var parm;
	var i;

	for (i=0; i<parms.length; i++)
	{
		parm = parms[i].split("=");
		if (parm[0] == key)
			return parm[1];
	}

	return "";
}

function urlencode(str)
{
	return escape(str).replace(/\+/g,'%2B').replace(/%20/g, '+').replace(/\*/g, '%2A').replace(/\//g, '%2F').replace(/@/g, '%40');
}

function setLoading(div)
{
	$(div).html('<img src="_images/loading1.gif" alt="loading" width="25" height="25" border="0">');
}

function initMap()
{
	var mapDiv;

	if (map)
		return;

	mapDiv = $("#map_canvas");

	if (0 == mapDiv.length)
		return;

	if (GBrowserIsCompatible())
	{
		// Center the map
		map = new GMap2(mapDiv[0]);
		//map.setMapType(G_HYBRID_MAP);
		map.addControl(new GLargeMapControl());
		//map.addControl(new GMapTypeControl());
		//map.enableScrollWheelZoom();

		map.setCenter(new GLatLng(9.91474384324173, -84.0728759765625), 7);
		hotelicon = new GIcon(G_DEFAULT_ICON, "/vamos/specials/images/hotelicon.gif");
		hotelicon.shadow = null;
		hotelicon.iconSize = new GSize(20,20);
		hotelicon.iconAnchor = new GPoint(10, 20);
	}
}

function createMarker(point,html)
{
	var marker = new GMarker(point, hotelicon);
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(html);
	});
	return marker;
}

function drawRoute(elm)
{
	var row = $(elm);
	var startid, endid;
	var rowid;

	while (!row.hasClass("trip_row"))
		row = row.parent();

	rowid = String(row[0].id);
	rowid = rowid.split("_");

	startid = $("[name=trip_loc]", row)[0].value;
	endid = $("[name=trip_dest]", row)[0].value;

	if ((startid.length == 0) || (endid.length == 0)) return;

	completeDrawRoute(startid, endid, rowid[1]);
}

function completeDrawRoute(startid, endid, routeNum)
{
	var obj  = {
		"cmd": "GETROUTE",
		"actionID": actionID,
		"startID": startid,
		"endID": endid,
		"routeNum": routeNum
	};

	sendAjaxRequest(ajaxurl, obj, myServerCallback);
}

function handleDrawRoute(obj)
{
	var polyline;
	var latlngs = [];
	var color = "#FF0000";
	var marker;
	var start;
	var i;

	clearRoute(obj.routeNum);

	if (obj.color)
		color = obj.color;

	routes[obj.routeNum] = {"route": null, "markers": [], "citynames": obj.citynames};

	if (obj.markers)
	{
		if (obj.routeNum > 1) start = 1;
		else start = 0;

		for (i=start; i<obj.markers.length; i++)
		{
			marker = new GMarker(new GLatLng(obj.markers[i][0], obj.markers[i][1]), hotelicon);
			map.addOverlay(marker);
			GEvent.addListener(marker, "mouseover", function(point) {
				return showRouteCityPopup(this, point);
			});
			GEvent.addListener(marker, "mouseout", hidePopup);

			routes[obj.routeNum].markers.push(marker);
		}
	}

	if (obj.points)
	{
		for (i=0; i<obj.latlngs.length; i++)
			latlngs.push(new GLatLng(obj.latlngs[i][0], obj.latlngs[i][1]));

		//polyline = new GPolyline.fromEncoded(color, 5, 1, obj.points, 2, obj.levels, 18);
		polyline = new GPolyline(latlngs, color, 3, 1);
		map.addOverlay(polyline);
		routes[obj.routeNum].route = polyline;
	}
}

function handleDrawRoutes(obj)
{
	var polyline;
	var latlngs = [];
	var marker;
	var start;
	var colorindex;
	var i, j;

	clearRoutes(obj.tourID);

	itineraries[obj.tourID] = {"routes": [], "markers": [], "citynames": obj.citynames};

	if (obj.markers)
	{
		for (i=0; i<obj.markers.length; i++)
		{
			marker = new GMarker(new GLatLng(obj.markers[i][0], obj.markers[i][1]), hotelicon);
			map.addOverlay(marker);
			GEvent.addListener(marker, "mouseover", function(point) {
				return showItineraryCityPopup(this, point);
			});
			GEvent.addListener(marker, "mouseout", hidePopup);

			itineraries[obj.tourID].markers.push(marker);
		}
	}

	if (obj.routes)
	{
		for (i=0; i<obj.routes.length; i++)
		{
			for (j=0; j<obj.routes[i].latlngs.length; j++)
				latlngs.push(new GLatLng(obj.routes[i].latlngs[j][0], obj.routes[i].latlngs[j][1]));

			polyline = new GPolyline(latlngs, obj.color, 3, 1);
			map.addOverlay(polyline);
			itineraries[obj.tourID].routes.push(polyline);
		}
	}
}

function clearRoute(routeNum)
{
	var i;

	if (routes[routeNum])
	{
		if (null != routes[routeNum].route)
			map.removeOverlay(routes[routeNum].route);
		for (i=0; i<routes[routeNum].markers.length; i++)
			map.removeOverlay(routes[routeNum].markers[i]);
	}
}

function clearRoutes(tourID)
{
	var i;

	if (itineraries[tourID])
	{
		if (itineraries[tourID].routes.length > 0)
		{
			for (i=0; i<itineraries[tourID].routes.length; i++)
				map.removeOverlay(itineraries[tourID].routes[i]);
		}

		for (i=0; i<itineraries[tourID].markers.length; i++)
			map.removeOverlay(itineraries[tourID].markers[i]);
	}
}

function showDistance(elm)
{
	var row = $(elm);
	var rowid;
	var locid, destid, distdiv;
	var obj;

	while (!row.hasClass("trip_row"))
		row = row.parent();

	rowid = String(row[0].id);
	rowid = rowid.split("_");

	locid = $("[name=trip_loc]", row)[0].value;
	destid = $("[name=trip_dest]", row)[0].value;

	distdiv = $(".trip_distance", row);
	if (destid.length==0)
	{
		distdiv.html("Select a above first");
		return;
	}

	setLoading(distdiv);

	obj = {
		"cmd": "GETDISTANCE",
		"actionID": actionID,
		"startID": locid,
		"endID": destid,
		"routeNum": rowid[1],
		"count": ""
	};

	sendAjaxRequest(ajaxurl, obj, myServerCallback);
} 

function handleShowDistance(obj)
{
	var row = $("#triprow_" + obj.routeNum);

	$(".trip_distance", row).html(obj.distanceHtml);
	$(".trip_hotel", row).html(obj.hotelHtml);
}

function fixItinerary()
{
	var routes = $(".trip_row");
	var lastLocID, thisLoc;
	var lastDate, thisDate;
	var recalculate = false;
	var i;

	for (i=1; i<routes.length; i++)
	{
		lastLocID = $("[name=trip_dest]", $(routes[i-1]))[0].value;
		lastDate = $("[name=trip_ret_date]", $(routes[i-1]))[0].value;

		thisLoc = $("[name=trip_loc]", $(routes[i]))[0];
		thisDate = $("[name=trip_ret_date]", $(routes[i-1]))[0];

		if (thisLoc.value != lastLocID)
			thisLoc.value = lastLocID;

		if (thisDate.value != lastDate)
		{
			thisDate.value = lastDate;
			calcNights($(routes[i]));
		}
	}

	return calculateItinerary();
}

function calculateItinerary()
{
	var frm = $("#form")[0];
	var routeNum;
	var rowdata = [];
	var rowelm;
	var row;
	var obj;

	routeNum = 0;
	do {
		routeNum++;
		row = $("#triprow_" + routeNum);
		if (0 == row.length)
			break;

		if (($("[name=trip_hotel]", row).length == 0) ||
			($("[name=trip_hotel]", row)[0].value.length == 0))
		{
			alert("You must select a destination for leg " + String(routeNum) + " of your trip.");
			return false;
		}

		if (($("[name=trip_dep_date]", row)[0].value.length == 0) ||
			($("[name=trip_dep_date]", row)[0].value.length == 0))
		{
			alert("You must select departure and destination dates for leg " + String(routeNum) + " of your trip.");
			return false;
		}

		rowelm = {
			"startID": $("[name=trip_loc]", row)[0].value,
			"destID": $("[name=trip_dest]", row)[0].value,
			"hotel": $("[name=trip_hotel]", row)[0].value,
			"tripDept": $("[name=trip_dep_date]", row)[0].value,
			"tripRet": $("[name=trip_ret_date]", row)[0].value,
			"nights": $("[name=trip_nights]", row)[0].value
		};
		rowdata.push(rowelm);
	} while (true);

	$(".trip_message").html('<img src="_images/loading1.gif" alt="loading" width="25" height="25" border="0">');

	if (rowdata.length > 0)
	{
		obj = {
			"cmd": "GETITINERARY",
			"actionID": actionID,
			"itinerary": rowdata
		};
	
		sendAjaxRequest(ajaxurl, obj, myServerCallback);
	}

	return true;
} 

function handleCalculateItinerary(obj)
{
	var frm = $("#form")[0];

	$(".trip_message").empty();

	frm.itinerary_days.value = obj.itineraryDays;
	frm.itinerary_start.value = obj.itineraryStart;
	frm.itinerary_end.value = obj.itineraryEnd;
	frm.itinerary_guests.value = obj.itineraryGuests;
	frm.itinerary_rooms.value = obj.itineraryRooms;
	frm.itinerary_total.value = obj.itineraryTotal / obj.itineraryGuests;

	$("#itinerary_total_name").html("<nobr><font color='green' size='3'>" + formatMoney(obj.itineraryTotal / obj.itineraryGuests, 2) + " USD</font></nobr> <font size='2'>per person</font>");

	if (canProceed)
		handleProceedToBooking();
}

function doAddAnotherDay()
{
	var routes = $(".trip_row");
	var routeNum = routes.length + 1;
	var dayNum = 1;
	var prevRow = $("#triprow_" + String(routeNum - 1));
	var tripNights = $("[name=trip_nights]");
	var tripDept;
	var locID;
	var obj;
	var i;

	if (!fixItinerary())
		return;

	if (prevRow.length > 0)
	{
		for (i=0; i<tripNights.length; i++)
			dayNum += parseInt(tripNights[i].value);

		locID = $("[name=trip_dest]", prevRow)[0].value;
		tripDept = $("[name=trip_ret_date]", prevRow)[0].value;
	}
	else
	{
		locID = 0;
		tripDept = "";
	}

	obj = {
		"cmd": "GETROW",
		"actionID": actionID,
		"routeNum": routeNum,
		"dayNum": dayNum,
		"locID": locID,
		"tripDept": tripDept
	};

	$(".trip_message").html('<img src="_images/loading1.gif" alt="loading" width="25" height="25" border="0">');

	sendAjaxRequest(ajaxurl, obj, myServerCallback);	
}

function handleAddAnotherDay(obj)
{
	var frm = $("#form")[0];
	var row;

	$(".trip_message").empty();

	if (obj.tripRowHtml)
	{
		if (1 == obj.routeNum)
			$("#btnRemoveLastDay").hide();
		else
			$("#btnRemoveLastDay").show();

		row = $("#triprow_" + obj.routeNum);
		if (0 == row.length)
			$("#trip_content").append(obj.tripRowHtml);
		else
			row.replaceWith(obj.tripRowHtml);

		row = $("#triprow_" + obj.routeNum);

		initCalendar();
		calcNights(row);
	}
}

function handleAddDays(obj)
{
	var frm = $("#form")[0];

	$(".trip_message").empty();

	if (obj.tripRowHtml)
	{
		if (obj.numroutes <= 1)
			$("#btnRemoveLastDay").hide();
		else
			$("#btnRemoveLastDay").show();

		$("#trip_content").append(obj.tripRowHtml);

		initCalendar();
	}
}

function doRemoveLastDay()
{
	var newroutes = [];
	var row;
	var i = 0;

	do {
		i++;
		row = $("#triprow_" + i);
		if (0 == row.length)
			break;
	} while (true);
	
	row = $("#triprow_" + (i - 1));
	row.remove();

	if (3 == i)
		$("#btnRemoveLastDay").hide();

	clearRoute(routes.length - 1);

	for (i=0; i<routes.length - 1; i++)
		newroutes.push(routes[i]);

	routes = newroutes;
}

function doStartOver()
{
	var frm = $("#form")[0];
	var rows = $(".trip_row").length;
	var i;

	$("#trip_content").empty();

	for (i=1; i<=rows; i++)
		clearRoute(i);

	frm.itinerary_days.value = "";
	frm.itinerary_start.value = "";
	frm.itinerary_end.value = "";
	frm.itinerary_guests.value = "";
	frm.itinerary_rooms.value = "";
	frm.itinerary_total.value = "";

	$("#itinerary_total_name").empty();

	doAddAnotherDay();
}

function doDisplayItinerary(arr)
{
	var obj;
	var i;

	$("#trip_content").empty();

	for (i=0; i<arr.length; i++)
		completeDrawRoute(arr[i].triploc, arr[i].tripdest, i+1);

	obj = {
		"cmd": "GETROWS",
		"actionID": actionID,
		"rowdata": arr
	};

	sendAjaxRequest(ajaxurl, obj, myServerCallback);
}

function doTripSummary()
{
	fixItinerary();
}

function calcNights(row, dateText)
{
	var nights;
	var arrDate;
	var retDate;
	var dt, dt2;

	nights = $("[name=trip_nights]", row);
	arrDate = $("[name=trip_dep_date]", row);
	retDate = $("[name=trip_ret_date]", row);

	if (!dateText)
		dateText = arrDate[0].value;

	dt = dateText.split("-");

	if (3 == dt.length)
	{
		dt = new Date(dt[0] + ' ' + dt[1] + ' ' + dt[2]);
		dt.setUTCDate(dt.getUTCDate() + parseInt(nights[0].value));

		dt2 = dt.toUTCString();
		dt2 = dt2.split(" ");
		retDate[0].value = dt2[1] + '-' + dt2[2] + '-' + dt2[3];
	}
}

function doHotelPopup(url)
{
	if ((null == winpopup) || (winpopup.closed))
		winpopup = window.open(url, "_blank", "top=20,left=20,width=550,height=450,toolbar=1,menubar=1,scrollbars=1,resizable=1");
	else
		winpopup.window.location = url;
}

function doUpdateItineraries(elm, tourid, num)
{
	var legend;
	var obj;
	var x, count;

	x = 0;
	do {
		x++;
		legend = $("#legend_" + String(x));
		if (0 == legend.length) break;
		legend.hide();
	} while (true);

	for (x in itineraries)
	{
		if (itineraries[x] && (itineraries[x].routes.length > 0))
			clearRoutes(x);
	}

	if (elm.checked)
	{
		legend = $("#legend_" + String(num));

		legend.show();

		obj  = {
			"cmd": "GETROUTESBYTRIPID",
			"actionID": actionID,
			"tourID": tourid
		};
	
		sendAjaxRequest(ajaxurl, obj, myServerCallback);
	}
	else
	{
		legend.hide();
		clearRoutes(tourid);
	}
}

function initHotelCounts()
{
	var popup = $(".popup");
	var obj = {
		"cmd": "GETHOTELCOUNTS",
		"actionID": actionID
	};

	popup.bind("mouseenter", null, cancelHideHotelPopup);
	popup.bind("mouseleave", null, startHideHotelPopup);

	sendAjaxRequest(ajaxurl, obj, myServerCallback);
}

function handleGetHotelCounts(obj)
{
	var marker;
	var i;

	if (obj.locations)
	{
		for (i=0; i<obj.locations.length; i++)
		{
			marker = new GMarker(new GLatLng(obj.locations[i].latitude, obj.locations[i].longitude), hotelicon);
			map.addOverlay(marker);
			obj.locations[i].marker = marker;
			GEvent.addListener(marker, "mouseover", function(point) {
				return showHotelCountPopup(this, point);
			});
			GEvent.addListener(marker, "mouseout", startHideHotelPopup);

			hotels.push(obj.locations[i]);
		}
	}
}

function showHotelCountPopup(overlay, point)
{
	var popup = $(".popup");
	var contents = $(".popup_contents");
	var rating;
	var html;
	var elm = $("#map_canvas");
	var root = elm.parent();
	var p;
	var i;

	cancelHideHotelPopup();

	root.css({"position": "relative"});
	popup.css({"position": "absolute"});
	root.append(popup);

	p = map.fromLatLngToContainerPixel(point);

	contents.css({"width": ""});

	for (i=0; i<hotels.length; i++)
	{
		if (overlay == hotels[i].marker)
		{
			html = "<table><tr><td>" + 
				"<b><a href='javascript:void(0)' onclick='doSetDestination(" + String(i) + ")'>" + hotels[i].name + "</a></b><br /><br />" +
				String(hotels[i].Count) + " Hotels" +
				"</td></tr></table>";

			contents.empty().append(html);

			popup.css({"visibility": "", "display": ""});

			p.x -= Math.floor(popup[0].offsetWidth / 2);
			p.y -= 35 + popup[0].offsetHeight;
			p.x += elm[0].offsetLeft;
			p.y += elm[0].offsetTop;

			popup.css({"left": String(p.x) + "px", "top": String(p.y) + "px"});
		}
	}
}

function doSetDestination(index)
{
	var dest = $("#trip_dest")[0];
	var i;

	for (i=0; i<dest.options.length; i++)
	{
		if (dest.options[i].value == hotels[index].id)
		{
			dest.selectedIndex = i;
			break;
		}
	}
	$("#form")[0].submit();
}

function initHotels(destID)
{
	var frm = $("[name=frmHotel]")[0];
	var obj = {
		"cmd": "GETHOTELS",
		"actionID": actionID,
		"destID": destID,
		"max_x": 80,
		"max_y": 100,
		"selfurl": window.location.pathname,
		"adult": (-1 != frm.adult.selectedIndex) ? frm.adult.options[frm.adult.selectedIndex].value : "",
		"child": (-1 != frm.child.selectedIndex) ? frm.child.options[frm.child.selectedIndex].value : "",
		"rooms": (-1 != frm.rooms.selectedIndex) ? frm.rooms.options[frm.rooms.selectedIndex].value : "",
		"night": (-1 != frm.night.selectedIndex) ? frm.night.options[frm.night.selectedIndex].value : "",
		"trip_dep_date": frm.trip_dep_date.value,
		"sort": getQueryString("sort"),
		"order": getQueryString("order")
	};

	sendAjaxRequest(ajaxurl, obj, myServerCallback);
}

function handleGetHotels(obj)
{
	var bounds, pt;
	var marker;
	var zoomlevel;
	var i;

	if (obj.hotels && (obj.hotels.length > 0))
	{
		pt = new GLatLng(obj.hotels[0].latitude, obj.hotels[0].longitude);
		bounds = new GLatLngBounds(pt, pt);

		for (i=0; i<obj.hotels.length; i++)
		{
			hotelicons[i] = new GIcon(G_DEFAULT_ICON, "/vamos/specials/images/hotels/grey" + String(i+1) + ".png");
			hotelicons[i].shadow = null;
			hotelicons[i].iconSize = new GSize(20,20);
			hotelicons[i].iconAnchor = new GPoint(10, 20);

			marker = new GMarker(new GLatLng(obj.hotels[i].latitude, obj.hotels[i].longitude), hotelicons[i]);
			map.addOverlay(marker);
			obj.hotels[i].marker = marker;
			GEvent.addListener(marker, "mouseover", function(point) {
				var i;
				if (null != curhotelmarker)
				{
					$("#hoteltable tr").removeClass("rowhighlight");
					for (i=0; i<hotels.length; i++)
					{
						if (hotels[i].marker == curhotelmarker)
						{
							curhotelmarker.setImage("/vamos/specials/images/hotels/grey" + String(i+1) + ".png");
							break;
						}
					}
				}

				for (i=0; i<hotels.length; i++)
				{
					if (hotels[i].marker == this)
					{
						this.setImage("/vamos/specials/images/hotels/green" + String(i+1) + ".png");
						curhotelmarker = this;

						$($("#hoteltable tr")[i+1]).addClass("rowhighlight");
						break;
					}
				}
				return showHotelPopup(this, point);
			});
			/*
			GEvent.addListener(marker, "mouseout", function() {
				var i;
				for (i=0; i<hotels.length; i++)
				{
					if (hotels[i].marker == this)
					{
						this.setImage("/vamos/specials/images/hotels/grey" + String(i+1) + ".png");
						$($("#hoteltable tr")[i+1]).removeClass("rowhighlight");
						break;
					}
				}
				hidePopup();
			});
			*/
			if ("" != obj.hotels[i].HotelWebSite)
				GEvent.addListener(marker, "click", function(point) {
					return hotelPopupRedirect(this, point);
				});

			hotels.push(obj.hotels[i]);
			if (0 != i)
				bounds.extend(new GLatLng(obj.hotels[i].latitude, obj.hotels[i].longitude));
		}

		zoomlevel = map.getBoundsZoomLevel(bounds) - 1;
		if (zoomlevel > 13) zoomlevel = 13;

		map.setCenter(bounds.getCenter(), zoomlevel);

		$("#hoteltable").empty().html(obj.table);
	}
}

function doHighlightIcon(hotelid, num)
{
	var i;

	if (null != curhotelmarker)
	{
		$("#hoteltable tr").removeClass("rowhighlight");
		for (i=0; i<hotels.length; i++)
		{
			if (hotels[i].marker == curhotelmarker)
			{
				curhotelmarker.setImage("/vamos/specials/images/hotels/grey" + String(i+1) + ".png");
				break;
			}
		}
	}

	curhotelmarker = hotels[num-1].marker;
	curhotelmarker.setImage("/vamos/specials/images/hotels/green" + String(num) + ".png");
	showHotelPopup(curhotelmarker, curhotelmarker.getLatLng());
	$($("#hoteltable tr")[num]).addClass("rowhighlight");
}

function doUnhighlightIcon(hotelid, num)
{
	var i;

	$("#hoteltable tr").removeClass("rowhighlight");

	if (hotelid)
		hotels[num-1].marker.setImage("/vamos/specials/images/hotels/grey" + String(num) + ".png");
	else if (null != curhotelmarker)
	{
		for (i=0; i<hotels.length; i++)
		{
			if (hotels[i].marker == curhotelmarker)
			{
				hotels[i].marker.setImage("/vamos/specials/images/hotels/grey" + String(i+1) + ".png");
				break;
			}
		}
	}

	curhotelmarker = null;
}

function showRouteCityPopup(overlay, point)
{
	var popup = $(".popup");
	var contents = $(".popup_contents");
	var rating;
	var html;
	var elm = $("#map_canvas");
	var root = elm.parent();
	var p;
	var routeNum;
	var cityName;
	var i;

	root.css({"position": "relative"});
	popup.css({"position": "absolute"});
	root.append(popup);

	p = map.fromLatLngToContainerPixel(point);

	contents.css({"width": ""});

	for (routeNum in routes)
	{
		for (i=0; i<routes[routeNum].markers.length; i++)
		{
			if (overlay == routes[routeNum].markers[i])
			{
				if (routes[routeNum].markers.length < 2)
					cityName = routes[routeNum].citynames[routes[routeNum].citynames.length - 1];
				else
					cityName = routes[routeNum].citynames[i];

				html = "<table><tr><td><h4>" + cityName + "</h4></td></tr></table>";
				contents.empty().append(html);

			popup.css({"visibility": "", "display": ""});

				p.x -= Math.floor(popup[0].offsetWidth / 2);
				p.y -= 35 + popup[0].offsetHeight;
				p.x += elm[0].offsetLeft;
				p.y += elm[0].offsetTop;

				popup.css({"left": String(p.x) + "px", "top": String(p.y) + "px"});
				break;
			}
		}
	}
}

function showItineraryCityPopup(overlay, point)
{
	var popup = $(".popup");
	var contents = $(".popup_contents");
	var rating;
	var html;
	var elm = $("#map_canvas");
	var root = elm.parent();
	var p;
	var tourID;
	var cityName;
	var i;

	root.css({"position": "relative"});
	popup.css({"position": "absolute"});
	root.append(popup);

	p = map.fromLatLngToContainerPixel(point);

	contents.css({"width": ""});

	for (tourID in itineraries)
	{
		for (i=0; i<itineraries[tourID].markers.length; i++)
		{
			if (overlay == itineraries[tourID].markers[i])
			{
				if (itineraries[tourID].markers.length < 2)
					cityName = itineraries[tourID].citynames[itineraries[tourID].citynames.length - 1];
				else
					cityName = itineraries[tourID].citynames[i];

				html = "<table><tr><td><h4>" + cityName + "</h4></td></tr></table>";
				contents.empty().append(html);

				popup.css({"visibility": "", "display": ""});

				p.x -= Math.floor(popup[0].offsetWidth / 2);
				p.y -= 35 + popup[0].offsetHeight;
				p.x += elm[0].offsetLeft;
				p.y += elm[0].offsetTop;

				popup.css({"left": String(p.x) + "px", "top": String(p.y) + "px"});
			}
		}
	}
}

function doShowHotelPopup(id)
{
	var point;
	var i;

	for (i=0; i<hotels.length; i++)
	{
		if (hotels[i].HotelID == id)
		{
			point = new GLatLng(hotels[i].latitude, hotels[i].longitude);
			map.setCenter(point, map.getZoom());
			showHotelPopup(hotels[i].marker, point);
			break;
		}
	}
}

function showHotelPopup(overlay, point)
{
	var popup = $(".popup");
	var contents = $(".popup_contents");
	var rating;
	var html;
	var elm = $("#map_canvas");
	var root = elm.parent();
	var frm = $("#form")[0];
	var persons;
	var rate;
	var p;
	var i;

	cancelHideHotelPopup();

	root.css({"position": "relative"});
	popup.css({"position": "absolute"});
	root.append(popup);

	p = map.fromLatLngToContainerPixel(point);

	contents.css({"width": ""});

	if (frm.adult.selectedIndex != -1)
		persons = Number(frm.adult.options[frm.adult.selectedIndex].value);
	else
		persons = 1;

	for (i=0; i<hotels.length; i++)
	{
		if (overlay == hotels[i].marker)
		{
			if (0 != hotels[i].Rating)
				rating = hotels[i].ratingHtml;
			else
				rating = "Unrated";

			switch (persons)
			{
				case 1:
					rate = hotels[i].SglRate;
					break;
				case 2:
					rate = hotels[i].DblRate;
					break;
				case 3:
					rate = hotels[i].TrplRate;
					break;
				default:
					rate = "";
					break;
			}

			html = "<table cellpadding='0' cellspacing='0'><tr style='background-color: #ECC063; color: green;'><td><h4>" + hotels[i].HotelName +
				"</h4></td><td width='20' style='text-align: center;'><img src='images/cancel.png' " +
				"style='cursor: pointer;' onclick='hidePopup(); doUnhighlightIcon();' /></td></tr>" +
				"<tr><td colspan='2'><table><tr>";
			if ("" != hotels[i].image)
				html += "<td align='center' width='" + String(hotels[i].scale_x + 10) +
					"'><img class='thumb' src='http://www.oceaniatdm.com/imagebank/" +
					hotels[i].image + "' alt='' width='" + hotels[i].scale_x + "' height='" + hotels[i].scale_y + "' />" +
					"</td>";

			html += "<td>" + rating + "<br />" +
				"<span style='font-size: 14px;'>" + String(hotels[i].NumOfRooms) + " Rooms</span><br />" +
				"<span style='font-size: 14px;'>Starting at $" + rate +
				" per night</span></td></tr></table></td></tr>" +
				"<tr><td colspan='2'><table><tr><td>" +
				"<div style='text-align: right; font-size: 10px;'>Book Online or " +
				"call 1-800-950-8426 (US \u0026 Canada)<br />" +
				"++ (506) 2432-5270 (international direct)</div>" +
				"</td><td width='30'><img src='images/selectblue.png' style='cursor: pointer;' " +
				"onclick=\"doHotelPopup('" + hotels[i].detailurl + "')\" />" +
				"</td></tr></table></td></tr></table>";
			contents.empty().append(html);

			popup.css({"visibility": "", "display": ""});

			p.x -= Math.floor(popup[0].offsetWidth / 2);
			p.y -= 35 + popup[0].offsetHeight;
			p.x += elm[0].offsetLeft;
			p.y += elm[0].offsetTop;

			popup.css({"left": String(p.x) + "px", "top": String(p.y) + "px"});
		}
	}
}

function startHideHotelPopup()
{
	cancelHideHotelPopup();
	hotelPopupTimeout = setTimeout("hidePopup()", 1000);
}

function cancelHideHotelPopup()
{
	if (null != hotelPopupTimeout)
	{
		clearTimeout(hotelPopupTimeout);
		hotelPopupTimeout = null;
	}
}

function hidePopup()
{
	hotelPopupTimeout = null;
	$(".popup").css({"display": "none"});
}

function proceedToBooking()
{
	canProceed = true;

	fixItinerary();
}

function handleProceedToBooking()
{
	var final_frm = $("#form");
	var frm = $("#form")[0];
	var routeNum;
	var row;
	var elm;

	routeNum = 0;
	do {
		routeNum++;
		row = $("#triprow_" + routeNum);
		if (0 == row.length)
			break;

		if (($("[name=trip_hotel]", row).length == 0) ||
			($("[name=trip_hotel]", row)[0].value.length == 0))
		{
			alert("You must select a destination for leg " + String(routeNum) + " of your trip.");
			return;
		}

		if (($("[name=trip_dep_date]", row)[0].value.length == 0) ||
			($("[name=trip_dep_date]", row)[0].value.length == 0))
		{
			alert("You must select departure and destination dates for leg " + String(routeNum) + " of your trip.");
			return;
		}

		final_frm.append(
			"<input type='hidden' name='triploc_" + String(routeNum) + "' value='" + $("[name=trip_loc]", row)[0].value.replace("'", "''") + "' />" +
			"<input type='hidden' name='tripdest_" + String(routeNum) + "' value='" + $("[name=trip_dest]", row)[0].value.replace("'", "''") + "' />" +
			"<input type='hidden' name='tripdist_" + String(routeNum) + "' value='" + escape($(".trip_distance", row)[0].innerHTML) + "' />" +
			"<input type='hidden' name='triphotel_" + String(routeNum) + "' value='" + $("[name=trip_hotel]", row)[0].value.replace("'", "''") + "' />" +
			"<input type='hidden' name='tripdepdate_" + String(routeNum) + "' value='" + $("[name=trip_dep_date]", row)[0].value.replace("'", "''") + "' />" +
			"<input type='hidden' name='tripretdate_" + String(routeNum) + "' value='" + $("[name=trip_ret_date]", row)[0].value.replace("'", "''") + "' />" +
			"<input type='hidden' name='tripnights_" + String(routeNum) + "' value='" + $("[name=trip_nights]", row)[0].value.replace("'", "''") + "' />"
		);
	} while (true);

	final_frm.submit();
}

function hotelPopupRedirect(overlay, point)
{
	var frm = document.getElementsByTagName("form");
	var i;

	for (i=0; i<frm.length; i++)
	{
		if (frm[i].name == "frmHotel")
		{
			frm = frm[i];
			break;
		}
	}

	for (i=0; i<hotels.length; i++)
	{
		if (overlay == hotels[i].marker)
		{
			//window.open(hotels[i].HotelWebSite, "_blank");
			window.location = "hotel_detail.php?hID=" + hotels[i].HotelID +
				"&adult=" + frm.adult.value +
				"&child=" + frm.child.value +
				"&rooms=" + frm.rooms.value +
				"&date=" + urlencode(frm.trip_dep_date.value) +
				"&night=" + frm.night.value +
				"&cityName=" + urlencode(hotels[i].cityName) +
				"&cityid=" + hotels[i].CityID;
			break;
		}
	}
}

function displayLocation(lat, lng)
{
	var point = new GLatLng(lat, lng);
	var marker = new GMarker(point, hotelicon);
	map.addOverlay(marker);
	map.setCenter(point, 15);
}

function showHotelLocation(rec)
{
	if (rec)
		hotels = [rec];
	if (!map)
	{
		setTimeout("showHotelLocation(null)", 250);
		return;
	}

	displayLocation(rec.latitude, rec.longitude);
}

function initCalendar()
{
	var dp = $(".date-pick");
	var b = $(".date-pick-button");

	$(document).ready(function() {
		var nights;
		var ret;
		var dt;
		var i;

		for (i=0; i<dp.length; i++)
		{
	  	Calendar.setup({
				"inputField": dp[i],
				"ifFormat": "%e-%b-%Y",
				"button": b[i],
				"onUpdate": function(inst) {
					var elm = $(inst.params.inputField);
					var nights;
					var dt2;

					while (!elm.hasClass("trip_row"))
						elm = elm.parent();

					ret = $("[name=trip_ret_date]", elm)[0];
					nights = parseInt($("[name=trip_nights]", elm)[0].value);
					dt = inst.params.inputField.value;
					dt = dt.split("-");
					dt = new Date(dt[0] + ' ' + dt[1] + ' ' + dt[2]);
					dt.setUTCDate(dt.getUTCDate() + nights);

					dt2 = dt.toUTCString();
					dt2 = dt2.split(" ");
					ret.value = dt2[1] + '-' + dt2[2] + '-' + dt2[3];
				}
	  	});
  	}
	});
}

function myServerCallback(obj)
{
	switch (obj.cmd)
	{
		case "GETROUTE":
			handleDrawRoute(obj);
			break;
		case "GETROUTESBYTRIPID":
			handleDrawRoutes(obj);
			break;
		case "GETDISTANCE":
			handleShowDistance(obj);
			break;
		case "GETITINERARY":
			handleCalculateItinerary(obj);
			break;
		case "GETROW":
			handleAddAnotherDay(obj);
			break;
		case "GETROWS":
			handleAddDays(obj);
			break;
		case "GETHOTELCOUNTS":
			handleGetHotelCounts(obj);
			break;
		case "GETHOTELS":
			handleGetHotels(obj);
			break;
		default:
			break;
	}

	actionID++;
}

function toggleSelect(elm)
{
	$(elm).next('div').toggleClass('hide');
}

function togglePlus(elm)
{
	$(elm).parent().parent().next('div').toggleClass('hide');
	$(elm).toggleClass('clicked');
}

function selectValue(elm, val, name)
{
	var p = $(elm);

	while (!p.hasClass("hotel_select"))
		p = p.parent();

	$("input[name=trip_hotel]", p)[0].value = val;
	$(".hotel_item div", p).html(name);

	toggleSelect($("h2", p)[0]);
}

function alterTabLinks(elm)
{
	var linkarray = $(".navcontainer a");
	var uri, query;
	var i;

	for (i=0; i<linkarray.length; i++)
	{
		query = linkarray[i].href.split("?");
		if (query.length > 1)
		{
			uri = query[0];
			window.location = uri + "?category=" + urlencode(elm.options[elm.selectedIndex].value) + "&page=" + getQueryString("page");
		}
	}
}

function formatMoney(cur, decplaces)
{
	var s1 = String(cur);
	var decimal = s1.indexOf(".");
	var places = (-1 != decimal) ? decimal : s1.length;
	var s2 = "";
	var s3 = (-1 != decimal) ? s1.substr(decimal + 1) : "";
	var i;

	if (0 != decplaces)
		s3 = formatDecimal("." + s3, decplaces);
	else
		s3 = "";

	for (i=(places-1); i>=0; i--)
	{
		s2 = s1.substr(i, 1) + s2;
		if ((0 != i) && (0 == ((places - i) % 3)))
			s2 = "," + s2;
	}

	return "$" + s2 + s3;
}

function formatDecimal(dec, places)
{
	var s = String(dec);
	var i = s.indexOf(".");
	var j, k;

	if (-1 == i)
	{
		s += ".";
		i = s.length - 1;
	}

	j = (s.length - 1) - i;
	if (j < places)
	{
		for (k=j; k<places; k++)
			s += "0";
	}
	else
		s = s.substr(0, s.length - (j - places));

	return s;
}

