// Copyright 2010 Walk and Cycle Britain Limited
//
// Redistribution and use in source and binary forms, with or without
// modification, is strictly forbidden.
//

 var osMap;
 var postcodeService;
 var gazetteer;
 var osGazEntries;
 var markersLayer, screenOverlay;
 var linesLayer, controls, lineString, lineFeature, gps_contents;
 var mousePos_x, mousePos_y, route_dist = 0, route_dist_miles = 0;
 var points = new Array();
 var markers = new Array();
 var start_icon, icon, iconClone;
 var points_max = 500;
 var route_code, trail_title, description, activity_type, author_url, author_name, author_email, pcode;
 var trails_markers;
 var featured_popups = new Array();
 var featured_markers;
 var trails_popups = new Array();
 var accomm_markers;
 var accomm_popups = new Array();
 var dining_markers;
 var dining_popups = new Array();
 var attract_markers
 var attract_popups = new Array();
 var retailer_markers;
 var retailer_popups = new Array();
 var business_markers = null;
 var popups;
 var prev_popup = 0;

 
 // blue transparent line showing the route
 
 var style_blue =
 {
		strokeColor: "#0000FF",
        strokeOpacity: 0.4,
        strokeWidth: 8,
        pointRadius: 4,
        pointerEvents: "visiblePainted"
 };

 // Mouse click handler: single and double clicks have the same effect, to add a marker to the map
 OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {                
		defaultHandlerOptions: {
        	'single': true,
			'double': false,
            'pixelTolerance': 0,
            'stopSingle': false,
            'stopDouble': false
        },
 
        initialize: function(options) {
			this.handlerOptions = OpenLayers.Util.extend(
            	{}, this.defaultHandlerOptions
            );
            OpenLayers.Control.prototype.initialize.apply(
            	this, arguments
            ); 
            this.handler = new OpenLayers.Handler.Click(
            	this, {
                	'click': this.add_marker
                }, this.handlerOptions
            );
        }, 
 
        add_marker: function(e) {
			var marker, grid_ref, lon_lat;

			if (points.length == points_max){
				alert("Sorry, you have used all available trail markers. Each trail is limited to " + points_max + " markers.");
			} else {

				pt = osMap.getLonLatFromViewPortPx(e.xy);
	        	mousePos_x = pt.lon;
	        	mousePos_y = pt.lat;
				  
				if (points.length < 1 ) {
					marker = osMap.createMarker(new OpenSpace.MapPoint( mousePos_x, mousePos_y ), start_icon);
				}
				if (points.length == 1 ) {
					marker = osMap.createMarker(new OpenSpace.MapPoint( mousePos_x, mousePos_y ), icon);
				}
				if (points.length > 1 ) {
            		var iconClone = icon.clone();
					marker = osMap.createMarker(new OpenSpace.MapPoint( mousePos_x, mousePos_y ), iconClone);
				}
				  
				points.push(new OpenLayers.Geometry.Point( mousePos_x, mousePos_y ));
				markers.push(marker);

		    	linesLayer.removeFeatures(lineFeature);
				lineString = new OpenLayers.Geometry.LineString(points);
				lineFeature = new OpenLayers.Feature.Vector(lineString, null, style_blue);
		    	linesLayer.addFeatures(lineFeature);

				calculate_dist();
				display_route_stats(e);

            	osMap.setCenter(osMap.getCenter);
			}
        }
 });
			
 function remove_point()
 {
		if (points.length >= 1 ) {

			var removed_point = points.pop();
			delete removed_point;
			
			var removed_marker = markers.pop();
			osMap.removeMarker(removed_marker);
			delete removed_marker;

		    linesLayer.removeFeatures(lineFeature);
			lineString = new OpenLayers.Geometry.LineString(points);
			lineFeature = new OpenLayers.Feature.Vector(lineString, null, style_blue);
		    linesLayer.addFeatures(lineFeature);

			calculate_dist();
			display_stats();

            osMap.setCenter(osMap.getCenter);
		}
 }

 function remove_all()
 {
	var num_points = points.length;

    if (num_points > 0 ) {
	
		var answer = confirm ("Delete all points, are you sure?");
		if (answer)
		{	
    		for(i=0; i < num_points; i++ ) { 
	  
				var removed_point = points.pop();
				delete removed_point;
			
				var removed_marker = markers.pop();
				osMap.removeMarker(removed_marker);
				delete removed_marker;
    		}			
			linesLayer.removeFeatures(lineFeature);
			lineString = new OpenLayers.Geometry.LineString(points);
			lineFeature = new OpenLayers.Feature.Vector(lineString, null, style_blue);
			linesLayer.addFeatures(lineFeature);

			calculate_dist();
			display_stats();

    		osMap.setCenter(osMap.getCenter);
		}
	}
 }

 // Display a panel showing the trail statistics so far
 function display_stats()
 {
	 // var lon_lat = OSGridToLatLong(grid_ref);

     screenOverlay.setHTML("<DIV style=\"width: 210px; height=30px; color: black; background-color: #CCDAC2; border-width: 1px; border-style: solid; border-color: black; font-size: 12px\">" + "&nbsp;&nbsp;Distance&nbsp;:&nbsp;" + route_dist_miles.toFixed(1) + " m / " + route_dist.toFixed(1) + " kms<BR>" + "&nbsp;&nbsp;Grid Ref&nbsp;&nbsp;:&nbsp;<BR>"+ " </DIV>");

     osMap.setCenter(osMap.getCenter);
 }
 
 // Display a panel showing the trail statistics so far
 function display_route_stats(e)
 {
     var pt = osMap.getLonLatFromViewPortPx(e.xy);
	 var mousePos_x = pt.lon;
	 var mousePos_y = pt.lat;
	 var grid_ref = gridrefNumToLet(mousePos_x, mousePos_y, 6);
	 
	 // var lon_lat = OSGridToLatLong(grid_ref);

     screenOverlay.setHTML("<DIV style=\"width: 210px; height=30px; color: black; background-color: #CCDAC2; border-width: 1px; border-style: solid; border-color: black; font-size: 12px\">" + "&nbsp;&nbsp;Distance&nbsp;:&nbsp;" + route_dist_miles.toFixed(1) + " m / " + route_dist.toFixed(1) + " kms<BR>" + "&nbsp;&nbsp;Grid Ref&nbsp;&nbsp;:&nbsp;" + grid_ref + "<BR>" + " </DIV>");

     osMap.setCenter(osMap.getCenter);
 }
 
 // Calculate the trail distance
 function calculate_dist()
 {
	var point_1_x, point_1_y, point_2_x, point_2_y;

    route_dist = 0;
	route_dist_miles = 0;
	var num_points = points.length;
	
    if (num_points > 1 ) {
      for(i=0; i < (num_points - 1); i++ ) { 
		point_1_x = points[i].x;
		point_1_y = points[i].y;
		point_2_x = points[i + 1].x;
		point_2_y = points[i + 1].y;

        point_dist = (Math.sqrt(((point_1_x-point_2_x)*(point_1_x-point_2_x))+((point_1_y-point_2_y)*(point_1_y-point_2_y)))/1000);
        route_dist += point_dist;
      }
	}
    route_dist_miles = route_dist * 0.6214;
 }
 
 function get_dist()
 {
	 return route_dist.toFixed(1);
 }
 
 function get_start_grid_ref()
 {
	 return gridrefNumToLet(points[0].x, points[0].y, 6);
 }

 function getMarker(feature){
	for (var i = 0; i < points.length; i++){
       if (feature.lonlat.lon == points[i].x && feature.lonlat.lat == points[i].y){
         pointVal = i;
       }
    }
 }
 
 function moveLines(feature){
	if (feature == null){
	  return;
	}

	points.splice(pointVal, 1, (new OpenLayers.Geometry.Point(feature.lonlat.lon, feature.lonlat.lat)));
	linesLayer.removeFeatures([lineFeature]);
	lineString = new OpenLayers.Geometry.LineString(points);
	lineFeature = new OpenLayers.Feature.Vector(lineString, null, style_blue);
	linesLayer.addFeatures([lineFeature]);

	calculate_dist();
 }

function echeck(str) {

		var at="@"
		var dot="."
		var lat=str.indexOf(at)
		var lstr=str.length
		var ldot=str.indexOf(dot)

		if (str.indexOf(at)==-1){
		   return false
		}

		if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
		   return false
		}

		if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
		    return false
		}

		 if (str.indexOf(at,(lat+1))!=-1){
		    return false
		 }

		 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
		    return false
		 }

		 if (str.indexOf(dot,(lat+2))==-1){
		    return false
		 }
		
		 if (str.indexOf(" ")!=-1){
		    return false
		 }

		 if (str.indexOf("'")!=-1){
		    return false
		 }

 		 return true					
	}

function edit_new_trail()
 {
	var num_points = points.length;

	var sData;
	var points_seq = new Array();
		
    for(i=0; i < num_points; i++ ) { 
		points_seq.push(points[i].x);
		points_seq.push(points[i].y);
    }			

	sData = "<html><head></head><body>";

    sData = sData + "<form name='td_form' id='td_form' action='designer.php?#email_address' enctype='multipart/form-data' method='post'>";
    if (trail_title != null) { sData = sData + "<input type='hidden' id='name' name='trail_title' value='" + trail_title + "' />"; }
    if (description != null) { sData = sData + "<input type='hidden' id='name' name='description' value='" + description + "' />"; }
    if (activity_type != null) { sData = sData + "<input type='hidden' id='name' name='activity_type' value='" + activity_type + "' />"; }
    if (author_url != null) { sData = sData + "<input type='hidden' id='name' name='author_url' value='" + author_url + "' />"; }
    if (author_name != null) { sData = sData + "<input type='hidden' id='name' name='author_name' value='" + author_name + "' />"; }
    if (author_email != null) { sData = sData + "<input type='hidden' id='name' name='author_email' value='" + author_email + "' />"; }
    if (pcode != null) { sData = sData + "<input type='hidden' id='name' name='pcode' value='" + pcode + "' />"; }
    if (points_seq != null) { sData = sData + "<input type='hidden' id='points' name='points' value='" + points_seq + "' />"; }
    sData = sData + "</form>";
    sData = sData + "<script type='text/javascript'>document.td_form.submit();</script>";
    sData = sData + "</body>";
    sData = sData + "</html>";
		
    OpenWindow=window.open("", "_self");
    OpenWindow.document.write(sData);
    OpenWindow.document.close()
 }

 function copy_trail()
 {
	var num_points = points.length;

	var sData;
	var points_seq = new Array();
		
    for(i=0; i < num_points; i++ ) { 
		points_seq.push(points[i].x);
		points_seq.push(points[i].y);
    }			

	sData = "<html><head></head><body>";

    sData = sData + "<form name='td_form' id='td_form' action='designer.php?#trail_map' enctype='multipart/form-data' method='post'>";
    if (points_seq != null) { sData = sData + "<input type='hidden' id='points' name='points' value='" + points_seq + "' />"; }
    sData = sData + "</form>";
    sData = sData + "<script type='text/javascript'>document.td_form.submit();</script>";
    sData = sData + "</body>";
    sData = sData + "</html>";
		
    OpenWindow=window.open("", "_self");
    OpenWindow.document.write(sData);
    OpenWindow.document.close()
 }

 function save_as_trail()
 {
	var num_points = points.length;

	var email_trim = new String(document.td_save_as.author_email.value);
	email_trim = email_trim.trim();
	var pcode_trim = new String(document.td_save_as.pcode.value);
	pcode_trim = pcode_trim.trim();

    if (num_points <= 0 ) {
		alert("No trail points have been plotted.");
	} else if ( (email_trim.length == 0) || (pcode_trim.length == 0) ) {
		alert("Please provide an email address and access code.");
	} else if ( echeck(email_trim) == false ) {
		alert("Sorry, the email address is invalid.");
	} else {
		var sData;
		var points_seq = new Array();
		
        for(i=0; i < num_points; i++ ) 
		{ 
			var mp = new OpenSpace.MapPoint(points[i].x, points[i].y); 
			var gp = new OpenSpace.GridProjection();
			var lonlat = gp.getLonLatFromMapPoint(mp);
			
			points_seq.push(lonlat.lon);
			points_seq.push(lonlat.lat);
        }			

        sData = "<html><head></head><body>";

        sData = sData + "<form name='td_form' id='td_form' action='designer_save_as.php' enctype='multipart/form-data' method='post'>";
        sData = sData + "<input type='hidden' id='trail_title' name='trail_title' value='" + document.td_save_as.trail_title.value.replace(/'/gi, "&apos;") + "' />";
        sData = sData + "<input type='hidden' id='description' name='description' value='" + document.td_save_as.description.value.replace(/'/gi, "&apos;") + "' />";
        sData = sData + "<input type='hidden' id='activity_type' name='activity_type' value='" + document.td_save_as.activity_type.value + "' />";
        sData = sData + "<input type='hidden' id='author_url' name='author_url' value='" + document.td_save_as.author_url.value.replace(/'/gi, "&apos;") + "' />";
        sData = sData + "<input type='hidden' id='author_name' name='author_name' value='" + document.td_save_as.author_name.value.replace(/'/gi, "&apos;") + "' />";
        sData = sData + "<input type='hidden' id='author_email' name='author_email' value='" + document.td_save_as.author_email.value.replace(/'/gi, "&apos;") + "' />";
        sData = sData + "<input type='hidden' id='pcode' name='pcode' value='" + document.td_save_as.pcode.value.replace(/'/gi, "&apos;") + "' />";
        sData = sData + "<input type='hidden' id='points' name='points' value='" + points_seq + "' />";
        sData = sData + "<input type='hidden' id='grid_ref' name='grid_ref' value='" + get_start_grid_ref() + "' />";
        sData = sData + "<input type='hidden' id='distance_kms' name='distance_kms' value='" + get_dist() + "' />";
        sData = sData + "</form>";
    	sData = sData + "<script type='text/javascript'>document.td_form.submit();</script>";
        sData = sData + "</body>";
        sData = sData + "</html>";
		
        OpenWindow=window.open("", "_self");
        OpenWindow.document.write(sData);
        OpenWindow.document.close()
	}
 }

 function edit_trail_no_pwd()
 {
	var sData;

	sData = "<html><head></head><body>";

    sData = sData + "<form name='td_form' id='td_form' action='designer_modify.php' enctype='multipart/form-data' method='post'>";
    sData = sData + "<input type='hidden' id='name' name='author_email' value='" + author_email + "' />";
    sData = sData + "<input type='hidden' id='name' name='pcode' value='" + pcode + "' />";
    sData = sData + "<input type='hidden' id='name' name='route_code' value='" + route_code + "' />";
    sData = sData + "</form>";
    sData = sData + "<script type='text/javascript'>document.td_form.submit();</script>";
    sData = sData + "</body>";
    sData = sData + "</html>";
		
    OpenWindow=window.open("", "_self");
    OpenWindow.document.write(sData);
    OpenWindow.document.close()
 }

 function save_trail()
 {
	var num_points = points.length;

	var email_trim = new String(document.td_save.author_email.value);
	email_trim = email_trim.trim();
	var pcode_trim = new String(document.td_save.pcode.value);
	pcode_trim = pcode_trim.trim();
	
    if (num_points <= 0 ) {
		alert("No trail points have been plotted.");
	} else if ( (email_trim.length == 0) || (pcode_trim.length == 0) ) {
		alert("Please provide an email address and access code.");
	} else if ( echeck(email_trim) == false ) {
		alert("Sorry, the email address is invalid.");
	} else {
		var sData;
		var points_seq = new Array();
		
        for(i=0; i < num_points; i++ ) 
		{ 
			var mp = new OpenSpace.MapPoint(points[i].x, points[i].y); 
			var gp = new OpenSpace.GridProjection();
			var lonlat = gp.getLonLatFromMapPoint(mp);
			
			points_seq.push(lonlat.lon);
			points_seq.push(lonlat.lat);
        }			

		sData = "<html><head></head><body>";

        sData = sData + "<form name='td_form' id='td_form' action='designer_save.php' enctype='multipart/form-data' method='post'>";
        sData = sData + "<input type='hidden' id='trail_title' name='trail_title' value='" + document.td_save.trail_title.value.replace(/'/gi, "&apos;") + "' />";
        sData = sData + "<input type='hidden' id='description' name='description' value='" + document.td_save.description.value.replace(/'/gi, "&apos;") + "' />";
        sData = sData + "<input type='hidden' id='activity_type' name='activity_type' value='" + document.td_save.activity_type.value + "' />";
        sData = sData + "<input type='hidden' id='author_url' name='author_url' value='" + document.td_save.author_url.value.replace(/'/gi, "&apos;") + "' />";
        sData = sData + "<input type='hidden' id='author_name' name='author_name' value='" + document.td_save.author_name.value.replace(/'/gi, "&apos;") + "' />";
        sData = sData + "<input type='hidden' id='author_email' name='author_email' value='" + document.td_save.author_email.value.replace(/'/gi, "&apos;") + "' />";
        sData = sData + "<input type='hidden' id='pcode' name='pcode' value='" + document.td_save.pcode.value.replace(/'/gi, "&apos;") + "' />";
        sData = sData + "<input type='hidden' id='points' name='points' value='" + points_seq + "' />";
        sData = sData + "<input type='hidden' id='grid_ref' name='grid_ref' value='" + get_start_grid_ref() + "' />";
        sData = sData + "<input type='hidden' id='distance_kms' name='distance_kms' value='" + get_dist() + "' />";
        sData = sData + "<input type='hidden' id='name' name='route_code' value='" + route_code + "' />";
        sData = sData + "</form>";
    	sData = sData + "<script type='text/javascript'>document.td_form.submit();</script>";
        sData = sData + "</body>";
        sData = sData + "</html>";
		
        OpenWindow=window.open("", "_self");
        OpenWindow.document.write(sData);
        OpenWindow.document.close()
	}
 }

function delete_trail()
 {
	var answer = confirm ("Delete the trail, are you sure?");
	if (answer)
	{	
        sData = "<html><head></head><body>";

        sData = sData + "<form name='td_form' id='td_form' action='designer_delete.php' enctype='multipart/form-data' method='post'>";
        sData = sData + "<input type='hidden' id='name' name='route_code' value='" + route_code + "' />";
        sData = sData + "<input type='hidden' id='name' name='author_email' value='" + author_email + "' />";
        sData = sData + "<input type='hidden' id='pcode' name='pcode' value='" + pcode + "' />";
        sData = sData + "</form>";
    	sData = sData + "<script type='text/javascript'>document.td_form.submit();</script>";
    	sData = sData + "</body>";
    	sData = sData + "</html>";
		
        OpenWindow=window.open("", "_self");
        OpenWindow.document.write(sData);
        OpenWindow.document.close()
	}
 }

 function centre_map_place()
 {
    if (document.place_names.place_name.value != "-1" ) {
		
		var coordinates = new Array();
		coordinates = document.place_names.place_name.value.split(',');
		osMap.setCenter(new OpenSpace.MapPoint(coordinates[0], coordinates[1]), 8, false, true);
		display_stats();
	}
 }

 function centre_map_gr()
 {
    if (document.grid_reference.grid_ref.value != "" ) {
		
		var coordinates = new Array();
		coordinates = gridrefLetToNum(document.grid_reference.grid_ref.value);
		osMap.setCenter(new OpenSpace.MapPoint(coordinates[0], coordinates[1]), 8, false, true);
		display_stats();
	}
 }

 function centre_map_post_code()
 {
    if (document.post_code.post_code.value != "" ) {
		
		postcodeService.getLonLat(document.post_code.post_code.value, centre_on_post_code);
	}
 }

 function centre_on_post_code(map_point)
 {
		osMap.setCenter(map_point, 8, false, true);
		display_stats();
 }

function ClearOptions(OptionList) {

   // Always clear an option list from the last entry to the first
   for (x = OptionList.length; x >= 0; x = x - 1) {
      OptionList[x] = null;
   }
}

function AddToOptionList(OptionList, OptionText) {
   // Add option to the bottom of the list
   OptionList[OptionList.length] = new Option(OptionText);
}

function searchGazetteer()
{
    var pn = document.getElementById("place_search").value; 
	pn = pn.toUpperCase(pn);
   
	// Clear out the list of places
	ClearOptions(document.place_find.place_select);
	document.place_find.place_select.onchange = disambiguate;

	osGazEntries = new Array();

	osGazFind(pn, document.place_find.place_select);

	return false;
}

function disambiguate(){

	var i = document.place_find.place_select.selectedIndex;	    

	if( (i>0) && (i < (document.place_find.place_select.options.length)) )
    	osMap.setCenter(osGazEntries[i-1].location, 8);
}


function osGazFind(pn, da)
{
 	gazetteer.getLocations(pn,function(pts)
	{
		if(!pts || pts.length == 0){
			AddToOptionList(da, "Sorry, the place was not found");
		}	
		else if (pts.length == 1) {
			osMap.setCenter(pts[0].location, 8);	
		}
		else if (pts.length > 1){
		
			AddToOptionList(da, "- choose a place");
            
			for(var i=0; i<pts.length; i++){
				AddToOptionList(da, pts[i].name + ", " + pts[i].county + ", " + pts[i].type);
				osGazEntries.push(pts[i]);
			}
		}
		else{
			AddToOptionList(da, "Sorry, the place was not found");
		}		
	});
}

