// Google maps
var map;
var gps;
var geocoder;
var selection;

// Données
var revendeurs; 

// Elements DOM
var results;
var input;
var contrat;
var carte;
var infos;
var scroll;
var scroller;
var scroller2;

// Configuration
if(COUNTRY == 'US') var centre = {
	lat: 41.376808,
	lng: -97.0312,
	zoom: 3
}
else var centre = {
	lat: 6.315299,
	lng: 0,
	zoom: 1
}

window.addEvent('domready', function(){
	results = $('results');
	input = $('form-reseau-recherche');
	contrat = $('form-reseau-contrat');
	carte = $('map');
	infos = $('infos');
	scroll = $('scroll-result');
	if(carte && input){
		if (GBrowserIsCompatible()) {
			map = new GMap2(carte);
			gps = new GPS(4, true);
			geocoder = new GClientGeocoder();
			geocoder.setBaseCountryCode(LANGUAGE);
			map.addControl(new GLargeMapControl());
			map.addControl(new GMapTypeControl());
			map.setCenter(new GLatLng(centre.lat, centre.lng), centre.zoom);
		}
		input.getParent().getParent().getParent().addEvent('submit', function(event){
			event = new Event(event).stop();
			getRevendeurs.request('q='+input.value+'&contrat='+contrat.options[contrat.selectedIndex].value);
		});
		
		//scroller = new Scroller(scroll, {area: 100, velocity: 1});
		scroller2 = new Fx.Scroll(scroll, {wait: false, duration: 250, offset: {x: 0, y: 0}}); // y: -35
		//scroll.addEvent('mouseover', scroller.start.bind(scroller));
		//scroll.addEvent('mouseout', scroller.stop.bind(scroller));
		
		// Hack IE
		/*if(window.ie){
			var reduire = function(){
				this.setStyles({
					position: 'relative',
					width:50
				});
			}
			var agrandir = function(event){
				this.setStyles({
					position: 'absolute',
					'margin-top': 1,
					width: 105
				});
				this.addEvent('mouseleave', reduire);
			}
			$('form-reseau-pays').addEvents({
				mouseenter: agrandir,
				mouseleave: reduire,
				click: function(){
					this.removeEvent('mouseleave', reduire);
				},
				change: function(){
					this.setStyles({
						position: 'relative',
						width: 50
					});
					this.addEvent('mouseleave', reduire);
				}
			});
		}*/
	}else{
		$('form-reseau-pays').addEvent('change', function(){
			this.form.submit();
		});
	}
});
window.addEvent('unload', function(){
	GUnload();
});

var getRevendeurs = new Ajax('json/revendeurs2.php', {
	onRequest: function(){
		input.addClass('loading');
		carte.setStyle('display', 'block');
		infos.setStyle('display', 'none');
	},
	onComplete: function(json){
		revendeurs = Json.evaluate(json).revendeurs;
		var nbRevendeurs = revendeurs.length;
		var bounds = new GLatLngBounds();
		map.clearOverlays();
		if(nbRevendeurs == 0){
			geocoder.getLocations(input.value, function(response){
				if(!response || response.Status.code != 200){
					results.empty();
					new Element('li').setHTML('<span><strong>'+gettext('Aucun resultat')+'</strong> '+gettext("Essayez d'elargir votre recherche")+'</span>').injectInside(results);
					map.setCenter(new GLatLng(centre.lat, centre.lng), centre.zoom);
					input.removeClass('loading');
				}else{
					var lat = response.Placemark[0].Point.coordinates[1];
					var lng = response.Placemark[0].Point.coordinates[0];
					if(response.Placemark[0].AddressDetails.Country.CountryNameCode != 'FR'){
						results.empty();
						new Element('li').setHTML('<span><strong>'+gettext('Aucun resultat')+'</strong> '+gettext('Votre recherche n\'a donné aucun résultat en France.')+'</span>').injectInside(results);
						new Element('li', {'class': 'distributeurs'}).setHTML('<span><a href="/fr/reseau/importateurs/">Distributeurs Cabasse hors France métropolitaine</a></span>').injectInside(results);
						map.setCenter(new GLatLng(centre.lat, centre.lng), centre.zoom);
						input.removeClass('loading');
					}else{
						var center = new GLatLng(lat, lng);
						bounds.extend(center);
						var latConv = center.distanceFrom(new GLatLng(lat+0.1, lng))/100;
						var lngConv = center.distanceFrom(new GLatLng(lat, lng+0.1))/100;
						new Ajax('json/revendeurs2.php', {
							onRequest: function(){
								input.addClass('loading');
							},
							onComplete: function(json){
								var json = Json.evaluate(json);
								revendeurs = json.revendeurs;
								nbRevendeurs = revendeurs.length;
								if(nbRevendeurs == 0){
									results.empty();
									new Element('li').setHTML('<span><strong>'+gettext('Aucun resultat')+'</strong> '+gettext("Essayez d'elargir votre recherche")+'</span>').injectInside(results);
									map.setCenter(new GLatLng(centre.lat, centre.lng), centre.zoom);
									input.removeClass('loading');
								}else{
									results.empty();
									new Element('li').setHTML('<span>'+sprintf(_('Revendeurs les plus proches dans un rayon de %s km'), json.rayon)+' : </span>').injectInside(results);
									for(var i = 0; i < nbRevendeurs; i++) createRevendeur(revendeurs[i], bounds);
	
									// Center & zoom
									centerAndZoomOnBounds(bounds);
									map.savePosition();
									input.removeClass('loading');
								}
								if(nbRevendeurs > 8) scroll.addClass('scroll');
								else scroll.removeClass('scroll');
							}, 
							onFailure: function(){
								revendeurs = false; 
								input.removeClass('loading').addClass('error');
							}
						}).request('lat='+lat+'&lng='+lng+'&latConv='+latConv+'&lngConv='+lngConv+'&contrat='+contrat.options[contrat.selectedIndex].value);
					}
				}
			});
		}else{
			results.empty();
			for(var i = 0; i < nbRevendeurs; i++) createRevendeur(revendeurs[i], bounds);
			
			// Center & zoom
			centerAndZoomOnBounds(bounds);
			map.savePosition();
			input.removeClass('loading');
		}
		if(nbRevendeurs > 8) scroll.addClass('scroll');
		else scroll.removeClass('scroll');
	}, 
	onFailure: function(){
		revendeurs = false; 
		input.removeClass('loading').addClass('error');
	}
});

function centerAndZoomOnBounds(bounds) {
	var center = bounds.getCenter(); 
	var newZoom = map.getBoundsZoomLevel(bounds);
	if (map.getZoom() != newZoom) map.setCenter(center, newZoom); 
	else map.panTo(center);  
}

function createRevendeur(revendeur, bounds){
	// Bounds
	var latlng = new GLatLng(revendeur.latitude, revendeur.longitude);
	bounds.extend(latlng);
	
	var html = '<strong>'+revendeur.nom+'</strong> '+revendeur.adresse+', '+revendeur.cp+' '+revendeur.ville+'<br/><em>';
	if(revendeur.type == 'revendeur') html += sprintf(_('Distributeur agree %s'), revendeur.contrats);
	else html += _('Importateur');
	html += '</em>';
	
	// Marker & link init
	revendeur.marker = new GMarker(latlng, {title: revendeur.nom+' ('+gps.format(revendeur.latitude, true)+', '+gps.format(revendeur.longitude, false)+')', icon: new GIcon(G_DEFAULT_ICON, 'img/carte/'+revendeur.contrat+'.png')});
	revendeur.lien = new Element('a', {href: '#revendeur:'+revendeur.id, title: revendeur.nom}).addClass('contrat-'+revendeur.contrat).setHTML(html);
	
	// Binding
	revendeur.lien.revendeur = revendeur;
	revendeur.marker.revendeur = revendeur;
	
	// Marker events
	GEvent.addListener(revendeur.marker, 'click', function(){
		//window.location = '#revendeur:'+revendeur.id;
		showRevendeur(this.revendeur);
	});
	GEvent.addListener(revendeur.marker, 'mouseover', function(){
		this.setImage('img/carte/'+this.revendeur.contrat+'-over.png');
		this.revendeur.lien.addClass('hover');
		scroller2.toElement(this.revendeur.lien);
	});
	GEvent.addListener(revendeur.marker, 'mouseout', function(){
		this.setImage('img/carte/'+this.revendeur.contrat+'.png');
		this.revendeur.lien.removeClass('hover');
	});
	
	// Link events
	revendeur.lien.addEvents({
		click: function(event){
			event = new Event(event).stop();
			showRevendeur(this.revendeur);
		},
		mouseover: function(event){
			this.revendeur.marker.setImage('img/carte/'+this.revendeur.contrat+'-over.png');
			map.panTo(new GLatLng(this.revendeur.latitude, this.revendeur.longitude));
		},
		mouseout: function(event){
			this.revendeur.marker.setImage('img/carte/'+this.revendeur.contrat+'.png');
		}
	});
	
	// Marker & link injection
	map.addOverlay(revendeur.marker, 0);
	revendeur.lien.injectInside(new Element('li').injectInside(results));
}

function showRevendeur(revendeur){
	carte.setStyle('display', 'none');
	infos.setStyle('display', 'block');
	infos.empty();
	new Element('h4').setText(revendeur.nom).injectInside(infos);
	var contact = new Element('ul').addClass('contact').injectInside(infos);
	if(revendeur.adresse && revendeur.cp && revendeur.ville) new Element('li').addClass('adresse').setHTML('<strong>Adresse : </strong>'+revendeur.adresse+', '+revendeur.cp+' '+revendeur.ville).injectInside(contact);
	if(revendeur.tel) new Element('li').addClass('telephone').setHTML('<strong>Téléphone : </strong>'+revendeur.tel).injectInside(contact);
	if(revendeur.fax) new Element('li').addClass('fax').setHTML('<strong>Fax : </strong>'+revendeur.fax).injectInside(contact);
	if(revendeur.email) new Element('li').addClass('email').setHTML('<strong>E-mail : </strong>'+revendeur.email).injectInside(contact);
	if(revendeur.url) new Element('li').addClass('url').setHTML('<strong>Site internet : </strong>'+revendeur.url).injectInside(contact);
	if(revendeur.showroom != 0) new Element('a', {href:'#', events: {click: function(event){
		event = new Event(event).stop();
		Mediabox.open('http://www.cabasse.com/pages/showroom.php?vcli='+revendeur.id, revendeur.nom+' : matériel en démonstration', 'mediabox[850 500]');
	}}}).setText('Voir le matériel en démonstration').injectInside(new Element('li').addClass('showroom').injectInside(contact));
	//new Element('h4').setText(_('Contrats')).injectInside(infos);
	var contrats = new Element('ul').addClass('contrats').injectInside(infos);
	if(revendeur.contrat_artis) new Element('img', {src: '../img/contrats/artis-3b.png', alt: 'Artis'}).injectInside(new Element('li').injectInside(contrats));
	if(revendeur.contrat_idea) new Element('img', {src: '../img/contrats/idea-3b.png', alt: 'Idea'}).injectInside(new Element('li').injectInside(contrats));
	if(revendeur.contrat_oceo) new Element('img', {src: '../img/contrats/oceo-3b.png', alt: 'Oceo'}).injectInside(new Element('li').injectInside(contrats));
	new Element('a', {href: '#', title: _('Retour a la carte'), id: 'retour-carte', events: {click: function(event){
		event = new Event(event).stop();
		carte.setStyle('display', 'block');
		infos.setStyle('display', 'none');
	}}}).setText(_('Retour a la carte')).injectInside(infos);
}

// Formatage des coordonnées GPS
var GPS = new Class({
	initialize: function(prec, card){
		if (prec) this.prec = prec;
		else this.prec = 0;
		if (card) this.card = true;
		else this.card = false; 
	},
	getCard: function(positive, lat) {
		if (lat) return positive ? "N" : "S";
		else return positive ? "E" : "O";
	},
	formatToDegMinSec : function(value, lat) {
		var prec = this.prec;
		var precMul = Math.pow(10, prec);
		var neg = value < 0 ? true : false;
		if (neg) value = -value;
		var degs = Math.floor(value);
		value -= degs;
		value *= 60;
		degs = degs.toString();
		if (neg && ! this.card) degs = "-"+degs;
		var mins = Math.floor(value);
		value -= mins;
		value *= 60;
		mins = mins.toString();
		var secs = value.toFixed(prec).toString();
		if (prec > 0) prec++;
		while(degs.length < 2) degs = "0" + degs;
		while(mins.length < 2) mins = "0" + mins;
		while(secs.length < 2 + prec) secs = " " + secs;
		return degs + '°' + mins + "'" + secs + '"' + (this.card ? this.getCard(!neg, lat) : "");
	},   
	formatToDegMin: function (value, lat) {
		var prec = this.prec;
		var precMul = Math.pow(10, prec);
		var neg = value < 0 ? true : false;
		if (neg) value = -value;
		var degs = Math.floor(value);
		value -= degs;
		value *= 60;
		degs = degs.toString();
		if (neg && ! this.card) degs = "-"+degs;
		var mins = value.toFixed(prec).toString();
		if (prec > 0) prec++;
		while(degs.length < 2) degs = "0" + degs;
		while(mins.length < 2 + prec) mins = "0" + mins;
		return degs + '°' + mins + "'" + (this.card ? this.getCard(!neg, lat) : "");
	},    
	formatToDec: function (value, lat) {
		var prec = this.prec;
		var precMul = Math.pow(10, prec);
		var neg = value < 0 ? true : false;
		if (neg) value = -value;
		var degs = value.toFixed(prec).toString();
		if (neg && ! this.card) degs = "-"+degs;
		if (prec > 0) prec++;
		while(degs.length < 3 + prec) degs = "0" + degs;
		return degs + '°' + (this.card ? this.getCard(!neg, lat) : "");
	}, 
	format: function(value, lat) {
		return this.formatToDegMin(value, lat);
	}
});

function firePos(){
	alert(map.getCenter().lat()+', '+map.getCenter().lng()+' - '+map.getZoom());
}