var map = null;
var geocoder = null;

var baseIcon = new GIcon(G_DEFAULT_ICON);
baseIcon.iconSize = new GSize(20, 20);
baseIcon.shadowSize = new GSize(25, 25);
baseIcon.iconAnchor = new GPoint(10, 25);
baseIcon.infoWindowAnchor = new GPoint(9, 2);

var from_overlay=null;
var from_point=null;
var to_overlay=null;
var to_point=null;
var line_overlay=null;
var bounds=null;

function createSimpleMarker(point, label) {
	
	var marker = new GMarker(point);
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(label);
	});
	return marker;
}	

function createCleanMarker(point, label, icon_img) {
	var mapIcon = new GIcon(baseIcon);
	mapIcon.image = '/icon/' + icon_img + '.png';
	markerOptions = { icon: mapIcon };
	var marker = new GMarker(point, markerOptions);
	return marker;
}

function createLinkedMarker(point, label, url, icon_img) {
	var mapIcon = new GIcon(baseIcon);
	mapIcon.image = '/icon/' + icon_img + '.png';
	markerOptions = { icon: mapIcon };
	var marker = new GMarker(point, markerOptions);
	GEvent.addListener(marker, "click", function() {
		document.location = url;
	});
	return marker;
}

function createMarker(point, label, icon_img) {
	var mapIcon = new GIcon(baseIcon);
	mapIcon.image = '/icon/' + icon_img + '.png';
	markerOptions = { icon: mapIcon };
	var marker = new GMarker(point, markerOptions);
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(label);
	});
	return marker;
}


function showSimpleAddress(address, map_div, label, zoomlevel) {	
	geocoder = new GClientGeocoder();
	if (geocoder) {
    	geocoder.getLatLng(address, function(point) {
			if (!point) {
			} else {
				if (!map) {
					map = new GMap2(document.getElementById(map_div));
					map.addControl(new GSmallMapControl());
					/*map.addControl(new GMapTypeControl());*/
					map.setCenter(point, zoomlevel);
				}				
				map.addOverlay(createSimpleMarker(point, label));
				if (!bounds) {
					bounds=new GLatLngBounds(point, point);
				}
				bounds.extend(point);					
				map.setCenter(bounds.getCenter(), zoomlevel);
			}
		});
	}
}

function showCleanAddress(address, map_div, label, icon_img, zoomlevel) {	
	geocoder = new GClientGeocoder();
	if (geocoder) {
    	geocoder.getLatLng(address, function(point) {
			if (!point) {
			} else {
				if (!map) {
					map = new GMap2(document.getElementById(map_div));
					map.setCenter(point, zoomlevel);
				}					
				map.addOverlay(createCleanMarker(point, label, icon_img));
				if (!bounds) {
					bounds=new GLatLngBounds(point, point);
				}
				bounds.extend(point);					
				map.setCenter(bounds.getCenter(), zoomlevel);
			}
		});
	}
}

function showLinkedAddress(address, map_div, label, url, icon_img, zoomlevel) {	
	geocoder = new GClientGeocoder();
	if (geocoder) {
    	geocoder.getLatLng(address, function(point) {
			if (!point) {
			} else {
				if (!map) {
					map = new GMap2(document.getElementById(map_div));
					map.addControl(new GSmallMapControl());
					map.setCenter(point, zoomlevel);
				}
				/* map.setCenter(point, zoomlevel); */					
				map.addOverlay(createLinkedMarker(point, label, url, icon_img));
				if (!bounds) {
					bounds=new GLatLngBounds(point, point);
				}
				bounds.extend(point);					
				map.setCenter(bounds.getCenter(), zoomlevel);
			}
		});
	}
}


function showAddress(address, map_div, label, icon_img, zoomlevel) {	
		geocoder = new GClientGeocoder();
		if (geocoder) {
        	geocoder.getLatLng(address, function(point) {
				if (!point) {
				} else {
					if (!map) {
						map = new GMap2(document.getElementById(map_div));
						map.addControl(new GSmallMapControl());
						map.setCenter(point, zoomlevel);

					}
					/* map.setCenter(point, zoomlevel); */					
					map.addOverlay(createMarker(point, label, icon_img));
					if (!bounds) {
						bounds=new GLatLngBounds(point, point);
					}
					bounds.extend(point);					
					map.setCenter(bounds.getCenter(), zoomlevel);
				}
			});
		}
}


function showFrom(address, map_div, label, icon_img, zoomlevel, remove) {	
	geocoder = new GClientGeocoder();
	if (geocoder) {
    	geocoder.getLatLng(address, function(point) {
			if (!point) {
			} else {
				if (!map) {
					map = new GMap2(document.getElementById(map_div));
					map.addControl(new GSmallMapControl());
					map.setCenter(point, zoomlevel);
				}
				/* map.setCenter(point, zoomlevel); */
				if (remove && from_overlay!=null) {
					map.removeOverlay(from_overlay);
				}
								
				from_overlay=createMarker(point, label, icon_img);
				map.addOverlay(from_overlay);
				/* dojo.byId("distance").innerHTML=Math.round(showFromTo(zoomlevel, remove)/1000); */
				if (!bounds) {
					bounds=new GLatLngBounds(point, point);
				}
				
			}
		});
	}
}


function showTo(address, map_div, label, icon_img, zoomlevel, remove) {	
	geocoder = new GClientGeocoder();
	if (geocoder) {
    	geocoder.getLatLng(address, function(point) {
			if (!point) {
			} else {
				if (!map) {
					map = new GMap2(document.getElementById(map_div));
					map.addControl(new GMapTypeControl());
					map.setCenter(point, zoomlevel);

				}
				/* map.setCenter(point, zoomlevel); */
				if (remove && to_overlay!=null) {
					map.removeOverlay(to_overlay);
				}
				to_overlay=createMarker(point, label, icon_img);
				map.addOverlay(to_overlay);
				if (remove) {
					dojo.byId("distance").innerHTML=Math.round(showFromTo(zoomlevel, remove)/1000);
				} else {
					showFromTo(zoomlevel, remove);
				}
			}
		});
	}
	
}

function showFromTo(zoomlevel, remove) {
	if (!map) {
		return null;
	} else {
		if (remove && line_overlay!=null) {
			map.removeOverlay(line_overlay);
		}
		if ((from_overlay!=null) && (to_overlay!=null)) {
			var p_from=from_overlay.getPoint();
			var p_to=to_overlay.getPoint()
			line_overlay = new GPolyline([p_from, p_to], '#FF0000', 2);
			map.addOverlay(line_overlay);
			if (!bounds) {
				bounds=new GLatLngBounds(p_from, p_to);
			} else {
				bounds.extend(p_from);
				bounds.extend(p_to);
			}
			map.setCenter(bounds.getCenter(), zoomlevel);
			return p_from.distanceFrom(p_to);
		} else {
			return null;
		}
	}
}

