174 lines
6.5 KiB
JavaScript
174 lines
6.5 KiB
JavaScript
/*! mailcheck v1.1.2 @licence MIT */
|
|
var Mailcheck = {
|
|
domainThreshold: 2,
|
|
secondLevelThreshold: 2,
|
|
topLevelThreshold: 2,
|
|
defaultDomains: ["msn.com", "bellsouth.net", "telus.net", "comcast.net", "optusnet.com.au", "earthlink.net", "qq.com", "sky.com", "icloud.com", "mac.com", "sympatico.ca", "googlemail.com", "att.net", "xtra.co.nz", "web.de", "cox.net", "gmail.com", "ymail.com", "aim.com", "rogers.com", "verizon.net", "rocketmail.com", "google.com", "optonline.net", "sbcglobal.net", "aol.com", "me.com", "btinternet.com", "charter.net", "shaw.ca"],
|
|
defaultSecondLevelDomains: ["yahoo", "hotmail", "mail", "live", "outlook", "gmx"],
|
|
defaultTopLevelDomains: ["com", "com.au", "com.tw", "ca", "co.nz", "co.uk", "de", "fr", "it", "ru", "net", "org", "edu", "gov", "jp", "nl", "kr", "se", "eu", "ie", "co.il", "us", "at", "be", "dk", "hk", "es", "gr", "ch", "no", "cz", "in", "net", "net.au", "info", "biz", "mil", "co.jp", "sg", "hu", "uk"],
|
|
run: function(a) {
|
|
a.domains = a.domains || Mailcheck.defaultDomains,
|
|
a.secondLevelDomains = a.secondLevelDomains || Mailcheck.defaultSecondLevelDomains,
|
|
a.topLevelDomains = a.topLevelDomains || Mailcheck.defaultTopLevelDomains,
|
|
a.distanceFunction = a.distanceFunction || Mailcheck.sift4Distance;
|
|
var b = function(a) {
|
|
return a
|
|
}
|
|
, c = a.suggested || b
|
|
, d = a.empty || b
|
|
, e = Mailcheck.suggest(Mailcheck.encodeEmail(a.email), a.domains, a.secondLevelDomains, a.topLevelDomains, a.distanceFunction);
|
|
return e ? c(e) : d()
|
|
},
|
|
suggest: function(a, b, c, d, e) {
|
|
a = a.toLowerCase();
|
|
var f = this.splitEmail(a);
|
|
if (c && d && -1 !== c.indexOf(f.secondLevelDomain) && -1 !== d.indexOf(f.topLevelDomain))
|
|
return !1;
|
|
var g = this.findClosestDomain(f.domain, b, e, this.domainThreshold);
|
|
if (g)
|
|
return g == f.domain ? !1 : {
|
|
address: f.address,
|
|
domain: g,
|
|
full: f.address + "@" + g
|
|
};
|
|
var h = this.findClosestDomain(f.secondLevelDomain, c, e, this.secondLevelThreshold)
|
|
, i = this.findClosestDomain(f.topLevelDomain, d, e, this.topLevelThreshold);
|
|
if (f.domain) {
|
|
g = f.domain;
|
|
var j = !1;
|
|
if (h && h != f.secondLevelDomain && (g = g.replace(f.secondLevelDomain, h),
|
|
j = !0),
|
|
i && i != f.topLevelDomain && "" !== f.secondLevelDomain && (g = g.replace(new RegExp(f.topLevelDomain + "$"), i),
|
|
j = !0),
|
|
j)
|
|
return {
|
|
address: f.address,
|
|
domain: g,
|
|
full: f.address + "@" + g
|
|
}
|
|
}
|
|
return !1
|
|
},
|
|
findClosestDomain: function(a, b, c, d) {
|
|
d = d || this.topLevelThreshold;
|
|
var e, f = 1 / 0, g = null;
|
|
if (!a || !b)
|
|
return !1;
|
|
c || (c = this.sift4Distance);
|
|
for (var h = 0; h < b.length; h++) {
|
|
if (a === b[h])
|
|
return a;
|
|
e = c(a, b[h]),
|
|
f > e && (f = e,
|
|
g = b[h])
|
|
}
|
|
return d >= f && null !== g ? g : !1
|
|
},
|
|
sift4Distance: function(a, b, c) {
|
|
if (void 0 === c && (c = 5),
|
|
!a || !a.length)
|
|
return b ? b.length : 0;
|
|
if (!b || !b.length)
|
|
return a.length;
|
|
for (var d = a.length, e = b.length, f = 0, g = 0, h = 0, i = 0, j = 0, k = []; d > f && e > g; ) {
|
|
if (a.charAt(f) == b.charAt(g)) {
|
|
i++;
|
|
for (var l = !1, m = 0; m < k.length; ) {
|
|
var n = k[m];
|
|
if (f <= n.c1 || g <= n.c2) {
|
|
l = Math.abs(g - f) >= Math.abs(n.c2 - n.c1),
|
|
l ? j++ : n.trans || (n.trans = !0,
|
|
j++);
|
|
break
|
|
}
|
|
f > n.c2 && g > n.c1 ? k.splice(m, 1) : m++
|
|
}
|
|
k.push({
|
|
c1: f,
|
|
c2: g,
|
|
trans: l
|
|
})
|
|
} else {
|
|
h += i,
|
|
i = 0,
|
|
f != g && (f = g = Math.min(f, g));
|
|
for (var o = 0; c > o && (d > f + o || e > g + o); o++) {
|
|
if (d > f + o && a.charAt(f + o) == b.charAt(g)) {
|
|
f += o - 1,
|
|
g--;
|
|
break
|
|
}
|
|
if (e > g + o && a.charAt(f) == b.charAt(g + o)) {
|
|
f--,
|
|
g += o - 1;
|
|
break
|
|
}
|
|
}
|
|
}
|
|
f++,
|
|
g++,
|
|
(f >= d || g >= e) && (h += i,
|
|
i = 0,
|
|
f = g = Math.min(f, g))
|
|
}
|
|
return h += i,
|
|
Math.round(Math.max(d, e) - h + j)
|
|
},
|
|
splitEmail: function(a) {
|
|
a = null !== a ? a.replace(/^\s*/, "").replace(/\s*$/, "") : null;
|
|
var b = a.split("@");
|
|
if (b.length < 2)
|
|
return !1;
|
|
for (var c = 0; c < b.length; c++)
|
|
if ("" === b[c])
|
|
return !1;
|
|
var d = b.pop()
|
|
, e = d.split(".")
|
|
, f = ""
|
|
, g = "";
|
|
if (0 === e.length)
|
|
return !1;
|
|
if (1 == e.length)
|
|
g = e[0];
|
|
else {
|
|
f = e[0];
|
|
for (var h = 1; h < e.length; h++)
|
|
g += e[h] + ".";
|
|
g = g.substring(0, g.length - 1)
|
|
}
|
|
return {
|
|
topLevelDomain: g,
|
|
secondLevelDomain: f,
|
|
domain: d,
|
|
address: b.join("@")
|
|
}
|
|
},
|
|
encodeEmail: function(a) {
|
|
var b = encodeURI(a);
|
|
return b = b.replace("%20", " ").replace("%25", "%").replace("%5E", "^").replace("%60", "`").replace("%7B", "{").replace("%7C", "|").replace("%7D", "}")
|
|
}
|
|
};
|
|
"undefined" != typeof module && module.exports && (module.exports = Mailcheck),
|
|
"function" == typeof define && define.amd && define("mailcheck", [], function() {
|
|
return Mailcheck
|
|
}),
|
|
"undefined" != typeof window && window.jQuery && !function(a) {
|
|
a.fn.mailcheck = function(a) {
|
|
var b = this;
|
|
if (a.suggested) {
|
|
var c = a.suggested;
|
|
a.suggested = function(a) {
|
|
c(b, a)
|
|
}
|
|
}
|
|
if (a.empty) {
|
|
var d = a.empty;
|
|
a.empty = function() {
|
|
d.call(null, b)
|
|
}
|
|
}
|
|
a.email = this.val(),
|
|
Mailcheck.run(a)
|
|
}
|
|
}(jQuery);
|