var map;
var mgr;
var markers = new Array();

$(document).ready(init_store_locator);


function init_store_locator(){
  init_map();
}


function init_map(){
  $('#store_map').css({width:600,height:530});

  //if (GBrowserIsCompatible()){
    map = new GMap2(document.getElementById('store_map'));
    map.addControl(new GLargeMapControl());


  
    // Get store bounds  
    var lat;
    var lng;
    var bounds = get_store_bounds(stores);
    
    // set the center point of the map
    var map_center = bounds.getCenter();
    

    //var map_center = new GLatLng(37.5, -95);
    map.setCenter(map_center,7);
                
    // Set the map zoom
    zoom = map.getBoundsZoomLevel(bounds);
    if(zoom>3) zoom--;

    map.setZoom(zoom);
    // map.setZoom(3);  // US zoom level


    
    show_stores(stores);
  
    // add the map/satellite/hybrid controls
    map.addControl(new GMapTypeControl());
  
    //if(stores.length > 10){
      map.enableScrollWheelZoom();
    //}
    map.savePosition();


  
    
    
 // }

}


function show_stores(stores){
  var n = 0;
  for( var i = 0; i<stores.length; i++){
    

   
    if(stores[i].longitude!=null && stores[i].latitude!=null){
      stores[i].idx = n;
          
      //alert(stores[i].longitude +" " + stores[i].latitude);
      markers[i] = make_marker(stores[i], (stores.length<10));
      if(stores.length <= 50){
        map.addOverlay(markers[i]);  
      } 
      n++;
    }else{
      stores[i].idx = -1;
      markers[i] = null;  
    }
  }
  
  // apply marker manager
  if(stores.length > 50){
    mgr = new MarkerManager(map, { borderPadding: 50, maxZoom: 15, trackMarkers: true });  
    refresh_marker_manager();
  }      
}

function make_marker(store,numbering){
  var icon = new GIcon();
  
  if(numbering){
    icon.image = WWW_TEMPLATE + '/images/store_marker'+ (store.idx + 1)+'.png';
  }else{
    icon.image = WWW_TEMPLATE + '/images/store_marker.png';
  }

  icon.iconSize = new GSize(26, 37);
  icon.iconAnchor = new GPoint(13, 35);
  icon.infoWindowAnchor = new GPoint(13, 2);

  var marker = new GMarker(new GLatLng(store.latitude, store.longitude), icon);


  var str_store_info;
  var address = []
  var csz = []
  str_store_info = '<div class="balloon_content">' 
  
  if(store.store_name) address.push('<b>' + store.store_name + '</b>');
  if(store.address)address.push( store.address);
  if(store.address_2)address.push(store.address_2);

  if(store.city) csz.push(store.city);
  if(store.state) csz.push(', ' + store.state);
  if(store.zip) csz.push(' ' + store.zip);
  if(csz){
    address.push(csz.join(''));  
  }
  if(store.phone)address.push('Phone: ' + store.phone);
  str_store_info += address.join('<br/>');  
  
  str_store_info +='<p><a href="'+ WWW_ROOT +'store/' + store.store_id + '">More Information</a></p>';

  str_store_info+= '</div>';
  
   
  


  store.info_window = str_store_info;

  store.marker = marker;
   //marker.bindInfoWindowHtml(store.infoWindow);
  
  GEvent.addListener(marker, 'click', function(){
    marker.openInfoWindow(store.info_window);
    // show_store(store.store_id);
  });
 
  return marker;
  
        
}

function show_store_baloon(store_id){
  store_idx = get_store_idx_by_id(store_id);
  stores[store_idx].marker.openInfoWindow(stores[store_idx].info_window);
  return false;
}


function get_store_idx_by_id(store_id){
  var n= 0;
  for(var i = 0; i<stores.length; i++){

    if(stores[i].store_id== store_id) return i;

  }
}

function get_store_bounds(arr_store)
{
    var j = 0;
    for (var i = 0; i < arr_store.length; i++){
      if(arr_store[i].latitude!=null && arr_store[i].longitude!=null){
        if(j == 0){
          var minLat = parseFloat(arr_store[i].latitude);
          var maxLat = parseFloat(arr_store[i].latitude);
          var minLng = parseFloat(arr_store[i].longitude);
          var maxLng = parseFloat(arr_store[i].longitude);
  
        }else{
        
          if (parseFloat(arr_store[i].latitude) < minLat)
          {
              minLat = parseFloat(arr_store[i].latitude);
          }
          else if (parseFloat(arr_store[i].latitude) > maxLat)
          {
              maxLat = parseFloat(arr_store[i].latitude);
          }
  
          if (parseFloat(arr_store[i].longitude) < minLng)
          {
              minLng = parseFloat(arr_store[i].longitude);
          }
          else if (parseFloat(arr_store[i].longitude) > maxLng)
          {
              maxLng = parseFloat(arr_store[i].longitude);
          }
        }
       j++;
        
      }

    }
    
    //alert("result: \n" + 'minLat = ' + minLat + '\nmaxLat = ' + maxLat + '\nminLng = ' + minLng + '\nmaxLng = ' + maxLng);


    
    return new GLatLngBounds(new GLatLng(maxLat, minLng), new GLatLng(minLat, maxLng)); 
}


function refresh_marker_manager(){


   // Zoom level 0
   var markers_x = zoom_filter_marker(markers,10);
   mgr.addMarkers(markers_x, 0);  

   
   var markers_x = zoom_filter_marker(markers,7);
   mgr.addMarkers(markers_x, 2);  

   var markers_x = zoom_filter_marker(markers,5);
   mgr.addMarkers(markers_x, 3);  
   
   var markers_x = zoom_filter_marker(markers,2);
   mgr.addMarkers(markers_x, 4);  

   var markers_x = zoom_filter_marker(markers,1);
   mgr.addMarkers(markers_x, 5);  

   var markers_x = zoom_filter_marker(markers,0.5);
   mgr.addMarkers(markers_x, 6);  

   // Show all at level 7
   var markers_x = zoom_filter_marker(markers,0);   
   mgr.addMarkers(markers_x, 7);  


   
   
   mgr.refresh();
    
}

function get_grid_bound_id(latlng,degree){
  lat_deg = degree;
  lng_deg = degree;
  var lat = latlng.lat();
  var lng = latlng.lng();
  
  var s = Math.floor(lat/lat_deg)* lat_deg;
  var w = Math.floor(lng/lng_deg)* lng_deg;
  var n = s + lat_deg;
  var e = w + lng_deg;
  
  return s+'-'+ w;
  
}

function zoom_filter_marker(markers, degree){
  var grid = new Array();;
  var grid_id;
  var ret_markers = new Array();
  for( i = 0; i<markers.length ; i++){
    if(markers[i]!= null){
      if(degree ==0){
        ret_markers.push(markers[i]);        
      }else{
        grid_id = get_grid_bound_id(markers[i].getLatLng(), degree);
        if(grid[grid_id] == undefined){
          grid[grid_id]  = true;
          ret_markers.push(markers[i]);
        } 
      }
    } 
  }
  return ret_markers;
    
}