/**
 * Title    : T324GoogleMaps
 * Version  : 1.1
 * Created  : 21 July 2005
 * Modified : 23 January 2006
 *
 * 2006.01.24 
 *  - Modified attachEvent; event object detection now performed outside attachEvent's scope
 *  - Added GMap API detection to handle some errors
 *
 * Usage :
 * 
 * 		var googleMap = new T324GoogleMap();
 * 		googleMap.render();
 */

var NewGoogleMap = 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;
			
			if (window.GPoint) {
				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) {
			if (window.GPoint) {
				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) {
			// Color choices include "red" "orange" "yellow" "green" "blue" "purple" "black" & "white"
			var icon = new GIcon();
			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 (window.GPoint && GBrowserIsCompatible() /*&& 1==2*/) {
				var self = this;
				addEvent(window, 'load', function () {self._drawMap();});
			}
			else {
				this.el.className = 'contact-map-noScript';
				this.el.style.height = '';
				this.el.innerHTML = '<p>We\'re sorry.  We were unable to provide you with a <a href="http://maps.google.com/maps?q=' + this._params.centerMarker.street + ' ' + this._params.centerMarker.zip + '" target="_blank">Google Map of our location</a>.</p>';
				if (this._params.centerMarker) {
					this.el.innerHTML += '<p>Perhaps another mapping service will work for you:</p>';
					this.el.innerHTML += '<ul><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>' + 
										 '<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;
};