/*
 * Call generic wms service for GoogleMaps v2
 * John Deck, UC Berkeley
 * Inspiration & Code from:
 *	Mike Williams http://www.econym.demon.co.uk/googlemaps2/ V2 Reference & custommap code
 *	Brian Flood http://www.spatialdatalogic.com/cs/blogs/brian_flood/archive/2005/07/11/39.aspx V1 WMS code
 *	Kyle Mulka http://blog.kylemulka.com/?p=287  V1 WMS code modifications
 *      http://search.cpan.org/src/RRWO/GPS-Lowrance-0.31/lib/Geo/Coordinates/MercatorMeters.pm
 *
 * Modified by Chris Holmes, TOPP to work by default with GeoServer.
 *
 * Bundled with YM4R with John Deck's permission.
 * Slightly modified to fit YM4R.
 * See johndeck.blogspot.com for the original version and for examples and instructions of how to use it.
 */

/** NOTE: Modified by Matthew Lawhead, ODFW 4/19/07 */

var WGS84_SEMI_MAJOR_AXIS = 6378137.0; //equatorial radius
var WGS84_ECCENTRICITY = 0.0818191913108718138;
var DEG2RAD=0.0174532922519943;
var PI=3.14159267;

var MERC_ZOOM_DEFAULT = 15; // ML added 041807
 var FORMAT_DEFAULT="image/png"; // ML added 041807

function dd2MercMetersLng(p_lng) { 
	return WGS84_SEMI_MAJOR_AXIS * (p_lng*DEG2RAD); 
}

function dd2MercMetersLat(p_lat) {
        var lat_rad = p_lat * DEG2RAD;
	return WGS84_SEMI_MAJOR_AXIS * Math.log(Math.tan((lat_rad + PI / 2) / 2) * Math.pow( ((1 - WGS84_ECCENTRICITY * Math.sin(lat_rad)) / (1 + WGS84_ECCENTRICITY * Math.sin(lat_rad))), (WGS84_ECCENTRICITY/2)));
}

function addWMSPropertiesToLayer(tile_layer,base_url,layers,styles,format,merc_proj,use_geo){
   tile_layer.format = format;
   tile_layer.baseURL = base_url;
   tile_layer.styles = styles;
   tile_layer.layers = layers;
   tile_layer.mercatorEpsg = merc_proj;
   tile_layer.useGeographic = use_geo;
   return tile_layer;
}

// Added by ML
function createSimpleWMSMapType(name, copyright, baseUrl, layers, minResolution, 
                        maxResolution, opts){
    var tl= createWMSTileLayer(name, copyright, baseUrl, layers, minResolution, 
                        maxResolution, opts);
    return new GMapType([tl], G_SATELLITE_MAP.getProjection(), name);
}

// Added by ML
function createHybridWMSMapType(name, copyright, baseUrl, layers, minResolution, 
                        maxResolution, opts){
    var tl= createWMSTileLayer(name, copyright, baseUrl, layers, minResolution, 
                        maxResolution, opts);
    var layers = [tl, G_HYBRID_MAP.getTileLayers()[1]];
    return new GMapType(layers , G_SATELLITE_MAP.getProjection(), name);
}

// Added by ML: replace this with create TileOverlay
function createDualHybridWMSMapType(name, copyright, baseUrl, layers, minResolution, 
                        maxResolution, opts){
    var tl= createWMSTileLayer(name, copyright, baseUrl, layers, minResolution, 
                        maxResolution, opts);
    var layers = [G_HYBRID_MAP.getTileLayers()[0], tl, G_HYBRID_MAP.getTileLayers()[1]];
    return new GMapType(layers , G_SATELLITE_MAP.getProjection(), name);
}

// Added by ML
function createWMSTileLayer(name, copyright, baseUrl, layers, minResolution, 
                        maxResolution, opts){
// Creates a web map service tile layer
    // Params: name => display name, copyright => text for lower right corner,
    // baseUrl => base url of wms, layers => layer name(s), opts => javascript object
    // with the optional params listed below.

		var opacity = 1.0;
		if(opts && opts['opacity']){opacity = opts['opacity'];}
    var tileLayer =  new GTileLayer( new GCopyrightCollection(copyright),
                                     minResolution, maxResolution, {opacity:opacity});
    tileLayer.baseURL = baseUrl;
    tileLayer.layers = layers;
    tileLayer.getCopyright = function() {return copyright;};
    tileLayer.name = name;
    
    tileLayer.styles = "";
    if(opts && opts['styles']) tileLayer.styles = opts['styles'];
    
    tileLayer.format = "png";
    if(opts && opts['format']) tileLayer.format = opts['format']; // may be a 'jpeg'
    
		tileLayer.tileWidth = 256;
		if(opts && opts['tileWidth']) tileLayer.tileWidth = opts['tileWidth'];
		tileLayer.tileHeight = 256;
		if(opts && opts['tileHeight']) tileLayer.tileHeight = opts['tileHeight'];
		
    // proj4 code for mercator projection, defaults to 54004; leave blank if
    // using a geographic projection (4326)
    if(opts && opts['mercProj']){
        if(opts['mercProj'] == true) tileLayer.mercatorEpsg = 900913;// 102113; 
        else tileLayer.mercatorEpsg = opts['mercProj'];
        tileLayer.useGeographic = false;
    }
    // set to true if wms is in geographic projection (proj4 code 4326)
    else{tileLayer.useGeographic = true;} 
    
    tileLayer.getTileUrl = getTileUrlForWMS; //see function below
    return tileLayer;
}    


getTileUrlForWMS=function(a,b,c) {
	var lULP = new GPoint(a.x*256,(a.y+1)*256);
	var lLRP = new GPoint((a.x+1)*256,a.y*256);
	var lUL = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lULP,b,c);
	var lLR = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lLRP,b,c);
	 
	if (this.useGeographic){
           var lBbox=lUL.x+","+lUL.y+","+lLR.x+","+lLR.y;
    	   var lSRS="EPSG:4326";
	}else{
	   var lBbox=dd2MercMetersLng(lUL.x)+","+dd2MercMetersLat(lUL.y)+","+dd2MercMetersLng(lLR.x)+","+dd2MercMetersLat(lLR.y);
    	   var lSRS="EPSG:" + this.mercatorEpsg;
        }
	var lURL=this.baseURL;
	if(lURL.indexOf("?") == -1){lURL+="?REQUEST=GetMap";}
	else{lURL+= "&REQUEST=GetMap";}
	lURL+="&SERVICE=WMS";
	lURL+="&VERSION=1.1.1";
	lURL+="&LAYERS="+this.layers;
	lURL+="&STYLES="+this.styles; 
	lURL+="&FORMAT=image/"+this.format;
	lURL+="&BGCOLOR=0xFFFFFF";
	lURL+="&TRANSPARENT=TRUE";
	lURL+="&SRS="+lSRS;
	lURL+="&BBOX="+lBbox;
	lURL+= "&WIDTH=" + this.tileWidth;// "&WIDTH=256";
	lURL+= "&HEIGHT=" + this.tileHeight;// "&HEIGHT=256";
	lURL+="&reaspect=false";
	return lURL;
}

