
<!--
Copyright 2017-present Open Networking Foundation

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->


<div class = "row">
  <div class = "col-xs-12">
    <h1>vNaaS Map</h1>
    <!--
      In China, replace 'https://maps.googleapis.com/' with 'http://maps.google.cn/' below
    -->
    <div map-lazy-load="https://maps.googleapis.com/maps/api/js?key=AIzaSyA3rQOp26I5a21VQhwLal8Z1x3XGHjXfm4">
      <ng-map
        default-style="false"
        id="foobar"
        center="0,0"
        disable-default-u-i="true"
        map-type-id="ROADMAP"
        zoom-control="true"
        min-zoom="2"
        styles="{{vm.mapStyles}}"
      >

        <marker
          ng-repeat="uni in vm.unis"
          id="marker-{{uni.id}}"
          position="{{uni.latlng.toString()}}"
          icon="{{vm.MapConfig.marker}}"
          on-click="vm.showUni(uni)"
        >
        </marker>

        <info-window id = "uni-info">
          <div class = "marker-info">
            <h4>{{vm.current_uni.name}}</h4>
            <p>
              <b>LatLng: </b>{{vm.current_uni.latlng.toString()}}<br/>
              <b>Cpe id: </b>{{vm.current_uni.cpe_id}}<br/>
              <b>Tenant: </b>{{vm.current_uni.tenant}}<br/>
            </p>
            <button ng-show="vm.canCreateEline" ng-click="vm.createConnection(vm.current_uni)()">Create connection</button>
            <button ng-show="!vm.canCreateEline && !uni.eline_start" ng-click="vm.finishConnection(vm.current_uni)">Finish connection</button>
          </div>
        </info-window>

        <shape
          ng-repeat="eline in vm.elines"
          name="polyline"
          id="eline-{{eline.id}}"
          path="{{eline.path}}"
          stroke-color="{{vm.colorLine(eline.backend_code)}}"
          stroke-opacity="1.0"
          stroke-weight="5"
          on-click="vm.elinePanel({{eline.id}}, true)"
        >
        </shape>

      </ng-map>

    </div>
    Changes may not display until page refresh.
  </div>
</div>
