// Developed by Carsten Fuchs Software, www.cafu.de
// Copyright (c) 2009 Carsten Fuchs Software.

// This code assumes that:
// a) Filialen is a global array of objects that describe the ROFU stores.
// b) InitialGeoLat, InitialGeoLong and InitialZoom are global variable appropriately initialized.


var GoogleMap      = null;
var GoogleGeoCoder = null;


// Der Konstruktor für ein Objekt vom Typ "EntfernungZurFiliale". Er nimmt zwei Argumente:
// Fil    ist ein Objekt vom Typ "Filiale",
// Entf   ist eine Zahl (die Entfernung in km).
function EntfernungZurFiliale(Fil, Entf)
{
    this.Fil =Fil;
    this.Entf=Entf;

    this.toString=function()
    {
        return Fil.PLZ+" "+Fil.Ort+", "+Fil.Strasse+" - Entf.: "+Entf;
    }
}


// Vergleicht zwei Objekte A und B vom Typ "EntfernungZurFiliale" nach ihrem Entf Wert.
function VergleicheEntfZurFil(A, B)
{
    return A.Entf-B.Entf;
}


// Nimmt einen String mit einer Adresse entgegen, bestimmt mit dem GoogleGeoCoder die Koords,
// und fuegt an dieser Stelle einen Marker in die Map ein.
function ZeigeAdresse(AdresseString, LandString)
{
    if (GoogleGeoCoder)
    {
        GoogleGeoCoder.getLatLng(AdresseString+LandString,
            function(point)
            {
                if (!point)
                {
                    alert("Wir haben die Adresse \"" + AdresseString+LandString + "\" leider nicht gefunden.");
                }
                else
                {
                    // In der aktuellen Version nicht mehr...
                    // var marker = new GMarker(point);
                    // GoogleMap.addOverlay(marker);
                    // marker.openInfoWindowHtml(AdresseString+LandString);

                    // 1. Bestimme die Entfernung zu allen Filialen.
                    var EntfZurFil=new Array();

                    for (var FilNr=0; FilNr<Filialen.length; FilNr++)
                    {
                        var Fil =Filialen[FilNr];
                        var Entf=point.distanceFrom(new GLatLng(Fil.GeoLat, Fil.GeoLong))/1000.0;   // Entfernung in km.

                        // if (Entf<=50*1.5)
                        EntfZurFil.push(new EntfernungZurFiliale(Fil, Entf));
                    }

                    // 2. Sortiere die Liste.
                    EntfZurFil.sort(VergleicheEntfZurFil);
                    // alert("Im Umkreis von 50km gibt es die Filialen:\n"+EntfZurFil.join("\n"));

                    // 3. Gib die (ersten) Treffer aus.
                    var AusgabeDiv=document.getElementById("AusgabeFilialenInDerNaehe");

                    if (AusgabeDiv)
                    {
                        var BgFarben=new Array("#ffeb80", "#ffef99", "#fff3b3", "#fff7cc", "#ffd900");

                        // Alle child nodes von vorherigen Durchläufen entfernen.
                        while (AusgabeDiv.firstChild) AusgabeDiv.removeChild(AusgabeDiv.firstChild);

                        // Erzeuge neue Hierarchie: AusgabeDiv - ul - (li, li, li, ...).
                        //     <li><a href="LinkZurFiliale"><b>PLZ Ort</b>, Str</a></li>
                        //X AusgabeDiv.appendChild(document.createElement("ul"));

                        for (var FilNr=0; FilNr<3 && FilNr<EntfZurFil.length; FilNr++)
                        {
                            var Fil =EntfZurFil[FilNr].Fil;
                            var Entf=EntfZurFil[FilNr].Entf;

                            var liElem=document.createElement("div");   //X "li"
                            var  aElem=document.createElement("a");
                            var  bElem=document.createElement("b");

                             bElem.appendChild(document.createTextNode(Fil.PLZ+" "+Fil.Ort));
                             aElem.appendChild(bElem);
                             aElem.appendChild(document.createTextNode(", "+Fil.Strasse /* +" - Entf.: "+Entf */));
                             aElem.href="http://www.rofu.de/site/Filialfinder.html?fil="+Fil.ID;
                          // aElem.style.color          =BgFarben[(FilNr+1) % BgFarben.length];
                             aElem.style.backgroundColor=BgFarben[FilNr % BgFarben.length];
                            liElem.className="filialfinder-ergebnis";
                            liElem.appendChild(aElem);

                            //X AusgabeDiv.firstChild.appendChild(liElem);
                            AusgabeDiv.appendChild(liElem);
                        }


                        var liElem=document.createElement("div");   //X "li"

                        for (var FilNr=3; FilNr<8 && FilNr<EntfZurFil.length; FilNr++)
                        {
                            var Fil =EntfZurFil[FilNr].Fil;
                            var Entf=EntfZurFil[FilNr].Entf;

                            var aElem=document.createElement("a");

                            aElem.appendChild(document.createTextNode(Fil.Ort));
                            aElem.href="http://www.rofu.de/site/Filialfinder.html?fil="+Fil.ID;

                            liElem.appendChild(aElem);
                            liElem.appendChild(document.createTextNode(" \u2022 "));    // Bullet "*"
                        }

                        liElem.appendChild(document.createTextNode("\u2026"));      // Ellipse "..."
                        liElem.className="filialfinder-erg2";
                        liElem.style.backgroundColor=BgFarben[3 % BgFarben.length];

                        //X AusgabeDiv.firstChild.appendChild(liElem);
                        AusgabeDiv.appendChild(liElem);
                    }

                    // 4. Setze Map Zoom entsprechend.
                    // Ein Zoom-Level zum nächsten halbiert oder verdoppelt den Kartenmaßstab, berechne daher zuerst
                    // den Zweier-Logarithmus der Entfernung. Der gesamte "Rest" reduziert sich auf einen konstanten
                    // Summand (hier 13), der nicht exakt ausgerechnet werden kann, weil man das Verhältnis Pixel zu
                    // km nicht kennt. Ich habe ihn daher einfach durch Ausprobieren festgelegt - muss eh auf den
                    // nächsten Integer runden, weswegen man dasselbe Ergebnis erhält.
                    var ZoomLevel=13-Math.floor(Math.log(EntfZurFil[0].Entf)/Math.log(2));

                    if (ZoomLevel< 1) ZoomLevel= 1;
                    if (ZoomLevel>17) ZoomLevel=17;

                    // alert(ZoomLevel + "   für " + EntfZurFil[0].Entf + " km");
                    GoogleMap.setCenter(point, ZoomLevel);

                    // Zeige eine Sprechblase an, die auf den gefundenen Ort zeigt.
                    GoogleMap.openInfoWindowHtml(point, AdresseString+LandString);
                }
            }
        );
    }
}


// Creates a marker at the given point with the given number label.
function createMarker(point, icon, tooltip, label)
{
    var MarkerOptions =
    {
        icon:  icon,
        title: tooltip
    }

    var marker = new GMarker(point, MarkerOptions);

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


// Wird als Handler des window.onload Events aufgerufen.
function LoadGoogleMaps()
{
    if (GBrowserIsCompatible())
    {
        // Create the ROFU-Icon for the markers.
        var icon = new GIcon();

        icon.image = "http://www.rofu.de/site/images/filialfinder/icons/favicon_24a.png";
        icon.iconSize = new GSize(28, 28);
        icon.shadow = "http://www.rofu.de/site/images/filialfinder/icons/favicon_shadow1.png";
        icon.shadowSize = new GSize(36, 36);
        icon.iconAnchor = new GPoint(9, 9);
        icon.infoWindowAnchor = new GPoint(16, 25);


        // Create the map.
        // GoogleMap ist eine globale Variable, wird oben deklariert.
        GoogleMap      = new GMap2(document.getElementById("DieRofuMap"));
        GoogleGeoCoder = new GClientGeocoder();

        GoogleMap.setCenter(new GLatLng(InitialGeoLat, InitialGeoLong), InitialZoom);

        GoogleMap.addControl(new GLargeMapControl3D());
        GoogleMap.addControl(new GMapTypeControl());
     // GoogleMap.addControl(new GOverviewMapControl());    // Die kl. Übersichtkarte in der rechten unteren Ecke.


        // Füge für die Zentrale einen Marker hinzu.
        // GoogleMap.addOverlay(createMarker(new GLatLng(49.615, 7.181), icon, "Hoppst&auml;dten", "ROFU-Kinderland<br />Zentrale"));

        // Füge für jede Filiale einen Marker hinzu.
        for (var FilNr=0; FilNr<Filialen.length; FilNr++)
        {
            var Fil=Filialen[FilNr];

            GoogleMap.addOverlay(createMarker(new GLatLng(Fil.GeoLat, Fil.GeoLong), icon, Fil.ToolTip, Fil.Sprechblase));
        }
    }


    // Initalize the address search field.
	var f=document.getElementById('address-search-box');

	if (f && f.address)
	{
		var q=f.address;
		var b=function() { if (q.value=='') { q.value='PLZ Ort, ggf. Straße'; q.style.color='#AAAAAA'; } };
		var f=function() { if (q.value=='PLZ Ort, ggf. Straße') { q.value=''; q.style.color='#000000'; } };

		q.onfocus=f;
		q.onblur=b;

        b();
	}
}

