/* Functions for creating SFEI's RMP/FMP online maps */


Setup_Global_Variables(); 
function Setup_Global_Variables() {
	// Define parameters of different marker types
	if (!self.icons) { icons = new Array(); }
	icons['circle'] = { is:[11,11],ia:[5,5],ss:[13,13],iwa:[10,2],isa:[5,9],
				     im:[0,0, 10,0, 10,10, 0,10, 0,0],letters:true };
	icons['pin'] = { is:[15,26],ia:[7,25],ss:[30,26],iwa:[7,1],isa:[12,16],
				  im:[5,25, 5,15, 2,13, 1,12, 0,10, 0,5, 1,2, 2,1, 4,0, 10,0, 12,1, 13,2, 14,4, 14,10, 13,12, 12,13, 9,15, 9,25, 5,25 ],
				  letters:true };
	icons['square'] = { is:[11,11],ia:[5,5],ss:[13,13],iwa:[10,2],isa:[5,9],im:[0,0, 10,0, 10,10, 0,10, 0,0],letters:true };
	icons['triangle'] = { is:[13,13],ia:[6,6],ss:[15,15],iwa:[11,3],isa:[6,10],im:[0,11, 6,0, 12,11, 0,11],letters:false };
	icons['diamond'] = { is:[13,13],ia:[6,6],ss:[13,13],iwa:[11,3],isa:[6,10],im:[6,0, 12,6, 6,12, 0,6, 6,0],letters:false };
	icons['airport'] = { is:[17,17],ia:[8,8],ss:[19,19],iwa:[13,3],isa:[13,17],
   					im:[6,0, 10,0, 16,6, 16,10, 10,16, 6,16, 0,10, 0,6, 6,0],letters:false };
	icons['google'] = { is:[20,34],ia:[9,33],ss:[37,34],iwa:[9,2],isa:[18,25],
					im:[8,33, 8,23, 1,13, 1,6, 6,1, 13,1, 18,6, 18,13, 11,23, 11,33],letters:true };
	icons['googleblank'] = { is:[20,34],ia:[9,33],ss:[37,34],iwa:[9,2],isa:[18,25],
					im:[8,33, 8,23, 1,13, 1,6, 6,1, 13,1, 18,6, 18,13, 11,23, 11,33],letters:true };
	icons['googlemini'] = { is:[12,20],ia:[6,20],ss:[22,20],iwa:[5,1],isa:[10,15],
					im:[4,19, 4,14, 0,7, 0,3, 4,0, 7,0, 11,3, 11,7, 7,14, 7,19, 4,19],letters:true };
	icons['blankcircle'] = { is:[64,64],ia:[31,31],ss:[70,70],iwa:[55,8],isa:[31,63],
					im:[19,3, 44,3, 60,19, 60,44, 44,60, 19,60, 3,44, 3,19, 19,3],letters:false };
	icons['camera'] = { is:[17,13],ia:[8,6],ss:[19,15],iwa:[13,3],isa:[13,10],
					im:[1,3, 6,1, 10,1, 15,3, 15,11, 1,11, 1,3],letters:false };
	icons['tickmark'] = { is:[13,13],ia:[6,6],ss:[],iwa:[11,3],isa:[],im:[6,0, 12,6, 6,12, 0,6, 6,0],letters:false };
	
	// Make sure defaults have been set
	if (!self.marker_icon) { marker_icon = 'blankcircle'; } 
	if (!self.marker_color) { marker_color = 'red'; } 
	marker_icon_size = marker_icon_trans = marker_icon_imagemap = null;
	if (!self.marker_link_target) { marker_link_target = '_blank'; } 
//	if (!self.icon_directory) { icon_directory = 'http://maps.gpsvisualizer.com/google_maps/icons/'; }
	if (!self.icon_directory) { icon_directory = 'http://eis.sfei.org/labs/icons/'; }
	
	// Create a default icon for all markers
	defaultIcon = new GIcon();
	if (!icons[marker_icon]) { marker_icon = 'pin'; }
	defaultIcon.image = icon_directory+marker_icon+'/'+marker_color+'.png';
	defaultIcon.transparent = icon_directory+marker_icon+'/'+marker_color+'-t.png';
	defaultIcon.iconSize = new GSize(icons[marker_icon]['is'][0],icons[marker_icon]['is'][1]);
	defaultIcon.iconAnchor = new GPoint(icons[marker_icon]['ia'][0],icons[marker_icon]['ia'][1]);
	defaultIcon.shadow = (icons[marker_icon]['ss'] && icons[marker_icon]['ss'][0]) ? icon_directory+marker_icon+'/shadow.png' : null;
	defaultIcon.shadowSize = (icons[marker_icon]['ss'] && icons[marker_icon]['ss'][0]) ? new GSize(icons[marker_icon]['ss'][0],icons[marker_icon]['ss'][1]) : null;
	defaultIcon.infoWindowAnchor = new GPoint(icons[marker_icon]['iwa'][0],icons[marker_icon]['iwa'][1]);
	defaultIcon.infoShadowAnchor = new GPoint(icons[marker_icon]['isa'][0],icons[marker_icon]['isa'][1]);
	defaultIcon.imageMap = (icons[marker_icon]['im']) ? icons[marker_icon]['im'] : 
					[ 0,0, 0,icons[marker_icon]['is'][1]-1, icons[marker_icon]['is'][0]-1,icons[marker_icon]['is'][1]-1, 
					  icons[marker_icon]['is'][0]-1,0, 0,0 ];
}


Init_Styles();
function Init_Styles() {	// Initialize some CSS styles
      document.writeln('            <style type="text/css" media="print">'); // force stuff to print even though Google thinks it shouldn't
      document.writeln('                  img[src$="transparent.png"].gmnoprint { display:none; }');
      document.writeln('                  img[src$="shadow.png"].gmnoprint { display:none; }');
      document.writeln('                  img[src$="crosshair.gif"].gmnoprint { display:none; }');
      document.writeln('            </style>');
}
  


var marker_count = 0;
var tmptext='';  // temporary text variable for printing info to screen
function Marker(map,m) {
	var tempIcon = new GIcon(defaultIcon);
	var scale = (m['scale'] > 0) ? m['scale'] : 1;  // scale must be greater than 0
	var icon = (m['icon'] && icons[m['icon']]) ? m['icon'] : marker_icon;
	var color = (m['color']) ? m['color'] : marker_color;
	if (color.substring(0,1) == '#') { color = color.replace(/^\#/,''); }
	var base_url = (icons[icon]['directory']) ? icons[icon]['directory'] : icon_directory+icon;
	tempIcon.iconSize = new GSize(icons[icon]['is'][0]*scale,icons[icon]['is'][1]*scale);
	tempIcon.iconAnchor = new GPoint(icons[icon]['ia'][0]*scale,icons[icon]['ia'][1]*scale);
	tempIcon.shadow = (icons[icon]['ss'] && icons[icon]['ss'][0]) ? base_url+'/shadow.png' : null;
	tempIcon.shadowSize = (icons[icon]['ss'] && icons[icon]['ss'][0]) ? new GSize(icons[icon]['ss'][0]*scale,icons[icon]['ss'][1]*scale) : null;
	tempIcon.infoWindowAnchor = (icons[icon]['iwa'] && icons[icon]['iwa'][0]) ? new GPoint(icons[icon]['iwa'][0]*scale,icons[icon]['iwa'][1]*scale) : null;
	tempIcon.infoShadowAnchor = (icons[icon]['isa'] && icons[icon]['isa'][0]) ? new GPoint(icons[icon]['isa'][0]*scale,icons[icon]['isa'][1]*scale) : null;

	var opacity = ''; 
	if (m['opacity'] && m['opacity'] > 0 && m['opacity'] < 1) {
		opacity = '-'+Math.round(m['opacity']*100);
		tempIcon.shadow = null; 
		tempIcon.shadowSize = null;
	}
	tempIcon.image = base_url+'/'+color.toLowerCase()+opacity+'.png';

	if (scale != 1) { 
		tempIcon.imageMap = new Array(); 
		for (j=0; j<icons[icon]['im'].length; j++) { 
			tempIcon.imageMap[j] = icons[icon]['im'][j]*scale; 
		} 
	} else { 
		tempIcon.imageMap = icons[icon]['im']; 
	}
	tempIcon.transparent = base_url+'/'+color.toLowerCase()+'-t.png';

//	This is where the icon URLs are generated ...
//	print these to the screen for now, we want to collect these images
//	tmptext += tempIcon.image + ' . <br>';
//	tmptext += tempIcon.shadow + '<br>';
// 	document.getElementById('textarea').innerHTML = tmptext;
//
//
	var marker = new GMarker( new GLatLng(m['lat'],m['lon']), 
			{icon:tempIcon, draggable:false, zIndexProcess:orderMarkers} ) ;
			// zIndexProcess attached to control the order in which markers
			// are diplayed.  See orderMarkers function below.
	marker_count += 1;
	var iw_html = '';
	if (m['name']) {
		if (m['url'] && m['url'] != null) { 
			iw_html = iw_html + '<b><a target="'+marker_link_target+'" href="'+m['url']+'" title="'+m.url+'">'+m['name']+'</a></b>'; 
		} else { 
			iw_html = iw_html + '<b>'+m['name']+'</b>'; 
		}
	}
	if (m['desc']) {
		iw_html = iw_html + '<div>' + m['desc'] + '</div>';
	}

	var window_width = 0;
	var absolute_max_width = map.getSize().width-100 ;
	var marker_window_width = parseFloat(m['window_width']);
	var global_window_width = 0;
	if (marker_window_width > 0 && marker_window_width < absolute_max_width) { 
		window_width = marker_window_width; 
	} else if (global_window_width > 0 && global_window_width < absolute_max_width) { 
		window_width = global_window_width; 
	}
	if (window_width > 0 && window_width < 200) { window_width = 200; } // apparently you can't make it less than 217 (let's leave 17 for the close box though)
	var width_style = (window_width > 0) ? 'width:'+window_width+'px;' : '';
	var info_html = '<DIV style="text-align:left; '+width_style+'" class="map_bubble">'+iw_html+'</DIV>';

	if (iw_html) { // Clickable marker --> opens info window
		GEvent.addListener(marker, "click", function(){ 
			marker.openInfoWindowHtml(info_html,{maxWidth:absolute_max_width}); 
		}); 
	}
	
	// This info can be used by other functions, like the "marker list":
	marker.index = marker_count-1;
	marker.name = (m['name']) ? m['name'] : '[unnamed]';
	marker.desc = (m['desc']) ? m['desc'] : '';
	marker.url = (m['url']) ? m['url'] : '';
	marker.shortdesc = (m['shortdesc']) ? m['shortdesc'] : '';
	marker.html = info_html;
	marker.window_width = (m['window_width']) ? m['window_width'] : '';
	marker.color = (m['color']) ? m['color'] : marker_color;
	marker.width = tempIcon.iconSize.width;
	marker.height = tempIcon.iconSize.height;
	marker.image = tempIcon.image;
	marker.coords = new GLatLng(m['lat'],m['lon']);
	marker.thumbnail = (m['thumbnail']) ? m['thumbnail'] : '';
	marker.thumbnail_width = (m['thumbnail_width']) ? m['thumbnail_width'] : '';
	marker.type = (m['type']) ? m['type'] : '';
	marker.zoom_level = (m['zoom_level']) ? m['zoom_level'] : '';
	
	marker.mylist_html = Marker_List_Item(marker); 

	return marker;
}


function Marker_List_Item(m) { 
  var icon_scaling = 'width="' +m.width + '" height="' + m.height + '"';
  var icon = '<img ' +icon_scaling+ ' src="'+m.image+'" alt="img"/>';
  var top_pad = (m.height/2 - 5);  // determine top padding to center text vertically
  if (top_pad < 0) { top_pad = 1; }
  //var html = '<div style="white-space:nowrap; width: 400px; overflow: auto;"><div class="mylist_icon">' + icon +'</div><div class="mylist_text" style="padding-top:' + top_pad + 'px;">' + m.name + '</div></div>';
  var html = '<tr style="vertical-align: middle; border-bottom: 1px solid #CCCCCC;"><td class="mylist_icon">' + icon + '</td><td class="mylist_text">' + m.name + '</td></tr>';

  return (html);
}



//========= Map Types ==========//

DAILY_TERRA_TILES = WMSCreateMap([{name:'Terra',copyright:'Map by NASA',
				errorMessage:'OnEarth server unavailable',minResolution:3,maxResolution:10,tileSize:260,
				baseUrl:'http://onearth.jpl.nasa.gov/wms.cgi?request=GetMap&styles=&srs=EPSG:4326&format=image/jpeg&layers=daily_terra'}]);
DAILY_AQUA_TILES =  WMSCreateMap([{name:'Aqua',copyright:'Map by NASA',
				errorMessage:'OnEarth server unavailable',minResolution:3,maxResolution:10,tileSize:260,
				baseUrl:'http://onearth.jpl.nasa.gov/wms.cgi?request=GetMap&styles=&srs=EPSG:4326&format=image/jpeg&layers=daily_aqua'}]);
NEXRAD_TILES =      WMSCreateMap([{name:'NEXRAD',copyright:'NEXRAD imagery from Iowa Environmental Mesonet',
				errorMessage:'NEXRAD imagery unavailable',minResolution:3,maxResolution:14,tileSize:256,
				baseUrl:'http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi?version=1.1.1&request=GetMap&service=WMS&srs=EPSG:4326&format=image/png&transparent=true&styles=&layers=nexrad-n0r',
				opacity:0.7,background:'G_PHYSICAL_MAP'}]); // NOTE: for combo maps using Google tiles, tileSize MUST be 256!!!


function addMyMaps(map) {
//	map.addMapType(DAILY_TERRA_TILES);
//      map.addMapType(DAILY_AQUA_TILES);
	map.addMapType(NEXRAD_TILES);
}

function WMSCreateMap(layer_info,copyright,errorMessage,minResolution,maxResolution,tileSize,baseUrl) {
      // The old "GV_Marker" function had everything in a particular order; this new one uses more user-friendly named parameters.
      // If the second argment has a 'lat' item INSIDE of it, then it's the new version; otherwise that's just the latitude.
      var array_input = (layer_info[0] != undefined && layer_info[0]['name'] != undefined) ? 1 : 0;
      var layers = [];

      if (!array_input) {
            layers[0] = [];
            layers[0]['name'] = layer_info;
            layers[0]['copyright'] = copyright;
            layers[0]['errorMessage'] = errorMessage;
            layers[0]['minResolution'] = minResolution;
            layers[0]['maxResolution'] = maxResolution;
            layers[0]['tileSize'] = tileSize;
            layers[0]['baseUrl'] = baseUrl;
      } else {
            layers = layer_info;
      }

      var tileLayers = [];
      for (j=0; j<layers.length; j++) {
            var mi = layers[j];
            var tileLayer = new GTileLayer(new GCopyrightCollection(mi['copyright']),mi['minResolution'],mi['maxResolution']);
            tileLayer.baseUrl = mi['baseUrl'];
            tileLayer.tileSize = mi['tileSize'];
            tileLayer.getTileUrl = WMSGetTileUrl;
            tileLayer.getCopyright = function() { return { prefix:'',copyrightTexts:[mi['copyright']]}; };
            if (mi['opacity'] != undefined) { tileLayer.getOpacity = function() { return mi['opacity']; } }
            if (mi['background'] != undefined) {
                  var bg_layers = eval(mi['background']+'.getTileLayers()');
                  for(var i in bg_layers) {
                        if (mi['bg_opacity'] != undefined) { bg_layers[i].getOpacity = function() { return mi['bg_opacity']; } }
                        tileLayers.push(bg_layers[i]);
                  }
            }
            tileLayers.push(tileLayer);
            if (mi['foreground'] != undefined) {
                  var fg_layers = eval(mi['foreground']+'.getTileLayers()');
                  for (var i=0; i<fg_layers.length; i++) {
                        if (mi['foreground'] != 'G_HYBRID_MAP' || (mi['foreground'] == 'G_HYBRID_MAP' && i == (fg_layers.length-1))) { 
                        }
                  }
            }
      }

      return new GMapType(tileLayers,G_SATELLITE_MAP.getProjection(),mi['name'],{errorMessage:mi['errorMessage'],tileSize:mi['tileSize']});
}

function WMSGetTileUrl(tile,zoom) {
      var southWestPixel = new GPoint(tile.x*this.tileSize,(tile.y+1)*this.tileSize);
      var northEastPixel = new GPoint((tile.x+1)*this.tileSize,tile.y*this.tileSize);
      var southWestCoords = G_NORMAL_MAP.getProjection().fromPixelToLatLng(southWestPixel,zoom);
      var northEastCoords = G_NORMAL_MAP.getProjection().fromPixelToLatLng(northEastPixel,zoom);
      var bbox = southWestCoords.lng()+','+southWestCoords.lat()+','+northEastCoords.lng()+','+northEastCoords.lat();
      var ts = (this.baseUrl.indexOf('onearth.jpl.nasa.gov') > -1 && this.tileSize == 256) ? 257 : this.tileSize;
      return this.baseUrl+'&bbox='+bbox+'&width='+ts+'&height='+ts;
}



          function orderMarkers(marker,b) {
		// Controls the order in which markers are layered.
		// The data are sorted by result in descending order by the SQL query.  A myZindex variable is
		// populated that indicates the sorting order.  This variable is here used to
		// ensure that high results values are layered below low results values.
                  var tmp = GOverlay.getZIndex(marker.getPoint().lat()) + marker.myZindex*1000000;
                  return tmp;
            }

