
function GMap2App()
{
	this.map = null;
	this.geocoder = new GClientGeocoder();
	this.Markers = new Object();
	this.MarkersInfo = new Object();
	this.Bounds = null;
}

GMap2App.prototype.loadGMap = function(id)
{
	this.map = new GMap(document.getElementById(id));
	this.map.addControl(new GSmallMapControl());
	this.map.addControl(new GMapTypeControl());
}

GMap2App.prototype.setCenter = function(lat, lon, zoom)
{
	this.map.setCenter(new GLatLng(lat, lon), zoom);
}

/* OpenMarker */
GMap2App.prototype.OpenMarker = function(id)
{
	var marker = this.Markers[id];
	var info = this.MarkersInfo[id];
	marker.openInfoWindowHtml(info);
	this.map.setZoom(14);
	this.map.panTo(marker.getPoint());
}

/* getMarkerInfo(id) */
GMap2App.prototype.getMarkerInfo = function(id)
{
	GDownloadUrl('location.php&id=' + id, alert() );
}

/*
	centerOnMarkers
*/
GMap2App.prototype.centerOnMarkers = function()
{
	this.Bounds = new GLatLngBounds(this.map.getCenter(), this.map.getCenter())
	var marker = null;
	for(var i in this.Markers)
	{
		marker = this.Markers[i];
		if (isFinite(i))
		{
			this.Bounds.extend(marker.getPoint());
		}
	}
	var newzoom = this.map.getBoundsZoomLevel(this.Bounds);
	this.map.setZoom(newzoom);
	this.map.setCenter(this.Bounds.getCenter());
}

/*
	addMarkers:  adds markers to map with associated id
*/
GMap2App.prototype.addMyMarkers = function(id, lat, lon)
{	
	var point = new GLatLng(lat, lon);
	var marker = new GMarker(point, {draggable: false});
	//var mgr = new GMarkerManager(this.map);

	var self = this;
	
	GEvent.addListener(marker, 'click', function()
		{
			self.OpenMarker(id);
		}
	);
	//mgr.addMarker(marker, 10)
	//mgr.refresh();
	this.map.addOverlay(marker);
	this.Markers[id] = marker;
}

/* addMarkersInfo */
GMap2App.prototype.addMyMarkersInfo = function(id, info)
{
	this.MarkersInfo[id] = info;
}

GMap2App.prototype.addMarkerDrag = function(lat, lon)
{
	point = new GLatLng(lat, lon);
	marker = new GMarker(point, {draggable: true});
	this.marker = marker;
	this.map.addOverlay(marker);
}

GMap2App.prototype.addAdminUpdater = function(latform, lngform)
{
	marker = this.marker
	GEvent.addListener(marker, "dragend", function()
	{
		var point = marker.getPoint();
		latform.value = point.lat();
		lngform.value = point.lng();
	});
} 

GMap2App.prototype.showAddress = function(form) {
	var address = form.address.value;
	var map = this.map;
	var geocoder = new GClientGeocoder();
	geocoder.getLatLng(
		address,
		function(point)
		{
			map.panTo(point);
			this.marker.setPoint(point);
			form.latitude.value = point.lat();
			form.longitude.value = point.lng();
		}
	);
	
}

/**
 * Creates the event handlers needed for each row of results.
 *
 * @access public
 * @param row
 * @return void
 */
function attachDefaultHandlers(row)
{
	var id = row.id;
	// callback for selection.
	var selCallback = function(e) 
        {
        var el = e.currentTarget || findParentTag(e.srcElement, 'TR');
        
        if(window.selectedRow != null) 
            window.selectedRow.className = 'notHighlighted';
        
        el.className = 'highlighted';
        window.selectedRow = el;
        
        window.map.OpenMarker(id);
        //var marker = window.map.markers[el.id];
        //GEvent.trigger(marker, 'click');
        };
    // callback for mouseover
    var moverCallback = function(e)
        {
        var el = e.currentTarget || findParentTag(e.srcElement, 'TR');
        if(el.className != 'highlighted')
            {
            el.className = 'hover';
            }
        }
    // callback for mouseout
    var moutCallback = function(e)
        {
        var el = e.currentTarget || findParentTag(e.srcElement, 'TR');
        if(el.className != 'highlighted')
            {
            el.className='notHighlighted';
            }
        }
    if(id != "undefined" && id != null && id != '')
        {
        AttachEvent(row, 'click', selCallback, false);
        AttachEvent(row, 'mouseover', moverCallback, false);
        AttachEvent(row, 'mouseout', moutCallback, false);
        }
    }

/* ATTACH EVENT STUFF ???? */
function main(e)
{
	window.loadMap();
	
	if (document.getElementById('map_finder_results')) 
	{
		// now, tie each row into the map
  	var results = document.getElementById('map_finder_results').getElementsByTagName('tr');
                
		for (var i in results)
		{
			attachDefaultHandlers(results[i]);
		}
	}
	
	//AttachEvent(atmFinder, 'submit', ValidateForm, false);
    
    // add infobox context help
    
    var helpBoxOpen = function(e)
        {
        document.getElementById('instructions').style.display = 'block';
        document.getElementById('how_to_use').style.display = 'none';
        stopDefaultAction(e);
        }
    var helpBoxClose = function(e)
        {
        document.getElementById('instructions').style.display = 'none';
        document.getElementById('how_to_use').style.display = 'block';
        stopDefaultAction(e);
        }
    //AttachEvent(document.getElementById('how_to_use'), 'click', helpBoxOpen, false);
    //AttachEvent(document.getElementById('instructions'), 'click', helpBoxClose, false);
}
    

AttachEvent(window, 'load', main, false);
















