var map = '';
var infoBubble = '';
var markersRef = [];
var markersArray = [];
var regionMarkersArray = [];
var regionMarkersRef = [];

function initGMap(){
    var myLatlng = new google.maps.LatLng(mapConfig['starting_latitude'], mapConfig['starting_longitude']);
    var myOptions = {
      zoom: mapConfig['starting_zoom_level'],
      center: myLatlng,
	  panControl: mapConfig['show_pan'],
	  zoomControl: mapConfig['show_zoom'],
	  zoomControlOptions: {
		style: google.maps.ZoomControlStyle.SMALL
	  },	
	  scaleControl: mapConfig['show_scale'],
	  streetViewControl: mapConfig['show_streetview'],
	  mapTypeControl: mapConfig['show_maptype'],
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
	
    map = new google.maps.Map(document.getElementById("map"), myOptions);
	var mapWidth = document.getElementById('map').style.width;
	infoBubble = new google.maps.InfoWindow({ 
        pixelOffset: new google.maps.Size(mapConfig['map_bubble_x'],mapConfig['map_bubble_y'])
	});
	
	// Create Pub Markers
	var pubMarkers = [];
	pubMarkers = createPubMarkers(mapConfig['pub_map_markers']);
	if(mapConfig['marker_display']=='CLUSTERER'){
		var pubMarkerManager = new MarkerClusterer(map);
		pubMarkerManager.addMarkers(pubMarkers);
	} else {
		var pubMarkerManager = new MarkerManager(map);
		google.maps.event.addListener(pubMarkerManager, 'loaded', function() {
			pubMarkerManager.addMarkers(pubMarkers, mapConfig['show_pubs_zoom']);
			pubMarkerManager.refresh();
			if (mapConfig['starting_pubid'] > 0 ) {
				ajaxFindOnMap(mapConfig['starting_pubid'] );
			}					
		}); 		

	}
	
	// Create Region markers
	if(mapConfig['load_region_markers']==true){
		var regionMarkers = createRegionMarkers(mapConfig['region_map_markers']);
		var regionMarkerManager = new MarkerManager(map);
		google.maps.event.addListener(regionMarkerManager, 'loaded', function() {
			regionMarkerManager.addMarkers(regionMarkers, 0, mapConfig['show_pubs_zoom']);
			regionMarkerManager.refresh();		
		}); 
		// Load default marker
		if(mapConfig['starting_regionid'] > 0 && mapConfig['starting_pubid']==0){
			google.maps.event.trigger(regionMarkersArray[regionMarkersRef[mapConfig['starting_regionid']]], 'click');
		} 
	}
}

function createPubMarkers(url){
	var xml = downloadUrl(url);
	var xmlMarkers  = xml.documentElement.getElementsByTagName("marker");
	for (var m = 0; m <xmlMarkers.length; m++) {
		var marker = xmlMarkers[m];
		var pubLoc = new google.maps.LatLng(marker.getAttribute('latitude'), marker.getAttribute('longitude'));
		
		// If this is just a pub then add normal marker, hotels have a unique one
		var hotelHtml = '';
		if(marker.getAttribute('hotelName')!="" && marker.getAttribute('hotelName')!=null){
			pubIcon = mapConfig['icon_hotel'];
			hotelHtml 	= '<span class="accommodation small-text"><a class="accommodation" href="' + marker.getAttribute('url') + 'accommodation/">' + marker.getAttribute('hotelName') + '</a> Accommodation<br /></span>';
		}
		
		// Set info for bubble
		var pointUrl	= pubLoc.toUrlValue();
		var pubHtml 	= '<a href="' + marker.getAttribute('url') + '">' + marker.getAttribute('pubName') + '</a><br />';
		var closureHtml = '';
		var addressHtml = '<span class="small-text">' + marker.getAttribute('address') + '<br />Tel: ' + marker.getAttribute('telephone') + '</span><br />';
		var mapHtml = '<span class="small-text">Directions with Google: <a href="http://maps.google.co.uk/maps?daddr=' + pointUrl + '" target="_blank">To here</a> | <a href="http://maps.google.co.uk/maps?saddr=' + pointUrl + '" target="_blank">From here</a></span><br />'
								 + '<span class="small-text">View on a: <a href="http://maps.google.co.uk/maps?q=' + pointUrl + '" target="_blank">Larger Google map</a></span>';
		if(marker.getAttribute('closureText') != "" && marker.getAttribute('closureText') !=null) {
			closureHtml	= '<span class="announcement small-text">' + marker.getAttribute('closureText') + '</span><br />';
		}
		
		html= pubHtml + closureHtml + addressHtml + hotelHtml + mapHtml;
		
		markersArray[m] = 	new google.maps.Marker({
			position: pubLoc,
			icon: mapConfig['icon_pub'],
			title: marker.getAttribute("pubName")
		});
		markersRef[marker.getAttribute('pubID')] = m;
		createMarkerEvent(markersArray[m], html);
	}
	return markersArray;
}

function createRegionMarkers(url) {
	var xml = downloadUrl(url);
	var xmlMarkers  = xml.documentElement.getElementsByTagName("marker");
	var regionLinkHtml 	= '';
	
	for (var m = 0; m <xmlMarkers.length; m++) {	
		var xmlMarker = xmlMarkers[m];
		var regLoc = new google.maps.LatLng(xmlMarker.getAttribute('latitude'), xmlMarker.getAttribute('longitude'));
		var regionLinkText = mapConfig['region_link_text'];
		if(mapConfig['show_region_link']==true) {
			regionLinkHtml = regionLinkText.replace('%1', '<a href="' + xmlMarker.getAttribute("url") + '">');
			regionLinkHtml = regionLinkHtml.replace('%2', '</a>');
			regionLinkHtml = regionLinkHtml + ' or ';
		}
		var html = xmlMarker.getAttribute("regionName") 
					+ '<br />' + xmlMarker.getAttribute("countTxt")
					+ '<br /><span class="small-text">' + regionLinkHtml + '<a href="#" onClick="zoomTo('
					+ xmlMarker.getAttribute("latitude") + ', ' + xmlMarker.getAttribute("longitude") + ', '
					+ mapConfig['show_pubs_zoom'] +');">zoom in</a> on the map.</span>';
		regionMarkersArray[m] = 	new google.maps.Marker({
			position: regLoc,
			icon: mapConfig['icon_region'],
			title: xmlMarker.getAttribute("regionName") 
		});					
		regionMarkersRef[xmlMarker.getAttribute('regionID')] = m;
		createMarkerEvent(regionMarkersArray[m], html);
	}
	return regionMarkersArray;
}

function createMarkerEvent(marker, content) {
  google.maps.event.addListener(marker, 'click', function() {
	infoBubble.setContent(content);
	infoBubble.open(map,marker);
  });
}

function ajaxFindOnMap(pubMarkerID){
	map.panTo(markersArray[markersRef[pubMarkerID]].position);
	map.setZoom(mapConfig['search_zoom']);	
	setTimeout("infoWindowClick("+ pubMarkerID + ")", 500);
}

function infoWindowClick(pubMarkerID){
	google.maps.event.trigger(markersArray[markersRef[pubMarkerID]], 'click');
}

function findOnMapFromLink(link, pubID, latitude, longitude) {
	var mapXY 		= getMapXY(document.getElementById('map'));
	var mapX		= mapXY[0];
	var mapY		= mapXY[1];
	link.className 	= 'dfcMapResults';
	ajaxFindOnMap(pubID);
	window.scrollTo(0, mapY, mapX[0]);
}

function showRegion(regionMarkerID){
	google.maps.event.trigger(regionMarkers[regionMarkersRef[regionMarkerID]], 'click');
}

function zoomTo(latitude, longitude, zoomLvl){
	var newLoc = new google.maps.LatLng(latitude, longitude);
	map.setCenter(newLoc);
	map.setZoom(zoomLvl);	
}

function getMapXY() {
	var mapX = 0;
	var mapY = 0;
	obj = document.getElementById('map');
	if (obj.offsetParent) {
		do {
			mapX += obj.offsetLeft;
			mapY += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [mapX,mapY];
}

function searchLatLon(latitude, longitude, address) {
	if(latitude != undefined && longitude != undefined && address != undefined) {
		frm = document.getElementById('frmSearch');
		frm.searchLatitude.value  	= latitude;
		frm.searchLongitude.value 	= longitude;
		frm.searchAddress.value 	= address;
		frm.submit();
	}
}

function setGMapType(type){
	map.setMapTypeId(type);
}
	
function downloadUrl(url){
	if (window.XMLHttpRequest){
		// code for IE7+, Firefox, Chrome, Opera, Safari
		xmlhttp=new XMLHttpRequest();
	} else {
		// code for IE6, IE5
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	xmlhttp.open("GET",url,false);
	xmlhttp.send();
	xmlDoc=xmlhttp.responseXML; 
	return xmlDoc;
}

function loadXMLString(xmlData) {
	try { 
		//Internet Explorer
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = "false";
		xmlDoc.loadXML(xmlData);
		return xmlDoc;
	}catch(e){ 
		//Firefox et. all
		try {
			parser = new DOMParser();
			xmlDoc = parser.parseFromString(xmlData, "text/xml");
			return xmlDoc;
		}catch(e){
			alert(e.message)
		}
	}
	return false;
}


window.onload = initGMap;
