/**
 * Title    : T324GoogleMaps
 * Version  : 1.0
 * Created  : 21 July 2005
 * Modified : 21 July 2005
 *
 * Usage :
 * 
 * 		var googleMap = new T324GoogleMap();
 * 		googleMap.render();
 */

var T324GoogleMap = function(params) {
	if (!params) { params = new Object(); }
	var _mapObject = {
		_params: {
			name: params.name || 'map',
			width: params.width || '400px',
			height: params.height || '400px',
			latitude: params.latitude || 0,
			longitude: params.longitude || 0,
			zoomLevel: params.zoomLevel || 4,
			showControls: params.showControls || true,
			borderColor: params.borderColor || '#666',
			centerMarker: params.marker || false
		},
	
		_initMap: function() {
			document.write('<div id="' + this._params.name + '"></div>');
			this.el = document.getElementById(this._params.name);
			this.el.style.width = this._params.width;
			this.el.style.height = this._params.height;
			this.el.style.border = '1px solid ' + this._params.borderColor;
			
			this.centerPoint = new GPoint(this._params.longitude, this._params.latitude);
			
			if (this._params.centerMarker) {
				this._params.centerMarker.point = this.centerPoint;
				this.addMarker(this._params.centerMarker);
			}
		},
		
		addMarker: function(params) {
			var point = params.point || new GPoint(params.longitude, params.latitude);
			var marker = (params.isSmall) ? new GMarker(point, this._createIcon(params.color)) : new GMarker(point);
			if (params.showBalloon) {
				var self = this;
				GEvent.addListener(marker, 'click', function() { marker.openInfoWindowHtml(self._addBalloon(params)); });
			}
			if(!this._markers) {
				this._markers = new Array();
			}
			this._markers[this._markers.length] = params;
		},
		
		_createMarker: function (params) {
			var point = params.point || new GPoint(params.longitude, params.latitude);
			var marker = (params.isSmall) ? new GMarker(point, this._createIcon(params.color || 'red')) : new GMarker(point);
			if (params.showBalloon) {
				var self = this;
				GEvent.addListener(marker, 'click', function() { marker.openInfoWindowHtml(self._addBalloon(params)); });
			}
			return marker;
		},
		
		_createIcon: function (color) {
			// Create a small marker icon
			var icon = new GIcon();
			// Color choices include "red," "orange," "yellow," "green," "blue," "purple," "black," & "white"
			icon.image = "http://labs.google.com/ridefinder/images/mm_20_" + color + ".png";
			icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
			icon.iconSize = new GSize(12, 20);
			icon.shadowSize = new GSize(22, 20);
			icon.iconAnchor = new GPoint(6, 20);
			icon.infoWindowAnchor = new GPoint(5, 1);
			return icon;
		},
		
		_addBalloon: function(params) {
			var balloonStyle = params.balloonStyle || 'font: 13px Tahoma, Arial, sans-serif';
			var balloonText = '<span style="' + balloonStyle + '">';
			if (params.street) {
				balloonText += '<h3 style="margin-top: 0; font-size: 16px; font-weight: bold;">Address:</h3><p>';
				balloonText += params.street + '<br/>' + params.city + ', ' + params.state + ' ';
				balloonText += params.zip + '</p>';
			}
			
			if (params.message) {
				balloonText += '<p id="GMapMessage">' + params.message + '</p>';
			}
			
			return balloonText;
		},
		
		_drawMap: function () {
			this._map = new GMap(this.el);
			
			this._map.centerAndZoom(this.centerPoint, this._params.zoomLevel);
			
			if (this._params.showControls) {
				this._map.addControl(new GSmallMapControl());
				this._map.addControl(new GMapTypeControl());
			}
			
			for (var i = 0; i < this._markers.length; i++) {
				this._map.addOverlay(this._createMarker(this._markers[i]));
			}
		},
		
		render: function () {
			if (GBrowserIsCompatible() /*&& 1==2*/) {
				var self = this;
				AttachEvent(window, 'load', function () {self._drawMap();});
			}
			else {
				this.el.style.font = '13px Tahoma, Arial, sans-serif';
				this.el.innerHTML = '<p style="margin: 1em;">We\'re sorry.  Your browser appears to be unable to display <a href="http://maps.google.com" target="_blank">Google Maps</a>.</p>';
				if (this._params.centerMarker) {
					this.el.innerHTML += '<p style="margin: 1em;">Perhaps one of these map services will work for you.</p>';
					this.el.innerHTML += '<ul style="margin-left: 1em"><li><a href="http://maps.yahoo.com/maps_result?addr=' + this._params.centerMarker.street + '&csz=' + this._params.centerMarker.zip + '&country=us&new=1&name=&qty=" target="_blank">Yahoo! Maps</a></li>';
					this.el.innerHTML += '<li><a href="http://www.mapquest.com/maps/map.adp?searchtype=address&country=US&addtohistory=&searchtab=home&address=' + this._params.centerMarker.street + '&city=&state=&zipcode=' + this._params.centerMarker.zip + '" target="_blank">MapQuest</a></li></ul>';
				}
			}
		}
	};
	
	_mapObject._initMap();
	return _mapObject;
};

// cross browser event model helper function
function AttachEvent(elementObj, eventName, eventHandlerFunctionName) {
	if (elementObj.addEventListener) { // Non-IE browsers
		elementObj.addEventListener(eventName, eventHandlerFunctionName, false);		
	} 
	else if (elementObj.attachEvent) { // IE 6+
		elementObj.attachEvent('on' + eventName, eventHandlerFunctionName);
	} 
	else { // Older browsers 
		var currentEventHandler = elementObj['on' + eventName];
		if (currentEventHandler === null) {
			elementObj['on' + eventName] = eventHandlerFunctionName;
		} 
		else {
			elementObj['on' + eventName] = function(e) { currentEventHandler(e); eventHandlerFunctionName(e); };
		}
	}
}

		
