﻿var alphabets = /[a-zA-Z]/;
var nameFilter = /^[a-zA-Z\'\-\s]+$/;
var startNameFilter = /^[a-zA-Z]$/;
var passwordFilter = /^[0-9a-zA-Z\-\!\@\#\$\%\^\&\*\(\)\-\_\+\?\.\:\;\[\]\=]+$/;
var numberFilter = /^[0-9]+$/;
var emailFilter = /^[A-z0-9\-_]+(\.[A-z0-9\-_]+)*@(([A-z0-9]+\-?[A-z0-9]+)+\.)+[A-z]{2,6}$/i;
var unameFilter = /^[0-9a-zA-Z\-\_\.]+$/;
var stringFilter = /^[a-zA-Z\s]+$/;
var specialCharsFilter = /^[\-\s\'\!\@\#\$\%\^\&\*\(\)\-\_\+\?\.\:\;\[\]\/\,\"\=]+$/;

function checkBlank(inputVal, errorMsg, errorId, fieldName) {
    if (inputVal.length == 0) {
        return errorDisplay(errorId, errorMsg, fieldName);
    }
    return true;
}

function checkPasswords(fieldName1, fieldName2, passMinLen, passMaxLen, errorId1, errorId2) {
    var passwd1Val = document.getElementById(fieldName1).value;
    var passwd2Val = document.getElementById(fieldName2).value;
    if (!checkBlank(passwd1Val, "Please enter your password.", errorId1, fieldName1)) {
        return false;
    }
    if (!checkPasswordLength(passwd1Val, errorId1, passMinLen, passMaxLen, fieldName1)) {
        return false;
    }
    if (!passwordFilter.test(passwd1Val)) {
        return errorDisplay(errorId1, "Invalid characters in your password.", fieldName1);
    }
    if (passwd1Val != passwd2Val) {
        return errorDisplay(errorId2, "The passwords do not match.", fieldName2);
    }
    return true;
}
function checkPasswordLength(passwd1Val, errorId1, passMinLen, passMaxLen, fieldName1) {
    if (passwd1Val.length < passMinLen) {
        return errorDisplay(errorId1, "The minimum length of password is " + passMinLen + ".", fieldName1);
    }
    if (passwd1Val.length > passMaxLen) {
        return errorDisplay(errorId1, "The maximum length of password is " + passMaxLen + ".", fieldName1);
    }
    return true;
}
function Trim(str) {
    return LTrim(RTrim(str));
}
function LTrim(str) {
    for (var ii = 0; ii < str.length && str.charAt(ii) <= " "; ii++);
    return str.substring(ii, str.length);
}
function RTrim(str) {
    for (var ii = str.length - 1; ii >= 0 && str.charAt(ii) <= " "; ii--);
    return str.substring(0, ii + 1);
}
function findUniqueChars(str) {
    arrChars = str.split('');
    checkArr = unique(arrChars);
    return checkArr;
}
function unique(a) {
    tmp = new Array(0);
    for (i = 0; i < a.length; i++) {
        if (!contains(tmp, a[i])) {
            tmp.length += 1;
            tmp[tmp.length - 1] = a[i];
        }
    }
    return tmp;
}
function contains(a, e) {
    for (j = 0; j < a.length; j++) if (a[j] == e) return true;
    return false;
}

function errorDisplay(errorId, errorMsg, fieldName) {
    errorSpan = document.getElementById(errorId);
    errorSpan.innerHTML = errorMsg;
    if (setFocus == false) {
        try {
            document.getElementById(fieldName).focus();
            setFocus = true;
        } catch (exc) {
            setFocus = false;
        }
    }
    return false;
}

function checkUserName(fieldName, fieldNameString, errorId) {
    var inputVal = Trim(document.getElementById(fieldName).value);
    if (!checkBlank(inputVal, "Please enter your " + fieldNameString + ".", errorId, fieldName)) {
        return false;
    }
    if (!regUserName(fieldName, fieldNameString, errorId)) {
        return false;
    }
    if (findUniqueChars(inputVal).length <= 1) {
        return errorDisplay(errorId, "The \"" + fieldNameString + "\" you entered does not seem to be valid.", fieldName);
    }
    return true;
}

// check for a valid user name
function regUserName(fieldName, fieldNameString, errorId) {
    var inputVal = Trim(document.getElementById(fieldName).value);
    if (!unameFilter.test(inputVal)) {
        return errorDisplay(errorId, "Invalid Characters in the field \"" + fieldNameString + "\"", fieldName);
    }
    if (!startNameFilter.test(inputVal.charAt(0))) {
        return errorDisplay(errorId, "The \"" + fieldNameString + "\" you entered does not seem to be valid.", fieldName);
    }
    return true;
}


function checkName(fieldName, fieldNameString, errorId) {
    var inputVal = Trim(document.getElementById(fieldName).value);
    if (!checkBlank(inputVal, "Please enter your " + fieldNameString + ".", errorId, fieldName)) {
        return false;
    }
    if (!regName(fieldName, fieldNameString, errorId)) {
        return false;
    }
    if (findUniqueChars(inputVal).length <= 1) {
        return errorDisplay(errorId, "The \"" + fieldNameString + "\" you entered does not seem to be valid.", fieldName);
    }
    return true;
}

function checkLastName(fieldName, fieldNameString, errorId) {
    var inputVal = Trim(document.getElementById(fieldName).value);
    if (!checkBlank(inputVal, "Please enter your " + fieldNameString + ".", errorId, fieldName)) {
        return false;
    }
    if (!regName(fieldName, fieldNameString, errorId)) {
        return false;
    }
    return true;
}

// check for a valid name
function regName(fieldName, fieldNameString, errorId) {
    var inputVal = Trim(document.getElementById(fieldName).value);
    if (!nameFilter.test(inputVal)) {
        return errorDisplay(errorId, "Invalid Characters in the field \"" + fieldNameString + "\"", fieldName);
    }
    if (!startNameFilter.test(inputVal.charAt(0))) {
        return errorDisplay(errorId, "The \"" + fieldNameString + "\" you entered does not seem to be valid.", fieldName);
    }
    return true;
}

function checkEmail(fieldName, fieldNameString, errorId) {
    var inputVal = Trim(document.getElementById(fieldName).value);
    if (!checkBlank(inputVal, "Please enter your " + fieldNameString + ".", errorId, fieldName)) {
        return false;
    }
    if (!emailFilter.test(inputVal)) {
        return errorDisplay(errorId, "Invalid " + fieldNameString, fieldName);
    }
    if (!validateEmail(inputVal, fieldNameString, errorId, true, true, fieldName)) {
        return false;
    }
    return true;
}

function validateEmail(addr, fieldNameString, errorId, man, db, fieldName) {
    if (addr == '' && man) {
        if (db) errorDisplay(errorId, "The \"" + fieldNameString + "\" is mandatory.", fieldName);
        return false;
    }
    if (addr == '') return true;
    var invalidChars = '\/\'\\ ";:?!()[]\{\}^|';
    for (i = 0; i < invalidChars.length; i++) {
        if (addr.indexOf(invalidChars.charAt(i), 0) > -1) {
            if (db) errorDisplay(errorId, "The \"" + fieldNameString + "\" contains invalid characters", fieldName);
            return false;
        }
    }
    for (i = 0; i < addr.length; i++) {
        if (addr.charCodeAt(i) > 127) {
            if (db) errorDisplay(errorId, "The \"" + fieldNameString + "\" contains non ascii characters.", fieldName);
            return false;
        }
    }

    var atPos = addr.indexOf('@', 0);
    if (atPos == -1) {
        if (db) errorDisplay(errorId, "The \"" + fieldNameString + "\" must contain an @", fieldName);
        return false;
    }
    if (atPos == 0) {
        if (db) errorDisplay(errorId, "The \"" + fieldNameString + "\" must not start with @", fieldName);
        return false;
    }
    if (addr.indexOf('@', atPos + 1) > -1) {
        if (db) errorDisplay(errorId, "The \"" + fieldNameString + "\" must contain only one @", fieldName);
        return false;
    }
    if (addr.indexOf('.', atPos) == -1) {
        if (db) errorDisplay(errorId, "The \"" + fieldNameString + "\" must contain a period in the domain name", fieldName);
        return false;
    }
    if (addr.indexOf('@.', 0) != -1) {
        if (db) errorDisplay(errorId, "In \"" + fieldNameString + "\", period must not immediately follow @", fieldName);
        return false;
    }
    if (addr.indexOf('.@', 0) != -1) {
        if (db) errorDisplay(errorId, "In \"" + fieldNameString + "\", period must not immediately precede @", fieldName);
        return false;
    }
    if (addr.indexOf('..', 0) != -1) {
        if (db) errorDisplay(errorId, "In \"" + fieldNameString + "\", two periods must not be adjacent", fieldName);
        return false;
    }

    var ext_string = addr.substring(atPos);
    var ext = ext_string.split('.');
    if (ext.length != unique(ext).length) {
        errorDisplay(errorId, "Repeated  primary domains in \"" + fieldNameString + "\"", fieldName);
        return false;
    }

    return true;
}

var errorFields;
function clearErrorFields() {
    for (i = 0; i < errorFields.length; i++) {
        eval("window.document.getElementById('" + errorFields[i] + "').innerHTML = '';");
    }
    return;
}
