/**
 * add validation data to an element
 */
$.fn.addValidationData = function(fn, errorMessage, successMessage, validationArguments)
{
    var field = $(this).get(0);

    var validationData = jQuery.data(field, "validationData");

    if (validationData == undefined) {
        validationData = new Array();
    }

    if (validationArguments == undefined) {
        validationArguments = new Array();
    }

    // add the field as the first parameter for the validation method
    validationArguments.unshift(field);

    validationData.push({ validationCallback: fn, error: errorMessage, success: successMessage, arguments: validationArguments });
    jQuery.data(field, "validationData", validationData);
}

/**
 * checks to see if the current element has an error
 */
$.fn.hasError = function() {
    var hasError = jQuery.data($(this).get(0), "hasError");

    if (hasError == undefined) return null;
    return (hasError == true);
}

/**
 * sets whether or not an element as an error
 */
$.fn.setHasError = function(hasError) {
    jQuery.data($(this).get(0), "hasError", hasError);
}

/**
 * validates the current element
 */
$.fn.validate = function()
{
    var field = $(this);
    var validators = jQuery.data(field.get(0), "validationData");

    if (validators && validators.length > 0) {
        var successMessage;

        // loop through each validation callback, return the correct message
        for(var i = 0; i < validators.length; i++) {

            if (validators[i].validationCallback.apply(this, validators[i].arguments)) {
                field.setHasError(false);
                successMessage = validators[i].success;
            } else {
                field.setHasError(true);
                return validators[i].error;
            }
        }

        return successMessage;
    }
}

// validation methods
function fieldRequired(field){
    //return (field.value.length > 0 && field.value != field.defaultValue);
    return (field.value.length > 0 && field.value.indexOf("Enter your") == -1);
}
// validation methods
function isChecked(field){
    return (field.checked);
}

/**
 * check to see if a field contains only alpha characters
 */
function checkAlpha(field)
{
    if (field.value == "") return true;

    var expression = /^[a-zA-Z]+$/;
    return expression.test(field.value);
}

/**
 * check to see if a field contains only alpha/num characters
 */
function checkAlphaNum(field)
{
    if (field.value == "") return true;

    var expression = /^[a-zA-Z0-9]+$/;
    return expression.test(field.value);
}

/**
 * extremely basic email address validation
 */
function checkEmailAddress(field)
{
    if (field.value == "") return true;

    var expression = /^[a-zA-Z0-9\-\_\.\@]+$/;
    if (expression.test(field.value) && field.value.match(/@{1}/)) {
        return true;
    }

    return false;
}

function checkMinLength(field, minLength)
{
    if (field.value == "") return true;
    return (field.value.length >= minLength);
}

/**
 * validate field value against a custom regex
 */
function checkRegex(field, regex)
{
    if (field.value == "") return true;
    return regex.test(field.value);
}
