/*
   Diese date ist für die Googlemaps-Anzeige des Anfahrtsplans und Notdienstes
   Datum: 12/08/2008
*/
    //<![CDATA[


   function mapPharmacy()
   {
      this.zoom = 13;
      this.apoNames = new Array();
      this.apoStreets = new Array();
      this.apoCities  = new Array();
      this.apoPhones  = new Array();
      this.apoFaxes  = new Array();
      this.points = new Array();
      this.waitForObject;
      this.sidebar = false;
      this.googleParmacyAddress = new Array();
      this.googleOwnAddress = '';
      this.nameTag = new Array();

      this.direction = '';
      this.distances = new Array();
      this.routesContent = new Array();
      this.routesAvailable = new Array();
      this.startAddress = '';

      /**
       * Diese Methode holt alle Adressen der Apotheken die an einem bestimmten Tag Notdient haben
       * und zeigt diese in einem Googlemaps Fenster.
       *
       */
      this.getPharmaciesForMaps = function(  )
      {
         var mapDiv = document.getElementById("map");

         var namen = mapObject.getElementsByClassName('ApoName' , 'p');
         var street = mapObject.getElementsByClassName('ApoStreet' , 'p');
         var city = mapObject.getElementsByClassName('ApoCity' , 'p');
         var phone = mapObject.getElementsByClassName('ApoPhone' , 'p');
         var fax = mapObject.getElementsByClassName('ApoFax' , 'p');

         mapObject.googleOwnAddress = document.getElementById('ownAddress').innerHTML;

        
         var fullAdress = new Array();
         var infoText   = new Array();

         var tempAdress = "";
         var tempInfoText = "";
         var apothekenName =  "";

         // Wenn es keine Apotheken Infos gibt dann hört es hier auf.
         if(namen == '')
         {
            return ;
         }

         mapDiv.style.display = "block";
         var map = new GMap2(mapDiv);

         for (var i = 0; i <namen.length ; i++)
         {
            mapObject.nameTag[i] = namen[i];
            mapObject.apoNames[i] = namen[i].firstChild.nodeValue;
            mapObject.apoStreets[i] = street[i].firstChild.nodeValue;
            mapObject.apoCities[i] = city[i].firstChild.nodeValue;

            var phoneTemp = phone[i].firstChild;
            var faxTemp = fax[i].firstChild;

            if(phoneTemp === null)
            {
               mapObject.apoPhones[i] = "";
            }
            else
            {
               mapObject.apoPhones[i] = phoneTemp.nodeValue;
            }

            if(faxTemp === null)
            {
               mapObject.apoFaxes[i] = "";
            }
            else
            {
               mapObject.apoFaxes[i] = faxTemp.nodeValue;
            }
         }
         if (GBrowserIsCompatible())
         {
            var icon = new GIcon();
            icon.image = "../images/ApoA.png";
            icon.iconSize = new GSize(42, 34);
            icon.shadowSize = new GSize(22, 20);
            icon.iconAnchor = new GPoint(20, 30);
            icon.infoWindowAnchor = new GPoint(1, 1);

            geocoder = new GClientGeocoder();
            map.addControl(new GSmallMapControl());
            map.addControl(new GMapTypeControl());

            for (var i = 0; i <namen.length ; i++)
            {
               tempAddress = "";
               tempInfoText = "";
               apothekenName =  "";

               // Hier wird die vollständige Adresse zusammengestellt um die Marker auf den Plan zu setzen
               var plz = mapObject.apoCities[i].split(' ');
               plz = plz[0];
               fullAdress[i] =  "D-"+plz + " " + mapObject.apoStreets[i];
               mapObject.googleParmacyAddress[i] = fullAdress[i];

               // die Apotheken Informationen die in der Sprachblase angezeigt werden.
               infoText[i]   =  mapObject.apoStreets[i] +
                                "<br> " + mapObject.apoCities[i] +
                                "<br> " + mapObject.apoPhones[i] +
                                "<br> " + mapObject.apoFaxes[i];

               tempAdress = fullAdress[i];
               tempInfoText =  infoText[i];
               apothekenName = mapObject.apoNames[i];

               name = document.createTextNode(apothekenName);

               link = document.createElement("A");
               link.id = "link_"+i;
               link.innerHTML = apothekenName;

               text = document.createElement("input");
               text.id = "text_"+i;
               text.type = "hidden";
               text.value = apothekenName+"+"+infoText[i];

               namen[i].appendChild(link);
               namen[i].appendChild(text);
               namen[i].firstChild.nodeValue = "";

               // Hier wird die Adresse zu Koordinaten umgewandelt.
               mapObject.decodeAddress(map, mapObject.apoNames[i], icon, fullAdress[i], infoText[i], mapObject.zoom, i, 0);
               // Hier wird der Routenplaner abgefeuert.
               window.setTimeout("mapObject.getRouteForPharmacies('"+mapObject.googleOwnAddress+"','"+fullAdress[i]+"' ,"+i+" )", 1000);
            }

            // kommt der Aufruf aus der Sidebar.
            if(mapObject.sidebar == true)
            {
               mapObject.waitForObject = window.setInterval( "mapObject.showPharmacyDetailsFromSidebar("+indexApo+","+anzahlApo+")", 10);
            }
         }
         else
         {
             // Hier geht er rein wenn der Browser nicht mit Googlemaps Kompatibel ist.
             var mapdiv = document.getElementById("map");
             mapdiv.style.height = "0px";
             mapdiv.innerHTML = "<br /><b>Die Googlemaps Karte ist vorübergehend nicht verfügbar</b><br />";
         }
      }

      /**
       * Diese Methode zeigt die Lage der angeclickten Apotheke in einem höheren Zommfaktor
       * und zentriet Sie in das Fenster.
       *
       * @param   string   index            Der Index der Apotheke in dem Apotheken-Array
       * @param   string   coordinates      Die von Google gelieferten globalen Koordinaten
       *
       */
      this.showPharmacyDetails = function(index , coordinates)
      {
         document.getElementById('router').style.display = 'none';

         coordinates = coordinates.replace("'(" , "");
         coordinates = coordinates.replace(")'" , "");
         coordinates = coordinates.replace(" " , "");
         var coor = coordinates.split(",");
         var lat = coor[0];
         var lng = coor[1];

         var tempText = document.getElementById("text_"+index).value;
         tempText = tempText.split("+");
         name = tempText[0];

         infoText = tempText[1];

         var map = new GMap2(document.getElementById("map"));

         var icon = new GIcon();
         icon.image = "../images/ApoA.png";
         icon.iconSize = new GSize(42, 34);
         icon.shadowSize = new GSize(22, 20);
         icon.iconAnchor = new GPoint(20, 30);
         icon.infoWindowAnchor = new GPoint(1, 1);

         var point = new GLatLng(lat,lng);
         map.setCenter(point, 17);
         map.addControl(new GSmallMapControl());

         map.addControl(new GMapTypeControl());
         var marker = new GMarker(point, icon);

         var displayHtml = "<div style=\"width:250px; height:80px;\"><b> " +
                        name + "</b><br>" +
                        infoText + "<br><div style=\"font-size:8pt; color:#008000;\"></div></div>";

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

         map.addOverlay(marker);
         map.openInfoWindowHtml(map.getCenter(), displayHtml);

         document.getElementById('router').style.display = 'none';
      }

      /**
       * Diese Methode zeigt die Lage der angeclickten Apotheke aus der Sibar in einem höheren Zommfaktor
       * und zentriet Sie in das Fenster.
       *
       * @param   string   index            Der Index der Apotheke in dem Apotheken-Array
       * @param   string   coordinates      Die von Google gelieferten globalen Koordinaten
       *
       */
      this.showPharmacyDetailsFromSidebar = function(index , anzahl)
      {
         // Sind überhaupt alle Apotheken Koordinaten schon da?
         if(typeof(mapObject.points) == 'object' && mapObject.points.length == (parseInt(anzahl)+1))
         {
            mapObject.showPharmacyDetails(index, "'"+mapObject.points[index]+"'");
            window.clearInterval(mapObject.waitForObject);
         }
      }


       /**
       * Hier ist der Geocoder der die Adresse zu einem Geopunkt mit Längen und Breiten Grade umwandelt.
       *
       * @param   Object   map           das Googlemap-Objekt.
       * @param   Object   point         Der genaue Punkt an dem die Apotheke dargestellt werden soll.
       * @param   Object   icon          Das Icon-Bild der Apotheke.
       * @param   String   name          Der Name der Apotheke.
       * @param   String   infoText      Der Text der in der Sprachblase angezeigt wird.
       * @param   Int      zomm          Der Zommfaktor für die Anzeige.
       * @param   string   index         Der Index der Apotheke in dem Apotheken-Array
       * @param   Int      showInfo      0 oder 1 (Die Variable enscheidet ob die Sprachblase angezeigt werden soll)
       */
      this.decodeAddress = function(map, name, icon, address,  infoText, zoom, index, showInfo)
      {
         if (geocoder)
         {
            geocoder.getLatLng(
               address,
               function(point)
               {
                  if (!point)
                  {
                     // wenn der geocoder keine Koordinaten für die Adresse geliefert bekommt und wir noch keine weitere Punkte haben.
                     if(mapObject.points.length == 0)
                     {
                        var mapdiv = document.getElementById("map");
                        mapdiv.style.height = "0px";
                        mapdiv.innerHTML = "<br /><b>Der Anfahrtsplan ist vorübergehend nicht verfügbar</b><br />";
                     }
                  }
                  else
                  {
                     if(document.getElementById("link_"+index) !== null)
                     {
                        link = document.getElementById("link_"+index);
                        link.href = "javascript:;";
                        link.onclick = function()
                        {
                           mapObject.showPharmacyDetails(index, "'"+point+"'");
                        };
                     }

                     // Hier wird die Funktion aufgerufen die den Marker und die Sprechblase erstellt.
                     mapObject.points.push(point);

                     // Die Übersicht aller Apotheken soll nur dann angezeigt werden wenn der Aufruf nicht aus der Sidebar kommt.
                     if (mapObject.sidebar == false)
                     {
                        map.addOverlay(mapObject.createMarker(map, point, icon, name, infoText, zoom , showInfo));
                     }
                  }
               }
            );
         }
      }

      /**
       * Hier wird der Marker für die Adressse erstellt und die Sprachblase und Click-Event definiert
       *
       * @param   Object   map           das Googlemap-Objekt.
       * @param   Object   point         Der genaue Punkt an dem die Apotheke dargestellt werden soll.
       * @param   Object   icon          Das Icon-Bild der Apotheke.
       * @param   String   name          Der Name der Apotheke.
       * @param   String   infoText      Der Text der in der Sprachblase angezeigt wird.
       * @param   Int      zomm          Der Zommfaktor für die Anzeige.    *
       * @param   Int      showInfo      0 oder 1 (Die Variable enscheidet ob die Sprachblase angezeigt werden soll)
       */
      this.createMarker = function(map, point, icon, name, infoText, zoom, showInfo)
      {
         map.setCenter(point, zoom);

         // Hier wird der Marker instanziert.
         var marker = new GMarker(point, icon);
         var displayHtml = "<div style=\"width:250px; height:170px;\"><b> " +
                              name + "</b><br>" +
                              infoText + "<br><div style=\"font-size:8pt; color:#008000;\"></div></div>";

         if(showInfo == 1)
         {
            // Die Info-Sprachblase.
            map.addOverlay(marker);
            map.openInfoWindowHtml(map.getCenter(), displayHtml);

         }
         // Wenn man auf der Karte auf das Apothekenzeichen klickt, soll die Sprachblase mit der Adresse angezeigt werden.
         GEvent.addListener(marker, "click", function() {
            map.setCenter(point ,16);
            marker.openInfoWindowHtml(displayHtml);
         });
         return marker;
      }

      /**
       * Diese Methode holt die Adresse der Apotheke und baut daraus den Anfahrtsplan mit der
       * Möglichkeit eine Addresse einzugeben und den Routenplaner dafür zu generieren.
       *
       */
      this.loadAnfahrtsplan = function()
      {
         if (GBrowserIsCompatible()) {

            // Hier werden die Informationen der Apotheke aus dem DOM abgelesen.
            var name = document.getElementById("ctName").value;
            var streetName =  document.getElementById("ctStreetName").value;
            var streetNumber = document.getElementById("ctStreetNumber").value ;
            var postCode =  document.getElementById("ctPostcode").value;
            var city = document.getElementById("ctCity").value;
            var phone = document.getElementById("ctPhone").value;
            var fax = document.getElementById("ctFax").value;

            // die vollständige Adresse für die Googemaps Koordinaten afrage.
            var address = "D-"+postCode+" "+streetName + " " + streetNumber ;
            mapObject.googleOwnAddress = address;

            // die Informationen der Apotheke die in der Sprachblase angezeigt werden.
            var infoText = streetName + ' ' + streetNumber +
                           '<br/> ' + postCode + ' ' + city +
                           '<br/> Telefon: ' + phone+
                           '<br/>-------------------------<br/>' +
                           '<b>Routenplaner</b><br/>Ihre Startadresse:' +
                           '<br/><input id="startAddress" size="30" onkeypress="mapObject.onEnter(event)">' +
                           '<br/><button  type="submit" onclick="javascript:mapObject.getInteractivRoute();">Berechnen</button>'

            var zoom = 15;

            // Das Apotheken-Icon wird hier definiert
            var icon = new GIcon();
            icon.image = "../images/ApoA.png";
            icon.iconSize = new GSize(42, 34);
            icon.shadowSize = new GSize(22, 20);
            icon.iconAnchor = new GPoint(20, 30);
            icon.infoWindowAnchor = new GPoint(1, 1);

            // Die Karte und Bedienelement werde instanziert
            var mapDiv = document.getElementById("map");
            mapDiv.style.display = "block";
            var map = new GMap2(mapDiv);

            geocoder = new GClientGeocoder();
            map.addControl(new GSmallMapControl());
            map.addControl(new GMapTypeControl());

            // Ab hier wird die Adresse des Apotheker decodiert und in dem Map angezeigt
            mapObject.decodeAddress(map, name, icon, address, infoText, zoom , 0, 1);

         }else
         {
            // Falls der Browser nicht GoogleMaps Kompatibel ist.
             var mapdiv = document.getElementById("map");
             mapdiv.style.height = "0px";
             mapdiv.innerHTML = "Der Anfahrtsplan ist vorübergehend nicht verfügbar";
         }
      }

      /**
       * Diese Methode wird abgefeuert wenn der User einen Routenplaner zu einer
       * selbst eingegebenen Adresse berechnen will.
       *
       */
      this.getInteractivRoute = function()
      {
         try
         {
               mapObject.startAddress = document.getElementById('startAddress').value;
               // Die versteckte Karte wird instanziert.
               var mapHidden = new GMap2(document.getElementById("mapHidden"));
               var routerPanel = document.getElementById("router");
         }
         catch(err){} ;

         if(mapObject.startAddress == '')
         {
            // Es wurde keine Adresse eingegeben
         }
         else
         {
            // Ab hier wird der Routenplaner generiert.
            routerPanel.innerHTML = '';
            mapObject.direction = new GDirections(mapHidden, routerPanel);
            mapObject.direction.load("from: " + mapObject.startAddress + " to: " + mapObject.googleOwnAddress);

            window.setTimeout("mapObject.showInteractivRoute()", 1000);
         }
      }

      /**
       * Diese Methode sorgt für den Routenplaner bei dem Anfahrtsplan.
       *
       */
      this.showInteractivRoute = function()
      {
         try
         {
               mapObject.startAddress = document.getElementById('startAddress').value

               var routerPanel = document.getElementById("router");
               if(mapObject.direction.getNumGeocodes() == 2)
               {
                     routerPanel.innerHTML = '';
                     routerPanel.style.display = 'block';
                     var map = new GMap2(document.getElementById("map"));
                     mapObject.direction = new GDirections(map, routerPanel);
                     mapObject.direction.load("from: " + mapObject.startAddress + " to: " + mapObject.googleOwnAddress);
               }
               else
               {
                  routerPanel.innerHTML = '';
                  routerPanel.style.display = 'block';
                  routerPanel.innerHTML = "<br /><b>Es liegen keine Informationen f&uuml;r die eingegebene Startadresse vor.</b><br />"
               }
         }
         catch(err){} ;
      }

      /**
       * Diese Methode wird bei der Notdienstanzeige verwendet und generiert
       * (soweit vorhanden) den Routenplaner zu jeder Notdienst Apotheke.
       *
       * @param   String   start               Die startadresse für den Routenplaner.
       * @param   String   detination          Die Zieladresse für den Routenplaner.
       * @param   Int      index               Der Index der Notdienst Apotheke in dem Apotheken-Array
       */
      this.getRouteForPharmacies = function(start , destination , index )
      {
         // den versteckten Routenplaner starten um die Entfernung zu berechnen.
         var mapHidden = new GMap2(document.getElementById("mapHidden"));
         var routerPanel = document.getElementById("routerHidden");

         var direction = new GDirections(mapHidden, routerPanel);

         direction.load("from: " + start + " to: " + destination);

         window.setTimeout( function() {mapObject.getRouteInfos(direction , index);},2000);
      }

      /**
       * Diese Methode wird bei der Notdienstanzeige verwendet und prüft ob Onkel
       * Google uns Sinnvole Daten liefert (Ob es wircklich einen Routenplaner von Ziel zu Detination gibt)
       * Und erstellt für jede Notdienst-Apotheke einen passenden Link für den zugehörigen Routenplaner.
       *
       * @param   GDirection   Gdirection          Das Google-Routenplaner Object.
       * @param   Int          index               Der Index der Notdienst Apotheke in dem Apotheken-Array
       */
      this.getRouteInfos = function(GDirection , index)
      {
          if(typeof(index) == 'number' && typeof(GDirection.getNumGeocodes()) == 'number')
          {
             mapObject.routesAvailable[index] = GDirection.getNumGeocodes();

             if(typeof(GDirection.getDistance()) == 'object' && mapObject.routesAvailable[index] == 2)
             {
                mapObject.distances[index]       =  GDirection.getDistance().html;
                if(mapObject.distances[index] != '')
                {
                   var divContainer = mapObject.nameTag[index].parentNode;
                   var routeDiv = document.createElement('p');
                   routeDiv.innerHTML = 'Entfernung: ' + mapObject.distances[index]+' ';
                   var routeLink = document.createElement('a');
                   routeLink.innerHTML = "Anfahrtsplan."
                   routeLink.href = "javascript:;";
                   routeLink.onclick = function()
                   {
                      mapObject.showPharmacyRoute(index);

                   };
                   routeDiv.appendChild(routeLink);
                   divContainer.appendChild(routeDiv);
                }
             }
          }
      }


      /**
       * Diese Methode wird bei der Notdienstanzeige verwendet und sorgt für die Anzeige
       * eines bestimmten Apotheken-Routenplaners wenn man auf den zugehörigen Link clickt.
       *
       * @param   Int          index               Der Index der Notdienst Apotheke in dem Apotheken-Array
       */
      this.showPharmacyRoute = function(index)
      {
         var routerPanel = document.getElementById("router");
         routerPanel.innerHTML = '';
         routerPanel.style.display = 'block';
         var map = new GMap2(document.getElementById("map"));
         mapObject.direction = new GDirections(map, routerPanel);
         mapObject.direction.load("from: " + mapObject.googleOwnAddress + " to: " + mapObject.googleParmacyAddress[index]);
      }

      /**
       * Dies ist eine Hilfsmethode beim Anfahrtsplan. die Lauscht und wartet auf die
       * Entertaste um den Routenplaner zu starten
       *
       */
      this.onEnter = function(event)
      {
           if(event.which==13)
           {
             mapObject.getInteractivRoute();
           }
           else if(event.keyCode==13)
           {
             mapObject.getInteractivRoute();
           }
      }

      /**
       * diese Klasse laesst sich analog zu 'getElementById()'
       * verwenden, nur halt mit einer Klasse als Uebergabewert.
       *
       * ACHTUNG: kann bei grossenen (start verschachtelten
       * Dokumenten) verhaeltnismaessig Langsam sein!
       *
       * @param   string   class_name     Name der Klasse, die die Container haben sollen
       * @param   string   html_tag       (OPTIONAL) HTML-Tag des gesuchten Containers
       * @return  array
       */
      this.getElementsByClassName = function(class_name, html_tag)
      {
         // nimmt alle HTML-Elemente des Dokuments auf
         var allObjects;

         // nimmt die HTML-Elemente mit dem ueberg. Klassennamen auf
         var classObj = new Array();

         // Zahelvariable f. Index von 'classObj'
         var index=0;

         var teststr;

         // HTML-Struktur 'reinziehen'...
         if (null != html_tag && "" != html_tag)
         {
            allObjects = document.getElementsByTagName(html_tag);
         }
         else
         {
            if (document.all)
            {
               // f. IE
               allObjects = document.all;
            }
            else if(document.getElementsByTagName && !document.all)
            {
               // f. Rest der Browser-Welt
               allObjects = document.getElementsByTagName("*");
            }
         }

         // HTML-Struktur durchgehen, und die Container mit ueberg.
         // Klassennamen als Objekt in 'classObj' speichern
         for(var i=0;i<allObjects.length;i++)
         {
            var myName = allObjects[i].className.split(' ');
            for(var j = 0; j < myName.length; j++)
            {
               if( myName[j].indexOf(class_name)!=-1 )
               {
                  teststr="," + allObjects[i].className.split(" ").join(",") + ",";
                  if(teststr.indexOf("," + class_name + ",")!= -1 )
                  {
                    classObj[index]=allObjects[i];
                    index++;
                  }
               }
            }
         }
         return classObj;
      }
   }

   // Erstellt das Objekt, dass dann ï¿½l aufrufbar ist.
   var mapObject = new mapPharmacy();

    //]]>
