google.load("earth", "1");

var ge = null;
var peakpath;
var peakpathLinestring;
var panStyleMap;
var panpeakStyleMap;
var panpeakPlacemark;
var startbearing;

function initge() {
  google.earth.createInstance("map3d", initCallback, failureCallback);
}

function initCallback(pluginInstance) {
  ge = pluginInstance;
  ge.getNavigationControl().setVisibility(ge.VISIBILITY_AUTO);
  peakpath = ge.createPlacemark('');
  peakpathLinestring = ge.createLineString('');
  panpeakPlacemark = ge.createPlacemark('');
  createStyleMaps();
  ge.getWindow().setVisibility(true);

  $.post("panlist.php",{ }, function(data){parsePanlist(data);}, "xml");

  initpan();
  selectpan(queryParameters['pan']);
}

function failureCallback(object){
  initpan();
  selectpan(queryParameters['pan']);
}

function createStyleMaps(){
  panStyleMap = ge.createStyleMap('');
  var panStyle = ge.createStyle('');
  var panIcon = ge.createIcon('');
  panIcon.setHref('http://www.bowvalleysoftware.com/pan/gifs/binocular.gif');
  panStyle.getIconStyle().setIcon(panIcon);
  panStyleMap.setNormalStyle(panStyle);
  panStyleMap.setHighlightStyle(panStyle);

  panpeakStyleMap = ge.createStyleMap('');
  var panpeakStyle = ge.createStyle('');
  var panpeakIcon = ge.createIcon('');
  panpeakIcon.setHref('http://www.bowvalleysoftware.com/pan/panpeakmarker4.gif');
  panpeakStyle.getIconStyle().setIcon(panpeakIcon);
  panpeakStyleMap.setNormalStyle(panpeakStyle);
  panpeakStyleMap.setHighlightStyle(panpeakStyle);
}

function setGELookAt(lat, long, altitude, tilt, range, heading){
  var lookAt = ge.getView().copyAsLookAt(ge.ALTITUDE_ABSOLUTE);
  lookAt.setLatitude(lat);
  lookAt.setLongitude(long);
  lookAt.setTilt(tilt);
  lookAt.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
  lookAt.setAltitude(altitude);
  lookAt.setRange(range);
  lookAt.setHeading(heading);
  ge.getView().setAbstractView(lookAt);
}

function setGECamera(lat, long, tilt, altitude, heading){
  var camera = ge.getView().copyAsCamera(ge.ALTITUDE_ABSOLUTE);
  camera.setLatitude(lat);
  camera.setLongitude(long);
  camera.setTilt(tilt);
  camera.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
  camera.setAltitude(altitude);
  camera.setHeading(heading);
  ge.getView().setAbstractView(camera);
}

function parsePanlist(xml){
  $('pan',xml).each(function(){
    var lat = parseFloat( $(this).find("lat").text() );
    var long = parseFloat( $(this).find("long").text() );
    var peakname = $(this).find("peakname").text();
    createPanPlacemark(lat, long, peakname);
  });
}

function createPanPlacemark(lat, long, peakname){
  var point = ge.createPoint('');
  point.setLatitude(lat);
  point.setLongitude(long);
  point.setAltitudeMode(ge.ALTITUDE_CLAMP_TO_GROUND);
  point.setAltitude(0.0);
  var placemark = ge.createPlacemark('');
  placemark.setName(peakname);
  placemark.setGeometry(point);
  placemark.setStyleSelector(panStyleMap);
  google.earth.addEventListener(placemark, "click", placemarkEventListener);
  ge.getFeatures().appendChild(placemark);
}

function createPanpeakPlacemark(lat, long, peakname){
  var point = ge.createPoint('');
  point.setLatitude(lat);
  point.setLongitude(long);
  point.setAltitudeMode(ge.ALTITUDE_CLAMP_TO_GROUND);
  point.setAltitude(0.0);
  panpeakPlacemark.setName(peakname);
  panpeakPlacemark.setGeometry(point);
  panpeakPlacemark.setStyleSelector(panpeakStyleMap);
  ge.getFeatures().appendChild(panpeakPlacemark);
}

function removePanpeakPlacemark(){
  ge.getFeatures().removeChild(panpeakPlacemark);
}

function placemarkEventListener(kmlEvent) {
  var latitude = kmlEvent.getLatitude();
  var longitude = kmlEvent.getLongitude();
  var name = kmlEvent.getTarget().getName();
  $.post("panno.php",{ peakname: name }, function(data){parsePanno(data);}, "xml");
}

function parsePanno(xml){
  var no = parseInt( $("panno", xml).text() );
//  startbearing = 270.0;
//  selectpan(no);
  window.location = "panproject3.html?pan=" + no + "&bearing=270";
}

function selectpanatbearing(i){
  startbearing = bearing + 180.0;
  if (startbearing > 360.0) startbearing -= 360.0;
  selectpan(i);
}

function selectpan(i){
  panid = i;
  $("#peaktag").css('visibility', 'hidden');
  $.post("panorama.php",{ panid: panid }, function(data){setpan(data);}, "xml");   
  $.post("panpeaks.php",{ panid: panid }, function(data){setpanpeaks(data);}, "xml");
//  location.hash = "pan=" + i + "&bearing=" + startbearing;
}

function setpan(xml){
  $("#viewportdiv").css({'cursor' : 'crosshair' });
  var height = parseInt( $("image_height", xml).text() );
  var width = parseInt( $("image_width", xml).text() );
  var north = parseInt( $("north_position", xml).text() );
  var horizon = parseInt( $("horizon", xml).text() );
  var pid = $("peakid", xml).text();
  var peakname = $("peakname", xml).text();
  var peakelev = $("peakelev", xml).text();
  var lat = parseFloat( $("lat", xml).text() );
  var long = parseFloat( $("long", xml).text() );
  var author = $("author", xml).text();
  var date = $("date", xml).text();
  setimageparms(pid, peakname, peakelev, height, width, north, horizon, lat, long, author, date);
  $("#panimage1").attr('src',"panimages/" + $("location", xml).text());
  $("#panimage2").attr('src',"panimages/" + $("location", xml).text());
  positionAtBearing(startbearing);
  setGECamera(lat, long, 85.0, 3000.0, parseFloat(startbearing));
}

function setpanpeaks(xml){
  var area, x1, y1, r, y2, peaktext, panid;
  var peaklistid = document.getElementById("peaklist");

  if(peaklistid.hasChildNodes()){
    while(peaklistid.childNodes.length >= 1 )
      peaklistid.removeChild(peaklistid.firstChild);
  }

  $('panpeak',xml).each(function(){
    area = document.createElement("area");
    area.shape = "circle";
    x1 = parseInt($(this).find("x").text()) * zoomfactor;
    y1 = parseInt($(this).find("y").text()) * zoomfactor;
    r = $(this).find("radius").text();
    panid = $(this).find("pan_id_at_panpeak").text();
    area.coords = x1 + ',' + y1 + ',' + r;
    peaktext = "'" + $(this).find("peakid").text() + "','" + $(this).find("peakname").text() + "'," + $(this).find("peakelev").text();
    var lat = parseFloat( $(this).find("lat").text() );
    var long = parseFloat( $(this).find("long").text() );
    var distance = "'" + $(this).find("distance").text() + "'";
    area.setAttribute('onmouseover', 'peakover(' + peaktext + ',' + x1 + ',' + y1  + ',' + lat + ',' + long + ',' + distance + ',' + panid + ')');
    area.setAttribute('onmouseout', 'peakoff()');
    if(parseInt(panid) > 0)
      area.setAttribute('onclick', 'selectpanatbearing(' + panid + ')');
    peaklistid.appendChild(area);
  });
}

function showpath(from_lat, from_long, to_lat, to_long, panelev, peakelev){
//console.log(panelev, peakelev);
//console.log(from_lat, from_long);
  peakpathLinestring.getCoordinates().clear();
  peakpathLinestring.setAltitudeMode(ge.ALTITUDE_ABSOLUTE);
  peakpathLinestring.getCoordinates().pushLatLngAlt(from_lat, from_long, panelev);
  peakpathLinestring.getCoordinates().pushLatLngAlt(to_lat, to_long, peakelev);

/*  var len = 0.01*Math.PI/180.0;
  var width = 0.002*Math.PI/180.0;
  var theta = Math.atan2(to_long - from_long, to_lat - from_lat);
  var lat = to_lat - len*Math.cos(theta)*180.0/Math.PI - width*Math.sin(theta)*180.0/Math.PI;
  var long = to_long - len*Math.sin(theta)*180.0/Math.PI + width*Math.cos(theta)*180.0/Math.PI;
  peakpathLinestring.getCoordinates().pushLatLngAlt(lat, long, peakelev);
  lat = to_lat - len*Math.cos(theta)*180.0/Math.PI + width*Math.sin(theta)*180.0/Math.PI;
  long = to_long - len*Math.sin(theta)*180.0/Math.PI - width*Math.cos(theta)*180.0/Math.PI;
  peakpathLinestring.getCoordinates().pushLatLngAlt(lat, long, peakelev);
  peakpathLinestring.getCoordinates().pushLatLngAlt(to_lat, to_long, peakelev);
*/
  peakpath.setGeometry(peakpathLinestring);
  peakpath.setStyleSelector(ge.createStyle('')); 
  var lineStyle = peakpath.getStyleSelector().getLineStyle();
  lineStyle.setWidth(lineStyle.getWidth() + 3);
  lineStyle.getColor().set('ff000000'); 
  ge.getFeatures().appendChild(peakpath);
}

function removepath(){
  ge.getFeatures().removeChild(peakpath);
}


