(function($){
	/* Little trick to remove event bubbling that causes events recursion */
	var CB = function(e)
	{
		if (!e) var e = window.event;
		e.cancelBubble = true;
		if (e.stopPropagation) e.stopPropagation();
	};
	
	$.fn.textbox = function(options) {
		/* Default settings */
		var settings = {
			cls: 'jquery-textbox',  /* button  */
			default_value:'DomainStandi.com',
			water_cls: 'jquery-textbox-water',
			width: 150,
			margin: 3
		};
		
		/* Processing settings */
		settings = $.extend(settings, options || {});
		
		/* Adds disable/enable events */
		var addEvents = function(object)
		{
			var disabled = object.disabled;
			var $object = $(object);
			
			if ( object.stateInterval )
				clearInterval(object.stateInterval);

			object.stateInterval = setInterval(
				function() 
				{
					if ( object.disabled != disabled )
						$object.trigger( (disabled = !!object.disabled) ? 'disable' : 'enable');
				}, 
				10 /* in miliseconds. Low numbers this can decrease performance on slow computers, high will increase responce time */
			);
			return $object;
		};
		
		var watermark = function(object, value, water)
		{
			var $object = $(object);
			var val = $.trim($object.val());
			if (val == settings.default_value || val == "")
			{
				$object.val(value);
				if (water)
				{
					$object.addClass(settings.water_cls);
				}
				else
				{
					$object.removeClass(settings.water_cls);
				}
			}
			else
			{
				$object.removeClass(settings.water_cls);
			}
		}
		
		/* Wrapping all passed elements */
		return this.each(function() 
		{
			var tb = this;
			var $tb = $(this);
			
			addEvents(tb); /* Adds custom events and returns, jQuery enclosed object */

			tb.wrapper = $tb.wrap('<div></div>').parent();
			tb.wrapper.addClass(settings.cls);
			tb.wrapper.css("width", settings.width);
			$tb.css('width', settings.width-(settings.margin*2));
			$tb.css('margin-left', settings.margin + 'px');

			$tb.focus(function(){
				tb.wrapper.addClass(settings.cls + "-active");
				watermark(this, '', false);
			}).blur(function(){
				tb.wrapper.removeClass(settings.cls + "-active");
				watermark(this, settings.default_value, true);
			});

			$tb.hover(
				function(){
					tb.wrapper.addClass(settings.cls + "-hover");
				},
				
				function(){
					tb.wrapper.removeClass(settings.cls + "-hover");
				}
			);
			
			watermark(tb, settings.default_value, true);
		});
	}
})(jQuery);
