var IE = document.all ? true : false;
var map;
var detailmap;
var dirObj;
var container;
var opacity = 1;
var clckTimeOut = null;
var loading = false;
var saveState = false;
var directionsInfoDiv;
var iw;
var polyline;
var pLine;
var dragMarker;
var pLinePoints = Array();
var midRouteMarkers = Array();
var markerDragging = false;
var typeChanging = false;
var baseIcon = new GIcon();
baseIcon.iconSize=new GSize(32,32);
baseIcon.iconAnchor=new GPoint(8,8);
baseIcon.infoWindowAnchor=new GPoint(10,0);

var yellowIcon = (new GIcon(baseIcon, "http://maps.google.com/mapfiles/ms/micons/yellow.png", null, ""));
var greenIcon = (new GIcon(baseIcon, "http://maps.google.com/mapfiles/kml/pal4/icon15.png", null, ""));
var redIcon = (new GIcon(baseIcon, "http://maps.google.com/mapfiles/kml/pal2/icon2.png", null, ""));
var orangeIcon = (new GIcon(baseIcon, "http://maps.google.com/mapfiles/ms/micons/orange.png", null, ""));
var blueIcon = (new GIcon(baseIcon, "/http://maps.google.com/mapfiles/ms/micons/blue.png", null, ""));
var violetIcon = (new GIcon(baseIcon, "http://maps.google.com/mapfiles/ms/micons/pink.png", null, ""));
var airportIcon = (new GIcon(baseIcon, "http://maps.google.com/mapfiles/kml/pal2/icon48.png", null, ""));
var iconRest = (new GIcon(baseIcon, 'http://maps.google.com/mapfiles/kml/pal2/icon40.png'));
var iconApart = (new GIcon(baseIcon, 'http://maps.google.com/mapfiles/kml/pal3/icon56.png'));
var iconBar = (new GIcon(baseIcon, 'http://maps.google.com/mapfiles/kml/pal2/icon27.png'));
var iconBeach = (new GIcon(baseIcon, 'pic/parasol_32.png'));

var baseIcon2 = new GIcon();
baseIcon2.iconSize=new GSize(8,8);
baseIcon2.iconAnchor=new GPoint(4,4);
baseIcon2.infoWindowAnchor=new GPoint(4,0);
var redIcon8 = (new GIcon(baseIcon2, "/images/redSquare_8.png", null, ""));

var customIcons = [];
    customIcons["restaurant"] = iconRest;
    customIcons["apartment"] = iconApart;
    customIcons["bar"] = iconBar;
    customIcons["beach"] = iconBeach;
    customIcons["airport"] = airportIcon;
var NormalLayer = G_NORMAL_MAP.getTileLayers()[0]
var TerrainLayer = G_PHYSICAL_MAP.getTileLayers()[0]
var SatelliteLayer = G_SATELLITE_MAP.getTileLayers()[0]
var satProj = G_SATELLITE_MAP.getProjection();	
var normalProj = G_NORMAL_MAP.getProjection();	

	
var cRight = new GCopyrightCollection('Raeber');
var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, "URaeber©2009");
cRight.addCopyright(copyright);


// Defaults --------------------------------------------
var zoom = 9;
var centerPoint = new GLatLng(38.628605, 20.606575);
var mType = 0;


var Prefectures = Array('Attica','Central Greece','Central Macedonia','Crete','East Macedonia and Thrace','Epirus','Ionian Islands','North Aegean','Peloponnese','South Aegean','Thessaly','West Greece','West Macedonia','Mount Athos')
var pattern = '(' + Prefectures.join('|') + ')';


function load() {
	doLoad();
}


function doLoad() {
	if (GBrowserIsCompatible()) {
		container = document.getElementById("mapDiv");
		resizePage();
		map = new GMap2(container);

		map.addMapType(G_PHYSICAL_MAP)
		TerrainLayer.getOpacity = function () {return opacity;};
		var layers = [NormalLayer,TerrainLayer];
		addCustomMapType("Terrain N",layers,17,0);
		map.setUIToDefault();
		directionsInfoDiv = document.getElementById("directions_info");
		dirObj = new GDirections();

		var mapState = getMapState();
		if (typeof(mapState) != 'undefined') {
			if (mapState['lat'] && mapState['lon']) {
				centerPoint = new GLatLng(parseFloat(mapState['lat']), parseFloat(mapState['lon']));
			}	
			if (mapState['z']) {
				zoom = parseInt(mapState['z']);
			}
			if (mapState['mType']) {
				mType = parseInt(mapState['mType']);

				if (mType == 4) {
					opacity = 0.4;
				}
			}

			
			if (mapState['driveFrom']) {
				var oDriveFrom = document.getElementById('driveFrom').value = mapState['driveFrom'];
			}
			if (mapState['driveTo']) {
				var oDriveFrom = document.getElementById('driveTo').value = mapState['driveTo'];
			}
			if (mapState['driveVia']) {
				var oDriveFrom = document.getElementById('driveVia').value = mapState['driveVia'];
			}
			if (mapState['locale']) {
				var oDriveFrom = document.getElementById('locale').value = mapState['locale'];
			}
		}

		map.setCenter(centerPoint, zoom, map.getMapTypes()[mType]);
		map.setMapType(G_SATELLITE_MAP);


		map.enableDoubleClickZoom(); 
		map.enableContinuousZoom();
		map.enableScrollWheelZoom();

//		GEvent.addListener(map, 'mousemove', mouseMove);
		GEvent.addListener(map, "moveend", moveEnd);
		GEvent.addListener(map, "zoomend", zoomEnd);
		GEvent.addListener(map, "maptypechanged", mapTypeChenged);

		GEvent.addListener(dirObj, "load", onDirectionsLoad);
		GEvent.addListener(dirObj, "error", onDirectionsError);

		var ovcontrol = new GOverviewMapControl(new GSize(165,165));
		map.addControl(ovcontrol);
		var ov_map = ovcontrol.getOverviewMap();
		GEvent.addListener(map, 'maptypechanged', function(){
//			ov_map.setMapType(G_NORMAL_MAP);
		}); 

		updateLink();
		display_defined_box();

		// Get route from file
		GDownloadUrl("markerdata.xml", function(data) {
		var xml = GXml.parse(data);
		markers = xml.documentElement.getElementsByTagName("marker");
		// Fill options
		var selDriveFrom = document.getElementById('driveFrom1');
		var selDriveTo   = document.getElementById('driveTo1');
		var j = 0;
		for (var i = 0; i < markers.length; i++) {
			var name = markers[i].getAttribute("name");
			var label = markers[i].getAttribute("label");
			if ( label == 'Agiofili' ) continue;
			if ( label == '' ) label = name;
			if ( name  == 'ATH' ) label = 'Athens ATH';
			selDriveFrom.options[j] = new Option(name, name, false, false)
			selDriveTo.options[j] = new Option(name, name, false, false)
			j++;
		}

        });

		if (mapState['driveFrom'] && mapState['driveTo']) {
			getDirections();
		}

	}
}




function addCustomMapType(mName,layers,maxRes,minRes) {
	var TerrainN = new GMapType(layers, normalProj, mName, {maxResolution:maxRes, minResolution:minRes, errorMessage:'Boom!'}); 
	map.addMapType(TerrainN);
}



function mouseMove(mousePt) {
	mouseLatLng = mousePt;
	
	var zoom = map.getZoom();
	var mousePx = normalProj.fromLatLngToPixel(mousePt, zoom);
	var oStatusDiv = document.getElementById("mouseTrack")	
	if (oStatusDiv) {
		oStatusDiv.innerHTML = 'Mouse LatLng: ' + mousePt.y.toFixed(6) + ', ' + mousePt.x.toFixed(6) ;
		oStatusDiv.innerHTML += '<br> ';
		oStatusDiv.innerHTML += 'Mouse Px: ' + mousePx.x + ', ' + mousePx.y;
		oStatusDiv.innerHTML += '<br>';
		oStatusDiv.innerHTML += 'Tile: ' + Math.floor(mousePx.x / 256) + ', ' + Math.floor(mousePx.y / 256);
	}

//getNearestVertex(mouseLatLng);

}



function mapTypeChenged() {
	if (typeChanging) {
		return;
	}
	typeChanging = true;

	var mtype = map.getCurrentMapType().getName();
	if (mtype == 'Terrain N') {
		opacity = 0.4;
	}
	else {
		opacity = 1;
	}
	var currentType = map.getCurrentMapType();
	map.setMapType(G_NORMAL_MAP);
	map.setMapType(currentType);
	typeChanging = false;

	updateLink();
}

function moveEnd() {
	updateLink();
}

function zoomEnd(oldZ,zoom) {
	updateLink();
}


function updateLink() {
	var center = map.getCenter();
	var zoom = map.getZoom();
	var mTypes = map.getMapTypes();
	for (var n = 0 ; n < mTypes.length ; n++ ) {
		if (mTypes[n] == map.getCurrentMapType()) {
			mType = n;
		}
	}

/*	var bounds = map.getBounds();
	var SW = bounds.getSouthWest();
	var NE = bounds.getNorthEast();

	var oCoords = document.getElementById("coords");
	oCoords.innerHTML = 'Map center: (' + center.lat().toFixed(6) + ',' + center.lng().toFixed(6) + ') - zoom: ' + zoom;
	oCoords.innerHTML += '<br> ';
	oCoords.innerHTML += 'SW: ' + SW.y.toFixed(6) + ', ' + SW.x.toFixed(6);
	oCoords.innerHTML += '<br> ';
	oCoords.innerHTML += 'NE: ' + NE.y.toFixed(6) + ', ' + NE.x.toFixed(6);
*/
	var oDriveFrom = document.getElementById('driveFrom');
	var oDriveTo = document.getElementById('driveTo');
	var oDriveVia = document.getElementById('driveVia');
	var oLocale = document.getElementById('locale');
	
	var link = window.location.pathname + '?lat=' + center.lat() + '&lon=' + center.lng() + '&z=' + zoom + '&mType=' + mType;
	link += '&driveFrom=' + oDriveFrom.value;
	link += '&driveTo=' + oDriveTo.value;
	link += '&driveVia=' + oDriveVia.value;
	link += '&locale=' + oLocale.value;
	
	
	var oLink = document.getElementById("link");
	oLink.innerHTML = '<a href="' + link + '">Link to this page</a>';
}

function display_defined_box() {
	document.getElementById('directionsFormTable').className='hide';
	document.getElementById('directionsdefaultTable').className='show';
	document.getElementById('givenbox').className='selected';
	document.getElementById('searchbox').className='none';
}

function display_search_box() {
	document.getElementById('directionsdefaultTable').className='hide';
	document.getElementById('directionsFormTable').className='show';
	document.getElementById('givenbox').className='none';
	document.getElementById('searchbox').className='selected';
}
///////////////////////////////////////////////////////////////////////////////////////////////////////


function markerDrag() {
	this.formField.value = this.getPoint().lat().toFixed(5) + ',' + this.getPoint().lng().toFixed(5);
}


function indicateLoading() {
	loading = true;
	displayLoadingMsg();
}

function displayLoadingMsg() {
	var oLMsg = document.getElementById('loadingMessage');
	oLMsg.style.display = '';
	oLMsg.style.left = container.offsetLeft + (container.clientWidth / 2) - (oLMsg.clientWidth / 2) + 'px';
	oLMsg.style.top = container.offsetTop + (container.clientHeight / 2) - (oLMsg.clientHeight / 2) + 'px';
	oLMsg.style.filter="alpha(opacity=70)";

	if (loading){
		var to = window.setTimeout('displayLoadingMsg()',100);
	}
	else {
		oLMsg.style.display = 'none';
	}
}


// Map state -------------------------------------------
function getMapState() {
	var qString = window.location.search;
	qString = qString.substring(1, qString.length);

	var cValues = new Array();
	var separator = '&';
//	return cValues;

	if (!qString) {
		qString = getCookie('map2');
		separator = ',';
	}

	if (qString) {
		var nvPairs = qString.split(separator);

		for (var n = 0 ; n < nvPairs.length ; n++ )	{
			var nvPair = nvPairs[n];
			var nv = nvPair.split('=');

			cValues[nv[0]] = unescape(nv[1]);
			
		}
	}
	return cValues;
}


function getCookie(cookieName) {
	if (document.cookie.length > 0) {
		var cIndex = document.cookie.indexOf(cookieName+"=");
		if (cIndex != -1) {
			cIndex += cookieName.length + 1;
			var cLength = document.cookie.indexOf(";", cIndex);
			if (cLength == -1) {
				cLength = document.cookie.length;
			}
			return unescape(document.cookie.substring(cIndex, cLength)); 
		}
	}
	return null;
}



function setCookie(cookieName, value, expiredays) {
	var exp = "";
	if (expiredays) {
		var ExpireDate = new Date ();
		ExpireDate.setTime(ExpireDate.getTime() + (expiredays * 24 * 3600 * 1000));
		exp = ExpireDate.toGMTString();
	}
	document.cookie = cookieName + "=" + escape(value) + "; expires=" + exp + "; path=/";
}



function delCookie (cookieName) {
	if (getCookie(cookieName)) {
		document.cookie = cookieName + "=" + "; expires=Thu, 01-Jan-70 00:00:01 GMT";
	}
}

// End Map state -------------------------------------------



function resizePage() {

	var oTable = document.getElementById("outerTable");
	var dDiv = document.getElementById("directions_info");
	var mainContainer = document.getElementById("container");
	var mapContainer = document.getElementById("containerMap");
    var wMain = parseInt(mainContainer.offsetWidth);
    var mapFrameLeft = parseInt(mapContainer.offsetLeft) -8;

	sw = ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth );
	ih = ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) -150;

    mainContainer.style.marginLeft = (sw - wMain) /2 + 'px';

	iw = sw  - mapFrameLeft - mapFrameLeft;
	mapContainer.style.width = iw + 'px'; 
	oTable.style.width = iw  + 'px';
	var veHeight = 230;
	container.style.height = ih - veHeight + 65 + 'px';
	// dDiv.style.height = ih - veHeight + 75 + 'px';

	if (map) {
		var center = map.getCenter();
		var zoom = map.getZoom();
		map.checkResize();
		map.setCenter(center,zoom);
	}
}





function unload() {
	doUnload(0);
}

function doUnload(mReset) {
	if (mReset) {
		delCookie('map3');
		saveState = false;
		window.location = window.location.pathname;
	}

	if (saveState) {
		var cookieStr = '';
		var center = map.getCenter();

		cookieStr += 'lat=' + center.lat() + ',';
		cookieStr += 'lon=' + center.lng() + ',';
		cookieStr += 'z=' + map.getZoom() + ',';
		cookieStr += 'mType=' + mType + ',';
		cookieStr += 'mapMode=' + mapMode;

		setCookie('map3', cookieStr, 365);
	}
	GUnload();
}

function rmOverlays() {
	directionsInfoDiv.innerHTML = '';
	map.clearOverlays();
	resizePage();
}

function getDirectionsfromOptions() {
	var selfrom = document.getElementById('driveFrom1');
	var selto   = document.getElementById('driveTo1');
	var driveFrom = selfrom.options[selfrom.selectedIndex].text;
	var driveTo = selto.options[selto.selectedIndex].text;

	getDirectionsFromLink(driveFrom, driveTo)
}

function getDirections() {
	var oDriveFrom = document.getElementById('driveFrom');
	var oDriveTo = document.getElementById('driveTo');
	var oDriveVia = document.getElementById('driveVia');
	var oLocale = document.getElementById('locale');

	directionsInfoDiv.style.display = '';

	var loadStr;

	if (oDriveFrom.value && oDriveTo.value) {
		loadStr = 'from:' + oDriveFrom.value;
		if (oDriveVia.value) {
			var viaValue = oDriveVia.value.replace(/[\n\r]+/,"");
			var viaSteps = viaValue.split(';');
			for (var n = 0 ; n < viaSteps.length ; n++ ) {
				loadStr += ' to: ' + viaSteps[n];
			}
		}
		loadStr += ' to: ' + oDriveTo.value;
	}
	if (loadStr) {
		indicateLoading();
		dirObj.load(loadStr,{locale:oLocale.value,getPolyline:true,getSteps:true});
		updateLink();

	}

}

function getDirectionsFromLink(driveFrom, driveTo) {
	var oDriveFrom = XMLsearchDirections(driveFrom);
	var oDriveTo = XMLsearchDirections(driveTo);
 	var oLocale = document.getElementById('locale');
	dirObj.clear();
	directionsInfoDiv.style.display = '';
	document.getElementById('driveFrom').value = oDriveFrom;
	document.getElementById('driveTo').value = oDriveTo;
    
	var loadStr;

	if (oDriveFrom && oDriveTo) {
		loadStr = 'from:' + oDriveFrom;
		loadStr += ' to: ' + oDriveTo;
	}
	if (loadStr) {
		indicateLoading();
		dirObj.load(loadStr,{locale:oLocale.value,getPolyline:true,getSteps:true});
		updateLink();
	}

}

function XMLsearchDirections(loc) {
	var location = new RegExp(loc);
	var pointFound = 0;
	for (var i = 0; i < markers.length; i++) {

		var name = markers[i].getAttribute("name");
		var label = markers[i].getAttribute("label");
		var tel  = markers[i].getAttribute("default");
		var type = markers[i].getAttribute("type");

		if (location.test(name)==true) {
			var point = markers[i].getAttribute("lat")+"\,"+markers[i].getAttribute("lng");
		var newloc = label+"\@"+point;
		return (newloc);
		}
	}
		return (loc);
}

function onDirectionsLoad() {
	var html = '';
	var status = dirObj.getStatus();
	var bounds = dirObj.getBounds();

	map.clearOverlays();

	var copyrightHTML = dirObj.getCopyrightsHtml();
	var summaryHTML = dirObj.getSummaryHtml();
	var distance = dirObj.getDistance();
	var duration = dirObj.getDuration();
	var numRoutes = dirObj.getNumRoutes();
	var oDriveFrom = document.getElementById('driveFrom');
	var oDriveTo = document.getElementById('driveTo');
	var startLatLng = dirObj.getRoute(0).getStep(0).getLatLng();
	var endLatLng = dirObj.getRoute(numRoutes-1).getEndLatLng();
	var airport = new RegExp("Aktio");

	createMarker( oDriveFrom.value );
	createMarker( oDriveTo.value );

	polyline = dirObj.getPolyline();
	pLine = copyPolyline(polyline);
	map.addOverlay(polyline);

	var numGeoCodes = dirObj.getNumGeocodes();
	var startPoint = dirObj.getGeocode(0);
	var endPoint = dirObj.getGeocode(numGeoCodes-1);
	addDragMarker(startPoint);
	
	if (airport.test(startPoint.address)==true) {
		var realStartMarker = new GMarker(startLatLng,{icon:airportIcon,draggable:true,bouncy:false});
	} else {
		var realStartMarker = new GMarker(startLatLng,{icon:greenIcon,draggable:true,bouncy:false});
	}
	realStartMarker.formField = oDriveFrom;
	GEvent.addListener(realStartMarker,'drag',markerDrag);
	GEvent.addListener(realStartMarker,'dragend',getDirections);
	map.addOverlay(realStartMarker);

	var realEndMarker = new GMarker(endLatLng,{icon:redIcon,draggable:true,bouncy:false});
	GEvent.addListener(realEndMarker,'drag',markerDrag);
	GEvent.addListener(realEndMarker,'dragend',getDirections);
	realEndMarker.formField = oDriveTo;
	map.addOverlay(realEndMarker);


	html += '<div class="globalSummaryDiv">';
	html += '<table cellspacing="0" cellpadding="2" width="100%">';
	html += '<tr><td valign="top"> <b>' + startPoint.address + '</b> to <b>' + endPoint.address + '</b></td></tr>';
	html += '<tr><td valign="top"> '+summaryHTML+'</td></tr>';
	html += '</table></div>';
	
	
	for (var r = 0 ; r < numRoutes ; r++ ) {
		var route = dirObj.getRoute(r);
		var startGeoCode = dirObj.getGeocode(r);//route.getStartGeocode();
		var endGeoCode = dirObj.getGeocode(r+1);//route.getEndGeocode();
		var endLatLng = route.getEndLatLng();
		var routeSummaryHTML = route.getSummaryHtml();
		var routeDistance = route.getDistance();
		var routeDuration = route.getDuration();
		html += '<div class="routeSummaryDiv" onclick="toggleSteps('+r+')" title="Click to view steps">';
		html += '<table cellspacing="0" cellpadding="2" width="100%">';
		html += '<tr>';
		
		if (numRoutes == 1) {
			html += '<td valign="top"><img src="http://maps.google.com/mapfiles/kml/pal4/icon15.png"><br><img src="http://maps.google.com/mapfiles/kml/pal2/icon2.png"></td>';
		}
		else {
			if (r == 0) {
				html += '<td valign="top"><img src="http://maps.google.com/mapfiles/kml/pal4/icon15.png"><br><img src="/images/yellowSquare.png"></td>';
				var midMarker = new GMarker(endLatLng,{icon:yellowIcon});
				map.addOverlay(midMarker);
			}
			else if (r == numRoutes - 1) {
				html += '<td valign="top"><img src="/images/yellowSquare.png"><br><img src="http://maps.google.com/mapfiles/kml/pal2/icon2.png"></td>';
			}
			else {
				html += '<td valign="top"><img src="/images/yellowSquare.png"><br><img src="/images/yellowSquare.png"></td>';
				var midMarker = new GMarker(endLatLng,{icon:yellowIcon});
				map.addOverlay(midMarker);
			}
		}
		
		html += '<td valign="top"><b>' + startGeoCode.address + '</b> to<br> <b>' + endGeoCode.address + '</b><br>'+routeDistance.html+ ' (' + routeDuration.html +  ')</td>';
		html += '</table></div>';

		var numSteps = route.getNumSteps();
		html += '<table cellspacing="0" cellpadding="0" id="routeTable_'+r+'" style="display:none" width="100%">';
		for (var s = 0 ; s < numSteps ; s++ ) {
			var step = route.getStep(s);
			var stepLatLng = step.getLatLng();
			bounds.extend(stepLatLng);

			var stepPolylineIndex = step.getPolylineIndex();
			var stepDescriptionHTML = step.getDescriptionHtml();
			var re = new RegExp(pattern,'g');
			stepDescriptionHTML = stepDescriptionHTML.replace(re,'<b style="color:#CA0039">$1</b>')
			var stepDistance = step.getDistance();
			var stepDuration = step.getDuration();
			html += '<tr class="stepRow" onclick="showStep('+r+','+s+')"><td>&nbsp;&nbsp;' + (s+1) + '.</td><td> ' + stepDescriptionHTML + '</td><td>' + stepDistance.html + '</td></tr>';
		}
		html += '</table>';
	}
	
	directionsInfoDiv.innerHTML = html;
	loading = false;

	map.setCenter(bounds.getCenter(map), map.getBoundsZoomLevel(bounds)); 
	// set marker rau
}

function copyPolyline(p) {
	pLinePoints = Array();
	for (var n = 0 ; n < p.getVertexCount() ; n++ ) {
		pLinePoints.push(p.getVertex(n));

	}
	var pLine = new GPolyline(pLinePoints,'#F7098A');
	return pLine;
}

function addDragMarker(placemark) {
	markerDragging = false;

	var point = new GLatLng(placemark.Point.coordinates[1],placemark.Point.coordinates[0])

	dragMarker = new GMarker(point, {icon:redIcon8,draggable:true,bouncy:false});
	GEvent.addListener(dragMarker, 'dragend', function(){
		var oDriveVia = document.getElementById('driveVia');
		if (oDriveVia.value) {
			oDriveVia.value += ';\n';
		}
		oDriveVia.value += dragMarker.getPoint().lat().toFixed(5) + ',' + dragMarker.getPoint().lng().toFixed(5);
		if (dragMarker) {
			map.removeOverlay(dragMarker);
		}
		getDirections();

	});

	GEvent.addListener(dragMarker, 'dragstart', function(){
		markerDragging = true;
	});

	map.addOverlay(dragMarker);
	dragMarker.hide();
}

function getNearestVertex(mouseLatLng) {
	if (markerDragging) {
		return;
	}
	if (!dragMarker) {
		return;
	}

	if (pLinePoints.length > 1){
		var bounds = map.getBounds();
		var SW = bounds.getSouthWest();
		var NE = bounds.getNorthEast();
		var diag = SW.distanceFrom(NE);
		threshold = diag / 100;
		var minDist = 9999999999;
		var intermediateIndex = Math.round(pLinePoints.length / 100);

		for (var n = 0 ; n < pLinePoints.length-intermediateIndex ; n+= intermediateIndex ) {
			if (mouseLatLng.distanceFrom(pLinePoints[n]) < minDist) {
				minDist = mouseLatLng.distanceFrom(pLinePoints[n]);
				if (minDist < threshold) {
					dragMarker.show();
					dragMarker.setLatLng(pLinePoints[n]);
				}
				else {
					dragMarker.hide();
				}
			}
		}
	}
}

function onDirectionsError() {
	loading = false;
	//directionsInfoDiv.innerHTML = 'Error: ' + dirObj.getStatus().code;
	if (dirObj.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
		errortext = "No corresponding geographic location could be found for one of the specified addresses. This may be due to the fact that the address is relatively new, or it may be incorrect.\nError code: " + dirObj.getStatus().code;

	else if (dirObj.getStatus().code == G_GEO_SERVER_ERROR)
		errortext = "A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + dirObj.getStatus().code;
	   
	else if (dirObj.getStatus().code == G_GEO_MISSING_QUERY)
		errortext = "The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + dirObj.getStatus().code;

	else if (dirObj.getStatus().code == G_GEO_UNAVAILABLE_ADDRESS)
		errortext = "The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + dirObj.getStatus().code;
	     
	else if (dirObj.getStatus().code == G_GEO_BAD_KEY)
		errortext = "The given key is either invalid or does not match the domain for which it was given. \n Error code: " + dirObj.getStatus().code;

	else if (dirObj.getStatus().code == G_GEO_BAD_REQUEST)
		errortext = "A directions request could not be successfully parsed.\n Error code: " + dirObj.getStatus().code;
	else if (dirObj.getStatus().code == G_GEO_UNKNOWN_DIRECTIONS)
		errortext = "Es konnte keinen Routenplan zwischen den Punkten in der Suchanfrage berechnen.\n Error code: " + dirObj.getStatus().code;
	else if (dirObj.getStatus().code == G_GEO_TOO_MANY_QUERIES)
		errortext = "Es wurde innerhalb des Zeitraums von 24 Stunden das Limit für Anforderungen überschritten oder zu viele Anforderungen in einem zu kurzen Zeitraum übermittelt.\n Error code: " + dirObj.getStatus().code;
	    
	else errortext = "An unknown error occurred. " + dirObj.getStatus().code;

	directionsInfoDiv.innerHTML = errortext;
}

function toggleSteps(routeNo) {
	oRouteTable = document.getElementById('routeTable_' + routeNo);
	oRouteTable.style.display = oRouteTable.style.display == 'none' ? '' : 'none';
}

function showStep(r,s) {
	map.closeInfoWindow();
	var step = dirObj.getRoute(r).getStep(s);
	var stepLatLng = step.getLatLng();
	var stepDescriptionHTML = step.getDescriptionHtml();
	var re = new RegExp(pattern,'g');
	stepDescriptionHTML = stepDescriptionHTML.replace(re,'<b style="color:#CA0039">$1</b>')
	var stepDistance = step.getDistance();
	var stepDuration = step.getDuration();

	var infoHTML = '<div id="tab1" class="bubble">';
	infoHTML += '<table>';
	infoHTML += '<tr class="stepRow"><td>&nbsp;&nbsp;' + (s+1) + '.</td><td> ' + stepDescriptionHTML + '</td><td>' + stepDistance.html + '</td></tr>';
	infoHTML += '<tr class="stepRow"><td>&nbsp;&nbsp;</td colspan="2"><td> ' + stepLatLng + '</td></tr>';
	infoHTML += '</table>';
	infoHTML += '</div>';


	var tab1 = new GInfoWindowTab("Location", '<div id="detailmap"></div>');
	var tab2 = new GInfoWindowTab("Info", infoHTML);
	var infoTabs = [tab1,tab2];

	map.openInfoWindowTabsHtml(stepLatLng,infoTabs);

//	detailmap = null;
// Minimap for driving directions
	var dMapDiv = document.getElementById("detailmap");
	detailmap = new GMap2(dMapDiv);
	detailmap.setCenter(stepLatLng,15);

	detailmap.addOverlay(pLine);

	var CopyrightDiv = dMapDiv.firstChild.nextSibling;
	var CopyrightImg = dMapDiv.firstChild.nextSibling.nextSibling;
	CopyrightDiv.style.display = "none"; 
	CopyrightImg.style.display = "none"; 

	detailmap.addControl(new GSmallMapControl());
}

function createMarker( MarkerName) {
	var ThisName = MarkerName.split("@");
	var str=document.URL;
    var isEnglish = str.search(/_en/);
    var openInfo  = str.search(/\?/);
	var routePoint = new RegExp("route");

	for (var i = 0; i < markers.length; i++) {
	    var baseLnk = "http:\/\/www.vasiliki.ch\/";
		var tmplabel = markers[i].getAttribute("label");
		if ( ThisName[0] != tmplabel ) continue;
		var label = markers[i].getAttribute("label");
		var name = markers[i].getAttribute("name");
		var tel  = markers[i].getAttribute("tel");
		var link = markers[i].getAttribute("link");
		var bild = markers[i].getAttribute("bild");
		var type = markers[i].getAttribute("type");
		var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
                                parseFloat(markers[i].getAttribute("lng")));
		if (routePoint.test(type)==true) 
			continue;
		if (isEnglish != -1)
			link=link.replace(/\.htm/, "_en.htm");
		}

      var marker = new LabeledMarker(point, {icon: customIcons[type], labelText: label, labelClass: "txt-white", labelOffset: new GSize(-70, 0)});
      var html = "<p><a href=\"" + baseLnk + link + "\" target=\'_blank\'>" + name + "</a></p>";
      //html = "<p><a href=\"" + baseLnk + link + "\" target=\'_blank\'>" + name + "</a></p>";
      if(bild!=""){ 
         html = html + "<br><img border=\'0\' src=\'" +bild+ "\' width=\'100\' height=\'67\'>";
      }
      html = html + "<p><strong>Phone:</strong>" + tel + "</p>";
      GEvent.addListener(marker, 'click', function() {
        marker.openInfoWindowHtml(html);
      });
	map.addOverlay(marker);
			
    }
