
    function handleErrors(gdir){
	   if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
	     alert("No corresponding geographic location could be found for one of the specified addresses. This may be due to the fact that the address is relatively new, or it may be incorrect.\nError code: " + gdir.getStatus().code);
	   else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
	     alert("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + gdir.getStatus().code);
	   
	   else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
	     alert("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + gdir.getStatus().code);

	//   else if (gdir.getStatus().code == G_UNAVAILABLE_ADDRESS)  <--- Doc bug... this is either not defined, or Doc is wrong
	//     alert("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + gdir.getStatus().code);
	     
	   else if (gdir.getStatus().code == G_GEO_BAD_KEY)
	     alert("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + gdir.getStatus().code);

	   else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
	     alert("A directions request could not be successfully parsed.\n Error code: " + gdir.getStatus().code);
	    
	   else alert("An unknown error occurred.");
	   
	}
 
function createElem(opt_className, opt_html, opt_tagName) {
  var tag = opt_tagName||"div";
  var elem = document.createElement(tag);
  if (opt_html) elem.innerHTML = opt_html;
  if (opt_className) elem.className = opt_className;
  return elem;
}

/**
 * Sidebar <div> made a GControl()
 * @author Esa 2008
 */
function sideBlockControl(opt_options){
  this.opts = opt_options||{};
}

sideBlockControl.prototype = new GControl();
sideBlockControl.prototype.initialize = function(map) {
  var openText = this.opts.openText||"C&oacute;mo llegar";
  var opener = createElem("sideblock-open",openText); // open button
  opener.style.border = "1px solid black";
  opener.style.textAlign = "center";
  opener.style.fontSize = "12px";
  opener.style.fontFamily = "Arial";
  opener.style.backgroundColor = "#fff";
  opener.style.width = "90px";
  opener.style.position = "relative";
  opener.style.top = "7px";
  opener.style.left = "70px";
  opener.style.cursor = "pointer";
  map.getContainer().appendChild(opener);
  var header = createElem("sideblock-header"); // header containing close button
  header.style.textAlign = "right";
  header.style.backgroundColor="#d1df7e";
  var closeText = this.opts.closeText||"Cerrar[x]&nbsp;";
  var close = createElem("sideblock-close",closeText,"span"); // close button
  close.style.cursor = "pointer";
  header.appendChild(close);
  var leftBar = createElem("sideblock"); // the parent element of the sidebar
  leftBar.style.backgroundColor="#d1df7e";
  leftBar.style.border="1px gray solid";
  leftBar.appendChild(header);
  map.getContainer().appendChild(leftBar);
  leftBar.style.width = this.opts.sideBlockWidth||"200px";
  leftBar.style.height = "100%";
  var contents = createElem("sideblock-container"); //contents div
    contents.setAttribute("id", "container"+this.opts.ident);
  contents.id="container"+this.opts.ident;
  leftBar.appendChild(contents);
  contents.style.overflow = "auto";
 var me = this;
  me.container = contents;
  me.isVisible = true;
  leftBar.setAttribute("id", "local"+this.opts.ident);
  leftBar.id="local"+this.opts.ident;
  
  function openEvent(){
	  me.isVisible=true; 
	  GEvent.trigger(me,'open',true)};
  function closeEvent(){
	  me.isVisible=false; 
	  GEvent.trigger(me,'close',false)
	  
	  };
  me.show = function(id){
	  leftBar.style.display = "block";

		openEvent();
	  };
	  
  me.hide = function(){
	  leftBar.style.display = "none";
				closeEvent();
	  };
  close.onclick = function(){me.hide()};
  opener.onclick = function(){me.show()};
  
  return leftBar;
}

sideBlockControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(0, 0));
}

/**
 * Google logo made a GControl()
 */
function PowerLogo(){};
PowerLogo.prototype = new GControl();
PowerLogo.prototype.initialize = function(map) {
  var logo = document.createElement("img");
  map.getContainer().appendChild(logo);
  logo.src = "http://maps.google.com/intl/fi_ALL/mapfiles/poweredby.png";
  return logo;
}
PowerLogo.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(210,7));
}

/**
 * A GLargeMapControl with adjusted default position
 */
function OffsetControl(){};
OffsetControl.prototype = new GLargeMapControl();
OffsetControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(210,7));
}

/**
 * GMap2.showBounds() method. Fit bounds to viewport with paddings.
 * @ author Esa 2008
 * @ param bounds_ GLatLngBounds()
 * @ param opt_options Optional options object {top, right, bottom, left, save}
 */
GMap2.prototype.showBounds = function(bounds_, opt_options){
  var opts = opt_options||{};
  opts.top = opts.top*1||0;
  opts.left = opts.left*1||0;
  opts.bottom = opts.bottom*1||0;
  opts.right = opts.right*1||0;
  opts.save = opts.save||true;
  opts.disableSetCenter = opts.disableSetCenter||false;
  var ty = this.getCurrentMapType();
  var port = this.getSize();
  if(!opts.disableSetCenter){
    var virtualPort = new GSize(port.width - opts.left - opts.right, 
                            port.height - opts.top - opts.bottom);
    this.setZoom(ty.getBoundsZoomLevel(bounds_, virtualPort));
    var xOffs = (opts.left - opts.right)/2;
    var yOffs = (opts.top - opts.bottom)/2;
    var bPxCenter = this.fromLatLngToDivPixel(bounds_.getCenter());
    var newCenter = this.fromDivPixelToLatLng(new GPoint(bPxCenter.x-xOffs, bPxCenter.y-yOffs));
    this.setCenter(newCenter);
    if(opts.save)this.savePosition();
  }
  var portBounds = new GLatLngBounds();
  portBounds.extend(this.fromContainerPixelToLatLng(new GPoint(opts.left, port.height-opts.bottom)));
  portBounds.extend(this.fromContainerPixelToLatLng(new GPoint(port.width-opts.right, opts.top)));
  return portBounds;
}

/**
 * Map
 */
 
 function setDirections(gdir,fromAddress, toAddress, locale,id) {
      gdir.load("from: " + fromAddress + " to: " + toAddress,
                { "locale": locale,"getSteps":true });
document.getElementById('map'+id).style.width='72%';
document.getElementById('direccion'+id).style.display='block'
				
    }
	
 function init(id,destino,info){
_mPreferMetric=true;
  var markers = [];
var map = new GMap2(document.getElementById("map"+id));

   var gdir = new GDirections(map, document.getElementById("dir"+id));
  GEvent.addListener(gdir, "error", handleErrors);
   
document.getElementById('direccion'+id).style.display='none';

var merida = new GLatLng(38.916233,-6.342128);
map.setCenter(merida, 15);

var shiftedmerida = virtualCenter(merida, 210,map);
map.setCenter(shiftedmerida, 15); // Recentering to small viewport
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
var scalePos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(46,7));
map.addControl(new GScaleControl(256), scalePos);

map.openInfoWindowHtml(map.getCenter(),"Nice to see you.");
map.closeInfoWindow(); //preloading infowindow
map.enableScrollWheelZoom();
var sideOptions = {sideBlockWidth:"200px",ident:id};

var myBlock = new sideBlockControl(sideOptions);
map.addControl(myBlock);

var midLogo = new PowerLogo();
var midControl = new OffsetControl();

myBlock.hide();
if(window.innerWidth<500)myBlock.hide();





GEvent.addListener(myBlock, 'open', function(){
  map.addControl(midLogo);
  map.addControl(midControl);
  refocus(map,myBlock);
});
GEvent.addListener(myBlock, 'close', function(){
  map.removeControl(midLogo);
  map.removeControl(midControl);
  refocus(map,myBlock);
});


GEvent.addListener(map,"moveend",function(){
  refocus(map,myBlock);
});

/**
 * doubleClickZoom recentering
 */
GEvent.addDomListener(map,"dblclick",function(a,b){
  var pnt = virtualCenter(b, -210); //sideBlock width
  if(myBlock.isVisible)map.setCenter(pnt);
});




var geo = new GClientGeocoder();

var dest=destino.split("|");
var inf=info.split("|");

for(var i=0;i<dest.length;i++){
geocode(dest[i],null,map,markers,geo,id,inf[i]);	
	
}




return gdir;
}
/**
* 7 random markers 
 */


/**
 * Pan and zoom to fit calling GMap.showBounds
 */


/**
 * SideBlock
 */

/**
 * Calculating zoom focus point
 */
 
 function onGDirectionsAddOverlay(map,newMarkers,gdir){ 
  // Remove the draggable markers from previous function call.
  var latLngs = [];
	var icons = [];
	

  for (var i=0; i<newMarkers.length; i++){
    map.removeOverlay(newMarkers[i]);
  }

  // Loop through the markers and create draggable copies
  for (var i=0; i<=gdir.getNumRoutes(); i++){
    var originalMarker = gdir.getMarker(i);
    latLngs[i] = originalMarker.getLatLng();
    icons[i] = originalMarker.getIcon();
    newMarkers[i] = new GMarker(latLngs[i],{icon:icons[i], draggable:true, title:'Draggable'});
    map.addOverlay(newMarkers[i]);

    // Get the new waypoints from the newMarkers array and call loadFromWaypoints by dragend
    GEvent.addListener(newMarkers[i], "dragend", function(){
      var points = [];
      for (var i=0; i<newMarkers.length; i++){
        points[i]= newMarkers[i].getLatLng();
      }
      gdir.loadFromWaypoints(points);
    });

    //Bind 'click' event to original markers 'click' event
    copyClick(newMarkers[i],originalMarker);

    // Now we can remove the original marker safely
    map.removeOverlay(originalMarker);
  }

  function copyClick(newMarker,oldMarker){
	
    GEvent.addListener(newMarker, 'click', function(){
      GEvent.trigger(oldMarker,'click');
	  
    });
  }
}

 
function virtualCenter(point, xOffs,map){
  var pixCenter = map.fromLatLngToDivPixel(point);
  var virtualPxCenter = new GPoint(pixCenter.x + xOffs/2, pixCenter.y);
  return map.fromDivPixelToLatLng(virtualPxCenter);
}

function refocus(map,myBlock){
  if(myBlock.isVisible)
  {
    var pnt = virtualCenter(map.getCenter(),210,map);//sideBlock width
    map.setFocus(pnt);
  }else{
    map.setFocus(); //reset
  }
}


/**
 * On load
 */

function doInfo(marker_,map,info){
  var pin = marker_;
  var iwContents = info+"<br/>"+pin.response.replace(/,/g, ",<br/>");
  pin.bindInfoWindowHtml(iwContents);
  map.openInfoWindowHtml(pin.getLatLng(), iwContents);
}




function createMarker(map,markers,geo,id,info){
 var marker = new GMarker(map.getCenter(),{draggable:false, autoPan:false});
  map.addOverlay(marker);
  
  GEvent.addListener(marker, 'dragend', function(markerPoint){
    if(!map.getBounds().containsLatLng(markerPoint)){
      map.removeOverlay(this);
      map.removeOverlay(this.poly);
    }else{
    geocode(this.getLatLng(),this,map,markers,geo,id,info);
    }
  });
  return marker
}


function geocode(query,pin_,map,markers,geo,id,info){
  geo.getLocations(query, function(addresses){
    if(addresses.Status.code != 200){
      alert("D'oh!\n " + query);
    }else{
      marker = pin_||createMarker(map,markers,geo,id,info);
      var result = addresses.Placemark[0];
      marker.howMany = addresses.Placemark.length;
      marker.response = result.address;
      var details = result.AddressDetails||{};
      marker.accuracy = details.Accuracy||0;
      var lat = result.Point.coordinates[1];
      var lng = result.Point.coordinates[0];
      var responsePoint = new GLatLng(lat, lng);
      marker.setLatLng(responsePoint);
     
      marker.index = markers.length;
      markers.push(marker);
      if(!pin_){
        map.setCenter(responsePoint);
        map.setZoom(15);
      }
      if(result.address) {
	  doInfo(marker,map,info);
	 document.forms["form"+id].to.value=marker.response.replace(/,/g, ",");
	  }
    }
  });
}


/**
 * creates and opens an info window
 * @param GMarker
 */








function add(id,destino,info){
			var dir=init(id,destino,info);
			document.getElementById('cerrar'+id).onclick=function() {
	
	document.getElementById('direccion'+id).style.display='none'; 
	document.getElementById('map'+id).style.width='99%';
	dir.clear();	
	}; 
			
			var newdiv = document.createElement('div');
			newdiv.innerHTML='<h3 style="color:black; margin-top:-10px; ">C&oacute;mo llegar</h3>  <form action="#"  id="form'+id+'" name="form'+id+'"><div>Desde: </div><input style="border:2px gray solid; font-size:11px;"  type="text" size="28" id="fromAddress" name="from"  value=""/><div>Hasta: </div><input style="border:1px gray solid; font-size:10px;" disabled="disabled" tabindex="2" type="text" size="36" id="toAddress" name="to" value="'+destino+'" />	<div style="padding-top:10px;"><input name="submit" type="submit" value="Mostrar Ruta" /></div></form>';
	
	newdiv.style.backgroundColor="#d1df7e";
		document.getElementById("container").appendChild(newdiv);
		document.getElementById("container").style.backgroundColor="#d1df7e";
		document.forms['form'+id].onsubmit=function() {setDirections(dir, document.forms['form'+id].from.value,document.forms['form'+id].to.value,'es',id);
		return false;
		}; 

}


 









