ngOnInit() {
    // TODO: style icon inside autocomplete? https://developers.google.com/maps/documentation/javascript/places-autocomplete
    this.mapsAPILoader.load().then(() => {
      const autocomplete = new google.maps.places.Autocomplete(this.originInput.nativeElement, {
        types: ['address']
      });
      autocomplete.addListener('place_changed', () => {
        // get the place result
        const place: google.maps.places.PlaceResult = autocomplete.getPlace();

        // verify result
        if (place.geometry === undefined || place.geometry === null) {
          return;
        }

        // set name, latitude, longitude
        const address = this.originInput.nativeElement.value;
        const coords = {
          lat: place.geometry.location.lat(),
          lng: place.geometry.location.lng()
        };
        this.searchService.originNewLocation(address, coords);
        // this.searchService.originChange(address, coords);
        this.searchService.updateInputFocus();
      });
    });
  }
  ngOnInit() {
    this.mapsAPILoader.load().then(() => {
      const autocomplete = new google.maps.places.Autocomplete(this.destinationInput.nativeElement, {
        types: ['address']
      });
      autocomplete.addListener('place_changed', () => {
        // get the place result
        const place: google.maps.places.PlaceResult = autocomplete.getPlace();

        // verify result
        if (place.geometry === undefined || place.geometry === null) {
          return;
        }

        // set name, latitude, longitude
        const address = this.destinationInput.nativeElement.value;
        const coords = {
          lat: place.geometry.location.lat(),
          lng: place.geometry.location.lng()
        };
        this.searchService.destinationNewLocation(address, coords);
        this.searchService.updateInputFocus();
      });
    });
  }
      return Observable.create(observer => {
        try {
            //at this point the variable google may be still undefined (google maps scripts still loading)
            //so load all the scripts, then...
            this.__loader.load().then(() => {
                let geocoder = new google.maps.Geocoder();
                geocoder.geocode({ address }, (results, status) => {

                    if (status === google.maps.GeocoderStatus.OK) {
                        const place = results[0].geometry.location;
                        observer.next(place);
                        observer.complete();
                    } else {
                        console.error('Error - ', results, ' & Status - ', status);
                        if (status === google.maps.GeocoderStatus.ZERO_RESULTS) {
                            observer.error('Address not found!');
                        }else {
                            observer.error(status);
                        }
                        
                        observer.complete();
                    }
                });
            });
        } catch (error) {
            observer.error('error getGeocoding' + error);
            observer.complete();
        }

    });
 constructor(
   private mapsAPILoader: MapsAPILoader,
   private searchService: SearchService
 ) {
   this.mapsAPILoader.load().then(() => {
     this.geocoder = new google.maps.Geocoder();
   });
 }
  ngAfterViewInit() {
    this.mapsAPILoader.load().then(() => {

      this.apiWrapper.getNativeMap().then((m) => {
        this.mapService.initializeMapFromMapExtension(m);

      }, err => {
        console.log('Error', err );
      });
    });

    this.geolocationService.getCurrentPosition();
  }
  ngOnInit() {
        //change the title back to normal 
        document.getElementById('title').innerHTML = 'Google Bytes';

    // functionality to allow for autocomplete
    this.mapsAPILoader.load().then( () => {
      let autocomplete = new google.maps.places.Autocomplete(this.searchElement.nativeElement, {
        types:[]});
      autocomplete.addListener('place_changed', ()=>{
        this.ngZone.run(()=>{
          let place: google.maps.places.PlaceResult = autocomplete.getPlace();
          //takes the lat and long from the auto complete and inserts them into the globals
          this.lat = place.geometry.location.lat();
          this.long = place.geometry.location.lng();
        })
      })
    });
  }
  ngOnInit() {
    this.searchElementRef.nativeElement.value = this.address || '';

    this.mapsAPILoader.load().then(() => {
      let autocomplete = new google.maps.places.Autocomplete(
        this.searchElementRef.nativeElement,
        {
          types: ['address']
        }
      );
      autocomplete.addListener('place_changed', () => {
        this.ngZone.run(() => {
          //get the place result
          let place: google.maps.places.PlaceResult = autocomplete.getPlace();
          //verify result
          if (place.geometry === undefined || place.geometry === null) {
            return;
          }
          // this.address.search = this.searchElementRef.nativeElement.value;
          // place.address_components.forEach((address_component, index) => {
          //   console.log(address_component);
          //   if (address_component.types.includes('locality'))
          //     // this.addressForm.setValue({ city: address_component.long_name });
          //     this.address.city = address_component.long_name;
          //   else if (
          //     address_component.types.includes('administrative_area_level_1')
          //   )
          //     // this.addressForm.setValue({ state: address_component.long_name });
          //     this.address.state = address_component.long_name;
          //   else if (address_component.types.includes('country'))
          //     // this.addressForm.setValue({
          //     //   country: address_component.long_name
          //     // });
          //     this.address.country = address_component.long_name;
          // });
          this.addressChanged.emit(place);
        });
      });
    });
  }