// global vars
var _map;
var _markers = new Array(); // list of all marker objects: it is global to permit events trigger by sideBar
var _markerGIcons = [];

function importanceOrder (marker,b) 
  {
    return GOverlay.getZIndex(marker.getPoint().lat()) + marker.importance*1000000;
  }
  
// load map reading data from suppied xml (url)
function loadMap( idOfContainerElement, markersArray, pageType, urlOfImages, mapType, specifiedZoomLevel, specifiedLatitudineCenter, specifiedLongitudineCenter )
{

  if ( mapType == null )
    mapType = G_NORMAL_MAP;
    
  generateMap( idOfContainerElement, markersArray, pageType, urlOfImages, mapType, specifiedZoomLevel, specifiedLatitudineCenter, specifiedLongitudineCenter );
}

// generate the map basing on xmlData (string format) supplied
function generateMap( idOfContainerElement, markersArray, pageType, urlOfImages, mapType, specifiedZoomLevel, specifiedLatitudineCenter, specifiedLongitudineCenter )
{

  // hides map container while loading
  document.getElementById( idOfContainerElement ).style.visibility = 'hidden';
  
  // init GIcons array
  
  
  var iconCasa = new GIcon();
  iconCasa.iconSize = new GSize(25,28);   
  iconCasa.iconAnchor=new GPoint(16,32); 
  iconCasa.infoWindowAnchor=new GPoint(16,0);
  
  var iconCantiere = new GIcon();
  iconCantiere.iconSize = new GSize(25,28);   
  iconCantiere.iconAnchor=new GPoint(16,32); 
  iconCantiere.infoWindowAnchor=new GPoint(16,0);
  
  //var newIcon = new GIcon( icon, '../img/listing.png' );
  //marker = new GMarker( point, newIcon );
  
  _markerGIcons["defaultIcon"] = new GIcon(G_DEFAULT_ICON, urlOfImages + "/gMapMarkerRed.png");
  _markerGIcons["defaultIconRollover"] = new GIcon(G_DEFAULT_ICON, urlOfImages + "/gMapMarkerDefaultRollOver.png");
  _markerGIcons["iconNotFromSearch"] = new GIcon(G_DEFAULT_ICON, urlOfImages + "/gMapMarkerNotFromSearch.png");
  _markerGIcons["iconNotFromSearchRollover"] = new GIcon(G_DEFAULT_ICON, urlOfImages + "/gMapMarkerNotFromSearchRollover.png");
  _markerGIcons["cantieriIcon"] = new GIcon(G_DEFAULT_ICON, urlOfImages + "/gMapMarkerCantieri.png");
  _markerGIcons["video"] = new GIcon(G_DEFAULT_ICON, urlOfImages + "/video.png");
  _markerGIcons["videoNotFromSearch"] = new GIcon(G_DEFAULT_ICON, urlOfImages + "/videoNotFromSearch.png");
  
  _markerGIcons["markerCasa"] = new GIcon( iconCasa, urlOfImages + "/markerCasa.png" );
  _markerGIcons["markerCasaRollover"] = new GIcon( iconCasa, urlOfImages + "/markerCasaRollover.png" );
  _markerGIcons["markerCasaNotFromSearch"] = new GIcon( iconCasa, urlOfImages + "/markerCasaNotFromSearch.png" );
  _markerGIcons["markerCantiere"] = new GIcon( iconCantiere, urlOfImages + "/markerCantiere.png" );
  _markerGIcons["markerCantiereRollover"] = new GIcon( iconCantiere, urlOfImages + "/markerCantiereRollover.png" );
  _markerGIcons["markerCantiereNotFromSearch"] = new GIcon( iconCantiere, urlOfImages + "/markerCantiereNotFromSearch.png" ); 
  
  
  
  // create bounds
  var bounds = new GLatLngBounds();
  
  
  // create map and set properties
  _map = new GMap2(document.getElementById( idOfContainerElement ));
  _map.setCenter(new GLatLng(0, 0), 10);                                 // center map (recentered after markers positioning)
  _map.addControl(new GLargeMapControl());                               // controls (zoom, scroll)
  _map.addControl(new GMapTypeControl());                                // _map type control
  _map.addControl(new GScaleControl());                                  // display scale
  new GKeyboardHandler(_map);                                            // bind keys (up, down...pup, pdown...+ -)
  _map.enableContinuousZoom();
  _map.enableDoubleClickZoom();
  _map.setMapType( mapType );
  
  // display markers
  markerElements = markersArray;
  markerElements = getMarkerDuplicatesByCoordinates(markerElements);
  var markerIndex = 0;
  for (var i = 0; i < markerElements.length; i++) {
    if (markerElements[i].deleted == false || markerElements[i].deleted == undefined) {
      // map marker 
      if (markerElements[i].hasVideo != 'true')
        _markers[markerIndex] = createMarker(markerElements[i], bounds, pageType, markerIndex);
      else
        _markers[markerIndex] = createCustomMarker(markerElements[i], bounds, pageType, markerIndex);
      _map.addOverlay(_markers[markerIndex]);
      markerIndex++;
    }
  }
  
  var effectiveZoomLevel = parseInt(  ( specifiedZoomLevel != null ? specifiedZoomLevel : _map.getBoundsZoomLevel(bounds) ) );
  //Never use max zoom... use at least 13
  if( effectiveZoomLevel > 12 )
    effectiveZoomLevel = 12;
  
  var center;
  if( ( specifiedLatitudineCenter == null ) && ( specifiedLongitudineCenter == null ) )
    center = bounds.getCenter();
  else
    center = new GLatLng(specifiedLatitudineCenter, specifiedLongitudineCenter)
  //auto center and zoom
  _map.setCenter(center, effectiveZoomLevel );
  _map.savePosition(); // this makes the center button useful
  
  // show map container
  document.getElementById( idOfContainerElement ).style.visibility = 'visible';
  
}


// create GMarker
function createMarker( markerElement, mapBounds, pageType, markerIndex )
{
  var point = new GLatLng(parseFloat(markerElement.latitudine), parseFloat(markerElement.longitudine));
  var marker;
  //var infoWin = markerElement.description;
  if( pageType == 'results' )
  {
    if( markerElement.fromSearch == 'true' )
    {
      if( markerElement.isCantiere != 'true' )
        marker = new GMarker(point, { icon: _markerGIcons["markerCasa"], title: markerElement.isMultiple ? "Piu' appartamenti" : markerElement.description, zIndexProcess: importanceOrder });
      else
        marker = new GMarker(point, { icon: _markerGIcons["markerCantiere"], zIndexProcess: importanceOrder, title: markerElement.isMultiple ? "Piu' appartamenti" : markerElement.description });        
      
      marker.importance = 2;
      _map.addOverlay(marker);  
      mapBounds.extend( point );
    }
    else
    {
      if( markerElement.isCantiere != 'true' )
        marker = new GMarker(point, { icon: _markerGIcons["markerCasaNotFromSearch"], title: markerElement.isMultiple ? "Piu' appartamenti" : markerElement.description, zIndexProcess: importanceOrder });
      else
        marker = new GMarker(point, { icon: _markerGIcons["markerCantiereNotFromSearch"], title: markerElement.isMultiple ? "Piu' appartamenti" : markerElement.description, zIndexProcess: importanceOrder });
      marker.importance = 1;
      _map.addOverlay(marker);
      
    }
  }
  else
  {
    marker = new GMarker( point, {icon:_markerGIcons["defaultIcon"],title:markerElement.name} );
    mapBounds.extend( point );
  }

  GEvent.addListener(marker, "click", function() {
    if (markerElement.isMultiple) {
      var html = "<div class=\"divBaloonMarker\">"
      + "<div class=\"divBaloonMarkerHeader\">In questo stabile ci sono pi&ugrave; appartamenti:</div>"
      + "<ul>";
      for (var t = 0; t < markerElement.markerList.length; t++) {
        var markerElementm = markerElement.markerList[t];
        if (pageType == 'home')
          html = html + "<li><a href=\"javascript: window.location.href = 'Searchresults.aspx?ddlSearchZona='" + markerElementm.idItem + "\">" + markerElementm.description + "</a></li>";
        else {
          if (pageType == 'results') {
            if (markerElementm.isCantiere == 'true')
              html = html + "<li><a href=\"javascript: openNuovaCostruzioneDetail(" + markerElementm.idItem + ");\">" + markerElementm.description + "</a></li>";
            else
              html = html + "<li><a href=\"javascript: openImmobileDetail(" + markerElementm.idItem + ");\">" + markerElementm.description + "</a></li>";
          }
        }
      }
      html = html + "</ul></div>";
      marker.openInfoWindowHtml(html);
    }
    else {
      if (pageType == 'home')
        window.location.href = 'Searchresults.aspx?ddlSearchZona=' + markerElement.idItem;
      else
        if (pageType == 'results') {
        if (markerElement.isCantiere == 'true')
          openNuovaCostruzioneDetail(markerElement.idItem);
        else
          openImmobileDetail(markerElement.idItem);
      }
    }
  }
  );
  
  GEvent.addListener(marker,'mouseover', function()
    {
      //marker.openInfoWindowHtml(infoWin,{maxWidth:300});
      marker.visited = true;
//      if( pageType == 'results' )
//      {
//        if( markerElement.fromSearch == 'true' )
//          marker.setImage(_markerGIcons["defaultIconRollover"].image);  
//        else
//          marker.setImage(_markerGIcons["iconNotFromSearchRollover"].image);
//      } 
//      else if( pageType == 'home' )
//      {
//        marker.setImage(_markerGIcons["defaultIconRollover"].image);  
//      }
      
      if( pageType == 'results' )
      {
        if( markerElement.fromSearch == 'true' )
        {
          if( markerElement.isCantiere != 'true' )
            marker.setImage(_markerGIcons["markerCasaRollover"].image);
          else
            marker.setImage(_markerGIcons["markerCantiere"].image);
          
        }
        else
        {
          if( markerElement.isCantiere != 'true' )
            marker.setImage(_markerGIcons["markerCasaNotFromSearch"].image);
          else
            marker.setImage(_markerGIcons["markerCantiereNotFromSearch"].image);
        }
//        if( markerElement.fromSearch == 'true' && markerElement.isCantiere != 'true' )
//        {
//          marker.setImage(_markerGIcons["markerCasaRollover"].image);
//        }
//        else if( markerElement.fromSearch == 'true' && markerElement.isCantiere == 'true' )
//        {
//          marker.setImage(_markerGIcons["markerCantiere"].image);
//        }
//        else
//          marker.setImage(_markerGIcons["markerCasaNotFromSearch"].image);
      }
      else if( pageType == 'home' )
      {
        marker.setImage(_markerGIcons["defaultIconRollover"].image);
      }
      
      /*&& markerElement.fromSearch == 'true' ) || pageType == 'home' )
        marker.setImage(_markerGIcons["defaultIconRollover"].image);  
      else
        marker.setImage(_markerGIcons["iconNotFromSearchRollover"].image);*/
    }
  );
  
  GEvent.addListener(marker,'mouseout', function()
    {
      if( pageType == 'results' )
      {
        if( markerElement.fromSearch == 'true' )
        {
          if( markerElement.isCantiere != 'true' )
            marker.setImage(_markerGIcons["markerCasa"].image);
          else
            marker.setImage(_markerGIcons["markerCantiere"].image);
          
        }
        else
        {
          if( markerElement.isCantiere != 'true' )
            marker.setImage(_markerGIcons["markerCasaNotFromSearch"].image);
          else
            marker.setImage(_markerGIcons["markerCantiereNotFromSearch"].image);
        }
      }
      else if( pageType == 'home' )
      {
        marker.setImage(_markerGIcons["defaultIcon"].image);
      }
      
      
      /*if( ( pageType == 'results' && markerElement.fromSearch == 'true' && markerElement.isCantiere != 'true' ) || pageType == 'home' )
        marker.setImage(_markerGIcons["defaultIcon"].image);
      else
        if( ( pageType == 'results' && markerElement.fromSearch == 'true' && markerElement.isCantiere == 'true' ) )
          marker.setImage(_markerGIcons["cantieriIcon"].image);
        else
          marker.setImage(_markerGIcons["iconNotFromSearch"].image);*/
    }
  );
  
  
  return marker;
}


function createCustomMarker( markerElement, mapBounds, pageType, markerIndex )
{
  
  /*var point = new GLatLng(parseFloat(markerElement.latitudine), parseFloat(markerElement.longitudine));
  var icon = new GIcon();
    icon.iconSize = new GSize(21,20);   
    icon.shadowSize=new GSize(21,20);
    icon.iconAnchor=new GPoint(16,32); 
    icon.infoWindowAnchor=new GPoint(16,0);
  var marker;*/
  
  var is_ie6 = (window.external && typeof window.XMLHttpRequest == "undefined");
  var newIcon = new GIcon();

  if (markerElement.fromSearch == 'true') {
    newIcon.image = is_ie6 ? "../img/video.gif" : "../img/video.png";
  }
  else {
    newIcon.image = is_ie6 ? "../img/videoNotFromSearch.gif" : "../img/videoNotFromSearch.png";
  }
  newIcon.iconSize = new GSize(25, 28);
  newIcon.shadowSize = new GSize(59, 32);
  newIcon.iconAnchor = new GPoint(10, 10);
  newIcon.infoWindowAnchor = new GPoint(15, 5);

  var point = new GLatLng(parseFloat(markerElement.latitudine), parseFloat(markerElement.longitudine));
  var marker = new GMarker(point, { icon: newIcon, title: markerElement.description, zIndexProcess:importanceOrder });
  
  
  marker.importance = 2;
  _map.addOverlay(marker);  
  mapBounds.extend( point );




  GEvent.addListener(marker, "click", function() {
    if (markerElement.isMultiple) {
      var html = "<div class=\"divBaloonMarker\">"
      + "<div class=\"divBaloonMarkerHeader\">In questo stabile ci sono pi&ugrave; appartamenti:</div>"
      + "<ul>";
      for (var t = 0; t < markerElement.markerList.length; t++) {
        var markerElementm = markerElement.markerList[t];
        html = html + "<li><a href=\"javascript: openImmobileDetail(" + markerElementm.idItem + ");\">" + markerElementm.description + "</a></li>";
        //html = html + "<a href=\"javascript: openImmobileDetail(" + markerElementm.idItem + ");\">" + markerElementm.description + "</a><br />";
      }
      html = html + "</ul></div>";
      marker.openInfoWindowHtml(html);
    }
    else {
      openImmobileDetail(markerElement.idItem);
    }
  }
  );
  
 
  
  
  return marker;

}

function getMarkerDuplicatesByCoordinates(markersArray) {
  //alert("chiamata funzione!");
  var ids = new Array();
  for (var z = 0; z < markersArray.length; z++) {
    var markerTarget = markersArray[z];
    var duplicates = new Array();
    var duplicatesIndex = 0;
    //alert("target latidudine:" + markerTarget.latitudine);
    if (!markerTarget.deleted) {
      for (var y = 0; y < markersArray.length; y++) {
        if (markerTarget.latitudine == markersArray[y].latitudine && markerTarget.longitudine == markersArray[y].longitudine && markerTarget.idItem != markersArray[y].idItem && !markersArray[y].deleted) {
          /*alert("trovato duplicato!"
          + "\n target lat = "
          + markerTarget.latitudine
          + " \n current lat = "
          + markersArray[y].latitudine
          + "\n target lon = "
          + markerTarget.longitudine
          + " \n current lon = "
          + markersArray[y].longitudine
          + "\n target id = "
          + markerTarget.idItem
          + " \n current id = "
          + markersArray[y].idItem
          + " \n target deleted = "
          + markerTarget.deleted
          + " \n current deleted = "
          + markersArray[y].deleted
          );*/
          duplicates[duplicatesIndex] = markersArray[y];
          //duplicates[duplicatesIndex].description += " d";
          duplicatesIndex++;
          markersArray[y].deleted = true;
        }
      }
      if (duplicatesIndex != 0) {
        markerTarget.isMultiple = true;
        duplicates[duplicatesIndex] = markerTarget;
        markerTarget.markerList = duplicates;
        markersArray[z] = markerTarget;
      }
    }
  }
  
  return markersArray;
}

/*function removeFromArrayByIdItem(array, id) {
  var ret = new Array();
  y = 0;
  for (var x = 0; x < array.length; x++) {
    if (array[x].idItem != id) {
      ret[y] = array[x];
      y++;
    }
  }
  return ret;
}*/

/*
function clone(o) {
  return eval(uneval(o));
}
*/

