/**
 * Form Validation for Caliber Games registration forms
 *
 * Copyright 2007-2008, Caliber Games AB
 *
 * The form validation functions require that there is a settings hash defined
 * on the window object. It should contain the following keys:
 *
 *  - require_email : true if the validation should require email, false
 *                    otherwise.
 **/


String.prototype.levenshtein = function(c) {
    var s, l = (s = this.split("")).length, t = (c = c.split("")).length, i, j, m, n;
    if (!(l || t))
        return Math.max(l, t);
    for (var a = [], i = l + 1; i; a[--i] = [i]);
    for(i = t + 1; a[0][--i] = i;);
    for(i = -1, m = s.length; ++i < m;)
        for(j = -1, n = c.length; ++j < n;)
            a[(i *= 1) + 1][(j *= 1) + 1] = Math.min(a[i][j + 1] + 1, a[i + 1][j] + 1, a[i][j] + (s[i] != c[j]));
    return a[l][t];
};

function levensort(a, b) {
    return a[0] - b[0];
}

function checkDomain(domain) {
    var knownDomains = [
'hotmail.com',
'telia.com',
'gmail.com',
'spray.se',
'spray.com',
'online.no',
'telenet.be',
'msn.com',
'yahoo.com',
'bredband.net',
'yahoo.se',
'skynet.be',
'comhem.se',
'home.nl',
'home.se',
'pandora.be',
'swipnet.se',
'yahoo.no',
'planet.nl',
'chello.nl',
'hetnet.nl',
'wanadoo.nl',
'tele2.se',
'glocalnet.net',
'c2i.net',
'zonnet.nl',
'chello.se',
'start.no',
'broadpark.no',
'casema.nl',
'mail.dk',
'live.nl',
'quicknet.nl',
'yahoo.dk',
'passagen.se',
'student.liu.se',
'tiscali.nl',
'ofir.dk',
'orange.nl',
'kpnplanet.nl',
'chello.no',
'frisurf.no',
'scarlet.be',
'web.de',
'aol.com',
'xs4all.nl',
'zeelandnet.nl',
'webspeed.dk',
'stud.ntnu.no',
'stofanet.dk',
'gmx.de',
'teliasonera.com',
'hotmail.se',
'spray.no',
'versatel.nl',
'telia.se',
'mail.com',
'vgregion.se',
'sol.dk',
'yahoo.co.uk',
'bluezone.no',
'kth.se',
'jubii.dk',
'get2net.dk',
'ericsson.com',
'sverige.nu',
'volvocars.com',
'privat.dk',
'mail.tele.dk',
'lyse.net',
'volvo.com',
'euphonynet.be',
'tele2.no',
'student.ltu.se',
'bostream.nu',
'student.mdh.se',
'student.umu.se',
'belgacom.net',
'skane.se',
'12move.nl',
'mac.com',
'kabelfoon.nl',
'student.uu.se',
'netcom.no',
'compaqnet.se',
'hotmail.no',
'tiscali.no',
'tiscali.se',
'lycos.nl',
'student.lu.se',
'epost.no',
'yahoo.de',
'versateladsl.be',
'brevet.nu',
'student.vxu.se',
'luukku.com',
'calibermedia.se',
'privat.utfors.se',
'handelsbanken.se',
'student.uib.no',
'tninet.se',
'hccnet.nl',
't-online.de',
'malmo.se',
'gbgsd.se',
'adsl.no',
'hem.utfors.se',
'gmx.net',
'telenor.com',
'monet.no',
'student.hik.se',
'posten.se',
'sensewave.com',
'rixmail.se',
'bolina.hsb.se',
'lio.se',
'live.se',
'netatonce.net',
'yahoo.fr',
'dhl.com',
'tjohoo.se',
'algonet.se',
'euromail.se',
'caiway.nl',
'vip.cybercity.dk',
'umea.se',
'orebro.se',
'du.se',
'tdcadsl.dk',
'sas.se',
'aland.net',
'minpost.nu',
'freenet.de',
'post.tele.dk',
'pp.inet.fi',
'email.com',
'losmail.no',
'ica.se',
'fas.harvard.edu',
'statoil.com',
'pc.dk',
'scarlet.nl',
'fsb.se',
'scania.com',
'wxs.nl',
'tele2.nl',
'nordea.se',
'fulladsl.be',
'stud.mah.se',
'astrazeneca.com',
'karolinska.se',
'tiscali.be',
'ltdalarna.se',
'lycos.com',
'hjemme.no',
'excite.com',
'siemens.com',
'freeler.nl',
'sll.se',
'rocketmail.com',
'os.dk',
'forsakringskassan.se',
'tietoenator.com',
'minmail.net',
'student.lhs.se',
'banverket.se',
'akerkvaerner.com',
'student.ki.se',
'chl.chalmers.se',
'student.his.se',
'ebox.tninet.se',
'vattnet.com',
'ihh.hj.se',
'ipbolaget.com',
'netscape.net',
'eskilstuna.se'
    ];
    var distances = [];
    for (var n = 0; n < knownDomains.length; n++) {
        var this_domain = knownDomains[n];
        var dist = domain.levenshtein(this_domain);
        distances[n] = [dist, this_domain];
    }

    distances.sort(levensort);
    var min_dist = distances[0][0]
    if (min_dist <= 4 && min_dist > 0)
        return distances[0][1];
    return true;
}

function validateForm(form) {
    window.settings = window.settings || {};

    var v1 = validFirstname(form);
    var v2 = validLastname(form);
    var v3 = validEmail(form);
    var v4 = validEmailConfirm(form);
    var v5 = validGender(form);
    var v6 = validAcceptEmail(form);
    var v7 = validAcceptRules(form);

    var status = (v1 && v2 && v3 && v4 && v5 && v6 && v7);

    el = document.getElementById("birthyear")
    if(el != null && el.hasChildNodes()){
        var v8 = validBirthYear(form);
        status = (status && v8);
    }

    if(!status) {
        warn(form.id + "_form_msg", status);
        return false;
    }

    el = document.getElementById("emailAnalise_form_msg")
    if(el != null && el.hasChildNodes()){
        return analyzeEmail(form);
    }
    return true;
}
var suggestedEmail;
function analyzeEmail(form){
    // Do a domain name check.
    var email = form.elements['email'].value.toLowerCase();

    var parts = email.split('@');
    var domain = parts[1];

    var domainResult = checkDomain(domain);

    if (domainResult != true) {

        el = document.getElementById("registration_suggested_email")
        var len = el.childNodes.length;
        for (var i = 0; i < len; i++) {
            el.removeChild(el.childNodes[i]);
        }

        var node = document.createTextNode(parts[0] + "@" + domainResult);
        el.appendChild(node);
        suggestedEmail = node.data;

        el = document.getElementById("registration_correct_email")
        el.value = el.value +" "+ suggestedEmail;

        el = document.getElementById("registration_use_addr");
        el.value = el.value +" "+ email;

        warn("emailAnalise_form_msg", false);
        return false;
    }
    return true;
}

function correctEmail(){
    document.getElementById("emailInput").value = suggestedEmail;
    document.getElementById("emailconfirm").value = suggestedEmail;
    document.getElementById('emailInput').style.color = "green";
    document.getElementById('emailconfirm').style.color = "green";
}
function validEmail(form) {
    var field = form.elements['email'];

    var value = field.value;

    var format = value.match(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i);
    format = (format != null);

    var domain = value.match(/@spambob.(com|net|org)$/i) ||
    value.match(/@pookmail.com$/i) ||
    value.match(/@mailinator[2]?.(com|net)$/i) || value.match(/@sogetthis.com$/) ||
    value.match(/@mailin8r.com$/i) || value.match(/@spamherelots.com$/i) ||
    value.match(/@thisisnotmyrealemail.com$/i) ||
    value.match(/@dodgit.com$/i) ||
    value.match(/@trashymail.com$/i) ||
    value.match(/@spamarvert.com$/i);
    domain = (domain == null);

    var status = format && domain;
    warn(form.id + "_email_msg", status);
    return status;
}

function validEmailConfirm(form) {
    var field = form.elements['emailconfirm'];
    if(!field)
        return true;

    var field2 = form.elements['email'];
    var status = field.value.toLowerCase() == field2.value.toLowerCase();
    warn(form.id + "_emailconfirm_msg", status);
    return status;
}

function validFirstname(form) {
    var field = form.elements['firstname'];

    if(!field)
        return false;

    var status = field.value.match(/^([\S]{2,}[\s]?)+$/i) != null;
    warn(form.id + "_firstname_msg", status);
    return status;
}

function validLastname(form) {
    var field = form.elements['lastname'];

    if(!field)
        return false;

    var status = field.value.match(/^([\S]{2,}[\s]?)+$/i) != null;
    warn(form.id + "_lastname_msg", status);
    return status;
}

function validGender(form) {
    var fields = form.elements['gender'];

    if(!fields)
        return true;

    if(!fields.length)
        return true;

    var status = false;
    for(i=0; i<fields.length; i++) {
        if(fields[i].checked || fields[i].selected) {
            status = true;
            break;
        }
    }

    warn(form.id + "_gender_msg", status);
    return status;
}

function validAcceptRules(form) {
    var field = form.elements['acceptrules'];
    if(!field)
        return false;

    var status = field.checked;
    warn(form.id + "_acceptrules_msg", status);
    return status;
}

function validAcceptEmail(form) {
    var field = form.elements['acceptemail'];
    if(!field)
        return true;

    var status = field.checked;
    if (!window.settings['require_email'])
        status = true;
    warn(form.id + "_acceptemail_msg", status);
    return status;
}

function validBirthYear(form) {
    var status = false;

    try {
        var bd = form.elements['birthyear'].value;
        if(bd.length > 0)
            status = true;
    }
    catch(e) {}

    warn(form.id + "_birthdate_msg", status);
    return status;
}

function warn(id, status) {
    var element = document.getElementById(id);
    if(!element)
        return;

    if(status)
        element.style.display = "none";
    else
        element.style.display = "";
}
