window.addEvent('domready', function() {
    initGoogleMap();
    
    placeTracksMarker();
    fitMarkers();
 
    
    $$('div.map-select').each(function(el){            
        el.addEvent('click',function(e){
            aLatLng = this.get('rel').split(',');
            aTotemsLatLng = this.getElements('.totems').get('text').toString().split('|');  
            track_id = this.getElements('.track_id').get('text');
            focusOnTrack(aLatLng, aTotemsLatLng, track_id);
        });        
    });         
                                        
    if ($('fitness-icon')) {
        $('fitness-icon').addEvent('click', function() {
                                            if ($('search-postcode-wrapper').hasClass('hidden'))
                                                $('search-postcode-wrapper').removeClass('hidden');
                                            else 
                                                $('search-postcode-wrapper').addClass('hidden');
                                        });  
        $('search-postcode-go').addEvent('click', searchPostcode);                                         
        $('search-postcode').addEvent('keydown:keys(enter):once', searchPostcode);
    }
    
    
});


function searchPostcode() {
    var regPostcode = /^[0-9]{4}$/;

    if (regPostcode.test($('search-postcode').value)) findClosestTrack($('search-postcode').value);
    else {
        alert("Please enter Australian postcode only.\n\nPO Box number is not supported.");
        $('search-postcode').value = '';                                                    
    }
};

  var geocoder;
  var map;
  var zoomMap = 10;
  var tracks = [];
  var totems = [];
  var tracksCoords = []; // for tracks, used in finding the closest
  var userMarker;
  var markerDisplay = 'TRACK';
  var infowindow;   
  var trackPolygon;
  
   var cta_layer;
    var map_loader;
    var loaderId;
  
  
  function initGoogleMap() {
    map_loader = $('map_loader');
    geocoder = new google.maps.Geocoder();    
    markerDisplay = 'TRACK';
    
    var defaultTrack = $(document.body).getElement('div.map-select');
    

    aLatLng = defaultTrack.get('rel').split(',');

    var opt = {
      zoom: zoomMap,
      center: new google.maps.LatLng(aLatLng[0], aLatLng[1]),
      mapTypeId: google.maps.MapTypeId.SATELLITE 
    }
    map = new google.maps.Map(document.getElementById("map_canvas"), opt); 
    
    google.maps.event.addListener(map, 'zoom_changed', zoomChanged);
  }
  
  function zoomChanged() {
    var visibleTrack;
    var visibleMarkers = [];   
    
    //console.log(markerDisplay + tracks.length);
    
    if (markerDisplay == 'TRACK') {
                 
        for (var i=0; i < tracks.length; i++){                
            if( map.getBounds().contains(tracks[i].getPosition()) ){
                visibleMarkers.push(tracks[i].getPosition());
            }
        }

        if (visibleMarkers.length==1) {
            rel = (Math.round(visibleMarkers[0].lat()*1000000)/1000000) +","+ (Math.round(visibleMarkers[0].lng()*1000000)/1000000);
            visibleTrack = $$("div[rel="+rel+"]");
            
            if (visibleTrack) {
                aLatLng = [visibleMarkers[0].lat(), visibleMarkers[0].lng()];
                aTotemsLatLng = visibleTrack.getElement('.totems').get('text').toString().split('|');  
                track_id = visibleTrack.getElement('.track_id').get('text');
                focusOnTrack(aLatLng, aTotemsLatLng, track_id);
            }            
        }
    }    
    else if (markerDisplay == 'TOTEM') {
        zoomLevel = map.getZoom();            
        if (zoomLevel <= 12)  {
            resetMarkers();
            fitMarkers();
        }     
    }
  }
  
  
  function fitMarkers() { //fit all markers    
    var latlngbounds = new google.maps.LatLngBounds();
    tracksCoords.each(function(n){latlngbounds.extend(n);});
    map.setCenter(latlngbounds.getCenter());
    map.fitBounds(latlngbounds); 
  }
  
  function placeTracksMarker() {   
  
    $$('div.map-select').each(function(el){         
        var image = 'http://www.calico.com.au/images/tracks/icon_tracks.png';
         var aLatLng = el.get('rel').split(',');
         var latlng = new google.maps.LatLng(aLatLng[0], aLatLng[1]);
         var contentString = el.getElement('div.sponsor').get('html');           
         tracksCoords.push(latlng);
         
         var marker = new google.maps.Marker({
            map:map,
            icon: image,
            title: el.getElement('h2').get('text'), 
            animation: google.maps.Animation.DROP,
            position: latlng
          });
          tracks.push(marker);           
          google.maps.event.addListener(marker, 'click', function() {    
          /*
                                                              if (this.getAnimation() != null) {
                                                                this.setAnimation(null);
                                                              } else {
                                                                this.setAnimation(google.maps.Animation.BOUNCE);
                                                              }         
                                                              */
                                                              if (contentString != "") { 
                                                                    if (infowindow) infowindow.close();
                                                                    infowindow = new google.maps.InfoWindow({content: contentString});         
                                                              }
                                                              
                                                              if (infowindow) infowindow.open(map, this);
                                                              
                                                            });
    });
  }
  
  function clearMarkers(aMarkers) {
    for(var i=0; i < aMarkers.length; i++){
        aMarkers[i].setMap(null);
    }
  }

 
  function focusOnTrack(aLatLng, aTotemsLatLng, track_id) {
    var totemCoords = [];
    
    //clear markers    
    clearMarkers(tracks);
    clearMarkers(totems);
    tracks = [];
    totems = [];
    
    latlng = new google.maps.LatLng(aLatLng[0], aLatLng[1]);      
    geocoder.geocode( { 'latLng':latlng  }, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        map.setZoom(14);
        map.setCenter(latlng);
    
        aTotemsLatLng.each(function(coordinate){ 
                var image = 'http://www.calico.com.au/images/tracks/icon_totems.png';
                 var aLatLng = coordinate.split(',');
                 var latlng = new google.maps.LatLng(aLatLng[0], aLatLng[1]);
                 totemCoords.push(latlng);

                 var marker = new google.maps.Marker({
                    map:map,
                    icon: image,
                    title: 'Fitness totem ('+ coordinate + ')', 
                    animation: google.maps.Animation.DROP,
                    position: latlng
                  });
                  totems.push(marker); 
            });
            
            var myParser = new geoXML3.parser({map: map, zoom: true });
            myParser.parse('http://www.calico.com.au/inc/pages/track-kml.php?track_id='+track_id);           
        
      } else {
        focusOnTrack(aLatLng, aTotemsLatLng, track_id);
        //alert("Geocode was not successful for the following reason: " + status);
      }
     
    });   
    
    markerDisplay = 'TOTEM'
  }
  
  
  function findClosestTrack(postcode) {
    resetMarkers();
    geocoder.geocode( { 'address':postcode + ' Australia, Australia', 'region':'AU'}, function(results, status) {
              if (status == google.maps.GeocoderStatus.OK) {
                nearest = findClosestMarker(results[0].geometry.location);      

                var userMarker = new google.maps.Marker({
                                map:map,
                                title: 'Your location: ' + results[0].formatted_address,
                                animation: google.maps.Animation.DROP,
                                position: results[0].geometry.location
                              });
                              
                $('search-postcode-result').set('html', results[0].formatted_address);   
                $('search-nearest-track').set('html', nearest.title);
                
                
                 $$('div.map-select').each(function(el){                    
                    aLatLng = el.get('rel').split(',');                    
                    var temp_latlng = new google.maps.LatLng(aLatLng[0], aLatLng[1]);                    
                    if ( (temp_latlng.lat() == nearest.position.lat()) && (temp_latlng.lng() == nearest.position.lng()) )  {
                        aTotemsLatLng = el.getElements('.totems').get('text').toString().split('|');  
                        track_id = el.getElements('.track_id').get('text');
                        focusOnTrack(aLatLng, aTotemsLatLng, track_id);
                    }
                    
                 });

                
              } else {
                // focusOnTrack(nearest.position.lat(), nearest.position.lng());
                //alert("Geocode was not successful for the following reason: " + status);
                
                $('search-postcode-result').set('html', 'Error');   
                $('search-nearest-track').set('html', '');
              }
            });   
  }
  

  function resetMarkers() {
    initGoogleMap();
    placeTracksMarker();
  }
 
  
function rad(x) {return x*Math.PI/180;}
function findClosestMarker( latLng ) {
    var lat = latLng.lat();
    var lng = latLng.lng();
    var R = 6371;
    var distances = [];
    var closest = -1;
    for( i=0;i<tracks.length; i++ ) {
        var mlat = tracks[i].position.lat();
        var mlng = tracks[i].position.lng();
        var dLat  = rad(mlat - lat);
        var dLong = rad(mlng - lng);
        var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
            Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2);
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        var d = R * c;
        distances[i] = d;
        if ( closest == -1 || d < distances[closest] ) {
            closest = i;
        }
    }

    return tracks[closest];
}

