if (typeof gdf == 'undefined') window.gdf = {};
if (typeof gdf.google == 'undefined') window.gdf.google = {};

gdf.google.initializeGMap = function() {
	if (!GBrowserIsCompatible()) return;

	gdf.google.map = new google.maps.Map2(document.getElementById("map_canvas"));
	gdf.google.map.addMapType(G_PHYSICAL_MAP);

	/*
	 * GDF Controls
	 */
	var mapControlList = [
		{name: 'franceOverview'	, anchor: G_ANCHOR_TOP_LEFT		, offset: {x: 7, y: 7}		, onClick: function () {gdf.callSearchService('aLaUne');}},
		{name: 'normalMap'		, anchor: G_ANCHOR_TOP_RIGHT	, offset: {x: 252, y: 7}	, onClick: function () {gdf.google.map.setMapType(G_NORMAL_MAP);}},
		{name: 'hybridMap'		, anchor: G_ANCHOR_TOP_RIGHT	, offset: {x: 185, y: 7}	, onClick: function () {gdf.google.map.setMapType(G_HYBRID_MAP);}},
		{name: 'satelliteMap'	, anchor: G_ANCHOR_TOP_RIGHT	, offset: {x: 108, y: 7}	, onClick: function () {gdf.google.map.setMapType(G_SATELLITE_MAP);}},
		{name: 'physicalMap'	, anchor: G_ANCHOR_TOP_RIGHT	, offset: {x: 40, y: 7}		, onClick: function () {gdf.google.map.setMapType(G_PHYSICAL_MAP);}},
		{name: 'zoomIn'			, anchor: G_ANCHOR_TOP_RIGHT	, offset: {x: 7, y: 7}		, onClick: function () {gdf.google.map.zoomIn();}},
		{name: 'zoomOut'		, anchor: G_ANCHOR_TOP_RIGHT	, offset: {x: 7, y: 37}		, onClick: function () {gdf.google.map.zoomOut();}}
	];
	for (i = 0; i < mapControlList.length; ++i) {
		(function () {
			var mapControlInfo = mapControlList[i];
			var mapControl = function() {};
			mapControl.prototype = new GControl();
			mapControl.prototype.initialize = function(map) {
				var container = document.createElement("a");
				jQuery(container).css('cursor', 'pointer').html('<img src="imgs/map/control.'+mapControlInfo.name+'.png" />');
				GEvent.addDomListener(container, "click", mapControlInfo.onClick);
				map.getContainer().appendChild(container);
				return container;
			}
			mapControl.prototype.getDefaultPosition = function() {
				return new GControlPosition(mapControlInfo.anchor, new GSize(mapControlInfo.offset.x, mapControlInfo.offset.y));
			}
			gdf.google.map.addControl(new mapControl());
		})();
	}

	mapControlList = [
		{name: 'giteToggler'	, anchor: G_ANCHOR_BOTTOM_LEFT	, offset: {x: 0, y: 0}}
	];
	for (i = 0; i < mapControlList.length; ++i) {
		(function () {
			var mapControlInfo = mapControlList[i];

			var mapControl = function() {};
			mapControl.prototype = new GControl();
			mapControl.prototype.initialize = function(map) {
				var $container = jQuery('<div />');

				for (var j in gdf.giteTypeMap) {
					jQuery('<a class="'+gdf.giteTypeMap[j].name+' active" href="javascript:void(0);">'+gdf.giteTypeMap[j].label.replace(/\(s\)/, 's')+'<br /><span>Masquer</span></a>')
						.click(function() {
							for (var giteType in gdf.giteTypeMap) {
								if (jQuery(this).hasClass(gdf.giteTypeMap[giteType].name))
									break;
							}

							var i, selectedMarkerList = gdf.google.markers[giteType];
							if (jQuery(this).hasClass('active')) {
								jQuery(this).removeClass('active').find('span').html('Afficher');
								for (i = 0; i < selectedMarkerList.length; ++i) selectedMarkerList[i].hide();
							} else {
								jQuery(this).addClass('active').find('span').html('Masquer');
								for (i = 0; i < selectedMarkerList.length; ++i) selectedMarkerList[i].show();
							}
						})
						.appendTo($container);
				}
				jQuery($container).addClass('giteToggler').appendTo(map.getContainer());
				return $container.get(0);
			}
			mapControl.prototype.getDefaultPosition = function() {
				return new GControlPosition(mapControlInfo.anchor, new GSize(mapControlInfo.offset.x, mapControlInfo.offset.y));
			}
			gdf.google.map.addControl(new mapControl());
		})();
	}

	gdf.callSearchService(gdf.defaultSearchAction);

	gdf.google.markers = {};
	for (var i in gdf.giteTypeMap) gdf.google.markers[i] = [];
};

giteResult = function(data, action)
{
	this.gite = data;
	this.giteTypeMap = gdf.giteTypeMap;
	this.$item = jQuery('.resultItem.template').clone().removeClass('template');
	this.marker = null;
	this.action = action || 'searchEngine';
	this.init();
};
giteResult.prototype = {
	init: function() {
		var gite = this.gite;
		var me = this;

		// Events
		this.$item
			.click(function() {
				me.openInfoWindow();
			});

		// Titre
		var giteTitle = [];
		giteTitle.push(gite.titre ? gite.titre : this.giteTypeMap[gite.type].label.replace(/\(s\)/, ''));
		if (gite.commune) giteTitle.push(' '+gdf.translations['at']+' '+gite.commune);
		if (gite.departement) giteTitle.push('('+gite.departement+')');
		jQuery('h4', this.$item).html(giteTitle.join(' ')).addClass(this.giteTypeMap[gite.type].name);

		// Infos
		var giteIdentifier = gite.identifiant.split(/_/);
		giteIdentifier = giteIdentifier.pop();

		var giteInfos = [];
		if (gite.url_mini) giteInfos.push('<img class="giteThumb" src="'+gite.url_mini+'" />');
		if (gite.type) giteInfos.push('<p>'+this.giteTypeMap[gite.type].label.replace(/\(s\)/, '')+'<br />n&deg;'+giteIdentifier+'</p>');
		if (gite.nb_chambres && gite.capacite) giteInfos.push('<p>'+gite.nb_chambres+' '+gdf.translations['chambres'].replace(/\(s\)/, gite.nb_chambres > 1 ? 's' : '')+' - '+gite.capacite+' '+gdf.translations['personnes'].replace(/\(s\)/, gite.capacite > 1 ? 's' : '')+'</p>');
		if (gite.classement_epi) giteInfos.push('<img src="images/common/'+gite.classement_epi+'epis.gif" />');
		if (gite.lien_disponibilites) giteInfos.push('<img src="images/common/picto_dispo.gif" style="margin-left: 3px; border-left: solid 1px gray; padding-left: 3px;" />');
		jQuery('.giteInfos', this.$item).empty().append(giteInfos.join(''));

		this.addMapMarker();
	},

	appendTo: function(target) {
		this.$item.appendTo(target);
	},

	addMapMarker: function() {
		var me = this;

		var markerMouseOver = function() {
			jQuery('.searchMap .results').stop().scrollTo(me.$item, 'slow', {axis: 'y', over: -0.5});
			me.$item.addClass('active');
		};
		var markerMouseOut = function() {
			me.$item.removeClass('active');
		};

		if (this.action == 'searchEngine' || this.action == 'sortGites') {
			var giteIcon = new google.maps.Icon(G_DEFAULT_ICON);
			giteIcon.iconSize = new google.maps.Size(16, 25);
			giteIcon.iconAnchor = new google.maps.Point(8, 25);
			giteIcon.infoWindowAnchor = new google.maps.Point(8, 0);
			giteIcon.image = "imgs/map/marker-" + this.gite.type + ".png";
			giteIcon.shadow = '';
			giteIcon.shadowSize = new google.maps.Size(0, 0);

			var point = new google.maps.LatLng(this.gite.lat, this.gite.lng);
			this.marker = new google.maps.Marker(point, {icon: giteIcon});

			// Events
			google.maps.Event.addListener(this.marker, "click", function () {
				me.openInfoWindow();
			});
			google.maps.Event.addListener(this.marker, "mouseover", markerMouseOver);
			google.maps.Event.addListener(this.marker, "mouseout", markerMouseOut);

			gdf.google.markers[this.gite.type].push(this.marker);
			gdf.google.map.addOverlay(this.marker);
		} else if (this.action == 'aLaUne') {
			var $marker = jQuery('<a class="marker" href="javascript:void(0);"></a>');

			$marker.attr('id', 'marker-'+this.gite.id);
			$marker.css('background-image', 'url(imgs/map/marker-'+this.gite.type+'.png)');
			$marker.click(function () {me.openInfoWindow();});
			$marker.hover(markerMouseOver, markerMouseOut);

			var franceRegionsMapBounds = {
				nw: {lat: 51.00874245880332, lng: -4.872314453125},
				ne: {lat: 51.20874245880332, lng: 10.596435546875},
				sw: {lat: 40.705991504199026, lng: -4.872314453125},
				se: {lat: 39.945991504199026, lng: 10.596435546875}
			};
			var franceRegionsMapSize = {width: jQuery('#franceRegionsMap').width(), height: jQuery('#franceRegionsMap').height()};
			var markerPos = {left: 0, top: 0};
			var lngUnitPixel = franceRegionsMapSize.width / (franceRegionsMapBounds.ne.lng - franceRegionsMapBounds.nw.lng);
			var latUnitPixel = franceRegionsMapSize.height / (franceRegionsMapBounds.nw.lat - franceRegionsMapBounds.sw.lat);
			markerPos.left = Math.abs(lngUnitPixel * (this.gite.lng - franceRegionsMapBounds.nw.lng));
			markerPos.top = Math.abs(latUnitPixel * (this.gite.lat - franceRegionsMapBounds.nw.lat));

			$marker.css({top: markerPos.top+'px', left: markerPos.left+'px'});
			$marker.appendTo('#franceRegionsMap');
		} else {
			alert("Erreur: action de type inconnue : " + action);
		}
	},

	openInfoWindow: function() {
		var me = this;
		var gite = this.gite;
		var $infoWin = jQuery('.giteInfoWindow.template').clone();
		var giteIdentifier = gite.identifiant.split(/_/);
		giteIdentifier = giteIdentifier.pop();

		// Titre
		var giteTitle = [];
		giteTitle.push(gite.titre ? gite.titre : this.giteTypeMap[gite.type].label.replace(/\(s\)/, ''));
		if (gite.commune) giteTitle.push(' '+gdf.translations['at']+' '+gite.commune);
		if (gite.departement) giteTitle.push('('+gite.departement+')');
		jQuery('h4', $infoWin).html(giteTitle.join(' '));
		jQuery('.giteType', $infoWin).html(this.giteTypeMap[gite.type].label.replace(/\(s\)/, '')+' n&deg;'+giteIdentifier);
		jQuery('img.giteThumb', $infoWin).attr('src', gite.url_big);

		// Adresse
		var giteAddress = [];
		if (gite.adresse_1) giteAddress.push(gite.adresse_1);
		if (gite.adresse_2) giteAddress.push(gite.adresse_2);
		giteAddress.push('<br />');
		if (gite.code_postal) giteAddress.push(gite.code_postal);
		if (gite.ville) giteAddress.push(gite.ville);
		var $p = jQuery('.adresse', $infoWin).html(giteAddress.join(' '));
		for (var i in this.giteTypeMap) $p.removeClass(this.giteTypeMap[i].name);
		$p.addClass(this.giteTypeMap[gite.type].name);

		jQuery('.capacite', $infoWin).html(gite.nb_chambres+' '+gdf.translations['chambres'].replace(/\(s\)/, gite.nb_chambres > 1 ? 's' : '')+' - '+gite.capacite+' '+gdf.translations['personnes'].replace(/\(s\)/, gite.capacite > 1 ? 's' : ''));
		jQuery('a.descriptif', $infoWin).attr('href', gite.fiche);
		if (gite.lien_disponibilites) jQuery('a.descriptif', $infoWin).after('<a class="disponibilites" href="disponibilite.php?id='+gite.identifiant+'" target="_blank"><span>'+gdf.translations['voir_disponibilites']+'</span></a>');
		jQuery('a.memoriser', $infoWin).attr('href', "javascript:ajoutSelection('"+gite.identifiant+"', '"+gdf.user_id+"');")
		jQuery('.pictoList', $infoWin).append('<li><img src="images/common/'+gite.classement_epi+'epis.gif" /></li>');
		var giteAttributes = ['piscine', 'restauration', 'handicape', 'animal'];
		for (i = 0; i < giteAttributes.length; ++i)
			if (parseInt(gite[giteAttributes[i]]))
				jQuery('.pictoList', $infoWin).append('<li><img src="images/common/picto_'+giteAttributes[i]+'.gif" /></li>');
			else if (giteAttributes[i] == 'animal')
				jQuery('.pictoList', $infoWin).append('<li><img src="images/common/picto_'+giteAttributes[i]+'_no.gif" /></li>');

		this.$item.addClass('selected');

		// Create InfoWindow
		if (this.action == 'searchEngine' || this.action == 'sortGites') {
			this.marker.openExtInfoWindow(gdf.google.map, "GMapInfoWindow", $infoWin.html(), {paddingX: 50, paddingY: 50});
			jQuery('#GMapInfoWindow a.close').click(function () { gdf.google.map.closeExtInfoWindow(); });
			jQuery('#GMapInfoWindow_contents').addClass('giteInfoWindow');
			GEvent.addListener(gdf.google.map, 'extinfowindowclose', function () { me.$item.removeClass('selected'); });

			var bugInfoWindowCounter = 5;
			setTimeout(function () {
					if (!bugInfoWindowCounter--) return;
					gdf.google.map.zoomIn(new google.maps.LatLng(me.gite.lat, me.gite.lng));
					gdf.google.map.zoomOut(new google.maps.LatLng(me.gite.lat, me.gite.lng));
					}, 100);
		} else if (this.action == 'aLaUne') {
			jQuery('#franceRegionsMap .giteInfoWindow').remove();

			jQuery('a.close', $infoWin).attr('href', 'javascript:void(0)').click(function() {$infoWin.remove();me.$item.removeClass('selected');});
			$infoWin.removeClass('template').appendTo('#franceRegionsMap');
		} else {
		}
	}
};

gdf.callSearchService = function(action, params)
{
	gdf.populateSearchForm(window.gdf.searchParams);

	jQuery('#frm_recherche .submit input').hide();
	jQuery('#frm_recherche .submit .loader').show();

	action = action || 'searchEngine';
	params = params || '';
	jQuery.getJSON('amfphp/json.php/searchGites.'+action+'/'+params, function (data) {
		if (data == null) {
			// Ajax loader
			jQuery('#frm_recherche .submit .loader').hide();
			jQuery('#frm_recherche .submit :input').show();
			return;
		}

		var i;
		var resultStats = {
			1: 0,
			2: 0,
			3: 0
		};
		var mapBounds;

		// Reset results
		jQuery('.searchMap .resultItem').not('.template').remove();
		for (var giteType in gdf.google.markers)
			for (i = 0; i < gdf.google.markers[giteType].length; ++i)
				gdf.google.map.removeOverlay(gdf.google.markers[giteType][i]);
		gdf.google.map.closeExtInfoWindow();
		jQuery('.searchMap .noResult').hide();
		if (action == 'searchEngine') jQuery('.searchMap select[name=sort]').val(0);

		var firstRes = null
		for (i = 0; i < data.length; ++i) {
			if (firstRes == null) firstRes = data[i];
			var gite = new giteResult(data[i], action);
			gite.appendTo('.results');

			// Computing map bounds
			if (mapBounds == null) {
				mapBounds = new google.maps.LatLngBounds(
					new google.maps.LatLng(data[i].lat, data[i].lng),
					new google.maps.LatLng(data[i].lat, data[i].lng)
				);
			} else {
				mapBounds.extend(new google.maps.LatLng(data[i].lat, data[i].lng));
			}

			resultStats[data[i].type]++;
		}

		// Center Map on search results
		if (mapBounds) {
			gdf.google.map.setCenter(mapBounds.getCenter());
			var zoom = gdf.google.map.getBoundsZoomLevel(mapBounds);
			gdf.google.map.setZoom(zoom < 11 ? zoom : 11);
		}

		var resultStatsHtml = [], resultsTotal = 0;
		for (type in resultStats) {
			if (!resultStats[type]) continue;
			resultStatsHtml.push(resultStats[type]+' '+gdf.giteTypeMap[type].label.replace(/\(s\)/, resultStats[type] > 1 ? 's' : ''));
			resultsTotal += resultStats[type];
		}

		if (resultsTotal) {
			if (action == 'aLaUne') {
				jQuery('.searchMap .resultActions').hide();
				jQuery('#franceRegionsMap').css('z-index', 2);
				jQuery('#map_canvas').css('z-index', 1);
				jQuery('.searchMap .header div').show();
				jQuery('.searchMap .header .resultStats').hide();
			} else {
				var lastVal = resultStatsHtml.pop();
				resultStatsHtml = (resultStatsHtml.length > 0)
									? resultStatsHtml.join(', ')+' '+gdf.translations['et']+' '+lastVal
									: lastVal;
				jQuery('.searchMap .resultStats span').html(resultStatsHtml);
				jQuery('.searchMap .resultStats').show();
				jQuery('.searchMap .header div').hide();

				jQuery('.regionBubble').fadeOut('fast');
				jQuery('#franceRegionsMap').css('z-index', '1');
				jQuery('#map_canvas').css('z-index', '2');
			}
		} else {
			jQuery('.searchMap .resultStats span').html('Aucune chambre d\'h&ocirc;te trouv&eacute;e');
			jQuery('.searchMap .resultActions').hide();
			jQuery('.searchMap .noResult').show();
			jQuery('#franceRegionsMap').css('z-index', '2');
			jQuery('#map_canvas').css('z-index', '1');
		}

		// Ajax loader
		jQuery('#frm_recherche .submit .loader').hide();
		jQuery('#frm_recherche .submit :input').show();
	});
};

gdf.populateSearchForm = function(data) {
	if (typeof data != 'object') return;

	for (var i in data) {
		if (jQuery('#'+i).is(':checkbox') || jQuery('#'+i).is(':radio')) {
			if (data[i]) jQuery('#'+i).attr('checked', 'checked');
			else jQuery('#'+i).removeAttr('checked');
		} else {
			jQuery('#'+i).val(data[i]);
		}
	}
};

(function($) {
	$(function() {
		if ($.browser.msie && $.browser.version == '8.0')
			$('head').append('<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />');

		$('img[usemap]').maphilight({
			fillColor: '863225',
			fillOpacity: 1,
			stroke: false
		});

		var $regionBubble = $('.regionBubble');
		var areaEnterDate = null;
		$('area')
			.mouseover(function(e) {
				areaEnterDate = new Date();
				$regionBubble
					.html($('ul.regions li.'+this.title.toLowerCase()).html())
					.css({
						left: e.pageX - ($regionBubble.width() / 2),
						top: e.pageY - $regionBubble.height() - 20
					})
					.fadeIn('fast');
			})
			.mouseout(function(e) {
				var areaLeaveDate = new Date();

				setInterval(function() {
					if (areaEnterDate > areaLeaveDate) return;
					$regionBubble.fadeOut('fast');
				}, 100)
			})
			.click(function () {
				// Reset the search form
				jQuery('#centre').val('');
				jQuery('#commune').val('');
				jQuery('#reference').val('');

				jQuery('#region').val('r'+this.className.substr((new String('region_')).length));
				callExternalInterface();
			});
		$(document.body)
			.mousemove(function(e) {
				$regionBubble.css({
					left: e.pageX - ($regionBubble.width() / 2),
					top: e.pageY - $regionBubble.height() - 20
				});
			});


	});
	$(window).load(function () {
		gdf.google.initializeGMap();
	});
})(jQuery);

