//<![CDATA[

var map=null;
var markers;
var gmarkers;
var baseIcon;
var element;
var icons;
var wasdale;
var jobs;
var panelHTML;
var startup=true;
var resizeTimeoutId;
var file="wmrt2009.kml";
var time0;
//var cache;

function dispatcher()
{
//alert("dispatcher "+jobs.length);
if(jobs.length>0)
	{
	//var callback=jobs.pop();
	var filename=jobs.pop();
	loadFile(filename);
	//job+=2;
	}
else
	{
	//alert("loaded markers");
	//loadYears();
	//jobs.length=0;
	//job=0;
	if(startup)
		{
		var nodehead=document.getElementById("topcount");
		nodehead.innerHTML=""+markers.length;
		real_resize();
		startup=false;
		}
	
	createGMarkers();
	loadMarkers();
	//resize();
	
	//var count=markers.length;
	var node=document.getElementById("panel");
	var text=getMarkersHTML(file);
	//alert(text);
	//countMarkers(1)+" major <img height=\"16\" src=\"blue-dot.png\">callouts, "+countMarkers(0)+" minor <img height=\"16\" src=\"grey-dot.png\">callouts.<br>"+
	node.innerHTML=text;
	//setMapWindow();
	///resize();
	//alert("time=" + (new Date().getTime()-time0));
		
	}
}


function real_resize(){
	//alert("resizing");
	var divmap=document.getElementById("map");
	var docheight=document.documentElement.clientHeight;
	divmap.style.height=docheight+'px';
	divmap.style.width=(3*document.documentElement.clientWidth/4)+'px';
	var divpanel=document.getElementById("panel");
	divpanel.style.height=docheight*3/4+'px';
	divpanel.style.scrollable='auto';
	if(map!=null)
		{
		map.checkResize();
		}
}

function resize()
	{
	window.clearTimeout(resizeTimeoutId);
	resizeTimeoutId = window.setTimeout('real_resize();', 10);
	}


function openMarker(i)
{
//gmarkers[i].openInfoWindowHtml("<b>"+markers[i].name+"</b><br><span class='iwstyle'>"+markers[i].description+"</span>", {maxWidth:450});	
GEvent.trigger(gmarkers[i],"click");
}

function clickDispatcher(object,filename)
{

//alert("clickDispatcher");
if(element!=null)
	{
	element.style.fontWeight='normal';
	}
object.style.fontWeight='bold';
element=object;
//jobs.length=0;
jobs.push(filename);
//jobs.push("createMarkers");
file=filename;
unLoadAllMarkers();
dispatcher();
}

function unLoadAllMarkers()
{
if(map==null)return;
map.closeInfoWindow();
for (var i = 0; i < markers.length; i++) 
	{
	if(markers[i].onmap=true)
		{
		map.removeOverlay(gmarkers[i]);
		markers[i].onmap=false;	
		}
	}
}	
	
function loadMarkers()
{
if(map==null)return;
unLoadAllMarkers();

//alert("number of markers="+markers.length);

for (var i = 0; i < markers.length; i++)
	{
	map.addOverlay(gmarkers[i]);
	markers[i].onmap=true;
	}
setMapWindow();
}

//see whether we have a copy of the HTML stored
// return if it exists, create and return of it doesn't
function getMarkersHTML(filter)
{
var text=panelHTML[filter];
if(text!=null)return text;
text="";
//alert("creating text for "+filter);
for (var i = 0; i < markers.length; i++)
	{
	text=text+"<a href=\"javascript:openMarker("+i+")\">"+markers[i].name+"</a><br/>";
	}
panelHTML[filter]=text;
return text;
}

function unLoadMarkers(filter)
{
if(map==null)return;
map.closeInfoWindow();
if(filter.length==0){return 0;}
for (var i = 0; i < markers.length; i++) 
	{
	if(markers[i].name.match(filter)==null)
		{
		continue;
		}
	map.removeOverlay(gmarkers[i]);
	markers[i].onmap=false;
	}
setMapWindow();
}	


function Marker(name,description,type,id,grid,point)
{
this.name=name;
this.description=description;
this.type=type;
this.id=id;
this.grid=grid;
this.point=point;
this.onmap=false;
}

function load()
{
//cache=new Array();
//debugger;
//alert("in load");

//icons=new Array();
jobs=new Array();
panelHTML=new Array();
markers=new Array();

if (!GBrowserIsCompatible())alert("bad browser");
baseIcon = new GIcon();
baseIcon.iconSize=new GSize(32,32);
baseIcon.shadow="http://maps.google.com/mapfiles/shadow50.png"
baseIcon.shadowSize=new GSize(56,32);
baseIcon.iconAnchor=new GPoint(16,32);
baseIcon.infoWindowAnchor=new GPoint(16,0);

wasdale=new GLatLng(54.459287, -3.261008);
var divmap=document.getElementById("map");
//divmap.style.height=document.documentElement.clientHeight+'px';
//divmap.style.width=(3*document.documentElement.clientWidth/4)+'px';
//divmap.style.width=1000+'px';
//divmap.style.height=document.documentElement.clientHeight+'px';
//divmap.style.height=96 +'%';

map = new GMap2(divmap);
map.addControl(new GLargeMapControl());
//map.addControl(new GMapTypeControl());
map.setCenter(wasdale, 12);
map.setMapType(G_SATELLITE_MAP);
//map.enableContinuousZoom();
//map.enableScrollWheelZoom();

jobs.push("wmrt2009.kml");
jobs.push("Features.kml");
//jobs.push("createFeatures");
//jobs.push("createMarkers");
//job=0;
element=document.getElementById("itop");
dispatcher();
}


function createMarkers(xml)
{
//var date = new Date();
//var time0=date.getMilliseconds();

//createMarkers0(xml);
var placemarks = xml.getElementsByTagName("Placemark");
markers=new Array();
//alert(placemarks.length);
for (var i = 0; i < placemarks.length; i++)
	{
 	var nodes=placemarks[i].childNodes;
 	var marker=new Object();

	for(var j=0;j<nodes.length;j++)
	 	{
	 	var child=nodes[j].firstChild;
	 	if(child==null)continue;
	 	var childname=nodes[j].nodeName;
	 	var childvalue=nodes[j].firstChild.nodeValue;
 	
	 	if(childname=="name"){marker.name=childvalue;continue;}
	 	if(childname=="description"){marker.description=childvalue;continue;}
	 	if(childname=="Point")
		 	{
		 	var nodes0=nodes[j].childNodes;
		 	if(nodes0==null)continue;
	 		for(var k=0;k<nodes0.length;k++)
			 	{
			 	var child=nodes0[k];
			 	if(child.nodeName=="coordinates")
			 		{
				 	var coords=child.firstChild.nodeValue.split(",");
			 		if(coords.length==3)
		 			marker.point = new GLatLng(parseFloat(coords[1]),parseFloat(coords[0]));
		 			}
			 	}
			continue;
		 	}
		 if(childname=="Metadata")
	 		{
	 		marker.id=null;
	 		var metadata=nodes[j].childNodes;
	 		if(metadata==null)continue;
	 		for(var k=0;k<metadata.length;k++)
			 	{
			 	var metachild=metadata[k].firstChild;
			 	if(metachild==null)continue;
			 	var metachildname=metadata[k].nodeName;
			 	var metachildvalue=metadata[k].firstChild.nodeValue;
			 	if(metachildname=="type")	{marker.type=metachildvalue;continue;}
			 	if(metachildname=="id")		{marker.id=metachildvalue;continue;}
			 	if(metachildname=="grid")	{marker.grid=metachildvalue;continue;}			 	
			 	}
			continue;
	 		}
	 	if(childname=="LineString")
		 	{
		 	var nodes0=nodes[j].childNodes;
		 	if(nodes0==null)continue;
	 		for(var k=0;k<nodes0.length;k++)
			 	{
			 	var child=nodes0[k];
			 	if(child.nodeName=="coordinates")
			 		{
					var vertex=child.firstChild.nodeValue.split(" ");
					var n=0;
					marker.points=new Array();
					for(var m=0;m<vertex.length;m++)
			 			{
			 			var coords=vertex[m].split(",");
			 			if(coords.length==3)
			 				{
			 				marker.points[n]=new GLatLng(parseFloat(coords[1]),parseFloat(coords[0]));
							n++;
							}
		 				}
		 			}
			 	}
			}
	 	}
	processMarker(marker);
	}
//cache[file]=markers;
//alert(cache.length);
//alert("time=" + (new Date().getTime()-time0));
dispatcher();
}

function processMarker(marker)
{
if(marker.point==null)
	{
	//alert(marker.name);
	}
switch(marker.type)
	{
	case "0":case "1":markers.push(marker);
	break;
	case "2": // mountain marker
		var bicon = new GIcon();
		bicon.iconSize=new GSize(24,24);
		bicon.shadow="http://maps.google.com/mapfiles/kml/shapes/triangles.png";
		bicon.shadowSize=new GSize(32,24);
		bicon.iconAnchor=new GPoint(12,12);
		bicon.infoWindowAnchor=new GPoint(12,12);
		var ficon=new GIcon(bicon);
		ficon.image="http://maps.google.com/mapfiles/kml/shapes/triangle.png";
		
		//var marker=new Marker(name,"<span class='iwstyle'>"+description+"</span>",0,null,null,points[0]);
		var feature=createGMarker(marker,ficon);
		if(feature!=null)
			map.addOverlay(feature);
		break;
	case "3": // mountain path
		var line=new GPolyline(marker.points,"#ffffff",2,0.5);
		map.addOverlay(line);
		var bicon = new GIcon();
		bicon.iconSize=new GSize(8,8);
		bicon.iconAnchor=new GPoint(4,4);
		bicon.infoWindowAnchor=new GPoint(4,4);
	
		var ficon=new GIcon(bicon);
		ficon.image="white-spot.png";
		marker.point=marker.points[0];
		var feature=createGMarker(marker,ficon);
		if(feature!=null)
			map.addOverlay(feature);
		
		var ficon0=new GIcon(bicon);
		ficon0.image="white-spot.png";
		var pend=marker.points.length;
		marker.point=marker.points[pend-1];
		var feature0=createGMarker(marker,ficon);
		if(feature0!=null)
			map.addOverlay(feature0);
		break;
	default: alert("bad type="+marker.type); break;
	}
}


function createGMarkers()
{
if(markers.length==0)return;
icons=new Array();
gmarkers=new Array();
for (var i = 0; i < markers.length; i++) 
	{
 	icons[i]=new GIcon(baseIcon);
	icons[i].image = markers[i].type==1 ? "blue-dot.png" : "grey-dot.png";
	gmarkers[i]=createGMarker(markers[i],icons[i]);
	}
}

function createGMarker(marker,myicon)
{
if(marker.point==null)
	{
	//alert("point is null");
	return null;
	}
var gmarker = new GMarker(marker.point, {icon:myicon, title:marker.name});

GEvent.addListener(gmarker, "click", function()
	{
	gmarker.openInfoWindowHtml(getText(marker), {maxWidth:450});
	});
return gmarker;
}

function getText(marker)
{
var text="";
if(marker.name!=null)
	text=text+"<b>"+marker.name+"</b>";
if(marker.id!=null)
	{text=text+"&nbsp;<span class='idstyle'>callout&nbsp;"+marker.id+"</span>";}
if(marker.description!=null)
	text=text+"<br><span class='iwstyle'>"+marker.description+"</span>";
if(marker.grid!=null)
	text=text+"<br><span class='idstyle'>"+marker.grid+"</span>";	
return text;
}

function countMarkers(mytype)
{
var count=0;
for (var i = 0; i < markers.length; i++)
	{
	if(markers[i].type!=mytype)
		{
		continue;
		}
	count++;
	}
return count;
}



function loadFile(filename)
{
time0=new Date().getTime();

//if(cache[filename]!=null)
//	alert("got "+filename);
file=filename;
//node.innerHTML="Loading.";
//debugger;
//alert("loadFile "+filename);
var loader=getLoader();
if(loader)
	{
	loader.onreadystatechange = function(){
	//var node=document.getElementById("panel");
	//node.innerHTML="Loading..."+filename+" "+loader.readyState;
	if (loader.readyState == 4) 
			{
			//alert(loader.status);
			if (loader.status == 200)
				{
				//node.innerHTML="Processing..."+filename;
				createMarkers(loader.responseXML);
				//eval(callback +'(loader.responseXML)');
				
				} 
			else 
				{
				alert("There was a problem retrieving the XML data: " + loader.statusText);
				//node.innerHTML="";
				}	
			}
	}
	loader.open("GET",filename,true);
	loader.setRequestHeader("Content-Type","text/xml;charset=utf-8");
	//loader.setRequestHeader("If-Modified-Since","Sat, 1 Jan 2000 00:00:00 GMT");
	loader.send(null);
	}
else 
	{
	alert("the loader was null");
	}
}


function getLoader()
{

var object = false;
// branch for native XMLHttpRequest object
if(window.XMLHttpRequest && !(window.ActiveXObject)) 
	{
	try 
		{
		object = new XMLHttpRequest();
		} 
	catch(e) 
		{
		object = false;
		}
// branch for IE/Windows ActiveX version
	} 
else
	{
	 if(window.ActiveXObject)  
		{
		try 
			{
			object = new ActiveXObject("Msxml2.XMLHTTP");
			} 
		catch(e) 
			{	
			try 
				{
				object = new ActiveXObject("Microsoft.XMLHTTP");
				} 
			catch(e) 
				{
				object = false;
				}
			}
		}	
	}
return object;
}


function setMapWindow()
{
var bounds = new GLatLngBounds();
//map.setCenter(new GLatLng(0,0),0);
var empty=true;
var count=0;
for (var i = 0; i < markers.length; i++) 
	{
	if(markers[i].onmap==true)
		{
		//alert(markers[i].point);	
		bounds.extend(markers[i].point);
		count++;
		empty=false;
		}
	}


if(empty==false)
	{
	var zoom=map.getBoundsZoomLevel(bounds);
	//alert("zoom= " + zoom + ", center= "+bounds.getCenter());

	zoom = zoom > 14 ? 14 : zoom;
	map.setZoom(zoom);
	map.panTo(bounds.getCenter());
	//alert("new zoom="+zoom+" count="+count);
	}
else
	alert("setMapWindow is empty");
}
    //]]>