//****************************************************
//                         Global Variables
//****************************************************
var map = null;
var initialLocation = null;
var pts = new Array();
var trails = new Array();
var isPublic = false;

//****************************************************
//                         Object definitions
//****************************************************

function Point(p)
{
   if(p)
   {
      // These first variables correspond directly to fields in the database
      var pt = new google.maps.LatLng(p.getAttribute("lat") * 1, p.getAttribute("lng") * 1);
      this.type = p.getAttribute("type");
      this.name = p.getAttribute("name");
      this.id   = p.getAttribute("id") * 1;

      this.tText = '<div class="marker"><h1>'+this.name+'</h1></div>';
      var hover = this.id + ': ' + this.name;
      if(isPublic)
      {
         this.overlay = new google.maps.Marker({ clickable: false, position: pt });
      }
      else
      {
         this.overlay = createAdminMarker(pt);
      }

      this.overlay.dsrID = this.id;
   }
   else
   {
      this.type   = 'tp';
      this.name   = 'New Trail Point';
      this.id     = 0;
      this.tText  = '<div class="marker"><h1>'+this.name+'</h1></div>';
      this.overlay = null;
   }

   this.onTrail = false;
   this.dist = 0;

   this.addToMap = addToMap;
   this.removeFromMap = removeFromMap;
   this.addToSelect = addToSelect;
}

function addToMap()
{
   if(this.overlay && map)
   {
      this.overlay.setMap(map);
   }
   else
   {
      return false;
   }

   return true;
}

function removeFromMap()
{
   if(this.overlay && map)
   {
      this.overlay.setMap(null);
   }
   else
   {
      return false;
   }

   return true;
}

function sortByDist(a, b)
{
   return ((a.dist < b.dist) ? -1 : ((a.dist > b.dist) ? 1 : 0));
}

function sortByID(a, b)
{
   return ((a.id < b.id) ? -1 : ((a.id > b.id) ? 1 : 0));
}

function Trail(t)
{
   this.points = new Array();
   this.isHilite = false;

   if(t)
   {
      this.name   = t.getAttribute("name");
      this.id     = t.getAttribute("id") * 1;
      this.length = t.getAttribute("length");

 		var p = t.getAttribute("points").split(';');
      var len = p.length;
      var linePoints = new google.maps.MVCArray();
      for(var i = 0; i < len; i++)
      {
         var ind = findIndexByID(p[i] * 1);
         if(ind >= 0)
         {
            this.points[i] = p[i] * 1;
            linePoints.push(pts[ind].overlay.getPosition());
         }
         else if(!confirm("Point '" + this.points[i] + "' was not found to be loaded for use in trail '" + this.name + "'.  Should we continue to load this trail?"))
         {
            // this point was not loaded for some reason; either point no longer exists, or there was an error loading points
            die();
         }
      }

      this.overlay = new google.maps.Polyline({ map: map, path: linePoints, strokeColor: "#ff0000", strokeWeight: 4, strokeOpacity: 1 });
   }
   else
   {
      this.name    = 'New Trail';
      this.id      = 0;
      this.length  = 0;
      this.overlay = null;
   }

   this.addToMap = addToMap;
   this.removeFromMap = removeFromMap;
   this.addPoint = addPoint;
   this.drawTrail = drawTrail;
   this.removePoint = removePointFromTrail;
}

function addPoint(id)
{
   this.points.push(id * 1);
}

function addToSelect()
{
   var x = document.getElementById("aPoints");

   var y = document.createElement('option');
   y.text = this.id + ': ' + this.name;
   y.value = this.id;
   try       { x.add(y, null); }
   catch(ex) { x.add(y);       }
}

function drawTrail()
{
   var len = this.points.length;
   if(len > 1)
   {
      this.removeFromMap();
      var linePoints = new Array();
      for(var i = 0; i < len; i++)
      {
         var ind = findIndexByID(this.points[i]);
         linePoints[i] = pts[ind].overlay.getPosition();
      }

      this.overlay = new google.maps.Polyline(linePoints, "#ff0000", 4, 1);
      this.addToMap();
   }
}

// accessed by trail.removePoint
function removePointFromTrail(pID)
{
   var len = this.points.length;
   var i = 0;
   var pointRemoved = false;
   var linePoints = new google.maps.MVCArray();
   var ind = 0;

   while(i < len)
   {
      if(this.points[i] == pID)
      {
         this.points.splice(i, 1);
         len--;
         pointRemoved = true;
      }
      else
      {
         ind = findIndexByID(this.points[i]);
         linePoints.push(pts[ind].overlay.getPosition());
         i++;
      }
   }

   if(pointRemoved)
   {
      this.overlay.setPath(linePoints);
   }
}

//**********************************************************************************

//******************************************************************************
//       Mobile Functions
//******************************************************************************

//
// Looks for mobile device, and maximizes the size of the map div
//
function detectMobile()
{
   var ua = navigator.userAgent;
   var mapdiv = document.getElementById("map_canvas");
   var mobile = false;

   if(ua.indexOf('iPhone') != -1 || ua.indexOf('Android') != -1 )
   {
//      alert('Mobile phone detected.');
      mapdiv.style.display = 'block';
      mapdiv.style.height = '100%';
      mapdiv.style.width = '100%';
      mobile = true;
   }

   return mobile;
}

function initDirections()
{
   if(detectMobile())
   {
      var script = document.createElement("script");
      script.type = "text/javascript";
      script.src = "http://maps.google.com/maps/api/js?sensor=true&callback=mobileDirections";
      document.body.appendChild(script);

      var meta = document.createElement("meta");
      meta.name = "viewport";
      meta.content = "initial-scale=1.0, user-scalable=no";
      document.head.appendChild(meta);
   }
}

function mobileDirections()
{
   var myLatlng = new google.maps.LatLng(40, -105);
   var myOptions = {
      zoom: 8,
      mapTypeId: google.maps.MapTypeId.ROADMAP
   };

   map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

   if(navigator.geolocation)
   {
      navigator.geolocation.getCurrentPosition(function(position) {
            //alert('Lat: "' + position.coords.latitude + '" Lng: "' + position.coords.longitude + '"');
            initialLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
            map.setCenter(initialLocation);
         }, function() {
            alert('Error finding current location.');
         });
   }
   else
   {
      alert('geolocation not supported');
   }
}

//******************************************************************************


function findIndexByName(name)
{
   var len = pts.length;
   for(var i=0; i<len; i++)
   {
      if(pts[i].name == name)
      {
         return i;
      }
   }

   return -1;
}

function findIndexByID(id)
{
   var len = pts.length;
   for(var i=0; i<len; i++)
   {
      if(pts[i].id == id)
      {
         return i;
      }
   }

   return -1;
}

//****************************************************
//                         Other Functions
//****************************************************
function changeTrailColor(tID)
{
   var len = trails.length;

   for(var i=0; i<len; i++)
   {
      if(trails[i].id == tID)
      {
         trails[i].isHilite = true;
         trails[i].overlay.setOptions({ strokeColor:"#ff00ff", strokeWeight: 4, strokeOpacity: 1 });
      }
      else
      {
         if(trails[i].isHilite)
         {
            trails[i].isHilite = false;
            trails[i].overlay.setOptions({ strokeColor:"#ff0000", strokeWeight: 4, strokeOpacity: 1 });
         }
      }
   }
}

function handleLoadPoints()
{
	if(xmlHttp.readyState == 4)
	{
		var xmlDoc = xmlHttp.responseXML;
 		var pDoc = xmlDoc.getElementsByTagName("point");
      var len = pDoc.length;
      var bounds = new google.maps.LatLngBounds();
      pts = new Array();
      for(var i = 0; i < len; i++)
      {
         pts[i] = new Point(pDoc[i]);
         if(!isPublic)
         {
            pts[i].addToMap();
            pts[i].addToSelect();
         }
         bounds.extend(pts[i].overlay.getPosition());
      }

      if(!bounds.isEmpty())
      {
         map.setZoom(map.fitBounds(bounds));
         var c = bounds.getCenter();
         map.setCenter(c);
      }
      loadTrails();
   }
}

function handleLoadTrails()
{
	if(xmlHttp.readyState == 4)
	{
		var xmlDoc = xmlHttp.responseXML;
 		var tDoc = xmlDoc.getElementsByTagName("trail");
      var len = tDoc.length;
      trails = new Array();
      for(var i = 0; i < len; i++)
      {
         trails[i] = new Trail(tDoc[i]);
      }

      showTrailList();
   }
}

function initPublic()
{
   var pt = new google.maps.LatLng(40.4360054452,-86.911708832);
   var opts = {
      zoom: 8,
      center: pt,
      mapTypeId: google.maps.MapTypeId.SATELLITE
   };

   map = new google.maps.Map(document.getElementById("mapDIV"), opts);

   isPublic = true;
   loadPoints();
}

function loadPoints()
{
   var args = 'q=lp&o=xml';

	asProcess('/winterpark/admin/dispatchT.php', args, 'Loading all points...', handleLoadPoints, "messageDIV");
}

function loadTrails()
{
   var args = 'q=lt&o=xml';

	asProcess('/winterpark/admin/dispatchT.php', args, 'Loading all trails...', handleLoadTrails, "messageDIV");
}

function showTrailList()
{
   var l = 0;
   var lText = '';
   var out = '<ol>';
   var len = trails.length;

   for(var i=0; i<len; i++)
   {
      if(trails[i].length < 322)
      {
         l = Math.round(trails[i].length * 3.2808399);
         lText = l + " feet";
      }
      else
      {
         l = Math.round(10 * trails[i].length / 1609.344) / 10;
         lText = l + " miles";
      }
      out += '<li onclick="changeTrailColor(\'' + trails[i].id + '\')">' + trails[i].name + ', ' + lText + '</li>';
   }

   out += "</ol>";
   document.getElementById("makeTripDIV").innerHTML = out;
}

