//**************************************************************
//  
//  Intelligence, Inc Jquery Plugin
//  Name: validate
//	Desc: Auto Validation based upon class
//
//
//**************************************************************

(function ($) {

    function checkClass(currentInput, classSearch) {
        var classes = currentInput.attr('class');
        var classIndex = classes.indexOf(classSearch);
        return classIndex;
    }


    function parseClass(currentInput, classSearch) {

        //Get Substring Starting with our class
        var classes = currentInput.attr('class');
        var classIndex = classes.indexOf(classSearch);
        classes = classes.substring(classIndex);

        //Get end index of our class
        var spaceIndex = classes.indexOf(' ');

        var classAttribute = classes
        if (spaceIndex != -1) {
            classAttribute = classes.substring(0, spaceIndex);
        }

        var classArray = classAttribute.split('@');

        //Get Value
        var validateValue = classArray[1];

        return validateValue

    }

    //Used for future display of error
    function showError(currentInput, message) {
        if (currentInput.attr('title') == '') {
            alert(message.replace('[NAME]', currentInput.attr('name')));
        }
        else {
            alert(message.replace('[NAME]', currentInput.attr('title')));
        }
    }

    //INPUT FIELDS
    function scanElements(obj, e) {

        var returnValue = true;

        $(':input', obj).each(function () {

            var input = $(this);

            //Required -- class: 'validate_required'
            if (checkClass(input, 'validate_required') != -1) {
                //If element is a select field
                if (input.is('select')) {
                    if ((input.val() == 0) || (input.val() == '0')) {
                        if (e === undefined) { } else { e.preventDefault() };
                        showError(input, 'The first option of [NAME] is not a valid selection. Please choose one of the other options.');
                        input.focus();
                        returnValue = false;
                        return false;
                    }
                }
                else {
                    if (input.val() == '') {
                        if (e === undefined) { } else { e.preventDefault() };
                        showError(input, 'Please enter a value for the [NAME] field.');
                        input.focus();
                        returnValue = false;
                        return false;
                    }
                }
            }

            //Min Length -- class: 'validate_minlength'
            //			 -- class@value
            if (checkClass(input, 'validate_minlength@') != -1) {
                var length = parseClass(input, 'validate_minlength@');
                if ((input.val() != '') && (input.val().length < length)) {
                    if (e === undefined) { } else { e.preventDefault() };
                    showError(input, 'Please enter at least ' + length + ' characters in the [NAME] field.');
                    input.focus();
                    returnValue = false;
                    return false;
                }
            }

            //Max Length -- class: 'validate_maxlength'
            //			 -- class@value
            if (checkClass(input, 'validate_maxlength@') != -1) {
                var length = parseClass(input, 'validate_maxlength@');
                if ((input.val() != '') && (input.val().length > length)) {
                    if (e === undefined) { } else { e.preventDefault() };
                    showError(input, 'Please enter at most ' + length + ' characters in the [NAME] field.');
                    input.focus();
                    returnValue = false;
                    return false;
                }
            }

            //Minimum Value -- class: 'validate_minvalue'
            //			    -- class@value
            if (checkClass(input, 'validate_minvalue@') != -1) {
                var value = parseClass(input, 'validate_minvalue@');
                if ((input.val() != '') && (input.val() < value)) {
                    if (e === undefined) { } else { e.preventDefault() };
                    showError(input, 'Please enter a value greater than or equal to ' + value + ' in the [NAME] field.');
                    input.focus();
                    returnValue = false;
                    return false;
                }
            }

            //Maximum Value -- class: 'validate_maxvalue'
            //			    -- class@value
            if (checkClass(input, 'validate_maxvalue@') != -1) {
                var value = parseClass(input, 'validate_maxvalue@');
                if ((input.val() != '') && (input.val() > value)) {
                    if (e === undefined) { } else { e.preventDefault() };
                    showError(input, 'Please enter a value less than or equal to ' + value + ' in the [NAME] field.');
                    input.focus();
                    returnValue = false;
                    return false;
                }
            }

            //Email -- class: 'validate_email'
            if (checkClass(input, 'validate_email') != -1) {
                var emailRegExp = /^[\w\.-]*[a-zA-Z0-9]@[\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/;
                if ((input.val() != '') && (!emailRegExp.test(input.val()))) {
                    if (e === undefined) { } else { e.preventDefault() };
                    showError(input, 'Please provide a valid email address in the [NAME] field.');
                    input.focus();
                    returnValue = false;
                    return false;
                }
            }


            //Only Numbers -- class: 'validate_numbers'
            if (checkClass(input, 'validate_numbers') != -1) {
                var emailRegExp = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
                if ((input.val() != '') && (!emailRegExp.test(input.val()))) {
                    if (e === undefined) { } else { e.preventDefault() };
                    showError(input, 'Please enter only digit characters in the [NAME] field.');
                    input.focus();
                    returnValue = false;
                    return false;
                }
            }

            //Only Letters,Numbers,Underscores,Dashes -- class: 'validate_lettersnumbers'
            if (checkClass(input, 'validate_lettersnumbers') != -1) {
                var emailRegExp = /^[A-Za-z0-9\-\_]/;
                if ((input.val() != '') && (!emailRegExp.test(input.val()))) {
                    if (e === undefined) { } else { e.preventDefault() };
                    showError(input, 'Please enter only letter and digit characters in the [NAME] field.');
                    input.focus();
                    returnValue = false;
                    return false;
                }
            }

            //Only Currency -- class: 'validate_currency
            if (checkClass(input, 'validate_currency') != -1) {
                var emailRegExp = /^\$?[0-9][0-9\,]*(\.\d{1,2})?$|^\$?[\.]([\d][\d]?)$/;
                if ((input.val() != '') && (!emailRegExp.test(input.val()))) {
                    if (e === undefined) { } else { e.preventDefault() };
                    showError(input, 'Please enter a valid currency amount in the [NAME] field.');
                    input.focus();
                    returnValue = false;
                    return false;
                }
            }
        })

        return returnValue;

    };

    //Run on Submit
    $.fn.validate = function (options) {

        var defaults = {};

        return this.each(function () {

            var obj = $(this);

            obj.submit(function (e) {

                scanElements(obj, e);

            });

        });

    };

    //Execute Validation
    $.fn.validateNow = function (options) {

        var defaults = {};
        var returnValue = true;

        this.each(function () {
            var obj = $(this);
            returnValue = scanElements(obj, undefined);
        });

        return returnValue;

    };

})(jQuery);
