/*
* @plugin     jQuery PlaceHolder
* @author     Charles Demers
* @version    0.1.3
*
* @requires   [jquery-1.5.2+] 
*/

(function($, window){
	
	$.fn.placeHolder = function(opts) {
		
		var $body = $('body'),

			isMoz = !!$body.css('-moz-border-radius-topleft') && isNaN(parseInt($body.css('border-top-left-radius'), 10)),
			isWebKit = $body.css('-webkit-border-top-left-radius') && isNaN(parseInt($body.css('border-top-left-radius'), 10)),
			isStandard = !!$body.css('border-top-left-radius'),

			prefix = (isMoz) ? '-moz-' : (isWebKit) ? '-webkit-' : '',

			borderRadiusSyntax = (function() {
				var corners;
				if(isMoz) {
					corners = ['border-radius-topleft', 'border-radius-topright', 'border-radius-bottomleft', 'border-radius-bottomright'];

				// webkit uses the standard nomenclature
				} else {
					corners = ['border-top-left-radius', 'border-top-right-radius', 'border-bottom-left-radius', 'border-bottom-right-radius'];
				}
				return corners;
			})(),
			
			$p = $('<span>', {'class': 'placeholder'}),
			keyCodes = [18, 40, 37, 39, 38, 8, 20, 17, 46, 27, 34, 33, 16, 9],
		
			dimPlaceHolder = function() {
				$(this).data('placeholder').addClass('dimmed');
			},
		
			clearPlaceHolder = function(e) {
				for (var key in keyCodes) {
					if (e.which == keyCodes[key]) { return; }
				}

				$(this).data('placeholder').addClass('hidden');
			},
			unDimPlaceHolder = function() {
				var $this = $(this),
					placeHolder = $this.data('placeholder');
			
				if ($this.val() === '') {
					placeHolder.removeClass('dimmed');
					placeHolder.removeClass('hidden');
				}
			},
			restorePlaceHolder = function() {
				var $this = $(this),
					placeHolder = $this.data('placeholder');
			
				if ($this.val() === '') {
					placeHolder.removeClass('hidden');
					placeHolder.addClass('dimmed');
				}
			};
		
		return this.each(function() {
			
			var $this = $(this),
				
				// dom get
				thisOffset = $this.position(),
				placeHolderText = $this.attr('placeholder'),
				
				css = {
					fontFamily: $this.css('font-family'),
					fontSize: $this.css('font-size'),
					fontWeight: $this.css('font-weight'),
					fontStyle: $this.css('font-style'),
					fontVariant: $this.css('font-variant'),
					letterSpacing: $this.css('letter-spacing'),
					wordSpacing: $this.css('word-spacing'),
					textAlign: $this.css('text-align'),
					textTransform: $this.css('text-transform'),
					textShadow: $this.css('text-shadow'),
					textOverflow: $this.css('text-overflow'),

					position: 'absolute',
					top: thisOffset.top,
					left: thisOffset.left,
					zIndex: 0,
					paddingTop: $this.css('padding-top'),
					paddingBottom: $this.css('padding-bottom'),
					paddingLeft: $this.css('padding-left'),
					paddingRight: $this.css('padding-right'),
					borderTop: $this.css('border-top-width') + ' solid transparent',
					borderBottom: $this.css('border-bottom-width') + ' solid transparent',
					borderLeft: $this.css('border-left-width') + ' solid transparent',
					borderRight: $this.css('border-right-width') + ' solid transparent',
					backgroundColor: $this.css('background-color'),
					backgroundImage: $this.css('background-image'),
					backgroundRepeat: $this.css('background-repeat')
				};
				
				if ($.browser.msie && $.browser.version < 9) {
					css.backgroundPositionX = $this.css('background-position-x');
					css.backgroundPositionY = $this.css('background-position-y');
				} else {
					css.backgroundPosition = $this.css('background-position');
				}
				
				if (this.nodeName.toLowerCase() == 'textarea') {
					css.lineHeight = $this.css('line-height');
				} else {
					css.lineHeight = $this.height() + "px";
					$this.css('lineHeight', css.lineHeight);
				}
				
				for (var i=0, l=borderRadiusSyntax.length; i<l; i++) {
					var prop = prefix + borderRadiusSyntax[i];
					css[prop] = $this.css(prop);
				}
				
			// dom set
			$this.removeAttr('placeholder');
			$this.css({
				position: 'relative',
				zIndex: 1,
				background: 'none'
			});
			
			var p = $p.clone();
			
			p.width($this.width());
			p.height($this.height());
			p.css(css);
			
			p.text(placeHolderText);
			
			$this.data('placeholder', $(p).insertBefore($this));
			
			// Apply events for placeholder handling
			$this.bind('focus', dimPlaceHolder);
			$this.bind('keydown', clearPlaceHolder);
			$this.bind('keyup', restorePlaceHolder);
			$this.bind('blur', unDimPlaceHolder);
			
			if ($this.val() !== "") {
				$this.trigger('keydown');
			}
			
			if ($.browser.msie && $.browser.version <= 7) {
				var timeout;
			  
				p.bind('click', function() {
				  clearTimeout(timeout);
				  timeout = setTimeout(function() {
				    $this.focus();
				  }, 50);
				});
			}
		});
	};
})(jQuery, window);
