/* Copyright (C) 2002-2008 by Home of the Brave
   Web http://home.of.the.brave.de
   E-Mail info@brave.de */
/* $Revision: 1.7 $ $Date: 2008/08/06 15:51:08 $ */

/*
 * Convert blocks with CSS class "google_map_conf" to Google maps.
 * dependencies: BodyEvents, Google Maps API
 * owner: Simon.Leidig@brave.de
 *
 */

var GoogleMaps = {
	Zoom:	10,
	Type:	'normal',
	Marker:	true,
	Width:	'auto',
	Height:	'auto',
	Controls: {
		Type:	true,
		Zoom:	true,
		Move:	true,
		Scale:	true
	},
	create: function (n) {
		var c; var m;
		if (!(
			n.className &&
			n.className.match(/\bgoogle_map_conf\b/) &&
			n.firstChild &&
			(c = n.firstChild.innerHTML) && (
				(m = c.match(/\baddress\s*[:=]\s*([^<\s][^<]*[^<\s])\b/i)) ||
				(m = c.match(/\b(-?\d+(?:\.\d+)?)\b.*?\b(-?\d+(?:\.\d+)?)\b/))
			)
		)) return;

		var lat = m[1]; var lng = m[2];
		var country = !lng && (m = c.match(/\bcountry\s*[:=]\s*([a-z]{2})\b/i)) ?
			m[1] : null;
		var zoom = (m = c.match(/\bzoom\s*[:=]\s*(\d+)\b/i)) ?
			m[1] : GoogleMaps.Zoom;
		var type = (m = c.match(/\btype\s*[:=]\s*(normal|satellite|hybrid)\b/i)) ?
			m[1] : GoogleMaps.Type;
		var mark = (m = c.match(/\bmarker\s*[:=]\s*(yes|no)\b/i)) ?
			(m[1] == 'yes' ? true : false) : GoogleMaps.Marker;
		var width = (m = c.match(/\bwidth\s*[:=]\s*(\d+)\b/i)) ?
			m[1] : GoogleMaps.Width;
		var height = (m = c.match(/\bheight\s*[:=]\s*(\d+)\b/i)) ?
			m[1] : GoogleMaps.Height;
		var cType = (m = c.match(/\bcontrol_type\s*[:=]\s*(yes|no)\b/i)) ?
			(m[1] == 'yes' ? true : false) : GoogleMaps.Controls.Type;
		var cZoom = (m = c.match(/\bcontrol_zoom\s*[:=]\s*(yes|no)\b/i)) ?
			(m[1] == 'yes' ? true : false) : GoogleMaps.Controls.Zoom;
		var cMove = (m = c.match(/\bcontrol_move\s*[:=]\s*(yes|no)\b/i)) ?
			(m[1] == 'yes' ? true : false) : GoogleMaps.Controls.Move;
		var cScale = (m = c.match(/\bcontrol_scale\s*[:=]\s*(yes|no)\b/i)) ?
			(m[1] == 'yes' ? true : false) : GoogleMaps.Controls.Scale;

		var info = document.createElement('div');
		for (var j = 1; j < n.childNodes.length; j++) {
			var d = n.childNodes[j];
			if (!(
				d.nodeName.toLowerCase() == 'div'	&&
				d.className							&&
				d.className.match(/\bblock\b/)		&&
				d.innerHTML.length
			)) continue;
			var p = document.createElement('p');
			p.innerHTML = d.innerHTML;
			info.appendChild(p);
		}

		n.innerHTML = '';
		n.className = n.className.replace(/\bgoogle_map_conf\b/,'google_map');
		var t = document.createElement('div');
		t.className = 'block';
		if (width  != 'auto') t.style.width  = width +'px';
		if (height != 'auto') t.style.height = height+'px';

		var show = function (point) {
			if (!point) return;
			n.appendChild(t);
			var map = new GMap2(t);
			map.setCenter(point,1*zoom);
			if (mark) map.addOverlay(new GMarker(point));
			if (cType) map.addControl(new GMapTypeControl());
			if (cScale) map.addControl(new GScaleControl());
			if (cMove) {
				if (cZoom) map.addControl(new GLargeMapControl());
				else map.addControl(new GSmallMapControl());
			} else if (cZoom) map.addControl(new GSmallZoomControl());
			map.setMapType(window['G_'+type.toUpperCase()+'_MAP']);
			if (info.firstChild) map.openInfoWindow(map.getCenter(),info);
		}
		if (lng) show(new GLatLng(lat,lng));
		else {
			var gc = new GClientGeocoder();
			if (country) gc.setBaseCountryCode(country);
			gc.getLatLng(lat,show);
		}
	}
};

BodyEvents.addListener('load', function () {
	try { if (!GBrowserIsCompatible()) return; }
	catch (e) { return; }
	var divs = document.getElementsByTagName('div');
	for (var i = 0; i < divs.length; i++) GoogleMaps.create(divs[i]);
} );
if (window.GUnload) BodyEvents.addListener('unload',GUnload);
