var _CONST_EmailChecker_HLPR_VERSION = '1.0';

function c_emailChecker_array() {
    this.length = (arguments.length == 1 && !isNaN(arguments[0])) ? parseInt(arguments[0]) : 0;
    return this;
}

function c_emailChecker_array_Add(item) {
    this[this.length] = item;
    this.length++;
}

c_emailChecker_array.prototype.add = c_emailChecker_array_Add;

function c_emailChecker() {
    this.emailAddress = (arguments.length == 1) ? arguments[0] : '';
    this.VERSION = _CONST_EmailChecker_HLPR_VERSION;
    return this;
}

function c_emailChecker_count(theseChars) {
    var pos = this.emailAddress.indexOf(theseChars);
    var ret = 0;
    while (pos > -1) {
        ret++;
        pos = this.emailAddress.indexOf(theseChars, pos + theseChars.length);
    }
    return ret;
}
c_emailChecker.prototype.count = c_emailChecker_count;

function c_emailChecker_Validate() {
    var b = false;
    var invalidChars = "!#$%^&*()=+{}[]|\;:'/?>,< ";
    
    if (this.emailAddress == '') return b;                                                       // Empty address not allowed
    if (this.emailAddress.indexOf('@') == -1) return b;                                          // At least one "@"
    if (this.emailAddress.indexOf('.') == -1) return b;                                          // At least on "."
    if (this.emailAddress.length < 6) return b;                                                  // At least a length of 6 characters
    if (this.count('@') > 1) return b;                                                           // More than one "@" not allowed
    if (this.emailAddress.lastIndexOf('.') < this.emailAddress.indexOf('@')) return b;           // The last dot must come after "@"
    if (this.emailAddress.indexOf('"') > -1) return b;                                           // Quotation marks not allowed
    if (this.emailAddress.indexOf('@.') > -1 || this.emailAddress.indexOf('.@') > -1) return b;
    if (this.emailAddress.indexOf('..') > -1) return b;                                          // Two consecutive dots not allowed
    for (var i = 0; i < invalidChars.length; i++)
        if (this.emailAddress.indexOf(invalidChars.substr(i, 1)) > -1)
            return b;                                                                            // Don't allow invalid characters
    for (var i = 0; i < genericDomains.length; i++)
        if (this.emailAddress.substr(this.emailAddress.lastIndexOf('.') + 1) == genericDomains[i])
            b = true;                                                                            // Check for Generic Domain suffix
    if (!b)
        for (var i = 0; i < countryCodeDomains.length; i++)
            if (this.emailAddress.substr(this.emailAddress.lastIndexOf('.') + 1) == countryCodeDomains[i])
                b = true;                                                                        // Check for Country Code Domain suffix

    return b;
}
c_emailChecker.prototype.validate = c_emailChecker_Validate;

var genericDomains = new c_emailChecker_array();
var countryCodeDomains = new c_emailChecker_array();

    genericDomains.add('aero');
    genericDomains.add('biz');
    genericDomains.add('com');
    genericDomains.add('coop');
    genericDomains.add('info');
    genericDomains.add('museum');
    genericDomains.add('name');
    genericDomains.add('net');
    genericDomains.add('org');
    genericDomains.add('gov');
    genericDomains.add('edu');
    genericDomains.add('mil');
    genericDomains.add('int');
/*  -=-=-=-=-=-=-=-=-=-=-=-=-=-=-  */
    countryCodeDomains.add('ac');
    countryCodeDomains.add('ad');
    countryCodeDomains.add('ae');
    countryCodeDomains.add('af');
    countryCodeDomains.add('ag');
    countryCodeDomains.add('ai');
    countryCodeDomains.add('al');
    countryCodeDomains.add('am');
    countryCodeDomains.add('an');
    countryCodeDomains.add('ao');
    countryCodeDomains.add('aq');
    countryCodeDomains.add('ar');
    countryCodeDomains.add('as');
    countryCodeDomains.add('at');
    countryCodeDomains.add('au');
    countryCodeDomains.add('aw');
    countryCodeDomains.add('az');
    countryCodeDomains.add('ba');
    countryCodeDomains.add('bb');
    countryCodeDomains.add('bd');
    countryCodeDomains.add('be');
    countryCodeDomains.add('bf');
    countryCodeDomains.add('bg');
    countryCodeDomains.add('bh');
    countryCodeDomains.add('bi');
    countryCodeDomains.add('bj');
    countryCodeDomains.add('bm');
    countryCodeDomains.add('bn');
    countryCodeDomains.add('bo');
    countryCodeDomains.add('br');
    countryCodeDomains.add('bs');
    countryCodeDomains.add('bt');
    countryCodeDomains.add('bv');
    countryCodeDomains.add('bw');
    countryCodeDomains.add('by');
    countryCodeDomains.add('bz');
    countryCodeDomains.add('ca');
    countryCodeDomains.add('cc');
    countryCodeDomains.add('cd');
    countryCodeDomains.add('cf');
    countryCodeDomains.add('cg');
    countryCodeDomains.add('ch');
    countryCodeDomains.add('ci');
    countryCodeDomains.add('ck');
    countryCodeDomains.add('cl');
    countryCodeDomains.add('cm');
    countryCodeDomains.add('cn');
    countryCodeDomains.add('co');
    countryCodeDomains.add('cr');
    countryCodeDomains.add('cu');
    countryCodeDomains.add('cv');
    countryCodeDomains.add('cx');
    countryCodeDomains.add('cy');
    countryCodeDomains.add('cz');
    countryCodeDomains.add('de');
    countryCodeDomains.add('dj');
    countryCodeDomains.add('dk');
    countryCodeDomains.add('dm');
    countryCodeDomains.add('do');
    countryCodeDomains.add('dz');
    countryCodeDomains.add('ec');
    countryCodeDomains.add('ee');
    countryCodeDomains.add('eg');
    countryCodeDomains.add('eh');
    countryCodeDomains.add('er');
    countryCodeDomains.add('es');
    countryCodeDomains.add('et');
    countryCodeDomains.add('eu');
    countryCodeDomains.add('fi');
    countryCodeDomains.add('fj');
    countryCodeDomains.add('fk');
    countryCodeDomains.add('fm');
    countryCodeDomains.add('fo');
    countryCodeDomains.add('fr');
    countryCodeDomains.add('ga');
    countryCodeDomains.add('gd');
    countryCodeDomains.add('ge');
    countryCodeDomains.add('gf');
    countryCodeDomains.add('gg');
    countryCodeDomains.add('gh');
    countryCodeDomains.add('gi');
    countryCodeDomains.add('gl');
    countryCodeDomains.add('gm');
    countryCodeDomains.add('gn');
    countryCodeDomains.add('gp');
    countryCodeDomains.add('gq');
    countryCodeDomains.add('gr');
    countryCodeDomains.add('gs');
    countryCodeDomains.add('gt');
    countryCodeDomains.add('gu');
    countryCodeDomains.add('gw');
    countryCodeDomains.add('gy');
    countryCodeDomains.add('hk');
    countryCodeDomains.add('hm');
    countryCodeDomains.add('hn');
    countryCodeDomains.add('hr');
    countryCodeDomains.add('ht');
    countryCodeDomains.add('hu');
    countryCodeDomains.add('id');
    countryCodeDomains.add('ie');
    countryCodeDomains.add('il');
    countryCodeDomains.add('im');
    countryCodeDomains.add('in');
    countryCodeDomains.add('io');
    countryCodeDomains.add('iq');
    countryCodeDomains.add('ir');
    countryCodeDomains.add('is');
    countryCodeDomains.add('it');
    countryCodeDomains.add('je');
    countryCodeDomains.add('jm');
    countryCodeDomains.add('jo');
    countryCodeDomains.add('jp');
    countryCodeDomains.add('ke');
    countryCodeDomains.add('kg');
    countryCodeDomains.add('kh');
    countryCodeDomains.add('ki');
    countryCodeDomains.add('km');
    countryCodeDomains.add('kn');
    countryCodeDomains.add('kp');
    countryCodeDomains.add('kr');
    countryCodeDomains.add('kw');
    countryCodeDomains.add('ky');
    countryCodeDomains.add('kz');
    countryCodeDomains.add('la');
    countryCodeDomains.add('lb');
    countryCodeDomains.add('lc');
    countryCodeDomains.add('li');
    countryCodeDomains.add('lk');
    countryCodeDomains.add('lr');
    countryCodeDomains.add('ls');
    countryCodeDomains.add('lt');
    countryCodeDomains.add('lu');
    countryCodeDomains.add('lv');
    countryCodeDomains.add('ly');
    countryCodeDomains.add('ma');
    countryCodeDomains.add('mc');
    countryCodeDomains.add('md');
    countryCodeDomains.add('mg');
    countryCodeDomains.add('mh');
    countryCodeDomains.add('mk');
    countryCodeDomains.add('ml');
    countryCodeDomains.add('mm');
    countryCodeDomains.add('mn');
    countryCodeDomains.add('mo');
    countryCodeDomains.add('mp');
    countryCodeDomains.add('mq');
    countryCodeDomains.add('mr');
    countryCodeDomains.add('ms');
    countryCodeDomains.add('mt');
    countryCodeDomains.add('mu');
    countryCodeDomains.add('mv');
    countryCodeDomains.add('mw');
    countryCodeDomains.add('mx');
    countryCodeDomains.add('my');
    countryCodeDomains.add('mz');
    countryCodeDomains.add('na');
    countryCodeDomains.add('nc');
    countryCodeDomains.add('ne');
    countryCodeDomains.add('nf');
    countryCodeDomains.add('ng');
    countryCodeDomains.add('ni');
    countryCodeDomains.add('nl');
    countryCodeDomains.add('no');
    countryCodeDomains.add('np');
    countryCodeDomains.add('nr');
    countryCodeDomains.add('nu');
    countryCodeDomains.add('nz');
    countryCodeDomains.add('om');
    countryCodeDomains.add('pa');
    countryCodeDomains.add('pe');
    countryCodeDomains.add('pf');
    countryCodeDomains.add('pg');
    countryCodeDomains.add('ph');
    countryCodeDomains.add('pk');
    countryCodeDomains.add('pl');
    countryCodeDomains.add('pm');
    countryCodeDomains.add('pn');
    countryCodeDomains.add('pr');
    countryCodeDomains.add('ps');
    countryCodeDomains.add('pt');
    countryCodeDomains.add('pw');
    countryCodeDomains.add('py');
    countryCodeDomains.add('qa');
    countryCodeDomains.add('re');
    countryCodeDomains.add('ro');
    countryCodeDomains.add('ru');
    countryCodeDomains.add('rw');
    countryCodeDomains.add('sa');
    countryCodeDomains.add('sb');
    countryCodeDomains.add('sc');
    countryCodeDomains.add('sd');
    countryCodeDomains.add('se');
    countryCodeDomains.add('sg');
    countryCodeDomains.add('sh');
    countryCodeDomains.add('si');
    countryCodeDomains.add('sj');
    countryCodeDomains.add('sk');
    countryCodeDomains.add('sl');
    countryCodeDomains.add('sm');
    countryCodeDomains.add('sn');
    countryCodeDomains.add('so');
    countryCodeDomains.add('sr');
    countryCodeDomains.add('st');
    countryCodeDomains.add('sv');
    countryCodeDomains.add('sy');
    countryCodeDomains.add('sz');
    countryCodeDomains.add('tc');
    countryCodeDomains.add('td');
    countryCodeDomains.add('tf');
    countryCodeDomains.add('tg');
    countryCodeDomains.add('th');
    countryCodeDomains.add('tj');
    countryCodeDomains.add('tk');
    countryCodeDomains.add('tm');
    countryCodeDomains.add('tn');
    countryCodeDomains.add('to');
    countryCodeDomains.add('tp');
    countryCodeDomains.add('tr');
    countryCodeDomains.add('tt');
    countryCodeDomains.add('tv');
    countryCodeDomains.add('tw');
    countryCodeDomains.add('tz');
    countryCodeDomains.add('ua');
    countryCodeDomains.add('ug');
    countryCodeDomains.add('uk');
    countryCodeDomains.add('um');
    countryCodeDomains.add('us');
    countryCodeDomains.add('uy');
    countryCodeDomains.add('uz');
    countryCodeDomains.add('va');
    countryCodeDomains.add('vc');
    countryCodeDomains.add('ve');
    countryCodeDomains.add('vg');
    countryCodeDomains.add('vi');
    countryCodeDomains.add('vn');
    countryCodeDomains.add('vu');
    countryCodeDomains.add('wf');
    countryCodeDomains.add('ws');
    countryCodeDomains.add('ye');
    countryCodeDomains.add('yt');
    countryCodeDomains.add('yu');
    countryCodeDomains.add('za');
    countryCodeDomains.add('zm');
    countryCodeDomains.add('zw');

