/*! angular-google-maps 2.3.3 2016-05-13 
 | 
 *  AngularJS directives for Google Maps 
 | 
 *  git: https://github.com/angular-ui/angular-google-maps.git 
 | 
 */ 
 | 
; 
 | 
(function( window, angular, undefined ){ 
 | 
  'use strict'; 
 | 
/* 
 | 
! 
 | 
The MIT License 
 | 
  
 | 
Copyright (c) 2010-2013 Google, Inc. http://angularjs.org 
 | 
  
 | 
Permission is hereby granted, free of charge, to any person obtaining a copy 
 | 
of this software and associated documentation files (the 'Software'), to deal 
 | 
in the Software without restriction, including without limitation the rights 
 | 
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
 | 
copies of the Software, and to permit persons to whom the Software is 
 | 
furnished to do so, subject to the following conditions: 
 | 
  
 | 
The above copyright notice and this permission notice shall be included in 
 | 
all copies or substantial portions of the Software. 
 | 
  
 | 
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
 | 
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
 | 
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
 | 
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
 | 
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
 | 
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
 | 
THE SOFTWARE. 
 | 
  
 | 
angular-google-maps 
 | 
https://github.com/angular-ui/angular-google-maps 
 | 
  
 | 
@authors 
 | 
Nicolas Laplante - https://plus.google.com/108189012221374960701 
 | 
Nicholas McCready - https://twitter.com/nmccready 
 | 
 */ 
 | 
  
 | 
(function() { 
 | 
  angular.module('uiGmapgoogle-maps.providers', ['nemLogging']); 
 | 
  
 | 
  angular.module('uiGmapgoogle-maps.wrapped', []); 
 | 
  
 | 
  angular.module('uiGmapgoogle-maps.extensions', ['uiGmapgoogle-maps.wrapped', 'uiGmapgoogle-maps.providers']); 
 | 
  
 | 
  angular.module('uiGmapgoogle-maps.directives.api.utils', ['uiGmapgoogle-maps.extensions']); 
 | 
  
 | 
  angular.module('uiGmapgoogle-maps.directives.api.managers', []); 
 | 
  
 | 
  angular.module('uiGmapgoogle-maps.directives.api.options', ['uiGmapgoogle-maps.directives.api.utils']); 
 | 
  
 | 
  angular.module('uiGmapgoogle-maps.directives.api.options.builders', []); 
 | 
  
 | 
  angular.module('uiGmapgoogle-maps.directives.api.models.child', ['uiGmapgoogle-maps.directives.api.utils', 'uiGmapgoogle-maps.directives.api.options', 'uiGmapgoogle-maps.directives.api.options.builders']); 
 | 
  
 | 
  angular.module('uiGmapgoogle-maps.directives.api.models.parent', ['uiGmapgoogle-maps.directives.api.managers', 'uiGmapgoogle-maps.directives.api.models.child', 'uiGmapgoogle-maps.providers']); 
 | 
  
 | 
  angular.module('uiGmapgoogle-maps.directives.api', ['uiGmapgoogle-maps.directives.api.models.parent']); 
 | 
  
 | 
  angular.module('uiGmapgoogle-maps', ['uiGmapgoogle-maps.directives.api', 'uiGmapgoogle-maps.providers']); 
 | 
  
 | 
}).call(this); 
 | 
;angular.module('uiGmapgoogle-maps.wrapped') 
 | 
.service('uiGmapuuid', function() { 
 | 
  //BEGIN REPLACE 
 | 
  /* istanbul ignore next */ 
 | 
  /* 
 | 
 Version: core-1.0 
 | 
 The MIT License: Copyright (c) 2012 LiosK. 
 | 
*/ 
 | 
function UUID(){}UUID.generate=function(){var a=UUID._gri,b=UUID._ha;return b(a(32),8)+"-"+b(a(16),4)+"-"+b(16384|a(12),4)+"-"+b(32768|a(14),4)+"-"+b(a(48),12)};UUID._gri=function(a){return 0>a?NaN:30>=a?0|Math.random()*(1<<a):53>=a?(0|1073741824*Math.random())+1073741824*(0|Math.random()*(1<<a-30)):NaN};UUID._ha=function(a,b){for(var c=a.toString(16),d=b-c.length,e="0";0<d;d>>>=1,e+=e)d&1&&(c=e+c);return c}; 
 | 
  
 | 
  //END REPLACE 
 | 
return UUID; 
 | 
}); 
 | 
;(function() { 
 | 
  angular.module('uiGmapgoogle-maps.providers').factory('uiGmapMapScriptLoader', [ 
 | 
    '$q', 'uiGmapuuid', function($q, uuid) { 
 | 
      var getScriptUrl, includeScript, isGoogleMapsLoaded, scriptId, usedConfiguration; 
 | 
      scriptId = void 0; 
 | 
      usedConfiguration = void 0; 
 | 
      getScriptUrl = function(options) { 
 | 
        if (options.china) { 
 | 
          return 'http://maps.google.cn/maps/api/js?'; 
 | 
        } else { 
 | 
          if (options.transport === 'auto') { 
 | 
            return '//maps.googleapis.com/maps/api/js?'; 
 | 
          } else { 
 | 
            return options.transport + '://maps.googleapis.com/maps/api/js?'; 
 | 
          } 
 | 
        } 
 | 
      }; 
 | 
      includeScript = function(options) { 
 | 
        var omitOptions, query, script, scriptElem; 
 | 
        omitOptions = ['transport', 'isGoogleMapsForWork', 'china', 'preventLoad']; 
 | 
        if (options.isGoogleMapsForWork) { 
 | 
          omitOptions.push('key'); 
 | 
        } 
 | 
        query = _.map(_.omit(options, omitOptions), function(v, k) { 
 | 
          return k + '=' + v; 
 | 
        }); 
 | 
        if (scriptId) { 
 | 
          scriptElem = document.getElementById(scriptId); 
 | 
          scriptElem.parentNode.removeChild(scriptElem); 
 | 
        } 
 | 
        query = query.join('&'); 
 | 
        script = document.createElement('script'); 
 | 
        script.id = scriptId = "ui_gmap_map_load_" + (uuid.generate()); 
 | 
        script.type = 'text/javascript'; 
 | 
        script.src = getScriptUrl(options) + query; 
 | 
        return document.body.appendChild(script); 
 | 
      }; 
 | 
      isGoogleMapsLoaded = function() { 
 | 
        return angular.isDefined(window.google) && angular.isDefined(window.google.maps); 
 | 
      }; 
 | 
      return { 
 | 
        load: function(options) { 
 | 
          var deferred, randomizedFunctionName; 
 | 
          deferred = $q.defer(); 
 | 
          if (isGoogleMapsLoaded()) { 
 | 
            deferred.resolve(window.google.maps); 
 | 
            return deferred.promise; 
 | 
          } 
 | 
          randomizedFunctionName = options.callback = 'onGoogleMapsReady' + Math.round(Math.random() * 1000); 
 | 
          window[randomizedFunctionName] = function() { 
 | 
            window[randomizedFunctionName] = null; 
 | 
            deferred.resolve(window.google.maps); 
 | 
          }; 
 | 
          if (window.navigator.connection && window.Connection && window.navigator.connection.type === window.Connection.NONE && !options.preventLoad) { 
 | 
            document.addEventListener('online', function() { 
 | 
              if (!isGoogleMapsLoaded()) { 
 | 
                return includeScript(options); 
 | 
              } 
 | 
            }); 
 | 
          } else if (!options.preventLoad) { 
 | 
            includeScript(options); 
 | 
          } 
 | 
          usedConfiguration = options; 
 | 
          usedConfiguration.randomizedFunctionName = randomizedFunctionName; 
 | 
          return deferred.promise; 
 | 
        }, 
 | 
        manualLoad: function() { 
 | 
          var config; 
 | 
          config = usedConfiguration; 
 | 
          if (!isGoogleMapsLoaded()) { 
 | 
            return includeScript(config); 
 | 
          } else { 
 | 
            if (window[config.randomizedFunctionName]) { 
 | 
              return window[config.randomizedFunctionName](); 
 | 
            } 
 | 
          } 
 | 
        } 
 | 
      }; 
 | 
    } 
 | 
  ]).provider('uiGmapGoogleMapApi', function() { 
 | 
    this.options = { 
 | 
      transport: 'https', 
 | 
      isGoogleMapsForWork: false, 
 | 
      china: false, 
 | 
      v: '3', 
 | 
      libraries: '', 
 | 
      language: 'en', 
 | 
      preventLoad: false 
 | 
    }; 
 | 
    this.configure = function(options) { 
 | 
      angular.extend(this.options, options); 
 | 
    }; 
 | 
    this.$get = [ 
 | 
      'uiGmapMapScriptLoader', (function(_this) { 
 | 
        return function(loader) { 
 | 
          return loader.load(_this.options); 
 | 
        }; 
 | 
      })(this) 
 | 
    ]; 
 | 
    return this; 
 | 
  }).service('uiGmapGoogleMapApiManualLoader', [ 
 | 
    'uiGmapMapScriptLoader', function(loader) { 
 | 
      return { 
 | 
        load: function() { 
 | 
          loader.manualLoad(); 
 | 
        } 
 | 
      }; 
 | 
    } 
 | 
  ]); 
 | 
  
 | 
}).call(this); 
 | 
;(function() { 
 | 
  angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapLogger', [ 
 | 
    'nemSimpleLogger', function(nemSimpleLogger) { 
 | 
      return nemSimpleLogger.spawn(); 
 | 
    } 
 | 
  ]); 
 | 
  
 | 
}).call(this); 
 | 
; 
 | 
/*global _:true, angular:true, google:true */ 
 | 
  
 | 
(function() { 
 | 
  angular.module('uiGmapgoogle-maps.directives.api.utils').service('uiGmapGmapUtil', [ 
 | 
    'uiGmapLogger', '$compile', function(Logger, $compile) { 
 | 
      var _isFalse, _isTruthy, getCoords, getLatitude, getLongitude, validateCoords; 
 | 
      _isTruthy = function(value, bool, optionsArray) { 
 | 
        return value === bool || optionsArray.indexOf(value) !== -1; 
 | 
      }; 
 | 
      _isFalse = function(value) { 
 | 
        return _isTruthy(value, false, ['false', 'FALSE', 0, 'n', 'N', 'no', 'NO']); 
 | 
      }; 
 | 
      getLatitude = function(value) { 
 | 
        if (Array.isArray(value) && value.length === 2) { 
 | 
          return value[1]; 
 | 
        } else if (angular.isDefined(value.type) && value.type === 'Point') { 
 | 
          return value.coordinates[1]; 
 | 
        } else { 
 | 
          return value.latitude; 
 | 
        } 
 | 
      }; 
 | 
      getLongitude = function(value) { 
 | 
        if (Array.isArray(value) && value.length === 2) { 
 | 
          return value[0]; 
 | 
        } else if (angular.isDefined(value.type) && value.type === 'Point') { 
 | 
          return value.coordinates[0]; 
 | 
        } else { 
 | 
          return value.longitude; 
 | 
        } 
 | 
      }; 
 | 
      getCoords = function(value) { 
 | 
        if (!value) { 
 | 
          return; 
 | 
        } 
 | 
        if (value instanceof google.maps.LatLng) { 
 | 
          return value; 
 | 
        } else if (Array.isArray(value) && value.length === 2) { 
 | 
          return new google.maps.LatLng(value[1], value[0]); 
 | 
        } else if (angular.isDefined(value.type) && value.type === 'Point') { 
 | 
          return new google.maps.LatLng(value.coordinates[1], value.coordinates[0]); 
 | 
        } else { 
 | 
          return new google.maps.LatLng(value.latitude, value.longitude); 
 | 
        } 
 | 
      }; 
 | 
      validateCoords = function(coords) { 
 | 
        if (angular.isUndefined(coords)) { 
 | 
          return false; 
 | 
        } 
 | 
        if (_.isArray(coords)) { 
 | 
          if (coords.length === 2) { 
 | 
            return true; 
 | 
          } 
 | 
        } else if ((coords != null) && (coords != null ? coords.type : void 0)) { 
 | 
          if (coords.type === 'Point' && _.isArray(coords.coordinates) && coords.coordinates.length === 2) { 
 | 
            return true; 
 | 
          } 
 | 
        } 
 | 
        if (coords && angular.isDefined((coords != null ? coords.latitude : void 0) && angular.isDefined(coords != null ? coords.longitude : void 0))) { 
 | 
          return true; 
 | 
        } 
 | 
        return false; 
 | 
      }; 
 | 
      return { 
 | 
        setCoordsFromEvent: function(prevValue, newLatLon) { 
 | 
          if (!prevValue) { 
 | 
            return; 
 | 
          } 
 | 
          if (Array.isArray(prevValue) && prevValue.length === 2) { 
 | 
            prevValue[1] = newLatLon.lat(); 
 | 
            prevValue[0] = newLatLon.lng(); 
 | 
          } else if (angular.isDefined(prevValue.type) && prevValue.type === 'Point') { 
 | 
            prevValue.coordinates[1] = newLatLon.lat(); 
 | 
            prevValue.coordinates[0] = newLatLon.lng(); 
 | 
          } else { 
 | 
            prevValue.latitude = newLatLon.lat(); 
 | 
            prevValue.longitude = newLatLon.lng(); 
 | 
          } 
 | 
          return prevValue; 
 | 
        }, 
 | 
        getLabelPositionPoint: function(anchor) { 
 | 
          var xPos, yPos; 
 | 
          if (anchor === void 0) { 
 | 
            return void 0; 
 | 
          } 
 | 
          anchor = /^([-\d\.]+)\s([-\d\.]+)$/.exec(anchor); 
 | 
          xPos = parseFloat(anchor[1]); 
 | 
          yPos = parseFloat(anchor[2]); 
 | 
          if ((xPos != null) && (yPos != null)) { 
 | 
            return new google.maps.Point(xPos, yPos); 
 | 
          } 
 | 
        }, 
 | 
        createWindowOptions: function(gMarker, scope, content, defaults) { 
 | 
          var options; 
 | 
          if ((content != null) && (defaults != null) && ($compile != null)) { 
 | 
            options = angular.extend({}, defaults, { 
 | 
              content: this.buildContent(scope, defaults, content), 
 | 
              position: defaults.position != null ? defaults.position : angular.isObject(gMarker) ? gMarker.getPosition() : getCoords(scope.coords) 
 | 
            }); 
 | 
            if ((gMarker != null) && ((options != null ? options.pixelOffset : void 0) == null)) { 
 | 
              if (options.boxClass == null) { 
 | 
  
 | 
              } else { 
 | 
                options.pixelOffset = { 
 | 
                  height: 0, 
 | 
                  width: -2 
 | 
                }; 
 | 
              } 
 | 
            } 
 | 
            return options; 
 | 
          } else { 
 | 
            if (!defaults) { 
 | 
              Logger.error('infoWindow defaults not defined'); 
 | 
              if (!content) { 
 | 
                return Logger.error('infoWindow content not defined'); 
 | 
              } 
 | 
            } else { 
 | 
              return defaults; 
 | 
            } 
 | 
          } 
 | 
        }, 
 | 
        buildContent: function(scope, defaults, content) { 
 | 
          var parsed, ret; 
 | 
          if (defaults.content != null) { 
 | 
            ret = defaults.content; 
 | 
          } else { 
 | 
            if ($compile != null) { 
 | 
              content = content.replace(/^\s+|\s+$/g, ''); 
 | 
              parsed = content === '' ? '' : $compile(content)(scope); 
 | 
              if (parsed.length > 0) { 
 | 
                ret = parsed[0]; 
 | 
              } 
 | 
            } else { 
 | 
              ret = content; 
 | 
            } 
 | 
          } 
 | 
          return ret; 
 | 
        }, 
 | 
        defaultDelay: 50, 
 | 
        isTrue: function(value) { 
 | 
          return _isTruthy(value, true, ['true', 'TRUE', 1, 'y', 'Y', 'yes', 'YES']); 
 | 
        }, 
 | 
        isFalse: _isFalse, 
 | 
        isFalsy: function(value) { 
 | 
          return _isTruthy(value, false, [void 0, null]) || _isFalse(value); 
 | 
        }, 
 | 
        getCoords: getCoords, 
 | 
        validateCoords: validateCoords, 
 | 
        equalCoords: function(coord1, coord2) { 
 | 
          return getLatitude(coord1) === getLatitude(coord2) && getLongitude(coord1) === getLongitude(coord2); 
 | 
        }, 
 | 
        validatePath: function(path) { 
 | 
          var array, i, polygon, trackMaxVertices; 
 | 
          i = 0; 
 | 
          if (angular.isUndefined(path.type)) { 
 | 
            if (!Array.isArray(path) || path.length < 2) { 
 | 
              return false; 
 | 
            } 
 | 
            while (i < path.length) { 
 | 
              if (!((angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) || (typeof path[i].lat === 'function' && typeof path[i].lng === 'function'))) { 
 | 
                return false; 
 | 
              } 
 | 
              i++; 
 | 
            } 
 | 
            return true; 
 | 
          } else { 
 | 
            if (angular.isUndefined(path.coordinates)) { 
 | 
              return false; 
 | 
            } 
 | 
            if (path.type === 'Polygon') { 
 | 
              if (path.coordinates[0].length < 4) { 
 | 
                return false; 
 | 
              } 
 | 
              array = path.coordinates[0]; 
 | 
            } else if (path.type === 'MultiPolygon') { 
 | 
              trackMaxVertices = { 
 | 
                max: 0, 
 | 
                index: 0 
 | 
              }; 
 | 
              _.forEach(path.coordinates, function(polygon, index) { 
 | 
                if (polygon[0].length > this.max) { 
 | 
                  this.max = polygon[0].length; 
 | 
                  return this.index = index; 
 | 
                } 
 | 
              }, trackMaxVertices); 
 | 
              polygon = path.coordinates[trackMaxVertices.index]; 
 | 
              array = polygon[0]; 
 | 
              if (array.length < 4) { 
 | 
                return false; 
 | 
              } 
 | 
            } else if (path.type === 'LineString') { 
 | 
              if (path.coordinates.length < 2) { 
 | 
                return false; 
 | 
              } 
 | 
              array = path.coordinates; 
 | 
            } else { 
 | 
              return false; 
 | 
            } 
 | 
            while (i < array.length) { 
 | 
              if (array[i].length !== 2) { 
 | 
                return false; 
 | 
              } 
 | 
              i++; 
 | 
            } 
 | 
            return true; 
 | 
          } 
 | 
        }, 
 | 
        convertPathPoints: function(path) { 
 | 
          var array, i, latlng, result, trackMaxVertices; 
 | 
          i = 0; 
 | 
          result = new google.maps.MVCArray(); 
 | 
          if (angular.isUndefined(path.type)) { 
 | 
            while (i < path.length) { 
 | 
              latlng; 
 | 
              if (angular.isDefined(path[i].latitude) && angular.isDefined(path[i].longitude)) { 
 | 
                latlng = new google.maps.LatLng(path[i].latitude, path[i].longitude); 
 | 
              } else if (typeof path[i].lat === 'function' && typeof path[i].lng === 'function') { 
 | 
                latlng = path[i]; 
 | 
              } 
 | 
              result.push(latlng); 
 | 
              i++; 
 | 
            } 
 | 
          } else { 
 | 
            array; 
 | 
            if (path.type === 'Polygon') { 
 | 
              array = path.coordinates[0]; 
 | 
            } else if (path.type === 'MultiPolygon') { 
 | 
              trackMaxVertices = { 
 | 
                max: 0, 
 | 
                index: 0 
 | 
              }; 
 | 
              _.forEach(path.coordinates, function(polygon, index) { 
 | 
                if (polygon[0].length > this.max) { 
 | 
                  this.max = polygon[0].length; 
 | 
                  return this.index = index; 
 | 
                } 
 | 
              }, trackMaxVertices); 
 | 
              array = path.coordinates[trackMaxVertices.index][0]; 
 | 
            } else if (path.type === 'LineString') { 
 | 
              array = path.coordinates; 
 | 
            } 
 | 
            while (i < array.length) { 
 | 
              result.push(new google.maps.LatLng(array[i][1], array[i][0])); 
 | 
              i++; 
 | 
            } 
 | 
          } 
 | 
          return result; 
 | 
        }, 
 | 
        getPath: function(object, key) { 
 | 
          var obj; 
 | 
          if ((key == null) || !_.isString(key)) { 
 | 
            return key; 
 | 
          } 
 | 
          obj = object; 
 | 
          _.each(key.split('.'), function(value) { 
 | 
            if (obj) { 
 | 
              return obj = obj[value]; 
 | 
            } 
 | 
          }); 
 | 
          return obj; 
 | 
        }, 
 | 
        validateBoundPoints: function(bounds) { 
 | 
          if (angular.isUndefined(bounds.sw.latitude) || angular.isUndefined(bounds.sw.longitude) || angular.isUndefined(bounds.ne.latitude) || angular.isUndefined(bounds.ne.longitude)) { 
 | 
            return false; 
 | 
          } 
 | 
          return true; 
 | 
        }, 
 | 
        convertBoundPoints: function(bounds) { 
 | 
          var result; 
 | 
          result = new google.maps.LatLngBounds(new google.maps.LatLng(bounds.sw.latitude, bounds.sw.longitude), new google.maps.LatLng(bounds.ne.latitude, bounds.ne.longitude)); 
 | 
          return result; 
 | 
        }, 
 | 
        fitMapBounds: function(map, bounds) { 
 | 
          return map.fitBounds(bounds); 
 | 
        } 
 | 
      }; 
 | 
    } 
 | 
  ]); 
 | 
  
 | 
}).call(this); 
 | 
;(function() { 
 | 
  angular.module("uiGmapgoogle-maps.directives.api.utils").service("uiGmapEventsHelper", [ 
 | 
    "uiGmapLogger", function($log) { 
 | 
      var _getEventsObj, _hasEvents; 
 | 
      _hasEvents = function(obj) { 
 | 
        return angular.isDefined(obj.events) && (obj.events != null) && angular.isObject(obj.events); 
 | 
      }; 
 | 
      _getEventsObj = function(scope, model) { 
 | 
        if (_hasEvents(scope)) { 
 | 
          return scope; 
 | 
        } 
 | 
        if (_hasEvents(model)) { 
 | 
          return model; 
 | 
        } 
 | 
      }; 
 | 
      return { 
 | 
        setEvents: function(gObject, scope, model, ignores) { 
 | 
          var eventObj; 
 | 
          eventObj = _getEventsObj(scope, model); 
 | 
          if (eventObj != null) { 
 | 
            return _.compact(_.map(eventObj.events, function(eventHandler, eventName) { 
 | 
              var doIgnore; 
 | 
              if (ignores) { 
 | 
                doIgnore = _(ignores).includes(eventName); 
 | 
              } 
 | 
              if (eventObj.events.hasOwnProperty(eventName) && angular.isFunction(eventObj.events[eventName]) && !doIgnore) { 
 | 
                return google.maps.event.addListener(gObject, eventName, function() { 
 | 
                  if (!scope.$evalAsync) { 
 | 
                    scope.$evalAsync = function() {}; 
 | 
                  } 
 | 
                  return scope.$evalAsync(eventHandler.apply(scope, [gObject, eventName, model, arguments])); 
 | 
                }); 
 | 
              } 
 | 
            })); 
 | 
          } 
 | 
        }, 
 | 
        removeEvents: function(listeners) { 
 | 
          var key, l; 
 | 
          if (!listeners) { 
 | 
            return; 
 | 
          } 
 | 
          for (key in listeners) { 
 | 
            l = listeners[key]; 
 | 
            if (l && listeners.hasOwnProperty(key)) { 
 | 
              google.maps.event.removeListener(l); 
 | 
            } 
 | 
          } 
 | 
        } 
 | 
      }; 
 | 
    } 
 | 
  ]); 
 | 
  
 | 
}).call(this); 
 | 
; 
 | 
/* 
 | 
@authors: 
 | 
- Nicholas McCready - https://twitter.com/nmccready 
 | 
 */ 
 | 
  
 | 
  
 | 
/* 
 | 
StreetViewPanorama Directive to care of basic initialization of StreetViewPanorama 
 | 
 */ 
 | 
  
 | 
(function() { 
 | 
  angular.module('uiGmapgoogle-maps').directive('uiGmapStreetViewPanorama', [ 
 | 
    'uiGmapGoogleMapApi', 'uiGmapLogger', 'uiGmapGmapUtil', 'uiGmapEventsHelper', function(GoogleMapApi, $log, GmapUtil, EventsHelper) { 
 | 
      var name; 
 | 
      name = 'uiGmapStreetViewPanorama'; 
 | 
      return { 
 | 
        restrict: 'EMA', 
 | 
        template: '<div class="angular-google-map-street-view-panorama"></div>', 
 | 
        replace: true, 
 | 
        scope: { 
 | 
          focalcoord: '=', 
 | 
          radius: '=?', 
 | 
          events: '=?', 
 | 
          options: '=?', 
 | 
          control: '=?', 
 | 
          povoptions: '=?', 
 | 
          imagestatus: '=' 
 | 
        }, 
 | 
        link: function(scope, element, attrs) { 
 | 
          return GoogleMapApi.then((function(_this) { 
 | 
            return function(maps) { 
 | 
              var clean, create, didCreateOptionsFromDirective, firstTime, handleSettings, listeners, opts, pano, povOpts, sv; 
 | 
              pano = void 0; 
 | 
              sv = void 0; 
 | 
              didCreateOptionsFromDirective = false; 
 | 
              listeners = void 0; 
 | 
              opts = null; 
 | 
              povOpts = null; 
 | 
              clean = function() { 
 | 
                EventsHelper.removeEvents(listeners); 
 | 
                if (pano != null) { 
 | 
                  pano.unbind('position'); 
 | 
                  pano.setVisible(false); 
 | 
                } 
 | 
                if (sv != null) { 
 | 
                  if ((sv != null ? sv.setVisible : void 0) != null) { 
 | 
                    sv.setVisible(false); 
 | 
                  } 
 | 
                  return sv = void 0; 
 | 
                } 
 | 
              }; 
 | 
              handleSettings = function(perspectivePoint, focalPoint) { 
 | 
                var heading; 
 | 
                heading = google.maps.geometry.spherical.computeHeading(perspectivePoint, focalPoint); 
 | 
                didCreateOptionsFromDirective = true; 
 | 
                scope.radius = scope.radius || 50; 
 | 
                povOpts = angular.extend({ 
 | 
                  heading: heading, 
 | 
                  zoom: 1, 
 | 
                  pitch: 0 
 | 
                }, scope.povoptions || {}); 
 | 
                opts = opts = angular.extend({ 
 | 
                  navigationControl: false, 
 | 
                  addressControl: false, 
 | 
                  linksControl: false, 
 | 
                  position: perspectivePoint, 
 | 
                  pov: povOpts, 
 | 
                  visible: true 
 | 
                }, scope.options || {}); 
 | 
                return didCreateOptionsFromDirective = false; 
 | 
              }; 
 | 
              create = function() { 
 | 
                var focalPoint; 
 | 
                if (!scope.focalcoord) { 
 | 
                  $log.error(name + ": focalCoord needs to be defined"); 
 | 
                  return; 
 | 
                } 
 | 
                if (!scope.radius) { 
 | 
                  $log.error(name + ": needs a radius to set the camera view from its focal target."); 
 | 
                  return; 
 | 
                } 
 | 
                clean(); 
 | 
                if (sv == null) { 
 | 
                  sv = new google.maps.StreetViewService(); 
 | 
                } 
 | 
                if (scope.events) { 
 | 
                  listeners = EventsHelper.setEvents(sv, scope, scope); 
 | 
                } 
 | 
                focalPoint = GmapUtil.getCoords(scope.focalcoord); 
 | 
                return sv.getPanoramaByLocation(focalPoint, scope.radius, function(streetViewPanoramaData, status) { 
 | 
                  var ele, perspectivePoint, ref; 
 | 
                  if (scope.imagestatus != null) { 
 | 
                    scope.imagestatus = status; 
 | 
                  } 
 | 
                  if (((ref = scope.events) != null ? ref.image_status_changed : void 0) != null) { 
 | 
                    scope.events.image_status_changed(sv, 'image_status_changed', scope, status); 
 | 
                  } 
 | 
                  if (status === "OK") { 
 | 
                    perspectivePoint = streetViewPanoramaData.location.latLng; 
 | 
                    handleSettings(perspectivePoint, focalPoint); 
 | 
                    ele = element[0]; 
 | 
                    return pano = new google.maps.StreetViewPanorama(ele, opts); 
 | 
                  } 
 | 
                }); 
 | 
              }; 
 | 
              if (scope.control != null) { 
 | 
                scope.control.getOptions = function() { 
 | 
                  return opts; 
 | 
                }; 
 | 
                scope.control.getPovOptions = function() { 
 | 
                  return povOpts; 
 | 
                }; 
 | 
                scope.control.getGObject = function() { 
 | 
                  return sv; 
 | 
                }; 
 | 
                scope.control.getGPano = function() { 
 | 
                  return pano; 
 | 
                }; 
 | 
              } 
 | 
              scope.$watch('options', function(newValue, oldValue) { 
 | 
                if (newValue === oldValue || newValue === opts || didCreateOptionsFromDirective) { 
 | 
                  return; 
 | 
                } 
 | 
                return create(); 
 | 
              }); 
 | 
              firstTime = true; 
 | 
              scope.$watch('focalcoord', function(newValue, oldValue) { 
 | 
                if (newValue === oldValue && !firstTime) { 
 | 
                  return; 
 | 
                } 
 | 
                if (newValue == null) { 
 | 
                  return; 
 | 
                } 
 | 
                firstTime = false; 
 | 
                return create(); 
 | 
              }); 
 | 
              return scope.$on('$destroy', function() { 
 | 
                return clean(); 
 | 
              }); 
 | 
            }; 
 | 
          })(this)); 
 | 
        } 
 | 
      }; 
 | 
    } 
 | 
  ]); 
 | 
  
 | 
}).call(this); 
 | 
}( window,angular)); 
 |