function validUsername(username) {
    if (username.length <= 0) {
        return "Please enter Username";
    }
    for (var i = 0; i < username.length; i++) {
        var c = username.charAt(i);
        if (c <= ' ') {
            return "Sorry, no spaces allowed in Usernames";
        } else if (c == '_') {
            // fine
        } else if (! ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) ) {
            return "Sorry, only letters, numbers, and underscores are allowed in Usernames";
        }
    }
    return null;
}

function validPassword(pass) {
    if (pass.length <= 0) {
        return "Please enter Password";
    }
    for (var i = 0; i < pass.length; i++) {
        var c = pass.charAt(i);
        if (c <= ' ') {
            return "Sorry, no spaces are allowed in Passwords";
        } else if (c == '_') {
            // fine
        } else if (! ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) ) {
            return "Sorry, only letters, numbers, and underscores are allowed in Passwords";
        }
    }
    return null;
}


function playSound(url) {
    if (document.all && document.all.music) {
        document.all.music.src=url;
    }
}


function random(lo, hi) {
    return Math.round((lo + Math.random() * (hi - lo)));
}

function randomPassChar() {
    var asc = random(0, 35);
    if (asc >= 10) {
        asc = 'a'.charCodeAt(0) + (asc - 10);
    } else {
        asc = '0'.charCodeAt(0) + asc;
    }
    return String.fromCharCode(asc);
}

function randomPassword(len) {
    var p = "";
    while (len > 0) {
        len--;
        p += randomPassChar();
    }
    return p;
}





function validEmail(str) {
    // a valid email address can have up to a 64 byte, possibly case sensitive,
    // alais string.

    var at = -1;
    var dot = -1;

    if (str.length <= 0) {
        return "Please enter E-mail Address";
    }

    for (var i = 0; i < str.length; i++) {
        var c = str.charAt(i);
        if (c <= ' ') {
            return "Sorry, spaces are not possible in E-mail Addresses";
        } else if (c == '_' || c == '.') {
            // fine
        } else if (c == '@') {
            at = i;
            break;
        } else if (! ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) ) {
            return "Only letters, numbers, and underscores are allowed in E-mail Address";
        }
    }

    if (at < 1) {
        return "Sorry, E-mail Addresses must be of the format \"user@host.domain\"";
    }


    for (var i = at + 1; i < str.length; i++) {
        var c = str.charAt(i);
        if (c == '.') {
            // good
            dot = i;
        } else if (! ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c == '-')) ) {
            return "Sorry, only letters, numbers, and dashes are allowed in E-mail Address host";
        }
    }

    if (dot < 1 || dot == str.length - 1) {
        return "Sorry, E-mail Address must be of the format \"user@host.domain\"";
    }

    return null;
}



function validNameField(fieldName, str) {
    if (str == null || str.length <= 0) {
        return "Please enter " + fieldName;
    }
    for (var i = 0; i < str.length; i++) {
        var c = str.charAt(i);
        if (c <= ' ' || c == '.') {
            // fine
        } else if (c == '-' || c == '\'') {
            // fine fine whatever...
        } else if (! ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) ) {
            return "Sorry, only letters, spaces, numbers, and periods are allowed in " + fieldName;
        }
    }
    return null;
}

function validFirstName(str) {
    return validNameField("First Name", str);
}

function validLastName(str) {
    return validNameField("Last Name", str);
}

function validPhone(str) {
    if (str.length <= 0) {
        return "Please enter Phone Number";
    }
    // var fmt1 = "(nnn) nnn-nnnn";
    // var fmt2 = "nnn-nnn-nnnn";
    // so it just needs at least area code, prefix, and then the 4-digit number.
    // so just count them... backwards...

    var digitCount = 0;

    for (var i = str.length; i >= 0; i--) {
        var c = str.charAt(i);
        if (c <= ' ') {
            // why is there a space in a phone number??? don't ask me... oh well...
        } else if (c == '-' || c == '.' || c == '(' || c == ')') {
            // ok
        } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
            return "Please do NOT use letters in Phone Numbers";
        } else if (c >= '0' && c <= '9') {
            digitCount++;
        } else {
            return "Please use Only numbers and separators in Phone Numbers";
        }
    }

    if (digitCount < 10) {
        return "Please enter the Phone Number with area code, prefix, and 4-digit number.";
    }

    return null;
}


function validNumber(fieldName, str) {
    if (str.length <= 0) {
        return "Please enter " + fieldName;
    }
    for (var i = 0; i < str.length; i++) {
        c = str.charAt(i);
        if (c >= '0' && c <= '9') {
            // okay, it is a digit...
        } else if (c == '.') {
            // okay, it is a decimal point...
        } else {
            // what else can really be in a number???
            return fieldName + " may only contain numbers and periods.";
        }
    }
    return null;
}


function validPositiveNumber(fieldName, str) {
    if (str.length <= 0) {
        return "Please enter " + fieldName;
    }
    for (var i = 0; i < str.length; i++) {
        c = str.charAt(i);
        if (c >= '0' && c <= '9') {
            // okay, it is a digit...
        } else if (c == '.') {
            // okay, it is a decimal point...
        } else {
            // what else can really be in a number???
            return fieldName + " may only contain numbers and periods.";
        }
    }
    if (parseFloat(str) <= 0) {
        return "Please make " + fieldName + " a Positive number.";
    }
    return null;
}


function validTimestamp(fieldName, str) {
    if (str.length <= 0) {
        return "Please enter " + fieldName;
    }
    var errorString = fieldName + " must be of format \"yyyy-mm-dd hh:mm:ss\"";
    var dashCount = 0;
    var breakAt = -1;
    for (var i = 0; i < str.length; i++) {
        c = str.charAt(i);
        if (c >= '0' && c <= '9') {
            // okay, it is a digit...
        } else if (c == '-') {
            if (i == 4 || i == 7) {
                // okay, it is a dash in the yyyy-mm-dd
                dashCount++;
            } else {
                return errorString;
            }
        } else if (c <= ' ') {
            breakAt = i;
            break;
        } else {
            return errorString;
        }
    }

    if (dashCount != 2) {
        return errorString;
    }

    if (breakAt < 0) {
        return null;
    }

    while (breakAt < str.length && str.charAt(breakAt) <= ' ') {
        breakAt++;
    }

    var colinCount = 0;

    for (var i = breakAt; i < str.length; i++) {
        c = str.charAt(i);
        if (c >= '0' && c <= '9') {
            // okay, it is a digit...
        } else if (c == ':') {
            if (i == breakAt + 2 || i == breakAt + 5) {
                colinCount++;
            } else {
                return errorString;
            }
        } else {
            return errorString;
        }
    }

    if (colinCount > 2) {
        return errorString;
    }

    return null;
}