

var trackLineColor = new Array ( '#ff0000', '#00f0f0', '#00ff00', '#0000ff', '#ff00ff', '#0ff00f', '#aa0000', '#00a0a0', '#00aa00', '#aa00aa', '#0aa00a' );


function loadMapData ( map, file ) {

    document.getElementById ( 'loadMessage' ).style.display = 'block';

    GDownloadUrl ( "./xml/" + file, function ( data ) {
        var xml = GXml.parse ( data );
        
        // Bilder, Bemerkungen usw.
        var spotXml = xml.documentElement.getElementsByTagName ( "p" );
        for ( var i = 0; i < spotXml.length; i++ ) {
            setMarkerXml ( spotXml[i] );
        }
        
        // Track
        var waypointXml = xml.documentElement.getElementsByTagName ( "t" );
        var waypointArr = new Array ();
        
        var km = 0;
        var lastLevel = new Array ( 0, 0, 0 );
        var gesamtkilometer = 0;
        var gesamthoehenmeter = 0;
        var hoechsterPunkt = 0;
        var tiefsterPunkt = 10000;
        
        for ( var i = 0; i < waypointXml.length; i++ ) {
        
            waypointArr[i] = new GLatLng ( parseFloat ( waypointXml[i].getAttribute ( "a" ) ), parseFloat ( waypointXml[i].getAttribute ( "n" ) ) );
        
            gesamtkilometer += parseFloat ( waypointXml[i].getAttribute ( "d" ) );
            
            if ( ( i > 0 ) && parseFloat ( waypointXml[i].getAttribute ( "h" ) ) > lastLevel[2] ) {
                gesamthoehenmeter += parseFloat ( waypointXml[i].getAttribute ( "h" ) - lastLevel[2] );
            }
            
            if ( parseFloat ( waypointXml[i].getAttribute ( "h" ) ) > hoechsterPunkt ) {
                hoechsterPunkt = parseFloat ( waypointXml[i].getAttribute ( "h" ) );
            }
            
            if ( parseFloat ( waypointXml[i].getAttribute ( "h" ) ) < tiefsterPunkt ) {
                parseFloat ( tiefsterPunkt = waypointXml[i].getAttribute ( "h" ) );
            }
            
            // Punkte für Höhenprofil ergänzen bzw. auslassen (ich gehe davon aus, dass Trackpoints
            // max. 1000 m auseinander liegen können)
            for ( var j = 1000; j > 0; j = j - 100 ) {
                    
                if ( ( gesamtkilometer >= km + j ) && ( j > 100 ) ) {
                    var diff = ( parseFloat ( waypointXml[i].getAttribute ( "h" ) ) - lastLevel[2] ) / ( ( j / 100 ) + 1 );
                    for ( var y = 0; y < ( j / 100 ); y++ ) {
                        lastLevel[2] += diff;
                        levelPoints[levelPoints.length] = lastLevel;
                    }
                
                    levelPoints[levelPoints.length] = new Array ( parseFloat ( waypointXml[i].getAttribute ( "a" ) ), parseFloat ( waypointXml[i].getAttribute ( "n" ) ), parseFloat ( waypointXml[i].getAttribute ( "h" ) ), gesamthoehenmeter, gesamtkilometer );
                    km += j + 100;
                    break;
                } else if ( gesamtkilometer >= km ) {
                    levelPoints[levelPoints.length] = new Array ( parseFloat ( waypointXml[i].getAttribute ( "a" ) ), parseFloat ( waypointXml[i].getAttribute ( "n" ) ), parseFloat ( waypointXml[i].getAttribute ( "h" ) ), gesamthoehenmeter, gesamtkilometer );
                    km += 100;
                    break;
                }
            }
                                
            lastLevel = new Array ( parseFloat ( waypointXml[i].getAttribute ( "a" ) ), parseFloat ( waypointXml[i].getAttribute ( "n" ) ), parseFloat ( waypointXml[i].getAttribute ( "h" ) ), gesamthoehenmeter, gesamtkilometer );
            
        }
        
        var polyline = new GPolyline ( waypointArr, trackLineColor[0], 2 );
                
        map.addOverlay ( polyline );
        
        document.getElementById ( 'gesamtkilometer' ).innerHTML = Math.round ( gesamtkilometer / 100 ) / 10;
        document.getElementById ( 'gesamthoehenmeter' ).innerHTML = Math.round ( gesamthoehenmeter );
        document.getElementById ( 'hoechsterPunkt' ).innerHTML = Math.round ( hoechsterPunkt );
        document.getElementById ( 'tiefsterPunkt' ).innerHTML = Math.round ( tiefsterPunkt );
        
        if ( document.getElementById('tour_km_1') ) { document.getElementById('tour_km_1').value = Math.round ( gesamtkilometer / 100 ) / 10; }
        if ( document.getElementById('tour_hm_1') ) { document.getElementById('tour_hm_1').value = Math.round ( gesamthoehenmeter ); }
            
        if ( document.getElementById('tour_km_2') ) { document.getElementById('tour_km_2').value = Math.round ( gesamtkilometer / 100 ) / 10; }
        if ( document.getElementById('tour_hm_2') ) { document.getElementById('tour_hm_2').value = Math.round ( gesamthoehenmeter ); }
        
        document.getElementById ( 'loadMessage' ).style.display = 'none';   
        
        schieber.init();
        scroller.init();
            
        }
    );
}    


function setMarkerXml ( spotsXml ) {

    var markerTyp = spotsXml.getAttribute ( "t" );
    var iconFile = null;
    var textergaenzungPre = '';
    var textergaenzungPost = '';

    if ( markerTyp == 'S' ) {
        iconFile = 'iconMapStart.gif';
        textergaenzungPre = 'Start:<br />';
    } else if ( markerTyp == 'E' ) {
        iconFile = 'iconMapEnde.gif';
        textergaenzungPre = 'Ende:<br />';
    } else if ( markerTyp == 'F' ) {
        iconFile = 'iconMapFoto.gif';
    } else if ( markerTyp == 'I' ) {
        iconFile = 'iconMapInfo.gif';
    } else {
        iconFile = 'iconMapPunkt.gif';
    }
    
    var markerIcon = new GIcon ();
    markerIcon.image = "./bilder/" + iconFile;
    markerIcon.iconSize = new GSize ( 12, 16 );
    markerIcon.iconAnchor = new GPoint ( 6,16 );
    markerIcon.infoWindowAnchor = new GPoint ( 6, 16 );

    var marker = new GMarker ( new GLatLng ( parseFloat ( spotsXml.getAttribute("a") ), parseFloat ( spotsXml.getAttribute("n") ) ), markerIcon );
    
    var html = '';        
    
    // Bild
    var fileName = false;
    var img = spotsXml.getElementsByTagName ( "o" );
    if ( img.length > 0 ) {
        fileName = img[0].getAttribute ( "f" ) ;
    }
    
    // Anmerkung
    var anmerkungText = false;
    var anmerkung = spotsXml.getElementsByTagName ( "a" );
    if ( anmerkung.length > 0 ) {
        anmerkungText = anmerkung[0].getAttribute ( "t" ) ;
    }
    
    if ( fileName ) {
        html = '<a href="#" onclick="openImgWindow( ' + "'" + 'bilder/wegpunktbilder/gross/' + fileName + "','', 575" + ' );return false;"><img alt="" src="./bilder/wegpunktbilder/klein/' + fileName + '" /></a>';
    } else if ( anmerkungText ) {
        html = textergaenzungPre + anmerkungText + textergaenzungPost;
    
    }
    
    GEvent.addListener ( marker, 'click', function () {
        marker.openInfoWindowHtml ( html );
    });
    
    map.addOverlay ( marker );

}

var loadedStartingPoints = new Array ();
function loadStartingPoints ( map, mapArea, linkElement ) {
    
    for ( var i = 0; i < loadedStartingPoints.length; i++ ) {
        if ( loadedStartingPoints[i] == mapArea ) {
            return;
        }
    }
    
    switch ( mapArea ) {
        case "no":
            document.getElementById ( mapArea ).src = './bilder/buttonEtappenNoOn.jpg';
            linkElement.style.cursor = 'default';
            break;
        case "so":
            document.getElementById ( mapArea ).src = './bilder/buttonEtappenSoOn.jpg';
            linkElement.style.cursor = 'default';
            break;
        case "nw":
            document.getElementById ( mapArea ).src = './bilder/buttonEtappenNwOn.jpg';
            linkElement.style.cursor = 'default';
            break;
        case "sw":
            document.getElementById ( mapArea ).src = './bilder/buttonEtappenSwOn.jpg';
            linkElement.style.cursor = 'default';
            break;   
    }    
    loadedStartingPoints[loadedStartingPoints.length] = mapArea;

    document.getElementById ( 'loadMessage' ).style.display = 'block';
    
    GDownloadUrl ( "./xml/etappenuebersicht.php5?mapArea="+mapArea, function ( data ) {

            var markerIcon = new GIcon ();
            markerIcon.image = "./bilder/iconMapStart.gif";
            markerIcon.iconSize = new GSize ( 12, 16 );
            markerIcon.iconAnchor = new GPoint ( 6,16 );
            markerIcon.infoWindowAnchor = new GPoint ( 6, 16 );
        
            var xml = GXml.parse ( data );
            var markers = xml.documentElement.getElementsByTagName ( "m" );
                
            for ( var i = 0; i < markers.length; i++ ) {
            
                var lat = markers[i].getAttribute ( "a" );
                var lng = markers[i].getAttribute ( "n" );
                var id_etappe = markers[i].getAttribute ( "i" );
                var point = new GLatLng ( parseFloat ( lat ), parseFloat ( lng ) );
                var marker = createMarker ( point, lat, lng, markerIcon );
                map.addOverlay ( marker );
                
            }
            
            document.getElementById ( 'loadMessage' ).style.display = 'none';
            
        }
    );
}
    

function loadTrackOverview ( map ) {
    
    document.getElementById ( 'loadMessage' ).style.display = 'block';
    
    GDownloadUrl ( "./xml/gesamtuebersicht.php5", function ( data ) {

            var xml = GXml.parse ( data );
            var etappeXml = xml.documentElement.getElementsByTagName ( "e" );
            
            for ( var i = 0; i < etappeXml.length; i++ ) {
                
                writeTrackLine ( map, etappeXml[i], trackLineColor[0] );
                            
            }
            
            document.getElementById ( 'loadMessage' ).style.display = 'none';
            
        }
    );
}


function createMarker ( point, lat, long, icon ) {

    var marker = new GMarker ( point, icon );
    GEvent.addListener ( marker, 'click', function () {
        loadTrackpointsLatLng ( lat, long );
    });

    return marker;

}


function loadTrackpointsLatLng ( lat, lng ) {

    for ( var i = 0; i < polyline.length; i++ ) {
        map.removeOverlay ( polyline[i] );
    }
    
    document.getElementById ( 'loadMessage' ).style.display = 'block';
    
    GDownloadUrl ( "./xml/etappenLatLng.php5?lat=" + lat + "&lng=" + lng, function ( data ) {
            var xml = GXml.parse ( data );
            var etappeXml = xml.documentElement.getElementsByTagName ( "etappe" );
            
            for ( var i = 0; i < etappeXml.length; i++ ) {
                
                writeEteppeninfo ( etappeXml[i].getAttribute("id"),
                                    etappeXml[i].getAttribute("name"),
                                    etappeXml[i].getAttribute("start"),
                                    etappeXml[i].getAttribute("ende"),
                                    etappeXml[i].getAttribute("lat"),
                                    etappeXml[i].getAttribute("lng"),
                                    trackLineColor[i],
                                    i );
            
                var trackpointsXml = etappeXml[i].getElementsByTagName ( "trackpoints" )
                
                writeTrackLine ( map, trackpointsXml[0], trackLineColor[i] );
                            
            }
            
            document.getElementById ( 'loadMessage' ).style.display = 'none'; 
        }
    );
    
}
  
  
function loadTrackpointsEtappe ( id_etappe, color ) {
    
    for ( var i = 0; i < polyline.length; i++ ) {
        map.removeOverlay ( polyline[i] );
    }
    
    document.getElementById ( 'loadMessage' ).style.display = 'block';
    
    GDownloadUrl ( "./xml/etappe.php5?id_etappe=" + id_etappe, function ( data ) {
            var xml = GXml.parse ( data );
            
            var waypointXml = xml.documentElement.getElementsByTagName ( "t" ); 
            var waypointArr = new Array ();
            
            for ( var i = 0; i < waypointXml.length; i++ ) {
                waypointArr[i] = new GLatLng ( parseFloat ( waypointXml[i].getAttribute("a") ), parseFloat ( waypointXml[i].getAttribute("n") ) );
            
            }
            
            polyline[0] = new GPolyline ( waypointArr, color, 2 );
            
            map.addOverlay ( polyline[0] );
            
            document.getElementById ( 'loadMessage' ).style.display = 'none';
            
        }
    );

}
    
    
function findEtappe ( searchTerm ) {

    if ( extraMarker ) {
        map.removeOverlay ( extraMarker );
    }

    document.getElementById ( 'loadMessage' ).style.display = 'block';

    GDownloadUrl ( "./xml/etappenFind.php5?searchTerm=" + encodeURI ( searchTerm ), function ( data ) {
            var xml = GXml.parse ( data );
            
            var etappeXml = xml.documentElement.getElementsByTagName("etappe");
    
            for ( var i = 0; i < etappeXml.length; i++ ) {
                          
                writeEteppeninfo ( etappeXml[i].getAttribute("id"),
                                    etappeXml[i].getAttribute("name"),
                                    etappeXml[i].getAttribute("start"),
                                    etappeXml[i].getAttribute("ende"),
                                    etappeXml[i].getAttribute("lat"),
                                    etappeXml[i].getAttribute("lng"),
                                    trackLineColor[0],
                                    i );
            }
            
            
            if ( etappeXml.length == 0 ) {
                document.getElementById ( 'layoutEtappenlisteUebersicht' ).innerHTML = '<p>Zu diesem Suchbegriff wurde kein Ort gefunden</p>';
            }
                
            document.getElementById ( 'loadMessage' ).style.display = 'none';
                            
        }
    );

}
    
     
function writeEteppeninfo ( id, name, start, ende, lat, lng, color, idx ) {

    var html = '<div class="layoutDhtmlEtappeOuter">';
    html += '<div class="layoutDhtmlEtappeText">';
    html += '<span class="layoutDhtmlEtappeColor" style="background-color:' + color + '">';
    html += '&nbsp;&nbsp;</span>&nbsp;';
    html += name + '<br />';
    html += 'Start: ' + start + '<br />';
    html += 'Ende: ' + ende;
    html += '</div>';
    html += '<div class="layoutDhtmlEtappeLinks">';
    html += '<a class="layoutDhtmlIconEtappe" title="Details" onclick="openPopupDetails(\'' + id + '\');return false;" href="etappen2.php5?id_etappe=' + id + '"><img src="./bilder/iconDetails.gif" alt="Details zur Etappe anzeigen" title="Details zur Etappe anzeigen" /></a>';
    html += '<a class="layoutDhtmlIconEtappe" title="Auf Karte zeigen" href="javascript:centerMap( ' + lat + ', ' + lng + ', ' + id + ', \'' + color + '\' )"><img src="./bilder/iconAufKarteZeichnen.gif" alt="Etappe auf die Karte zeichnen" title="Etappe auf die Karte zeichnen" /></a>';
    if ( sideId == 'tourenplaner' ) {
        html += '<a class="layoutDhtmlIconEtappe" href="javascript:addTrackToTour (\'tourenplaner2.php5?func=start&id_etappe=' + id + '\');"><img src="./bilder/iconEtappeHinzufuegen.gif" alt="Etappe zur Tour hinzuf&uuml;gen" title="Etappe zur Tour hinzuf&uuml;gen" /></a>';
    }
    html += '</div>';
    html += '<div style="clear:both;"></div>';
    html += '</div>';
    
    if ( idx == 0 ) {
        document.getElementById ( 'layoutEtappenlisteUebersicht' ).innerHTML = html;
    } else {
        document.getElementById ( 'layoutEtappenlisteUebersicht' ).innerHTML += html;
    }

}
  

function writeTrackLine ( map, etappeXml, trackColor ) {

    var waypointXml = etappeXml.getElementsByTagName ( "p" );
    var waypointArr = new Array ();
    for ( var i = 0; i < waypointXml.length; i++ ) {
        waypointArr[i] = new GLatLng ( parseFloat ( waypointXml[i].getAttribute("a") ), parseFloat ( waypointXml[i].getAttribute("n") ) );
    }
    
    polyline[polyline.length] = new GPolyline ( waypointArr, trackColor, 2 );
        
    map.addOverlay ( polyline[polyline.length - 1] );

}



var extraMarker = false;
function centerMap ( lat, lng, id_etappe, color ) {

    if ( extraMarker ) {
        map.removeOverlay ( extraMarker );
    }

    var point = new GLatLng ( parseFloat ( lat ), parseFloat ( lng ) );
    
    map.setCenter ( point );
    loadTrackpointsEtappe ( id_etappe, color );

    var markerIcon = new GIcon ();
    markerIcon.image = "./bilder/iconMapStart.gif";
    markerIcon.iconSize = new GSize ( 12, 16 );
    markerIcon.iconAnchor = new GPoint ( 6, 16 );
    
    extraMarker = createMarker ( point, lat, lng, markerIcon );
    map.addOverlay ( extraMarker );

}


function addTrackToTour ( url ) {

    location.href = url + '&zoomLevel=' + map.getZoom() + '&mapType=' + map.getCurrentMapType().getUrlArg();

}


function removeTrack ( url ) {

    location.href = url + '&zoomLevel=' + map.getZoom() + '&mapType=' + map.getCurrentMapType().getUrlArg();

}

