﻿/*	JavaScript Source File
	for http://www.speednet.biz
	Authored by Todd Northrop
	E-mail: http://www.speednet.biz/contact.aspx
	Copyright (c) 2009-2010. All Rights Reserved.
------------------------------------------------------*/

String.prototype.isValidEmail = function () {
	return (/^(?!www\.)\w+(?![^@]*\.@)[-.\w~!#$%^&*+`=|}{\/?]*(?=@.{4,98}$)@(?:(?!www\.)(?:(?![-.])[-a-z0-9]{0,62}[a-z0-9]\.)+[a-z]{2,6}|www\.[a-z]{2,6}|\[(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\])$/i.test(this));
};

String.prototype.hasCommonEmailExtension = function () {

	if (this.length < 4) {
		return false;
	}
	
	var str = this.toLowerCase();
	return ([".aero", ".arpa", ".asia", ".biz", ".cat", ".com", ".coop", ".edu", ".gov", ".info", ".int", ".jobs", ".mil", ".mobi", ".museum", ".name", ".net", ".org", ".pro", ".tel", ".travel"].trueForAny(function (v) { return str.endsWith(v); }));
};

String.prototype.hasCountryEmailExtension = function () {

	if (this.length < 3) {
		return false;
	}
	
	var str = this.slice(-3);
	return ((str.charAt(0) == ".") && (".ac.ad.ae.af.ag.ai.al.am.an.ao.aq.ar.as.at.au.aw.ax.az.ba.bb.bd.be.bf.bg.bh.bi.bj.bl.bm.bn.bo.br.bs.bt.bv.bw.by.bz.ca.cc.cd.cf.cg.ch.ci.ck.cl.cm.cn.co.cr.cu.cv.cx.cy.cz.de.dj.dk.dm.do.dz.ec.ee.eg.eh.er.es.et.eu.fi.fj.fk.fm.fo.fr.ga.gb.gd.ge.gf.gg.gh.gi.gl.gm.gn.gp.gq.gr.gs.gt.gu.gw.gy.hk.hm.hn.hr.ht.hu.id.ie.il.im.in.io.iq.ir.is.it.je.jm.jo.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.mk.ml.mm.mn.mo.mp.mq.mr.ms.mt.mu.mv.mw.mx.my.mz.na.nc.ne.nf.ng.ni.nl.no.np.nr.nu.nz.om.pa.pe.pf.pg.ph.pk.pl.pm.pn.pr.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.tf.tg.th.tj.tk.tl.tm.tn.to.tp.tr.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".indexOf(str.toLowerCase()) !== -1));
};

String.prototype.isValidEmailAndExt = function () {
	return (this.isValidEmail() && (this.hasCommonEmailExtension() || this.hasCountryEmailExtension()));
};

String.prototype.endsWith = function (suffix) {
	/// <param name="suffix" type="String"></param>
	/// <returns type="Boolean"></returns>
	return ((this.length === 0) || (typeof(suffix) !== "string") || (suffix.isEmpty()))? false : (this.slice(-suffix.length) === suffix);
};

Array.prototype.trueForAny = function (action) {
	var i,
		result = false,
		length = this.length;

	for (var i=0; i<length; i++) {
		if (result = !!action(this[i], i)) {
			break;
		}
	}
	
	return result;
};

