﻿var bingMarkers = new Array();
var map = null;
var topleft;
var bottomright;
var $BingDiv;
var circpoly;

function GetBingSearchMap() {
    
  var $BingDiv = $('#BingDiv');
  //if ($TowerGoogleMap.attr('rel')=='load'){
  $BingDiv.removeAttr('rel');
  $('.tower-details .hero img').hide();
  $('.tower-details .toolbar .thumbs img').removeClass('on');
  $BingDiv.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('BingDiv');
  // Set credentials for Bing
  map.AttachEvent("oncredentialserror", HandleCredentialsError);
  map.AttachEvent("oncredentialsvalid", HandleCredentialsValid);
  map.SetCredentials("AtCYHxjeaaV7DjDU73ZZCAHgw8r6Ca3mtG0NuHcSpGjYGCy3F6VpHsuALYW9g0pL");

// this seems to work but internet explorer always throws errors on the gmapdatappoints.markers property.
  map.LoadMap(getCenter(top.gmapdatapoints), getZoomLevel(top.gmapdatapoints), VEMapStyle.Road, false, VEMapMode.Mode2D, false);
  // map.LoadMap(getCenter(window.parent.top.gmapdatapoints), getZoomLevel(window.parent.top.gmapdatapoints), VEMapStyle.Road, false, VEMapMode.Mode2D, false);

 // var latlngcntr = getCenter(top.gmapdatapoints);
 var latlngcntr = new VELatLong(parseFloat(top.gmapdlat), parseFloat(top.gmapdlong));
  // alert(latlngcntr);

  // ADD markers to google map for lat long search.
  if (top.latlongbool == "True" || top.addressbool == "True") { // use another way of determining if it's a lat long search. this gets populated with a default value.
      // alert(latlngloc.toString()); from the center point create new bounds for the centerSquare that will be roughly 500' across
      var SquareBounds = latlngcntr.toString();
      var sB = SquareBounds.split(", ");
      var _sB = sB[0].replace("(", "");
      var _sB1 = sB[1].replace(")", "");

      var b1 = parseFloat(_sB) + .0015;
      var b2 = parseFloat(_sB) - .0015;
      var b3 = parseFloat(_sB1) + .002;
      var b4 = parseFloat(_sB1) - .002;
      
      var points = [
        new VELatLong(b1, b4),
        new VELatLong(b1, b3),
        new VELatLong(b2, b3),
        new VELatLong(b2, b4),
        new VELatLong(b1, b4)
        ];

      var outlineColor = new VEColor(119, 255, 0, 1);
      var fillColor = new VEColor(153, 204, 51, 0);
      var outlineWidth = 3;
      var id = 'Colorado';

      var poly = new VEPolygon(id, points, fillColor, outlineColor, outlineWidth)
      map.AddPolygon(poly);

        // this addPolyline uses getCircle to make a circle based on the radius of the lat long search
      AddPolyline();
  }

  function AddPolyline() {
      var ll = latlngcntr;
      var circleColor = new VEColor(119, 255, 0, 1);
      var shape = new VEShape(VEShapeType.Polyline, getCircle(ll, top.radius));
     // shape.SetTitle('My circle');
     // shape.SetDescription('This is shape number ' + pinid);
     // pinid++;
      shape.HideIcon();
      shape.SetLineColor(circleColor);
      map.AddShape(shape);
  }

  function getCircle(loc, radius) {
      var R = 6371; // earth's mean radius in km
      var lat = (loc.Latitude * Math.PI) / 180; //rad
      var lon = (loc.Longitude * Math.PI) / 180; //rad
      var d = (parseFloat(radius) / R)*1.60952;  // d = angular distance covered on earth's surface and convert to miles
      var locs = new Array();
      for (x = 0; x <= 360; x++) {
          var p2 = new VELatLong(0, 0)
          brng = x * Math.PI / 180; //rad
          p2.Latitude = Math.asin(Math.sin(lat) * Math.cos(d) + Math.cos(lat) * Math.sin(d) * Math.cos(brng));
          p2.Longitude = ((lon + Math.atan2(Math.sin(brng) * Math.sin(d) * Math.cos(lat), Math.cos(d) - Math.sin(lat) * Math.sin(p2.Latitude))) * 180) / Math.PI;
          p2.Latitude = (p2.Latitude * 180) / Math.PI;
          locs.push(p2);
      }
      return locs;
  }
  

  // Parsing Markers
  for (var i = top.gmapdatapoints.markers.length - 1; i >= 0; i--) {
      var marker = createBingMarker(top.gmapdatapoints.markers[i]);
      bingMarkers.push(marker);
      map.AddShape(marker);
  }
  setTimeout("parent.filterResults($BingDiv)", 1000); // from search.js
 // loadBingMarkers(top.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 = top.jsonMarkerList.markers.length - 1; i >= 0; i--) {
//    var marker = createBingMarker(top.jsonMarkerList.markers[i]);
//    bingMarkers.push(marker);
//    map.AddShape(marker);
//  }
//  filterResults($BingDiv); // 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='" + parent.rootpath + top.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='" + parent.rootpath + top.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=\"top.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=\"top.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;
}
/*
function AddCircle(latin, lonin, radius) {
    var locs = new Array();
    var lat1 = latin * Math.PI / 180.0;
    var lon1 = lonin * Math.PI / 180.0;
    var d = radius / 3956;
    var x;
    for (x = 0; x <= 360; x++) {
        var tc = (x / 90) * Math.PI / 2;
        var lat = Math.asin(Math.sin(lat1) * Math.cos(d) + Math.cos(lat1) * Math.sin(d) * Math.cos(tc));
        lat = 180.0 * lat / Math.PI;
        var lon;
        if (Math.cos(lat1) == 0) {
            lon = lonin; // endpoint a pole 
        }
        else {
            lon = ((lon1 - Math.asin(Math.sin(tc) * Math.sin(d) / Math.cos(lat1)) + Math.PI) % (2 * Math.PI)) - Math.PI;
        }
        lon = 180.0 * lon / Math.PI;
        var loc = new VELatLong(lat, lon);
        locs.push(loc);
    }
    var circpoly = new VEPolyline(999, locs, new VEColor(0, 255, 0, .5), 4);
    return circpoly;
}
*/


