/* (C) 2009 Kai Pastor, DG0YT <dg0yt at darc.de> */FoxTracks={EPSG4326:new OpenLayers.Projection("EPSG:4326"),contentDiv:null,mapDiv:null,splitsSelect:null,map:null,splits:new Array(),data:new Array(),namePattern:new RegExp(),loadMap:function(){FoxTracks.contentDiv=document.getElementById("content");FoxTracks.mapDiv=document.getElementById("map");FoxTracks.splitsSelect=document.getElementById("splits");FoxTracks.map=new FoxTracks.Map("map");FoxTracks.loadData();FoxTracks.resizeMap();FoxTracks.map.zoomToDataExtent();var i;for(i=0;i<FoxTracks.splitsSelect.length;i++){if(FoxTracks.namePattern.exec(FoxTracks.splitsSelect.options[i].text)){FoxTracks.splitsChanged(i);FoxTracks.splitsSelect.selectedIndex=i;break;}}
if(i==FoxTracks.splitsSelect.length){FoxTracks.splitsChanged(0);FoxTracks.splitsSelect.selectedIndex=0;}},resizeMap:function(){var height=(window.innerHeight?window.innerHeight:document.body.clientHeight)-(FoxTracks.contentDiv.offsetHeight-FoxTracks.mapDiv.offsetHeight)-2;if(height>=0){FoxTracks.mapDiv.style.height=""+height+"px";FoxTracks.map.updateSize();}},loadData:function(){while(FoxTracks.data.length>0){var item=FoxTracks.data.shift();if(item.splits){if(FoxTracks.splitsSelect!==null){for(i=0;i<item.splits.length;i++){var entry=new Option(item.splits[i][0],i,false,false);FoxTracks.splitsSelect.options[FoxTracks.splitsSelect.length]=entry;FoxTracks.splits.push(item.splits[i]);}
var group=document.getElementById('group_splits');if(group&&item.splits.length>1){group.style.visibility="visible";}}}
else if(item.track){var track=new FoxTracks.Layer.Track(item.name,item.track);FoxTracks.map.addLayer(track);FoxTracks.map.raiseLayer(track,-1);track.setSplits([item.name,0,'S']);FoxTracks.map.checkpoints.setFromTrack(track);}
else if(item.name){FoxTracks.namePattern=new RegExp(item.name,'i');}
else{alert("Unbekannte Daten: "+key);}}},splitsChanged:function(index){if(FoxTracks.map.tracks.length>0){FoxTracks.map.tracks[0].setSplits(FoxTracks.splits[index]);FoxTracks.map.checkpoints.setFromTrack(FoxTracks.map.tracks[0]);}},timeOffsetChanged:function(offset){if(FoxTracks.map.tracks.length>0){FoxTracks.map.tracks[0].setSplitsOffset(Number(offset));FoxTracks.map.checkpoints.setFromTrack(FoxTracks.map.tracks[0]);}},anim_changed:function(index){switch(index){case 0:return;case 1:FoxTracks.map.animation.start();break;case 2:FoxTracks.map.animation.pause();break;case 3:FoxTracks.map.animation.reset();break;default:break;}
document.forms[0].anim.selectedIndex=0;}};FoxTracks.Layer={};FoxTracks.Layer.Google=OpenLayers.Class(OpenLayers.Layer.Google,{initialize:function(){OpenLayers.Layer.Google.prototype.initialize.call(this,"Google Map (Satellite)",{type:G_SATELLITE_MAP,sphericalMercator:true})}});FoxTracks.Layer.OSMCycleMap=OpenLayers.Class(OpenLayers.Layer.OSM.CycleMap,{initialize:function(){OpenLayers.Layer.OSM.CycleMap.prototype.initialize.call(this,"OpenStreetMap (Cycle Map)",{displayOutsideMaxExtent:true,wrapDateLine:true})}});FoxTracks.Layer.Track=OpenLayers.Class(OpenLayers.Layer.Vector,{CLASS_NAME:"FoxTracks.Layer.Track",colors:['#dd00dd','#ff0000','#00ff00','#0000ff','#dddd00','#00dddd'],points:null,splits:{},splitsRaw:null,splitsOffset:0,trkStyle:OpenLayers.Util.extend({},OpenLayers.Feature.Vector.style['default']),initialize:function(name,points){this.name=name;this.points=points;this.calculateDistance();OpenLayers.Layer.Vector.prototype.initialize.call(this,name,{style:this.trkStyle,units:"m"});},setMap:function(map){OpenLayers.Layer.Vector.prototype.setMap.apply(this,arguments);this.removeFeatures(this.features);var i;var styles=new Array();for(i=0;i<this.colors.length;i++){styles.push({strokeColor:this.colors[i],strokeWidth:3,pointRadius:6,pointerEvents:"visiblePainted"});}
var mapproj=map.getProjectionObject();var points=this.points;var segEnd=0;var lastPoint=points.length-1;while(segEnd<lastPoint){var segment=new Array();var segStart=segEnd;var tx=points[segStart].tx;do{segEnd++;}while(segEnd<lastPoint&&points[segEnd].tx==tx);for(i=segStart;i<=segEnd;i++){segment.push((new OpenLayers.Geometry.Point(points[i].lon,points[i].lat)).transform(FoxTracks.EPSG4326,mapproj));}
this.addFeatures([new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(segment),null,styles[points[segStart].tx])]);}},getPointIndexByTime:function(time){for(var i=0;i<this.points.length;i++){if(this.points[i].t>=time){return i;}}
return this.points.length-1;},setSplits:function(splits){this.splitsRaw=splits;this.splits={};this.setName((splits.length>0)?splits[0]:"Unnamed track");var distOffset=0.0;for(var i=1;i<splits.length;i+=2){var time=splits[i]+this.splitsOffset;var code=splits[i+1];var index=this.getPointIndexByTime(time);var point=this.points[index];this.splits[code]=OpenLayers.Util.extend({},point);this.splits[code].t=time;this.splits[code].i=index;if(i==1&&code=='S')distOffset=this.splits.S.dist;this.splits[code].dist-=distOffset;}},setSplitsOffset:function(offset){this.splitsOffset=offset;this.setSplits(this.splitsRaw);},calculateDistance:function(){var EARTH_RADIUS=6371.0;var DEG2RAD=0.01745329252;var dist=0.0;var i=0;var x1=this.points[0].lon*DEG2RAD;var y1=this.points[0].lat*DEG2RAD;this.points[i].dist=dist;for(i=1;i<this.points.length;i++){var x0=x1;var y0=y1;x1=this.points[i].lon*DEG2RAD;y1=this.points[i].lat*DEG2RAD;var a=Math.pow(Math.sin((y1-y0)/2.0),2);var b=Math.pow(Math.sin((x1-x0)/2.0),2);var c=Math.pow((a+Math.cos(y1)*Math.cos(y0)*b),0.5);dist+=(2*Math.asin(c)*EARTH_RADIUS);this.points[i].dist=dist;}}});FoxTracks.Layer.Checkpoints=OpenLayers.Class(OpenLayers.Layer.Markers,{CLASS_NAME:"FoxTracks.Layer.Checkpoints",markersByCode:{},initialize:function(){OpenLayers.Layer.Markers.prototype.initialize.call(this,"Kontrollpunkte");},putMarker:function(code,track){var point=track.splits[code];var position=new OpenLayers.LonLat(point.lon,point.lat).transform(FoxTracks.EPSG4326,this.map.getProjectionObject());if(this.markersByCode[code]){if(this.markersByCode[code].map===null)this.markersByCode[code].map=this.map;this.markersByCode[code].moveTo(this.map.getLayerPxFromLonLat(position));}
else{var icon;if(code.match(/^[S1-5BZ]$/)){icon=new OpenLayers.Icon('http://ardf.darc.de/maps/icons/marker-'+code+'.png',new OpenLayers.Size(20,34),null,function(size){return new OpenLayers.Pixel(-(size.w/2),-size.h);});}
else{icon=OpenLayers.marker.defaultIcon();}
var feature=new OpenLayers.Feature(this,position,{icon:icon,popupClass:OpenLayers.Class(OpenLayers.Popup.AnchoredBubble,{'autoSize':true}),overflow:"auto"});var marker=feature.createMarker();var map=this.map;var markerClick=function(evt){var dist=track.splits[code].dist.toFixed(2);if(feature.popup===null){map.addPopup(feature.createPopup(true));feature.popup.setContentHTML("<b>"+code+"</b><hr />Strecke: "+dist+" km");feature.popup.show();}
else{feature.popup.setContentHTML("<b>"+code+"</b><hr />Strecke: "+dist+" km");feature.popup.toggle();}
OpenLayers.Event.stop(evt);};marker.events.register("mousedown",feature,markerClick);this.addMarker(marker);this.markersByCode[code]=marker;}
return this.markersByCode[code];},dropMarker:function(code){var marker=this.markersByCode[code];this.removeMarker(marker);marker.destroy();delete this.markersByCode[code];},setFromTrack:function(track){var code;for(code in this.markersByCode){if(!track.splits[code])this.dropMarker(code);}
for(code in track.splits){this.putMarker(code,track);}}});FoxTracks.Animation=OpenLayers.Class({CLASS_NAME:"FoxTracks.Animation",map:null,layer:new OpenLayers.Layer.Markers("Animation"),icon:function(){return new OpenLayers.Icon('http://ardf.darc.de/maps/icons/runner.png',new OpenLayers.Size(20,20),null,function(size){return new OpenLayers.Pixel(-10,-19);})},running:true,clock:0,step:1,interval:50,status:null,txMarker:null,initialize:function(map){this.map=map;},start:function(){if(this.status===null){this.map.addLayer(this.layer);this.status={track:this.map.tracks[0],startPoint:0};if(this.status.track.splits.S){this.status.startPoint=this.status.track.splits.S.i;}
var point=this.status.track.points[this.status.startPoint];var lonlat=new OpenLayers.LonLat(point.lon,point.lat);var position=lonlat.transform(FoxTracks.EPSG4326,this.map.getProjectionObject());this.status.marker=new OpenLayers.Marker(position,this.icon());this.layer.addMarker(this.status.marker);this.status.startTime=point.t;this.clock=0;this.txMarker=this.map.checkpoints.markersByCode[''+point.tx];if(this.txMarker){this.txMarker.inflate(2);}}
this.running=true;this.scheduleMove();},pause:function(){this.running=false;},reset:function(){this.running=false;if(this.status!==null){this.layer.removeMarker(this.status.marker);this.status.marker.destroy();this.map.removeLayer(this.layer);this.status=null;if(this.txMarker){this.txMarker.inflate(0.5);}}},move:function(){if(this.running){this.clock+=this.step;var now=this.status.startTime+this.clock;for(var i=this.status.startPoint;i<this.status.track.points.length;i++){if(this.status.track.points[i].t>=now){var point=this.status.track.points[i];lonlat=new OpenLayers.LonLat(point.lon,point.lat);lonlat.transform(FoxTracks.EPSG4326,this.map.getProjectionObject());this.status.marker.moveTo(this.map.getLayerPxFromLonLat(lonlat));var newTxMarker=this.map.checkpoints.markersByCode[''+point.tx];if(newTxMarker!==this.txMarker){if(this.txMarker)this.txMarker.inflate(0.5);this.txMarker=newTxMarker;if(this.txMarker)this.txMarker.inflate(2);}
this.scheduleMove();return;}}
this.reset();}},scheduleMove:function(){var anim=this;window.setTimeout(function(){anim.move();},this.interval);}});FoxTracks.Map=OpenLayers.Class(OpenLayers.Map,{CLASS_NAME:"FoxTracks.Map",tracks:new Array(),animation:null,checkpoints:new FoxTracks.Layer.Checkpoints(),initialize:function(divid){var options={controls:[new OpenLayers.Control.ArgParser(),new OpenLayers.Control.Attribution(),new OpenLayers.Control.LayerSwitcher(),new OpenLayers.Control.Navigation(),new OpenLayers.Control.PanZoomBar(),new OpenLayers.Control.ScaleLine(),new OpenLayers.Control.MousePosition()],displayProjection:FoxTracks.EPSG4326,projection:new OpenLayers.Projection("EPSG:900913"),units:"m",maxResolution:156543.0339,maxExtent:new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508.34)};OpenLayers.Map.prototype.initialize.call(this,divid,options);var initialLayers=Array();if(G_SATELLITE_MAP){initialLayers.push(new FoxTracks.Layer.Google())}
if(OpenLayers.Layer.OSM){initialLayers.push(new FoxTracks.Layer.OSMCycleMap())}
initialLayers.push(this.checkpoints)
this.addLayers(initialLayers);this.animation=new FoxTracks.Animation(this);},addLayer:function(layer){if(layer.CLASS_NAME=="FoxTracks.Layer.Track"){this.tracks.push(layer);}
OpenLayers.Map.prototype.addLayer.call(this,layer);},zoomToDataExtent:function(){var bounds=new OpenLayers.Bounds();for(var i=0;i<this.layers.length;i++){if(!this.layers[i].isBaseLayer){bounds.extend(this.layers[i].getDataExtent());}}
this.zoomToExtent(bounds);}});
