/**

Provider:
- EF-Suche
- Google-Suche
- Geonames-Suche
- Wikipedia-Suche

Im Provider wird gespeichert:
- Status
~ 0: Dienst nicht verwendet
~ 1: Suchanfrage gestartet
~ 2: Suchanfrage fertig
- Daten
~ Array mit GlobalPlace-Objecten
*/
//alert("Google-Provider laden ...")

GoogleProvider = function(elementId){
	console.group("GoogleProvider");
	console.info("GoogleProvider baue Map auf");
	// Hier werden einige Parameter der Suche zwischengespeichert, um sie im zweiten Teil der Suche (Callback) zur Verfügung zu haben

	this.searchName = "";
	this.callbackSearch = "";
	this.domElement = "";
	// GoogleProvider-Objekte wie Map etc.

	try {
		this.domElement = document.getElementById(elementId);
		if (! this.domElement) { 
			var error_info = "DIV for map don't exist (elementId='" + elementId + "')"; 
		}
		this.geocoder = new GClientGeocoder();
		this.localSearch = new GlocalSearch();
		var googleMap = new GMap2(this.domElement);
		googleMap.addControl(new GSmallZoomControl());
		googleMap.addControl(new GLargeMapControl());
		googleMap.addControl(new GMapTypeControl());
//		googleMap.addControl(new CustomMapTypeControl());
		googleMap.addControl(new GOverviewMapControl());	// das Übersichtsfenster rechts unten
		// Nun im Map-Objekt speichern
//		this.map = new Map(googleMap, domElement);
		this.map = googleMap;
	}

	catch (e) {
		// 
		alert("GoogleProvider constructor:\nerror while loading Google map: " + e.message + "\n" + error_info);
		return null;
	}
	console.log("GoogleProvider ende");
	console.groupEnd();
}

/**
 *  Die Suche
 *  "geoExp" ist die geographischen Beschreibung des Ortes, etwa Ausdrücke wie 'Paris', 'Berliner Promenade', 'mainzer straße'.
 *  "name" das, wonach gesucht wird, etwa "hotel", "leidinger".
 *  "callback" ist die Callback-Funktion, die nach beendigung der Suche aufgerufen wird.
 *
 */
GoogleProvider.prototype.lookup = function(geoExp, name, callback) {
	info("GOOGLE: suche in '" + geoExp + "' nach '" + name + "' ...", 3, "googleProvider");

		// Suche zunächst zur geographischen Beschreibung des Ortes die zugehörige Koordinate (Point)
  // Merke für die zweite Phase der Suche name und callback
	this.searchName = name;
	this.callbackSearch = callback;

	// Trick, um diese Image-Instanz an die Callback zu übergeben
	var t = this;
	this.getPoint(geoExp, function(response) { t.callbackGetPoint(response); });
}

/**
 *  Phase 1 der Suche: 
 *  zur geographischen Beschreibung des Ortes (geoExp) wird die zugehörige Koordinate (Point) bestimmt
 *  geoExp ist ein geografischer Ausdruck wie 'Paris', 'Berliner Promenade', 'mainzer straße'.
 *
 */
GoogleProvider.prototype.getPoint = function(geoExp, callback){
  info("GOOGLE: suche Koordinate fuer " + geoExp + " ...", 3, "googleProvider");
  // Suche zunächst zur geographischen Beschreibung des Ortes die zugehörige Koordinate (Point)
  if (this.geocoder)
 {
    this.geocoder.getLatLng(geoExp, callback);
		info("GOOGLE: berechne Koordinate fuer Point");
  }

  else {
    info("GOOGLE: kein Geocoder instantiert", 1, "googleProvider");
  }
	//Map.zoomlevelMerker = Map.realMap.getZoom(); // merke mir diesen zoomlevel um in der ma
}

/**
 *  Phase 2 der Suche: 
 *  Dies ist die lokale Suche von Google (Branchensuche).
 *  Die Google-Karte wird auf die Koordinate "point" zentriert und zu dieser Karte die lokale
 *  Suche von Google gestartet.
 *
 */
GoogleProvider.prototype.search = function(point, name, callback)
{
	console.group("GoogleProvider.search(point, name, callback)");
	console.info("Startet die lokale Suche nach '" + name + "' für Punkt ", point);

	// Mittlerweile kann man statt Point auch direkt eine Beschreibung verwenden, z.B. localSearch.setCenterPoint("New York, NY");
	// siehe http://code.google.com/intl/de-DE/apis/ajaxsearch/documentation/
	this.localSearch.setCenterPoint(point);

	// Das war Quatsch und hat trotzdem funktioniert (Toleranz von Google?)
//	this.localSearch.setCenterPoint(this.map);
	this.localSearch.setResultSetSize(GSearch.LARGE_RESULTSET);

	this.localSearch.setSearchCompleteCallback(null, callback);
	this.localSearch.execute(name); // Suche starten

	console.groupEnd()
}

/**
 *  Der Callback zu "getPoint()", dem ersten Teil der Suche.
 *  Er startet den zweiten Teil der Suche "search()".
 *
 */
GoogleProvider.prototype.callbackGetPoint = function(point)
{
	info("GOOGLE: Koordinate gefunden: " + point, 3, "googleProvider");
  this.map.setCenter(point, 13);

	if (this.searchName != "") 
	{
		// Trick, um diese Image-Instanz an die Callback zu übergeben
		var t = this;
		this.search(point, this.searchName, function(response) { t.callbackSearch(response); });
	}	
}
