﻿/*
################################
Developed by:
fountains spatial, inc.
137 Jay Street
Schenectady, New York 12305

Developed for:
AWS Truewind, LLC
463 New Karner Road
Albany, New York 12205

Project:
smallWind

Statements:
Copyright fountains Spatial, Inc. - All rights reserved.
################################
*/

/*
################################
Page:
mainmap.js

Narrative:
Functions related to building and working with the Googel map and overlays, etc...

Notes:
-
################################
*/

var bWasLastClickInNYS = false;
var map = null;
var labelWindSpeed = null;
var tilelayer = new GTileLayer();
var xhReq = createXMLHttpRequest();
var xhReq = createXMLHttpRequest();
var polyAOI = null;
var geocoder = null;
var intSpeedZoomLimit = 10;
var strOrderType = "GIS";
var ptUtmX;
var ptUtmY;
var ptSpeedPoint = null;
var left;
var right;
var topp;
var bottom;
var gleft;
var gright;
var gtopp;
var gbottom;
var ptLeft;
var ptRight;
var ptTopp;
var ptBottom;
var AOIZone = -99;
var blnAOIHidden = true;
var fadeSteps;
var fadeDelay = 20;
var nextSetDelay = 1000;
var fadeStep = 1;
var fadeElem = null;
var blnAlertUserClick = false;
var blnAlertNews = true;
var iconWindSpeedPin = new GIcon();
iconWindSpeedPin.image = "IMAGES/WN_SPEEDPIN.gif";
iconWindSpeedPin.iconSize = new GSize(20, 20);
iconWindSpeedPin.iconAnchor = new GPoint(0,20);
var markerOptions = {icon:iconWindSpeedPin };
var mrkrSpeedMarker = null;
var blnProceedWithReports = false;
var blnStateProceed = false;

//^^^^^^^^^^^^^^^^^^^^^^
var blnCanIdentify = true
var blnCanDownload = true
//^^^^^^^^^^^^^^^^^^^^^^

var iconAOIMessage = new GIcon();
iconAOIMessage.image = "IMAGES/WN_CLICK_TO_MODIFY.gif";
iconAOIMessage.iconSize = new GSize(25, 25);
iconAOIMessage.iconAnchor = new GPoint(-2,-2);
var markerAOIOptions = {icon:iconAOIMessage,title:"Click to modify your area of interest." };
var mrkrAOIMarker = null;

// Call this function when the page has been loaded to initialize the map
//#################################
function initSmallWind() 
{
if (GBrowserIsCompatible()) 
  {
  map = new GMap2(document.getElementById("map"));
  
  map.setCenter(new GLatLng(42.90816007196054, -76.1463803), 7);
  
  map.clearOverlays();
  map.addControl(new GLargeMapControl());
  map.addControl(new GMapTypeControl());
  map.addControl(new GScaleControl());
  map.addControl(new GOverviewMapControl());
  
  G_PHYSICAL_MAP.getMinimumResolution = function () { return 1 };
  G_NORMAL_MAP.getMinimumResolution = function () { return 1 };
  G_SATELLITE_MAP.getMinimumResolution = function () { return 1 };
  G_HYBRID_MAP.getMinimumResolution = function () { return 1 };

  GEvent.addListener(map,"mousemove", function(pt) {setMouseCoords(pt);});
  GEvent.addListener(map,"mouseover", function() {if (blnAlertUserClick) alertUserClick();});
  GEvent.addListener(map,"click", function(overlay,point) 
  {
    if (point)
    {
      clickRoutine(map,point);
    }
  });
  
  var myCopyright = new GCopyrightCollection("2.5km Wind Data: ");
  myCopyright.addCopyright(new GCopyright(23,new GLatLngBounds(new GLatLng(-90,-180),new GLatLng(90,180)),0,'Truewind LLC.'));

  // 2.5km overlays
  //#################################  
  var tilelayer = new GTileLayer(myCopyright);
  tilelayer.getTileUrl = function(tile, zoom){return "http://nyswe.awstruewind.com/tiles/36/ny_mean_z_"+zoom+"_y_"+tile.y+"_x_"+tile.x+"_.png";};

  mapLayer = new GTileLayerOverlay(tilelayer)
  tilelayer.getOpacity = function() {return 0.3;}
  map.addOverlay(mapLayer);  
  
  var styleOpts = {};
  styleOpts.opacity = 0.2;
  styleOpts.border = "2px solid blue";
  styleOpts.fillColor = "#00";
  
  var boxStyleOpts = {};
  boxStyleOpts.opacity = ".2";
  boxStyleOpts.border= "2px solid red";

  var otherOpts = {};
  otherOpts.buttonHTML = "<img src='IMAGES/WN_ZOOM_IN.png' />";
  otherOpts.buttonZoomingHTML = "<img src='IMAGES/WN_ZOOM_IN_ON.png' />";
  otherOpts.buttonStartingStyle = "{width:'20px',height:'20px'}";
  otherOpts.restrictedRectangleMap = 0;
  otherOpts.stickyZoomEnabled = false;
  otherOpts.backButtonEnabled = true;
  otherOpts.backButtonHTML = "<img src='IMAGES/WN_ZOOM_IN_BACK.png' />";

  var callbacks = {};

  map.addControl(new DragZoomControl(boxStyleOpts, otherOpts, callbacks),new GControlPosition(G_ANCHOR_TOP_LEFT,new GSize(23,280)));	
  
  map.getDragObject().setDraggableCursor("crosshair")
  
  map.enableScrollWheelZoom()
  map.enableContinuousZoom()
  map.addMapType(G_PHYSICAL_MAP)
  map.setMapType(G_PHYSICAL_MAP)
  //map.addControl(new ToggleZoomControl());
  //setDiv();
  }
} 

var blnGetRoseRecords = "false";

// Check if in extent
//#################################       
function clickRoutine(mMap,pPoint)
{
  blnProceedWithReports = false;
  ptSpeedPoint = pPoint;

  if (mrkrSpeedMarker != null)
  {
  	mMap.removeOverlay(mrkrSpeedMarker);
  }
  mrkrSpeedMarker = new GMarker(pPoint, markerOptions);
  mMap.addOverlay(mrkrSpeedMarker);

  var numX = pPoint.x.toFixed(5);
  var numY = pPoint.y.toFixed(5);

  document.getElementById("xCoordVal").innerHTML = numX;
  document.getElementById("yCoordVal").innerHTML = numY;

  document.getElementById("meanSpeedVal").innerHTML = "Loading...";

  var xhReqTrack = createXMLHttpRequest();
  xhReqTrack.open("GET", "boundaryQuery.aspx?xCoord=" + pPoint.x + "&yCoord=" + pPoint.y, true);
  //window.open("boundaryQuery.aspx?xCoord=" + pPoint.x + "&yCoord=" + pPoint.y, true);
  xhReqTrack.onreadystatechange = function() {
      if (xhReqTrack.readyState == 4) {
          var strTrackresult = xhReqTrack.responseText;
          if (strTrackresult == 0) {
              jQuery.facebox("<p>Please select a location within<br> New York State.</p>");
              document.getElementById("meanSpeedVal").innerHTML = " Outside valid extent";
              blnGetRoseRecords = "false";
              bWasLastClickInNYS = false;
          }
          else {
              bWasLastClickInNYS = true;
              getRoseRecords(mMap, pPoint)
          }
      }
  }
  xhReqTrack.send(null);
}


function getRoseRecords(mMap,pPoint)
{
  var xhReqTrack = createXMLHttpRequest();
  xhReqTrack.open("GET", "roseQuery.aspx?xCoord=" + pPoint.x + "&yCoord=" + pPoint.y, true);
  //window.open("roseQuery.aspx?xCoord=" + pPoint.x + "&yCoord=" + pPoint.y, true);
  xhReqTrack.onreadystatechange = function() {
      if (xhReqTrack.readyState == 4) {
          var strTrackresult = trim(xhReqTrack.responseText);
          if (strTrackresult == "-999") {
              document.getElementById("meanSpeedVal").innerHTML = " No data at location.";
          }
          else {
              var arySpeeds = xhReqTrack.responseText.split(",");
              var selHubHeights = document.getElementById("HubHeights");
              var txtSpeedValue = "Speed not found.";
              var txtSpeedHold;
              var mySpeed;

              if (selHubHeights.options[selHubHeights.selectedIndex].value == "80") {
                  mySpeed = arySpeeds[0];
                 
              }
              else if (selHubHeights.options[selHubHeights.selectedIndex].value == "100") {
                  mySpeed = arySpeeds[1]; 
                  
              }
              else if (selHubHeights.options[selHubHeights.selectedIndex].value == "120") {
                  mySpeed = arySpeeds[2];
                  

              }

              txtSpeedHold = mySpeed * 2.23693629;
              txtSpeedValue = Math.round(txtSpeedHold * 100) / 100;
              var speedms = mySpeed;
              var speedms = Math.round((speedms * 100)) / 100;
              
              
              document.getElementById("hiddenMS").innerHTML = speedms;
              document.getElementById("meanSpeedVal").innerHTML = " " + txtSpeedValue + " mph" + " (" + speedms + " m/s)";
              blnProceedWithReports = true;
          }
      }
  }
  xhReqTrack.send(null);
}

// Goecode over at Google
//#################################   
function showAddress(mMap, address) 
{
  blnProceedWithReports = false;
  var tPoint = new GLatLng.fromUrlValue(address);
  if (isNaN(tPoint.lat()) || isNaN(tPoint.lng()))
  {
    var geocoder = new GClientGeocoder();
    geocoder.getLatLng(address,function(point) 
    {
      if (!point) 
      {
        jQuery.facebox("<p><p>Given address (" + address + ") was not found.<br><br>Please check the values and try again.</p>");
      } 
      else 
      {
                  mMap.setCenter(point, 14);
                  clickRoutine(mMap,point);
//        mMap.setCenter(point, intSpeedZoomLimit);
//        getSpeed(mMap,point)

      }
    }
    );
  }
  else
  {
          mMap.setCenter(tPoint, intSpeedZoomLimit);
          clickRoutine(mMap,tPoint);

//      mMap.setCenter(tPoint, intSpeedZoomLimit);
//      getSpeed(mMap, tPoint)


  }

}



// Swap hub height overlays
//#################################      
function updateTileLayer(mMap, txtHubHeight)
{
  if(mapLayer){map.removeOverlay(mapLayer);}
  
  txtDir = "36";
  txtNameBase = "ny_mean";
  
  if (txtHubHeight == "80")
  {
    txtDir = "24";
    txtNameBase = "ny_mean";
    //txtDir = "24p4m";
    //txtNameBase = "ny_24-4m_bkgnd.asc";
  }
  else if (txtHubHeight == "100")
  {
    txtDir = "30";
    txtNameBase = "ny_mean";
    //txtDir = "30p5m";
    //txtNameBase = "ny_30-5m_bkgnd.asc";
  }
  else if (txtHubHeight == "120")
  {
    txtDir = "36";
    txtNameBase = "ny_mean";
    //txtDir = "36p6m";
    //txtNameBase = "ny_36-6m_bkgnd.asc";
  }
  tilelayer.getTileUrl = function(tile, zoom){return "http://nyswe.awstruewind.com/tiles/"+txtDir+"/"+txtNameBase+"_z_"+zoom+"_y_"+tile.y+"_x_"+tile.x+"_.png";};
  mapLayer = new GTileLayerOverlay(tilelayer)
  tilelayer.getOpacity = function() {return 0.3;}
  map.addOverlay(mapLayer);
  if (ptSpeedPoint != null)
  {
    getRoseRecords(mMap,ptSpeedPoint)
  }
}


// Build up request for content
//#################################           
function createXMLHttpRequest() 
{
 try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
 try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
 try { return new XMLHttpRequest(); } catch(e) {}
 alert("XMLHttpRequest not supported");
 return null;
}

// Get element based on ID
//#################################     
function el(id) 
{
  return document.getElementById(id);
}


// Set cookie
//################################# 
function setAOICookie(c_name,value,expiredays)
{
  var exdate=new Date();
  exdate.setDate(exdate.getDate()+expiredays);
  document.cookie=c_name+ "=" +escape(value)+
  ((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
}

// Get cookie
//################################# 
function getAOICookie(c_name)
{
  if (document.cookie.length>0)
  {
    c_start=document.cookie.indexOf(c_name + "=");
    if (c_start!=-1)
    { 
      c_start=c_start + c_name.length+1; 
      c_end=document.cookie.indexOf(";",c_start);
      if (c_end==-1) 
      {
        c_end=document.cookie.length;
      }
      return unescape(document.cookie.substring(c_start,c_end));
    } 
  }
  return "";
}

// Populates to the status bar the mouse cords
//################################# 
function setMouseCoords(mousePoint)
{
  var myStatus = "";
  myStatus += "Cursor Coordinates: ";
  myStatus += "Longitude: ";
  myStatus += mousePoint.lng().toFixed(5);
  myStatus += " ";
  myStatus += "Latitude: ";
  myStatus += mousePoint.lat().toFixed(5);
  window.status = myStatus;
}

// formatting for best loook and feel
//################################# 
function addCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) 
  {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

// function for detemrining if user wants/needs the alertControl
//################################# 
function alertNews()
{
  
  if (AWS_Navigator_ShowNews != null && AWS_Navigator_ShowNews != "")
  {
    blnAlertNews = false;
  }
  else
  {
    jQuery.facebox("<p><div align='center'><img src='IMAGES/logo_windnavigator_small.jpg' alt='' width='200' height='37' border='0'></div>&nbsp;<p><p><p>Notice about new data here...</p>");
    setAOICookie("AWS_Navigator_ShowNews",false,1);
    blnAlertNews = false;
  }
}

function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}