var Lecteur = {

	listeEvenement: {},
	listeLapin: {},
	listeEtat: {},
	listePosition: {},
	
	mode: 'normal',
	
	jSol: null,
	solX: 0,
	longueurCourse: null,
	debutTime: null,
	
	idCamera: null,
	idJoueur: null,
	tempsFeux: 7,
	tempsMax: null,
	
	decalDebut: 200,
	decalFin: 300,

	init: function() {
		
		Lecteur.jSol = $("#sol");
		
		for (idLapin in Lecteur.listeLapin) {
			Lecteur.initEtat(idLapin);
			Lecteur.suivant(idLapin);
			Lecteur.initPosition(idLapin);
			Lecteur.afficheLapin(idLapin, 0, 0);
		}
		
		Lecteur.idCamera = Lecteur.getCamera();
		
		if (Lecteur.mode === 'mini') {
			Lecteur.decalDebut = 0;
			Lecteur.decalFin = 30;
		}
	},
	
	getCamera: function() {
	
		var idPremierLapin = null;
	
		for (idLapin in Lecteur.listeLapin) {
		
			if (idPremierLapin === null) {
				idPremierLapin = idLapin;
			}
		
			if (Lecteur.listeLapin[ idLapin ].idJoueur === Lecteur.idJoueur) {
				return idLapin;
			}
		}
		
		return idPremierLapin;		
	},
	
	initPosition: function(idLapin) {
		
		// TODO comprendre a quoi servait cette ligne
		// var position = $('#fenetre').position();
		
		var nbLapin = keys(Lecteur.listePosition);
		nbLapin = nbLapin.length;

		Lecteur.listePosition[ idLapin ] = {};
		Lecteur.listePosition[ idLapin ].top = 95 + nbLapin * 77;
		Lecteur.listePosition[ idLapin ].left = 0;
	},

	feux: function() {
	
		Lecteur.tempsFeux--;
		
		$('#feux, #feux-mini').html(Lecteur.tempsFeux);
		
		if (Lecteur.tempsFeux > 0) {
			window.setTimeout(Lecteur.feux, 1000);
			return ;
		}
		
		$('#feux, #feux-mini').hide();
		
		var date = new Date();
		Lecteur.debutTime = date.getTime();
		
		Lecteur.bouge();
	},

	bouge: function() {
	
		var date = new Date();
		var actuel = (date.getTime() - Lecteur.debutTime) / 1000;

		for (idLapin in Lecteur.listeLapin) {
		
			var x = Lecteur.calculX(idLapin, actuel);
			
			if (idLapin === Lecteur.idCamera) {
				var camera = x;
			}
			
			Lecteur.afficheLapin(idLapin, x, actuel);
			
			if (Lecteur.listeEtat[ idLapin ].evenementSuivant !== null && Lecteur.listeEtat[ idLapin ].evenementSuivant.temps <= actuel) {
				Lecteur.suivant(idLapin);
			}
		}

		if (camera > Lecteur.decalDebut && camera < Lecteur.longueurCourse - Lecteur.decalFin) {
			Lecteur.solX = - (camera - Lecteur.decalDebut);
		}
		
		Lecteur.jSol.css({'left': parseInt(Lecteur.solX)+'px'});
		
		$('#chrono').html(parseInt(actuel));
		$('#debugX').html(parseInt(camera / 50));
		
		if (actuel < Lecteur.tempsMax) {
			window.setTimeout(Lecteur.bouge, 50);
		}
		else {
			Lecteur.fin();
		}
	},
	
	afficheLapin: function(idLapin, x, actuel) {
		
		var decaleX = 0;
		var decaleY = 0;
				
		if (Lecteur.listeEtat[ idLapin ].evenementActuel.type === 'trou') {
			var position = parseInt((actuel * 7) % 2);
			var background = '-160px -' + (320 + position * 80)  + 'px';
		}
		else if (Lecteur.listeEtat[ idLapin ].evenementActuel.type === 'mange') {
			var position = parseInt((actuel * 7) % 2);
			var background = '-240px -' + (320 + position * 80)  + 'px';
		}
		else if (Lecteur.listeEtat[ idLapin ].isPapi === true) {
			var position = parseInt((actuel * 7) % 2);
			var background = '-80px -' + (320 + position * 80)  + 'px';
		}
		else if (Lecteur.listeEtat[ idLapin ].isFatigue === false) {
			var position = parseInt((x / 15) % 5);
			var background = '-' + position * 80 + 'px -80px';
			
			if (position === 0) { decaleX = 0; decaleY = 0; };
			if (position === 1) { decaleX = 10; decaleY = -5; };
			if (position === 2) { decaleX = 20; decaleY = -10; };
			if (position === 3) { decaleX = 30; decaleY = -5; };
			if (position === 4) { decaleX = 40; decaleY = 0; };
		}
		else {
			var position = parseInt((x / 15) % 2);
			var background = '0px -' + (320 + position * 80)  + 'px';
		}
		
		var y = Lecteur.listePosition[ idLapin ].top;
		
		$('#lapin-' + idLapin).css({
			'background-position': background,
			'left': Lecteur.listePosition[ idLapin ].left + Lecteur.solX + x + decaleX + 180,
			'top': y + decaleY
		});
	},
	
	calculX: function(idLapin, actuel) {
	
		var x;
		
		if (Lecteur.listeEtat[ idLapin ].phase === 'turbo') {
			x = Lecteur.turboX(idLapin, actuel - Lecteur.listeEtat[ idLapin ].evenementActuel.temps);
		}
		else if (Lecteur.listeEtat[ idLapin ].phase === 'constante') {
			x = Lecteur.constanteX(idLapin, actuel - Lecteur.listeEtat[ idLapin ].evenementActuel.temps);
		}
		else {
			x=0;
		}
		
		x += Lecteur.listeEtat[ idLapin ].evenementActuel.position;
		return x;
	},
	
	initEtat: function(idLapin) {
	
		Lecteur.listeEtat[ idLapin ] = {
			evenementActuel: null,
			evenementSuivant: null,
			phase: 'turbo',
			isFatigue: false,
			justFatigue: false,
			isPapi: false,
			justFinPapi: false
		};
	},
	
	suivant: function(idLapin) {

		var informatif = false;

		var kEvent = keys(Lecteur.listeEvenement[ idLapin ]);
		var nEvent = Lecteur.listeEvenement[ idLapin ][ kEvent[0] ];
		
		if (Lecteur.listeEtat[ idLapin ].justFatigue === true) {
			if (Lecteur.listeEtat[ idLapin ].isPapi === false) {
				Lecteur.listeLapin[ idLapin ].vitesseCalcul /= 2;
			}
			Lecteur.listeEtat[ idLapin ].justFatigue = false;
		}
		
		if (nEvent.type === 'fatigue') {
			Lecteur.listeEtat[ idLapin ].isFatigue = true;
			informatif = true;
			Lecteur.listeEtat[ idLapin ].justFatigue = true;
		}

		if (informatif === false) {
			Lecteur.listeEtat[ idLapin ].evenementActuel = nEvent;
		}
		
		if (kEvent[1] !== undefined) {
			Lecteur.listeEtat[ idLapin ].evenementSuivant = Lecteur.listeEvenement[ idLapin ][ kEvent[1] ];
		}
		else {
			Lecteur.listeEtat[ idLapin ].evenementSuivant = null;
		}
		
		delete Lecteur.listeEvenement[ idLapin ][ kEvent[0] ];
		
		if (informatif === true) {
			return ;
		}
		
		if (Lecteur.listeEtat[ idLapin ].evenementActuel.type === 'debut') {
			Lecteur.listeEtat[ idLapin ].phase = 'turbo';
		}
		if (Lecteur.listeEtat[ idLapin ].evenementActuel.type === 'vmax') {
			Lecteur.listeEtat[ idLapin ].phase = 'constante';
		}
		if (Lecteur.listeEtat[ idLapin ].evenementActuel.type === 'trou') {
			Lecteur.listeEtat[ idLapin ].phase = 'stop';
		}
		if (Lecteur.listeEtat[ idLapin ].evenementActuel.type === 'mange') {
			Lecteur.listeEtat[ idLapin ].phase = 'stop';

			if (Lecteur.listeEtat[ idLapin ].isFatigue === true) {
				Lecteur.listeEtat[ idLapin ].isFatigue = false;
				Lecteur.listeLapin[ idLapin ].vitesseCalcul *= 2;
			}
		}
		if (Lecteur.listeEtat[ idLapin ].evenementActuel.type === '1papi') {

			if (Lecteur.listeEtat[ idLapin ].isFatigue === true) {
				Lecteur.listeLapin[ idLapin ].vitesseCalcul *= 2;
			}
			Lecteur.listeLapin[ idLapin ].vitesseCalcul *= 1.5;
			Lecteur.listeEtat[ idLapin ].isPapi = true;

			Lecteur.listeEtat[ idLapin ].phase = 'constante';
		}
		if (Lecteur.listeEtat[ idLapin ].evenementActuel.type === '0papi') {

			if (Lecteur.listeEtat[ idLapin ].isFatigue === true) {
				Lecteur.listeLapin[ idLapin ].vitesseCalcul /= 2;
			}
			Lecteur.listeLapin[ idLapin ].vitesseCalcul /= 1.5;
			Lecteur.listeEtat[ idLapin ].justPapi = false;
			Lecteur.listeEtat[ idLapin ].isPapi = false;

			Lecteur.listeEtat[ idLapin ].justFinPapi = true;
			Lecteur.listeEtat[ idLapin ].phase = 'constante';
		}
		if (Lecteur.listeEtat[ idLapin ].evenementActuel.type === 'fin') {
			Lecteur.listeEtat[ idLapin ].isPapi = false;
			Lecteur.listeEtat[ idLapin ].phase = 'constante';
			Lecteur.listeLapin[ idLapin ].vitesseCalcul = 0;
		}
	},
	
	turboX: function(idLapin, time) {
		return (time * time * Lecteur.listeLapin[ idLapin ].accelerationCalcul) / 2;
	},
	
	constanteX: function(idLapin, time) {
		return time * Lecteur.listeLapin[ idLapin ].vitesseCalcul;
	},
	
	fin: function() {
		$('#masque, #masque-mini').fadeIn();
	}
}

$(function() {
	
	Lecteur.init();

	$('.lapin').each(function() {
	
		var idLapin = this.id.substr(6);
		EcranPlat.hoverBulle('lapin-' + idLapin, 'lapinBulle-' + idLapin);
		
		var positionLapin = $('#lapin-' + idLapin).position();
		
		$('#lapinNom-' + idLapin).css({
			'left': positionLapin.left - 70,
			'top': positionLapin.top + 30
		});
		
		$('#lapinNom-' + idLapin).show();
	});
		
	Lecteur.feux();
	
	$('#masque').hover(
		function () {
			$(this).css({color: '#e7d753'});
		}, 
		function () {
			$(this).css({color: 'white'});
		}
	);
	
	$('#masque').click(function() {
		window.location = $('#continuer').attr('href');
	});
});

