  
// a faire....  
// new Copie(matrice);



// =================================
// 			variables globales
// ---------------------------------

// tableau des objects matrices	(regular,diagonales,inverses...)
var matrices = new Array();

// =================================
// 			OBJET PRODUIT
// ---------------------------------

// constructeur object Produit ( = l'opération, qui lie les matrices m1, m2 et p)
function Product(matrix1,matrix2){
	// création de la matrice produit: # de lignes de m1 et # colonnes de m2
	var values = new Array(matrix1.m);
	for (var i=0; i<matrix1.m;i++){
		values[i]= new Array(matrix2.n);
	}
	this.p= new Matrix(values);
	// propriétés de l'opération produit
	this.m1= matrix1;
	this.m2 = matrix2;
	// ref dans les objects matrices concernés
	matrix1.product = this;
	matrix2.product = this;
}

// =================================
// 			OBJETS MATRICES
// ---------------------------------

// constructeur object Matrice
function Matrix(values){
	if (values){
	// pour éviter les doublons (surtout matrices.push) quand on appelle: blabla.prototype=new Matrix; uniquement pour hériter des méthodes définies hors du constructeur
		this.type='regular';
		//alert('values  '+values);
		this.values = values;
		this.dimensions = new Array(this.values.length,this.values[0].length);
		this.m= Number(this.dimensions[0]);
		this.n= Number(this.dimensions[1]);
		this.formID = 'form'+matrices.length;
		// push si matrice générique, pas de push si matrice spécifique:
		// le push sera fait dans le constructeur spécifique, pour cibler la matrice spécifique
		if ( !searchArg(arguments,'nopush')) matrices.push(this);
	}
}

// matrice diagonale, étend Matrice
function MatrixDiag(valuesDiag){
	if(valuesDiag){	
		this.valuesDiag = valuesDiag;
		var dim = valuesDiag.length;
		var values= new Array(dim);
		for (var i=0; i<dim;i++){
			values[i] = new Array(dim);
			for (var j=0;j<dim; j++){
				if (i==j){
					values[i][j]=this.valuesDiag[i];
				}else{
					values[i][j]=0;
				}
			}
		}
		// pour étendre l'objet Matrix: 
		// (en passant le tableau values dans Matrix, qui sera utilisé pour les méthodes héritées de Matrix)
		this.base=Matrix;
		this.base(values,'nopush');
		// après l'appel à Matrix pour écraser this.type='regular'
		this.type='diagonale'; 
		// push si matrice diagonale, pas de push si matrice diagonale inverse
		// le push sera fait dans le constructeur spécifique (pour cibler la matrice spécifique)
		if ( !searchArg(arguments,'nopush')) matrices.push(this);
	}
}
// pour hériter des futures méthodes de Matrix (définies hors du constructeur)
MatrixDiag.prototype = new Matrix;
	  

// matrice diagonale inverse, hérite de matrice diagonale
function MatrixDiagInverse(matrixDgnl){
	var dim = matrixDgnl.m;
	var diag = new Array(dim);
	for (var i=0;i<dim;i++){
		diag[i]= 1/matrixDgnl.valuesDiag[i];
	}
	this.inverse=true;
	this.original=matrixDgnl;
	this.base=MatrixDiag;
	this.base(diag,'nopush');
	if ( !searchArg(arguments,'nopush')) matrices.push(this);
}
MatrixDiagInverse.prototype=new Matrix;


// matrice de permutation, étend Matrice
function MatrixPermut(dim,v1,v2,direction){
	var val1 = v1-1;
	var val2 = v2-1;
	var values=new Array(dim);
	for (var i=0;i<dim;i++){
		values[i]=new Array();
		for (var j=0;j<dim;j++){
			if (i==j && i!=val1 && i!=val2){
				values[i][j]=1;
			}else if( (i==val1 && j==val2) || (i==val2 && j==val1)){
				values[i][j]=1;
			}else{
				values[i][j]=0;
			}
		}
	}
 	// pour étendre l'objet Matrix:
	this.base=Matrix;
	this.base(values,'nopush');
	// après l'appel à Matrix pour écraser this.type='regular'
	this.type='permutation';
	this.genereHighlight = true;
	if (direction =='ligne') this.highlightLine = new Array(v1,v2);
	if (direction =='colonne') this.highlightCol = new Array(v1,v2);
	// autres
	if ( searchArg(arguments,'copie')){
		this.copie = true;
		this.original = arguments[5];
		this.genereHighlight = false;
		this.heriteHighlight = true;
	}
	if ( !searchArg(arguments,'nopush')) matrices.push(this);
	//alert('constructeur permut '+this.values+'   '+this.type);
}
// pour hériter des futures méthodes de Matrix (définies hors du constructeur)
MatrixPermut.prototype = new Matrix;

