var map = null;
var cg 	= null;
var ic = '';

var zoomCity			= 13;
var zoomCountry 	= 5;
var zoomWorld 		= 2;
var sidebarWidth 	= 200;
var loadingWidth	= 220;
var loadingHeight	= 19;
//var markerPath		= 'http://maps.google.com/intl/en_de/mapfiles/icon_greenB.png';
var markerPath		= 'http://code.systemfehler.net/storelocator/gfx/markers/blue_Marker%s.png';
var	marks 				= new Array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');

$(document).ready(function() {	
	$(window).resize(function(){ _resizeMap(); });
	$(window).unload(function(){ GUnload(); });
	
	// hide mask
	_showMask(false);
	// resize divs
	_resizeMap(true);
	// load country dropdown
	doAction('get_country');
	// initialize map
	initialize();
})

// -------------------------------------------------
// public functions
// -------------------------------------------------
function initialize() {
	if (GBrowserIsCompatible()) {
		// initialize geocoder
		cg = new GClientGeocoder();
		// initialize map
		map = new GMap2($('#gmap')[0]);
		// configure map
		map.addControl(new GMapTypeControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,10)));
		map.addControl(new GSmallMapControl(), new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,50)));
		map.enableScrollWheelZoom();
		map.setMapType(G_NORMAL_MAP);
		
		if(ic != '') {
			cg.getLatLng(ic, function(point) {
				if(!point) _setInitMap();
				else map.setCenter(point, zoomCountry);
			});
		}
		else {
			_setInitMap();
		}
	}
}	

function doAction(a) {
	var country = ($('#country').length ? $('#country').val() : '');
	var city 		= ($('#city').length ? $('#city').val() : '');
	
	_showMask(true);
	$.post('ajax_interface.php', { action: a, country: country, city: city },
		function(data) { 
			$('#results').empty();
			map.clearOverlays();
			switch(a) {
				case 'get_country':
					$('#countrySelect').empty().append('<p>Country:</p><p>'+data.select+'</p>');
				break;
				case 'get_city':
					$('#citySelect').empty().append('<p>City:</p><p>'+data.select+'</p>');
					map.setCenter(new GLatLng(data.lat, data.lon), zoomCountry);
				break;
				case 'get_marker':
					//resizeMap(false);
					cg.getLatLng(city, function(point) {
						if(!point)
							$('#searchError').empty().append('<p>ERROR:</p><p>'+city+' not found</p>');
						else {
							map.setCenter(point, zoomCity);
						}
					});
					if(data.loc.length > 0)
						_drawPoints(data.loc);
				break;
			}
			// while(!map.isLoaded()) { }
			_showMask(false);
		}, 'json'
	);
	
	
}

// -------------------------------------------------
// private map functions
// -------------------------------------------------
function _setInitMap() {
	map.setCenter(new GLatLng(0, 0), zoomWorld);
}

function _resizeMap(all) {
	var win		= _getSize(window, false);
	var form 	= _getSize('searchForm', true);
	var mask 	= _getSize(document, false);
	
	if(all) {
		$('#gmap').width(win[0] - sidebarWidth);
		$('#gmap').height(win[1]);
		$('#sidebar').height(win[1]);
		$('#mask').width(mask[0]);
		$('#mask').height(mask[1]);
		$('#loading').css('margin-top', ((mask[1]/2)-(loadingHeight/2)) );
		$('#loading').css('margin-left', ((mask[0]/2)-(loadingWidth/2)) );
	}
	//$('#results').height(win[1] - form[1] - 50);
}

function _drawPoints(loc) {	
	var point 	= new Array();
	var marker 	= new Array();
	var bounds 	= new GLatLngBounds();
	var icon 		= new GIcon(G_DEFAULT_ICON);
	
	$('#results').append('<h1>Stores</h1>');
	map.setZoom(zoomCity);
	
  for(i = 0; i < loc.length; i++) {
		icon.image = markerPath.replace('%s', marks[i]);
  	point.push(new GLatLng(loc[i].lat, loc[i].lon));
		marker.push(new GMarker(point[i], icon));
		map.addOverlay(marker[i]);
		markerSidebarText = '<h4><img src="'+icon.image+'" alt="" />'+loc[i].store+'</h4><p>'+loc[i].street+'<br />'+loc[i].plz+' '+loc[i].city+'</p>';
		markerText = '<h4>'+loc[i].store+'</h4><p>'+loc[i].street+'<br />'+loc[i].plz+' '+loc[i].city+'</p>';
		marker[i].bindInfoWindowHtml(markerText);
		bounds.extend(point[i]);
		_createSidebarEntry(marker[i], markerSidebarText, point[i], i);
  }
  map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
}

function _createSidebarEntry(marker, markerText, point, i) {
	var id = 'entry'+i;
	$('#results').append('<div id="'+id+'" class="result_entry">'+markerText+'</div>');
	GEvent.addDomListener($('#'+id)[0], 'click', function() {
    GEvent.trigger(marker, 'click');
    map.panTo(point);
  });
}

// -------------------------------------------------
// private helper functions
// -------------------------------------------------
function _getSize(obj, id) {
	var elem = (id ? '#'+obj : obj);
	
	var w = $(elem).width();
	var h = $(elem).height();
	
	return (new Array(w, h));
}

function _showMask(status) {
	if(!status) {
		$('#mask').hide();
	}
	else {
		$('#mask').fadeTo('fast', '0.7');
		$('#mask').show();
	}
}
