(function($){
	var text,_options, normalcss;
	
	// public exposed watermark extension
	$.fn.watermark = function(options) {
	    _options = options || {text:"",css:""}; // {text:"",css:""}
		return this.each(applyWatermarkHandlers);
	}
	
	// applies the basic watermark handlers to the element
	function applyWatermarkHandlers() {
		var $this = $(this);
		text = _options.text || $this.attr("title");
		var currentText = $this.val() || text;
		var hasValue = currentText != text;
		normalcss = $this.attr("class");
		if(!currentText || currentText.length == 0)
				throw "jQuery.watermark() Error: Watermarked elements must at least have a title attribute if no watermarked text is provided to the method.";
		if(!$this.is("textarea, input[type=text]"))
			throw "jQuery.watermark() Error: Watermarked elements must be a form field that accepts text input.";
		
		$this
			.attr("title", "")
			.data("text", text)   // wmark text
			.data("w", !hasValue)        // displayed wmark text
			.blur(watermarkOn)
			.focus(watermarkOff)
			.bind("drop", watermarkOff)
			.val(currentText);
			
		if(!hasValue)$this.addClass(_options.css);
	}
	
	// focus handler for watermarked elements
	function watermarkOn() {
		var $this = $(this);
		if($this.val().length == 0 && !$this.data("w"))
			$this.data("w", true).addClass(_options.css).val($this.data("text"));
	}
	
	// blur handler for watermarked elements
	function watermarkOff(event) {
		var $this = $(this);
		var val = (event.originalEvent && event.originalEvent.dataTransfer) ?
						event.originalEvent.dataTransfer.getData("Text") : // drag and drop
						"" ; // blur
		if($this.data("w"))
			$this.data("w", false).removeClass(_options.css).val(val);
	}	
	
})(jQuery);
