var is_distance_on=false;
var is_pedo_on=false;
var dirsPanel=document.getElementById("directions");
var dirsContent=document.getElementById("directions_content");
var distanceHint;

var travelMode=G_TRAVEL_MODE_DRIVING;
function getTravelMode(){ travelMode = document.getElementById('route_radio_d').checked?G_TRAVEL_MODE_DRIVING:G_TRAVEL_MODE_WALKING; return travelMode;}

function changeTravelMode(e){
	if (!e) var e = window.event; e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation();
    getTravelMode();
    setDirections();
}
function listenTravelMode()
{
	document.getElementById('route_radio_d').onclick=document.getElementById('route_radio_w').onclick=changeTravelMode;
}

function DistanceControl() {}

DistanceControl.prototype = new GControl();

DistanceControl.prototype.initialize = function(map) {
  var container = document.createElement("div");

  var startRouteDiv = document.createElement("div");
  this.setButtonStyle_(startRouteDiv);
  container.appendChild(startRouteDiv);
  startRouteDiv.id = "route_btn";
  GEvent.addDomListener(startRouteDiv, "click", function() {
    switchRouteMode();
    listenTravelMode();
  });

  var startDistanceDiv = document.createElement("div");
  this.setButtonStyle_(startDistanceDiv);
  container.appendChild(startDistanceDiv);
  startDistanceDiv.id = "distance_btn";
  GEvent.addDomListener(startDistanceDiv, "click", function() {
    switchDistanceMode();
  });

  var dirDiv = document.createElement("div");
  this.setButtonStyle_(dirDiv);
  container.appendChild(dirDiv);
  dirDiv.id = "dirs_btn";
  dirDiv.style.display="none";
  dirDiv.appendChild(document.createTextNode(dir_i18n[locale][2]));
  GEvent.addDomListener(dirDiv, "click", function() {
	switchDirsPanel(true, dirsPanel.style.display!='');
  });

  var distanceDiv = document.createElement("div");
  this.setHintStyle_(distanceDiv);
  container.appendChild(distanceDiv);
  distanceDiv.id = "distance_hint";
  distanceDiv.style.display="none";
  distanceHint=distanceDiv;

  map.getContainer().appendChild(container);
  resetDistanceInfo();
  setRouteBtn(false);
  setDistanceBtn(false);

  return container;
}
DistanceControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(70, 7));
}

function ToolbarControl() {}
ToolbarControl.prototype = new GControl();
ToolbarControl.prototype.initialize = function(map) {

  var container = document.createElement("div");

  var maximizeDiv = document.createElement("div");
  this.setToolStyle_(maximizeDiv);
  container.appendChild(maximizeDiv);
  maximizeDiv.id = "maximize_btn";
  maximizeDiv.innerHTML="<img src=\"/images/full.gif\" border=\"0\" title=\"Open in new window\"/>";
  maximizeDiv.style.display='inline';
  GEvent.addDomListener(maximizeDiv, "click", function() {
    var url = window.location.href;
	open(url+(url.indexOf('?')==-1?'?':'&')+'max=y','single','width=990,height=680,scrollbars=no');
  });
  

  var sendRouteToMailDiv = document.createElement("div");
  this.setToolStyle_(sendRouteToMailDiv);
  container.appendChild(sendRouteToMailDiv);
  sendRouteToMailDiv.id = "mail_btn";

  var bookmarkRouteDiv = document.createElement("div");
  this.setToolStyle_(bookmarkRouteDiv);
  container.appendChild(bookmarkRouteDiv);
  bookmarkRouteDiv.id = "bookmark_btn";

  sendRouteToMailDiv.style.display=bookmarkRouteDiv.style.display='none';

  container.style.width="150px";
  map.getContainer().appendChild(container);

  return container;
}
ToolbarControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(200, 7));
}


DistanceControl.prototype.setButtonStyle_ = function(button) 
{
  button.style.textDecoration = "none";
  button.style.color = "#000000";
  button.style.backgroundColor = "white";
  button.style.font = "small Arial";
  button.style.border = "1px solid black";
  button.style.padding = "2px";
  button.style.marginBottom = "3px";
  button.style.textAlign = "center";
  button.style.width = "10em";
  button.style.cursor = "pointer";
  button.style.fontSize = "10px";
}
DistanceControl.prototype.setHintStyle_ = function(button) 
{
  button.style.textDecoration = "none";
  button.style.color = "red";
  button.style.backgroundColor = "#efecba";
  button.style.font = "small Arial";
  button.style.border = "1px solid black";
  button.style.padding = "2px";
  button.style.marginBottom = "3px";
  button.style.textAlign = "center";
  button.style.width = "10em";
  button.style.cursor = "pointer";
  button.style.fontSize = "10px";
}
ToolbarControl.prototype.setToolStyle_ = function(button) 
{
  button.style.textDecoration = "none";
  button.style.color = "#000000";
  button.style.backgroundColor = "white";
  button.style.font = "small Arial";
  button.style.border = "1px solid black";
  button.style.padding="2px";
  button.style.margin = "2px";
  button.style.verticalAlign = "middle";
  button.style.width = "20px";
  button.style.height = "20px";
  button.style.cursor = "pointer";
}

map.addControl(new DistanceControl());
map.addControl(new ToolbarControl());
listenTravelMode();

function resetDistanceInfo()
{
	reloadDistanceInfo("0.0 km");
}
function reloadDistanceInfo(_info)
{
	distanceHint.innerHTML=_info;
}
function switchDirsPanel(_vis_btn, _vis_panel)
{
    dirsPanel.style.display=_vis_panel?'':'none';
	var dirs_btn = document.getElementById("dirs_btn");
    distanceHint.style.display=dirs_btn.style.display=_vis_btn?'':'none';
    dirs_btn.innerHTML=_vis_panel?dir_i18n[locale][3]:dir_i18n[locale][2];
}

function isRouteMode()
{
	return route_btn.style.display=='';
}

function setRouteBtn(_pressed)
{
    var route_btn=document.getElementById("route_btn");
	var distance_btn=document.getElementById("distance_btn");
    if (_pressed)
    {
	   route_btn.style.backgroundColor="#a0a0a0";
	   route_btn.style.borderColor= "#909090 #f0f0f0 #f0f0f0 #909090";
	   route_btn.style.color= "#ffffff";
	   route_btn.innerHTML=dir_i18n[locale][1];

	   distance_btn.style.display='none';
	}
    else
	{
	   route_btn.style.backgroundColor="white";
	   route_btn.style.border= "1px solid black";
	   route_btn.style.color= "#000000";
	   route_btn.innerHTML=dir_i18n[locale][0];
	   distance_btn.style.display='';
	}

	var is_driving=(travelMode==G_TRAVEL_MODE_DRIVING);
    route_btn.innerHTML="<input type=\"radio\" name=\"route_type\" value=\"0\" "+(is_driving?"CHECKED":"")+" id=\"route_radio_d\"/><img src=images/car.gif /><input type=\"radio\" name=\"route_type\" value=\"1\" "+(!is_driving?"CHECKED":"")+" id=\"route_radio_w\"/><img src=images/man.gif /><br/>"+route_btn.innerHTML;
}
function setDistanceBtn(_pressed)
{
    var route_btn=document.getElementById("route_btn");
	var distance_btn=document.getElementById("distance_btn");
    if (_pressed)
    {
	   distance_btn.style.backgroundColor="#a0a0a0";
	   distance_btn.style.borderColor= "#909090 #f0f0f0 #f0f0f0 #909090";
	   distance_btn.style.color= "#ffffff";
	   distance_btn.innerHTML=dir_i18n[locale][1];

	   route_btn.style.display='none';
	}
    else
	{
	   distance_btn.style.backgroundColor="white";
	   distance_btn.style.border= "1px solid black";
	   distance_btn.style.color= "#000000";
	   distance_btn.innerHTML=dir_i18n[locale][4];

	   route_btn.style.display='';
	}
	//height=8
    distance_btn.innerHTML="<img src=images/write.gif /> "+distance_btn.innerHTML;
}


function clearRoute()
{
	is_distance_on=false;
    if (newMarkers.length>0)
    {
	      for (i=0; i<newMarkers.length; i++)
	         map.removeOverlay(newMarkers[i]);

	      if ((typeof gdir.getPolyline()) != "undefined")
	          map.removeOverlay(gdir.getPolyline());
    }
    gpoints=[];
	newMarkers=[];
    dirsContent.innerHTML="";

	resetDistanceInfo();	
    setRouteBtn(false);
    switchDirsPanel(false, false);

    map.getDragObject().setDraggableCursor("pointer");

	refreshTools();
}
function startRoute()
{
	is_distance_on=true;
	setRouteBtn(true);
    listenTravelMode();
    switchDirsPanel(true, false);
	map.getDragObject().setDraggableCursor("crosshair");
}


function clearDistance()
{
	is_pedo_on=false;
    if (newMarkers.length>0)
    {
	      for (i=0; i<newMarkers.length; i++)
	         map.removeOverlay(newMarkers[i]);
    }
	resetDistanceInfo();	
	document.getElementById("route_btn").style.display='';
	distanceHint.style.display='none';
    map.getDragObject().setDraggableCursor("pointer");
	setDistanceBtn(false);

    if (poly!="")
	  map.removeOverlay(poly);

    gpoints=[];
	newMarkers=[];
}
function startDistance()
{
	setDistanceBtn(true);
    distanceHint.style.display='';
	map.getDragObject().setDraggableCursor("crosshair");
}

function switchRouteMode()
{
   is_distance_on = !is_distance_on;

   if (!is_distance_on)
	  clearRoute();
   else
	  startRoute();
}

function switchDistanceMode()
{
   is_pedo_on = !is_pedo_on;

   if (!is_pedo_on)
	  clearDistance();
   else
	  startDistance();
}

 var gdir;
 var gpoints=[];
 var poly="";

 function initialize() {
   if (GBrowserIsCompatible()) {      
        gdir = new GDirections(map, dirsContent);
        GEvent.addListener(gdir, "load", onGDirectionsLoad);
        GEvent.addListener(gdir, "addoverlay", onGDirectionsAddOverlay); // added to trigger marker swap
   }
 }
    
 GEvent.addListener(map, "click", function(overlay,point) {
   if (!overlay && (is_distance_on || is_pedo_on) && gpoints.length<20) {
       gpoints[gpoints.length]=point;
	   if (is_pedo_on)
	   {
		  newMarkers[newMarkers.length]=new GMarker(point, {draggable:true});
		  GEvent.addListener(newMarkers[newMarkers.length-1], "dragend", function()
		  {
			for (var i=0; i<newMarkers.length; i++) 
			{
				gpoints[i]= newMarkers[i].getPoint();
			}
			setDirections();
		  });
		  map.addOverlay(newMarkers[newMarkers.length-1]);
	   }	
	   setDirections();
   }
 });


 function setDirections() 
 {
      if (gpoints.length==0)
        return;
      
      var _gpoints=new Array(gpoints[0],gpoints[0]);
	  if (is_pedo_on)
	  {
		  if (poly!="")
			  map.removeOverlay(poly);
          poly=new GPolyline(gpoints.length==1?_gpoints:gpoints);	
		  map.addOverlay(poly);
		  reloadDistanceInfo((poly.getLength()/1000).toFixed(3)+" km");	
	  }
	  else		
	      gdir.loadFromWaypoints(gpoints.length==1?_gpoints:gpoints,  { "locale": locale, "getSteps":true, "preserveViewport":true, "travelMode":getTravelMode()});

      refreshTools();
 }

 function handleErrors(){}
	  
 var newMarkers = [];
 var latLngs = [];
 var icons = [];
	
 var zindex=0;
 function onGDirectionsAddOverlay()
 { 
	for (var i=0; i<newMarkers.length; i++) 
	{
		map.removeOverlay(newMarkers[i]);
    }

	var num_routes=gdir.getNumRoutes();
	for (var i=0; i<=num_routes; i++) 
	{
		var originalMarker = gdir.getMarker(i);
		latLngs[i] = originalMarker.getPoint();

		icons[i] = originalMarker.getIcon();
        zindex=(num_routes-i);
		newMarkers[i] = new GMarker(latLngs[i],{icon:icons[i], draggable:true, title:'z', zIndexProcess:getZIndex});
		map.addOverlay(newMarkers[i]);

		GEvent.addListener(newMarkers[i], "dragend", function()
		{
			var points = [];
			for (var i=0; i<newMarkers.length; i++) 
			{
				points[i]= newMarkers[i].getPoint();
			}
			gpoints=points;
			gdir.loadFromWaypoints(points, {"preserveViewport":true, "travelMode":getTravelMode()});
		  });

		copyClick(newMarkers[i],originalMarker);
		
		map.removeOverlay(originalMarker);
	}
    reloadDistanceInfo(gdir.getSummaryHtml());
    refreshTools();
 }
 function copyClick(newMarker,oldMarker)
 {
		GEvent.addListener(newMarker, 'click', function()
		  {GEvent.trigger(oldMarker,'click');
		  });
 }

 function getZIndex(marker,par)
 {
     return zindex;
 }
    
 function onGDirectionsLoad(){}

 initialize();

 function refreshTools()
 {
    var mail_div=document.getElementById("mail_btn");
    var bookmark_div=document.getElementById("bookmark_btn");

    if (gpoints.length>0 && isRouteMode())
	{
	    var route_link="http://www.rigamap.lv/map?enc_route="+escape(createEncodings(gpoints));
  
	    mail_div.innerHTML="<a title=\"Email route\" href=\"mailto:?subject=Link&body="+route_link+"\"><img src=\"/images/mail.gif\" border=\"0\"/></a>";
	    bookmark_div.innerHTML="<a title=\"Bookmark route\" href=\"javascript: if (window.sidebar) { window.sidebar.addPanel('RIGAMAP: ROUTE', '"+route_link+"','');} else if( window.external) {window.external.AddFavorite('"+route_link+"', 'RIGAMAP: ROUTE');} void(0);\"><img src=\"/images/star.gif\" border=\"0\"/></a>";
        mail_div.style.display='inline';
        bookmark_div.style.display='inline';
	}
	else
	{
        mail_div.style.display='none';
        bookmark_div.style.display='none';
	}
 }
