
function checkValidation(formInput) {

    var message ="";

    if (noAtSign( formInput)) {
        message = "La direcci&oacute;n necesita una arroba ('@').";
    } else if (moreThanOneAtSign(formInput)) {
    	message = "La direcci&oacute;n contiene m&aacute;s que una arroba ('@').";
    } else if (nothingBeforeAt(formInput)) {
        message = "La direcci&oacute;n necesita como m&iacute;nimo una letra antes de la arroba '@'.";
    } else if (noLeftBracket(formInput)) {
        message = "La direcci&oacute;n contiene un par&eacute;ntesis cerrado ']', pero no un par&eacute;ntesis abierto '['.";
    } else if (noRightBracket(formInput)) {
        message = "La direcci&oacute;n contiene un par&eacute;ntesis abierto '[', pero no par&eacute;ntesis cerrado ']'.";
    } else if (noValidPeriod(formInput)) {
        message = "La direcci&oacute;n no contiene ning&uacute;n punto ('.').";
    } else if (noDomain(formInput)) {
        message = "La direcci&oacute;n necesita como m&iacute;nimo una letra entre la '@' y el &uacute;ltimo punto '.'.";
    } else if (dotAfterAt(formInput)) {
        message = "La direcci&oacute;n necesita como m&iacute;nimo una letra entre la '@' y el punto siguiente.";
    } else if (consecutiveDots(formInput)) {
        message = "La direcci&oacute;n contiene puntos consecutivos.";
    } else if (beginningOrEndingDotinLocalPart(formInput)) {
        message = "La parte antes de la '@' no puede comenzar o acabar con un punto.";
    } else if (moreThan64LettersInLocalPart(formInput)) {
        message = "La parte antes de la '@' tiene m&aacute;s de 64 car&aacute;cteres.";
    } else if (invalidCharactersInLocalPart(formInput)) {
        message = "La parte antes de la '@' contiene car&aacute;cteres no permitidos.";
    } else if (noValidSuffix(formInput)) {
        message = "La direcci&oacute;n contiene un dominio incorrecto.";
    } else {
        message = "Éxito! La direcci&oacute;n es valida.";
    }

    return message;
}


function noAtSign (formField) {
    // CHECK THAT THERE IS AN '@' CHARACTER IN THE STRING
    if (formField.indexOf ('@', 0) == -1) {
        return ( true );
    } else {
        return ( false );
    }
}

function moreThanOneAtSign (formField) {

	var firstAt = formField.indexOf('@', 0);
    if (formField.indexOf ('@', (firstAt+1)) != -1) {
        return ( true );
    } else {
        return ( false );
    }
}

function nothingBeforeAt (formField) {
    // CHECK THERE IS AT LEAST ONE CHARACTER BEFORE THE '@' CHARACTER
    if ( formField.indexOf ( '@', 0 ) < 1 ) {
        return ( true );
    } else {
        return ( false );
    }
}

function noLeftBracket (formField) {
    // IF EMAIL ADDRESS IN FORM 'user@[255,255,255,0]', THEN CHECK FOR LEFT BRACKET
    if ( formField.indexOf ( '[', 0 ) == -1 && formField.charAt (formField.length - 1) == ']') {
        return ( true );
    } else {
        return ( false );
    }
}

function noRightBracket (formField) {
    // IF EMAIL ADDRESS IN FORM 'user@[255,255,255,0]', THEN CHECK FOR RIGHT BRACKET
    if (formField.indexOf ( '[', 0 ) > -1 && formField.charAt (formField.length - 1) != ']') {
        return ( true );
    } else {
        return ( false );
    }
}

function noValidPeriod (formField) {
    // IF EMAIL ADDRESS IN FORM 'user@[255,255,255,0]', THEN WE ARE NOT INTERESTED
    if (formField.indexOf ( '@', 0 ) > 0 && formField.charAt (formField.length - 1 ) == ']')
        return ( false );

    // CHECK THAT THERE IS AT LEAST ONE PERIOD IN THE STRING
    if (formField.indexOf ( '.', 0 ) == -1)
        return ( true );

    return ( false );
}

function noDomain (formField) {
    // IF EMAIL ADDRESS IN FORM 'user@[255,255,255,0]', THEN WE ARE NOT INTERESTED
    if (formField.indexOf ( '@', 0 ) > 0 && formField.charAt (formField.length - 1 ) == ']')
        return ( false );

    // check that there is at least one letter between the @ and the .
    if ( formField.lastIndexOf('.') - formField.indexOf('@', 0 ) == 1)
        return ( true );

    return ( false );
}

function dotAfterAt (formField) {
    // IF EMAIL ADDRESS IN FORM 'user@[255,255,255,0]', THEN WE ARE NOT INTERESTED
    if (formField.indexOf ( '@', 0 ) > 0 && formField.charAt (formField.length - 1 ) == ']')
        return ( false );

    // check that there is no '.' after the (at)
    var atpos = formField.indexOf('@', 0 );
    if ( formField.substring(atpos+1,atpos+2) == ".")
        return ( true );

    return ( false );
}

function consecutiveDots (formField) {
    // IF EMAIL ADDRESS IN FORM 'user@[255,255,255,0]', THEN WE ARE NOT INTERESTED
    if (formField.indexOf ( '@', 0 ) > 0 && formField.charAt (formField.length - 1 ) == ']')
        return ( false );

    // check that there are no consecutive dots after the at
    for (var i=0; i<formField.length; i++ ){
    	if ( formField.substring(i,i+1)=="." && formField.substring(i+1,i+2)=="." )
    		return ( true );
    }
    return ( false );
}

function beginningOrEndingDotinLocalPart (formField) {
    // IF EMAIL ADDRESS IN FORM 'user@[255,255,255,0]', THEN WE ARE NOT INTERESTED
    if (formField.indexOf ( '@', 0 ) > 0 && formField.charAt (formField.length - 1 ) == ']')
        return ( false );

    var atpos = (formField.indexOf ( '@', 0 ));
    // check that there is no dot at the beginning or the end of the local part
    if ( formField.substring(0,1)=="." || formField.substring(atpos-1,atpos)=="." )
    	return ( true );

    return ( false );
}

function moreThan64LettersInLocalPart (formField) {
    // IF EMAIL ADDRESS IN FORM 'user@[255,255,255,0]', THEN WE ARE NOT INTERESTED
    if (formField.indexOf ( '@', 0 ) > 0 && formField.charAt (formField.length - 1 ) == ']')
        return ( false );
    // check that there are not more than 64 letters in the local part
    if ( formField.indexOf ( '@', 0 ) > 64 )
    	return ( true );
    return ( false );
}


function invalidCharactersInLocalPart (formField) {
    // IF EMAIL ADDRESS IN FORM 'user@[255,255,255,0]', THEN WE ARE NOT INTERESTED
    if (formField.indexOf ( '@', 0 ) > 0 && formField.charAt (formField.length - 1 ) == ']')
        return ( false );
    // check that there are only valid characters in the local part
    var char;
    var valid;
	var validCharsString = "a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4 5 6 7 8 9 0 ! # $ % & ' * + - / = ? ^ _ ` { | } ~ .";
	var validCharsArray = new Array();
	validCharsArray = validCharsString.split(" ");
    for (var i=0;i<formField.indexOf('@',0);i++){
    	char = formField.substring(i,i+1);
    	valid = false;
    	for (var j=0;j<validCharsArray.length;j++){
    		if (char==validCharsArray[j])
    			valid=true;
    	}
    	if (valid==false) return ( true );
    }
    return ( false );
}




function noValidSuffix(formField) {
    // IF EMAIL ADDRESS IN FORM 'user@[255,255,255,0]', THEN WE ARE NOT INTERESTED
    if (formField.indexOf('@', 0) > 0 && formField.charAt(formField.length - 1) == ']')
        return ( false );


    // CHECK THAT THERE IS A TWO OR THREE CHARACTER SUFFIX AFTER THE LAST PERIOD
    var len = formField.length;
    var pos = formField.lastIndexOf ( '.', len - 1 ) + 1;

	// check that the suffix is in the topleveldomains
	var suffixNotValid = true;
	var suffix = formField.substring(pos,len);
	var topleveldomainsString = "AC AD AE AERO AF AG AI AL AM AN AO AQ AR ARPA AS ASIA AT AU AW AX AZ BA BB BD BE BF BG BH BI BIZ BJ BL BM BN BO BR BS BT BV BW BY BZ CA CAT CC CD CF CG CH CI CK CL CM CN CO COM COOP CR CU CV CX CY CZ DE DJ DK DM DO DZ EC EDU EE EG EH ER ES ET EU FI FJ FK FM FO FR GA GB GD GE GF GG GH GI GL GM GN GOV GP GQ GR GS GT GU GW GY HK HM HN HR HT HU ID IE IL IM IN INFO INT IO IQ IR IS IT JE JM JO JOBS JP KE KG KH KI KM KN KP KR KW KY KZ LA LB LC LI LK LR LS LT LU LV LY MA MC MD ME MF MG MH MIL MK ML MM MN MO MOBI MP MQ MR MS MT MU MUSEUM MV MW MX MY MZ NA NAME NC NE NET NF NG NI NL NO NP NR NU NZ OM ORG PA PE PF PG PH PK PL PM PN PR PRO PS PT PW PY QA RE RO RS RU RW SA SB SC SD SE SG SH SI SJ SK SL SM SN SO SR ST SU SV SY SZ TC TD TEL TF TG TH TJ TK TL TM TN TO TP TR TRAVEL TT TV TW TZ UA UG UK UM US UY UZ VA VC VE VG VI VN VU WF WS YE YT YU ZA ZM ZW";
	var topleveldomainsArray = new Array();
	topleveldomainsArray = topleveldomainsString.split(" ");

	for (var i=0; i<topleveldomainsArray.length; i++){
		if (suffix.toUpperCase() == topleveldomainsArray[i]){
			suffixNotValid = false;
		}
	}
	if (suffix == "") {
		suffixNotValid = true;
	}
	return suffixNotValid;
}


function checkEmailAdresses(){

	var inputfield = document.getElementById('emailcheckerinputfield');
	// begin settings
	var splitvalue = "\n"; //the value between the email adresses
	var maxadresses = 1000; //maximum adresses to check
	// end settings


	if (typeof(inputfield) != "object") {
	        alert("Este navegador no acepta la validaci&ocute;n.");
	        return(false);
	}



	//remove old results if button is clicked not the first time
	for (var i=0; i<maxadresses; i++){
		var id="result"+i;
		if ( $("#"+id).html() != null){
			$("#"+id).remove();
			}
	}
	if ( $("#"+"maxadresseswarning").html() != null){
		$("#"+"maxadresseswarning").remove();
		}
	if ( $("#"+"bottom").html() != null){
		$("#"+"bottom").remove();
		}

	// add progress message
	var progressmessage = document.createElement('p');	//create the new p-element
	$(progressmessage).attr("id","progressmessage");
	$(progressmessage).html("Verificando ... por favor espere");
	document.getElementById("emailcheckerresult").appendChild(progressmessage);

	//read data
	var adresses = new Array();
	adresses = inputfield.value.split(splitvalue);


	//eliminate empty rows
	for (var i=0; i<(adresses.length-1); i++){
		if (jQuery.trim(adresses[i]) == ""){
			for (var j=i; j<(adresses.length-1); j++){
				adresses[j] = adresses[j+1];
				adresses[j+1] = "";
			}
			adresses.pop();
			i = i-1;
		}
	}
	while( (jQuery.trim(adresses[adresses.length-1]) == "") && (adresses.length>0) ){
		//eliminate last element if empty
		adresses.pop();
	}
	var input_number=adresses.length;




	//check if there are more adresses entered than the maximum number and truncate them
	var last;
	if (adresses.length <= maxadresses){
		last = adresses.length;
	} else {
		var warning = document.createElement('p');	//create the new p-element
		$(warning).attr("id","maxadresseswarning");
		$(warning).html("<span id='maxadresseswarning'> Solo se pueden validar "+maxadresses+" direcciones. Cortando...</span>");
		document.getElementById("emailcheckerresult").appendChild(warning);

		last = maxadresses;
	}
	//write new content to inputfield
	var newinputfiledcontent = "";
	for (var i=0; i<last; i++){
		newinputfiledcontent = newinputfiledcontent + adresses[i];
		if (i < (maxadresses-1)){
			newinputfiledcontent = newinputfiledcontent + splitvalue;
		}
	}
	$('#emailcheckerinputfield').val(""); //hack: the progressmessage doesn't appear without it.
	$('#emailcheckerinputfield').val(newinputfiledcontent);

	var counter_working = 0;
	var counter_not_working = 0;

	//check email adresses and write messages into p-tags
    var p = new Array();
	for (var i=0; i<last; i++){

		var id="result"+i;					//id for current loop index


		adresses[i] = jQuery.trim(adresses[i]); //eliminate whitespaces around email-adresses
		var result = checkValidation(adresses[i]);	//check if the email is in the right syntax

		var working;							//set boolean variable working
		if (result.substring(1,7)=="xito! "){
			counter_working++;
			working = true;}
		else{
			counter_not_working++;
			working = false;}


		if (working == false) {	//only show not working messages
			p[i] = document.createElement('p');	//create the new p-element
			$(p[i]).attr("id",id);				//set id for element
			if (working == true) {
				$(p[i]).addClass("workingemail");} //set class of p (for possible css styling)
			else{$(p[i]).addClass("noworkingemail");}
			$(p[i]).html("<i>"+adresses[i]+"</i> :  <b>"+result+"</b>");//set text
			document.getElementById("emailcheckerresult").appendChild(p[i]);
		}
	}

	var bottom = document.createElement('p');	//create the new p-element
	$(bottom).attr("id","bottom");
	if (input_number<=maxadresses){
		$(bottom).html("<b> Se comprobaron "+input_number+" direcciones de email. "+counter_working+" con sintaxis correcta y "+counter_not_working+" incorrectas.</b>");
		if (counter_not_working==0) {
			$(bottom).html("<b><span class='green'>Felicidades! De las "+counter_working+" direcciones de email introducidos todos tienen sintaxis correcto.</span></b>");
		}
		if (input_number == 0) {
			$(bottom).html("<b><span class='red'>No hay datos introducidos.</span></b>");
		}
	}else{
		$(bottom).html("<b>Se introdujeron m&aacute;s de "+maxadresses+" direcciones de email. De las primeras "+maxadresses+", "+counter_working+" tienen sintaxis correcta, las restantes "+counter_not_working+" son incorrectas.</b>");
	}
	document.getElementById("emailcheckerresult").appendChild(bottom);

	//delete progressmessage
	if ( $("#"+"progressmessage").html() != null){
		$("#"+"progressmessage").remove();
		}

	return false;
}



