///Esa May 2008, updated Oct 2008


GPolyline.prototype.getPointArray = function () {
  var points = new Array;
  var len = this.getVertexCount()||0;
  var lastpoint;
  for (var i=0; i<len; i++){
  		var point = this.getVertex(i);
  		var dist = (i>0)    
			? this.getVertex(i).distanceFrom(this.getVertex(i-1))
			: 0;
	    points.push({"lat":point.lat(),"lng":point.lng(),"alt":NaN,"dist":dist});
  }
  return points;
}


function changeColor() {
	if (!poly) return;
	poly.setStrokeStyle({color:$F('color')});
}


function setDroptext() {
if ($F('startend')=='1') {
		$('drop').value = 'Startpunkt löschen';

	} else {
		$('drop').value = 'Endpunkt löschen';
	
	}
}

function dropPoint() {
	if ($F('startend')=='1') {
		try{poly.deleteVertex(0)}catch(e){}

	} else {
		try{poly.deleteVertex(poly.getVertexCount()-1)}catch(e){}
	}
}

function toggleDrawing() {
	e=$('draw');
	var fromstart = $F('startend');
	Element.addClassName(e,'jp');
	if (draw==false) {
		draw=true;
		$("startend").disabled='disabled';
		if (fromstart=='1') {
			poly.enableDrawing(); 
		} else { 
			poly.enableDrawing({fromStart:true});
		}
		e.value='Zeichnen stoppen'
	} else {
		$("startend").disabled=null;
		poly.disableEditing();
		e.value='Zeichnen starten';
		draw = false;
	} 
}

function toggleEditing() {
	e = $('edit');
	//Element.addClassName(e,'jp');
	if (edit==false) {
		edit=true;
		poly.enableEditing();
		e.value='Bearbeitung stoppen';
	} else {
		e.value='Bearbeitung starten';
		edit = false;
		poly.disableEditing();
	} 
}

function addOption(value){
  //var len = selector.options.length;
  //selector.options[len] = new Option(value);
}
function clearSelector(){
  //while(selector.options[0]){
   // selector.options[0] = null;
  //}
}
function deleteNode(){
  poly.deleteVertex(selector.selectedIndex);
}
function showBlowup(){
  var sel_ = selector.selectedIndex||0;
  try{map.showMapBlowup(poly.getVertex(sel_))}catch(e){};
}

/**
 * Context menu button functions
 */
var poly = null;
var updateListener;

function startPoly(point) {
  map.clearOverlays();
  updateListener = null;
  poly = map.getCenter().drawStart({radius:'.5'});
  map.addOverlay(poly);
  poly.enableEditing();
  setListener(poly);
//  map.fit(poly.getBounds(), true);
  listPoly();
}


GLatLng.prototype.drawStart =function (opt_options){
  var pnts = [];
  pnts.push(this);
  var opts = opt_options||{};
  var radius = 1*opts.radius||1;
  
  var step = parseInt(360/opts.nodes)||18;
  var latConv = this.distanceFrom(new GLatLng(this.lat()+0.1, this.lng()))/100;
  var lngConv = this.distanceFrom(new GLatLng(this.lat(), this.lng()+0.1))/100;
  for(var i=90; i<=95; i+=step)
    { // @author Esa 2006, 2008
    var pint = new GLatLng(this.lat() + (radius/latConv * Math.cos(i * Math.PI/180)), 
      this.lng() + (radius/lngConv * Math.sin(i * Math.PI/180)));
    pnts.push(pint);
  }
  var liWidth = opts.liWidth||5;
  var poly = new GPolyline(pnts,$F('color'),liWidth,'0.9');
  
  return poly;
}



function drawPoly(){
  map.clearOverlays();
  updateListener = null;
  poly = new GPolyline([],setStrokeStyle,2);
  map.addOverlay(poly);
  poly.enableDrawing({fromStart:$F('startend')});
  setListener(poly);
}


function getDirections(){
  var saddr = $("haku").value;
  var daddr = $("dest").value;
  gdir.load("from: " + saddr + " to: " + daddr,{getPolyline:true});
}  

function drawRoute(){
  map.clearOverlays();
  updateListener = null;
  poly = gdir.getPolyline();
  var vert = poly.getVertexCount();
  var permission = true;
  if(vert>100) permission = confirm(vert + " points are not editable but I can draw it.");
  if(!permission)return;
  if(vert>1000) permission = confirm(vert + " points is much. Are you really serious?");
  if(!permission)return;
  if(vert>10000) permission = confirm(vert + " points. This is your last change. Proceed?");
  if(permission){
    map.addOverlay(poly);
    setListener(poly);       
    map.fit(poly.getBounds(), true);
    listPoly();
  }
}


function drawFromJSON(json){
  var points = [];
  if (json.length ==0) return;
  var track = '(' + json + ')';
  map.clearOverlays();
  updateListener = null;
  var polyPoints = eval(track);
  for(var i=0;i<polyPoints.length;i++){
  	  var point = new GLatLng(polyPoints[i].la,polyPoints[i].ln);
  	  points.push(point);
  } 
  poly = new GPolyline(points,$F('color'),5);
  map.addOverlay(poly);
  var bounds = poly.getBounds();
  if(bounds)map.fit(bounds, true);
  setListener(poly);
}


/**
 * Update textarea by polyline 'lineupdated' and map 'dblclick'
 */
function setListener(obj){
    updateListener = GEvent.addListener(obj, "lineupdated", function(){
    	listPoly();
    });
    GEvent.addListener(obj, "endline", function(){
    	toggleEditing();
    	toggleDrawing();
    	listPoly();
    });
  	GEvent.addListener(map, "dblclick", function(){
    	listPoly();
  	});
}

function listPoly(){
 // clearSelector();
  var track ='';
  var rows = [];
  	$("track").value = "";
  	if(poly) {
    var len = poly.getVertexCount()||0;
    for(var i=0; i<len; i++){
      var point = poly.getVertex(i);
      rows.push('{"la":"'+ point.lat().toFixed(7) + '","ln":"'+point.lng().toFixed(7)  +'"}' );
	  track += '[' + point.lat().toFixed(7) + ','+point.lng().toFixed(7)  +'], ';
	  addOption(i);
	}
	setStartmarker();
	console.log(track);
	$('test').innerHTML = track;
	Element.show('test');
    $('track').value = "[" +rows.join(',')+ "]";
  	$('length').innerHTML = Math.round(poly.getLength()) + ' m';
    $('strecke').value =  Math.round(poly.getLength()) ;
    
    $('drop').disabled = (poly.getVertexCount()>2) ? null : 'disabled';

   }
}



/**
 * Geocoder
 */
function showAddress(address,id){
    var geocoder = new GClientGeocoder();
    $(id).style.color = "#000000";
	 geocoder.getLatLng(address,function(point) {
    	if(!point){
      		$(id).style.color = "#ff0000";
    	} else{
      		$(id).style.color = "#000000";
   			map.setCenter(point,14);
      		$$('.navi').each(function(e){e.disabled=null;});
      		$('drop').disabled='disabled';
      	    startPoly(point);
      	  	toggleEditing();
   	
    }
  })
}


/**
 * zoom and pan to fit in view
 */
GMap2.prototype.fit = function(bounds,save){
  if(!save){
    this.setZoom(map.getBoundsZoomLevel(bounds));
    this.panTo(bounds.getCenter()); 
  } else {
    this.setCenter(bounds.getCenter(), this.getBoundsZoomLevel(bounds));
    this.savePosition();
  }
}

function errorReport(){
 	alert("Upps");
}
 

function setStartmarker() {
  var last = poly.getVertexCount()-1;
  if (last>3) {
  	if (startmarker) map.removeOverlay(startmarker);
  	var start = poly.GetPointAtDistance(0.5*poly.Distance());
  	startmarker = new GMarker(start,{icon:lego});
  	GEvent.addListener(startmarker, "click", function() {
  		        startmarker.openInfoWindowHtml(iwhtml);
  	});
  	map.addOverlay(startmarker);
  	GEvent.addListener(startmarker, 'infowindowopen',function() {
 		if (typeof(alti)=='object') {
 			alti=undefined;
 		}
		setTimeout(function() {
			alti = new AltitudeProfil(poly.getPointArray(),'alti','profil');
			},1000);
		map.updateInfoWindow();    
		});
    }
    
    // nun noch die Begrenzer aicon und bicon:
	  if (aiconmarker) map.removeOverlay(aiconmarker);
	  if (biconmarker) map.removeOverlay(biconmarker);

    if (aiconmarker==undefined) {
    	aiconmarker = new GMarker(poly.getVertex(0),{icon:aicon});  
    }	
    map.addOverlay(aiconmarker);

    aiconmarker.setLatLng(poly.getVertex(0));
  	if (biconmarker==undefined) {
  		biconmarker = new GMarker(poly.getVertex(last),{icon:bicon});  
    }
   map.addOverlay(biconmarker);
   
    biconmarker.setLatLng(poly.getVertex(last));
  
}

var AltitudeProfil = Class.create();
AltitudeProfil.prototype = {
   initialize : function(polys,callback,elem) {
   				this.elem = (typeof(elem)=='string') ? $(elem) : elem;
    	   		this.profil = new jsGraphics(this.elem);
    	   		Element.setOpacity(this.elem,'0.66');
                this.found = 0;
                this.len = 0;
   				this.polys = polys;
   				this.callback = callback;
   				this.len = this.polys.length||0;
    			for(var i=0; i<this.len; i++){
    				var p = this.polys[i];
  	    			var script = document.createElement("script");
    				script.type = "text/javascript";
  	    			var url = "http://ws.geonames.org/gtopo30JSON?id="+ Math.random() +"&lat=" + p.lat + "&lng=" + p.lng + "&callback=" + callback +'.updatePoly';
    				script.src= url;
    				document.body.appendChild(script);
  	  		   }
  	    },
        updatePoly: function(result) {
    		var lat = JSON.stringify(result.lat);
  			var lng = JSON.stringify(result.lng);
  			var alt = JSON.stringify(result.gtopo30);
  			// in Liste eintragen
  			for(var i=0; i<this.len; i++){
    			var p = poly[i];
  				if (this.polys[i].lat ==lat && this.polys[i].lng ==lng) {
  		  			if (alt<0) alt = 0;
  					this.found += 1;
  					this.polys[i].alt = parseFloat(alt);
  				}
  			}
//  			console.log (this.found +' ' + this.len);
  			if (this.len == this.found) {
    				setTimeout(drawProfile,100);
  			}
        },
        drawProfile: function() {
        		var min, max,total,xf,yf;
        		var xvals = [];
    			var yvals = [];
        		var x = 0;
                var dims = Element.getDimensions(this.elem);
                var width   = dims.width-2;
                var height  = dims.height-2;
                var total = 0.0;
                var min = 1000000;
                var max = 0;
                for (var i=0;i<this.len;i++) {
        			total = total + parseFloat(this.polys[i].dist);
        			var alt = this.polys[i].alt;
        			min = (alt < min) ? alt : min;
        			max = (alt > max) ? alt : max;
        		}
        		xf = width/total;
        		yf = height/(max-min);
				$('points').innerHTML      = this.polys.length;
        		$('tracklength').innerHTML = $('length').innerHTML;
        		$('maxheight').innerHTML   = max;
        		$('minheight').innerHTML   = min;        		
        		$('heightdiff').innerHTML = max - min;
        		// jetzt wird gemalt:
        		for(var i=0;i<this.len;i++) {
					var dist = parseFloat(this.polys[i].dist) 
        			x = x + dist;
        			xvals.push(parseInt(x * xf));
        			yvals.push(height-parseInt(parseFloat((this.polys[i].alt)-min) * yf));
       			}
                // Randpunkte:
                xvals.push(width); yvals.push(height);xvals.push(0);yvals.push(height);
                // Altes löschen:
				$('warte').hide();
                this.profil.clear();
                this.profil.setColor($F('profilcolor'));
    		    this.profil.fillPolygon(xvals,yvals);
     			this.profil.paint();
    			
     			this.profil.setColor('gray');
    			this.profil.drawPolygon(xvals,yvals);
    			this.profil.paint();
    		
    		this.profil.setPrintable(true); 
    		this.profil.paint();
    		
    	}
      
};

    	function drawProfile(){alti.drawProfile();};

