var gmap = {

	marker_arr: [],
	print_driving_directions: false,
	to_html_arr: new Array(),
	from_html_arr: new Array(),
	
	init: function() {
		if (!GBrowserIsCompatible()) {
			alert("Sorry, the Google Maps API is not compatible with this browser");
		}
	},
	
	open_info_window: function(i, scrollToPosition) {
		
		if (typeof scrollToPosition != 'undefined') {
			$('html').animate({ scrollTop: scrollToPosition }, 'slow');
		}
		
		GEvent.trigger(gmap.marker_arr[i], "click");
	},
	
	find_location: function(location, callback) {
		
		url = "/ajax/geocode?location="+location;
		$.getJSON(url, eval(callback));
		
	},
	
	// functions that opens the directions forms
	tohere: function(i) {
		gmap.marker_arr[i].openInfoWindowHtml(gmap.to_html_arr[i]);
	},
	
	// functions that opens the directions forms
	fromhere: function(i) {
		gmap.marker_arr[i].openInfoWindowHtml(gmap.from_html_arr[i]);
	},
	
	create_icon: function(marker_icon) {
		
		var icon            = new GIcon();
		var icon_size       = (marker_icon.icon_size != undefined) ? eval(marker_icon.icon_size) : [32,32];
		var shadow_size     = (marker_icon.shadow_size != undefined) ? marker_icon.shadow_size : [32,32];
		var icon_anchor     = (marker_icon.icon_anchor != undefined) ? eval(marker_icon.icon_anchor) : [0,32];
		var info_win_anchor = (marker_icon.icon_info_win != undefined) ? eval(marker_icon.icon_info_win) : [21,10];
		
        icon.image = marker_icon.icon_url; 
        icon.iconAnchor = new GPoint(icon_anchor[0], icon_anchor[1]);
        icon.infoWindowAnchor = new GPoint(info_win_anchor[0], info_win_anchor[1]);
        icon.iconSize = new GSize(icon_size[0], icon_size[1]);
        if (marker_icon.shadow_url != undefined) {
			icon.shadow = marker_icon.shadow_url;
			icon.shadowSize = new GSize(shadow_size[0], shadow_size[1]);
        }
        
        return icon;
	},
	
	create_marker: function(point,label,html,marker_icon) {
		
		if (marker_icon.icon_url != undefined) {
			var marker_icon = gmap.create_icon(marker_icon);
			var marker      = new GMarker(point, { icon: marker_icon });
		} else {
			var marker = new GMarker(point);
		}
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(html);
		});
		return marker;
	
	},
	
	set_my_location: function(markers) {
		
		var marker = markers[0];
		var lat    = parseFloat(marker.getAttribute("lat"));
		var lng    = parseFloat(marker.getAttribute("lng"));
		var point  = new GLatLng(lat,lng);
		var html   = GXml.value(marker.getElementsByTagName("infowindow")[0]);
		var label  = marker.getAttribute("label");
		var icon   = marker_icon = { icon_url: 'http://media.ciy.com/img/weamplify/template/icons/people-pin.png', icon_size: [49,32], icon_anchor: [31,31], info_info_win: [22,4], shadow_url: 'http://media.ciy.com/img/weamplify/template/icons/people-pin-shadow.png', shadow_size: [49,32] }
		
		map.setCenter(new GLatLng(lat,lng), 10);
		
		// create the marker
		var marker = gmap.create_marker(point,label,html,icon);
		gmap.marker_arr.push(marker);
		map.addOverlay(marker);
		
	},
	
	set_markers_from_arr: function(markers) {
		
		gmap.marker_arr = [];
		for (var i = 0; i < markers.length; i++) {
		
			// obtain the attribues of each marker
			var lat               = parseFloat(markers[i].getAttribute("lat"));
			var lng               = parseFloat(markers[i].getAttribute("lng"));
			var point             = new GLatLng(lat,lng);
			var html              = GXml.value(markers[i].getElementsByTagName("infowindow")[0]);
			var label             = markers[i].getAttribute("label");
			var icon              = markers[i].getAttribute("icon");
			var icon_shadow       = markers[i].getAttribute("icon_shadow");
			var icon_shadow_size  = eval(markers[i].getAttribute("icon_shadow_size"));
			var icon_size         = eval(markers[i].getAttribute("icon_size"));
			var icon_anchor       = eval(markers[i].getAttribute("icon_anchor"));
			var icon_info_win     = eval(markers[i].getAttribute("icon_info_win"));
			var marker_icon       = "";
			
			if (icon != undefined) {
				marker_icon = { icon_url: icon, shadow_url: icon_shadow, icon_size: icon_size, shadow_size: icon_shadow_size, icon_anchor: icon_anchor, icon_info_win: icon_info_win }
			}
			
			if (gmap.print_driving_directions == true) {
			
				// The info window version with the "to here" form open
				gmap.to_html_arr[i] = html + '<p>Directions: <strong>To here</strong> - <a href="javascript:gmap.fromhere(' + i + ')">From here</a></p>' +
				'<div>Start address:<br /><form action="http://maps.google.com/maps" method="get">' +
				'<input type="text" SIZE=40 MAXLENGTH=40 name="saddr" id="saddr" value="" /><br />' +
				'<INPUT value="Get Directions" TYPE="SUBMIT">' +
				'<input type="hidden" name="daddr" value="' + point.lat() + ',' + point.lng() + 
				// "(" + name + ")" + 
				'"/></from></div>';
				
				// The info window version with the "to here" form open
				gmap.from_html_arr[i] = html + '<p>Directions: <a href="javascript:gmap.tohere(' + i + ')">To here</a> - <strong>From here</strong></p>' +
				'<div>End address:<br /><form action="http://maps.google.com/maps" method="get"">' +
				'<input type="text" SIZE=40 MAXLENGTH=40 name="daddr" id="daddr" value="" /><br />' +
				'<INPUT value="Get Directions" TYPE="SUBMIT">' +
				'<input type="hidden" name="saddr" value="' + point.lat() + ',' + point.lng() +
				// "(" + name + ")" + 
				'"/></from></div>';			
			
				html = html + '<p>Directions: <a href="javascript:gmap.tohere('+i+')">To here</a> - <a href="javascript:gmap.fromhere('+i+')">From here</a></p>';
			} 
							
			// create the marker
			var marker = gmap.create_marker(point,label,html,marker_icon);
			gmap.marker_arr.push(marker);
			map.addOverlay(marker);					
			
		}	
	
	},
	
	set_markers_from_xml: function(xml_source) {
	
		var request = GXmlHttp.create();
		request.open("GET", xml_source, true);
		request.onreadystatechange = function() {
			if (request.readyState == 4) {
				
				if (request.status == 200) {
					var xmlDoc = GXml.parse(request.responseText);
	
					// obtain the array of markers and loop through it
					map.clearOverlays();
					var markers = xmlDoc.documentElement.getElementsByTagName("marker");
					
					if (xml_source.match(/.+my_location.+/)) {
						gmap.set_my_location(markers);
					} else {
						if (map.getZoom() != 4) {
							map.setZoom(4);
						}
						gmap.set_markers_from_arr(markers);
					}
				}

			}
		}
		request.send(null);	
		
	}

}