var markers = [];
var count = 0;

GoogleMapAPI = function(config)
{
	this.name = typeof config.name == "undefined" ? "map" : config.name;
	this.addMarker = function(marker) { GoogleMapAPI.addMarker(marker); };
	this.addListMarker = function(list_marker) { GoogleMapAPI.addListMarker(list_marker); };
	this.load = function() { GoogleMapAPI.load(this); };
}

GoogleMapAPI.checkMarker = function(marker)
{
	test = true;
	if(typeof marker != "object") test = false;
	else if(marker['address'] == '') test = false;
	else if(marker['lat'] == 0 || marker['lon'] == 0) GoogleMapAPI.addMarkerByAddress(marker);
	else GoogleMapAPI.addMarkerByCoord(marker);
	return test;
}

GoogleMapAPI.addMarkerByCoord = function(marker)
{
	var point = new GLatLng(marker['lat'], marker['lon']);
	var mark = GoogleMapAPI.createMarker(point,'',marker['html'], marker['icon']);
	map.addOverlay(mark);
	markers[count] = mark;
	count++;
}

GoogleMapAPI.addMarkerByAddress = function(marker)
{
	var geocoder = new GClientGeocoder();
	geocoder.getLatLng(marker['address'], function (coord)
		{
			if(coord)
			{
				marker['lat'] = coord.lat();
				marker['lon'] = coord.lng();
				GoogleMapAPI.addMarkerByCoord(marker);
			}
		});
}

GoogleMapAPI.addListMarker = function(list_marker)
{
	markers = [];
	count = 0;
	var temp = 0;
	map.clearOverlays();
	for(id in list_marker)
	{
		if(GoogleMapAPI.checkMarker(list_marker[id])) temp++;
	}

	// Repositionnement
	if(temp == 0) map.setCenter(new GLatLng(47, 2), 5, G_NORMAL_MAP);
	inProcess(false);
}

GoogleMapAPI.createMarker = function(point, title, html, icon)
{
	var options = {maxWidth:300};
	if(icon == 0) var marker = new GMarker(point);
	else var marker = new GMarker(point, {'icon':icons[icon]});
	if(isArray(html)) { GEvent.addListener(marker, 'click', function() { marker.openInfoWindowTabsHtml(html); }); }
	else { GEvent.addListener(marker, 'click', function() { marker.openInfoWindowHtml(html, options); }); }
	return marker;
}

GoogleMapAPI.load = function(obj)
{
	if (GBrowserIsCompatible())
	{
		var mapObj = document.getElementById(obj.name);

		if (mapObj != 'undefined' && mapObj != null)
		{
			map = new GMap2(document.getElementById(obj.name));
			map.setCenter(new GLatLng(47, 2), 6, G_NORMAL_MAP);
			map.addControl(new GLargeMapControl());
			map.addControl(new GMapTypeControl());
			map.addControl(new GScaleControl());
			map.addControl(new GOverviewMapControl());
			GoogleMapAPI.switchView();
		}
	}
	else
	{
		alert('Votre navigateur ne peut pas afficher la carte.');
	}
}

/* --------------------------------------------------- */
/* Fonctions de gestion des différentes vue ---------- */
/* --------------------------------------------------- */

var cities = [];
var cities_count = 0;

function setCountryView()
{
	inProcess(true);
	map.clearOverlays();
	// Affiche les 6 plus grandes villes de france
	//ajax.send({url:'GMData.php?mode=view&type=country', callback:{type:"function", name:"addListCity", format:"json"}});
	map.setCenter(new GLatLng(46.6795, 1.8457), 5);
	map.savePosition();
	inProcess(false);
}

function addListCity(list_city)
{
	for(key in list_city)
	{
		addCity(list_city[key]);
	}
	inProcess(false);
}

function addCity(city)
{
	var point = new GLatLng(city['lat'], city['lon']);
	var mark = createCity(point, city['name']);
	map.addOverlay(mark);
}

function createCity(point, html)
{
	var marker = new GMarker(point, {icon:icons['city']});
	GEvent.addListener(marker, 'click', function()
	{
		inProcess(true);
		map.setCenter(point, 11);
		ajax.send({url:'GMData.php?type[]=city&value[]='+html, callback:{type:"function", name:"GoogleMapAPI.addListMarker", format:"json"}});
	});
	return marker;
}

function setMyView(me)
{
	map.setCenter(new GLatLng(46.6795, 1.8457), 5);
	ajax.send({url:'GMData.php?type[]=me&value[]='+me, callback:{type:"function", name:"GoogleMapAPI.addListMarker", format:"json"}});
}

function setCenter(address)
{
	var geocoder = new GClientGeocoder();
	geocoder.getLatLng(address, function (coord)
		{
			if(coord)
			{
				map.setCenter(coord, 11);
			}
		});
}

/* --------------------------------------------------- */
/* --------------------------------------------------- */
/* --------------------------------------------------- */

function dump(obj)
{
	text = '';
	for(key in obj) text += key+" : "+obj[key]+"\n";
	alert(text);
}

function inProcess(state)
{
	if(document.getElementById('process') == null)
	{
		alert('DIV Process manquant.');
		return false;
	}

	if(state) document.getElementById('process').style.display = "block";
	else document.getElementById('process').style.display = "none";
}

function isArray(a) {return isObject(a) && a.constructor == Array;}
function isObject(a) {return (a && typeof a == 'object') || isFunction(a);}
function isFunction(a) {return typeof a == 'function';}

