<!DOCTYPE html>
<html>

  <head>
    <script data-require="angular.js@*" data-semver="1.2.0-rc2" src="http://code.angularjs.org/1.2.0-rc.2/angular.js"></script>
    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?libraries=places&sensor=false"></script>
    <script src="angularjs-google-places.js"></script>
    <script src="script.js"></script>
  </head>

  <body ng-app="myApp">
    <div ng-controller="mainCtrl">
      <img src="https://maps.gstatic.com/mapfiles/api-3/images/powered-by-google-on-white2.png"/>
      <h3>Detailed Place Search Example</h3>
      <p>{{details || "loading..."}}</p>
      <h3>Nearby Place Search Example</h3>
      <p>{{data || "loading..."}}</p>
    </div>
  </body>

</html>
var myApp = angular.module('myApp',['ngGPlaces']);

myApp.controller('mainCtrl',function($scope,ngGPlacesAPI){
  $scope.details = ngGPlacesAPI.placeDetails({reference:"CnRnAAAAnRm_imIW_SFd74bsj6iRwvRxBamZqtUaSyRjlb-i1vvkapOSVXyA5Dj452GSpBpno_MHbxyGsuFx9zqZvr_aa2a7uG0IZE8tC-N2OccvUC_i5N3QRQ11WmSRayo441riHebwQGqlbaf3RY-5KVsfGBIQXGtmUICHsD9LH2rd_y-J2hoUvW0lUEIHHtRnD15QyeUqi6tkHIg"}).then(function (data) {
    return data;
  });
  $scope.data = ngGPlacesAPI.nearbySearch({latitude:-33.8665433, longitude:151.1956316}).then(function(data){
    return data;
  });  
});
'use strict';

angular.module('ngGPlaces', []);
angular.module('ngGPlaces').value('gPlaces',google.maps.places);
angular.module('ngGPlaces').value('gMaps',google.maps);

angular.module('ngGPlaces').
provider('ngGPlacesAPI', function () {

    var defaults = {
        radius: 1000,
        sensor: false,
        latitude: null,
        longitude: null,
        types: ['food'],
        map: null,
        elem: null,
        nearbySearchKeys: ['name','reference','vicinity'],
        placeDetailsKeys: ['formatted_address', 'formatted_phone_number', 'reference', 'website'],
        nearbySearchErr: 'Unable to find nearby places',
        placeDetailsErr: 'Unable to find place details',
        _nearbySearchApiFnCall: 'nearbySearch',
        _placeDetailsApiFnCall: 'getDetails'
    };

    var parseNSJSON = function (response) {
        var pResp = [];
        var keys = defaults.nearbySearchKeys;
        response.map(function (result) {
            var obj = {};
            angular.forEach(keys, function (k) {
                obj[k] = result[k];
            });
            pResp.push(obj);
        });
        return pResp;
    };

    var parsePDJSON = function (response) {
        var pResp = {};
        var keys = defaults.placeDetailsKeys;
        angular.forEach(keys, function (k) {
            pResp[k] = response[k];
        });
        return pResp;
    };

    this.$get = function ($rootScope,$q,gMaps,gPlaces,$window) {

        function commonAPI (args) {
            var req = angular.copy(defaults, {});
            angular.extend(req, args);
            var deferred = $q.defer();
            var elem, service;
            function callback(results, status) {
                if (status == gPlaces.PlacesServiceStatus.OK) {
                    $rootScope.$apply(function(){
                        return deferred.resolve(req._parser(results));
                    });
                }
                else {
                    $rootScope.$apply(function(){
                        deferred.reject(req._errorMsg);
                    });
                }
            }
            if (req._genLocation) {
                req.location = new gMaps.LatLng(req.latitude,req.longitude);
            }
            if (req.map) {
              elem = req.map;
            }
            else if (req.elem) {
              elem = req.elem;
            }
            else {
              elem = $window.document.createElement('div');
            }
            service = new gPlaces.PlacesService(elem);
            service[req._apiFnCall](req, callback);
            return deferred.promise;
        }

        return {
            getDefaults: function () {
                return defaults;
            },
            nearbySearch: function (args) {
                args._genLocation = true;
                args._errorMsg = defaults.nearbySearchErr;
                args._parser = parseNSJSON;
                args._apiFnCall = defaults._nearbySearchApiFnCall;
                return commonAPI(args);
            },
            placeDetails: function (args) {
                args._errorMsg = defaults.placeDetailsErr;
                args._parser = parsePDJSON;
                args._apiFnCall = defaults._placeDetailsApiFnCall;
                return commonAPI(args);
            }
        };
    };

    this.$get.$inject = ['$rootScope','$q','gMaps','gPlaces','$window'];

    this.setDefaults = function (args) {
        angular.extend(defaults, args);
    };

});
/*! angularjs-google-places 24-09-2013 */
"use strict";angular.module("ngGPlaces",[]),angular.module("ngGPlaces").value("gPlaces",google.maps.places),angular.module("ngGPlaces").value("gMaps",google.maps),angular.module("ngGPlaces").provider("ngGPlacesAPI",function(){var a={radius:1e3,sensor:!1,latitude:null,longitude:null,types:["food"],map:null,elem:null,nearbySearchKeys:["name","reference","vicinity"],placeDetailsKeys:["formatted_address","formatted_phone_number","reference","website"],nearbySearchErr:"Unable to find nearby places",placeDetailsErr:"Unable to find place details",_nearbySearchApiFnCall:"nearbySearch",_placeDetailsApiFnCall:"getDetails"},b=function(b){var c=[],d=a.nearbySearchKeys;return b.map(function(a){var b={};angular.forEach(d,function(c){b[c]=a[c]}),c.push(b)}),c},c=function(b){var c={},d=a.placeDetailsKeys;return angular.forEach(d,function(a){c[a]=b[a]}),c};this.$get=function(d,e,f,g,h){function i(b){function c(a,b){b==g.PlacesServiceStatus.OK?d.$apply(function(){return l.resolve(i._parser(a))}):d.$apply(function(){l.reject(i._errorMsg)})}var i=angular.copy(a,{});angular.extend(i,b);var j,k,l=e.defer();return i._genLocation&&(i.location=new f.LatLng(i.latitude,i.longitude)),j=i.map?i.map:i.elem?i.elem:h.document.createElement("div"),k=new g.PlacesService(j),k[i._apiFnCall](i,c),l.promise}return{getDefaults:function(){return a},nearbySearch:function(c){return c._genLocation=!0,c._errorMsg=a.nearbySearchErr,c._parser=b,c._apiFnCall=a._nearbySearchApiFnCall,i(c)},placeDetails:function(b){return b._errorMsg=a.placeDetailsErr,b._parser=c,b._apiFnCall=a._placeDetailsApiFnCall,i(b)}}},this.$get.$inject=["$rootScope","$q","gMaps","gPlaces","$window"],this.setDefaults=function(b){angular.extend(a,b)}});