//
// GPX Waypoint- and Track- Overlay Loader with google maps
// Copyright: 2007 B. Altmeier ATLSoft, All Rights Reserved.
// Internet: www.ATLSoft.de
// $ V 2.0 30.07.2011

var ll_markers = [];
var ll_zoom = [];
var ll = 0;
var ll_win = null;

var ll_tracks = [];

function showBlinker (b) {
     if (b){
         document.getElementById("go").style.visibility="hidden";
         document.getElementById("go").style.display="none";
         document.getElementById("wait").style.visibility="visible";
         document.getElementById("wait").style.display="inline";
     } else {
         document.getElementById("go").style.visibility="visible";
         document.getElementById("go").style.display="inline";
         document.getElementById("wait").style.visibility="hidden";
         document.getElementById("wait").style.display="none";
     }
}
function xml_nl(s) {
     return s.replace(/\|/g, "<br/>");
}

function showGPX (data, zoom) {         
  // alert(data);
     var a_pts = 0;
     var havedata = false;
     if(data){
         havedata = true;
         var xml = GXml.parse(data);
         var meta = xml.documentElement.getElementsByTagName("meta");
         a_pts = parseFloat(meta[0].getAttribute("a_pts"));
     }
     if (a_pts == 0){
          map.setCenter(startPoint, zoomlevel);
          showBlinker(false);
          var  i_win = "<div style=\"padding:15px;\" >";
               if (havedata)
                    i_win += xml_nl(meta[0].getAttribute("error"));
               else
                    i_win += "keine oder ungÃ¼ltige GPX-Datei!";
               i_win += "<div style=\"text-align:center;width:220px\"><br/><input type=\"button\" onclick=\"okbtn = true; closeit();\" style=\"width:60px; height:30px\" value=\"ok\" class=\"btn\"></div></div>";
          var b = 50 + i_win.length/3;
          var ab = 'width=262px,height=' + b + 'px,center=1,resize=1,scrolling=1';
          //alert(meta[0].getAttribute("error"));
          inlinewin=dhtmlwindow.open("broadcastbox", "inline", i_win, "Fehlermeldung!", ab, "recal");
          return;
     }

     document.getElementById("t_filename").title = "Angezeigte Datei: " + meta[0].getAttribute("name");
     document.getElementById("t_filename").innerHTML = "Angezeigte Datei: " + meta[0].getAttribute("name").substring(0, 39);
     var sw = new GLatLng(parseFloat(meta[0].getAttribute("s")), parseFloat(meta[0].getAttribute("w")));
     var ne = new GLatLng(parseFloat(meta[0].getAttribute("n")), parseFloat(meta[0].getAttribute("e")));
     var latLngBounds = new GLatLngBounds(sw, ne);
     var center = latLngBounds.getCenter();

	 if(zoom == -1){
		zoomlevel = map.getBoundsZoomLevel(latLngBounds);
	 } else {
		zoomlevel = zoom;
	 }

     if (a_pts == 1)
         zoomlevel -= 3;      // dann um eins vergroessern

     var zomm_wpt = 16;       // zoom für gehe zu

     map.setCenter(center, zoomlevel);

     var track = xml.documentElement.getElementsByTagName("track");
     var stidx = 0;
     var dist = 0;
     for (var i = 0; i < track.length; i++) {
           ll_tracks.push();
           ll_tracks[i] = new GPolyline.fromEncoded({
                color: "#ff0000",
                weight: 4,
                points: track[i].getAttribute("points"),
                levels: track[i].getAttribute("levels"),
                zoomFactor: parseFloat(track[i].getAttribute("zoomFactor")),
                numLevels: parseFloat(track[i].getAttribute("numLevels"))
           });
           map.addOverlay(ll_tracks[i]);

           // track start point marker
           ll_markers.push();
           var point = new GLatLng(parseFloat(track[i].getAttribute("lat")), parseFloat(track[i].getAttribute("lon")));
           dist = parseFloat(track[i].getAttribute("dist"));
     	 dist = Math.round(100 * dist / 1000) / 100;

           var infow = createInfoWin(track[i], dist);

           var symbol = parseInt(track[i].getAttribute("type"));
           if (isNaN(symbol))
               symbol = 0;
           ll_markers[i] = createMarker(point,track[i].getAttribute("name"), infow, symbol, 1, dist);
           map.addOverlay(ll_markers[i]);
           stidx++;
     }
     // waypoint markers
     var waypt = xml.documentElement.getElementsByTagName("waypt");
     var i = 0;   
     for (var j = stidx; j < stidx + waypt.length; j++) {
           ll_markers.push();
           var point = new GLatLng(parseFloat(waypt[i].getAttribute("lat")), parseFloat(waypt[i].getAttribute("lon")));

           var infow = createInfoWin(waypt[i], null);

           var symbol = parseInt(waypt[i].getAttribute("sym"));
           if (isNaN(symbol))
               symbol = 0;
           ll_markers[j] =  createMarker(point, waypt[i].getAttribute("name"),infow , symbol, 0, 0);
           i++;
           map.addOverlay(ll_markers[j]);
     }
     showBlinker(false);
}
var mf = null;
function OpenURL(url){
  mf = window.open(url, "_blank");
  mf.focus();
}
// build InfoWindow
function createInfoWin(point, distance){

     var zomm_wpt = 16;       // zoom für gehe zu
     var infow = "<div><table cellpadding='2' cellspacing='2' border='0'><tr><td colspan='2'>";

     if (point.getAttribute("link") != "")
         infow +=  "<b><a href='" + point.getAttribute("link") + "' target='_blank'>" + point.getAttribute("name") + "</a></b>";
     else
         infow +=  "<b>" + point.getAttribute("name") + "</b>";

     if(distance > 0) {
          infow += "</br>Dist.:" + distance + " km";
     }

     infow += "</td></tr>";

     if (point.getAttribute("desc")!=""){
         if(point.getAttribute("desc").length > 38)
              var st = 'border:1px; height=150px;';
         else
              var st = 'overflow:hidden; border:0px;';
         infow += "<tr><td colspan='2'><textarea class='outo' style='" + st + "'>" + point.getAttribute("desc") + "</textarea></td></tr>";
     }
//     else
//          infow += "</br>";

     infow += "<tr>";

     if (point.getAttribute("link") != ""){
         infow += "<td align='center'><input type='button' class='btn' onclick='OpenURL(\"" + point.getAttribute("link") + "\"); return false;' value='gehe zu' class='btn'></td><td align='center'>";
     }
     else
         infow += "<td colspan='2'>";

     infow += "<input type='button' class='btn' onclick='map.setCenter(new GLatLng(" + parseFloat(point.getAttribute("lat")) + ", " + parseFloat(point.getAttribute("lon"))+")";
     infow += " , "+zomm_wpt+"); map.closeInfoWindow(); return false;' value='zoomen' class='btn'>";
     infow += "</td></tr></table></div>";
     return infow;
}

// Track- oder Wpt-Marker
function createMarker(point, e_name, infotext, icon, is_track, distance) {
     var opts = new Object();
     opts.clickable = true;
     opts.title = '';
     if (is_track == 1){
          if (icon < 0 ||icon > 15)
               icon = 0;
          if (e_name.search(track_marker_lable[icon]) == -1)
               opts.title += track_marker_lable[icon] +',\n';

     }else   {
          if (icon < 0 || icon > 27)
               icon = 0;
          if (e_name.search(poi_marker_lable[icon]) == -1)
               opts.title += poi_marker_lable[icon] +',\n';
     }

      if (e_name != '')
          opts.title += e_name +',\n';

      if (distance > 0)
          opts.title += 'Dist.:' + distance + ' [km],\n';

     opts.title +=  'Klick f\u00FCr weitere Infos';

     opts.icon =  createIcon(icon,is_track);
     var marker = new GMarker(point,opts);

	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(infotext);
	});
	return marker;
}

function createIcon(i,is_track) {
     var icon = new GIcon();
     i++;
     if (is_track == 1){
          icon.image = 'bilder/trz_'+i+'.png';
          icon.shadow = "bilder/shadow_rect.png";
          icon.iconSize = new GSize(26, 28);
          icon.shadowSize = new GSize(34, 18);
          icon.iconAnchor = new GPoint(7, 28);
          icon.infoWindowAnchor = new GPoint(7,28);
    } else  {
          icon.image = 'bilder/poz_'+i+'.gif';
          icon.shadow = "bilder/shadow_rect.png";
          icon.iconSize = new GSize(18, 25);
          icon.shadowSize = new GSize(34, 18);
          icon.iconAnchor = new GPoint(1, 25);
          icon.infoWindowAnchor = new GPoint(1,25);
     }
     return icon;
}


function clear_xml(){
	map.closeInfoWindow(); // if something is opened

	for (var i=0; i<ll_tracks.length; i++) {
         map.removeOverlay(ll_tracks[i]);
	}
     ll_tracks = [];
//alert(ll_markers.length);

	for (var j=0; j<ll_markers.length; j++) {
         map.removeOverlay(ll_markers[j]);
	}
	ll_markers = [];
     ll_zoom = [];
     startLocListener();
     showBlinker(true);
}

function load_xml(xml_id){
    clear_xml();      

    GDownloadUrl('load_xml.php?db_track='+xml_id, function(data, responseCode){
         showGPX (data);
    });
}

function load_xml_url(g_fileurl, g_filename, g_referer, zoom ){
    clear_xml();
    GDownloadUrl('load_xml.php?g_fileurl='+ g_fileurl + '&g_filename=' + g_filename + '&g_referer=' + g_referer, function(data, responseCode){
         showGPX (data, zoom);
    });
}
/*function load_xml_url(g_fileurl, g_filename ){
    clear_xml();
    GDownloadUrl('load_xml.php?g_fileurl='+g_fileurl + '&g_filename=' + g_filename, function(data, responseCode){
         showGPX (data);  
    });
}*/
// wird von Adr-Search und Load benutzt

function startLocListener() {
      if (ll!=0) return;
	  ll = GEvent.addListener(map, "click", function(overlay, point) {
          if (overlay) {
              if (overlay.id)
                   overlay.openInfoWindowHtml(overlay.infowindow);
          }
      });
}

// Beginn Adressen- und Location- Search

function gotoMk(i){
//alert(i  + ' --- '+ ll_zoom[i]);
	map.closeInfoWindow(); // if something is opened
	map.setCenter(ll_markers[i].getPoint(), ll_zoom[i]);
}
// Adress/Location search-Marker
function setLLMarker(point,n,l,p,z){
    ll_zoom.push();
    ll_zoom[ll_zoom.length] = z;
    ll_markers.push();
    var opts = new Object();
    opts.clickable = true;
    opts.title = 'Klick f\u00FCr Infos';
    ll_markers[ll_markers.length] = new GMarker(point,opts);
    i = ll_markers.length-1;
    ll_markers[ll_markers.length-1].id = ll_markers.length;

    ll_markers[ll_markers.length-1].infowindow = '<div><td>Ort/Adresse: </br>' + n;
    if (l != "")
          ll_markers[ll_markers.length-1].infowindow += '<br/>Land: ' + l;
    if (p != "")
          ll_markers[ll_markers.length-1].infowindow += '<br/>Einwohner: '+ p;
    ll_markers[ll_markers.length-1].infowindow += '<br/></td><td><input type="button" value="zoomen" class="btn" onClick="gotoMk(' + i + ')" ></td></div>';

    map.addOverlay(ll_markers[ll_markers.length-1]);
}

function getLocation(){
     showBlinker(true);
	map.closeInfoWindow(); // if something is opened
	for (var i=0; i<ll_markers.length; i++) {
		map.removeOverlay(ll_markers[i]);
	}
	ll_markers = [];
     ll_zoom = [];
     startLocListener();

     var desc = document.getElementById("searchpt");

     if (document.getElementById("adress").checked == true){
          var geocoder = new GClientGeocoder();
            geocoder.getLatLng(
              desc.value,
              function(point) {
                if (!point) {
                 // alert(desc.value + " nicht gefunden");
                     openhelp('h_search_error_adress');
                } else {
                  map.setCenter(point, 14);
                 // var marker = new GMarker(point);
                 // map.addOverlay(marker);
                 // marker.openInfoWindowHtml(desc.value);
                  setLLMarker(point,desc.value,"","",16);
                }
                showBlinker(false);
             }
            );

     } else {
           GDownloadUrl('loc.php?query=' + desc.value, function(data, responseCode) {
           // alert(data);
              var xml = GXml.parse(data);
              var latLngBounds = new GLatLngBounds();
              var markers = xml.documentElement.getElementsByTagName("marker");
              for (var i = 0; i < markers.length; i++) {
                   var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
                     parseFloat(markers[i].getAttribute("lng")));
                     var zoom = parseFloat(markers[i].getAttribute("zoom"));
                     var pop = parseFloat(markers[i].getAttribute("pop"));
                     if (pop == -1)
                          pop ='keine Angaben';
                     var nobm = markers[i].getAttribute("name");
                     var land = markers[i].getAttribute("land");
                     setLLMarker(point,nobm,land,pop,zoom);
                     latLngBounds.extend(point);
               }
               if (i == 0){
                     openhelp('h_search_error_ort');
                     map.setCenter(point,zoom);
               }else{
            		var center = latLngBounds.getCenter();
            		zoom = map.getBoundsZoomLevel(latLngBounds);
            		map.setCenter(center, zoom);
               }
               showBlinker(false);
          });
     }
}

/*
Ajax konformer Datei Upload
*/
function xml_unescape(s) {
     return s.replace(/&amp;/g, "&")
             .replace(/&lt;/g, "<")
             .replace(/&gt;/g, ">");
}

function startCallback() {
     showBlinker(true);
	return true;
}

function completeCallback(response) {
     if (parseInt(response) > 0){
          load_xml(parseInt(response)); // über ID nochmal anfragen
     }
     else
          showGPX (xml_unescape(response));
}

AIM = {
	frame : function(c) {

		var n = 'f' + Math.floor(Math.random() * 99999);
		var d = document.createElement('DIV');
		d.innerHTML = '<iframe style="display:none" src="about:blank" id="'+n+'" name="'+n+'" onload="AIM.loaded(\''+n+'\')"></iframe>';
		document.body.appendChild(d);

		var i = document.getElementById(n);
		if (c && typeof(c.onComplete) == 'function') {
			i.onComplete = c.onComplete;
		}

		return n;
	},

	form : function(f, name) {
		f.setAttribute('target', name);
	},

	submit : function(f, c) {
		AIM.form(f, AIM.frame(c));
		if (c && typeof(c.onStart) == 'function') {
			return c.onStart();
		} else {
			return true;
		}
	},

	loaded : function(id) {
		var i = document.getElementById(id);
		if (i.contentDocument) {
			var d = i.contentDocument;
		} else if (i.contentWindow) {
			var d = i.contentWindow.document;
		} else {
			var d = window.frames[id].document;
		}
		if (d.location.href == "about:blank") {
			return;
		}

		if (typeof(i.onComplete) == 'function') {
			i.onComplete(d.body.innerHTML);
		}
	}
}

