// ***********************************************************************************************
// Class Interpolation
// ***********************************************************************************************

/*
---------------------------------------------------------
DESCRIPTION

Gestion des interpolations sur n'immporte quelle propriété numérique.
!!! L'unité de base est le PIXEL en attendant d'avoir le choix entre les differentes unités

---------------------------------------------------------
USAGE

var monInterpolation = new classInterpolation(pointeurElement, identifiant, propriete, typeInterpolation, valeurDebut, valeurFin, duree)

pointeurElement : pointeur de l’élément dont la propriété subira l’interpolation.
identifiant : [Booleen] 	true => la pointeur est l'identifiant direct.
							false => c'est le pointeur qui est donné directement.
propriete : [String] nom de la propriété qui sera modifiée.
typeInterpolation : Fonction d’interpolation qui sera utilisée pour calculer l’évolution.
valeurDebut : [Number] Valeur de la propriété au début de l’interpolation en pixel.
valeurFin : [Number] Valeur de la propriété à la fin de l’interpolation en pixel.
duree : [Number] Durée de l’interpolation en milliseconde.

---------------------------------------------------------
METHODES

monInterpolation.start() : Lance l’interpolation depuis le début.  

---------------------------------------------------------
PROPRIETES

---------------------------------------------------------
GESTIONNAIRE D'EVENEMENTS

*/

function iniInterpolation(){
	/*var deplacementElementTop = new classInterpolation("testInterpolation", true, "top", "decelerer", 0, 200, 1000);
	deplacementElementTop.debutSeq = debut;
	deplacementElementTop.finSeq = fin;
	deplacementElementTop.start();
	
	function debut(){
		alert("Debut");
	}
	
	function fin(){
		alert("Fin");
	}*/
}

// ---------------------------------------------------------
// Création d'un objet d'interpolation
function classInterpolation(pointeurElement, identifiant, propriete, typeInterpolation, valeurDebut, valeurFin, duree){
	
	// Initialisation des variables
	if(identifiant){
		var pointeurElement = document.getElementById(pointeurElement);
	}
	this.pointeurElement = pointeurElement;
	this.propriete = propriete;
	this.typeInterpolation = typeInterpolation;
	this.valeurDebut = valeurDebut;
	this.valeurFin = valeurFin;
	this.duree = duree;
	
	// Initialisation interne
	this.cadence = 75; // images/seconde
	this.nbPas = Math.ceil(this.duree / 1000 * this.cadence + 1); // Nombre de pas nécessaires pour faire toute l'interpolation
	this.valeursTab = new Array(this.nbPas); // Création du tableau contenant toutes les valeurs de l'interpolation
	this.index = 0;
	
	
	// Création de la méthode start()
	this.start = function(){
		
		this.calculInterpolation();
		this.mouvementInterpolation();
		
	}
	
	// Choix du calcul de l'interpolation en fonction du type d'interpolation choisi
	this.calculInterpolation = function(){
		
		switch(this.typeInterpolation){
			
			case "regulier":
				this.interpolReguliere();
			break;
			
			case "decelerer":
				this.interpolDecelerer();
			break;
			
			default :
				this.interpolReguliere();
			break;			
		}
		
	}
	
	// Calcul de l'interpolation régulière
	this.interpolReguliere = function(){
		
		var valeurDuPas = (this.valeurFin - this.valeurDebut) / (this.nbPas - 1);
		var valeurIntermediaire = this.valeurDebut;
		
		for(var i = 0; i < this.nbPas; i++){
			this.valeursTab[i] = Math.ceil(valeurIntermediaire);
			valeurIntermediaire = valeurIntermediaire + valeurDuPas;
		}		
		
	}
	
	// Calcul de l'interpolation décélérer
	this.interpolDecelerer = function(){
		var ref = Math.PI / 2 / 90; 
		var valeurDuPas = 90 / (this.nbPas - 1);
		var distance = this.valeurFin - this.valeurDebut;
		
		for(var i = 0; i < this.nbPas; i++){
			var valeurIntermediaire = this.valeurDebut + (distance * Math.sin(ref * valeurDuPas * i));
			this.valeursTab[i] = Math.ceil(valeurIntermediaire);
		}		
		
	}
	
	// Animation de l'interpolation
	this.mouvementInterpolation = function(){
		
		if(this.debutSeq){
			/* Lance l'application affecté pour le début de l'interpolation */
			this.debutSeq();
		}
		
		var i = 0;
		var iFin = this.nbPas - 1;
		
		var pointeurElement = this.pointeurElement;
		var valeurs = this.valeursTab;
		var propriete = this.propriete;
		var finSeq = this.finSeq;
		
		var monInterval = window.setInterval(function(){sequenceInterpolation()}, 1000 / this.cadence);
		
		function sequenceInterpolation(){
			/* Application de l'interpolation à la propriété demandée */
			var codeJS = "pointeurElement.style." + propriete + "= valeurs[" + i + "] + 'px'";
			eval(codeJS);
			
			i++;
			
			if(i > iFin){
				window.clearInterval(monInterval)
				if(finSeq){
					/* Lance l'application affecté pour la fin de l'interpolation */
					finSeq();
				}
			}
			
		}
	
	}
	
}

