
//sample base layer
var ndfd_min_temp = {
	params:	[
		"REQUEST=GetMap",
		"SERVICE=WMS",
		"VERSION=1.1.1",
		"BGCOLOR=0xFFFFFF",
		"TRANSPARENT=TRUE",
		"SRS=EPSG:3857", // 3395? 
		"WIDTH=256",
		"HEIGHT=256",
		"FORMAT=image/png",
		"LAYERS=NDFD_Minimum_Temperature/Minimum_temperature",
		"STYLES=boxfill/rainbow",
		"TIME=2011-04-08T12:00:00Z"	
	],
	base_url:"http://proxy.axiomalaska.com/ncWMS/wms?"
};	

//ak outline to put on top of overlay
function aoosMapsGetAKOutline(){
	var ak_outline = {
		getTileUrl:function($tile,$zoom){
			if($tile.x >= 0 && $tile.y >= 0){
				var url = 'http://proxy.axiomalaska.com/geoserver/gwc/service/gmaps?x=' + $tile.x + '&y=' + $tile.y + '&zoom=' + $zoom + '&layers=axiom:AKCoastPolygonOutlineOnly&format=image/png&transparent=true&srs=900913';
				return url;
			}
			return false;
		}
	};
	
	return ak_outline;
}



// Create a spherical mercator projection, adding in FromDivPixelToSphericalMercator method.  
// Original code from Google Maps API v 3 List/user: KakaduDreamer and
// http://code.google.com/apis/maps/documentation/v3/examples/map-coordinates.html

var MERCATOR_RANGE = 256;

function bound(value, opt_min, opt_max) {
  if (opt_min !== null){value = Math.max(value, opt_min);}
  if (opt_max !== null){value = Math.min(value, opt_max);}
  return value;
}
 
function degreesToRadians(deg) {
  return deg * (Math.PI / 180);
}
 
function radiansToDegrees(rad) {
  return rad / (Math.PI / 180);
}
 
function MercatorProjection() {
  this.pixelOrigin_ = new google.maps.Point(
      MERCATOR_RANGE / 2, MERCATOR_RANGE / 2);
  this.pixelsPerLonDegree_ = MERCATOR_RANGE / 360;
  this.pixelsPerLonRadian_ = MERCATOR_RANGE / (2 * Math.PI);
}
 
MercatorProjection.prototype.fromLatLngToPoint = function(latLng, opt_point) {
  var me = this;
 
  var point = opt_point || new google.maps.Point(0, 0);
 
  var origin = me.pixelOrigin_;
  point.x = origin.x + latLng.lng() * me.pixelsPerLonDegree_;
  // NOTE(appleton): Truncating to 0.9999 effectively limits latitude to
  // 89.189.  This is about a third of a tile past the edge of the world tile.
  var siny = bound(Math.sin(degreesToRadians(latLng.lat())), -0.9999, 0.9999);
  point.y = origin.y + 0.5 * Math.log((1 + siny) / (1 - siny)) * -me.pixelsPerLonRadian_;
  return point;
};
 
MercatorProjection.prototype.fromDivPixelToLatLng = function(pixel, zoom) {
  var me = this;
  
  var origin = me.pixelOrigin_;
  var scale = Math.pow(2, zoom);
  var lng = (pixel.x / scale - origin.x) / me.pixelsPerLonDegree_;
  var latRadians = (pixel.y / scale - origin.y) / -me.pixelsPerLonRadian_;
  var lat = radiansToDegrees(2 * Math.atan(Math.exp(latRadians)) - Math.PI / 2);
  return new google.maps.LatLng(lat, lng);
};

MercatorProjection.prototype.fromDivPixelToSphericalMercator = function(pixel, zoom) {
  var me = this;
  var coord = me.fromDivPixelToLatLng(pixel, zoom);
  
  var r= 6378137.0;
  var x = r* degreesToRadians(coord.lng());
  var latRad = degreesToRadians(coord.lat());
  var y = (r/2) * Math.log((1+Math.sin(latRad))/ (1-Math.sin(latRad)));
 
  return new google.maps.Point(x,y);
};


function loadWMS(_layer) {
	var tileHeight = 256;
	var tileWidth = 256;
	var opacityLevel = 1;
	var isPng = true;
	var minZoomLevel = 2;
	var maxZoomLevel = 28;
	
	var overlayOptions;
	
	if(_layer.getTileUrl){
		overlayOptions = _layer;
	}else{

		overlayOptions = 
		{
		  getTileUrl: function(coord, zoom) 
		  {
			var lULP = new google.maps.Point(coord.x*256,(coord.y+1)*256);
			var lLRP = new google.maps.Point((coord.x+1)*256,coord.y*256);
	
			var projectionMap = new MercatorProjection();
			
			var lULg = projectionMap.fromDivPixelToSphericalMercator(lULP, zoom);
			var lLRg  = projectionMap.fromDivPixelToSphericalMercator(lLRP, zoom);
				
			var lUL_Latitude = lULg.y;
			var lUL_Longitude = lULg.x;
			var lLR_Latitude = lLRg.y;
			var lLR_Longitude = lLRg.x;		
	
			var urlResult = _layer.base_url + _layer.params.join("&") + "&bbox=" + lUL_Longitude + "," + lUL_Latitude + "," + lLR_Longitude + "," + lLR_Latitude;
	
			return urlResult;
		  }
		};
	}
	
	overlayOptions.tileSize = new google.maps.Size(tileHeight, tileWidth);
	overlayOptions.minZoom =  minZoomLevel;
	overlayOptions.maxZoom =  maxZoomLevel;
	overlayOptions.opacity = opacityLevel;
	overlayOptions.isPng = isPng;
	
	
	
	
	
	
	overlayWMS = new google.maps.ImageMapType(overlayOptions);
	map.overlayMapTypes.insertAt(0, overlayWMS);

}


function loadDynamicWMSLayer(_layer_uuid,_sensor_lat_lng,_chart_id,_legend_dom_id){
	//first get layer info
	//alert(_layer_uuid);
	$aoos_map_jq.getJSON(
		"http://svc.axiomalaska.com/oikos-test/rest/layer?callback=?",
		{
			uuid:_layer_uuid	
		},
		function(layer_result){
			var layer_type = layer_result[0];
			var layer_data = layer_result[1];
			//alert(layer_data);
			if(_sensor_lat_lng && _chart_id){
				var pll = _sensor_lat_lng.split(',');
				//OLD_ID IS TO 
				loadVirtualSensor(layer_data.label,_chart_id,layer_data.id,pll[0],pll[1]);
			}
		
		
			$aoos_map_jq.getJSON(
					"http://svc.axiomalaska.com/oikos-test/rest/rasterstrata?callback=?",
					{
						uuid:_layer_uuid
					},
					function(strata_data){
						var done = false;
						var d = new Date();
						var now = d.getTime();
						var nearest = strata_data.times[strata_data.times.length - 1];
						//alert(now + "\n" + nearest);
						//alert(formatDateTimeForWMS(new Date(nearest)));
						var i = strata_data.times.length;
						while(i >= 0){
							//document.write(now + "<br />" + time_data.times[i] + "<hr />");
							if(strata_data.times[i] > now){
								nearest = strata_data.times[i];
							}
							i --;
						}
						
						//alert(now + "\n" + nearest);
						var active_date = new Date(nearest);
						var n = formatDateTimeForWMS(active_date);
						//alert(n);
						
						var wms_layer = {
							params:[
								"REQUEST=GetMap",
								"SERVICE=WMS",
								"VERSION=1.1.1",
								"BGCOLOR=0xFFFFFF",
								"TRANSPARENT=TRUE",
								"SRS=EPSG:" + layer_data.preferredEpsg, // 3395? 
								"WIDTH=256",
								"HEIGHT=256",
								"FORMAT=image/png",
								"LAYERS=" + layer_data.ogcName,
								"STYLES=" + layer_data.defaultStyle,
								"TIME=" + n	
							],
							base_url:layer_data.wmsUrl + '?'
						}
						
						
						
						loadWMS(wms_layer);
						loadWMSLegend(
									  layer_data.wmsUrl + '?',
									  layer_data.ogcName,
									  active_date,
									  layer_data.label,// + ' (' +  layer_data.DATA.UNIT[0] + ')',
									  _legend_dom_id);
						
						
	
					}
				);
				
	
				
				function formatDateTimeForWMS( datetime ){
					
					
					if(typeof String.prototype.pad !== 'function'){
						String.prototype.pad = function(l, s, t){
							return s || (s = " "), (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length)
								+ 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2))
								+ this + s.substr(0, l - t) : this;
						};
					}
					
					
					
					var dateString = [
						 datetime.getUTCFullYear()
						,(datetime.getUTCMonth() + 1).toString().pad(2,'0')
						,datetime.getUTCDate().toString().pad(2,'0')
					].join('-');
			
					var timeString = [
						 datetime.getUTCHours().toString().pad(2,'0')
						,datetime.getUTCMinutes().toString().pad(2,'0')
						,datetime.getUTCSeconds().toString().pad(2,'0')
					].join(':') + '.' + datetime.getMilliseconds();
					
					return dateString + 'T' + timeString;		
				};
		}
	);	
}
	
	
/*	
function loadDynamicWMSLayer(_layer_group_id,_layer_name,_sensor_lat_lng,_chart_id,_legend_id){
	$aoos_map_jq.getJSON(
		"http://cfsvc.axiomalaska.com/dev/CoverageLayerService/SNAPPositionCalculations.cfc?jsoncallback=?",
		{
			method:'getLayerByGroupAndNameJSON',
			layergroupid:_layer_group_id,
			layername:_layer_name
		},
		function(layer_data){
			
			if(_sensor_lat_lng && _chart_id){
				
				var pll = _sensor_lat_lng.split(',');
				//OLD_ID IS TO 
				loadVirtualSensor(layer_data.DATA.LABEL[0],_chart_id,layer_data.DATA.ID[0],pll[0],pll[1])
			}
			
			$aoos_map_jq.getJSON(
				"http://cfsvc.axiomalaska.com/dev/CoverageLayerService/SNAPPositionCalculations.cfc?jsoncallback=?",
				{
					method:"getLayerPeriodsAndElevationsJSON",
					//layerID:layer_data.DATA.LAYERID[0]
					layerID:layer_data.DATA.ID[0]
				},
				function(time_data){
					var done = false;
					var d = new Date();
					var now = d.getTime();
					var nearest = time_data.PERIODS[time_data.PERIODS.length - 1] * 1000;
					//alert(now + "\n" + nearest);
					//alert(formatDateTimeForWMS(new Date(nearest)));
					var i = time_data.PERIODS.length;
					while(i >= 0){
						//document.write(now + "<br />" + time_data.PERIODS[i]*1000 + "<hr />");
						if(time_data.PERIODS[i]*1000 > now){
							nearest = time_data.PERIODS[i] * 1000;
						}
						i --;
					}
					
					//alert(now + "\n" + nearest);
					var active_date = new Date(nearest);
					var n = formatDateTimeForWMS(active_date);
					//alert(n);
					
					var wms_layer = {
						params:[
							"REQUEST=GetMap",
							"SERVICE=WMS",
							"VERSION=1.1.1",
							"BGCOLOR=0xFFFFFF",
							"TRANSPARENT=TRUE",
							"SRS=EPSG:" + layer_data.DATA.EPSG[0], // 3395? 
							"WIDTH=256",
							"HEIGHT=256",
							"FORMAT=image/png",
							"LAYERS=" + layer_data.DATA.OGC_NAME[0],
							"STYLES=" + layer_data.DATA.DEFAULT_STYLE[0],
							"TIME=" + n	
						],
						base_url:layer_data.DATA.WMS_URL[0] + '?'
					}
					
					
					
					loadWMS(wms_layer);
					loadWMSLegend(
								  layer_data.DATA.WMS_URL[0] + '?',
								  layer_data.DATA.OGC_NAME[0],
								  active_date,
								  layer_data.DATA.LABEL[0],// + ' (' +  layer_data.DATA.UNIT[0] + ')',
								  _legend_id);
					
					

				}
			);
			

			
			function formatDateTimeForWMS( datetime ){
				
				
				if(typeof String.prototype.pad !== 'function'){
					String.prototype.pad = function(l, s, t){
						return s || (s = " "), (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length)
							+ 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2))
							+ this + s.substr(0, l - t) : this;
					};
				}
				
				
				
				var dateString = [
					 datetime.getUTCFullYear()
					,(datetime.getUTCMonth() + 1).toString().pad(2,'0')
					,datetime.getUTCDate().toString().pad(2,'0')
				].join('-');
		
				var timeString = [
					 datetime.getUTCHours().toString().pad(2,'0')
					,datetime.getUTCMinutes().toString().pad(2,'0')
					,datetime.getUTCSeconds().toString().pad(2,'0')
				].join(':') + '.' + datetime.getMilliseconds();
				
				return dateString + 'T' + timeString;		
			};
		}
	);
	
}
*/

function loadWMSLegend(wms_base,layer,date,label,legend_id){
	var src = wms_base + 'REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&STRICT=false&TRANSPARENT=true&LAYER=' + layer + '&HORIZONTAL=true&SHOWLABEL=false';
	
	$aoos_chart_jq('#' + legend_id).html('<div class="text"><p class="label">' + label + ' at ' + date.getFullYear() + '-' + (date.getUTCMonth() + 1).toString().pad(2,'0') + '-' + date.getUTCDate().toString().pad(2,'0') + ' ' + date.getHours().toString().pad(2,'0') + ':' + date.getMinutes().toString().pad(2,'0') + '</p></p></div><img src="'+ src +'" />');
}


//REQUIRES AOOS-CHARTS PLUGIN
function loadVirtualSensor(label,chart_id,layer_id,lat,lon,depth){
	
	if(depth == null){
		depth = 0;	
	}
	
	label = '<span class="model-label">' + label + '</span> ' + lat + ',' + lon + ' ';
	
	var service_url = 'http://proxy.axiomalaska.com/virtualsensor/getDataValues?jsoncallback=?';
	
	$aoos_chart_jq(document).ready(function () {
		$aoos_chart_jq.getJSON(service_url,
		{
			method:"GetSensorObservationsJSON",
			layer_id:layer_id,
			lat:lat,
			lon:lon,
			depth:depth
		},
		function(data) {
			loadAOOSChart(data,chart_id,label);
		});

	});
}




