var map;
var mgr;
var currentSymbols;
var currentSymbolClusters;
var currentTransportations;
var currentGuides;
var currentPdfMaps;
var geocoder;
var showTransportations = false;
var showGuides = true;

var isUpdatingMap = false;
var doUpdateAgain = false;
var isDirectionViewVisible=false;

var isStartPage=true;

var layers = [];
layers[0] = new GLayer("org.wikipedia." + lang);
layers[1] = new GLayer("com.panoramio.all");
layers[2] = new GLayer("com.google.webcams");
layers[3] = new GLayer("com.youtube.all");

layers[0].Visible = false;
layers[0].Added = false;
layers[1].Visible = false;
layers[1].Added = false;
layers[2].Visible = false;
layers[2].Added = false;
layers[3].Visible = false;
layers[3].Added = false;

function toggleTransportation(inputTag) {

  if(!inputTag.checked) {
    showTransportations = false;
  } else {
    showTransportations = true;
  }
  redrawMarkers();
}

function toggleGuides(inputTag) {

  if(!inputTag.checked) {
    showGuides = false;
  } else {
    showGuides = true;
  }
  redrawMarkers();
}



function toggleLayer(i, inputTag) {

  if(!inputTag.checked) {
    // hide
    layers[i].hide();
  } else {
    if(layers[i].Added) {
      layers[i].show();
    } else {
      map.addOverlay(layers[i]);
      layers[i].Added = true;
    }
  }
  layers[i].Visible = inputTag.checked;

}

function panTo(a, b) {
  var ab = new GLatLng(a, b);
  map.panTo(ab);
}

function mapZoom(level) {
  if(map.getZoom() != level) {
    map.setZoom(level);
  }
}

function mapMoved() {

    jQuery("#map-overlay").hide();


	if(isDirectionViewVisible){
		return;
	}

  if(isUpdatingMap == false) {

      isUpdatingMap = true;
      doUpdateAgain = false;

      var bounds = map.getBounds();
      var center = map.getCenter();

      jQuery('#adminInfo').html("center: " + map.getCenter());

      updateWeather();

      _gaq.push(['_trackEvent', 'Map', 'Moved', 'StartPage', map.getZoom()]);
      updateSymbols();
  } else {
      doUpdateAgain = true;
  }

  document.location.hash = "lat:" + map.getCenter().lat() + "|lng:" + map.getCenter().lng() + "|z:" + map.getZoom(); 

}

function updateWeather() {
    var bounds = map.getBounds();
    var center = map.getCenter();
    jQuery.get('/place/ajaxWeather',
      {
        maxLat: bounds.getNorthEast().lat(),
        minLat: bounds.getSouthWest().lat(),
        maxLng: bounds.getNorthEast().lng(),
        minLng: bounds.getSouthWest().lng(),
        centerLat: center.lat(),
        centerLng: center.lng()
      },
      function(data) {
        jQuery("#weather-box").html(data);
      }
    );
}


function updateSymbols() {
	if(isDirectionViewVisible){
		return
	}

  var bounds = map.getBounds();
  var center = map.getCenter();

  var symbolCategoryIds = getSelectedCategories();

  jQuery.getJSON('/place/mapData',
    {
      maxLat: bounds.getNorthEast().lat(),
      minLat: bounds.getSouthWest().lat(),
      maxLng: bounds.getNorthEast().lng(),
      minLng: bounds.getSouthWest().lng(),
      centerLat: center.lat(),
      centerLng: center.lng(),
      zoom: map.getZoom(),
      symbolCategoryIds: symbolCategoryIds
    }
    ,
    function(data) {

      jQuery("#accomodationsContent").html("<ul></ul>");
      jQuery.each(data.accomodations, function(index, accomodation) {
        jQuery("#accomodationsContent ul").append("<li><nobr><a href='javascript:;' onclick='mapZoom(11); panTo(" + accomodation.latitude + ", " + accomodation.longitude + ");'>" + shorten(accomodation.name, 18) + "</a></nobr></li>");
      });

      // Update categories info
      jQuery(".symbolCategoryCount").html("(0)");

      // hide all with 0
      jQuery(".symbolCategoryLabel").hide();

      jQuery.each(data.symbolCategoriesKeys, function(index, symbolCategory) {
        jQuery("#symbolCategoryCount_" + symbolCategory).html("(" + data.symbolCategoriesValues[index] + ")");

        if(parseInt(data.symbolCategoriesValues[index]) > 0) {
            jQuery("#symbolCategoryLabel_" + symbolCategory).show();
        }

      });

      currentSymbols = data.symbols;

        if(data['guides'] != null) {
          currentGuides = data.guides;
        } else {
          currentGuides = [];
        }

        if(data['pdfMaps'] != null) {
          currentPdfMaps = data.pdfMaps;
        } else {
          currentPdfMaps = [];
        }

      currentSymbolClusters = data.symbolClusters;
      redrawMarkers();

      //

      isUpdatingMap = false;
      if(doUpdateAgain) {
          mapMoved();
      }
        
    }
  );



    jQuery.getJSON('/place/mapExtraData',
      {
        maxLat: bounds.getNorthEast().lat(),
        minLat: bounds.getSouthWest().lat(),
        maxLng: bounds.getNorthEast().lng(),
        minLng: bounds.getSouthWest().lng(),
        centerLat: center.lat(),
        centerLng: center.lng(),
        zoom: map.getZoom(),
        symbolCategoryIds: symbolCategoryIds
      }
      ,
      function(data) {

        jQuery("#citiesContent").html("<ul></ul>");
        jQuery.each(data.cities, function(index, city) {
          jQuery("#citiesContent ul").append("<li><a href='javascript:;' onclick='mapZoom(9); panTo(" + city.latitude + ", " + city.longitude + ");'>" + city.name + "</a></li>");
        });

        jQuery("#regionsContent").html("<ul></ul>");
        jQuery.each(data.regions, function(index, region) {
          jQuery("#regionsContent ul").append("<li><a href='javascript:;' onclick='mapZoom(6); panTo(" + region.latitude + ", " + region.longitude + ");'>" + region.name + "</a></li>");
        });

        if(data['transportations'] != null) {

          jQuery(".transport-list li").html("");
          var importantTransporations = getFirstOfEachTransportation(data['transportations']);

          jQuery.each(importantTransporations, function(index, transportation) {

            var newHtml = "<a href='javascript:;' onclick='panTo(" + transportation.latitude + ", " + transportation.longitude + ");'>" + transportation.name + "</a><br/>" + transportation.distance + " km";

            if(transportation.featureCode == 'RSTN') {
              jQuery("#transportRail").html(newHtml);
            } else if(transportation.featureCode == 'PRT') {
              jQuery("#transportPort").html(newHtml);
            } else if(transportation.featureCode == 'AIRP') {
              jQuery("#transportAir").html(newHtml);
            }

          });

        } else {
          jQuery(".transport-list li").html("");
          jQuery("#transportPort").html(msgs['start.zoomForTransport']);
        }
        if(data['transportations'] != null) {
          currentTransportations = data.transportations;
        } else {
          currentTransportations = [];
        }

          // Update banner

        if(data['country'] != undefined && data['region'] != undefined) {
            var rnd = Math.floor(Math.random()*99999999999);
            var adsrc = "/ad/show?zone=StartPage250x360&rnd=" + rnd;
            adsrc += "&language=" + lang + "&country=" + data['country'] + "&region=" + data['region'];
            jQuery.each(getSelectedCategories(), function(idx, elem) { adsrc += "&category=" + categoryNames[elem] });
            jQuery(".start-ad-left iframe").attr("src", adsrc);
        }

        //

      }
    );








}

function redrawMarkers() {

  var batch = [];
  mgr.clearMarkers();

  if(showTransportations) {
      createTransporationSymbols(batch);
  }
  createSymbols(batch);

  if(showGuides) {
      createGuidesAndPdfMaps(batch);
//      createPdfMaps(batch);
  }

  createSymbolClusters(batch);

  mgr.addMarkers(batch, 0);
	if(!isDirectionViewVisible){
		mgr.refresh();
	}

}

function createTransporationSymbols(batchToAddTo) {

  jQuery.each(currentTransportations, function(index, place) {

    var icon = new GIcon(G_DEFAULT_ICON);

    if(place.featureCode == 'RSTN') {
      icon.image = '/images/symbol-categories-2/transport_train.png';
    } else if(place.featureCode == 'AIRP') {
      icon.image = '/images/symbol-categories-2/transport_air.png';
    } else if(place.featureCode == 'PRT') {
      icon.image = '/images/symbol-categories-2/transport_boat.png';
    }

    icon.iconSize = new GSize(29, 36);
    icon.iconAnchor = new GPoint(11, 36);
    icon.shadow = "";
    var opts = {
      icon: icon,
      title: place.name,
      zIndexProcess: function(m, x) {
        return m.getPoint().lat() - 1000;
      }
    };
    var latlng = new GLatLng(place.latitude, place.longitude);
    var marker = new GMarker(latlng, opts);
    GEvent.addListener(marker, "click", function() {
      var myHtml = "<b>" + place.name + "</b>";
      map.openInfoWindowHtml(latlng, myHtml);
    });
    batchToAddTo.push(marker);
  });
}

function zoomTo(latitude, longitude) {
  var zoomToLevel = map.getZoom() + 1;
  if(zoomToLevel < 8) zoomToLevel = 8;
  map.closeInfoWindow();
  map.setCenter(new GLatLng(latitude, longitude), zoomToLevel);
}

function createSymbols(batchToAddTo) {

  // Create symbols
  jQuery.each(currentSymbols, function(index, symbol) {

    var createdMarker = createSymbolMarker(symbol, true, getSelectedCategories());
    batchToAddTo.push(createdMarker);

  });

}

function createGuidesAndPdfMaps(batchToAddTo) {
	// Create symbols
	var commonObj=[];
  createGuides(batchToAddTo, commonObj);
  createPdfMaps(batchToAddTo, commonObj);
}

function createGuides(batchToAddTo, commonObj) {
  jQuery.each(currentGuides, function(index, guide) {
    var pdfObj=currentPdfMaps.find(function(obj){return obj.latitude==guide.latitude && obj.longitude==guide.longitude })
    if(pdfObj){commonObj.push(pdfObj);}
    var showAddToSuitCaseLink=true;
    createGuide(batchToAddTo, guide, true, pdfObj);
  });
}

function createPdfMaps(batchToAddTo, commonObj) {
  jQuery.each(currentPdfMaps, function(index, pdfMap) {
    var pdfObj=commonObj.find(function(obj){return obj.latitude==pdfMap.latitude && obj.longitude==pdfMap.longitude })
    if(!pdfObj){
      var showAddToSuitCaseLink=false;
      createGuide(batchToAddTo, pdfMap, false);
    }
  });
}

/*
function createPdfMaps(batchToAddTo) {
      // Create pdfMaps
      jQuery.each(currentPdfMaps, function(index, pdfMap) {
				var showAddToSuitCaseLink=false;
				createGuide(batchToAddTo, showAddToSuitCaseLink, pdfMap, 'start.pdfMap');
      });
}
*/

function createGuide(batchToAddTo, guide, isGuideObject, pdfObj) {
	var toolTipCaptionKey=isGuideObject?msgs['start.guide']:msgs['start.pdfMap'];

	var icon = new GIcon(G_DEFAULT_ICON);
	icon.image = '/images/information/information.png';
	icon.iconSize = new GSize(29, 36);
	icon.iconAnchor = new GPoint(12, 36);
	icon.shadow = "";
	var opts = {
		icon: icon,
		zIndexProcess: function(m, x) {
//          return parseFloat(m.getPoint().lat()*10 - 500);
				return 300;
		}
	};
	var latlng = new GLatLng(guide.latitude, guide.longitude);
	var marker = new GMarker(latlng, opts);

	marker.tooltip = '<div class="tooltip"><b>' + toolTipCaptionKey + ':</b> ' + guide.name + '</div>';

	GEvent.addListener(marker,"mouseover", function() {
			_gaq.push(['_trackEvent', 'Map', 'Tooltip', 'Guide: ' + guide.name]);
			showTooltip(marker);
	});
	GEvent.addListener(marker,"mouseout", function() {
					tooltip.style.visibility="hidden"
	});

	GEvent.addListener(marker, "click", function() {
		var myHtml = "<b>" + guide.name + "</b><br/>";

		jQuery.each(guide.languages, function(languageIndex, language) {
				myHtml += "<a target='_blank' href='/guide/download?id=" + guide.languageIds[languageIndex] + "'>" + msgs['download'] + " (" + language + ")</a><br/>";
			if (isGuideObject) {
				myHtml += "<a href='javascript:;' onclick='addToSuitCase(" + guide.languageIds[languageIndex] + ");'>" + msgs['addToSuitCase'] + " (" + language + ")</a> ";
			}else{
				myHtml += "<a href='javascript:;' onclick='showFormDialogInFancyBox(" + guide.languageIds[languageIndex] + ");'>" + msgs["map.order"]+"</a>";
			}
			myHtml+="<br/>";
		});

		if(pdfObj){
			myHtml+="<br/><strong>"+pdfObj.name+"</strong><br/>"
			jQuery.each(pdfObj.languages, function(languageIndex, language) {
				myHtml += "<a target='_blank' href='/guide/download?id=" + pdfObj.languageIds[languageIndex] + "'>" + msgs['download'] + " (" + language + ")</a> ";
				myHtml += "<a href='javascript:;' onclick='showFormDialogInFancyBox(" + pdfObj.languageIds[languageIndex] + ");'>" + msgs["map.order"]+"</a><br/> ";
			});
		}
		map.openInfoWindowHtml(latlng, myHtml);
	});

	batchToAddTo.push(marker);

}


function addToSuitCase(id) {

    jQuery.post('/guide/ajaxAddToSuitCase', {id: id},
      function(data) {
          updateSuitCase()
      }, 'json'
    );

}

function updateSuitCase() {

    jQuery.get('/guide/ajaxShowSuitCase',
      {
          rnd: Math.random()
      },
      function(data) {
        jQuery("#suitcase").html(data);
      }
    );

}

function removeFromSuitCase(id) {

    jQuery.post('/guide/ajaxRemoveFromSuitCase', {id: id},
      function(data) {
          updateSuitCase();
      }, 'json'
    );

}




function createSymbolClusters(batchToAddTo) {
  // Create symbols
  jQuery.each(currentSymbolClusters, function(index, cluster) {

    var icon = new GIcon(G_DEFAULT_ICON);
/*
      icon.iconSize = new GSize(13, 13);
      icon.iconAnchor = new GPoint(7, 7);
      icon.image = '/images/dot13redcluster.gif';
*/

      if(map.getZoom() >= 8) {
/*        icon.iconSize = new GSize(31, 39);
          icon.iconAnchor = new GPoint(15, 39);
          icon.image = '/images/symbol-categories-2/multi.png';
          */
          icon.iconSize = new GSize(25, 33);
          icon.iconAnchor = new GPoint(12, 33);
          icon.image = '/images/symbol-categories-2/multi3.png';
      } else {
          icon.image = '/images/dots/dot2_multi.png';
          icon.iconSize = new GSize(10, 9);
          icon.iconAnchor = new GPoint(5, 5);
      }

      icon.shadow = "";

    var opts = {
      "icon": icon,
      zIndexProcess: function(m, x) {
//        return parseFloat(m.getPoint().lat()*10 + 1000);
          return 500;
      }
    };

    var latlng = new GLatLng(cluster.latitude, cluster.longitude);
    var marker = new GMarker(latlng, opts);

    marker.tooltip = '<div class="tooltip">' + cluster.numberOfSymbols + ' ' + msgs['map.pois'] + '</div>';

    GEvent.addListener(marker,"mouseover", function() {
        _gaq.push(['_trackEvent', 'Map', 'Tooltip', 'Cluster']);
        showTooltip(marker);
    });
    GEvent.addListener(marker,"mouseout", function() {      
            tooltip.style.visibility="hidden"
    });


    GEvent.addListener(marker, "click", function() {
      var myHtml = cluster.description;
      myHtml += "<br/><a href='javascript:;' onclick='zoomTo(" + cluster.latitude + ", " + cluster.longitude + ")'>" + msgs['map.tooltip.zoom'] + "</a>";
      map.openInfoWindowHtml(latlng, myHtml);
    });

    batchToAddTo.push(marker);

  });

}

function getFirstOfEachTransportation(transportations) {

  var result = new Array();
  jQuery.each(transportations, function(index, transportation) {
    if(transportation.featureCode == 'RSTN') {
      if(result[0] == undefined) {
        result[0] = transportation;
      }
    } else if(transportation.featureCode == 'AIRP') {
      if(result[1] == undefined) {
        result[1] = transportation;
      }
    } else if(transportation.featureCode == 'PRT') {
      if(result[2] == undefined) {
        result[2] = transportation;
      }
    }
  });
  return cleanArray(result);

}

function cleanArray(actual) {
  var newArray = new Array();
  for(var i = 0; i<actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i]);
    }
  }
  return newArray;
}

function initialize() {

  if (GBrowserIsCompatible()) {

    map = new GMap2(document.getElementById("map_canvas"));
    var mapTypeControl = new GMapTypeControl();
    var topRight = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,10));
    var topLeft = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10,10));
    var topLeft2 = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10,40));
    var bottomRight = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,10));
    map.addControl(mapTypeControl, topLeft);
    map.addControl(new GLargeMapControl(), topLeft2);

    map.enableScrollWheelZoom();


    if(getStringFromHash("lat") === undefined) {
        map.setCenter(new GLatLng(58.21702494960191, 13.974609375), 3);
    } else {
        var lat = getStringFromHash("lat");
        var lng = getStringFromHash("lng");
        var z = getStringFromHash("z");

        map.setCenter(new GLatLng(parseFloat(lat), parseFloat(lng)), parseInt(z));
    }

    mgr = new MarkerManager(map);

    // ====== Restricting the range of Zoom Levels =====
    // Get the list of map types
    var mt = map.getMapTypes();
    // Overwrite the getMinimumResolution() and getMaximumResolution() methods
    for (var i=0; i<mt.length; i++) {
      mt[i].getMinimumResolution = function() {return 3;}
      mt[i].getMaximumResolution = function() {return 20;}
    }

    GEvent.addListener(map, "moveend", mapMoved);

    geocoder = new GClientGeocoder();

    // ====== set up marker mouseover tooltip div ======
    tooltip = document.createElement("div");
    document.getElementById("map_canvas").appendChild(tooltip);
    tooltip.style.visibility="hidden";

    //

    if(getStringFromHash("query") != undefined) {
        jQuery("#global-search input").attr("value", getStringFromHash("query"));
        search(getStringFromHash("query")); // will invoke mapMoved()
    } else {
        // mapMoved();
        updateWeather();
        // load banner
        var rnd = Math.floor(Math.random()*99999999999);
        var adsrc = "/ad/show?zone=StartPage250x360&rnd=" + rnd;
        jQuery(".start-ad-left iframe").attr("src", adsrc);
    }

  }

  jQuery(".symbolCategorySelect").change(function (x) {
    updateSymbols();
  });

  updateSuitCase();
}

function getStringFromHash(name) {

    var h = document.location.hash;

    if(h.indexOf(name) != -1) {
        var x = h.substring(h.indexOf(name));
        if(x.indexOf('|') != -1) {
            x = x.substring(name.length + 1, x.indexOf('|'))
        } else {
            x = x.substring(name.length + 1)
        }

        return x;
    } else {
        return undefined;
    }


}


var searchPin;



function getSelectedCategories() {
  selectedCategories = [];
  jQuery(".symbolCategorySelect").each( function(index, elem) {
    if(elem.checked){
      selectedCategories.push(elem.id.substring(elem.id.indexOf('_') + 1));
    }
  });
  return selectedCategories;
}


function shorten(x, len) {
  if(x.length > len) {
    return x.substring(0, (len - 1)) + "..";
  }
  return x;
}



