var mapPoints = {};
var map = null;
var mapUpToDate = false;
var mapUpdating = false;
var homePoint = null;
var closest = null;
var mapBounds = false;
var showinfo = false;

function updateMapPoints(){

	if (!mapBounds)
		mapBounds = map.getBounds();

	if(mapBounds != null && !mapUpdating){

		var sw = mapBounds.getSouthWest();
		var ne = mapBounds.getNorthEast();

		$.getJSON('/gateway.php?url=Points/jsonGetPoints/' + sw.lat() + '/' + sw.lng() + '/' + ne.lat() + '/' + ne.lng() + '/2',null,updateMapPointsCallback);

		mapUpdating = true;

	}
}


function timerUpdateMap(){
	if(!mapUpToDate && !mapUpdating){
		updateMapPoints();
		mapUpToDate = true;
	}
}



function updateMapPointsCallback(data){

	
	/*
	 * Remove all markers.
	 */

	/*
	 * Map bounds.
	 */

	 bounds = mapBounds;
	

	for(mid in mapPoints){
		marker = mapPoints[mid];
		var gmpoint = marker.getPosition();

		if(!bounds.contains(gmpoint)){
			marker.setMap(null);
		}
	}

	mapPoints = {};

	var pointCount = 0;

	for(pid in data){

		point = data[pid];

		pointCount++;

		if(typeof(mapPoints[point['Point']['id']]) == "undefined"){

			var gpoint = new google.maps.LatLng(point['Point']['pt_y'],point['Point']['pt_x']);

			var icon = "http://google-maps-icons.googlecode.com/files/cinema.png";

			if(point['Point']['point_icon'] > 0){
				icon = point['Point']['PointIcon']['path'];
			}
			
			var cinema = point['Point']['Cinema'];

			if(cinema){
				var marker = new google.maps.Marker({map: map,position: gpoint,title: point['Point']['name'],icon: icon});

				var url = "/gateway.php?url=Cinemas/goToSite/" + cinema['id'];

				var chainText = '';
				if(cinema['chain_name'] != ''){
					chainText = ' (' + cinema['chain_name'] + ')';
				}
			

				var infoWindowContent = '<h4 class="cinema-name"><a href = "' + url + '" target = "_blank">' + cinema['name'] + chainText + '</a></h4>' + '<p class="cinema-address">' + cinema['city'] + '<br />' + cinema['postcode'] + '</p>';

				var infoWindow = new google.maps.InfoWindow({content: infoWindowContent});

				marker.cinemaIw = infoWindow;

				google.maps.event.addListener(marker,'click',function(){
					this.cinemaIw.open(map,this);
					/** Some Extra Stuff **/
				});

				mapPoints[point['Point']['id']] = marker;
			}
		}
	}

	//if(pointCount == 0){
		var center = map.getCenter();
		$.getJSON('/gateway.php?url=Points/getClosestPoint/' + center.lng() + '/' + center.lat() + '/2',null,updateClosestCallback);
	//}else{
		//$('#notFound').hide();
	//}

	mapUpdating = true;
}

function updateClosestCallback(data){
	if(data){
		closest = data;
		$('#notFoundBtn').text(data['Point']['name']);
		if (showinfo) {
			$('#notFound').show();
			$('#notFoundLoading').hide();
		} else {
			$('#notFound').hide();
			$('#notFoundLoading').hide();
		}
	}else{
		closest = null;
	}
}


$(document).ready(function(){
	if(homePoint == null){
		var latlng = new google.maps.LatLng(54.622978,-2.592773);
	}else{
		var latlng = new google.maps.LatLng(homePoint['Point']['pt_x'],homePoint['Point']['pt_y']);
	}

	var opts = {
		zoom: 5,
		center: latlng,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	};

	map = new google.maps.Map(document.getElementById('map'),opts);

	geocoder = new google.maps.Geocoder();

	//google.maps.event.addListener(map,'bounds_changed',function() { mapUpToDate = false});

	google.maps.event.addListener(map,'click',function(event){
		var lat = event.latLng.lat();
		var lng = event.latLng.lng();

		$('#addlat').val(lat);
		$('#addlong').val(lng);
	});

	$(document).everyTime(500,timerUpdateMap);

	$(".lllink").click(function (e){
		e.preventDefault();
		var lat = $(this).attr("lat");
		var lng = $(this).attr("lng");

		map.panTo(new google.maps.LatLng(lat,lng));
	});

	if(typeof(window['postPoint']) != "undefined"){
		var fbAtt = {'name' : homePoint['Point']['name'],'href':'http://www.dev.oimedia.co.uk/Points/index/' + homePoint['Point']['id'],'description':'A point on a map.'};
		FB.Connect.streamPublish('',fbAtt);
	}

	$("#search").click(function(e){
		e.preventDefault();
		var searchText = $('#address').val();
		$('#notFound').hide();
		$('#notFoundLoading').show();
		showinfo = true;

		geocoder.geocode({address : searchText,country : 'uk'}, function(results,status){
			if (status == google.maps.GeocoderStatus.OK && results.length && status != google.maps.GeocoderStatus.ZERO_RESULTS) {
				map.setCenter(results[0].geometry.location);
				map.fitBounds(results[0].geometry.viewport);
				$('#addlat').val(results[0].geometry.location.lat());
				$('#addlong').val(results[0].geometry.location.lng());
				mapUpdating = false;
				updateMapPoints();
			}else{
				alert("Sorry, we could not find the place or town name you entered.");
			}
		});
	});

	$('#notFound').click(function(){
		var gpoint = new google.maps.LatLng(closest['Point']['pt_y'],closest['Point']['pt_x']);
		map.panTo(gpoint);
	});
});

