google.load("maps", "2");
google.load("search", "1");

var map = {},
	geocoder = {},
	icon = {}
	_center = {},
	_geo = null;

// Init...
google.setOnLoadCallback(function(){

	map = new google.maps.Map2(document.getElementById('activeMap'));
	var controls = new google.maps.SmallMapControl();
	var _top_right = new google.maps.ControlPosition(G_ANCHOR_TOP_RIGHT);

	//_start = new google.maps.LatLng(55.02802211299252, -10.810546875);
	_start = new google.maps.LatLng(55, -11);
	_center = new google.maps.LatLng(55, -4.5);

	map.setCenter(_start,5);
	map.addControl(controls, _top_right);

	Mapping._lat = _center.lat();
	Mapping._lng = _center.lng();

	icon = new google.maps.Icon();
	icon.image = "/en/sitepitch/default/img/map/icon.gif";
	icon.iconSize = new google.maps.Size(30, 30);
	icon.iconAnchor = new google.maps.Point(15, 15);
	icon.infoWindowAnchor = new google.maps.Point(30, 30);
	icon.shadow = "/en/sitepitch/default/img/map/shadow.png";

	geocoder = new google.maps.ClientGeocoder();
	geocoder.setViewport(new google.maps.LatLngBounds(
		new google.maps.LatLng(48, -12),
		new google.maps.LatLng(60, 2)
		));

	if (google.loader.ClientLocation &&
		google.loader.ClientLocation.address.city)
	{
		Mapping._location_str = google.loader.ClientLocation.address.city;
		$('form#searcher input[name="str_town"]').val(google.loader.ClientLocation.address.city);
		geocoder.getLatLng(google.loader.ClientLocation.address.city, function(point){ _geo = point });
	}

	google.maps.Event.addListener(map, "zoomend", function(oldLevel, newLevel) {
		if( newLevel < 5 )
			return Mapping.outOfBounds(map.getCenter().lat(), map.getCenter().lng());
	});

	google.maps.Event.addListener(map, "moveend", function() {
		var lat = map.getCenter().lat();
		var lng = map.getCenter().lng();

		if( ( lat > 60 || lat < 48 ) ||
			( lng > 2 || lng < -12 ) )
			return Mapping.outOfBounds();
	});

});

var Mapping = {
	_location_str: 'the UK',
	_latlng: null,
	_activity_id: null,
	_lat: null,
	_lng: null,
	_back: null,
	_back_zoom: 5,

	doLocationSearch: function(place)
	{
		this._location_str = place;
		$('#instruction').remove();
		Mapping.clearVenueDetails();
		geocoder.getLatLng( place, function(point){
			if (!point)
			{
				if (google.loader.ClientLocation &&
					google.loader.ClientLocation.address.city)
					return Mapping.doLocationSearch(
						google.loader.ClientLocation.address.city
						);

				Mapping._lat = _center.lat();
				Mapping._lng = _center.lng();
				map.setCenter(_center,5);

				if( Mapping._activity_id !== null )
					Mapping.doActivitySearch( Mapping._activity_id );

				return;

			}

			Mapping._lat = point.lat();
			Mapping._lng = point.lng();
			Mapping._latlng = point;
			map.setCenter(point, 13);

			if( Mapping._activity_id !== null )
				Mapping.doActivitySearch( Mapping._activity_id );

			return;
		});
	},

	doActivitySearch: function(activity, activity_name)
	{
		this._activity_id = activity;
		this._activity_name = activity_name;

		$('#instruction').remove();
		Mapping.clearVenueDetails();

		$('#list-views li:eq(0) h3').text(this._activity_name+' in '+this._location_str);

		switch(true)
		{
			case (Mapping._latlng !== null):
				Mapping._lat = Mapping._latlng.lat();
				Mapping._lng = Mapping._latlng.lng();
				map.setCenter(Mapping._latlng, 13);
				break;

			case (_geo !== null):
				Mapping._lat = _geo.lat();
				Mapping._lng = _geo.lng();
				map.setCenter(_geo, 13);
				break;

			default:
				Mapping._lat = _center.lat();
				Mapping._lng = _center.lng();
				map.setCenter(_center, 5);
		}

		var data_url = "/Venues/List",
			params = {
				'forActivity': this._activity_id,
				'forLocation': this._lat+","+this._lng,
				'limit': 150,
				'_asjson': true
				}

		$("#loading").show();

		$.ajax({
			type:'GET',
			url: '/Venues/List',
			data: params,
			dataType: 'json',
			success: function(a,b) {
				Mapping.populateMap(a,b);
				Mapping.populateList(a,b);
			},
			complete: function() {
				$("#loading").hide();
			},
			error: function(r, t, e) {
				msg = ['Sorry, an error occurred', t];
				alert(msg.join("\n"));
			}

			});

	},

	populateMap: function(json, success)
	{
		var venues = json.venuelist;
		map.clearOverlays();
		venues = venues.sort(Mapping.sortVenuesByDistance);
		Mapping.zoomToNearestVenue(venues[0]);
		for(var l=venues.length-1; l>-1; l--)
			Mapping.plot(venues[l]);
	},

	populateList: function(json, success)
	{
		var venues = json.venuelist
			_list = [];
		for(var l=venues.length-1; l>-1; l--)
		{
			var venue = venues[l],
				distance = parseFloat(venue.distance);
			_list.push([
			'<a href="/Venues/Details/id/',
			venue.venue_id,
			'"><span class="distance">',
			distance.toFixed(1),
			'<dfn>miles</dfn></span>',
			'<dfn class="title">',
			venue.venue_name,
			'</dfn>',
			'</a>'
			].join("\n"));
		}
		$('#activeList').empty().append(_list.reverse().join("\n"));
	},

	zoomToNearestVenue: function(venue)
	{
		var _vlat = parseFloat(venue.pc_lat),
			_vlng = parseFloat(venue.pc_lon),
			_n = map.getBounds().getNorthEast().lng() - 0.005,
			_e = map.getBounds().getNorthEast().lat() - 0.005,
			_s = map.getBounds().getSouthWest().lng() - 0.005,
			_w = map.getBounds().getSouthWest().lat() - 0.005,
			_z = map.getZoom();

		if( (_vlat > _e || _vlat < _w || _vlng > _n || _vlng < _s) && _z > 4 )
		{
			map.zoomOut();
			return Mapping.zoomToNearestVenue(venue);
		}

		return true;

	},

	capture: function()
	{
		Mapping._back = map.getCenter();
		Mapping._back_zoom = map.getZoom();

	},

	reCenter: function()
	{
		map.setCenter(Mapping._back, Mapping._back_zoom);
	},

	sortVenuesByDistance: function(a, b)
	{
		var x = parseFloat(a.distance),
			y = parseFloat(b.distance);

		return ((x < y) ? -1 : ((x > y) ? 1 : 0));
	},

	plot: function(a)
	{
		var distance = Math.round(parseFloat(a.distance));

		if(a.pc_lat == null || a.pc_lon == null)
			return;

		var point = new google.maps.LatLng(parseFloat(a.pc_lat),parseFloat(a.pc_lon));
		map.addOverlay(Mapping.addMarker(point, a)); //,html
	},

	addMarker: function(point,venue)
	{

		var marker = new google.maps.Marker(point, icon);


		google.maps.Event.addListener(marker,'click',function() {
			Mapping.capture(),
			Mapping.clearVenueDetails()
			map.setCenter(point, 11);
			map.panDirection(0,1);

			setTimeout(function(){ Mapping.showVenueDetails(venue); }, 500);
		});

		return marker;
	},

	showVenueDetails: function(venue)
	{
		$('div#map #venue-close').show();
		$('div#map #venue-info-container').empty();
		$('div#map #venue-info').fadeIn('slow', function(){

			$('#venue-info-container').append('<h1><span>'+venue.venue_name+'</span><a href="#" class="cls">Close</a></h1>');

			$.ajax({
			url: '/Venues/Details',
			data:	{
					'id': venue.venue_id,
					'_asjson': true
					},
			dataType: 'json',
			success: function(d){
				var
					venue = d.venue,
					_a = [venue.address1, venue.address2, venue.town, venue.county, venue.country, venue.postcode],
					address = [];
				for(var i = 0, x = _a.length; i<x; i++)
					if(_a[i] != '' && _a[i] != null)
						address.push(_a[i]);

				if(venue.description == '' || venue.description == null)
					venue.description = 'Visit our venue page for more information by clicking the link below!'
				$('#venue-info-container h1').after([
					'<address>',
					address.join(', '),
					'</address>',
					'<div id="copy">',
					'<div><a href="/Venues/Details/id/',
					venue.id,
					'"><img src="/en/sitepitch/default/img/venue_logo.png" /></a></div>',
					'<p>',
					venue.description,
					'</p>',
					'</div>',
					'<a href="/Venues/Details/id/',
					venue.id,
					'" class="btn">More information...</a>'
				].join("\n"));
			},
			error: function(r,t,e)
			{
				msg = ['Sorry, an error occurred', t];
				alert(msg.join("\n"));
			}
			});

		});
	},

	clearVenueDetails: function()
	{
		$('#map div#venue-close').hide();
	},

	outOfBounds: function(lat, lng)
	{
		if (lat == undefined && lng == undefined)
		{
			return map.setCenter(_center,5);
		}
		else
		{
			return map.setCenter(new google.maps.LatLng(lat,lng),5);
		}
	}

}

$(function(){

	$('body').unload(function() {
		google.maps.Unload();
	});

	$("div#activities").tabs();

	$("div#activeList").append("<h3>Please select an activity...</h3>");

	$('form#searcher').livequery('submit', function(e){
		e.preventDefault();
		Mapping.doLocationSearch($('input[name="str_town"]', this).val());
		return false;
	});

	$('a.activity-link').livequery('click', function(e){
		e.preventDefault();
		Mapping.doActivitySearch($(this).attr('rel'), $('span', this).text());
		return false;
	});

	$('div#map #venue-close, div#map a.cls').livequery('click', function(e){
		$('#venue-close').hide();
		$('#venue-info').fadeOut('slow', function(){
			Mapping.reCenter();
		});
	});

	$("ul#list-views li a").click(function(e) {
		e.preventDefault();
		$("div#instruction").hide();
		$(".map").css({"backgroundImage":"none"});
		$("div#activeMap").hide();
		$("div#activeList").hide();
		$($(this).attr('href')).show();
		return false;
	});
});
