jQuery.fn.ControlError = function(p) {

    var p = jQuery.extend({
        required: {},
        errorbox: {},
        setHighlight: function(e) {
            e.addClass('error');
        },
        removeHighlight: function(e) {
            e.removeClass('error');
        },
        setHighlightAll: function(e) {
            p.setHighlight(e);
            p.setHighlight(e.parent());
        },
        removeHighlightAll: function(e) {
            p.removeHighlight(e);
            p.removeHighlight(e.parent());
        },
        setTextWithAnimation: function(message) {
            p.errorbox.css('opacity', '0').text(message);
            p.errorbox.animate({ opacity: '1' }, 400);
        },
        removeTextWithAnimation: function() {
            p.errorbox.css('opacity', '0').text('');
            p.errorbox.animate({ opacity: '1' }, 400);
        }
    }, p);

    //$('input.error[type="text"], select.error').parent().addClass('error');

    $('input[type="text"], select').focus(function() {

        var isError = this.className.indexOf('error') > 0;

        if (isError && p.required[this.id]) {
            if (p.required[this.id][1]) 
                p.setTextWithAnimation(p.required[this.id][1]);
            else if (this.value == '' && p.required[this.id][0])
                p.setTextWithAnimation(p.required[this.id][0]);
        }

    });

    $('input[type="radio"]').focus(function() {
        var isRequired = false;
        var key = '';
        var isNotChecked = $('input[name="' + this.getAttribute('name') + '"]:checked').length == 0;

        for (var k in p.required) {
            if (this.id.indexOf(k) != -1) { isRequired = true; key = k; break; }
        }

        var isError = this.className.indexOf('error') > 0;

        if (isError && p.required[key]) {

            if (p.required[this.id][1])
                p.setTextWithAnimation(p.required[this.id][1]);
            else if (isNotChecked && p.required[this.id][0])
                p.setTextWithAnimation(p.required[this.id][0]);
        }
    });

    $('input[type="text"], select').blur(function(e) {
        var e = $(e.target);

        if (p.required[this.id]) {
            if (p.required[this.id][1]) {
                p.setHighlightAll(e);
                p.setTextWithAnimation(p.required[this.id][1]);
            } else if (p.required[this.id][0] && this.value == '') {
                p.setHighlightAll(e);
                p.setTextWithAnimation(p.required[this.id][0]);
            }

            var isError = this.className.indexOf('error') > 0;
            var isRequiredError = p.required[this.id][0] == p.required[this.id][1] || !p.required[this.id][1];

            if (isError && this.value != '' && isRequiredError) {
                p.removeHighlightAll(e);
                p.removeTextWithAnimation();
            }
        }
    });

    $('input[type="radio"]').blur(function(e) {
        var e = $(e.target);
        var isRequired = false;
        var key = '';
        var isNotChecked = $('input[name="' + this.getAttribute('name') + '"]:checked').length == 0;

        for (var k in p.required) {
            if (this.id.indexOf(k) != -1) { isRequired = true; key = k; break; }
        }

        if (isRequired && isNotChecked) {
            p.setHighlight(e);
            p.setHighlight(e.parent().parent().parent().parent().parent());
            p.errorbox.text(p.required[key][0]);
            p.errorbox.animate({ opacity: '1' }, 400)
        }
    });

    $('.error:input:first').focus();

};