/*!
* Email validation routines
* 
* v2.0.1
*/

var safInitialFormAction = ""; // global variable

function validateSignup(f)
{
	GetEmailField(f); //includes spam checking code in form onsubmit event
	return true; //allow form submit
}

function GetEmailField(f)
{
	var myForm,
		myEmail,
		email = new Email(),
		spamTier,
		myAction = ""
		myForward = "",
		mySession = "";
	
	if(f)
		myForm = f;
	else
		myForm = document.getElementById("SafLeadForm");

	if(safInitialFormAction == "") safInitialFormAction = myForm.action;

	if(myForm["emailAddress"]) email.value = myForm["emailAddress"].value;

	spamTier = email.getValidationTier();

	if (spamTier > 0) // invalid email
	{	
		// failed test, reset redirect to bypass subscriber post
		myForward = myForm["redirectUrl"];
		myAction = myForward.value;
		
		// add querystring ? if necessary
		if(myAction.lastIndexOf("?") < 0) myAction += "?";	
		
		// add failed querystring parameter
		if(myAction.lastIndexOf("&") != (myAction.length - 1))
		{
			//add a trailing ampersand if necessary
			myAction += "&"
		}
		myAction += "email_failed=" + spamTier;
				
		// pull the session_id
		mySession = myForm["session_id"];
		
		if (mySession)
		{
			if(myAction.lastIndexOf("&") != (myAction.length - 1))
			{
				//add a trailing ampersand if necessary
				myAction += "&"
			}

			// append session_id to myform.action 
			myForm.action = myAction + "z=" + mySession.value;
		}
		else
		{
			myForm.action = myAction;
		}
		// alert(myForm.action);
	}
	else
	{
		// good email
		myForm.action = safInitialFormAction;
	}
	//alert(myEmail);
}


/*
* Email object. Provides validation routines to reduce user mis-typed addresses.
*
* Author: BoRyan Eberhard
*/
function Email(email) {

	this.value = email;
	this.validationMessage = null;

	/*
	* Adapted from http://andrew.hedges.name/experiments/levenshtein/levenshtein.js
	*/
	levenshteinenator = function(a, b) {
		var cost;

		// get values
		var m = a.length;
		var n = b.length;

		// make sure a.length >= b.length to use O(min(n,m)) space, whatever that is
		if (m < n) {
			var c=a;a=b;b=c;
			var o=m;m=n;n=o;
		}

		var r = new Array();
		r[0] = new Array();
		for (var c = 0; c < n+1; c++) {
			r[0][c] = c;
		}

		for (var i = 1; i < m+1; i++) {
			r[i] = new Array();
			r[i][0] = i;
			for (var j = 1; j < n+1; j++) {
				cost = (a.charAt(i-1) == b.charAt(j-1))? 0: 1;
				r[i][j] = minimator(r[i-1][j]+1,r[i][j-1]+1,r[i-1][j-1]+cost);
			}
		}

		return r[m][n];
	}

	// return the smallest of the three values passed in
	minimator = function(x,y,z) {
		if (x < y && x < z) return x;
		if (y < x && y < z) return y;
		return z;
	}

	// check domains for possible mis-types
	isMistype = function(email) {
		var domains = new Array("yahoo.com","hotmail.com","aol.com","gmail.com"),
			parts = email.value.split('@'),
			dist;
		for(var x=0; x < domains.length; x++) {
			dist = levenshteinenator(domains[x], parts[1]);
			if(dist == 1 || dist == 2) {
				email.validationMessage = "Did you mean to type \"" + domains[x] + "\" in your email address?";
				return true;
			}
		}
		return false;
	}
}
/*
* Returns 0 if email address is valid; otherwise integer > 0
*/
Email.prototype.getValidationTier = function() {	
		var email = this.value,
			retVal = 0;

		if (this.isValidSyntax())
		{
			if (isTier2Spam(email))
				retVal = 2;
			else if (isTier3Spam(email))
				retVal = 3;
			else if (isTier4Spam(email))
				retVal = 4;
			else if (isTier5Spam(email))
				retVal = 5;
			else if (isTier6Spam(email))
				retVal = 6;
			else if (isTier7Spam(email))
				retVal = 7;
			else
				retVal = 0;
		}
		else
		{
			// syntax bad or blank email
			retVal = 1;
		}
		return retVal;
	}
/*
* Returns true if match is found (valid email)
*/
Email.prototype.isValidSyntax = function() {	
		var re = new RegExp("^.+@[^\.].*\\.[a-z]{2,}$");
		return re.test(this.value);
	}
/*
* This validation routine deliberately allows non-emails (strings without @) to pass the validation routine.
* This is per our current business rule that we allow people through our sign-in page, if they do not want to provide 
* what appears to a syntactically valid email address.
*/
Email.prototype.validatePartial = function() {
		var re = new RegExp("^.+@.*$"),
			email = this.value,
			spamTier,
			retVal = true;

		email = email.replace(/^\s+/i,""); // remove whitespace from start
		email = email.replace(/\s+$/i,""); // remove whitespace from end
		email = email.replace(/[^\w\.@!#\$%&'*+\-\/=\?\^'{|}~]/gi,""); // remove invalid characters

		this.value = email;

		// check for valid email format (contains @ sign)
		retVal = re.test(email);

		// SHORT CIRCUIT: it does not appear like user wanted to provide a valid email
		// we will let them pass validation (so as not to prevent getting past signup page)
		if(!retVal) return true;

		// full syntax check on email
		retVal = this.isValidSyntax();

		// now checking for mis-typed domain
		if(retVal)
		{
			retVal = !isMistype(this);
		}
		
		// now checking spam tiers
		if(retVal)
		{
			spamTier = this.getValidationTier();
			
			if(spamTier > 0)
			{
				retVal = false;
				switch(spamTier)
				{
					case 2: // old domains
						this.validationMessage = "The email address you entered is no longer valid.";
						break;
					case 3: // spamtrap address
						this.validationMessage = "The email address you entered cannot receive emails.";
						break;					
					case 4: // spamtrap domains
						this.validationMessage = "The email address you entered cannot receive emails.";
						break;					
					case 5: // coerced addresses
						this.validationMessage = "The email address you entered cannot receive emails.";
						break;
					case 6: // roles
						this.validationMessage = "The email address you entered cannot receive emails.";
						break;
					case 7: // typo
						this.validationMessage = "You may have mis-typed your email address.";
						break;
					default:
						retVal = true; // unknown, thus valid
				}
			}
		}
		
		return retVal;
	}


// Returns true if match is found (invalid email)
// old domains
function isTier2Spam(email)
{
	var str = "@21box\.com|@5xx\.org|@852\.net|@ac\.com|@altavista\.co\.uk|@altavista\.com|@altavista\.de|@altavista\.des|@altavista\.fr|@angelfire|@attbi\.com|@attbi\.net|@beseen\.com|@bigmailbox|@bn3|@box\.com|@chickmail|@coolemail\.net|@deadbolt\.com|@devil\.com|@digitalme\.com|@dog\.com|@enetdec\.com|@eorders|@eurosport\.com|@exciteukmail|@firstnethou\.com|@fishinglife|@freemail\.nl|@gamespot|@gateway\.net|@geekmail\.com|@guilmette\.org|@highabove|@home\.com|@hyperoffice\.com|@ibm\.net|@inbox\.com|@internetmci\.com|@internetmci\.net|@ivillage|@jlmail|@jmail\.co\.jp|@joymail|@junglemate|@keftamail|@konzoo\.coms|@law\.com|@locos\.com|@looksmart|@lovemail\.com|@ltinet\.com|@mailblocks|@mci\.net|@mci2000\.com|@mcimail\.com|@media1st\.com|@mediaone\.net|@metagram\.net|@metagram\.org|@metagrams\.net|@metagrams\.org|@mollymail|@momslife\.com|@monkeys\.com|@myinboxplus\.com|@mysun|@n2mail|@nameplanet\.com|@netpen\.net|@networkmci\.com|@networkmci\.net|@newfunandcool\.com|@newmail\.net|@paxemail\.com|@pop3now|@postmark\.net|@privatemail\.com|@prodigy\.com|@pumapost|@space\.com|@start\.com\.au|@startrekmail\.com|@stoned\.com|@subdimension|@suite101email|@talkcity\.com|@toast\.com|@us\.arthurandersen\.com|@us\.oracle\.com|@us\.pwcglobal\.com|@uunetuu\.net|@valise|@visto|@myvisto|@winuk\.net|@worldmailer|@ziplip\.com|@zkey";
	var re = new RegExp(str);
	return re.test(email);
}

// Returns true if match is found (invalid email)
// spamtrap address
function isTier3Spam(email)
{
	var str = "ag510@cleveland\.freenet\.edu|ariel@newsite\.boxmail\.com|ariel@tempest\.boxmail\.com|atossava@cc\.helsinki\.fi|bait_kwphone@aol\.net|dave@eram\.esi\.com\.au|dave@esi\.com\.au|dave@fgh\.fgh\.oz\.au|dave@fgh\.geac\.com\.au|dave@fgh\.oz\.au|dave@geac\.com\.au|dave@ips\.oz\.au|dave@vk2kfu\.esi\.com\.au|dummy@dummies\.com|hrweb@hrweb\.org|info@reveal\.org|jack@grondar\.za|jane@grondar\.za|jford@\.*\.ua\.edu|me@privacy\.net|mrsam@concentric\.net|mrsam@email-scan\.webcircle\.com|mrsam@geocities\.com|my@email\.com|none@mail\.com|paul@mail\.com|radiopro@gte\.net|reveal@reveal\.org|sjsobol@nacs\.net|sjsobol@seka\.nacs\.net|sp_m_skunker@hotmail\.com|spamtrap@hrweb\.org|spamtrap@spambouncer\.org|terrrio@lewis\.org|tosspam@aol\.com|webmaster@hrweb\.org|webmaster@reveal\.org|xzm@hrweb\.org|aol@aol\.com|asdf@asdf\.nl|bbankhead@oryx\.com|bement@accnorwalk\.com|dwortfarquhar@yahoo\.com|gfy@bkbusa\.com|hormboy@fw\.merk\.com|kiko@async\.com\.br|net-medier@lynxmedia\.dk|notifyaol@scomp\.mail\.aol\.com|novell2@nwsup\.com|sfas-announce-list-request@sfas\.org\.sg|spamtrap@blars\.org|vjs@rhyolite\.com";
	var re = new RegExp(str);
	return re.test(email);
}

// Returns true if match is found (invalid email)
// spamtrap domains
function isTier4Spam(email)
{
	var str = "@asdf\.nl|@cix\.net|@cluestick\.org|@comstar\.com|@Connactivity\.com|@cyberangels\.nl|@deu\.com|@dsl092-077-098\.bos1\.dsl\.speakeasy\.net|@dummies\.com|@firstnethou\.com|@gain-ny\.com|@gulfgate\.com|@inetica\.com|@isux\.com|@Mandarin\.com|@mastipruds\.org|@mcimail\.com|@monkeys\.com|@nanas\.surriel\.com|@obob\.com|@otto\.net|@poopypants\.com|@projecthoneypot\.org|@seebs\.net|@smac\.hensema\.net|@spamtrap\.rangers\.eu\.org|@tomorrowssolution\.com|@trap\.offshoreexecutive\.com|@turnstep\.|@web-cyat\.com|@webrix\.net|@yepes\.com";
	var re = new RegExp(str);
	return re.test(email);
}

// Returns true if match is found (invalid email)
// coerced addresses
function isTier5Spam(email)
{
	var str = "@asd[asdfzx]*\.|@asdf\.|@domain\.com|@example\.(com|net|org)|@fuckoff\.(com|org)|@joe\.|@johndoe\.|@mail\.domain\.com|@mypants\.com|@no\.com|@noemail\.com|@please\.com|@qwe[rty]*\.|@qwer+\.|@qwert+\.|@qwerty+\.|@thanks\.com|@whitehouse\.gov|@xx[asdfzx]*\.|@xyz[xyzvc]*\.|\weatme\w|^[lkjh]+@[lkjh]+\.|^[zyx]+@|^\d+@\d+\.|^\w@|^\w@\w\.|^\w\w@\w\w\.|^123@|^aa@|^aaa@|^abc@|^abcd@|^ads@|^asdf@|^bulk@|^qwe@|^qwer@|^qwert@|^qwerty@|^shit@|^spam@|^spamtrap@|^ubfi@|^xyz[xyzvc]*@|al@gore\.com|asshole|bgates@msn\.com|billg@microsoft\.com|biteme@|bullshit|dick\.com|fuck|google@google.net|kissmyass|no@way\.|no_spam|nochance@|noemail@|nospam|notachance@|nothank@|nothanks@|notinterest|noway@|screwu@|screwyou@|sendnospam.org|shit\.com|spambait@|suckme@|suckmy|upyours@|usuck@|yousuck\w";
	var re = new RegExp(str);
	return re.test(email);
}

// Returns true if match is found (invalid email)
// roles
function isTier6Spam(email)
{
	var str = "-owner@|-whois@|^abuse@|^admin@|^administrator@|^editor@|^feedback@|^ftp@|^helpdesk@|^hostmaster@|^hostmaster@|^info@|^listserv@|^listserver@|^mailerdaemon@|^marketing@|^news@|^newsletter@|^noc@|^noreply@|^ops@|^postmaster@|^privacy@|^sales@|^security@|^support@|^usenet@|^uucp@|^webmaster@|^www@|dns@|dnsadmin@|domainadmin@|domains@|listowner@|orders@*|root@|subscribe@";
	var re = new RegExp(str);
	return re.test(email);
}

// Returns true if match is found (invalid email)
// typos
function isTier7Spam(email)
{
	var str = "@aaol\.com|@ao\.com|@aol\.coml|@comcast\.com|@earlink\.net|@gol\.net|@hormail\.com|@hotmai\.com|@hotmial\.com|@hoymail\.com|@htomail\.com|@msn\.net|@yaho\.com|@yaho\.com|@yahoogroups\.com|@yahoomail\.com|@yaoo\.com";
	var re = new RegExp(str);
	return re.test(email);
}