/* phpTrackme
 *
 * Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net)
 *
 * This is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Library General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
// google maps
var map;
var polies = new Array();
var markers = new Array();
var popups = new Array();
var polyOptions;
var mapOptions;
var loadedAPI = 'gmaps';
function init() {
  google.maps.visualRefresh = true;
  polyOptions = {
    strokeColor: '#FF0000',
    strokeOpacity: 1.0,
    strokeWeight: 2
  }      
  mapOptions = {
    center: new google.maps.LatLng(52.23, 21.01),
    zoom: 8,
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    scaleControl: true
  };  
  map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
}
      
function displayTrack(xml,update) {
  altitudes.length = 0;
  var totalMeters = 0;
  var totalSeconds = 0;
  // init polyline
  var poly = new google.maps.Polyline(polyOptions);
  poly.setMap(map);  
  var path = poly.getPath();  
  var latlngbounds = new google.maps.LatLngBounds( );  
  var positions = xml.getElementsByTagName('position');
  var posLen = positions.length;
  for (var i=0; i<posLen; i++) {
    var p = parsePosition(positions[i]);
    totalMeters += p.distance;
    totalSeconds += p.seconds;
    p['totalMeters'] = totalMeters;
    p['totalSeconds'] = totalSeconds;
    p['coordinates'] = new google.maps.LatLng(p.latitude,p.longitude);
    // set marker
    setMarker(p,i,posLen);
    // update polyline
    path.push(p.coordinates);    
    latlngbounds.extend(p.coordinates);
    // save altitudes for chart
    altitudes[i] = p.altitude;
  }  
  if (update) {
    map.fitBounds(latlngbounds);
    if (i==1) {
      // only one point, zoom out
      zListener = 
          google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) {
              if (this.getZoom()){
                  this.setZoom(15);
              }
      });
      setTimeout(function(){google.maps.event.removeListener(zListener)}, 2000);  
    }
  }
  latestTime = p.dateoccured;
  polies.push(poly);
  
  updateSummary(p.dateoccured,totalMeters,totalSeconds);
  if (p.tid!=trackid) {
    trackid=p.tid;
    setTrack(trackid);
  }
  if (document.getElementById('bottom').style.display=='block') {
    // update altitudes chart
    chart.clearChart();
    displayChart();
  }
}

function clearMap() {
  if (polies){
    for (var i=0; i<polies.length; i++){
      polies[i].setMap(null);
    }
  }
  if (markers){
    for (var i=0; i<markers.length; i++){
      google.maps.event.removeListener(popups[i].listener);
      popups[i].setMap(null);
      markers[i].setMap(null);
    }
  }
  markers.length = 0;
  polies.length = 0;
  popups.lentgth = 0;
}

var popup;
function setMarker(p,i,posLen) {
  // marker
  var marker = new google.maps.Marker( {
    map: map,
    position: p.coordinates,
    title: p.dateoccured
  });
  if (latest==1) { marker.setIcon('http://maps.google.com/mapfiles/dd-end.png') }
  else if (i==0) { marker.setIcon('http://maps.google.com/mapfiles/marker_greenA.png') }
  else if (i==posLen-1) { marker.setIcon('http://maps.google.com/mapfiles/markerB.png') }
  else { marker.setIcon('http://labs.google.com/ridefinder/images/mm_20_gray.png') }
  // popup
  var content = '<div id="popup">'+
    '<div id="pheader">'+lang_user+': '+p.username.toUpperCase()+'<br />'+lang_track+': '+p.trackname.toUpperCase()+
    '</div>'+
    '<div id="pbody">'+
    '<div id="pleft"><b>'+lang_time+':</b> '+p.dateoccured+'<br />'+
    ((p.speed != null)?'<b>'+lang_speed+':</b> '+(p.speed.toKmH()*factor_kmh)+' '+unit_kmh+'<br />':'')+
    ((p.altitude != null)?'<b>'+lang_altitude+':</b> '+(p.altitude*factor_m).toFixed()+' '+unit_m+'<br />':'')+'</div>'+
    ((latest==0)?
    ('<div id="pright"><b>'+lang_ttime+':</b> '+p.totalSeconds.toHMS()+'<br />'+
    '<b>'+lang_aspeed+':</b> '+((p.totalSeconds>0)?((p.totalMeters/p.totalSeconds).toKmH()*factor_kmh).toFixed():0)+' '+unit_kmh+'<br />'+
    '<b>'+lang_tdistance+':</b> '+(p.totalMeters.toKm()*factor_km).toFixed(2)+' '+unit_km+'<br />'+'</div>'):'')+
    '<div id="pfooter">'+lang_point+' '+(i+1)+' '+lang_of+' '+(posLen)+'</div>'+
    '</div></div>';    
  popup = new google.maps.InfoWindow();
  popup.listener = google.maps.event.addListener(marker, 'click', (function(marker,content) {
    return function() {
      popup.setContent(content);
      popup.open(map, marker);
      if (document.getElementById('bottom').style.display=='block') {
        chart.setSelection([{row:i,column:null}]);
      }
    }
  })(marker,content));    
  markers.push(marker);    
  popups.push(popup);  
}

function addChartEvent(chart) {
	google.visualization.events.addListener(chart, 'select', function() {
		if (popup) {popup.close(); clearTimeout(altTimeout);} 
		var selection = chart.getSelection()[0];
		if (selection) {
			var id = selection.row;
			var icon = markers[id].getIcon();
			markers[id].setIcon('http://maps.google.com/mapfiles/marker_orange.png');
			altTimeout = setTimeout(function() { markers[id].setIcon(icon); },2000);
		}
	}); 	
}
//((52.20105108685229, 20.789387865580238), (52.292069558807135, 21.172192736185707))
function getBounds() {
	var b =  map.getBounds().toString();
	var bounds = b.split(',',4);
	var lat_sw = bounds[0].replace(/\(/g,'');
	var lon_sw = bounds[1].replace(/[ )]/g,'');
	var lat_ne = bounds[2].replace(/[ (]/g,'');
	var lon_ne = bounds[3].replace(/[ )]/g,'');
	return [lon_sw,lat_sw,lon_ne,lat_ne];
}

function zoomToBounds(b) {
	var sw = new google.maps.LatLng(b[1],b[0]);
	var ne = new google.maps.LatLng(b[3],b[2]);
  var bounds = new google.maps.LatLngBounds(sw,ne);  	
	map.fitBounds(bounds);
}