var tinyIcon = new GIcon();
tinyIcon.image = "http://www.fluidnetwork.co.uk/gfx/mm_20_red.png";
tinyIcon.shadow = "http://www.fluidnetwork.co.uk/gfx/mm_20_shadow.png";
tinyIcon.iconSize = new GSize(12, 20);
tinyIcon.shadowSize = new GSize(22, 20);
tinyIcon.iconAnchor = new GPoint(6, 20);
tinyIcon.infoWindowAnchor = new GPoint(5, 1);

var map;
var venueList = new CCollection();

function moveMap() {
	var center = map.getCenter();
	
	GDownloadUrl("google_map_data.aspx?F=" + moveFunction + "&GridX=" + center.lat() + "&GridY=" + center.lng() + "&RecordCount=25", 
		function(data, responseCode) {  
			var xml = GXml.parse(data);  
			var markers = xml.documentElement.getElementsByTagName("Venue");

			for (var i = 0; i < markers.length; i++) {
				var liveBookingLink = GXml.value(markers[i].getElementsByTagName("LiveBookingProduct_ID")[0]);
				if (liveBookingLink != "") {
					liveBookingLink = liveBookingLink + "<br />";
				}
				
				createPointUnique(parseFloat(GXml.value(markers[i].getElementsByTagName("GridX")[0]))
					, parseFloat(GXml.value(markers[i].getElementsByTagName("GridY")[0]))
					, GXml.value(markers[i].getElementsByTagName("UniqueName")[0])
					, false
					, parseFloat(markers[i].getAttribute("id"))
					, GXml.value(markers[i].getElementsByTagName("Name")[0])
					, GXml.value(markers[i].getElementsByTagName("Thumb")[0])
					, liveBookingLink
					, GXml.value(markers[i].getElementsByTagName("Address")[0])
					, GXml.value(markers[i].getElementsByTagName("Type")[0])
					, GXml.value(markers[i].getElementsByTagName("RatingAtmos")[0])
					, GXml.value(markers[i].getElementsByTagName("RatingVal")[0])
					, GXml.value(markers[i].getElementsByTagName("RatingQual")[0])
					, GXml.value(markers[i].getElementsByTagName("Phone")[0])
					, GXml.value(markers[i].getElementsByTagName("Offers")[0])
					);
			}
		});
}

function ShowStars(rating) {
	if (rating == 0) return "Unknown";
	var output = '';
	var currentStar = 0;
	var partial = rating - Math.floor(rating);

	for (var i=0;i<Math.floor(rating);i++) {
		output += "<img src='gfx/general/star_w_f.png' width='8' height='8' alt=''>";
		currentStar++;
	}

	if (partial > 0.333 && partial < 0.666) {
		output += "<img src='gfx/general/star_w_h.png' width='8' height='8' alt=''>";
		currentStar++;
	} else if (partial >= 0.666) {
		output += "<img src='gfx/general/star_w_f.png' width='8' height='8' alt=''>";
		currentStar++;
	}

	for (var i=currentStar;i<5;i++) {
		output += "<img src='gfx/general/star_w_e.png' width='8' height='8' alt=''>";
	}

	return output;
}

function CCollection() {
     var m_length = 0;

     this.add = _add;
     this.length = _length;
	 this.exists = _exists;
 	 this.remove = _remove;
	
	function _add(key) {
		if (key == null) return;
	
		if (this.exists(key) > -1) return;
	
		m_length++;
		this[(m_length - 1)] = key;
	}

     function _length() { return m_length } 
	 
	 function _exists(key) {
	  	var found = -1;
	 	for (var i=0; i<this.length(); i++) {
			if (this[i] == key) {
				found = i;
				break;
			}
		}
		
		return found;
	 }
	 
	function _remove(index) {
		if (index < 0 || index > this.length - 1) return;
		
		this[index] = null;

		for (var i = index; i < m_length; i++)
			this[i] = this[i + 1];

		m_length--;
	}
}

function CVenue() {
	var GridX;
	var GridY;
	var UniqueName;
	var PrimaryFlag;
	var VenueID;
	var VenueName;
	var VenueThumb;
	var BookingLink;
	var VenueAddress;
	var VenueType;
	var RatingAtmos;
	var RatingVal;
	var RatingQual;
	var Phone;
	var Offers;
	var Marker;
}

function VenueExistsByGridRef(Venue) {
	var found = -1;
	
	for (var i = 0; i < venueList.length(); i++) {
		if (venueList[i].GridX == Venue.GridX && venueList[i].GridY == Venue.GridY) {
			found = i;
			break;
		}
	}
	
	return found;
}

function VenueExistsByUniqueName(UniqueName) {
	var found = -1;
	for (var i = 0; i < venueList.length(); i++) {
		if (venueList[i].UniqueName == UniqueName) {
			found = i;
			break;
		}
	}
	
	return found;
}

function createInfoWindow(venueID, venueName, venueThumb, bookingLink, venueAddress, venueType, ratingAtmos, ratingVal, ratingQual, phone, offers) {
	var img = '';

	if (venueThumb != '') {
	    img = '<a href="venuedetails.aspx?venueID=' + venueID + '" title="View ' + venueName + ' on Fluid Network"><img src="' + venueThumb + '" width=50 height=50 alt="' + venueName + '" style="float: left; margin-right: 5px" /></a>\n';
	}
	
	var rating = '';
	if (ratingAtmos > 0 && ratingVal > 0 && ratingQual > 0) {
	    var avgRating = (ratingAtmos + ratingVal + ratingQual) / 3;
		rating = 'Rating: ' + ShowStars(avgRating) + '<br />\n';
	}

	var title = '<strong><a href="venuedetails.aspx?venueID=' + venueID + '">' + venueName + '</a></strong><small>';
	if (offers != '' && offers != undefined)
		title = '<strong>' + offers + '</strong><br /><small><a href="venuedetails.aspx?venueID=' + venueID + '">' + venueName + '</a>';

	return img +
        '<p>' + title + ' (' + venueType + ')<br />\n' +
        venueAddress + '<br />\n' +
        rating +
        '</small></p>';
}

function createPointUnique(gridX, gridY, uniqueName, primaryFlag, venue_ID, venueName, venueThumb, bookingLink, venueAddress, venueType, ratingAtmos, ratingVal, ratingQual, phone, offers) {
	if (VenueExistsByUniqueName(uniqueName) > -1)
		return null;
	
	var venue = new CVenue();
	venue.GridX = gridX;
	venue.GridY = gridY;
	venue.UniqueName = uniqueName;
	venue.PrimaryFlag = primaryFlag;
	venue.VenueID = venue_ID;
	venue.VenueName = venueName;
	venue.VenueThumb = venueThumb;
	venue.BookingLink = bookingLink;
	venue.VenueAddress = venueAddress;
	venue.VenueType = venueType;
	venue.RatingAtmos = ratingAtmos;
	venue.RatingVal = ratingVal;
	venue.RatingQual = ratingQual;
	venue.Phone = phone;
	
	while (VenueExistsByGridRef(venue) > -1) {
		venue.GridX = venue.GridX - 0.00005;
		venue.GridY = venue.GridY + 0.00010;
	}
	
	var point = new GLatLng(venue.GridX, venue.GridY);
	
	var options;
	
	if (primaryFlag == true)
		options = { title: venueName };
	else
		options = { title: venueName, icon: tinyIcon };

    venue.Marker = new GMarker(point, options);
	
	GEvent.addListener(venue.Marker, 'click', function() {
		venue.Marker.openInfoWindowHtml(createInfoWindow(venue_ID, venueName, venueThumb, bookingLink, venueAddress, venueType, ratingAtmos, ratingVal, ratingQual, phone, offers));
	});

	map.addOverlay(venue.Marker);
	if (primaryFlag == true)
	    venue.Marker.openInfoWindowHtml(createInfoWindow(venue_ID, venueName, venueThumb, bookingLink, venueAddress, venueType, ratingAtmos, ratingVal, ratingQual, phone, offers));
	
	venueList.add(venue);
}

function centerMap(gridX, gridY) {
	map.setCenter(new GLatLng(gridX,gridY), 16);
}

function clearMarkers() {
	for (var i = venueList.length() - 1; i >= 0; i--) {
		map.removeOverlay(venueList[i].Marker);
		venueList.remove(i);
	}
}

function ClearVenueByPrimaryFlag() {
	for (var i = 0; i < venueList.length(); i++) {
		if (venueList[i].PrimaryFlag == "true") {
			var venue = new CVenue();
			venue = venueList[i];
			map.removeOverlay(venue.Marker);
			venueList.remove(i);

			createPointUnique(venue.GridX, venue.GridY, venue.UniqueName, "false", venue.Venue_ID, venue.VenueName, venue.VenueThumb, venue.BookingLink, venue.VenueAddress, venue.VenueType, venue.RatingAtmos, venue.RatingVal, venue.RatingQual, venue.Phone, venue.Offers);
		}
	}
}

function setPrimaryMarker(uniqueName) {
	var i = VenueExistsByUniqueName(uniqueName);
	
	if (i < 0 || i > venueList.length()) return;
	
	ClearVenueByPrimaryFlag();

	var venue = venueList[i];
	map.removeOverlay(venueList[i].Marker);
	venueList.remove(i);
	
	createPointUnique(venue.GridX, venue.GridY, venue.UniqueName, "true", venue.Venue_ID, venue.VenueName, venue.VenueThumb, venue.BookingLink, venue.VenueAddress, venue.VenueType, venue.RatingAtmos, venue.RatingVal, venue.RatingQual, venue.Phone, venue.Offers);
	map.setCenter(new GLatLng(venue.GridX, venue.GridY), 16);
}

