//<![CDATA[
/*This script is used to manage proposed, approved, and completed burns on google maps. 
Author: Matthew Mavko, Air Sciences Inc.
for the MT/ID Airshed Group

Acknowledgements:
Many techniques were learned from Jon Conolly's REQ2:
http://www.pnsn.org/req2/
*/

Event.observe(window, 'load', function(){
	loadMap();
	
	if(isAdmin == "visible"){
		$("Appr_Active").observe('click',toggleApprove);
		$("appr_confirm").observe('click',confirmApprovals);
		$("approve_all").observe('click',approveAll);
	}
	$("download").observe('click',downloadBurns);
	
	resetControl();
	initFilters();
	getBurns();

	$("burn3").observe('click', shide);
	$("burn2").observe('click', shide);
	$("burn1").observe('click', shide);

	for (var i = 0; i < overlayNames.length; i++){
		$(overlayNames[i]).observe('click', getOverlay);
	}
	
	$("layer").observe('change', toggleFilters);

	
	$("burnDate").observe('change', changeDate);
	$("burnEDate").observe('change', changeDate);
	$("mapDate").observe('change', changeDetects);
	$("burnDate").observe('change:cal', changeDate);
	$("burnEDate").observe('change:cal', changeDate);
	$("mapDate").observe('change:cal', changeDetects);
//	$("bckDate").observe('click', changeDate);
//	$("fwdDate").observe('click', changeDate);
	
	$("fil_prty").observe('change', changeFilter);
	$("fil_air").observe('change', changeFilter);
	$("fil_elev").observe('change', changeFilter);
	$("fil_acres").observe('change', changeFilter);
	$("fil_btype").observe('change', changeFilter);
	$("fil_state").observe('change', changeFilter);
	
	
	//reset map view
	$('reset').observe('click', function(){
		map.setCenter(new GLatLng(initCenterLat,initCenterLon), parseInt(initCenterZoom));
		map.setMapType(G_PHYSICAL_MAP);
		map.closeInfoWindow();
		for (var i = 0; i < overlayNames.length; i++){
			$(overlayNames[i]).checked = false;
		}
		map.removeOverlay(detectXML);
		map.removeOverlay(tribeXML);

		map.removeOverlay(class1XML);
		map.removeControl(controlCls1);

		map.removeOverlay(idXML);
		map.removeOverlay(mtXML);
		map.removeOverlay(impactXML);
		map.removeOverlay(airshedXML);
		map.removeOverlay(ashd_cntrdXML);
		
	});
	
});



// unload handlers
window.unload = function(){
	GUnload();
};

//Global varaibles
var map;
var side_bar_html = "";
var gmarkers = [];
var count = 0;
var zIndex = 1000;
var eventArray = [];
var tdList = ['a','b','c','d','e','f','g','h','i','j','k'];
var browser = navigator.appVersion;
var displayType = "table-row";

var txt = new RegExp('MSIE');

if ( browser.match(txt) == "MSIE") {
	displayType = "block";
}

var burnNum = 0; //number of events shown on map


function loadMap() {
	if (GBrowserIsCompatible()) {
		map = new GMap2($("map"));
		map.setCenter(new GLatLng(initCenterLat,initCenterLon), parseInt(initCenterZoom));
		map.addControl(new GOverviewMapControl()); 
		map.addControl(new GScaleControl());
		map.addControl(new GLargeMapControl());
	
		map.addMapType(G_PHYSICAL_MAP);

		var mapControl = new GHierarchicalMapTypeControl();
		mapControl.clearRelationships();

		mapControl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, "Labels", false);
		
		map.setMapType(G_PHYSICAL_MAP);
        addWMSLayer('COUNTY_OR_EQUIVAL:Framework','Counties',0,1);
        addWMSLayer('NHDFLHI:Framework','Streams',0,1);

		map.addControl(mapControl);
		// map.enableScrollWheelZoom();
		var html='<div id="appr_control"><input id="Appr_Active" type="checkbox" /> Activate Approve <a href="javascript:popUp('+"'help.cfm#activateapprove'"+')" style="text-decoration:none;color=#FFFFFF" ><img src="images/help_icon.gif" alt="fd" width="12" height="11" title="Click to view help menu" style="border:none"/></a><br><div id="appr_confirm"><button>Confirm Selections</button></div><br><div id="approve_all"><button>Approve All</button></div><div id="approve_divide">Cont. Divide:<select id="appr_divide"><option value="B">B</option><option value="W">W</option><option value="E">E</option></select></div></div>';	
		var Appr_control=new HtmlControl(html);
		if (isAdmin == "visible"){
			map.addControl(Appr_control, new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7,43)));
		}
		var html='<div id="class1key"><ul><li><img src="images/CLS1_fws.png" /> FWS</li><li><img src="images/CLS1_nps.png" /> NPS</li><li><img src="images/CLS1_usfs.png" /> USDA-FS</li><li><img src="images/CLS1_native.png" /> Native Am.</li></ul></div>';
		controlCls1 = new HtmlControl(html);


		GEvent.addListener(map,"singlerightclick", function(point,src,overlay) { 
			if (overlay) { 
		  		if (overlay instanceof GMarker) { 
					GEvent.trigger(overlay,"RightClick"); 
		  		} 
			} 
		}); 

	}else{
	alert("Javascript must be enabled in order for you to use the AMS Map Tool. To view, you must first enable JavaScript in your browser options and try again");
	}
}



function toggleApprove(){
	map.closeInfoWindow();
	if (this.checked){
		$('approveText').style.visibility = "visible";
		$('appr_confirm').style.display = "block";
		$('approve_divide').style.display = "block";
		$('approve_all').style.display = "block";
		edit_mode=1;
		if(!$('burn2').checked){
			$('burn2').checked = true;
		}
	}else{
		$('approveText').style.visibility = "hidden";
		$('appr_confirm').style.display = "none";
		$('approve_divide').style.display = "none";
		$('approve_all').style.display = "none";
		edit_mode=0;
	}
	killMarkers();
	getBurns();
}

function approveAll(){
	var prop_cnt = 0;
	var appr_cnt = 0;
	for (var i=0; i< gmarkers.length; i++) {		
		var marker = gmarkers[i];
		if (marker.grp == "burn2" && !marker.isHidden()){
			appr_cnt++;
		}else if (marker.grp == "burn1" && !marker.isHidden()){
			prop_cnt++;
		}
	}
	if ($("Appr_Active").checked){
		for (var i=0; i< gmarkers.length; i++) {		
			var marker = gmarkers[i];
			if (prop_cnt == 0 && marker.grp == "burn2" && !marker.isHidden()){
				if(checkDivide(marker)){
    				marker.setImage("images/burn_1.png");
    				marker.grp = "burn1";
                }
			}else if (marker.grp == "burn1" && !marker.isHidden()){
				if(checkDivide(marker)){
    				marker.setImage("images/burn_2.png");
	       			marker.grp = "burn2";
                }
            }
		}
	}
}

function confirmApprovals(){
	map.closeInfoWindow();
	$('loading').style.visibility = "visible";
	$('loadText').style.visibility = "visible";
	document.body.style.cursor="wait";
	var confirmParams = '?ApprovalIDs=';
	for (var i=0; i< gmarkers.length; i++) {		
		if (gmarkers[i].grp == "burn2"){
			confirmParams += eventArray[i].fid +',';
		}
	}
	confirmParams = confirmParams.substr(0,confirmParams.length-1);
	confirmParams +='&NotApproved=';
	for (var i=0; i< gmarkers.length; i++) {		
		if (gmarkers[i].grp == "burn1"){
			confirmParams += eventArray[i].fid +',';
		}
	}
	confirmParams = confirmParams.substr(0,confirmParams.length-1);
	new Ajax.Request(
			'xml/setApprovals.cfm' + confirmParams,
		{
			method: "post",
			contentType: 'text/xml',
			onSuccess: parseApprove
		}
	);
}
function parseApprove(ajax){
	var xmlDoc = GXml.parse(ajax.responseText);
	$('loading').style.visibility = "hidden";
	$('loadText').style.visibility = "hidden";
	document.body.style.cursor="default";
	//$("appr_confirm").innerHTML = "Success";
}

function checkDivide(marker){
    var check = $('appr_divide').value;
    
    var inside = true;
    
    if (check == 'E'){
        if (!cdivide.Contains(marker.getLatLng())){
            inside = false;
        }
    } else if (check == 'W'){
        if (cdivide.Contains(marker.getLatLng())){
            inside = false;
        }
    }
    return inside;
}


function getOverlay(){
	map.closeInfoWindow();
	var id = this.id;
	if (this.checked){
		$('loading').style.visibility = "visible";
		$('loadText').style.visibility = "visible";
		document.body.style.cursor="wait";
		if (id == "detect"){
			map.addOverlay(detectXML);
		}
		if (id == "impact"){
			map.addOverlay(impactXML);
		}
		if (id == "airshed"){
			map.addOverlay(airshedXML);
			map.addOverlay(ashd_cntrdXML);
		}	
		if (id == "tribe"){
			map.addOverlay(tribeXML);
		}	
/*
		if (id == "id_co"){
            map.addOverlay(idXML);
		}	
		if (id == "mt_co"){
            map.addOverlay(mtXML);
		}	
*/
		if (id == "class1"){
			map.addOverlay(class1XML);
			map.addControl(controlCls1, new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(145,3)));
		}	
			
		$('loading').style.visibility = "hidden";
		$("loadText").style.visibility = "hidden";
		document.body.style.cursor="default";

	}else{ 
		if (id == "detect"){
			map.removeOverlay(detectXML);
		}
		if (id == "impact"){
			map.removeOverlay(impactXML);
		}
		if (id == "airshed"){
			map.removeOverlay(airshedXML);
			map.removeOverlay(ashd_cntrdXML);
		}
		if (id == "tribe"){
			map.removeOverlay(tribeXML);
		}
		if (id == "class1"){
			map.removeOverlay(class1XML);
			map.removeControl(controlCls1);
		}
/*
		if (id == "id_co"){
			map.removeOverlay(idXML);
		}	
		if (id == "mt_co"){
			map.removeOverlay(mtXML);
		}	
*/
	}
}

//Ajax to retrieve xml file for burns
function getBurns(){
	$('loading').style.visibility = "visible";
	$('loadText').style.visibility = "visible";
	document.body.style.cursor = "wait";
	
	setFileParams();
	new Ajax.Request(
			eventXML + fileParams,
		{
			method: "post",
			contentType: 'text/xml',
			onSuccess: parseBurns
		}
	);
}


//parse burn xml
function parseBurns(ajax){

	//xmlDoc = ajax.responseText;
	var xmlDoc = GXml.parse(ajax.responseText);
	
    var eventTag = xmlDoc.documentElement.getElementsByTagName("event");
    	for (var i = 0; i < eventTag.length; i++) {
            if (i > 2000){
                alert('You have queried more than 2000 burns.  The first 2000 by airshed are displayed on the map.');
                break;
            }
            var param = eventTag[i].getElementsByTagName("param");
            var burnParam = new Hash();
            burnParam.set("fid", eventTag[i].getAttribute("fire_id"));
            burnParam.set("type", eventTag[i].getAttribute("type"));
            burnParam.set("member", eventTag[i].getAttribute("member"));
            burnParam.set("office", eventTag[i].getAttribute("office"));
            burnParam.set("unit", eventTag[i].getAttribute("unit"));
            for(var j = 0; j< param.length; j++){
                var test = burnParam.get(param[j].getAttribute("name"));
                if (test == null){
                    burnParam.set(param[j].getAttribute("name"), param[j].getAttribute("value"));
                }
    		}
            var burn = new Burn(burnParam);
            eventArray[count] = burn; 
            map.addOverlay(burn.plotBurn());
            if (!$(burn.marker.grp).checked) {
                burn.marker.hide();
            }else{
                burnNum++;
            }
            burn.makeList();
        }
    $('loading').style.visibility = "hidden";
    $("loadText").style.visibility = "hidden";
    document.body.style.cursor="default";
    
}

function downloadBurns(){
	window.location = 'map_download_burns.cfm' + fileParams + '&layer=' + $("layer").value;
}

//add listener for double-click
function myclick(count) {
		GEvent.trigger(gmarkers[count], "dblclick");
		}

//show or hide (shide) selected markers
function shide(){
	var grp = this.id;
	var checked = this.checked;
	//manageList(grp, checked);
	for (var i=0; i< gmarkers.length; i++) {		
		if (gmarkers[i].grp == grp){
			if(checked){
				gmarkers[i].show();
				$("tr"+i).style.display = displayType;
				burnNum++;
			}else{
				gmarkers[i].hide();
				$("tr"+i).style.display = 'none';
				burnNum--;
				map.closeInfoWindow();
			}	
		}
    }
}

function changeDate(){
	map.closeInfoWindow();
	setFilter($("layer").value,this.id);
	
	var direction = 1;
	var NewStartDate=new Date(SDate);
	
	if (this.id == "burnDate" || this.id == "burnEDate") {
		NewStartDate=new Date(this.value);
	}else{
		if (this.id == "bckDate") {
			direction = -1;
		}
		NewStartDate.setDate(NewStartDate.getDate()+direction);
	}
	
//The following ugly statement fixes IE6,7 incompatibility with CFML
	SDate = String("0" +(NewStartDate.getMonth() + 1)).slice(-2) + "/" + String("0" +NewStartDate.getDate()).slice(-2) + "/" + NewStartDate.getFullYear();
	vSDate = NewStartDate.getFullYear() + "-" + String("0" +(NewStartDate.getMonth() + 1)).slice(-2) + "-" + String("0" +NewStartDate.getDate()).slice(-2);

	if (this.id != "burnDate" && this.id != "burnEDate"){
		$("burnDate").value = SDate;
	}
	
	killMarkers();
	getBurns();
}
function changeDetects(){
	var NewStartDate=new Date(this.value);
	mapDate = NewStartDate.getFullYear() + "" + String("0" +(NewStartDate.getMonth() + 1)).slice(-2) + "" + String("0" +NewStartDate.getDate()).slice(-2);
	if ($("detect").checked){
		map.removeOverlay(detectXML);
	}
	detectXML = new GGeoXml(detectXMLpath + "fireDetectsFETS" + mapDate + ".kml");
	if ($("detect").checked){
		map.addOverlay(detectXML);
	}
}

function changeFilter(){
	map.closeInfoWindow();
	setFilter($("layer").value,this.id);
	
	killMarkers();
	getBurns();
}

//kill all markers
function killMarkers(){
	for(var i = 0; i< gmarkers.length; i++){
		gmarkers[i].remove();
		for (var j = 0; j < tdList.length; j++){
			$("td"+i+tdList[j]).innerHTML = "";
		}
		$("tr"+i).style.display = 'none';
	}
	GEvent.clearListeners(map,"infowindowclose");
	gmarkers = [];
	eventArray = [];
	burnNum = 0;
	count = 0;
    point_list = [];
    point_length = 0;
}

//resets buttons on plot change and refresh
function resetControl(){
	if(isAdmin == "visible"){
		$("burn1").checked = true; 
		$("burn2").checked = false; 
		$("burn3").checked = false; 
	}else{
		$("burn1").checked = false; 
		$("burn2").checked = true; 
		$("burn3").checked = false; 
	}
	$("airshed").checked = false;
	$("impact").checked = false;
	$("detect").checked = false;
}

function initFilters(){
	var initDate = new Date();
	if(isAdmin == "visible"){
		initDate.setDate(initDate.getDate() + 1);
	}
	var date = String("0" +(initDate.getMonth() + 1)).slice(-2) + "/" + String("0" +initDate.getDate()).slice(-2) + "/" + initDate.getFullYear();

	$("burnDate").value = date;
	$("burnEDate").value = date;
	$("fil_elev").value = 0;
	$("fil_acres").value = 100000;
	$("fil_prty").selectedIndex = 0;
	$("fil_air").selectedIndex = 0;
	$("fil_btype").selectedIndex = 0;
	$("fil_state").selectedIndex = 0;
	var layers = $("layer").options;
	for (var i=0;i < layers.length; i++){
		filter_settings[layers[i].value] = new Array();
		filter_settings[layers[i].value]['burnDate'] = date;
		filter_settings[layers[i].value]['burnEDate'] = date;
		filter_settings[layers[i].value]['fil_elev'] = 0;
		filter_settings[layers[i].value]['fil_acres'] = 100000;
		filter_settings[layers[i].value]['fil_btype'] = "All";
		filter_settings[layers[i].value]['fil_state'] = "All";
		filter_settings[layers[i].value]['fil_prty'] = "All";
		filter_settings[layers[i].value]['fil_air'] = "All";
	}
}

function setFilter(layer,filter){
	var val = $(filter).value
	if (filter == 'burnDate' || filter == 'burnEDate'){
		var NewStartDate=new Date($(filter).value);
		val = String("0" +(NewStartDate.getMonth() + 1)).slice(-2) + "/" + String("0" +NewStartDate.getDate()).slice(-2) + "/" + NewStartDate.getFullYear();
	}
	filter_settings[layer][filter] = val;
}
	
function toggleFilters(){
	
	$("burnDate").value = filter_settings[this.value]['burnDate'];
	$("burnEDate").value = filter_settings[this.value]['burnEDate'];
	$("fil_elev").value = filter_settings[this.value]['fil_elev'];
	$("fil_acres").value = filter_settings[this.value]['fil_acres'];
	$("fil_prty").value = filter_settings[this.value]['fil_prty'];
	$("fil_air").value = filter_settings[this.value]['fil_air'];
	$("fil_btype").value = filter_settings[this.value]['fil_btype'];
	$("fil_state").value = filter_settings[this.value]['fil_state'];

}
	
	
////////////////////////////////begin Earthquake class//////////////////////////////////

Burn = Class.create({
	initialize: function(burn){
		this.fid = burn.get('fid');
		this.type = burn.get('type');
		this.mem = burn.get('member');
		this.off = burn.get('office');
		this.uni = burn.get('unit');
		this.loc = burn.get('location');
		this.cat = burn.get('category');
		this.shd = burn.get('airshed');
		this.btyp = burn.get('burntype');
		this.zone = burn.get('zone');
		this.yr = burn.get('year');
		this.mon = burn.get('month');
		this.day = burn.get('day');
		this.lat = burn.get('latitude');
		this.lon = burn.get('longitude');
		this.pacres = burn.get('proj_acres');
		this.acres = burn.get('acres');
		this.tons = burn.get('tonsacre');
		this.elev = burn.get('elevation');
		this.pri = burn.get('priority');
		this.listId;
		this.marker;
		this.point = new GLatLng(this.lat, this.lon);
	},
	//create a date string
	getDate: function(){
		return 	(this.yr + "/" + this.mon + "/" + this.day
				+ " " + "00:00:00");
	},
	
	plotBurn: function(){
        for (i=0; i<point_length; i++){
            if (this.point.equals(point_list[i])){
                this.lat = parseFloat(this.lat)+0.001+0.001*Math.random();
                this.point = new GLatLng(this.lat.toString(), this.lon);
                break;
            }
        }
        point_length = point_list.push(this.point);
        side_bar_html = "";
		var siz = 15;
		var grp = "burn" + this.type; //sets up marker groups
		var burnIcon = new GIcon();
		burnIcon.image = "images/burn_" + this.type + ".png";
		burnIcon.iconSize = new GSize(siz, siz);
		burnIcon.iconAnchor = new GPoint(siz/2, siz/2);
		burnIcon.infoWindowAnchor = new GPoint(siz/2, siz/2);	
		var markerOptions = {icon:burnIcon};
		this.marker = (new GMarker(this.point, markerOptions));
		this.listId = "tr" + count; //give each a unique id so an open window will highlight the list-item
		this.updateWindow();
		this.marker.grp = grp; //add group id to each marker
		var listId = this.listId;
		var marker = this.marker;
		GEvent.addListener(map,"infowindowclose", function() { //restores list-item to un-highlighted
			if (marker.grp == 'burn3'){
				$(listId).style.backgroundColor="#DDDDDD";
			}else if (marker.grp == 'burn2'){
				$(listId).style.backgroundColor="#00FF00";
			}else{
				$(listId).style.backgroundColor="#FFFFFF";
			}
		});

		//the following is to set up the table list
		gmarkers[count] = this.marker;

		side_bar_html = "javascript:myclick(" + count + ")";

		return this.marker;
	},
	
	
	
	//create the table list
	makeList: function(){
		var grp = "burn" + this.type;//sets up marker classes based on appr/prop/compl
		var listId = "tr"+count;
		var a = document.createElement("a");
		Element.extend(a); //IE
		a.href = side_bar_html;
		a.id = "atr" + count;
		if(this.pri == "A"){
			Element.addClassName(a, "pa");
		}else{
			Element.addClassName(a, "pb");
		}
		a.innerHTML= this.mem + " " + this.off;
		$("td"+count+"a").appendChild(a);
		$("td"+count+"a").style.textAlign = 'left';
		var elList = [this.uni,this.loc,this.shd,this.zone,this.elev,this.btyp,this.tons,this.pacres,this.acres,this.pri ]; 

		if (this.zone != 'None'){
			$("td"+count+"e").style.color = "#FF0000";
			$("td"+count+"e").style.fontWeight = "bold";
			//alert(this.zone);
		}else{
			$("td"+count+"e").style.color = "#000000";
			$("td"+count+"e").style.fontWeight = "normal";	
		}
		for (var i=1; i <= elList.length; i++){
			$("td"+count+tdList[i]).innerHTML = elList[i-1];
			if (i < 3){
				$("td"+count+tdList[i]).style.textAlign = 'left';
			}
		}
		
		if ($(grp).checked) {
			$(listId).style.display = displayType;
		}
		
		if (grp == 'burn3'){
			$(listId).style.backgroundColor="#DDDDDD";
		}else if (grp == 'burn2'){
			$(listId).style.backgroundColor="#00FF00";
		}else{
			$(listId).style.backgroundColor="#FFFFFF";
		}
		count ++;
	},
	
	//plots most recent on top
	order: function(){
		return zIndex --;
	},
	
	//creates and updates window. 
	updateWindow: function(){
		var marker = this.marker;
		GEvent.addListener(marker, "click", function() { //Toggle Approved/Proposed
			 if ($("Appr_Active").checked){
				 if (marker.grp == "burn2"){
					marker.setImage("images/burn_1.png");
					marker.grp = "burn1";
				 }else if (marker.grp == "burn1"){
					marker.setImage("images/burn_2.png");
					marker.grp = "burn2";
				 }
			 }
		});

		var windowHtml = this.getHtml();
		var listId = this.listId;
		var point = this.point;
		var time = this.yr + this.mon + this.day + this.hr;
		//add listeners and html to windows
		GEvent.addListener(marker, "RightClick", function() {
		    marker.openInfoWindowHtml(windowHtml);
			$("a"+listId).focus();
			$(listId).style.backgroundColor = "yellow";
		});
		GEvent.addListener(marker, "dblclick", function() {
		    marker.openInfoWindowHtml(windowHtml);
	
			$(listId).style.backgroundColor = "yellow";
		});
	},
	
	//html for info window
	getHtml: function(){
		var name = ["Date:","Unit Name:","Airshed/Impact Zone:","Elevation (ft):","Burn Type:","Loading (t/ac):","Project Acres:","Acres this Date:","Priority:" ];
		var param = [this.mon+"/"+this.day+"/"+this.yr,this.uni,this.shd+"/"+this.zone,this.elev,this.btyp,this.tons,this.pacres,this.acres,this.pri ];
		var html = "<div class = 'burnWin'> \n";
		html += "<strong>" + this.mem + ", " + this.off + "</strong>";	
		html += "<ul> \n";
			for (var i = 0; i < name.length; i++){
				html += "<li>" + name[i]  + "<span>" + param[i] + "</span> </li> \n";
			}
		html += "</ul>";
		return html; 
	}
});


/* 
    Functions for retrieving and tiling WMS layers from an arbitrary source.
    Current sources include govtrack.us (Counties, census info) and USGS (Roads, streams, counties...).
    Functions adapted from http://www.govtrack.us/perl/wms/
*/

function addWMSLayer(layer_name, layer_title,isdefault,usgs) {
        if (usgs){
    		var WMS_URL = 'http://frameworkwfs.usgs.gov/framework/wms/wms.cgi?';
    		var G_MAP_LAYER_FILLED = createWMSTileLayer(WMS_URL, layer_name, null, "image/png", null, null, "CRS:84", .7);
    		var G_MAP_OVERLAY = createWMSOverlayMapType([G_PHYSICAL_MAP.getTileLayers()[0], G_MAP_LAYER_FILLED], layer_title);
        }else{
    		var WMS_URL = 'http://www.govtrack.us/perl/wms/wms.cgi?';
    		var G_MAP_LAYER_FILLED = createWMSTileLayer(WMS_URL, layer_name, null, "image/png", null, null, null, .7);
    		var G_MAP_OVERLAY = createWMSOverlayMapType([G_NORMAL_MAP.getTileLayers()[0], G_MAP_LAYER_FILLED], layer_title);
		}
		G_MAP_OVERLAY.layer = layer_name;
		map.addMapType(G_MAP_OVERLAY);
		if (isdefault) {
			map.setMapType(G_MAP_OVERLAY);
		}
}


CustomGetTileUrl = function(a, b, c) {
	if (typeof(window['this.myMercZoomLevel']) == "undefined") this.myMercZoomLevel = 0;
	if (typeof(window['this.myStyles']) == "undefined") this.myStyles = "";
	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);
	// switch between Mercator and DD if merczoomlevel is set
	//if (this.myMercZoomLevel != 0 && map.getZoom() < this.myMercZoomLevel) {
	//	var lBbox = dd2MercMetersLng(lUL.lngDegrees) + "," + dd2MercMetersLat(lUL.latDegrees) + "," + dd2MercMetersLng(lLR.lngDegrees) + "," + dd2MercMetersLat(lLR.latDegrees);
	//	var lSRS = "EPSG:54004";
	//} else {
		var lBbox = lUL.x + "," + lUL.y + "," + lLR.x + "," + lLR.y;
		var lSRS = "EPSG:4326";
	//}
	var lURL = this.myBaseURL;
	lURL += "&REQUEST=GetMap";
	lURL += "&SERVICE=WMS";
	lURL += "&VERSION=" + this.myVersion;
	lURL += "&LAYERS=" + this.myLayers;
	lURL += "&STYLES=" + this.myStyles;
	lURL += "&FORMAT=" + this.myFormat;
	lURL += "&BGCOLOR=" + this.myBgColor;
	lURL += "&TRANSPARENT=TRUE";
	lURL += "&SRS=" + lSRS;
	lURL += "&BBOX=" + lBbox;
	lURL += "&WIDTH=256";
	lURL += "&HEIGHT=256";
	lURL += "&LABELS=true";
	lURL += "&reaspect=false";
	return lURL;
}

function createWMSTileLayer(wmsURL, wmsLayers, wmsStyles, wmsFormat, wmsVersion, wmsBgColor, wmsSrs, opacity, copyright) {
	var copyCollection;
	if (window.GCopyrightCollection) { // not available for mapplets
		copyCollection = new GCopyrightCollection('');
		if (copyright != null) {
			var c = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, copyright);
			copyCollection.addCopyright(c);
		}
	}
	
	var tile = new GTileLayer(copyCollection, 1, 17);
	tile.myLayers = wmsLayers;
	tile.myStyles = (wmsStyles ? wmsStyles : "");
	;
	tile.myFormat = (wmsFormat ? wmsFormat : "image/gif");
	//tile.mySRS = (wmsSrs ? wmsSrs : "EPSG:54004");
	tile.myVersion = (wmsVersion ? wmsVersion : "1.1.1");
	tile.myBgColor = (wmsBgColor ? wmsBgColor : "0xFFFFFF");
	tile.myBaseURL = wmsURL;
	tile.getTileUrl = CustomGetTileUrl;

	if (opacity) { tile.getOpacity = function() { return opacity; } }

	return tile;
}

function createWMSMapType(layer, gName) {
	var mapType = new GMapType([layer], G_SATELLITE_MAP.getProjection(), gName, G_SATELLITE_MAP);
	return mapType;
}

function createWMSOverlayMapType(layers, gName) {
	return new GMapType(layers, G_SATELLITE_MAP.getProjection(), gName);

}

