;(function($) {

  $.extend($.fn, {
  
    check_caps_lock: function(e) {
      var ascii_code	= e.which;
  		var shift_key	= e.shiftKey;
  		if( (65 <= ascii_code) && (ascii_code <= 90) && !shift_key) { this.trigger("caps_lock_on"); }
  		else { this.trigger("caps_lock_off"); }	
    },
    
    show_warning: function() {
      var $this = $(this);
			var opts = $this.data('tiptip_options');

			$this.data('tiptip_content').html(opts.message);
			$this.data('tiptip_holder').hide().removeAttr("class").css("margin","0");
			$this.data('tiptip_arrow').removeAttr("style");
			
			var top = parseInt($this.offset()['top']);
			var left = parseInt($this.offset()['left']);
			var org_width = parseInt($this.outerWidth());
			var org_height = parseInt($this.outerHeight());
			var tip_w = $this.data('tiptip_holder').outerWidth();
			var tip_h = $this.data('tiptip_holder').outerHeight();
			var w_compare = Math.round((org_width - tip_w) / 2);
			var h_compare = Math.round((org_height - tip_h) / 2);
			var marg_left = Math.round(left + w_compare);
			var marg_top = Math.round(top + org_height + opts.edgeOffset);
			var t_class = "";
			var arrow_top = "";
			var arrow_left = Math.round(tip_w - 12) / 2;
			
			if(w_compare < 0){
				if((w_compare + left) < parseInt($(window).scrollLeft())){
					t_class = "_right";
					arrow_top = Math.round(tip_h - 13) / 2;
					arrow_left = -12;
					marg_left = Math.round(left + org_width + opts.edgeOffset);
					marg_top = Math.round(top + h_compare);
				} else if((tip_w + left) > parseInt($(window).width())){
					t_class = "_left";
					arrow_top = Math.round(tip_h - 13) / 2;
					arrow_left =  Math.round(tip_w);
					marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5));
					marg_top = Math.round(top + h_compare);
				}
			}
			if((top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop())){
				t_class = t_class+"_top";
				arrow_top = tip_h;
				marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset));
			} else if(((top + org_height) - (opts.edgeOffset + tip_h)) < 0 || t_class == ""){
				t_class = t_class+"_bottom";
				arrow_top = -12;						
				marg_top = Math.round(top + org_height + opts.edgeOffset);
			}
			if(t_class == "_right_top" || t_class == "_left_top"){
				marg_top = marg_top + 5;
			} else if(t_class == "_right_bottom" || t_class == "_left_bottom"){		
				marg_top = marg_top - 5;
			}
			if(t_class == "_left_top" || t_class == "_left_bottom"){	
				marg_left = marg_left + 5;
			}
			$this.data('tiptip_arrow').css({"margin-left": arrow_left+"px", "margin-top": arrow_top+"px"});
			$this.data('tiptip_holder').css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class);
			
			$this.data('tiptip_holder').stop(true,true).fadeIn(opts.fadeIn);
    },
    
    hide_warning: function() {
    	var $this = $(this);
      var opts = $this.data('tiptip_options');
      $this.data('tiptip_holder').stop(true,true).fadeOut(opts.fadeOut);
    }
    
  });
	
	$.fn.capslock = function(options) {
		$(this).data('tiptip_options', $.extend($.fn.capslock.defaults, options));
		
    $(this).bind("caps_lock_on", function() { $(this).show_warning(); });
		$(this).bind("caps_lock_off", function() { $(this).hide_warning(); });
		$(this).blur(function(e) { $(this).hide_warning(); });
		$(this).keypress(function(e) { $(this).check_caps_lock(e); });
		
		if($("#tiptip_holder").length <= 0){
	 		$(this).data('tiptip_holder', $('<div id="tiptip_holder" style="max-width:'+ $(this).data('tiptip_options').maxWidth +';"></div>'));
			$(this).data('tiptip_content', $('<div id="tiptip_content"></div>'));
			$(this).data('tiptip_arrow', $('<div id="tiptip_arrow"></div>'));
			$("body").append($(this).data('tiptip_holder').html($(this).data('tiptip_content')).prepend($(this).data('tiptip_arrow').html('<div id="tiptip_arrow_inner"></div>')));
		} else {
			$(this).data('tiptip_holder', $("#tiptip_holder"));
			$(this).data('tiptip_content', $("#tiptip_content"));
			$(this).data('tiptip_arrow', $("#tiptip_arrow"));
		}
		
		return this;
	};

	$.fn.capslock.defaults = {
		maxWidth: "200px",
    edgeOffset: 3,
	  fadeIn: 200,
		fadeOut: 200,
		message: "<div style='line-height:16px;font-weight:bold'><img src='gfx/warning.gif' style='vertical-align:middle;margin-right:8px'>Feststelltaste ist aktiviert</div><div style='margin-top:5px'>Das Passwort wird möglicherweise falsch eingegeben, wenn die Feststelltaste aktiviert ist.</div>"
	};
	
})(jQuery);