var map;
var NOTAMNOTFOUND = "No available notams found for this search!";
var infoWindows = [];
var infoIndex = 0;
//map mode notam text, div id is "infodiv"
var mapNotamDiv;
//full text mode notam text
var textNotamDiv;


function InitMap() {
	//if(map == null) {
		map = new GMap2(document.getElementById("map"));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.addControl(new GScaleControl());
		map.addControl(new GOverviewMapControl());
		map.setCenter(new GLatLng(39.8098, -98.5539), 4);
	//}
}

function GetDiv(divid) {
	//lazy load "infodiv" and "textNotam" divs, reduce the number of expensive "getElementById" calls
	if(divid == "infodiv") {
		if(mapNotamDiv == null)
			mapNotamDiv = document.getElementById("infodiv");
		
		return mapNotamDiv;
	} else {
		if(textNotamDiv == null)
			textNotamDiv = document.getElementById("textNotam");
			
		return textNotamDiv;
	}
}

function PreloadImages() {
	var imageobj = new Image();
	
	var imageUrl = [];
	imageUrl[0] = "images/facility.gif";
	imageUrl[1] = "images/laser.gif";
	imageUrl[2] = "images/tfr.gif";
	imageUrl[3] = "images/mm_20_green.png";
	imageUrl[4] = "images/mm_20_shadow.png";
	imageUrl[5] = "images/tower.gif";
	
	for(var x = 0; x < imageUrl.length; x++) {
		imageobj.src = imageUrl[x];
	}
	
	imageobj = null;
	imageUrl = null;
}

function LaunchNotamSearch() {
	var strSearch = document.getElementById('txtSearch').value;
	var strRadius = '20';
	window.location.href = "notam.aspx?search=" + strSearch + "&radius=" + strRadius;
}

function SearchNotams(strSearch, strRadius) {
	var response = NotamAjax.GetNotams('domestic', strSearch, strRadius, GetNotams_Callback);
	ShowWaitingScreen();
}

function LaunchAllTFR() {
	//var strSearch = document.getElementById('txtSearch').value;
	window.location.href = "notam.aspx?search=ALLTFR";
}

function GetStoredNotams(key) {
	var response = NotamAjax.GetStoredNotams(key, GetNotams_Callback);
}

function GetNotams_Callback(r) {
	HideWaitingScreen();
	if(r.value != null) {
		InitMap();
		CreateNotamMarkers(r.value);
	} else {
		var infodiv = GetDiv("infodiv");
		infodiv.innerHTML = '<p><span class=nomatches>' + NOTAMNOTFOUND + '</span></p>';
	}
}

function FilterNotams(strFilterText, strFilterAction) {
	var response = NotamAjax.FilterNotams(strFilterText, strFilterAction, FilterNotams_Callback);
}

function FilterNotams_Callback(r) {
	
}


function ShowWaitingScreen() {
	var divinfo = GetDiv("infodiv");
	var waitmsg; 
	waitmsg = '';
	waitmsg += '<p>&nbsp;</p><p align=center><span class=\'msgwaiting\'>Please wait while the search runs</span><br><img src=\'images/waiting.gif\'></p>';
	/**
	waitmsg = waitmsg + '<table border=\'0\' cellpadding=\'0\' cellspacing=\'4\'>';
	waitmsg = waitmsg + '<tr><td id=\'wait1\' class=\'waitNormal\'>&nbsp;</td><td id=\'wait2\' class=\'waitNormal\'>&nbsp;</td>';
	waitmsg = waitmsg + '<td id=\'wait3\' class=\'waitNormal\'>&nbsp;</td><td id=\'wait4\' class=\'waitNormal\'>&nbsp;</td></tr>';
	waitmsg = waitmsg + '</table>';
	**/
	if(divinfo != null)
		divinfo.innerHTML = waitmsg;
		
}

function HideWaitingScreen() {
	var divinfo = GetDiv("infodiv");
	if(divinfo != null)
		divinfo.innerHTML = '';
}

function CreateNotamMarkers(sXml) {
	
	var xmlDoc = GXml.parse(sXml);
	
	var infodiv = GetDiv("infodiv");
	infodiv.innerHTML = '';
	
	//create facility markers
	var markers = xmlDoc.documentElement.getElementsByTagName("facility");
	for (var i = 0; i < markers.length; i++) {
		var facid = markers[i].getAttribute("facid");
		var facname = markers[i].getAttribute("facname");
		var nodes = markers[i].childNodes;
		
		var facHtml = GetFacilityHTML(markers[i]);
		var notamHtml = GetFacilityNotamHTML(markers[i]);
		
		var lng = markers[i].getAttribute("lng")
		var lat = markers[i].getAttribute("lat")
		
		if(lng != '' && lat != '' && nodes.length > 0) {
			
			WriteFacilityLink(facid, facname, lat, lng);
			
			var tabs = [];
			
			//tabs.push(new CreateInfoWindowTab(" Notams (" + nodes.length + ") ", notamHtml));
			//tabs.push(new CreateInfoWindowTab(" Airport (" + facid + ") ", facHtml));
			tabs[tabs.length] = new CreateInfoWindowTab(" Notams (" + nodes.length + ") ", notamHtml);
			tabs[tabs.length] = new CreateInfoWindowTab(" Airport (" + facid + ") ", facHtml);
			
			var marker = CreateFacilityMarker(facid, lng, lat, tabs);
			map.addOverlay(marker);
			
			/*
			var lblicon = new GIcon();
			lblicon.image = "notamlabel.aspx?id=" + facid;
			lblicon.iconSize = new GSize(35, 15);
			
			var lblpoint = new GLatLng(parseFloat(lat) - .05, parseFloat(lng) - .05);
			var lblmarker = new GMarker(lblpoint, lblicon);
			
			map.addOverlay(lblmarker);
			*/
		}
		CreateNotamInfo(facid, facname, nodes);
	}
	
	//create notam coordinate markers
	CreateNotamCoordMarkers(xmlDoc);
	
	//create route polyline
	markers = xmlDoc.documentElement.getElementsByTagName("route");
	var points = [];
	points = CreatePoints(markers, "lng", "lat", false, "");
	if(points.length > 1)
		map.addOverlay(new GPolyline(points, '#0000FF'));
	
	//center map
	markers = xmlDoc.documentElement.getElementsByTagName("map");
		
	var centerlat = new Number(parseFloat(markers[0].getAttribute("lat")));
	var centerlng = new Number(parseFloat(markers[0].getAttribute("lng")));
	var center = new GLatLng(centerlat, centerlng);
	map.setCenter(center);
	map.setZoom(parseInt(markers[0].getAttribute("zoom")));

	points = null;
	center = null;
	markers = null;
}

function CreateNotamCoordMarkers(xml) {

	var markers = xml.documentElement.getElementsByTagName("innerMarker");
	
	for (var i = 0; i < markers.length; i++) {
		var coordid = markers[i].getAttribute("id");
		var nodes = markers[i].childNodes;
				
		if(nodes.length > 1) {
			//create bounded polyline (multiple lat/lng coordinates)
			var points = [];
			
			points = CreatePoints(nodes, "lng", "lat", true, coordid);
			
			if(points.length > 1) {
				//points.push(points[0]);
				points[points.length] = points[0];
				map.addOverlay(new GPolyline(points, '#FF0000'));

			points = null;
			}
		} else {	
			//create a circle boundry polyline (center coordinate w/ radius)
			var nodelat = nodes[0].getAttribute("lat");
			var nodelng = nodes[0].getAttribute("lng");
			var parentNode = nodes[0].parentNode.parentNode;
			
			var notamid = parentNode.getAttribute("notamid");
			var notamType = parentNode.getAttribute("notamtype");
			var notamtext = parentNode.getAttribute("notamtext");
			
			var notamHtml = GetParentNotamHTML(notamtext);
			
			WriteNotamLink(notamid, notamType, notamtext, nodelat, nodelng);
			
			var tabs = [];
			//tabs.push(new CreateInfoWindowTab(" Notams (" + nodes[0].length + ") ", notamHtml));
			tabs[tabs.length] = new CreateInfoWindowTab(" Notams (" + nodes[0].length + ") ", notamHtml);
			
			//var notamType = nodes[0].parentNode.parentNode.getAttribute("notamtype");
			
			var gmarker = CreateCoordMarker(coordid, nodelng, nodelat, notamType, tabs);
			map.addOverlay(gmarker);
			
			/*
			var lblicon = new GIcon();
			lblicon.image = "notamlabel.aspx?id=" + notamid;
			lblicon.iconSize = new GSize(35, 15);
			
			var lblpoint = new GLatLng(parseFloat(nodelat) - .05, parseFloat(nodelng) - .05);
			var lblmarker = new GMarker(lblpoint, lblicon);
			
			map.addOverlay(lblmarker);
			*/
			
			var circleNodes = nodes[0].childNodes;
			if(circleNodes.length > 0) {
				var points = [];
				
				points = CreatePoints(circleNodes, "circlelng", "circlelat", false, "");
				
				if(points.length > 1) {
					//points.push(points[0]);
					points[points.length] = points[0];
					map.addOverlay(new GPolyline(points, '#FF0000'));
				}

				points = null;
			}
			
			tabs = null
			gmarker = null;
			circleNodes = null;
		}
		
		nodes = null;
	}
	
	markers = null;
}


function WriteFacilityLink(facid, facname, lat, lng) {
	var infodiv = GetDiv("infodiv");
	if(infodiv != null) {
		var strHtml = infodiv.innerHTML;
		strHtml += '<div style=\'display:inline;width=25px\'>';
		strHtml += '<img src=\'images/facility.gif\' alt=\'Facility\'>';
		strHtml += '</div>';
		strHtml += '<a href=\'#\' id=' + facid + ' onclick=\'javascript:OpenInfoWindow(' + infoIndex + ',' + lat + ',' + lng + ');return false;\'>' + facid + '</a>: ' + facname;
		strHtml += '<br/>';
		infodiv.innerHTML = strHtml;
	}
}

function WriteNotamLink(notamid, notamType, notamtext, lat, lng) {
	var infodiv = GetDiv("infodiv");
	if(infodiv != null) {
		var strHtml = infodiv.innerHTML;
		strHtml += '<div style=\'display:inline;width=25px\'>';
		strHtml += GetNotamIconImage(notamType, 'MAP');
		strHtml += '</div>';
		strHtml += '<a href=\'#\' id=' + notamid + ' onclick=\'javascript:OpenInfoWindow(' + infoIndex + ',' + lat + ',' + lng + ');return false;\'>' + notamid + '</a>: ' + notamtext.substring(9, 41) + '. . .';
		strHtml += '<br/>';
		infodiv.innerHTML = strHtml;
	}
}

function GetNotamIconImage(notamType, mode) {
	var strHtml = '';
	switch(notamType) {
		case "FACILITY":
			strHtml += '<img src=\'images/facility.gif\' alt=\'Facility\'>';
			break;
		case "LASER":
			strHtml += '<img src=\'images/laser.gif\' alt=\'Laser\'>';
			break;
		case "FLIGHT_RESTRICTION":
			strHtml += '<img src=\'images/tfr.gif\' alt=\'Flight Restriction\'>';
			break;
		case "TOWER":
			strHtml += '<img src=\'images/tower.gif\' alt=\'Tower\'>';
			break;
		default:
			if(mode == 'MAP')
				strHtml += '<img src=\'images/mm_20_green.png\' alt=\'Other\'>';
			break;
	}
	return strHtml;
}

function OpenInfoWindow(index, lat, lng) {
	var point = new GLatLng(parseFloat(lat).toFixed(4), parseFloat(lng).toFixed(4));
	map.openInfoWindowTabsHtml(point, infoWindows[index], {maxWidth:300});
	map.panTo(point);
	return false;
}


function CreateNotamInfo(facid, facname, nodes) {
	var infodiv = GetDiv("textNotam");
	var strHtml = infodiv.innerHTML;
	
	strHtml += '<table width="100%" class="notamTable">'
	strHtml += '<tr><td class=notamTableHeader colspan=3><a name=' + facid + '>' + facid + '</a>: ' + facname + '</td></tr>';
	for(var i = 0; i < nodes.length; i++) {
		var notamid = nodes[i].getAttribute("notamid");
		var notamtext = nodes[i].getAttribute("notamtext");
		var notamType = nodes[i].getAttribute("notamtype");
		
		if(i % 2 == 0)
			strHtml += '<tr class=notamTableRow>';
		else
			strHtml += '<tr class=notamTableRowAlt>';
		
		strHtml += '<td width="5%" valign="top" class=notamTableCol1>';
		strHtml += GetNotamIconImage(notamType, 'TEXT');
		strHtml += '</td>';
		strHtml += '<td width="10%" valign="top" class=notamTableCol1>';
		
		if(notamType == "CANCELLED") {
			strHtml += '<font class=\'cancelled\'>';
			strHtml += notamid;
			strHtml += '</font>';
		} else {
			strHtml += notamid;
		}
			
		strHtml += '</td><td width="85%" class=notamTableCol2>';
		
		if(notamType == "CANCELLED") {
			strHtml += '<font class=\'cancelled\'>';
			strHtml += notamtext;
			strHtml += '</font>';
		} else {
			strHtml += notamtext;
		}
	
		strHtml += '</td></tr>';
	}
	strHtml += '</table>';
	infodiv.innerHTML = strHtml;
}

function CreateCoordAnchors(coordstr) {
	var infodiv = GetDiv("infodiv");
	var strHtml = infodiv.innerHTML;
	var strNewHtml = '';
	var reg = new RegExp(coordstr,"gi");
	var matches;
	
	if(reg.test(strHtml)) {
		matches = strHtml.match(reg);
		if(matches != null)
			strNewHtml = strHtml.replace(reg, "<a class='coord' name='" + matches[0] + "'>" + matches[0] + "</a>");
	}
	if(strNewHtml == '')
		strNewHtml = strHtml;
	infodiv.innerHTML = strNewHtml;

	//infodiv = null;
}

function startAutoComplete() {
	setTimeout("AutoCompleteSearch();", 1000);
}

function AutoCompleteSearch() {
	var txtbox = document.getElementById("txtSearch");
	var response = NotamAjax.GetAutoCompleteValues(txtbox.value, AutoComplete_Callback);
}

function AutoComplete_Callback(r) {
	var infodiv = GetDiv("infodiv");
	infodiv.innerHTML = '';
	if(r.value != null) {
		for(var x = 0; x < r.value.length; x++)
			infodiv.innerHTML += r.value[x] + '<br>';
	}
}

function submitenter(myfield,e) {
	var keycode;

	if (window.event) keycode = window.event.keyCode;
	else if (e) keycode = e.which;
	else return true;

	if (keycode == 13) {
		LaunchNotamSearch();
		return false;
	} else
		return true;
}

function GetFacilityHTML(marker) {
	var facid = marker.getAttribute("facid");
	var facname = marker.getAttribute("facname");
	var nodeslength = marker.childNodes.length;
	var facHTML = facid + ': ' + facname + '<br>Notams: (' + nodeslength + ')';
	return facHTML;
}

function GetFacilityNotamHTML(marker) {
	var nodes = marker.childNodes;
	var strHtml = '';
	strHtml += '<div style="OVERFLOW:auto;WIDTH:300px;HEIGHT:200px;">';
	strHtml += '<table border=0>'
	for(var i = 0; i < nodes.length; i++) {
		var notamid = nodes[i].getAttribute("notamid");
		var notamtext = nodes[i].getAttribute("notamtext");
		var notamType = nodes[i].getAttribute("notamtype");
		
		if(i % 2 == 0)
			strHtml += '<tr class=notamTableRow>';
		else
			strHtml += '<tr class=notamTableRowAlt>';
		
		strHtml += '<td>';
		if(notamType == "CANCELLED") {
			strHtml += '<font class=\'cancelled\'>';
			strHtml += notamtext;
			strHtml += '</font>';
		} else {
			strHtml += notamtext;
		} 
		strHtml += '</td></tr>';
	}
	nodes = null;
	
	strHtml += '</table>';
	strHtml += '</div>';
	return strHtml;
}

//method used to be GetNotamHTML, and took in a node object
function GetParentNotamHTML(notamtext) {
	var strHtml = '';
	//var notamtext = node.parentNode.parentNode.getAttribute("notamtext");
	strHtml += '<div style="OVERFLOW:auto;WIDTH:300px;HEIGHT:200px;">';
	strHtml += notamtext;
	strHtml += '</div>';
	return strHtml;
}

function FilterFacility() {
	var response = NotamAjax.NotamAjax(FilterFacility_Callback);
}

function FilterFacility_Callback(r) {
	if(r.value != null) {
		CreateNotamMarkers(r.value);
	} else {
		/*
		var infodiv = document.getElementById("infodiv");
		infodiv.innerHTML = '<p><span class=nomatches>' + NOTAMNOTFOUND + '</span></p>';
		*/
	}
}

 function CreateFacilityMarker(facid, lng, lat, tabs) {
	var point = new GLatLng(parseFloat(lat), parseFloat(lng));
	var icon = CreateIcon("FACILITY");
	var marker = new GMarker(point, icon);
	//var factabs = tabs;
	//infoWindows.push(tabs);
	infoWindows[infoWindows.length] = tabs;
	GEvent.addListener(marker, 'click', function() {
		this.openInfoWindowTabsHtml(tabs, {maxWidth:300});
	});
	infoIndex++;
	return marker;
}
    
function CreateCoordMarker(coordid, lng, lat, notamType, tabs) {

	var point = new GLatLng(parseFloat(lat), parseFloat(lng));
	var icon = CreateIcon(notamType);
	var marker = new GMarker(point, icon);
	//infoWindows.push(tabs);
	infoWindows[infoWindows.length] = tabs;
	GEvent.addListener(marker, 'click', function() {
		this.openInfoWindowTabsHtml(tabs, {maxWidth:300});
		map.panTo(new GLatLng(parseFloat(lat).toFixed(4), parseFloat(lng).toFixed(4)));
	});
	infoIndex++;
	return marker;
}

function CreateIcon(notamType) {
	var icon = new GIcon();
	switch(notamType)
	{
		case "LASER":
			icon.image = "images/laser.gif";
			break;
		case "FLIGHT_RESTRICTION":
			icon.image = "images/tfr.gif";
			break;
		case "FACILITY":
			icon.image = "images/facility.gif";
			break;
		case "TOWER":
			icon.image = "images/tower.gif";
			break;
		default:
			icon.image = "images/mm_20_green.png";
			break;
	}
	//icon.image =  "images/mm_20_green.png";
	icon.shadow = "images/mm_20_shadow.png";
	icon.iconSize = new GSize(20, 20);
	icon.shadowSize = new GSize(22, 20);
	icon.iconAnchor = new GPoint(6, 20);
	icon.infoWindowAnchor = new GPoint(5,1);
	return icon;
}

function CreateInfoWindowTab(label, content) {
	var tab = new GInfoWindowTab(label, content);
	return tab;
}

function CreatePoints(nodes, lngattrib, latattrib, createMarker, coordid)
{
	var points = [];
	
	var lastnotamid = '';
	
	for(var x = 0; x < nodes.length; x++) {
		var nodelat = nodes[x].getAttribute(latattrib);
		var nodelng = nodes[x].getAttribute(lngattrib);
		var parentNode = nodes[x].parentNode.parentNode;
		
		
		var notamHtml = '';
		
		var point = new GLatLng(parseFloat(nodelat), parseFloat(nodelng));
		//points.push(point);
		points[points.length] = point;
		
		if(createMarker == true) {
			//var notamid = nodes[x].parentNode.parentNode.getAttribute("notamid");
			//var notamHtml = GetNotamHTML(nodes[x]);
			var notamid = parentNode.getAttribute("notamid");	
			var notamtext = parentNode.getAttribute("notamtext");			

			if(lastnotamid == notamid) {
				notamHtml += GetParentNotamHTML(notamtext);
			} else {
				
				var notamType = parentNode.getAttribute("notamtype");
				
				var tabs = [];
				notamHtml = '';
				notamHtml = GetParentNotamHTML(notamtext);
				//tabs.push(new CreateInfoWindowTab(" Notams (" + nodes[x].length + ") ", notamHtml));
				tabs[tabs.length] = new CreateInfoWindowTab(" Notams (" + nodes[x].length + ") ", notamHtml);
				
				//var notamType = nodes[x].parentNode.parentNode.getAttribute("notamtype");
				//var notamtext = nodes[x].parentNode.parentNode.getAttribute("notamtext");
					

				WriteNotamLink(notamid, notamType, notamtext, nodelat, nodelng);
				
				//var notamType = nodes[x].parentNode.parentNode.getAttribute("notamtype");
				
				var gmarker = CreateCoordMarker(coordid, nodelng, nodelat, notamType, tabs);
				map.addOverlay(gmarker);
				lastnotamid = notamid;
				gmarker = null;
				tabs = null;
			}
		}

		var parentNode = null;
	}
	
	return points;
}

