jQuery.fn.inputTip = function(options) {

    var defaults = {
        tipId: "inputTipContainer",
        tipSelectedClass: "selected",
        goodText: "Ok",
        badText: "Bad",
        badText1: "Bad",
        badText2: "Bad",
        badText3: "Bad",
        tipText: "Tip",
        checkingText: "Checking...",
        validateText: null,
        validateInRealTime: false
    };
    var options = $.extend(defaults, options);

    var inputTipContainer = $("<div class=\"" + defaults.tipId + "\"></div>");

    var currentHelper = new jQuery.inputTipHelper(defaults, inputTipContainer);

    $("body").append(inputTipContainer);

    return this.each(function() {
        $(this).focus(function() {
            $(this).addClass("selected").addClass("straightRightCorner InputFocus");
            var thisRef = $(this);
            var thisOffset = $(this).offset();
            inputTipContainer.show().css("left", (thisOffset.left + thisRef.outerWidth()) + "px").css("top", (thisOffset.top) + "px");
            currentHelper.SetTipContainerText(0);
        }).blur(function() {
            $(this).removeClass("selected");
            defaults.validateText($(this).val(), function(status, response) {
                currentHelper.SetTipContainerText(status, response);
            });
        });
        if (defaults.validateInRealTime) {
            $(this).keyup(function() {
                if (defaults.validateInRealTime) {
                    defaults.validateText($(this).val(), function(status, response) {
                        currentHelper.SetTipContainerText(status, response);
                    });
                }
            });
        }
    });
}
jQuery.inputTipHelper = function(Settings, TipContainer) {
    this.init(Settings, TipContainer);
}
jQuery.inputTipHelper.prototype = {
    Settings: null,
    TipContainer: null,

    init: function(Settings, TipContainer) {
        this.TipContainer = TipContainer;
        this.Settings = Settings;
    },

    SetTipContainerText: function(type, newForcedText) {
        
        this.TipContainer.removeClass("badInputTipContainer")
        this.TipContainer.removeClass("badInputTipContainer1")
        this.TipContainer.removeClass("goodInputTipContainer");
        this.TipContainer.removeClass("optionalGoodInputTipContainer");
        var newText;
        switch (type) {
            // Tip                            
            case 0:
                {
                    newText = this.Settings.tipText;
                }
                break;
            // Good                            
            case 1:
                {
                    this.TipContainer.addClass("goodInputTipContainer");
                    newText = this.Settings.goodText;
                }
                break;
            // Optional Good                            
            case 2:
                {
                    this.TipContainer.addClass("optionalGoodInputTipContainer");
                    newText = this.Settings.goodText;
                }
                break;
            // Bad                             
            case 3:
                {
                    this.TipContainer.addClass("badInputTipContainer");
                    newText = this.Settings.badText;
                }
                break;
            // Bad                              
            case 4:
                {
                    this.TipContainer.addClass("badInputTipContainer1");
                    newText = this.Settings.badText1;
                }
                break;
            // Bad                               
            case 5:
                {
                    this.TipContainer.addClass("badInputTipContainer1");
                    newText = this.Settings.badText2;
                }
                break;
            // Bad                                
            case 6:
                {
                    this.TipContainer.addClass("badInputTipContainer1");
                    newText = this.Settings.badText3;
                }
                break;
        }
        if (newForcedText) newText = newForcedText;
        this.TipContainer.html(newText);
    }
}