var IsValid = false, Domain = "", Account = "", Address = "";

function EmailSyntaxValidator(email, TLDrequired){
	var tmpmail = ""+email+"", tmpdomain;
	var mailobj;

	this.Address = tmpmail;

	tmpmail = Trim(RemoveBrackets(tmpmail));

	mailobj = new Object();
	mailobj.acct="";
	mailobj.domain="";

	if (! CrackEmail(tmpmail, mailobj)){
		return;
	}

	this.Account = mailobj.acct;
	this.Domain = mailobj.domain;

	if (! DomainValid(TLDrequired, this.Domain) ){
		return;
	}

	if (TLDrequired && ! DomainExtensionValid(this.Domain)){
		return;
	}

	this.IsValid = true;
}

function CrackEmail(email, mailobj){
	var arr, re;

	re = /^(.+?)\@(.+?)$/gi
	if ((arr=re.exec(ReverseString(email))) == null)	{
		return false;
	}

	mailobj.acct = ReverseString(RegExp.$2);
	mailobj.domain = ReverseString(RegExp.$1);
	return true;
}

function RemoveBrackets(email){	
	var re = /^\<*|\>*$/gi	
	return email.replace(re, "");
}

function Trim(email)
{
	var re = /^\s*|\s*$/gi	
	return email.replace(re, "");
}

function ReverseString(str)
{
	var i, outstr = "";

	for(i=str.length-1;i>-1;i--)
	{
		outstr += str.charAt(i);
	}
	return outstr;
}

function DomainValid(TLDrequired, tmpdomain)
{
	var re;

	if (TLDrequired)
	{
		re = /^((([a-z0-9-]+)\.)+)[a-z]{2,6}$/gi
	}
	else
	{
		re = /^((([a-z0-9-]+)\.)+)$/gi
		tmpdomain += ".";
	}

	return re.test(tmpdomain);
}

function DomainExtensionValid(tmpdomain)
{
	var domainvalidatorpattern = "", re;

	domainvalidatorpattern+="^(";
	domainvalidatorpattern+="a[c-gil-oq-uwz]|";   //ac,ad,ae,af,ag,ai,al,am,an,ao,aq,ar,as,at,au,aw,az
	domainvalidatorpattern+="b[a-bd-jm-or-tvwyz]|"; //ba,bb,bd,be,bf,bg,bh,bi,bj,bm,bn,bo,br,bs,bt,bv,bw,by,bz
	domainvalidatorpattern+="c[acdf-ik-orsuvx-z]|"; //ca,cc,cd,cf,cg,ch,ci,ck,cl,cm,cn,co,cr,cs,cu,cv,cz,cy,cz
	domainvalidatorpattern+="d[ejkmoz]|";      //de,dj,dk,dm,do,dz
	domainvalidatorpattern+="e[ceghr-u]|";     //ec,ee,eg,eh,er,es,et,eu
	domainvalidatorpattern+="f[i-kmorx]|";     //fi,fj,fk,fm,fo,fr,fx
	domainvalidatorpattern+="g[abd-ilmnp-uwy]|";  //ga,gb,gd,ge,gf,gg,gh,gi,gl,gm,gn,gp,gq,gr,gs,gt,gu,gw,gy
	domainvalidatorpattern+="h[kmnrtu]|";      //hk,hm,hn,hr,ht,hu
	domainvalidatorpattern+="i[delm-oq-t]|";    //id,ie,il,im,in,io,iq,ir,is,it
	domainvalidatorpattern+="j[emop]|";       //je,jm,jo,jp
	domainvalidatorpattern+="k[eg-imnprwyz]|";   //ke,kg,kh,ki,km,kn,kp,kr,kw,ky,kz
	domainvalidatorpattern+="l[a-cikr-vy]|";    //la,lb,lc,li,lk,lr,ls,lt,lu,lv,ly
	domainvalidatorpattern+="m[acdghk-z]|";     //ma,mc,md,mg,mh,mk,ml,mm,mn,mo,mp,mq,mr,ms,mt,mu,mv,mw,mx,my,mz
	domainvalidatorpattern+="n[ace-giloprtuz]|";  //na,nc,ne,nf,ng,ni,nl,no,np,nr,nt,nu,nz
	domainvalidatorpattern+="om|";         //om
	domainvalidatorpattern+="p[ae-hk-nrtwy]|";   //pa,pe,pf,pg,ph,pk,pl,pm,pn,pr,pt,pw,py
	domainvalidatorpattern+="qa|";         //qa
	domainvalidatorpattern+="r[eouw]|";       //re,ro,ru,rw
	domainvalidatorpattern+="s[a-eg-ort-vyz]|";   //sa,sb,sc,sd,se,sg,sh,si,sj,sk,sl,sm,sn,so,sr,st,su,sv,sy,sz
	domainvalidatorpattern+="t[cdf-hjkm-prtvwz]|"; //tc,td,tf,tg,th,tj,tk,tm,tn,to,tp,tr,tt,tv,tx,tz
	domainvalidatorpattern+="u[agkmsyz]|";     //ua,ug,uk,um,us,uy,uz
	domainvalidatorpattern+="v[aceginu]|";     //va,vc,ve,vg,vy,vn,vu
	domainvalidatorpattern+="w[fs]|";        //wf,ws
	domainvalidatorpattern+="y[etu]|";       //ye,yt,yu
	domainvalidatorpattern+="z[admrw]|";      //za,zd,zm,zr,zw
	domainvalidatorpattern+="com|";         //com
	domainvalidatorpattern+="edu|";         //edu
	domainvalidatorpattern+="net|";         //net
	domainvalidatorpattern+="org|";         //org
	domainvalidatorpattern+="mil|";         //mil
	domainvalidatorpattern+="gov|";         //gov
	domainvalidatorpattern+="biz|";         //biz
	domainvalidatorpattern+="pro|";         //pro
	domainvalidatorpattern+="aero|";        //aero
	domainvalidatorpattern+="coop|";        //coop
	domainvalidatorpattern+="info|";        //info
	domainvalidatorpattern+="name|";        //name
	domainvalidatorpattern+="int|";         //int
	domainvalidatorpattern+="museum";        //museum
	domainvalidatorpattern+=")$";

	var idx = tmpdomain.lastIndexOf(".");
	re = new RegExp(domainvalidatorpattern, "i");
	return re.test(tmpdomain.substring(idx+1));
}

EmailSyntaxValidator.prototype.Address=Address;
EmailSyntaxValidator.prototype.Account=Account;
EmailSyntaxValidator.prototype.Domain=Domain;
EmailSyntaxValidator.prototype.IsValid=IsValid;





//this function provides backwards compatibility with version 3.2 
//jscript edition of the software
function IsEmailAddress(email)
{
	var validator, valid = false;

	//call syntax validator, specifying that the TLD is required
	validator = new EmailSyntaxValidator(email, true);

	//determine validity
	valid = validator.IsValid;

	//cleanup
	validator = null;

	//return validity indicator
	return valid;
}
