//Developed by Vladimir Lebedko
var iconAddMarker;
var iconMarker;
var iconMarkerNational;
var iconMarkerWildlife;
var lastzoom;
var zoomInOut;
var points = new Array();
var lastID = 0;
var numPoints=0;
var maxPoints=250;
var map;
var directions;
var addMarker;
var addMarkerEvent;
var addMarkerClickEvent;
var addPoint;
var addStartMarker;
var addStartMarkerEven=null;
var addStartMarkerClickEvent;
var addStartPoint;
var addFinishMarker;
var addFinishMarkerEvent=null;
var addFinishMarkerClickEvent;
var addFinishPoint;
var addIm1Marker;
var addIm1MarkerEvent=null;
var addIm1MarkerClickEvent;
var addIm1Point;
var addIm2Marker;
var addIm2MarkerEvent=null;
var addIm2MarkerClickEvent;
var addIm2Point;
var currentImage="";
var updateCurrentImageTimeoutID;
var isSearchingForDirection=false;
var mDirectionsHTML;
var directionPoints = [];
var directionsPolyline=null;
var directionMarkerIDs="";
var lastStartLocation="";
var lastIntermediate1Location="";
var lastIntermediate2Location="";
var lastFinishLocation="";
var startByAddress="";
var im1ByAddress="";
var im2ByAddress="";
var finishByAddress="";
var curCategory="";

addPoint = new GPoint(0, 0);
addStartPoint = new GPoint(0, 0);
addFinishPoint = new GPoint(0, 0);
addIm1Point = new GPoint(0, 0);
addIm2Point = new GPoint(0, 0);

iconAddStartMarker = new GIcon();
iconAddStartMarker.image = "img/marker-start.png";
iconAddStartMarker.iconSize = new GSize(20, 34);
iconAddStartMarker.shadow = "img/shadow.png"
iconAddStartMarker.shadowSize = new GSize(37, 34);
iconAddStartMarker.iconAnchor = new GPoint(9, 34);
iconAddStartMarker.infoWindowAnchor = new GPoint(5, 1);

iconAddFinishMarker = new GIcon();
iconAddFinishMarker.image = "img/marker-finish.png";
iconAddFinishMarker.iconSize = new GSize(20, 34);
iconAddFinishMarker.shadow = "img/shadow.png"
iconAddFinishMarker.shadowSize = new GSize(37, 34);
iconAddFinishMarker.iconAnchor = new GPoint(9, 34);
iconAddFinishMarker.infoWindowAnchor = new GPoint(5, 1);

iconAddIm1Marker = new GIcon();
iconAddIm1Marker.image = "img/marker-1.png";
iconAddIm1Marker.iconSize = new GSize(20, 34);
iconAddIm1Marker.shadow = "img/shadow.png"
iconAddIm1Marker.shadowSize = new GSize(37, 34);
iconAddIm1Marker.iconAnchor = new GPoint(9, 34);
iconAddIm1Marker.infoWindowAnchor = new GPoint(5, 1);

iconAddIm2Marker = new GIcon();
iconAddIm2Marker.image = "img/marker-2.png";
iconAddIm2Marker.iconSize = new GSize(20, 34);
iconAddIm2Marker.shadow = "img/shadow.png"
iconAddIm2Marker.shadowSize = new GSize(37, 34);
iconAddIm2Marker.iconAnchor = new GPoint(9, 34);
iconAddIm2Marker.infoWindowAnchor = new GPoint(5, 1);

iconAddMarker = new GIcon();
iconAddMarker.image = "img/marker-green.png";
iconAddMarker.iconSize = new GSize(20, 34);
iconAddMarker.shadow = "img/shadow.png"
iconAddMarker.shadowSize = new GSize(37, 34);
iconAddMarker.iconAnchor = new GPoint(9, 34);
iconAddMarker.infoWindowAnchor = new GPoint(5, 1);

iconMarker = new GIcon();
iconMarker.image = "img/marker-red.png";
iconMarker.iconSize = new GSize(20, 34);
iconMarker.shadow = "img/shadow.png"
iconMarker.shadowSize = new GSize(37, 34);
iconMarker.iconAnchor = new GPoint(9, 34);
iconMarker.infoWindowAnchor = new GPoint(5, 1);

lastzoom=-1;

function clearmap() {
 for (var i in points)	{
  GEvent.clearListeners(points[i],'click');
  map.removeOverlay(points[i]);
  delete points[i];
 }
 numPoints=0;
}

function zoomTo(pointx,pointy) {
 if(map.getZoomLevel()==0) {
  map.centerAndZoom(new GPoint(pointx,pointy), zoomInOut);
  } else {
   zoomInOut=map.getZoomLevel();
   map.centerAndZoom(new GPoint(pointx,pointy), 0);
   }
}

function createMarker(rowdata) {
 var marker;
 var aTitle=rowdata[2];
 var aID=rowdata[3];
 var id="a"+lastID.toString(); lastID++;
 var point;
 var markerDivBody;

 if (points[id]!=null) return;

 point=new GPoint(rowdata[0],rowdata[1]);
 marker = new GMarker(point, iconMarker);
			
 map.addOverlay(marker);
 
 markerDivBody="<div id=r><b>"+aTitle+"</b><br><a href=javascript:zoomTo("+point.x+","+point.y+")><b>Zoom In/Out</b></a><br>";
 markerDivBody=markerDivBody+"<iframe src=\"data.php?action=details&mID="+aID+"\" frameborder=0></iframe></div>"; 
 GEvent.addListener(marker, 'click', function() {
    	marker.openInfoWindowHtml(markerDivBody);
    	document.title="SimpatiGo | Guide | "+aTitle;
 });
 
 points[id]=marker;
 numPoints++;
}



function startRequest(minx,miny,maxx,maxy,z,clear,minx2,miny2,maxx2,maxy2) {
 var url;
 var request;
 var sCategory = document.getElementById("category").options[document.getElementById("category").selectedIndex].value;

 request = GXmlHttp.create();
	
 url="data.php?minx="+minx+"&miny="+miny+"&maxx="+maxx+"&maxy="+maxy+"&category="+sCategory;
	
 request.open("GET", url , true);

 request.onreadystatechange = function() {
  if (request.readyState == 4) {
   if (z!=lastzoom) return;
   var xmlDoc = request.responseText;
   var rows=xmlDoc.split("\n");
   if (rows.length<4) return;
   if (clear) clearmap();
   var mRows = new Array();  
   for (i=0;i<rows.length-4;i+=4) {
    mRows[0]=rows[i];
    mRows[1]=rows[i+1];
    mRows[2]=rows[i+2];
    mRows[3]=rows[i+3];
    createMarker(mRows);
   }
  }
 } 
 request.send(null);
}


function changeDetail() {
 var zoom= map.getZoomLevel();
 var bounds = map.getBoundsLatLng();
 startRequest(bounds.minX, bounds.minY, bounds.maxX, bounds.maxY, zoom, 1);
}

function changeCategory() {
 if(document.getElementById("category").selectedIndex==document.getElementById("category").length-1){
  showCategoriesWnd();
 } else { changeDetail(); }
}

function showCategoriesWnd() {
 var sCategory = document.getElementById("category").options[document.getElementById("category").length-1].value;
 var cLength = document.getElementById("category").length-1;
 var extensionBody = "";
 document.getElementById("categoriesWnd").style.display="";
 document.getElementById("categoriesWnd").style.top="35%";
 document.getElementById("categoriesWnd").style.left="20%";
 document.getElementById("categoriesWnd").style.width="36%";
 document.getElementById("categoriesWnd").style.height="30%";
 document.getElementById("categoriesWnd").style.border="1px solid #999999";
 extensionBody="<table width='100%' height='100%' border='0' cellspacing='0' cellpadding='0'>"+
               "<tr class='wnd-title' style='background-color: #f8f8f8;'>"+
               "<td class='tdborder' width='50%'>"+
               "&nbsp;Select Categories</td>"+
               "<td align='right' class='tdborder' width='50%'>"+
               "<a href='javascript:hideCategoriesWnd()' class='close'>Close "+
               "<img class='close' border='0' src='img/closewnd.gif' style='vertical-align:text-bottom;'></a>"+ 
               "</td></tr><tr>"+
               "<td colspan='2' width='100%'>"+
               "<table border='0' width='100%'><tr>";
 for(i=1;i<cLength;i++){
  extensionBody=extensionBody+"<td width='50%'><input type='checkbox' value='"+
              document.getElementById("category").options[i].value+"'"+
              ((sCategory.indexOf(document.getElementById('category').options[i].value+',')!=-1)?" checked":"")+
              " onclick='updateCustCategory(this)'>"+
              document.getElementById("category").options[i].value+"</td>";
  if((i%2)==0) {extensionBody=extensionBody+"</tr><tr>";}
 }
 extensionBody=extensionBody+"</tr></table></td></tr></table>";

 document.getElementById("categoriesWnd").innerHTML=extensionBody;
}

function hideCategoriesWnd() {
 document.getElementById("categoriesWnd").innerHTML="";
 document.getElementById("categoriesWnd").style.display="none"; 
 changeDetail();
}

function updateCustCategory(cbObj) {
 var sCategory = document.getElementById("category").options[document.getElementById("category").length-1].value;
 if(cbObj.checked){
  sCategory = sCategory+cbObj.value+",";
 } else {
    tA = sCategory.split(cbObj.value+","); sCategory = tA.join("");
   } 
 document.getElementById("category").options[document.getElementById("category").length-1].value=sCategory;
}

function jumpToCity() {
	var ct = document.getElementById("city").value;
	var request = GXmlHttp.create();
	var url = "location.php?action=city&city="+ct;
	
	if(ct=="") {
	 map.centerAndZoom(new GPoint(centerx,centery), 13);
	 return;
	}
	
	request.open("GET", url , true);
	request.onreadystatechange = function() {
	 if (request.readyState == 4) {
 	  var xmlDoc = request.responseText;
  	  var loc=xmlDoc.split("|");
	  if (loc==0 || loc.length!=2) {
	  map.centerAndZoom(new GPoint(centerx,centery), 13);
	 } else {
		map.centerAndZoom(new GPoint(loc[0],loc[1]), 6);
	   }
  	  }
	}
	changeDetail(); 	
	request.send(null);	
}

function showWait(msgString){
 var waitMsg = "<center>&nbsp;<br>&nbsp;<br>&nbsp;<br><b>"+msgString+
               "</b><br>&nbsp;<br><img src=\"img/progressbar.gif\" width=\"140\" height=\"13\"></center>";
 document.getElementById("wait").innerHTML=waitMsg;
 document.getElementById("wait").style.display=''; 
}

function hideWait(){
 document.getElementById("wait").style.display='none';
}

function searchForLocation(){
 var sLoc = document.getElementById("sLocation").value;
 var request = GXmlHttp.create();
 var url = "location.php?action=search&location="+sLoc;
	
 if(sLoc=="") {
  alert("Enter location to search, please.");
  return;
 }

 showWait("Searching, please wait...");
 
 request.open("GET", url , true);
 request.onreadystatechange = function() {
  if (request.readyState == 4) {
   var xmlDoc = request.responseText;
   var loc=xmlDoc.split("|");
   
   hideWait();
   
   if (loc==0 || loc.length!=2) {
    alert("Location not found. Please enter location in next format: Street, City, State, Zip\n"+
          "Also, you can try more general keywords 'City, State' or 'Zip' for search.");
   } else {
      if ((loc[0]==0 && loc[1]==0)||(loc[0]==-95.677068 && loc[1]==37.062500)) {
        alert("Location not found. Please enter location in next format: Street, City, State, Zip\n"+
              "Also, you can try more general keywords 'City, State' or 'Zip' for search."); 
      } else {
         map.centerAndZoom(new GPoint(loc[0],loc[1]), 2);
         changeDetail(); 	
         //if(document.getElementById("Add_marker_block").style.display!='none'){
          if(addPoint.x!=0) {
           map.removeOverlay(addMarker); 
           GEvent.removeListener(addMarkerClickEvent);
          }
          addPoint.x = loc[0];
          addPoint.y = loc[1];
          addMarker = new GMarker(addPoint, iconAddMarker);
          addMarkerClickEvent = GEvent.addListener(addMarker, 'click', function() {
	       addMarker.openInfoWindowHtml("<div id=s>Fill in the form and press &quot;Add&quot; button<br>to save this marker with your image.</div>");
          });
          map.addOverlay(addMarker);
         //}
        }
     }
  }
 }
 
 request.send(null); 
}

function uploadNewImage(){
 var width = 400;
 var height = 150;
 var props = "scrollbars=no";
 var url;
 
 var x = (screen.width - width) / 2;
 var y = (screen.height - height) / 2;
 
 props += ",titlebar=yes,width=" + width + ",height=" + height + ",left=" + x + ",top=" + y +",screenX=" + x + ",screenY=" + y;
 url = "data.php?action=uploadimage";
 
 var uploadNewImageWnd = window.open(url, "uploadNewImage", props); 
 uploadNewImageWnd.focus();
}

function updateCurrentImage(){
 updateCurrentImageTimeoutID = setTimeout("showCurrentImage()", 500)
}

function showCurrentImage(){
 clearTimeout(updateCurrentImageTimeoutID);
 var currentImageHTML = "<img src=\"images/"+currentImage+"\" border=\"0\" width=\"100%\">";
 document.getElementById("mCurrentImage").innerHTML=currentImageHTML;
}

function searchForStartLocation(){
  if(document.getElementById("setSLocation").disabled){
  document.getElementById("setSLocation").disabled=false;
  if(addStartMarkerEvent!=null) {
   GEvent.removeListener(addStartMarkerEvent);
   addStartMarkerEvent=null;
  }
 }
 if(document.getElementById("setFLocation").disabled){
  document.getElementById("setFLocation").disabled=false;
  if(addFinishMarkerEvent!=null) {
   GEvent.removeListener(addFinishMarkerEvent);
   addFinishMarkerEvent=null;
  }
 }
 if(document.getElementById("setIm1Location").disabled){
  document.getElementById("setIm1Location").disabled=false;
  if(addIm1MarkerEvent!=null) { 
   GEvent.removeListener(addIm1MarkerEvent);
   addIm1MarkerEvent=null;
  }
 }
 if(document.getElementById("setIm2Location").disabled){
  document.getElementById("setIm2Location").disabled=false;
  if(addIm2MarkerEvent!=null) { 
   GEvent.removeListener(addIm2MarkerEvent);
   addIm2MarkerEvent=null;
  }
 }
 var sAddress = document.getElementById("mStartAddress").value;
 tA = sAddress.split("&"); sAddress = tA.join(" ");
 tA = sAddress.split("#"); sAddress = tA.join(" ");
 if(sAddress=="" && addStartPoint.x==0) {
  alert("Please enter a value for the \"Start Address\" field.");
  return;
 }
 
 if(sAddress==lastStartLocation){
  if(document.getDirectionsForm.mDestination[0].checked){
   searchForFinishLocation();
  } else {
     searchForIntermediate1Location();
    }
  return; 
 }
 
 var request = GXmlHttp.create();
 var url = "location.php?action=search&location="+sAddress;
 
 showWait("Searching, please wait...");
 request.open("GET", url , true);
 request.onreadystatechange = function() {
  if (request.readyState == 4) {
   var xmlDoc = request.responseText;
   var loc=xmlDoc.split("|");
   hideWait();
   if (loc==0 || loc.length!=2) {
    alert("Address not found. Please enter Address in next format: Street, City, State, Zip\n"+
          "Also, you can try more general keywords 'City, State' or 'Zip' for search.");
   } else {
      if ((loc[0]==0 && loc[1]==0)||(loc[0]==-95.677068 && loc[1]==37.062500)) {
       alert("Address not found. Please enter Address in next format: Street, City, State, Zip\n"+
             "Also, you can try more general keywords 'City, State' or 'Zip' for search.");
      } else {
         map.centerAndZoom(new GPoint(loc[0],loc[1]), 3);
         changeDetail(); 	
         if(addStartPoint.x!=0) {
          map.removeOverlay(addStartMarker);
          GEvent.removeListener(addStartMarkerClickEvent);
         }
         addStartPoint.x = loc[0];
         addStartPoint.y = loc[1];
         addStartMarker = new GMarker(addStartPoint, iconAddStartMarker);
         addStartMarkerClickEvent = GEvent.addListener(addStartMarker, 'click', function() {
 	      addStartMarker.openInfoWindowHtml("<div id=s>Start Address</div>");
         });
         map.addOverlay(addStartMarker);
         startByAddress=sAddress;
         if(document.getDirectionsForm.mDestination[0].checked){
          searchForFinishLocation();
         } else {
            searchForIntermediate1Location();
           }
        }
     }
  }
 }
 request.send(null); 
}

function searchForFinishLocation(){
 if(document.getElementById("setSLocation").disabled){
  document.getElementById("setSLocation").disabled=false;
  if(addStartMarkerEvent!=null) {
   GEvent.removeListener(addStartMarkerEvent);
   addStartMarkerEvent=null;
  }
 }
 if(document.getElementById("setFLocation").disabled){
  document.getElementById("setFLocation").disabled=false;
  if(addFinishMarkerEvent!=null) {
   GEvent.removeListener(addFinishMarkerEvent);
   addFinishMarkerEvent=null;
  }
 }
 if(document.getElementById("setIm1Location").disabled){
  document.getElementById("setIm1Location").disabled=false;
  if(addIm1MarkerEvent!=null) { 
   GEvent.removeListener(addIm1MarkerEvent);
   addIm1MarkerEvent=null;
  }
 }
 if(document.getElementById("setIm2Location").disabled){
  document.getElementById("setIm2Location").disabled=false;
  if(addIm2MarkerEvent!=null) { 
   GEvent.removeListener(addIm2MarkerEvent);
   addIm2MarkerEvent=null;
  }
 }
 var sAddress = document.getElementById("mFinishAddress").value;
 tA = sAddress.split("&"); sAddress = tA.join(" ");
 tA = sAddress.split("#"); sAddress = tA.join(" ");
 if(sAddress=="" && addFinishPoint.x==0) {
  alert("Please enter a value for the \"Finish Address\" field.");
  return;
 }
 
 if(sAddress==lastFinishLocation){
  searchForDirection();
  return; 
 }
 
 var request = GXmlHttp.create();
 var url = "location.php?action=search&location="+sAddress;
 
 showWait("Searching, please wait...");
 request.open("GET", url , true);
 request.onreadystatechange = function() {
  if (request.readyState == 4) {
   var xmlDoc = request.responseText;
   var loc=xmlDoc.split("|");
   hideWait();
   if (loc==0 || loc.length!=2) {
    alert("Address not found. Please enter Address in next format: Street, City, State, Zip\n"+
          "Also, you can try more general keywords 'City, State' or 'Zip' for search.");
   } else {
      if ((loc[0]==0 && loc[1]==0)||(loc[0]==-95.677068 && loc[1]==37.062500)) {
       alert("Address not found. Please enter Address in next format: Street, City, State, Zip\n"+
             "Also, you can try more general keywords 'City, State' or 'Zip' for search.");
      } else {
         map.centerAndZoom(new GPoint(loc[0],loc[1]), 3);
         changeDetail(); 	
         if(addFinishPoint.x!=0) { 
          map.removeOverlay(addFinishMarker); 
          GEvent.removeListener(addFinishMarkerClickEvent);
         }
         addFinishPoint.x = loc[0];
         addFinishPoint.y = loc[1];
         addFinishMarker = new GMarker(addFinishPoint, iconAddFinishMarker);
         addFinishMarkerClickEvent = GEvent.addListener(addFinishMarker, 'click', function() {
 	      addFinishMarker.openInfoWindowHtml("<div id=s>Finish Address</div>");
         });
         map.addOverlay(addFinishMarker);
         finishByAddress=sAddress;
         if(addStartPoint.x!=0) searchForDirection();
        }
     }
  }
 }
 request.send(null); 
}

function searchForIntermediate1Location(){
 if(document.getElementById("setSLocation").disabled){
  document.getElementById("setSLocation").disabled=false;
  if(addStartMarkerEvent!=null) {
   GEvent.removeListener(addStartMarkerEvent);
   addStartMarkerEvent=null;
  }
 }
 if(document.getElementById("setFLocation").disabled){
  document.getElementById("setFLocation").disabled=false;
  if(addFinishMarkerEvent!=null) {
   GEvent.removeListener(addFinishMarkerEvent);
   addFinishMarkerEvent=null;
  }
 }
 if(document.getElementById("setIm1Location").disabled){
  document.getElementById("setIm1Location").disabled=false;
  if(addIm1MarkerEvent!=null) { 
   GEvent.removeListener(addIm1MarkerEvent);
   addIm1MarkerEvent=null;
  }
 }
 if(document.getElementById("setIm2Location").disabled){
  document.getElementById("setIm2Location").disabled=false;
  if(addIm2MarkerEvent!=null) { 
   GEvent.removeListener(addIm2MarkerEvent);
   addIm2MarkerEvent=null;
  }
 }
 var sAddress = document.getElementById("mIntermediateAddress1").value;
 tA = sAddress.split("&"); sAddress = tA.join(" ");
 tA = sAddress.split("#"); sAddress = tA.join(" ");
 
 if(sAddress==lastIntermediate1Location){
  searchForIntermediate2Location();
  return; 
 }
 
 var request = GXmlHttp.create();
 var url = "location.php?action=search&location="+sAddress;
 
 showWait("Searching, please wait...");
 request.open("GET", url , true);
 request.onreadystatechange = function() {
  if (request.readyState == 4) {
   var xmlDoc = request.responseText;
   var loc=xmlDoc.split("|");
   hideWait();
   if (loc==0 || loc.length!=2) {
    alert("Address not found. Please enter Address in next format: Street, City, State, Zip\n"+
          "Also, you can try more general keywords 'City, State' or 'Zip' for search.");
   } else {
      if ((loc[0]==0 && loc[1]==0)||(loc[0]==-95.677068 && loc[1]==37.062500)) {
       alert("Address not found. Please enter Address in next format: Street, City, State, Zip\n"+
             "Also, you can try more general keywords 'City, State' or 'Zip' for search.");
      } else {
         map.centerAndZoom(new GPoint(loc[0],loc[1]), 3);
         changeDetail(); 	
         if(addIm1Point.x!=0) { 
          map.removeOverlay(addIm1Marker); 
          GEvent.removeListener(addIm1MarkerClickEvent);
         }
         addIm1Point.x = loc[0];
         addIm1Point.y = loc[1];
         addIm1Marker = new GMarker(addIm1Point, iconAddIm1Marker);
         addIm1MarkerClickEvent = GEvent.addListener(addIm1Marker, 'click', function() {
 	      addIm1Marker.openInfoWindowHtml("<div id=s>Intermediate Address #1</div>");
         });
         map.addOverlay(addIm1Marker);
         im1ByAddress=sAddress;
         searchForIntermediate2Location();
        }
     }
  }
 }
 request.send(null); 
}

function searchForIntermediate2Location(){
 if(document.getElementById("setSLocation").disabled){
  document.getElementById("setSLocation").disabled=false;
  if(addStartMarkerEvent!=null) {
   GEvent.removeListener(addStartMarkerEvent);
   addStartMarkerEvent=null;
  }
 }
 if(document.getElementById("setFLocation").disabled){
  document.getElementById("setFLocation").disabled=false;
  if(addFinishMarkerEvent!=null) {
   GEvent.removeListener(addFinishMarkerEvent);
   addFinishMarkerEvent=null;
  }
 }
 if(document.getElementById("setIm1Location").disabled){
  document.getElementById("setIm1Location").disabled=false;
  if(addIm1MarkerEvent!=null) { 
   GEvent.removeListener(addIm1MarkerEvent);
   addIm1MarkerEvent=null;
  }
 }
 if(document.getElementById("setIm2Location").disabled){
  document.getElementById("setIm2Location").disabled=false;
  if(addIm2MarkerEvent!=null) { 
   GEvent.removeListener(addIm2MarkerEvent);
   addIm2MarkerEvent=null;
  }
 }
 var sAddress = document.getElementById("mIntermediateAddress2").value;
 tA = sAddress.split("&"); sAddress = tA.join(" ");
 tA = sAddress.split("#"); sAddress = tA.join(" ");
 
 if(sAddress==lastIntermediate2Location){
  searchForFinishLocation();
  return; 
 }
 
 var request = GXmlHttp.create();
 var url = "location.php?action=search&location="+sAddress;
 
 showWait("Searching, please wait...");
 request.open("GET", url , true);
 request.onreadystatechange = function() {
  if (request.readyState == 4) {
   var xmlDoc = request.responseText;
   var loc=xmlDoc.split("|");
   hideWait();
   if (loc==0 || loc.length!=2) {
    alert("Address not found. Please enter Address in next format: Street, City, State, Zip\n"+
          "Also, you can try more general keywords 'City, State' or 'Zip' for search.");
   } else {
      if ((loc[0]==0 && loc[1]==0)||(loc[0]==-95.677068 && loc[1]==37.062500)) {
       alert("Address not found. Please enter Address in next format: Street, City, State, Zip\n"+
             "Also, you can try more general keywords 'City, State' or 'Zip' for search.");
      } else {
         map.centerAndZoom(new GPoint(loc[0],loc[1]), 3);
         changeDetail(); 	
         if(addIm2Point.x!=0) { 
          map.removeOverlay(addIm2Marker); 
          GEvent.removeListener(addIm2MarkerClickEvent);
         }
         addIm2Point.x = loc[0];
         addIm2Point.y = loc[1];
         addIm2Marker = new GMarker(addIm2Point, iconAddIm2Marker);
         addIm2MarkerClickEvent = GEvent.addListener(addIm2Marker, 'click', function() {
         addIm2Marker.openInfoWindowHtml("<div id=s>Intermediate Address #2</div>");
         });
         map.addOverlay(addIm2Marker);
         im2ByAddress=sAddress;
         searchForFinishLocation();
        }
     }
  }
 }
 request.send(null); 
}

function setStartLocation(){
 document.getElementById("setSLocation").disabled=true;
 document.getElementById("setFLocation").disabled=true;
 document.getElementById("setIm1Location").disabled=true;
 document.getElementById("setIm2Location").disabled=true;
 alert("Now left click on the map to select your Starting point");
 addStartMarkerEvent = GEvent.addListener(map, 'click', function(overlay, point) {
  if(!point) return;
  if(addStartPoint.x!=0) {
   map.removeOverlay(addStartMarker);
   GEvent.removeListener(addStartMarkerEvent);
   addStartMarkerEvent=null;
   GEvent.removeListener(addStartMarkerClickEvent);
  }
  addStartPoint.x = point.x;
  addStartPoint.y = point.y;
  addStartMarker = new GMarker(addStartPoint, iconAddStartMarker);
  addStartMarkerClickEvent = GEvent.addListener(addStartMarker, 'click', function() {
   addStartMarker.openInfoWindowHtml("<div id=s>Start Address</div>");
  });
  map.addOverlay(addStartMarker);
  startByAddress="";
  document.getElementById("setSLocation").disabled=false;
  document.getElementById("setFLocation").disabled=false;
  document.getElementById("setIm1Location").disabled=false;
  document.getElementById("setIm2Location").disabled=false;
  if(addFinishPoint.x!=0) searchForDirection();
  if(addStartMarkerEvent!=null) GEvent.removeListener(addStartMarkerEvent);
  addStartMarkerEvent=null;
 });
}

function setFinishLocation(){
 document.getElementById("setSLocation").disabled=true;
 document.getElementById("setFLocation").disabled=true;
 document.getElementById("setIm1Location").disabled=true;
 document.getElementById("setIm2Location").disabled=true;
 alert("Now left click on the map to select your Finish point");
 addFinishMarkerEvent = GEvent.addListener(map, 'click', function(overlay, point) {
  if(!point) return;
  if(addFinishPoint.x!=0) { 
   map.removeOverlay(addFinishMarker); 
   GEvent.removeListener(addFinishMarkerEvent);
   addFinishMarkerEvent=null;
   GEvent.removeListener(addFinishMarkerClickEvent);
  }
  addFinishPoint.x = point.x;
  addFinishPoint.y = point.y;
  addFinishMarker = new GMarker(addFinishPoint, iconAddFinishMarker);
  addFinishMarkerClickEvent = GEvent.addListener(addFinishMarker, 'click', function() {
   addFinishMarker.openInfoWindowHtml("<div id=s>Finish Address</div>");
  });
  map.addOverlay(addFinishMarker);
  finishByAddress="";
  document.getElementById("setSLocation").disabled=false;
  document.getElementById("setFLocation").disabled=false;
  document.getElementById("setIm1Location").disabled=false;
  document.getElementById("setIm2Location").disabled=false;
  if(addStartPoint.x!=0) searchForDirection();
  if(addFinishMarkerEvent!=null) GEvent.removeListener(addFinishMarkerEvent);
  addFinishMarkerEvent=null;
 });
}

function setIntermediate1Location(){
 document.getElementById("setSLocation").disabled=true;
 document.getElementById("setFLocation").disabled=true;
 document.getElementById("setIm1Location").disabled=true;
 document.getElementById("setIm2Location").disabled=true;
 alert("Now left click on the map to select your Intermediate point");
 addIm1MarkerEvent = GEvent.addListener(map, 'click', function(overlay, point) {
  if(!point) return;
  if(addIm1Point.x!=0) { 
   map.removeOverlay(addIm1Marker); 
   GEvent.removeListener(addIm1MarkerEvent);
   addIm1MarkerEvent=null;
   GEvent.removeListener(addIm1MarkerClickEvent);
  }
  addIm1Point.x = point.x;
  addIm1Point.y = point.y;
  addIm1Marker = new GMarker(addIm1Point, iconAddIm1Marker);
  addIm1MarkerClickEvent = GEvent.addListener(addIm1Marker, 'click', function() {
   addIm1Marker.openInfoWindowHtml("<div id=s>Intermediate Address #1</div>");
  });
  map.addOverlay(addIm1Marker);
  im1ByAddress="";
  document.getElementById("setSLocation").disabled=false;
  document.getElementById("setFLocation").disabled=false;
  document.getElementById("setIm1Location").disabled=false;
  document.getElementById("setIm2Location").disabled=false;
  if(addFinishPoint.x!=0 && addStartPoint.x!=0) searchForDirection();
  if(addIm1MarkerEvent!=null) GEvent.removeListener(addIm1MarkerEvent);
  addIm1MarkerEvent=null;
 });
}

function setIntermediate2Location(){
 document.getElementById("setSLocation").disabled=true;
 document.getElementById("setFLocation").disabled=true;
 document.getElementById("setIm1Location").disabled=true;
 document.getElementById("setIm2Location").disabled=true;
 alert("Please click on Map to set up Intermediate Location");
 addIm2MarkerEvent = GEvent.addListener(map, 'click', function(overlay, point) {
  if(!point) return;
  if(addIm2Point.x!=0) { 
   map.removeOverlay(addIm2Marker); 
   GEvent.removeListener(addIm2MarkerEvent);
   addIm2MarkerEvent=null;
   GEvent.removeListener(addIm2MarkerClickEvent);
  }
  addIm2Point.x = point.x;
  addIm2Point.y = point.y;
  addIm2Marker = new GMarker(addIm2Point, iconAddIm2Marker);
  addIm2MarkerClickEvent = GEvent.addListener(addIm2Marker, 'click', function() {
   addIm2Marker.openInfoWindowHtml("<div id=s>Intermediate Address #2</div>");
  });
  map.addOverlay(addIm2Marker);
  im2ByAddress="";
  document.getElementById("setSLocation").disabled=false;
  document.getElementById("setFLocation").disabled=false;
  document.getElementById("setIm1Location").disabled=false;
  document.getElementById("setIm2Location").disabled=false;
  if(addFinishPoint.x!=0 && addStartPoint.x!=0) searchForDirection();
  if(addIm2MarkerEvent!=null) GEvent.removeListener(addIm2MarkerEvent);
  addIm2MarkerEvent=null;
 });
}


function searchForDirection(){
 if(isSearchingForDirection) {
  alert("Please wait, search request in progress");
  return;
 }
 isSearchingForDirection=true;
 var t=0; if(document.getDirectionsForm.mType[1].checked) t=1;
 var sQuery = "from: ";
 var sCategory = document.getElementById("category").options[document.getElementById("category").selectedIndex].value;

 curCategory=sCategory;
 sQuery = sQuery+addStartPoint.y+", "+addStartPoint.x;
 if(addIm1Point.x!=0) { sQuery = sQuery+" to: "+addIm1Point.y+", "+addIm1Point.x; }
 if(addIm2Point.x!=0) { sQuery = sQuery+" to: "+addIm2Point.y+", "+addIm2Point.x; }
 sQuery = sQuery+" to: "+addFinishPoint.y+", "+addFinishPoint.x;


 mDirectionsHTML = "&nbsp;<br>&nbsp;<br><center>Searching for Directions, please wait..</center><br>&nbsp;<br>&nbsp;";
 document.getElementById("mDirections").innerHTML=mDirectionsHTML;
 directions.clear();

 if(t==1){
  directions.load(sQuery, {travelMode:G_TRAVEL_MODE_WALKING});
 }
 else {
  directions.load(sQuery);
 }

}

function getStepGuide(step, x1, y1, x2, y2){
 var request = GXmlHttp.create();
 var url = "data.php?action=guide&step="+step+"&x1="+x1+"&y1="+y1+"&x2="+x2+"&y2="+y2+"&category="+curCategory;
 var sGuide = "";
 var markerId = "";

 request.open("GET", url , true);
 request.onreadystatechange = function() {
  if (request.readyState == 4) {
   var xmlDoc = request.responseText;
   var loc=xmlDoc.split("\n");
   if (loc!=0 && loc.length>2){
    for(i=0;i<loc[1];i++){
     markerId = loc[2*i+2]+",";
     if(directionMarkerIDs.indexOf(markerId)==-1) {
      sGuide=sGuide+loc[2*i+3];
      directionMarkerIDs=directionMarkerIDs+markerId;
     }
    }
    document.getElementById("mStep"+loc[0]).innerHTML=sGuide;
   }
  }
 }
 request.send(null);
}

function checkDirections(){
 if(directions.getStatus().code!=G_GEO_SUCCESS){
  mDirectionsHTML = "&nbsp;<br>&nbsp;<br><center>Directions not found.<br>Change Start or Finish address and try again.</center><br>&nbsp;<br>&nbsp;";
  document.getElementById("mDirections").innerHTML=mDirectionsHTML;
  isSearchingForDirection=false;
  document.getElementById("mDirectionsPrint").style.display='none';
  if(directionsPolyline!=null) {
   map.removeOverlay(directionsPolyline);
   directionsPolyline=null;
  }
 }
}

function getDirections(){
 var numRoutes=0;
 var numSteps=0;
 var aRoute;
 var aStep;
 var sCnt=0;
 var lastX;
 var lastY;
 directionPoints = [];
 directionMarkerIDs = "";
 numRoutes=directions.getNumRoutes();

 if(numRoutes==0) {
  mDirectionsHTML = "&nbsp;<br>&nbsp;<br><center>Directions not found.<br>Change Start or Finish address and try again.</center><br>&nbsp;<br>&nbsp;";
  document.getElementById("mDirections").innerHTML=mDirectionsHTML;
  isSearchingForDirection=false;
  document.getElementById("mDirectionsPrint").style.display='none';
  if(directionsPolyline!=null) {
   map.removeOverlay(directionsPolyline);
   directionsPolyline=null;
  }
  return;
 }

 mDirectionsHTML="Length: "+directions.getSummaryHtml()+"<br>Steps:<ol>";
 for(i=0;i<numRoutes;i++){
  aRoute=directions.getRoute(i);
  numSteps=aRoute.getNumSteps();
  for(j=0;j<numSteps;j++){
   aStep=aRoute.getStep(j);
   directionPoints.push(new GLatLng(aStep.getLatLng().lat(),aStep.getLatLng().lng()));
   sCnt++;
   mDirectionsHTML=mDirectionsHTML+"<li>"+aStep.getDescriptionHtml()+" ("+aStep.getDistance().html+")<div id=\"mStep"+sCnt+"\"></div>&nbsp;<br></li>";
   if(sCnt>1){
    getStepGuide(sCnt-1, lastX, lastY, aStep.getLatLng().lng(), aStep.getLatLng().lat());
   }
   lastX=aStep.getLatLng().lng();
   lastY=aStep.getLatLng().lat();
  }
  directionPoints.push(new GLatLng(aRoute.getEndLatLng().lat(),aRoute.getEndLatLng().lng()));
  getStepGuide(sCnt, lastX, lastY, aRoute.getEndLatLng().lng(), aRoute.getEndLatLng().lat());
 }

 mDirectionsHTML=mDirectionsHTML+"</ol>";
 document.getElementById("mDirections").innerHTML=mDirectionsHTML;

 if(directionsPolyline!=null) {
  map.removeOverlay(directionsPolyline);
  directionsPolyline=null;
 }

 directionsPolyline = new GPolyline(directionPoints);
 map.addOverlay(directionsPolyline);

 isSearchingForDirection=false;
 directions.clear();
 document.getElementById("mDirectionsPrint").style.display='';
}

function mTypeChange(){
 if(addStartPoint.x!=0 && addFinishPoint.x!=0) searchForDirection();
}

function mDestinationChange(){
 if(document.getDirectionsForm.mDestination[0].checked){
  document.getElementById("mDestinationDiv").style.display='none';
  if(addIm1Point.x!=0) {
   map.removeOverlay(addIm1Marker);
   GEvent.removeListener(addIm1MarkerClickEvent);
   addIm1Point.x=0;
  }
  if(addIm2Point.x!=0) {
   map.removeOverlay(addIm2Marker);
   GEvent.removeListener(addIm2MarkerClickEvent);
   addIm2Point.x=0;
  }
 } else {
    document.getElementById("mDestinationDiv").style.display='';
   }
 if(addStartPoint.x!=0 && addFinishPoint.x!=0) searchForDirection();
}

function printMyGuide(){
 var width = 600;
 var height = 400;
 var props = "status=no,scrollbars=yes,toolbar=yes,resizable=yes,menubar=yes";
 var url = "printmyguide.php";
 
 var x = (screen.width - width) / 2;
 var y = (screen.height - height) / 2;
 
 props += ",width=" + width + ",height=" + height + ",left=" + x + ",top=" + y +",screenX=" + x + ",screenY=" + y;
  
 var printMyGuideWnd = window.open(url, "printMyGuide", props); 
 printMyGuideWnd.focus();
}

