function createMarker(point,farbe,ort,datum,infolink) {
	var icon = new GIcon(baseIcon);
	icon.image = basis + '/img/ico/button2_' + farbe + '.png';
	var marker = new GMarker(point, {icon:icon, title:datum + ort});
	var offset = new GSize(0,0);
	elabels.push(new ELabel(point,ort,'elabel',offset,81,true));
	var ov_label = map1.addOverlay(elabels[elabels.length-1]);
  	GEvent.addListener(marker, 'click', function() {
    	marker.openInfoWindowHtml(infolink);
    });
    return marker;
}
function arrange_markers()
{
	var map_width = document.getElementById('karte').offsetWidth;
	var map_height = document.getElementById('karte').offsetHeight;
	var x_offsets = new Array();
	var y_offsets = new Array();
	for (var i = 0; i < elabels.length; i++)
	{
		x_offsets[i] = elabels[i].pixelOffset.width;
		y_offsets[i] = elabels[i].pixelOffset.height;
	}
	var x_off_old = x_offsets.copy();
	var y_off_old = y_offsets.copy();
	for (var i = 0; i < elabels.length; i++)
	{
		var gPoint = map1.fromLatLngToContainerPixel(dots[i]);
		if (gPoint.x + elabels[i].getWidth() > map_width && gPoint.x < map_width )
		{
			x_offsets[i] += map_width-gPoint.x-elabels[i].getWidth();
		}
		if (gPoint.x < 0 && gPoint.x + elabels[i].getWidth() >= 0 )
		{
			x_offsets[i] += (-1)*gPoint.x;
		}
		if (gPoint.y - elabels[i].getHeight() < 0 && (gPoint.y >= 0 || gPoint.y > -15 && i == 0) )
		{
			y_offsets[i] -= gPoint.y-elabels[i].getHeight();
		}
		label_pos.push(new Array(gPoint.x+x_offsets[i],
			gPoint.y+y_offsets[i]-elabels[i].getHeight(),
			gPoint.x+x_offsets[i]+elabels[i].getWidth(),
			gPoint.y+y_offsets[i]));
	}
	if ( elabels.length < 50 )
	{
		for ( d = 0; d < 3; d++ )
		{
			var overlaps = new Array();
			var set = new Array();
			var next_set = 0;
			var has_overlap = false;
			for (var i = 0; i < elabels.length; i++)
			{
				overlaps[i] = new Array();
				for (var j = 0; j < elabels.length; j++)
				{
					if ( i != j && 
					   !(label_pos[i][0] > label_pos[j][2] ||
						 label_pos[i][2] < label_pos[j][0] ||
						 label_pos[i][1] > label_pos[j][3] ||
						 label_pos[i][3] < label_pos[j][1]) )
					{
						if ( typeof(set[i]) == 'undefined' &&
							 typeof(set[j]) == 'undefined' )
						{
							set[i] = next_set;
							set[j] = next_set;
							next_set++;
						} else if ( typeof(set[i]) == 'undefined' ) {
							set[i] = set[j];
						} else if ( typeof(set[j]) == 'undefined' ) {
							set[j] = set[i];
						} else {
							var unset = set[i];
							for (var k = 0; k < elabels.length; k++)
							{
								if ( !(typeof(set[k]) == 'undefined') )
								{
									if ( set[k] == unset ) set[k] = set[j];
								}
							}
						}
						overlaps[i].push(j);
						has_overlap = true;
					}
				}
			}
			if ( has_overlap )
			{
				var over_sets = new Array();
				var sets = new Array();
				for (i = 0; i < elabels.length; i++)
				{
					if ( !(typeof(set[i]) == 'undefined') )
					{
						if ( typeof(over_sets[set[i]]) == 'undefined' ) over_sets[set[i]] = new Array();
						over_sets[set[i]].push(i);
						if ( !(sets.contains(set[i])) ) sets.push(set[i]);
					}
				}
				// if ( d > 0 ) alert(over_sets.join("\n"));
				for ( var set_nr=0; set_nr < sets.length; set_nr++ )
				{
					var all = over_sets[sets[set_nr]];
					if ( d == 0 )
					{
						for ( j=0; j <= 1; j++ )
						{
							for ( k=0; k < all.length; k++ )
							{
								i = all[k];
								var gPoint = map1.fromLatLngToContainerPixel(dots[i]);
								if ( x_offsets[i] != x_off_old[i] || y_offsets[i] != y_off_old[i] )
								{
									var changed = false;
									for ( var x_switch = 0; x_switch <= 1; x_switch++ )
									{
										for ( var y_switch = 0; y_switch <= 1; y_switch++ )
										{
											if ( !changed )
											{
												var x_change = (-1)*x_switch*elabels[i].getWidth()-x_offsets[i]-x_off_old[i];
												var y_change = y_switch*elabels[i].getHeight()-y_offsets[i]-y_off_old[i];
												if ( !test_overlap(i,x_change,y_change,map_width,map_height) )
												{
													changed = true;
													var x_offset = (-1) * x_switch*elabels[i].getWidth();
													var y_offset = y_switch*elabels[i].getHeight();
													label_pos[i][0] = gPoint.x + x_offset;
													label_pos[i][2] = gPoint.x + elabels[i].getWidth() + x_offset;
													label_pos[i][1] = gPoint.y - elabels[i].getHeight() + y_offset;
													label_pos[i][3] = gPoint.y + y_offset;
													x_offsets[i] = x_offset;
													y_offsets[i] = y_offset;
												}
											}
										}
									}
								}
							}
						}
					} else if ( d == 1 ) {
						all.sort(x_sort);
						current = all[0];
						x_change = (-1)*elabels[current].getWidth();
						if ( x_offsets[current] >= 0 && !test_overlap(current,x_change,0,0,0) )
						{
							// alert(x_change +', '+ label_pos[current][0]);
							//x_change = (-1)*Math.min(label_pos[current][0]-elabels[current].getWidth(),
							//	elabels[current].getWidth());
							x_offsets[current] += x_change;
							label_pos[current][0] += x_change;
							label_pos[current][2] += x_change;
						}
					} else {
						all.sort(y_sort);
						var top=label_pos[all[0]][1];
						var bottom=label_pos[all[0]][1];
						var height=0;
						var anz=0;
						for ( i=0; i < all.length; i++ )
						{
							current = all[i];
							if ( i == all.length-1 ||
								 // Wenn zwei Label-Nachbarn exakt gleich gross sind, nicht auseinanderziehen
								 label_pos[current][0] != label_pos[all[i+1]][0] ||
								 label_pos[current][1] != label_pos[all[i+1]][1] ||
								 label_pos[current][2] != label_pos[all[i+1]][2] ||
								 label_pos[current][3] != label_pos[all[i+1]][3] )
							{
								if ( i < all.length-1 ) height += elabels[current].getHeight();
								if ( label_pos[current][1] < top ) top=label_pos[current][1];
								if ( label_pos[current][3] > bottom ) bottom=label_pos[current][1];
								anz++;
							}
						}
						var stretch = height-Math.round(Math.min(bottom-top,document.getElementById('karte').offsetHeight/4	));
						var y = top - Math.ceil(stretch/2 - elabels[current].getHeight());
						var current = 0;
						var y_change = 0;
						for ( i=0; i < all.length; i++ )
						{
							current = all[i];
							y_change = y - label_pos[current][1];
							if ( i == all.length-1 ||
								 // Wenn zwei Label-Nachbarn exakt gleich gross sind, nicht auseinanderziehen
								 label_pos[current][0] != label_pos[all[i+1]][0] ||
								 label_pos[current][1] != label_pos[all[i+1]][1] ||
								 label_pos[current][2] != label_pos[all[i+1]][2] ||
								 label_pos[current][3] != label_pos[all[i+1]][3] )
							{
								y += Math.min(elabels[current].getHeight(),
									Math.round(height/anz)+elabels[all.length-1].getHeight());
							}
							y_offsets[current] += y_change;
							label_pos[current][1] += y_change;
							label_pos[current][3] += y_change;
						}
					}
				}
			}
		}
	}
	for ( j=0; j <= 1; j++ )
	{
		for ( i=0; i < elabels.length; i++ )
		{
			var gPoint = map1.fromLatLngToContainerPixel(dots[i]);
			if ( x_offsets[i] != x_off_old[i] || y_offsets[i] != y_off_old[i] )
			{
				var changed = false;
				for ( var x_switch = 0; x_switch <= 1; x_switch++ )
				{
					for ( var y_switch = 0; y_switch <= 1; y_switch++ )
					{
						if ( !changed )
						{
							var x_change = (-1)*x_switch*elabels[i].getWidth()-x_offsets[i]-x_off_old[i];
							var y_change = y_switch*elabels[i].getHeight()-y_offsets[i]-y_off_old[i];
							if ( !test_overlap(i,x_change,y_change,map_width,map_height) )
							{
								changed = true;
								var x_offset = (-1) * x_switch*elabels[i].getWidth();
								var y_offset = y_switch*elabels[i].getHeight();
								label_pos[i][0] = gPoint.x + x_offset;
								label_pos[i][2] = gPoint.x + elabels[i].getWidth() + x_offset;
								label_pos[i][1] = gPoint.y - elabels[i].getHeight() + y_offset;
								label_pos[i][3] = gPoint.y + y_offset;
								x_offsets[i] = x_offset;
								y_offsets[i] = y_offset;
							}
						}
					}
				}
			}
		}
	}
	for (i = 0; i < elabels.length; i++)
	{
		if ( x_offsets[i] != x_off_old[i] || y_offsets[i] != y_off_old[i] )
		{
			map1.removeOverlay(elabels[i]);
			elabels[i].pixelOffset=new GSize(x_offsets[i],y_offsets[i]);
			map1.addOverlay(elabels[i]);
		}
	}
}
function test_overlap(current,x_offset,y_offset,map_width,map_height) {
	for (var j = 0; j < elabels.length; j++)
	{
		if ( current != j && 
		   !(label_pos[current][0]+x_offset > label_pos[j][2] ||
			 label_pos[current][2]+x_offset < label_pos[j][0] ||
			 label_pos[current][1]+y_offset > label_pos[j][3] ||
			 label_pos[current][3]+y_offset < label_pos[j][1]) )
		{
			return true;
		}
	}
	if ( map_width > 0 )
	{
		if ( label_pos[current][0]+x_offset < 0 ) return true;
		if ( label_pos[current][2]+x_offset > map_width ) return true;
		if ( label_pos[current][1]+y_offset < 0 ) return true;
		if ( label_pos[current][3]+y_offset > map_height ) return true;
	}
}
function reset_offsets()
{
	// alert(elabels.length);
	if ( elabels.length < 50 )
	{
		label_pos = new Array();
		for (i = 0; i < elabels.length; i++)
		{
			var gPoint = map1.fromLatLngToContainerPixel(dots[i]);
			label_pos.push(new Array(gPoint.x,
				gPoint.y-elabels[elabels.length-1].getHeight(),
				gPoint.x+elabels[elabels.length-1].getWidth(),
				gPoint.y));
			var x_offset = elabels[i].pixelOffset.width;
			var y_offset = elabels[i].pixelOffset.height;
			if ( x_offset != 0 || y_offset != 0 )
			{
				map1.removeOverlay(elabels[i]);
				elabels[i].pixelOffset=new GSize(0,0);
				map1.addOverlay(elabels[i]);
			}
		}
		arrange_markers();
	}
}
Array.prototype.copy = function () {
	return ((new Array()).concat(this));
};
Array.prototype.contains = function(obj) {
  var i, listed = false;
  for (i=0; i<this.length; i++) {
    if (this[i] === obj) {
      listed = true;
      break;
    }
  }
  return listed;
};
function y_sort(a,b)
{
	return (label_pos[a][1]-label_pos[b][1]);
}
function x_sort(a,b)
{
	return (label_pos[a][2]-label_pos[b][2]);
}
function rei_map_init(hoehe) {
 if (GBrowserIsCompatible()) {
	var map_img = document.getElementById('map_img');
	karte.removeChild(map_img);
	karte.style.height = hoehe + 'px';
	G_NORMAL_MAP.getTileLayers()[0].getOpacity = function () {return 0.9;};
	G_SATELLITE_MAP.getTileLayers()[0].getOpacity = function () {return 1;};
	G_HYBRID_MAP.getTileLayers()[0].getOpacity = function () {return 1;};
	G_HYBRID_MAP.getTileLayers()[1].getOpacity = function () {return 1;};		
	map1 = new GMap2(karte);
	karte.style.backgroundColor='#000000';

	map1.addControl(new GMapTypeControl());
	map1.addControl(new GSmallZoomControl());

	baseIcon.shadow = basis + '/img/ico/button2_bg.png';
	baseIcon.iconSize = new GSize(12, 12);
	baseIcon.shadowSize = new GSize(12, 12);
	baseIcon.infoWindowAnchor = new GPoint(9, 2);
	baseIcon.infoShadowAnchor = new GPoint(18, 25);
	baseIcon.iconAnchor = new GPoint(6, 6);
 }
}
function add_route() {
 map1.addOverlay(new GPolyline.fromEncoded({
	color: "#FFFFFF",
	weight: 2,
	opacity: 1,
	points: encodedPoints,
	levels: encodedLevels,
	zoomFactor: 2,
	numLevels: 18,
	clickable: false}));
}