(function($) {
      $.fn.uacAttach = function(checkURL, options) {
            var opts = $.extend({}, $.fn.uacAttach.defaults, options);
            
            return this.each(function() {
                  var o = $.meta ? $.extend({}, opts, $(this).data()) : opts;
                  
                  var timer = {
                        instance: null,
                        oldText:  $(this).val(),
                        element:  this, 
                        wait:     o.waitMillis
                  };
                  
                  $(this).keyup(function(event) {
                        $(timer.element).css('background-image', 'none');
                        
                        var wait = timer.wait;
                        if(event.keyCode == 13 && this.type.toUpperCase() == "TEXT") {
                              wait = 1;
                        }
                        
                        clearTimeout(timer.instance);
                        timer.instance = setTimeout(
                              function() {
                                    var text = $(timer.element).val();
                                    if(text.length >= o.minimumLength && text != timer.oldText) {
                                          $(timer.element).css('background-repeat', o.backgroundRepeat);
                                          $(timer.element).css('background-position', o.backgroundPosition);
                                          $(timer.element).css('background-image', 'url(' + o.imagePath + o.imageLoading + ')');
                                          
                                          timer.oldText = text;
                                          
                                          $.ajax({
                                                async:      true,
                                                cache:      false,
                                                dataType:   'text',
                                                timeout:    o.ajaxTimeout,
                                                type:       'post',
                                                url:        checkURL,
                                                data:       $(timer.element).attr('name') + '=' + text,
                                                error:      o.ajaxErrorCallback,
                                                success:    function(data, textStatus) {
                                                      resultImage = null;
                                                      switch(data) {
                                                            case 'available':
                                                                  resultImage = o.imageAvailable;
                                                                  break;
                                                            case 'taken':
                                                                  resultImage = o.imageTaken;
                                                                  break;
                                                            case 'toolong':
                                                                  resultImage = o.imageTooLong;
                                                                  break;
                                                            case 'invalidcharacters':
                                                                  resultImage = o.imageInvalidChars;
                                                                  break;
                                                            case 'blacklisted':
                                                                  resultImage = o.imageBlacklisted;
                                                                  break;
                                                      }
                                                
                                                      if(resultImage && resultImage.length) {
                                                            $(timer.element).css('background-image', 'url(' + o.imagePath + resultImage + ')');
                                                      }
                                                      else {
                                                            $(timer.element).css('background-image', 'none');
                                                      }
                                                }
                                          });
                                    }
                              },
                              wait
                        );
                  });
            });
            
            return true;
      };
      
      $.fn.uacAttach.defaults = {
            minimumLength:      1,
            waitMillis:         750,
            ajaxTimeout:        5000,
            ajaxErrorCallback:  function() {},
            imagePath:          'images/',
            imageLoading:       'loading.gif',
            imageAvailable:     'available.png',
            imageTaken:         'taken.png',
            imageTooLong:       'toolong.png',
            imageInvalidChars:  'invalidchars.png',
            imageBlacklisted:   'blacklisted.png',
            backgroundRepeat:   'no-repeat',
            backgroundPosition: 'center right'
      };
      
      $.fn.uacDetach = function() {
            return this.each(function() {
                  $(element).css('background-image', 'none');
                  $(this).unbind('keyup');
            });
      };
})(jQuery);
