// 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
// dd2Mercator converstion:
// from http://search.cpan.org/src/RRWO/GPS-Lowrance-0.31/lib/Geo/Coordinates/MercatorMeters.pm
/*
Usage:
	// new map type
    var doq=new GMapType();
    wmsmap(doq,'Photo',1,16,'',256);
	// google streets
    var ctl1=G_HYBRID_MAP.getTileLayers()[1];
	// aerial photo
    var ctldoq = new GTileLayer();
    wmstiles(ctldoq,map,'http://terraservice.net/ogcmap.ashx?','doq',256,'image/jpeg','default','cannot get tile',0,1,16);
	// sample WMS service
    var ctlBM = new GTileLayer();    
	wmstiles(ctlBM,map,'http://chignik.berkeley.edu/cgi-bin/mapserv?map=/usr/local/web/html/google/wms.map&','us_county',256,'image/png','default','cannot get tile',5,1,16);
    doq.tla = new Array(ctldoq,ctlBM,ctl1);
    map.getMapTypes().push(doq);
*/

// modify maptype
function wmsmap (pMap,pName,pMinRes,pMaxRes,pCopywrite,pTilesize) {
	pMap.getName=function() {return pName;}
	pMap.getOpacity = function() {return pOpacity;}
	pMap.isPng = function() { return false; }
	pMap.getCopyright=function(a,b,c) { return pCopywrite; }
	pMap.getMinimumResolution = function() { return pMinRes; }
	pMap.getMaximumResolution = function() { return pMaxRes; }
	pMap.getProjection = G_NORMAL_MAP.getProjection;
	pMap.getTileLayers = function() { return pMap.tla; }
	pMap.getTileSize=function() { return pTilesize; }
}

// modify tilelayer
// pTL = new GTileLayer() object
// pMap = google map object
// pMercZoomLevel = zoom level that view should switch to Mercator 
//   - must have Mercator enabled WMS
//   - set 0 if unsure
// pMsg = error message to display when tile cannot load
function wmstiles (pTL,pMap,pBaseURL,pLayers,pTs,pFormat,pStyles,pMsg,pMercZoomLevel,pMinRes,pMaxRes, pOpacity) {
	pTL.getOpacity = function() { return pOpacity; }
	pTL.getMaximumResolution = function() { return pMaxRes; }
	pTL.getMinimumResolution = function() { return pMinRes; }
	pTL.getErrorMessage = function() { return pMsg;}
	pTL.getProjection = G_NORMAL_MAP.getProjection;
	pTL.getTileUrl=function(a,b,c) {
		var lULP = new GPoint(a.x*pTs,(a.y+1)*pTs);
		var lLRP = new GPoint((a.x+1)*pTs,a.y*pTs);
		var lUL = pTL.getProjection().fromPixelToLatLng(lULP,b, c);
		var lLR = pTL.getProjection().fromPixelToLatLng(lLRP,b, c);
		// switch between Mercator and DD if merczoomlevel is set
		if (pMercZoomLevel!=0 && pMap.getZoom() < pMercZoomLevel) {
			var lBbox=dd2MercMetersLng(lUL.lngDegrees)+","+dd2MercMetersLat(lUL.latDegrees)+","+dd2MercMetersLng(lLR.lngDegrees)+","+dd2MercMetersLat(lLR.latDegrees);
			var lSRS="EPSG:54004";
		} else {
			var lBbox=lUL.lngDegrees+","+lUL.latDegrees+","+lLR.lngDegrees+","+lLR.latDegrees;
			var lSRS="EPSG:4326";
		}
		var lURL=pBaseURL;
		lURL+="&REQUEST=GetMap";
		lURL+="&SERVICE=WMS";
		lURL+="&VERSION=1.1.1";
		lURL+="&LAYERS="+pLayers;
		lURL+="&STYLES="+pStyles; lURL+="&FORMAT="+pFormat;
		lURL+="&BGCOLOR=0xFFFFFF";
		lURL+="&TRANSPARENT=TRUE";
		lURL+="&SRS="+lSRS;
		lURL+="&BBOX="+lBbox;
		lURL+="&WIDTH="+pTs;
		lURL+="&HEIGHT="+pTs;
		lURL+="&reaspect=false";
		return lURL;
	}
}

// dd2MercMeters Conversion Functions
var MAGIC_NUMBER=6356752.3142;
var DEG2RAD=0.0174532922519943;
var PI=3.14159267;
function dd2MercMetersLng(p_lng) { 
	return MAGIC_NUMBER*(p_lng*DEG2RAD); 
}

function dd2MercMetersLat(p_lat) {
	if (p_lat >= 85) p_lat=85;
	if (p_lat <= -85) p_lat=-85;
	return MAGIC_NUMBER*Math.log(Math.tan(((p_lat*DEG2RAD)+(PI/2)) /2));
}
