﻿//
// GPX Waypoint- and Track- Overlay Editor with google maps
// $ V 2.02, 23.03.2010
// Copyright 2010 B. Altmeier ATLSoft, All Rights Reserved.
// Internet: www.ATLSoft.de
//
	var isLine;			// variable to determine whether to plot waypoints or a route in gpx function
	var trk_Arr = [];   // Array of GLatLon for Polyline
	var gpx_line = [];  // the Polyline
	var track_marker;
    var track_name;
    var track_desc;
    var track_link;
    var track_type;

    // Marker stuff
    var gpx_markers = [];	// holds user entered points for creating gpx file for gps
    var gpx_name = [];		// Marker Name, holds info about user entered points for creating gpx file
    var gpx_desc = [];		// Marker Info, holds info about user entered points for creating gpx file
    var gpx_link = [];		// Marker Link, Link to additional infos about this Marker
    var gpx_sym = [];		// Marker Link, Link to additional infos about this Marker

    var gpx_listener;

    var t_dist = 0;

    var track_marker_lable = ["Track","Wandern","Nordic Walking","Jogging","Skating","Fahrradtour","Mountainbike","Reiten","Motorrad","Autotour","Wintersport","Klettertour","Stadtf\u00FChrung","Bootstour","Flugzeug","Bahnfahrt"];
    var poi_marker_lable   = ["Sehensw\u00FCrdigkeit","Info","Aussicht","Parkplatz","Schutzh\u00FCtte","Camping","Lokal/Bar/Cafe","Ruine","Turm/Denkmal","Schloss/Burg","Museum","H\u00F6hle","Grube/Bergwerk","Park","Bahn/Bus","Werkstatt","Sport/Stadion","Bad","Restaurant/Gastst\u00E4tte","Flugplatz","Hotel/Pension","Telefon/Internet","Post/Briefkasten","Avatar Smilie","Avatar","Avatar","Ying und Yang","Sanduhr"];
	
	var icon_dlg = null;

     // Create icons
    var green_icon = new GIcon();
    green_icon.image = "bilder/mm_20_grey.png";
    green_icon.shadow = "bilder/pin_shadow.png";
    green_icon.iconSize = new GSize(12, 20);
    green_icon.shadowSize = new GSize(22, 20);
    green_icon.iconAnchor = new GPoint(6, 20);
    green_icon.infoWindowAnchor = new GPoint(5, 1);
    
    var red_icon = new GIcon(green_icon);
    red_icon.image = "bilder/mm_20_red.png";

function create_icon(i){
    var n_icon = new GIcon();
    n_icon.image = 'bilder/poz_'+i+'.gif';
    n_icon.shadow = "bilder/shadow_rect.png";
    n_icon.iconSize = new GSize(18, 25);
    n_icon.shadowSize = new GSize(34, 18);
    n_icon.iconAnchor = new GPoint(1, 25);
    n_icon.infoWindowAnchor = new GPoint(1,25);
    return n_icon;
}
function create_track_icon(i){
    var n_icon = new GIcon();
    n_icon.image = 'bilder/trz_'+i+'.png';
    n_icon.shadow = "bilder/shadow_rect.png";
    n_icon.iconSize = new GSize(26, 28);
    n_icon.shadowSize = new GSize(34, 18);
    n_icon.iconAnchor = new GPoint(7, 28);
    n_icon.infoWindowAnchor = new GPoint(7,28);
    return n_icon;
}
//
function init_marker(i,bez,point,ic){
    var opts = new Object();
    opts.clickable = true;
    opts.draggable = true;
    opts.bouncy = false;
    opts.bounceGravity = 0;        
//    opts.title = poi_marker_lable[ic-1] + ',\n' + gpx_name[i] + ',\n';
    opts.title = '';
    if (bez.search(poi_marker_lable[ic-1]) == -1)
         opts.title += poi_marker_lable[ic-1] +',\n';
    if (bez != '')
         opts.title += bez +',\n';
    opts.title += 'Klick zum bearbeiten\noder verschieben!';
    opts.icon =  create_icon(ic);
    gpx_markers[i] = new GMarker(point,opts);
//alert(i+'-'+ic+gpx_markers[i].getPoint());
}

 // Init
function gpx_init() {

     GEvent.addListener(map, 'mousemove', function(point) {
          x = Math.round(point.x*100000)/100000;
          y = Math.round(point.y*100000)/100000;
//          window.status = 'Lat: ' + y + ' Lon: ' + x;
          document.getElementById("pos_lat").innerHTML = 'Lat. ' + y; 
		  document.getElementById("pos_lon").innerHTML = 'Lon. ' + x;
     });
 
	reinit();
	CalcDistance();
}

// implement Event Listener
// implement Event Listener
function startGpxListener() {
	 gpx_listener = GEvent.addListener(map, "click", function(overlay, point) {    
      if (overlay) {
          if (overlay.id){
			if(icon_dlg != null)
				icon_dlg.hide();
		   overlay.openInfoWindowHtml(overlay.infowindow);
          }
      } else {              // sonst neuer Punkt
//alert('point '+ overlay);
         createGPXElement(point);
      }
   });
}

// toggle to Waypoint
function drawWPT() {
	document.getElementById("trk").checked = false;
	isLine = false;
}
	
// toggle to track
function drawTRK() {
	document.getElementById("wpt").checked = false;
	isLine = true;
}

// start GPX recording
function recGPX() {
	document.getElementById("saveGPX").disabled = false;
	document.getElementById("reset").disabled = false;
	document.getElementById("undo").disabled = false;
	document.getElementById("start").disabled = true;
	startGpxListener();
}

var iboxwin=null;
function closeibox(c){  
     if (c)
         reinit();
     iboxwin.hide();
return false;
}

// clear GPX elements
function resetGPX() {
     
    if (trk_Arr.length || gpx_markers.length){
        var out = '<p>Die erstelle Track und/oder Wegpunkte wurden nicht gespeichert.<p>';
        out    += '<p align="center">Trotzdem beenden?</p>';
        out    += '<p align="center">';
        out    += '<input type="button" onclick="closeibox(true); return false;" value="ja" class="btn" style="width:80px; margin:5px;">';
        out    += '<input type="button" onclick="closeibox(false); return false;" value="nein" class="btn" style="width:80px; margin:5px;">';
        out    += '</p>';
        iboxwin=dhtmlwindow.open('ibox', 'inline', out, 'Daten nicht gespeichert!', 'width=350px,height=130px,center=1,resize=0,scrolling=0', 'recal');
    } else
          reinit();
}


function reinit(){

    document.getElementById("start").disabled = false;
	document.getElementById("reset").disabled = true;
	document.getElementById("undo").disabled = true;
	document.getElementById("saveGPX").disabled = true;
    drawTRK();
    document.getElementById("trk").checked = true;

    if (gpx_listener)
        GEvent.removeListener(gpx_listener);

    if (gpx_line)
	    map.removeOverlay(gpx_line);
	gpx_line = [];
    if (track_marker)
	    map.removeOverlay(track_marker);

    track_name = null;
    track_desc = null;
    track_link = null;
    track_type = null;
	trk_Arr = [];
    t_dist = 0;

	for (var i=0; i<gpx_markers.length; i++) {
		map.removeOverlay(gpx_markers[i]);
	}
	gpx_markers = [];
    gpx_name = [];   
    gpx_desc = [];   
    gpx_link = [];   
    gpx_sym = []; 
}


// remove last track/wpt element
function undoGPX() {
	if (isLine)  {
      	CalcDistance(true);
      	if (trk_Arr.length == 0){
      	   alert('keine Trackdaten vorhanden!');
		   return;
      	}
      	trk_Arr.pop();
      	map.removeOverlay(gpx_line);

      	if(trk_Arr.length > 0) {
            	gpx_line=new GPolyline(trk_Arr, "#ff0000", 2, 0.5);
            	map.addOverlay(gpx_line);	// draw polyline - addoverlay method
 		} else {
 			map.removeOverlay(track_marker);
               track_name = '';
               track_desc = '';
               track_link = '';
               track_type = '';
		}
 	}
     else{
      	if (gpx_markers.length == 0){
      	   alert('keine Waypoints vorhanden!');
		   return;
      	}
		map.removeOverlay(gpx_markers[gpx_markers.length-1]);
      	gpx_markers.pop();
          gpx_name.pop();   // altm
          gpx_desc.pop();   // altm
          gpx_link.pop();   // altm
          gpx_sym.pop();   // altm
	}
}

function CalcDistance(subtract){
     var dist = 0;
	if(trk_Arr.length > 1) {
		var lp = new GLatLng(trk_Arr[trk_Arr.length-2].lat(),trk_Arr[trk_Arr.length-2].lng());
		var tp = new GLatLng(trk_Arr[trk_Arr.length-1].lat(),trk_Arr[trk_Arr.length-1].lng());
		dist = Math.round(100*tp.distanceFrom(lp)/1000)/100;
		if (subtract) {
			t_dist = Math.round(100*(t_dist - dist))/100;
			if(trk_Arr.length > 2) {
          		lp = new GLatLng(trk_Arr[trk_Arr.length-3].lat(),trk_Arr[trk_Arr.length-3].lng());
          		tp = new GLatLng(trk_Arr[trk_Arr.length-2].lat(),trk_Arr[trk_Arr.length-2].lng());
          		dist = Math.round(100*tp.distanceFrom(lp)/1000)/100;
			}
		}
		else
			t_dist = Math.round(100*(t_dist + dist))/100;

	//	alert(trk_Arr.length + ' '+ dist);

	} else {
	    t_dist = 0;
     }
	document.getElementById("dist").innerHTML = dist;
	document.getElementById("t_dist").innerHTML = t_dist;
}

function borderme(me,status){
    //alert(me);
    if (status)
      	me.style.border='solid black 1px';
    else
      	me.style.border='solid white 1px';
}

// POI Icon select
// possible values for sym:
// trk = Track
// wpt = Waypoint
// pic = Picture


function selectIcon(sym,p){
    document.getElementById("poi_id").value =  p ;
    document.getElementById("wpt_sym").value =  p ;
	if (sym == 'wpt')
		document.getElementById("poi_pic").innerHTML = '<img src="bilder/po_' + p + '.gif" alt="'+poi_marker_lable[p-1]+'" style="border:solid white 1px; cursor:pointer;" width="18" height="18">';
	else if (sym == 'trk')	
		document.getElementById("poi_pic").innerHTML = '<img src="bilder/tr_' + p + '.png" alt="'+track_marker_lable[p-1]+'" style="border:solid white 1px; cursor:pointer;" width="26" height="21">';
    icon_dlg.hide();
}
// POI Icon select Dialog
function showIconDlg(sym, s){
    var  i_win = '<div style="padding:7px;" id="poi_id" value="0"><br/>W&auml;hlen Sie ein Symbol<br/><table>';
    var n = 1;    // 4 * 7 Icons für wpt
	var jmax = 0; var imax = 0; 
	if(sym == 'trk'){jmax = 5; imax = 5;} else if (sym == 'wpt'){jmax = 8; imax = 5;} 
	for (var i=1; i < imax; i++) {
        i_win += '<tr>';
        	for (var j=1; j < jmax; j++) {
				if (sym == 'wpt')
					i_win += '<td  style="padding:3px;><a href="#" onclick="selectIcon(\'' + sym + '\',' + n + ')"><img src="bilder/po_' + n + '.gif" onmouseover="borderme(this,1);" onmouseout="borderme(this,0);" width="18" height="18" alt="'+poi_marker_lable[n-1]+'" style="border:solid white 1px; cursor:pointer;"></a></td>';
				else if(sym == 'trk')
					i_win += '<td  style="padding:3px;><a href="#" onclick="selectIcon(\'' + sym + '\',' + n + ')"><img src="bilder/tr_' + n + '.png" onmouseover="borderme(this,1);" onmouseout="borderme(this,0);" width="26" height="21"  alt="'+track_marker_lable[n-1]+'" style="border:solid white 1px; cursor:pointer;"></a></td>';
				
               n++;
        	}
        i_win += "</tr>";
	}
    i_win += '<tr><td colspan="' + (jmax - 1) + '" align="center"><input type="button"  onClick="selectIcon(\'' + sym + '\',' + s + ')"  style="width:80px; height:20px"  value="schliessen" class="btn"></td></tr></table></div>';
	if(sym == 'wpt'){
		icon_dlg=dhtmlwindow.open("iconbox", "inline", i_win, "Kategorie", "width=220px,height=200px,center=1,resize=1,scrolling=1", "recal");
	} else if (sym == 'trk'){
		icon_dlg=dhtmlwindow.open("iconbox", "inline", i_win, "Kategorie", "width=180px,height=200px,center=1,resize=1,scrolling=1", "recal");
	} 
	
	icon_dlg.onclose=function(){
        //  alert(document.getElementById("poi_id").value);
        return true;
	}
}
function UpdatePOIInfo(i,n,d,l,s) {
	if (i == -1)   {   // Track Marker
        track_name = n;
        track_desc = d;
        track_link = l;
        track_type = s;
		sym = 'trk'
    } else { 	// WPT Marker
      	gpx_name[i] = n;
      	gpx_desc[i] = d;
      	gpx_link[i] = l;
      	gpx_sym[i]  = s;;
		sym = 'wpt'
    }
	var new_win
    new_win =  '<div><table><tr>';
	new_win += '<td style="width:150px;">Titel</td><td style="width:50px;"><a href="#" onClick="showIconDlg(\'' + sym + '\', ' + s +')" style="text-decoration:underline; color:red">Symbol</a></td></tr><tr>';
	new_win += '<td><input style="width:150px;" class="outo" type="text" id="wpt_name" value="' + n + '"  /></td>';
	new_win += '<td style="width:45px;" align="right"><a href="#" onClick="showIconDlg(\'' + sym + '\', ' + s +')"><div id="poi_pic">';
	if(sym == 'trk'){
		new_win += '<img src="bilder/tr_' + s + '.png" width="26" height="21" alt="'+track_marker_lable[s-1]+'" onmouseover="borderme(this,1);" onmouseout="borderme(this,0);" style="border:solid white 1px; cursor:pointer;"></div></a><input type="hidden" id="wpt_sym" value="' + s + '"  /></td></tr><tr>';
	} else if (sym == 'wpt'){
		new_win += '<img src="bilder/po_' + s + '.gif" width="18" height="18" alt="'+poi_marker_lable[s-1]+'" onmouseover="borderme(this,1);" onmouseout="borderme(this,0);" style="border:solid white 1px; cursor:pointer;"></div></a><input type="hidden" id="wpt_sym" value="' + s + '"  /></td></tr><tr>';
	} 
	new_win += '<td>Beschreibung:<td style="width:50px;"><a href="#" onClick="showIconDlg(\'' + sym + '\', ' + s +')" style="text-decoration:underline; color:red">wählen</a></td></td></tr><tr>';
	new_win += '<td colspan="2"><textarea style="width:200px;" class="outo" id="wpt_desc" cols="15" rows="2">' + d + '</textarea></td></tr><tr>';
	new_win += '<td colspan="2" >Link/URL mit Zusatzinfos:</td></tr><tr><td colspan="2"><b>http:// <b><input style="width:150px;" class="outo" type="text" id="wpt_link" value="' + l + '"  /></tr><tr>';
	new_win += '<td colspan="2" ><input class="btn" type="button" onClick="updateGPXinfo(' + i + ')" value="Update"/></td></tr><tr></table></div>';

	if(sym == 'trk'){
		track_marker.infowindow = new_win;
	} else if (sym == 'wpt'){
		gpx_markers[i].infowindow = new_win
 	} 	
}

function createGPXElement(point) {
	if (isLine){
	    trk_Arr.push(point);
	    if(trk_Arr.length > 1) {
	    	map.removeOverlay(gpx_line);
	    	gpx_line=new GPolyline(trk_Arr, "#ff0000", 2, 0.5);
	    	map.addOverlay(gpx_line);	// draw polyline - addOverlay method
		    CalcDistance(false);
	    }  else {
            var opts = new Object();
            opts.clickable = true;
            opts.draggable = false;
            opts.bouncy = false;
            opts.bounceGravity = 0;  
            opts.title = track_marker_lable[0] + ',\nKlick zum bearbeiten!';
            opts.icon =  create_track_icon(1);
	    	track_marker = new GMarker(point,opts);
            track_marker.id=1;
            track_name =  track_marker_lable[0];
		    UpdatePOIInfo(-1,track_name,'','','1');
            map.addOverlay(track_marker);
	    }
	} else {   // wpt
        var count = gpx_markers.length;
        var bez =  'Wpt.: ' + (count+1);
        gpx_name.push(bez);
        gpx_desc.push('');
        gpx_link.push('');
        gpx_sym.push('');
		gpx_markers.push();
        gpx_markers[count] = 0;
        init_marker(count,bez,point,1);
        UpdatePOIInfo(count,bez,'','','1');
        gpx_markers[count].id=(count+1);    // überfl.?
      	map.addOverlay(gpx_markers[count]);
	}
}

// update gps info from infowindow
function updateGPXinfo(i) {
 	var vname = document.getElementById("wpt_name");
	var desc = document.getElementById("wpt_desc");
	var lnk = document.getElementById("wpt_link");

	var sym = document.getElementById("wpt_sym");
    if (i >= 0){
        var point = gpx_markers[i].getPoint();
        map.removeOverlay(gpx_markers[i]);
        init_marker(i,vname.value,point,sym.value)
     	UpdatePOIInfo(i,vname.value,desc.value,lnk.value,sym.value);
        gpx_markers[i].id=i+1;
        map.addOverlay(gpx_markers[i]);
    } else {
        var point = track_marker.getPoint();
        map.removeOverlay(track_marker);

        var opts = new Object();
        opts.clickable = true;
        opts.draggable = false;
        opts.bouncy = false;
        opts.bounceGravity = 0;
        opts.title = '';
        
		if (vname.value.search(track_marker_lable[sym.value-1]) == -1)
            opts.title += track_marker_lable[sym.value-1] +',\n';
        if (vname.value != '')
            opts.title += vname.value +',\n';

        opts.title += 'Klick zum bearbeiten!';
        opts.icon =  create_track_icon(sym.value);
	    track_marker = new GMarker(point,opts);
        track_marker.id=1;

     	UpdatePOIInfo(i,vname.value,desc.value,lnk.value,sym.value);
        map.addOverlay(track_marker);
     }
	map.closeInfoWindow();
}

function OnReturn(evt) {
    if (document.layers?evt.which:evt.keyCode == 13) {
        return true;
    }
    return false;
}

var inlinewin = null;
// Inhalt für GPX Upload erstellen
function CheckInput() {
	if (gpx_markers.length == 0 && trk_Arr.length==0){
	   alert('keine Daten vorhanden!');
	   return false
	}
	var m_time = new Date();
	var Std = m_time.getUTCHours();
	var Min = m_time.getUTCMinutes();
	var Sec = m_time.getUTCSeconds();
	var Tag = m_time.getUTCDate();
	var Mon = m_time.getUTCMonth() + 1;

	var m_Std = ((Std < 10) ? "0" + Std : Std);
	var m_Min = ((Min < 10) ? "0" + Min : Min);
	var m_Sec = ((Sec < 10) ? "0" + Sec : Sec);
	var m_Tag = ((Tag < 10) ? "0" + Tag : Tag);
	var m_Mon = ((Mon < 10) ? "0" + Mon : Mon);
	var m_Dat = '\n<time>' + m_time.getUTCFullYear() + '-' + m_Mon + '-' + m_Tag + 'T' + m_Std + ':' + m_Min + ':' +  m_Sec + 'Z</time>\n';

	// track
	var gpx_data = "";
    if(trk_Arr.length) {
      	gpx_data += '<trk>\n<name>'+track_name+'</name>\n<desc>'+track_desc+'</desc>\n';
		if(track_link != '')
			gpx_data += '<link href="http://'+track_link+'"></link>';
		gpx_data += '\n <type>'+(track_type-1)+'</type>\n<trkseg>\n';
      	for (var i=0;i<trk_Arr.length;i++) {
		    gpx_data += '<trkpt lat="' + trk_Arr[i].lat() + '" lon="' + trk_Arr[i].lng() + '">';
			gpx_data +=  m_Dat;
			gpx_data += '</trkpt>\n';
      	}
      	gpx_data += '</trkseg>\n</trk>\n';
     }
	// waypoints
    	for (var i=0;i<gpx_markers.length;i++) {
    		gpx_data += '<wpt lat="' +  gpx_markers[i].getPoint().lat() + '"  lon="' + gpx_markers[i].getPoint().lng() + '" >\n';
			gpx_data +=  m_Dat;
    		gpx_data += '<name>' + gpx_name[i] + '</name>\n';
    		gpx_data += '<desc>' + gpx_desc[i] + '</desc>\n';
			if(gpx_link[i] != '')
				gpx_data += '<link href="http://' + gpx_link[i] + '"></link>\n';
    		gpx_data += '<sym>' + (gpx_sym[i]-1) + '</sym>\n';
    		gpx_data += '</wpt>\n';
    	}

    var  i_win = "<form action=\"ixm_save.php\" onsubmit=\"closeit()\" method=\"post\" accept-charset=\"utf-8\">";
    i_win += "<div style=\"padding:7px;\" ><br/>Titel der Tour:<br/>";
    i_win += "<input type=\"hidden\" id=\"gpx_file\" name=\"gpx_file\"/>";
    i_win += "<input type=\"text\" name=\"gpx_file_name\" class=\"outo\"  style=\"width:240px;\" maxlength\"30\"><br/><br/>Beschreibung der Tour:<br/>";
    i_win += "<textarea name=\"gpx_file_desc\"  style=\"width:240px;\" rows=\"4\" class=\"outo\" ></textarea><div style=\"text-align:center;width:240px\"><br/><input type=\"submit\"  style=\"width:60px; height:30px\"  value=\"ok\" class=\"btn\"></div></form></div>";
    inlinewin=dhtmlwindow.open("broadcastbox", "inline", i_win, "Zusatinfos angeben", "width=262px,height=200px,center=1,resize=1,scrolling=0", "recal");
    var v_name = document.getElementById("gpx_file");
    v_name.value  =  gpx_data;
    return false;
}

function closeit(){ //Run custom code when window is being closed (return false to cancel action):
    inlinewin.hide();
    reinit();
    return true;
}

