Ext.namespace('STAR.map');
STAR.map.main = function() {
	var map;
	var markerMgr;
	var markers = {};
	var data;
	var searchMarker;
	var geocoder;
	var iconBaseUrl;

	function init() {
		//console.log('app started');
		data = STAR.map.data;
		iconBaseUrl = STAR.map.iconBaseUrl;
		setupMap();
		
		// GMap2 insists they cleanup on unload to avoid mem leaks
		Ext.fly(window).on('unload',GUnload);
		
		Ext.getDom('search-buttons').innerHTML = 
			'<input type="button" value="Search Map" onclick="STAR.map.main.search(Ext.getDom(\'addr-input\').value);"/> '+
			'<input type="button" value="Reset" onclick="STAR.map.main.reset();"/>';
		
		Ext.getDom('legend').innerHTML =
			String.format(
				'<img src="{0}marker1-small.gif"/> Certified <img src="{0}marker0-small.gif"/> Star Coaters',
				iconBaseUrl
			);
	}
	
	function setupMap() {
		map = new GMap2(Ext.getDom('map'));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(new GLatLng(37, -90), 3);
		map.savePosition();
		
		markerMgr = new GMarkerManager(map);
		var pointsArray = [];
		
		var myIcon = new GIcon(G_DEFAULT_ICON);
		myIcon.image = iconBaseUrl+'marker.png';
		myIcon.printImage = iconBaseUrl+'markerie.gif';
		myIcon.mozPrintImage = iconBaseUrl+'markerff.gif';
		
		for (var i=0; i<data.length; i++) {
			var point = new GLatLng(data[i].lat, data[i].lng);
			var marker;
			if (data[i].type>0)
				marker = new GMarker(point, {title:data[i].name, icon:myIcon});
			else
				marker = new GMarker(point, {title:data[i].name});
			pointsArray.push(marker);
			markers[i] = marker;
		}
		// add all markers for lowest zoom level
		markerMgr.addMarkers(pointsArray,3);
		markerMgr.refresh();
		
		searchMarker = new GMarker(new GLatLng(0, 0));
		searchMarker.hide();
		map.addOverlay(searchMarker);
		
		geocoder = new GClientGeocoder();
		
		GEvent.addListener(map, "click", function(marker, point) {
			if (marker) {
				for (var i in markers)
					if (markers[i] == marker) show(i);
			}
		});
	}
	
	function show(id) {
		var d = data[id];
		var marker = markers[id];
		if (zoomIn())
			map.setCenter(marker.getPoint());
		marker.openInfoWindowHtml(String.format(
			'<div class="star-info"><h1>{0}</h1><p>{1}<br/>{2}, {3} {4}</p><p>TEL:{5} FAX:{6}</p><p><a target="_blank" href="http://{7}">{7}</a></p></div>',
			d.name,d.addr,d.city,d.state,d.zip,d.phone,d.fax,d.url
		));
	}
	
	function search(addr) {
		Ext.getDom('response').innerHTML='';
		if (!searchMarker.isHidden()) searchMarker.hide();
		geocoder.getLocations(addr, searchCallBack);
	}
	
	function searchCallBack(response){
		//return;
		if (!response || response.Status.code != 200) {
			Ext.getDom('response').innerHTML = 'Address not found.';
		} else {
			var place = response.Placemark[0];
			var coord = place.Point.coordinates;
			var point = new GLatLng(coord[1], coord[0]);

			zoomIn();
			map.openInfoWindowHtml(point,  String.format('<div class="star-info"><h1>{0}</h1></div>',place.address));
		}
	}
	
	function zoomIn() {
		if (map.getZoom() > 3) return false;
		if (map.getZoom() <= 3) map.setZoom(7);
		return true;
	}
	
	function reset() {
		map.closeInfoWindow();
		map.returnToSavedPosition();
	}

	return {
		init:init,
		search:search,
		reset:reset
	};
}();