var start_lat 		= 54.2386803;
var start_long		= -4.5619959;
var osMap = new Object;
var markers = new Object;
var map = {};
var gridProjection	= 0;
var vectorLayer		= {};
var markerLayer		= {};
var markerInfo= [];
var mapMarker = [];
var infoWindow;
var elevationUp = 0;
var elevationDown= 0;
var sparky="";
var data;
var bounds;
var overview=false;
var count=0;
var iconMarker= new Array();
var hotel=false;
var offset={};
var zoomMap={};
var hotel=false;
var mini_bounds={};
zoomMap.offset=0;
iconMarker.small='images/markers/marker_red_small.png';
iconMarker.large='images/markers/marker_red.png';
iconMarker.hotel='images/markers/marker_hotel.png';
iconMarker.guesthouse='images/markers/marker_guesthouse.png';
iconMarker.camping='images/markers/marker_camping.png';
iconMarker.hostel='images/markers/marker_hostel.png';
iconMarker.pub='images/markers/marker_pub.png';
iconMarker.walk='images/markers/marker_walk.png';
iconMarker.cafe='images/markers/marker_cafe.png';


function polylineDraw(points,colour,width){
	//define the line style
	vectorLayer = new OpenLayers.Layer.Vector("Vector Layer");
	var style = {strokeColor: colour, strokeOpacity: 0.65, strokeWidth: width};
	var lineString = new OpenLayers.Geometry.LineString(points);
	var lineFeature = new OpenLayers.Feature.Vector(lineString, null, style);
	vectorLayer.addFeatures([lineFeature]);
	//add it to the map
	if(typeof(osMap.events)!="undefined"){
		osMap.addLayer(vectorLayer);
	}
	else{
		if(typeof(map.events)!="undefined"){
			map.addLayer(vectorLayer);
			//console.log("adding to map");
			//console.log(vectorLayer);
		}
	}
}

function bearingMarker(point,icon,bearing){
	var marker=new Object;
	marker.icon	= icon;

	//add marker to map
	if(bearing){
		marker.size 	= new OpenLayers.Size(19, 17);
	    marker.offset 	= new OpenLayers.Pixel(-6,-8);
	}
	else{
		marker.size 	= new OpenLayers.Size(33, 45);
	    marker.offset 	= new OpenLayers.Pixel(-20,-37);
	}
	marker.infoWindowAnchor = new OpenLayers.Pixel(16, 16);
	marker.popUpSize= new OpenLayers.Size(300,230);

	marker.icon = new OpenSpace.Icon(marker.icon, marker.size, marker.offset,null,marker.infoWindowAnchor);
	marker		= new OpenLayers.Marker(point,marker.icon,marker.info,marker.popUpSize);

	markers.addMarker(marker);
	bounds.extend(point);
	marker.id		=	markers.length;
	markers[markers.length]	= marker;
}

function preparePolyline(hideBearing){
	var polyline=window.polyline.polyline;
	var waypoints=window.polyline.waypoints;
	var bearing=[];
	var points=[];
	var bearing_point1={};
	var bearing_point2={};
	if(hideBearing!=true){
		for (i in waypoints){
			//console.log(i);
			point=lngLatPos(waypoints[i]["lng"], waypoints[i]["lat"]);
			bearing_point1=new LatLon(waypoints[i]["lat"], waypoints[i]["lng"]);
			if(typeof(waypoints[parseInt(i)+1])!='undefined'){
				bearing_point2=new LatLon(waypoints[parseInt(i)+1]["lat"], waypoints[parseInt(i)+1]["lng"]);
				bearing[i]=parseInt(bearing_point1.bearingTo(bearing_point2));
				bearingMarker(point,window.uri+'images/bearing/arrow_bearing_'+bearing[i]+'.png',true);
			}
			points[i]=new OpenLayers.Geometry.Point(point.lon, point.lat);
		}
	}
	for (i in polyline){
		point=lngLatPos(polyline[i]["lng"], polyline[i]["lat"]);
		points[i]=new OpenLayers.Geometry.Point(point.lon, point.lat);
		bounds.extend(point);
	}
	p1=new LatLon(polyline[0]["lat"], polyline[0]["lng"]);
	p2=new LatLon(polyline[polyline.length-1]["lat"], polyline[polyline.length-1]["lng"]);
	if(hideBearing!=true){
		bearingMarker(lngLatPos(polyline[0]["lng"], polyline[0]["lat"]),window.uri+'images/markers/marker_red_start.png');
		if(p1.distanceTo(p2)>1.5){
			bearingMarker(lngLatPos(polyline[i]["lng"], polyline[i]["lat"]),window.uri+'images/markers/marker_red_end.png');
		}
	}
	polylineDraw(points,'#00FF00',6);
	window.walkdata=null;
}

function convertLngLat(lng,lat){
	if(lat && lng){
		var lonlat  =   new OpenLayers.LonLat(lng, lat);
		return gridProjection.getMapPointFromLonLat(lonlat);
	}
}

function gotAlt(d,ignore_update){
    if(d){
		var distance=(typeof(data[d.id].distance)!="undefined") ? " ("+data[d.id].distance.km+"km, "+data[d.id].distance.miles+"m)" : '';
		elevationDown	+=	d.descent = markerInfo[d.id].descent = Math.round(d.descent/10)*10;
		elevationUp		+=	d.ascent  = markerInfo[d.id].ascent = Math.round(d.ascent/10)*10;
		$("#elevation").html("<div class='altitude'><span class='label'>Gain <span class='altitude_additional'>(+/- 10%)</span></span>: "+elevationUp+"m ("+(parseInt(elevationUp*3.2808399))+" ft)</div><div class='altitude'><span class='label'>Total <span class='altitude_additional'>(+/- 10%)</span></span>: "+(elevationDown+elevationUp)+"m ("+(parseInt(elevationDown*3.2808399)+parseInt(elevationUp*3.2808399))+" ft)</div><div class='altitude'><span class='label'>Loss <span class='altitude_additional'>(+/- 10%)</span></span>: "+elevationDown+"m ("+(parseInt(elevationDown*3.2808399))+" ft)</div>");
		if(!ignore_update && !isNaN(d.descent) && !isNaN(d.ascent) && typeof(d.sparkline)!="undefined"){
			var ajaxOpts ={
				type: 'GET',
				url: window.uri+"ajax.php?action=waypointsUpdate",
				data: "&id="+window.walkId+"&order_id="+d.id+"&ascent="+d.ascent+"&descent="+d.descent+"&sparkline="+d.sparkline
			};
			$.ajax(ajaxOpts);
		}
	}
}

function getElevation(i){
/*	var ajaxOpts = {
		url: "http://openukterrain.appspot.com/",
		dataType: "jsonp",
		asynch: true,
		data: "e="+parseInt(markerInfo[i-1].pos.east)+"&n="+parseInt(markerInfo[i-1].pos.north)+"&e2="+parseInt(markerInfo[i].pos.east)+"&n2="+parseInt(markerInfo[i].pos.north)+"&id="+i+"&callback=gotAlt",
		jsonpCallback: "gotAlt"
	};
	$.ajax(ajaxOpts);
*/
}

function openInfoWindow(i){
		osMap.closeInfoWindow();
		if(markerInfo[i]){
			osMap.openInfoWindow(markerInfo[i].icon,markerInfo[i].pos,markerInfo[i].info,markerInfo[i].popUpSize);
		}
}

function markerText(data,i){
	var textlimit=110;
	var description="";
	var text=[];
	var text_final="";
	var rating="";
	var target=(window.sameWindow==true) ? '_self' : '_blank';
	if(overview){
		if(data.description.length>textlimit){
			var temp=data.description.split(' ');
			for(p in temp){
				if(description.length<textlimit){
					description+=temp[p]+' ';
				}
			}
			data.description=description+"...<br/>";
		}
	}
	text.push("<span><b>"+data.name+"</b><br/>"+data.description);
	if(!overview && typeof(data.icon)=="undefined"){
		if (typeof(data.distance)!="undefined"){
			text[0]= "<span><b>"+(i+1)+". "+data.name+"</b><br/>"+data.description;
			text.push("<hr>Distance: "+data.distance.km+"km ("+data.distance.miles+" miles) from "+(i));
		}
		text.push("<br/>OS Grid: "+data.os_grid);
	}
	else if(data.icon=="walk"){
			text.push('<br/>'+Math.round(data.to_distance*1.609344)+"km ("+Math.round(data.to_distance)+" miles) away from original walk.");
		}
	if(overview || data.icon=="walk"){
		if(data.rating){
			for(k=0; k<data.rating;k++){
				rating+="<img src='"+window.uri+"images/star_rating.png' />";
			}
			text.push("Rating: "+rating+" ("+data.votes+" "+((data.votes>1) ? 'votes' : 'vote')+")");
		}
		text.push("<a href='"+window.uri+"walk.php?id="+data.walk_id+"' target='"+target+"'>Show me the walk</a></span>");
	}
	for(p in text){
		text_final+=text[p]+'<br/>';
	}
	return text_final;
}

function setMarker(data,i,newMarker){
	if(data){
		var marker = new Object;
		var markymark= new Object;
		if(!newMarker){
			marker.info	=	markerText(data,i);
		}
		else{
			marker.info =   data.description;
		}
		if(!data.east){
			marker.pos 	= 	lngLatPos(data.lng, data.lat);
		}
		else{
			marker.pos	=	data;
		}
		bounds.extend(marker.pos);
		marker.infoWindowAnchor = new OpenLayers.Pixel(16, 16);
		marker.popUpSize= new OpenLayers.Size(300,230);
		marker.size 	= new OpenLayers.Size(33, 45);
	    marker.offset 	= new OpenLayers.Pixel(-5,-37);
		icon_src		= window.uri+'images/markers/os_marker_'+(i+1)+'.png';
		if(overview){
			marker.popUpSize= new OpenLayers.Size(300,240);
			if(window.markerIcon=="large"){
				marker.popUpSize= new OpenLayers.Size(260,230);
				marker.size 	= new OpenLayers.Size(23, 28);
				marker.offset 	= new OpenLayers.Pixel(-4,-18);
			}
			else{
				marker.size 	= new OpenLayers.Size(14, 19);
				marker.offset 	= new OpenLayers.Pixel(-4,-18);
			}
			icon_src		= (window.markerIcon.indexOf("undefined")==-1) ? window.uri+iconMarker[window.markerIcon] : window.uri+iconMarker.small;
		}
		if(hotel){
			if(data.icon=="walk"){
				marker.popUpSize= new OpenLayers.Size(300,240);
			}
			else{
				marker.popUpSize= new OpenLayers.Size(260,220);
			}
			marker.size 	= new OpenLayers.Size(23, 28);
			marker.offset 	= new OpenLayers.Pixel(-4,-18);
			icon_src		= window.uri+iconMarker[data.icon];
		}
		marker.icon = new OpenSpace.Icon(icon_src, marker.size, marker.offset,null,marker.infoWindowAnchor);
		markymark	= new OpenLayers.Marker(marker.pos,marker.icon,marker.info,marker.popUpSize);
		markers.addMarker(markymark);
		markymark.icon.imageDiv.firstChild.style.cursor = "pointer";
		markymark.events.register("click", marker, function() {
			openInfoWindow(this.id);
		});
		markymark.events.register("mouseover", marker, function() {
			document.body.style.cursor = 'pointer';
			document.body.style.cursor = 'hand';
		});
		markymark.events.register("mouseout", marker, function() {
			document.body.style.cursor = 'default';
		});
		mapMarker[i]=markymark;
		markerInfo[i]= marker;
		markerInfo[i].id=data.id;
	}
}

function lngLatPos(lat, lng){
	var lonLat = new OpenLayers.LonLat(lat, lng);
	var mapPoint = gridProjection.getMapPointFromLonLat(lonLat);
	mapPoint.lonLat = lonLat;
	mapPoint.east	= mapPoint.getEasting();
	mapPoint.north	= mapPoint.getNorthing();
	return mapPoint;
}

function clearMarkers(){
	markers.clearMarkers();
	markerInfo=new Array();
	mapMarker = new Array();
	bounds=new OpenSpace.MapBounds();
}

function removeMarker(marker){
	if(marker){
		markers.removeMarker(marker);
	}
}

function removeAccommodationMarkers(){
	if(window.hotels){
		max=mapMarker.length;
		for (var n = 0; n < max; n++) {
			if(markerInfo[n]!==null && markerInfo[n]!=""){
				removeMarker(mapMarker[n+window.walkdata.length]);
			}
		}
		$("#removeAccommodation").html("");
		markerInfo=markerInfo.slice(0,window.walkdata.length);
		mapMarker=mapMarker.slice(0,window.walkdata.length);
		bounds=new OpenSpace.MapBounds();
		for(n in markerInfo){
			bounds.extend(markerInfo[n].pos);
		}
		center_map();
	}
}

function addMarkers(){
	if(hotel){
		var start 	=	window.walkdata.length;
		var data	=	window.hotels;
	}
	else{
		var start 	=	0;
		var data	=	window.walkdata;
	}
	//bounds=new OpenSpace.MapBounds();
	for (var i = 0; i < data.length; i++) {
		data[i].id=i+start;
		setMarker(data[i],i+start);
		if(i>0 && !overview && !hotel){
			data[i].id=i;
		}
	}
	hotel=false;
}

function addMarker(point){
	//bounds=new OpenSpace.MapBounds();
	overview=false;
	$.ajax({
		type: 'GET',
		url: window.uri+"ajax.php?action=OSGridget",
		data: "&id="+window.walkId+"&lat="+point.lat+"&lng="+point.lon,
		success: function(data) {
				window.osgrid=jQuery.parseJSON(data);
				$.ajax({
					type: 'GET',
					url: window.uri+"ajax.php?action=waypointFormGet",
					data: "&id="+count+"&osgrid="+window.osgrid,
					success: function(data) {
							window.waypointForm=jQuery.parseJSON(data);
					}
				});
		}
	});
	if(typeof(window.osgrid) !== 'undefined' && window.osgrid !== null){
		point.description=window.waypointForm;
		point.id	=	count;
		setMarker(point,count,true);
		openInfoWindow(count);
	}
}

function init_mini_map(id,lng,lat){
	id=parseInt(id);
	$('#map'+id).html('');
	data	= window.walkdata;
	map 	= new OpenSpace.Map('map'+id,{controls: []});
	//for( var c in osMap.controls )
		//map.controls[c].deactivate();
	var mini_bounds=new OpenSpace.MapBounds();
	var pos = markerInfo[id].pos;
	var size = new OpenLayers.Size(18, 22);
	var offset = new OpenLayers.Pixel(-4,-18);
	var icon = new OpenSpace.Icon(window.uri+'images/markers/os_marker_small_'+(1+id)+'.png', size, offset);
	mini_bounds.extend(pos);
	map.createMarker(pos,icon,null,null);
	map.setCenter(mini_bounds.getCenterLonLat(), 8);
}

function init_walk_map(id,points){
	id=parseInt(id);
//	points=jQuery.parseJSON(points);
	$('#map'+id).html(null);
	map 		= new OpenSpace.Map('map'+id,{controls: []});
	gridProjection 	= new OpenSpace.GridProjection();
	mini_bounds	=new OpenSpace.MapBounds();
	for (p in points){
		mini_bounds.extend(lngLatPos(points[p].lng,points[p].lat));
	}
	var pos = lngLatPos(points[0].lng,points[0].lat)
	var size 	= new OpenLayers.Size(33, 45);
	var offset 	= new OpenLayers.Pixel(-20,-37);
	var icon 	= new OpenSpace.Icon(window.uri+'images/markers/marker_red_start.png', size, offset);
	map.createMarker(pos,icon,null,null);
	map.setCenter(mini_bounds.getCenterLonLat(),map.getZoomForExtent(mini_bounds,false));
}

function init_map(cluster,zoom,skipCenterMap,map){
	overview	=	cluster; //if lots of markers, use small icon, don't get elevation info
	osMap 		= new OpenSpace.Map((!map) ? 'map' : 'osmap');
	gridProjection = new OpenSpace.GridProjection();
	var control = new OpenSpace.Control.OverviewMap();
	osMap.addControl(control);
	control.maximizeControl();
/*	if(overview){
		clusterControl = new OpenSpace.Control.ClusterManager();
		osMap.addControl(clusterControl);
	    clusterControl.activate();
	}
*/	for( var c in osMap.controls ){
		if( osMap.controls[c].CLASS_NAME == "OpenLayers.Control.KeyboardDefaults" ){
			keys = osMap.controls[c];
		}
	}
	osMap.events.register( 'mouseover', this, function(){ keys.activate(); } );
	osMap.events.register( 'mouseout', this, function(){ keys.deactivate(); } );
	bounds=new OpenSpace.MapBounds();
	//markerLayer = osMap.getMarkerLayer();
	vectorLayer = new OpenLayers.Layer.Vector("Vector Layer");
	markers = osMap.getMarkerLayer();//new OpenLayers.Layer.Markers("Markers");
	if(window.polyline){
		preparePolyline();
	}
	if(window.walkdata!=null){
		osMap.addLayer(markers);
		addMarkers();
	}
	if(!skipCenterMap){
		center_map(zoom);
	}
}

function createMap(){
	init_map(true,10,false);
	osMap.setCenter(convertLngLat(start_long,start_lat), 10);
}

function center_map(zoom,zoomMin,zoomMax,pos){
	if((!zoom || zoom===false) && bounds){
		zoom=osMap.getZoomForExtent(bounds,false)+zoomMap.offset;
	}
	osMap.closeInfoWindow();
	if(zoom<zoomMin){
		zoom=zoomMin;
	}
	if(zoom>zoomMax){
		zoom=zoomMax;
	}
	if((!pos || pos===false || pos=="" || pos==0) && bounds){
		if(bounds.constructor.toString().indexOf("Object") != -1){
			pos=bounds.getCenterLonLat();
		}
	}
	osMap.setCenter(pos, zoom);
}

