var map;
var gdir;
var directionsPanel;
var geocoder = null;
var addressMarker;

var mgr;
var icons = {};
var allmarkers = new Object();

var points = new Array();
var routeMarkers = [];
var green_icons = new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');

function initialize() {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("map_canvas"));
		map.addControl(new GSmallMapControl());
		map.setCenter(new GLatLng(47.498403, 19.040759), 13);
		//map.enableScrollWheelZoom();
		
		mgr = new MarkerManager(map, {trackMarkers:true});		
		$('input:checkbox').each( function() {
			if (this.checked) setupMarkers(this.value);
		});
		
		directionsPanel = document.getElementById("route");
		if (directionsPanel) gdir = new GDirections(map, directionsPanel);
		GEvent.addListener(gdir, "error", handleErrors);
	}
}

function addDirection() {
	if (points.length>=2) {
		var dirPoints = [];
		for (var i in points) {
			dirPoints.push(points[i].latlng);
		}
		gdir.loadFromWaypoints(dirPoints,{travelMode: G_TRAVEL_MODE_DRIVING});
		$("#route").show();
	}
}

function clearDirection() {
	gdir.clear();
	$("#route").hide();
}

function refreshPoints() {
	var points_html = '';
	points_html = '<table style="margin: 2px 5px;">';
	for (var i in points) {
		points_html += '<tr>'+
			'<td style="padding: 4px 15px 0pt 5px; vertical-align: middle; width: 20px;">'+
			'<img src="http://maps.google.com/intl/hu_ALL/mapfiles/icon_green'+green_icons[i]+'.png"/>'+
			'</td>'+
			'<td style="vertical-align: middle; width: 100%;">'+points[i].title+(points[i].address!='' ? '<br />('+points[i].address+')' : '')+'</td>'+
			'<td style="vertical-align: middle; width: 20px;"><a href="javascript:void(0)" onclick="removePoint('+i+');"><img src="/img/delmap.gif" border="0" /></td>'+
			'</tr>';
	}
	points_html += '</table>';
	$("#points").html(points_html);
 	if (points.length>=1) $("#directions_div").show();
 	else $("#directions_div").hide();
 	if (points.length>=2) $("#planButton").show();
 	else $("#planButton").hide();
 	clearDirection();
}

function removePoint(i) {
	points.splice(i, 1);
	refreshPoints();
}

function addPoint(title, address, lat, lng) {
	map.closeInfoWindow();
	var point = new Object();
	point.latlng = new GLatLng(lat, lng);
	point.title = title;
	point.address = address;
  points.push(point);
  refreshPoints();
}

function getIcon(images) {
  var icon = null;
  if (images) {
    if (icons[images[0]]) {
      icon = icons[images[0]];
    } else {
      icon = new GIcon();
      icon.image = '/write/services/'+images[0]+'.png';
      var size = iconData[images[0]];
      icon.iconSize = new GSize(size.width, size.height);
      icon.iconAnchor = new GPoint(size.width/2-9, size.height);
      icon.infoWindowAnchor = new GPoint(size.width/2-9, 1);
      icons[images[0]] = icon;
    }
  }
  return icon;
}

function changeGroup(group_id) {
	if ($('#group_'+group_id).attr('checked')) {
		setupMarkers(group_id);
	} else {
		clearMarkers(group_id);
	}
}

function setupMarkers(group_id) {
	eval('var groupLayer = group_'+group_id+';');
	eval('allmarkers.group_'+group_id+' = [];');
  allmarkers.length = 0;
  for (var i in groupLayer) {
    var layer = groupLayer[i];
    var markers = [];
   
    for (var j in layer["places"]) {
      var place = layer["places"][j];
      var icon = getIcon(place["icon"]);
      var title = place["name"];
      var id = place["id"];
      var virtlink = place["virtlink"]+'#'+place["id"];
      var address = place["address"];
      var phone = place["phone"];
      var url = place["url"];
      var posn = new GLatLng(place["posn"][0], place["posn"][1]);
      var marker = createMarker(posn, id, title, virtlink, icon, address, phone, url); 
      markers.push(marker);
      if (id==aktId) {
      	map.setCenter(posn, 13);
      	aktGroupId = group_id;
      	aktMarkerId = markers.length-1;
      	aktMarkerContent = getInfoWindowContent(title, virtlink, address, phone, url, posn.lat(), posn.lng());
      }
      eval('allmarkers.group_'+group_id+'.push(marker);');
    }
    mgr.addMarkers(markers, layer["zoom"][0], layer["zoom"][1]);
  }
  mgr.refresh();
  setTimeout('showMarkerInfoWindow()', 0);
}

function showMarkerInfoWindow() {
	eval('var groupMarkers = allmarkers.group_'+aktGroupId+';');
	for (var i in groupMarkers) {
		if (i==aktMarkerId) groupMarkers[i].openInfoWindow(aktMarkerContent);
	}
}

function createMarker(posn, id, title, virtlink, icon, address, phone, url) {
  var marker = new GMarker(posn, {title: title, icon: icon });
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindow(getInfoWindowContent(title, virtlink, address, phone, url, posn.lat(), posn.lng()));
	});
  return marker;
}

function getInfoWindowContent(title, virtlink, address, phone, url, lat, lng) {
	var content = '';
	content = '<div style="width: 300px; margin: 10px"><strong><a href="'+virtlink+'">'+title+'</a></strong>';
	if (address!='') content += '<br />'+address;
	if (phone!='') content += '<br />'+phone;
	if (url!='') content += '<br /><a href="'+url+'" target="_blank">'+url+'</a>';
	content += '<br /><br /><a href="javascript:void(0);" onclick="addPoint(\''+title+'\', \''+address+'\', '+lat+', '+lng+')">'+add_to_directions+'</a>';
	content += '</div>';
	return content;
}

function clearMarkers(group_id) {
	if (group_id == aktGroupId) {
		aktMarkerId = aktId = null;
	}
	eval('var groupMarkers = allmarkers.group_'+group_id+';');
	for (var i in groupMarkers) {
		mgr.removeMarker(groupMarkers[i], 0);
	}
}

function handleErrors(){
	if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
		alert(map_error_400);
	else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
		alert(map_error_500);
	else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
		alert(map_error_601);
	else if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
		alert(map_error_602);
	else if (gdir.getStatus().code == G_UNAVAILABLE_ADDRESS)
		alert(map_error_603);
	else if (gdir.getStatus().code == G_GEO_UNKNOWN_DIRECTIONS)
		alert(map_error_604);
	else if (gdir.getStatus().code == G_GEO_BAD_KEY)
		alert(map_error_610);
	else if (gdir.getStatus().code == G_GEO_TOO_MANY_QUERIES)
		alert(map_error_620);
	else
		alert(unknown_error);
}