var extensions = ["com","fr","net"];
var domaines = [["aliceadsl",1],["aol",[0,1]],["cegetel",2],["club-internet",1],["free",1],["gmail",0],["gmx",1],["hotmail",[0,1]],["laposte",2],["live",[0,1]],["msn",[0,1]],["neuf",1],["numericable",1],["orange",1],["sfr",1],["tele2",1],["tiscali",1],["voila",1],["wanadoo",1],["yahoo",[0,1]],["ymail",0]];
var prefixe = '';
var domaine = '';
var name = '';
var extension = '';
var valides = new Array;
var taux = [60,40,70,50];
var poids = [4,1];
var el;
var elR;

window.addEvent('domready', function(){
	el = $('email');
	elR = $('acceptable');
});

function tester(){
	var content = el.value;
	var arobase = content.indexOf('@',0);
	var point = content.indexOf('.',arobase);
	var longueur = content.length;
	
	if(arobase != -1 && arobase != longueur - 1){
		prefixe = content.substring(0, arobase);
		domaine = content.substring(arobase + 1, longueur);
		
		if(point != -1){
			name = content.substring(arobase + 1, point);
			extension = content.substring(point + 1, longueur);
			lister(name, extension, true);
		}else{
			lister(domaine, '', false);
		}
	}else{
		lister();
	}
}

function lister(domaine, extension, complet){
	var list = '';
	var calcul;
	var acceptable = '';
	var acceptables = new Array;
	if(!domaine){domaine = '';}
	if(!extension){extension = '';}
	if(!complet){complet = false;}
	if(extension != ''){point = '.';}else{point = '';}
	
	for(var key = 0; key < domaines.length; key++){
		if(!isArray(domaines[key][1])){
			calcul = calculer(domaine, domaines[key][0], extension, extensions[domaines[key][1]], complet);
			if(calcul){acceptables[acceptables.length] = calcul;}
		}else{
			for(var key1 = 0; key1 < domaines[key][1].length; key1++){
				calcul = calculer(domaine, domaines[key][0], extension, extensions[domaines[key][1][key1]], complet);
				if(calcul){acceptables[acceptables.length] = calcul;}
			}
		}
	}
	
	if(acceptables.length > 0){
		acceptables = ordonner(acceptables, 2);
		B_maintien1 = true;
		B_maintien2 = true;
		
		for(var key = 0; key < acceptables.length; key++){
			if(acceptables[key][2] >= taux[0]){
				classe = "probable";
			}else{
				classe = "acceptable";
			}
			
			if(acceptables[key][2] == 200){
				B_maintien1 = false;
				acceptable += formater(acceptables[key], classe);
			}else if(acceptables[key][2] >= 160){
				B_maintien2 = false;
				if(B_maintien1){
					acceptable += formater(acceptables[key], classe);
				}
			}else{
				if(B_maintien1 && B_maintien2){
					acceptable += formater(acceptables[key], classe);
				}
			}
		}
		
		afficher(acceptable);
	}else{
		cacher();
	}
}

function isArray(obj) {
	return obj.constructor == Array;
}

function calculer(domaine, domaines, extension, extensions, complet){
	var scoringdom;
	var scoringext;
	var scoringtot;
	
	similidom = similitude(domaine, domaines);
	
	if(complet){
		scoringdom = similidom[0];
	}else if(similidom[1] == 100){
		scoringdom = similidom[1];
	}else if(similidom[1] >= taux[2] && similidom[0] >= taux[3]){
		scoringdom = Math.max(similidom[0],similidom[1]);
	}else{
		scoringdom = similidom[0];
	}
	
	if(extension != ''){
		similiext = similitude(extension, extensions);
		if(similiext[1] == 100){
			scoringext = similiext[1];
		}else if(similiext[1] >= taux[2] && similiext[0] >= taux[3]){
			scoringext = Math.max(similiext[0],similiext[1]);
		}else{
			scoringext = similiext[0];
		}
		scoringtot = Math.round(((poids[0] * scoringdom) + (poids[1] * scoringext))/(poids[0] + poids[1]));
	}else{
		scoringext = 0;
		scoringtot = scoringdom;
	}
	
	if(scoringtot > taux[1]){
		return [domaines, extensions, scoringtot];
	}
	
	return null;
}

function similitude(obj, etalon) {
	var resultat = new Array;
	
	if(obj == etalon){
		resultat = [200,200];
	}else{
		score = 0; i = 0;
		b_plus = false; b_moins = false;
		
		for(key = 0; key < obj.length; key++){
			if(obj.charAt(key) == etalon.charAt(key)){
				score += 100;
			}else if(obj.charAt(key) == etalon.charAt(key + 1)){
				score += 80;
				if(b_plus){
					score += 15;
					b_moins = false;
				}
				b_plus = true;
			}else if(obj.charAt(key) == etalon.charAt(key - 1)){
				score += 80;
				if(b_moins){
					score += 15;
					b_plus = false;
				}
				b_moins = true;
			}else if(!etalon.charAt(key) && etalon.charAt(key - 1)){
				score *= 0.9;
			}else if(!etalon.charAt(key) && !etalon.charAt(key - 1)){
				score *= 0.8;
			}
			i++;
		}
		
		if(i != 0){
			similarite = Math.round(score / etalon.length);
			coursdefrappe = Math.round(score / i);
			if(similarite > 100){similarite = 200 - similarite;}
			resultat = [similarite,coursdefrappe];
		}else{
			resultat = [0,0];
		}
	}
	return resultat;
}

function ordonner(tableau, indice) {
	var classement = new Array;
	var passes = tableau.length;
	var todelete;
	
	for(i = 0; i < passes; i++){
		init = true;
		for(var key = 0; key < tableau.length; key++){
			if(tableau[key]){
				if(init){
					todelete = key;
					init = false;
				}else if(tableau[key][indice] > tableau[todelete][indice]){
					todelete = key;
				}
			}
		}
		classement[i] = tableau[todelete];
		delete tableau[todelete];
	}
	
	return classement;
}

function formater(domext, classe) {
	miseenforme = '<div class="' + classe + '" onclick="valider(\'' + domext[0] + '\',\'' + domext[1] + '\');">- ';
	miseenforme += prefixe + '@' + domext[0] + "." + domext[1];
	miseenforme += "</div>";
	
	return miseenforme;
}

function afficher(acceptable) {
	elValues = el.getCoordinates();
	
	affichage = '<div class="titre">Aide à la saisie automatique</div>';
	affichage += acceptable;
	affichage += '<div class="annulation" onclick="annuler();">Annuler</div>';
	
	elR.innerHTML = affichage;
	elR.setStyles({
		display: 'block',
		position: 'absolute',
		left: elValues.left + 210,
		top: elValues.top - 4
	});
}

function cacher() {
	elR.innerHTML = '';
	elR.setStyles({display: 'none'});
}

function valider(domaine, extension) {
	el.value = prefixe + '@' + domaine + '.' + extension;
}

function annuler() {
	el.value = prefixe + '@' + domaine;
	el.focus();
	cacher();
}

