﻿
var bingMarkers = new Array();
var map = null;
var topleft;
var bottomright;

function GetBingSearchMap() {
  var $GoogleMap = $('#GoogleMap');
  //		if ($TowerGoogleMap.attr('rel')=='load'){
  $GoogleMap.removeAttr('rel');
  $('.tower-details .hero img').hide();
  $('.tower-details .toolbar .thumbs img').removeClass('on');
  $GoogleMap.removeClass('hide');

 // var centerpoint = Math.floor(gmapdatapoints.markers.length / 2);
 // var latitude = gmapdatapoints.markers[centerpoint].latitude;
 // var longitude = gmapdatapoints.markers[centerpoint].longitude;

  map = new VEMap('GoogleMap');
  
  // Set credentials for Bing
  map.AttachEvent("oncredentialserror", HandleCredentialsError);
  map.AttachEvent("oncredentialsvalid", HandleCredentialsValid);
  map.SetCredentials("AtCYHxjeaaV7DjDU73ZZCAHgw8r6Ca3mtG0NuHcSpGjYGCy3F6VpHsuALYW9g0pL");

  map.LoadMap(getCenter(gmapdatapoints), getZoomLevel(gmapdatapoints), VEMapStyle.Road, false, VEMapMode.Mode2D, false);
  loadBingMarkers(gmapdatapoints)
  //map.ClearInfoBoxStyles();
}

// They seem to be working. just reember to turn off these alerts.
function HandleCredentialsError() {
 //   alert("The credentials are invalid.");
}
function HandleCredentialsValid() {
  //  alert("The credentials are valid.");
}

function loadBingMarkers(jsonMarkerList) {
  /* The for loop must be backwards to keep the overlay of the markers correct */
  for (var i = jsonMarkerList.markers.length - 1; i >= 0; i--) {
    var marker = createBingMarker(jsonMarkerList.markers[i]);
    bingMarkers.push(marker);
    map.AddShape(marker);
  }
  filterResults($GoogleMap); // from search.js
}

/*
This makes a Bing Pushpin, and is modeled after createMarker() from search.js
*/
function createBingMarker(jsonMarker) {
  var bingIconComp = "<div style=' position:relative; ' title='" + jsonMarker.towerid + "' >"
                   + "  <img src='" + rootpath + compImage + "' style=' position:absolute; top:0; left:0; height:12px; width:12px; ' />"
                  // + "  <img src='" + rootpath + "images/search/gmap-comp-icon-shadow.png' style=' position:absolute; top:0; left:0; ' />"
                   + "</div>";

  var bingIconTco = "<div style=' position:relative; ' title='" + jsonMarker.towerid + "' >"
                  + "  <img src='" + rootpath + towerImage + "' style=' position:absolute; top:0; left:0; ' />"
                  //+ "  <img src='" + rootpath + "images/search/gmap-towerco-icon-shadow.png' style=' position:absolute; top:0; left:0; ' />"
                  + "</div>";
  
  var icon;
  if (jsonMarker.company.toLowerCase() == 'towerco') {
    icon = bingIconTco;
  }
  else {
    icon = bingIconComp;
  }

  var towerlat = jsonMarker.latitude;
  var towerlong = jsonMarker.longitude;
  
  //create a pushpin
  var marker = new VEShape(VEShapeType.Pushpin, new VELatLong(towerlat, towerlong));
  marker.SetCustomIcon(icon);
  //marker.SetTitle(jsonMarker.towerid);
  marker.SetTitle(jsonMarker.company);
  
  /***********************
   * Taken from search.js
   ***********************/
  var html = /*jsonMarker.company + */'<br /> ID/Reg#: <a onclick=\"towerDetailsModal(\'tower.aspx?id=' + jsonMarker.towerid +
				'&owner=' + jsonMarker.company.replace(' ', '+') + '&returnUrl=./?q=cary\')\" class="towerco-moreinfo">' + jsonMarker.towerid + '</a><br /> Structure Type: ' + jsonMarker.structuretype +
				'<br /> Height: ' + jsonMarker.height + ' ft.<br />';

//  html += 'Lat: ' + jsonMarker.latitude + '<br />';
//  html += 'Long: ' + jsonMarker.longitude + '<br />';

  if ($('#arc-distance').length == 1) {
    html += ' Distance: ' + jsonMarker.distance + ' miles <br />';
  }

  html += '<a onclick=\"towerDetailsModal(\'tower.aspx?id=' + jsonMarker.towerid +
			'&owner=' + escape(jsonMarker.company) + '&returnUrl=./?q=cary\')\" class="towerco-moreinfo">more information</a>';
  /***********************/

  marker.SetDescription(html);
  marker.towerid = jsonMarker.towerid; // this is is used in the search.js for filtering search results
  
  return marker;
}

function getCenter(jsonMarkerList) {
  var maxlat = jsonMarkerList.markers[0].latitude;
  var minlat = jsonMarkerList.markers[0].latitude;
  var maxlong = jsonMarkerList.markers[0].longitude;
  var minlong = jsonMarkerList.markers[0].longitude;

  for (var i = 0; i < jsonMarkerList.markers.length; i++) {
    var latitude = jsonMarkerList.markers[i].latitude;
    var longitude = jsonMarkerList.markers[i].longitude;

    if (latitude > maxlat) {
      maxlat = latitude;
    }
    if (latitude < minlat) {
      minlat = latitude;
    }
    if (longitude > maxlong) {
      maxlong = longitude;
    }
    if (longitude < minlong) {
      minlong = longitude;
    }
 }

  var longspan = maxlong - minlong;
  var latspan = maxlat - minlat;
  var centerlong = minlong + (longspan / 2);
  var centerlat = minlat + (latspan / 2);

  var topleft = new VELatLong(maxlat, minlong);
  var bottomright = new VELatLong(minlat, maxlong);

 // alert(topleft + " " + bottomright);
  
  var html = 'Center Lat: ' + centerlat + '<br />'
           + 'Center Long: ' + centerlong + '<br />'
           + 'Max Lat: ' + maxlat + '<br />'
           + 'Min Lat: ' + minlat + '<br />'
           + 'Max Long: ' + maxlong + '<br />'
           + 'Min Long: ' + minlong + '<br />';

  //document.getElementById('TestDiv').innerHTML = html;
  //alert('Center Lat: ' + centerlat + '; Center Long: ' + centerlong);
  
  return new VELatLong(centerlat, centerlong);
}

/* find the correct zoom  */

function getZoomLevel(jsonMarkerList) {
    var maxlat = jsonMarkerList.markers[0].latitude;
    var minlat = jsonMarkerList.markers[0].latitude;
    var maxlong = jsonMarkerList.markers[0].longitude;
    var minlong = jsonMarkerList.markers[0].longitude;

    for (var i = 0; i < jsonMarkerList.markers.length; i++) {
        var latitude = jsonMarkerList.markers[i].latitude;
        var longitude = jsonMarkerList.markers[i].longitude;

        if (latitude > maxlat) {
            maxlat = latitude;
        }
        if (latitude < minlat) {
            minlat = latitude;
        }
        if (longitude > maxlong) {
            maxlong = longitude;
        }
        if (longitude < minlong) {
            minlong = longitude;
        }
    }

    var longspan = maxlong - minlong;
    var latspan = maxlat - minlat;
    
//    var centerlong = minlong + (longspan / 2);
//    var centerlat = minlat + (latspan / 2);
//    var topleft = new VELatLong(maxlat, minlong);
    //    var bottomright = new VELatLong(minlat, maxlong);

    var maxlongR = maxlong * 0.01745327;
    var minlongR = minlong * 0.01745327;
    var maxlatR = maxlat * 0.01745327;
    var minlatR = minlat * 0.01745327;

    var zoom = 16;

    //this series of variables converts the latitude and longitude to a usable distance in km.
    var R = 6371; // km
//    var dLat = (maxlat - minlat)* 0.01745327;
//    var dLon = (maxlong - minlong) * 0.01745327;
//    var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
//        Math.cos(minlat * 0.01745327) * Math.cos(maxlat * 0.01745327) *
//        Math.sin(dLon / 2) * Math.sin(dLon / 2);
//    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
//    var distance = (R * c) * 3;

    var distance = (Math.acos(Math.sin(minlatR) * Math.sin(maxlatR) +
                  Math.cos(minlatR) * Math.cos(maxlatR) *
                  Math.cos(maxlongR - minlongR)) * R) * 1000;
                  
    var maphyp = Math.sqrt((800*800) + (500*500))

    //  distance = Math.sqrt(((longspan * longspan) + (latspan * latspan)))*230
    // This sets the zoom to its appropriate number based on microsofts calculated km for each level.
    if (distance > (.3*maphyp)) zoom = 17;
    if (distance > (.6 * maphyp)) zoom = 16;
    if (distance > (1.19 * maphyp)) zoom = 15;
    if (distance > (2.39 * maphyp)) zoom = 14;
    if (distance > (4.78 * maphyp)) zoom = 13;
    if (distance > (9.55 * maphyp)) zoom = 12;
    if (distance > (19.11 * maphyp)) zoom = 11;
    if (distance > (38.22 * maphyp)) zoom = 10;
    if (distance > (76.44 * maphyp)) zoom = 9;
    if (distance > (152.87 * maphyp)) zoom = 8;
    if (distance > (305.75 * maphyp)) zoom = 7;
    if (distance > (611.50 * maphyp)) zoom = 6;
    if (distance > (1222.99 * maphyp)) zoom = 5;
    if (distance > (2445.98 * maphyp)) zoom = 4;
    if (distance > (4891.97 * maphyp)) zoom = 3;
    if (distance > (9783.94 * maphyp)) zoom = 2;
    if (distance > (19567.88 * maphyp)) zoom = 1;
    if (distance > (39135.76 * maphyp)) zoom = 1;
    
    return zoom;
}
