
  $(function() {

    if ($('#map').length == 0) {
      return;
    }

      var mapStyle =  [
      {
        featureType: "administrative",
        elementType: "all",
        stylers: [
          { visibility: "off" }
        ]
      },{
        featureType: "water",
        elementType: "labels",
        stylers: [
          { visibility: "off" }
        ]
      }
    ]

      var mapStyle2 =  [
     {
        featureType: "water",
        elementType: "labels",
        stylers: [
          { visibility: "off" }
        ]
      }
    ]


    var points = {
      _current: -1,
      next: function() {
        this._current ++;
        if (this._current >= this.list.length) {
          this._current = 0;
        }
        return this.list[this._current];
      },
      center: new google.maps.LatLng(44.874141,11.773138),
      list: [
        {label: "Egypt", point: new google.maps.LatLng(31.184609,29.926758)},
        {label: "USA", point: new google.maps.LatLng(40.714476,-74.008026)},
        {label: "France", point: new google.maps.LatLng(48.857035,2.360344)},
        {label: "India", point: new google.maps.LatLng(19.01863,72.890167) },
        {label: "Russia", point: new google.maps.LatLng(55.756486,37.575989)}
      ]
    }

    var options = {
      zoom: 2,
      center: points.center,
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      disableDefaultUI: true,
      scrollwheel: false,
      disableDoubleClickZoom: true
    };
    var map = new google.maps.Map(document.getElementById("map"), options);
    map.panBy(-40, 100);

    var styledMapOptions = {map: map, name: 'Custom'}
    var styledMapOptions2 = {map: map, name: 'Custom'}
    var s = new google.maps.StyledMapType(mapStyle, styledMapOptions);
    var s2 = new google.maps.StyledMapType(mapStyle2, styledMapOptions2);

    map.mapTypes.set('custom', s);
    map.mapTypes.set('custom2', s2);
    map.setMapTypeId('custom');

    var geocoder = new google.maps.Geocoder();
    var locations = []

    var mappedLocations = {}


    var icn = new google.maps.MarkerImage('/carmela-themes/logimar.it/images/marker.png',
      new google.maps.Size(29, 38),
      new google.maps.Point(0, 0),
      new google.maps.Point(10, 32)
    );

    var logimar_marker = new google.maps.MarkerImage('/carmela-themes/logimar.it/images/marker-logimar.png',
      new google.maps.Size(60, 38),
      new google.maps.Point(0, 0),
      new google.maps.Point(30, 19));


    var sh = new google.maps.MarkerImage('/carmela-themes/logimar.it/images/shadow.png',
      new google.maps.Size(43, 33),
      new google.maps.Point(0, 0),
      new google.maps.Point(4, 32)
    );


    var logimarker = new google.maps.Marker({
          position: points.center,
          map: map,
          icon: logimar_marker
        })

    var infowindow = new google.maps.InfoWindow({
      content: 'hello'
    });

    function AnimatePoly(p, ll, onComplete) {

      var c = 6;

      var s = p.getPath().getAt(0);
      var avg = {
        lat: (ll.lat() - s.lat()) / c,
        lng: (ll.lng() - s.lng()) / c
      }

      p.getPath().push(s);

      var iid = setInterval(function() {
        var last = p.getPath().getAt(1);
        var np = new google.maps.LatLng(last.lat() + avg.lat, last.lng() + avg.lng)
        p.getPath().setAt(1, np);
        c --

        if (c == 0) {
          clearInterval(iid);

          if (onComplete != undefined) {
            onComplete(p);
          }
        }

      }, 40);


    }

    function addLocation(ll, label) {
      var path = new google.maps.Polyline({
        path: [points.center],
        strokeColor: "#000000",
        strokeOpacity: 0.2,
        strokeWeight: 2,
        geodesic: false,
        map: map
      });

      //path.getPath().push(ll);

      var ap = new AnimatePoly(path, ll, function(poly) {
        var marker = new google.maps.Marker({
          position: ll,
          map: map,
          title: label,
          icon: icn,
          shadow: sh
        })


        var data = mappedLocations[label];

        var iwcontent = '<div class="infowindow-content"><strong>' + label + '</strong>: ';
        iwcontent += '<span>Agenti a ' + data.places.flatten(', ', ' e ') + '</span>';
        iwcontent += '</div>';

        google.maps.event.addListener(marker, 'click', function() {
          map.setZoom(3);
          map.setMapTypeId('custom2');
          map.panTo(ll);

          infowindow.setContent(iwcontent);
          infowindow.open(map, marker);
        });
      });
    }


    function findAndAdd() {
      if (locations.length == 0) {
        return
      }
      var n = locations.shift();

      if (!n.lat) {
        geocoder.geocode({address: n.name}, function(result, status) {
          mappedLocations[n.name] = n;
          addLocation(result[0].geometry.location, n.name);
          setTimeout(findAndAdd, 500);          
        });
      } else {
        var p = new google.maps.LatLng(n.lat, n.lng);
        mappedLocations[n.name] = n;
        addLocation(p, n.name);
        setTimeout(findAndAdd, 100);
      }

    }

    $.get('/locations.php', null, function(r) {
      locations = r;
      findAndAdd();
    });






    //map.panTo(p.point);
      //map.zoomOut(p, false);

  });
