/**
 * A jQuery plugin to hide labels
 * v. 0.1 2010-03-06
 * v. 0.2 2010-05-15 - minnor bugfixes
 * v. 0.3 2010-08-02 - minnor bugfixes
 * @author Oscar Casajuana a.k.a. elboletaire <elboletaire {at} underave {dot} net> 
 * 
 * Usage:
 * 
 * jQuery('#form label').innerlabel();
 * 
 * Options you can set:
 * 
 * jQuery('#form label').innerlabel({
 * 		defaultClass:	"inner-label", // Default class to be applied to labels
 *		extraClass:	false // Extra class for labels
 * });
 * 
 */
(function($){
	$.fn.innerlabel = function(options){
		
		$.fn.innerlabel.defaults = {
			defaultClass: "inner-label",
			extraClass: false,
			wrapper: false,
			inputWrapped: false
		}
		
		var opts = $.extend({}, $.fn.innerlabel.defaults, options);
		
		return this.each(function(){
			var l = jQuery(this), wrap;

			if (l.next().is("input, textarea")) {	
				var q = l.next();
			} else
			//* Si l'input està envoltat per una altra capa...
			if (opts.inputWrapped!==false && l.next().is(opts.inputWrapped) && l.next().children(":first").is("input, textarea"))
			{
				var q = l.next().children(":first");
			} else {
				var q = l.prev();
			}
			
			if (opts.inputWrapped!==false && l.next().is(opts.inputWrapped) && l.next().children(":first").is("input, textarea")) {
				if(opts.wrapper!==false) {
					l.closest(opts.wrapper).css( { position: "relative" , overflow: "hidden"  } );
					l.closest(opts.wrapper).addClass("relative");
				} else {
					l.add(q.parent()).wrapAll('<div></div>');
					l.parent().css( { position: "relative" , overflow: "hidden"  } );
					l.parent().addClass("relative");	
				}
			} else {
				if ( opts.wrapper !== false ) {
					l.closest(opts.wrapper).css( { position: "relative" , overflow: "hidden"  } );
					l.closest(opts.wrapper).addClass("relative");
				} else {
					l.add(q).wrapAll('<div></div>');
					l.parent().css( { position: "relative" , overflow: "hidden"  } );
					l.parent().addClass("relative");
				}
			}
			wrap = q.closest("div");
			
			
			if (!l.hasClass(opts.defaultClass)) {
				l.addClass(opts.defaultClass);
			}
			if (opts.extraClass && !l.hasClass(opts.extraClass)) {
				l.addClass(opts.extraClass);
			}
			
			q.focus(function(){
					l.hide();
					wrap.addClass("active");
			}).blur(function(){
				if ( q.val() == "" ) {
					l.show();
					wrap.removeClass("active");
				}
			});
			
			l.click(function(){
				q.focus();
			});
			
			if (q.val() != '') {
				l.hide();
				wrap.addClass("active");
			} else {
				q.blur();
			}
		});
	}
})(jQuery);
