var XMLdoc = null;
var layerDetour = null;

function mapEvent(event)
{
	var b=map.getExtent();
	if(b.getWidth()<150000 && b.getHeight()<150000)
	{
		b=b.transform(GooglePrj,WGS84);

		var bw=Math.pow(2,Math.floor(Math.log(b.getWidth())/Math.log(2)));
		var bh=Math.pow(2,Math.floor(Math.log(b.getHeight())/Math.log(2)));

		b.left=Math.floor(b.left/bw)*bw;
		b.bottom=Math.floor(b.bottom/bh)*bh;
		b.right=Math.ceil(b.right/bw)*bw;
		b.top=Math.ceil(b.top/bh)*bh;


		if(!bounds.containsBounds(b))
		{
			$("status").innerHTML = "Loading detours ...";
			$("status").style.backgroundColor="yellow";
			importXML("detours.php?bbox="+b.toBBOX());
			//importXML("data.osm");
			bounds=b;
		}
		else if($("status").innerHTML == "Zoom in, to load detours!") 
		{
			$("status").innerHTML = "Ready";
			$("status").style.backgroundColor="green";
		}
	}
	else if($("status").innerHTML != "Loading detours ...")
	{ 
		$("status").innerHTML = "Zoom in, to load detours!";
		$("status").style.backgroundColor="orange";
	}
}

function loadError()
{
	$("status").innerHTML = "Error loading detours!";
	$("status").style.backgroundColor="red";
	delete bounds;
	bounds = new OpenLayers.Bounds();
}

var selectControl, selectedFeature;

function onPopupClose(evt) 
{
	selectControl.unselect(selectedFeature);
}

function onFeatureSelect(feature) 
{
    selectedFeature = feature;
    var bound=feature.geometry.getBounds();
    layerDetour.drawFeature(feature,{ strokeColor: "#FFC000", strokeWidth: 5});
    popup = new OpenLayers.Popup("Umleitung", new OpenLayers.LonLat(bound.left,bound.bottom), null, feature.text, true, onPopupClose);
    popup.autoSize=true;
    feature.popup = popup;
    map.addPopup(popup);
}

function onFeatureUnselect(feature) 
{
    map.removePopup(feature.popup);
    layerDetour.drawFeature(feature);
    feature.popup.destroy();
    feature.popup = null;
    selectedFeature=null;
}    

function showDetours()
{
	if (!XMLdoc.documentElement) {loadError(); return;}
	if (XMLdoc.documentElement.tagName == 'error') {loadError(); return;}

	var nodes=getNodes();
	var ways=getWays();
	var relations=XMLdoc.getElementsByTagName("relation");

	if(selectedFeature) 
	{
		map.removePopup(selectedFeature.popup);
		selectedFeature=null;
	}
	layerDetour.destroyFeatures();

	for (var i = 0; i < relations.length; i++)
	{
		var typ="";
		var ref="";
		var dest="";
		var detour="";
		var id=relations[i].getAttribute("id");
		var user=relations[i].getAttribute("user");

		var tags=relations[i].getElementsByTagName("tag");
		for (var j = 0; j < tags.length; j++)
		{
			switch(tags[j].getAttribute("k"))
			{
			case "route":
				typ = tags[j].getAttribute("v"); break;
			case "ref":
				ref= tags[j].getAttribute("v"); break;
			case "detour":
				detour= tags[j].getAttribute("v"); break;
			case "destination":
				dest= tags[j].getAttribute("v"); break;
			}
		}
		delete tags;

		if(typ!="detour") continue;
		
		var members=relations[i].getElementsByTagName("member");

		var linestyle;
		if(Number(ref.substr(1,3))%2) linestyle = { strokeColor: "#000000", strokeWidth: 2, hoverStrokeColor: "#00FF00"};
		else linestyle = { strokeColor: "#0000FF", strokeWidth: 2, hoverStrokeColor: "#00FFFF"};
		
		var lines=new Array();
		var bbox=new OpenLayers.Bounds();

		for (j = 0; j < members.length; j++)
		{

			if(members[j].getAttribute("type")=="way")
			{
				way = ways[members[j].getAttribute("ref")];
				var pts= new Array(way.pt.length);
				
				for (var k = 0; k < way.pt.length; k++)
				{
					node = nodes[way.pt[k]];
					var pt = new OpenLayers.Geometry.Point(node.lon,node.lat);
					bbox.extend(pt);
					pts.push(pt.transform(WGS84, GooglePrj));
				}

				lines.push(new OpenLayers.Geometry.LineString(pts));
				delete pts;
			}
		}

		var multiLineFeature =  new OpenLayers.Feature.Vector(new OpenLayers.Geometry.MultiLineString(lines),null,linestyle);

		multiLineFeature.text ="<span style='background-color: #0000FF; color:#FFFFFF; font-weight: bold; '>&nbsp;"+ref+"&nbsp;</span>"	;
		if(detour) multiLineFeature.text += " "+detour;
		if(dest) multiLineFeature.text += " - "+dest;
		multiLineFeature.text += "<br><b>Relation</b> <a href='http://api.openstreetmap.org/api/0.6/relation/"+ id + "' target='browse' title='get osm-xml'>"+ id + "</a>";
		multiLineFeature.text += " [<a href='http://www.openstreetmap.org/browse/relation/"+id+"' target='browse' title='browse'>B</a>]";
		multiLineFeature.text += " [<a href='http://www.openstreetmap.org/?lat="+bbox.getCenterLonLat().lat+"&lon="+bbox.getCenterLonLat().lon+"&zoom=15&relation="+id+"' target='browse' title='view on OSM'>O</a>]";
		multiLineFeature.text += " [<a href='../history/?type=relation&ref="+id+"' target='browse' title='history browser'>H</a>]";
		multiLineFeature.text += " [<a href='http://localhost:8111/load_and_zoom?left="+bbox.left+"&right="+bbox.right+"&top="+bbox.top+"&bottom="+bbox.bottom+"&select=relation"+id+"' target='browse' title='edit with JOSM'>J</a>]";
		multiLineFeature.text += "<br><i>last edit: <a href='http://www.openstreetmap.org/user/"+user+"' target='browse'>"+user+"</a></i>";
		layerDetour.addFeatures([multiLineFeature]);
		
		delete lines;
	}
	$("status").innerHTML = "Ready";
	$("status").style.backgroundColor="green";
}

function importXML(name)
{
	if (document.implementation && document.implementation.createDocument)
	{
		XMLdoc = document.implementation.createDocument("", "", null);
		XMLdoc.onload = showDetours;
	}
	else if (window.ActiveXObject)
	{
		XMLdoc = new ActiveXObject("Microsoft.XMLDOM");
		XMLdoc.onreadystatechange = function () { if (XMLdoc.readyState == 4) showDetours(); };
 	}
	else
	{
		alert('Your browser can\'t handle this script');
		return;
	}
	XMLdoc.load(name);
}

function getNodes()
{
	var array=XMLdoc.getElementsByTagName("node");
	var nodes= new Object();
	
	for (j = 0; j < array.length; j++)
	{
		var node=new Object();
		var id = array[j].getAttribute("id");
		node.lat = array[j].getAttribute("lat");
		node.lon = array[j].getAttribute("lon");
		nodes[id]=node;
	}
	delete array;
	return nodes;
}

function getWays()
{
	var array=XMLdoc.getElementsByTagName("way");
	var ways= new Object();
	
	for (i = 0; i < array.length; i++)
	{
		var way=new Object();
		var id = array[i].getAttribute("id");
		
		pts=array[i].getElementsByTagName("nd");
		
		way.pt=new Array(pts.length);
		for (var j = 0; j < pts.length; j++)
		{
			way.pt[j]=pts[j].getAttribute("ref");
		}
		delete pts;
		
		ways[id]=way;
	}
	delete array;
	return ways;
}

