(function ($) {
	$.extend({
		placeholder: {
			settings: {
				focusClass: 'placeholderFocus',
				activeClass: 'placeholder',
				overrideSupport: false,
				preventRefreshIssues: true
			},
			debug: false,
			log: function (msg) {
				if (!$.placeholder.debug) return;
				msg = "[Placeholder] " + msg;
				$.placeholder.hasFirebug ?
				console.log(msg) :
				$.placeholder.hasConsoleLog ?
					window.console.log(msg) :
					alert(msg);
			},
			hasFirebug: "console" in window && "firebug" in window.console,
			hasConsoleLog: "console" in window && "log" in window.console
		}

	});

	// check browser support for placeholder
	$.support.placeholder = 'placeholder' in document.createElement('input');

	// Replace the val function to never return placeholders
	$.fn.plVal = $.fn.val;
	$.fn.val = function (value) {
		$.placeholder.log('in val');
		if (this[0]) {
			$.placeholder.log('have found an element');
			var el = $(this[0]);
			if (value != undefined) {
				$.placeholder.log('in setter');
				var currentValue = el.plVal();
				var returnValue = $(this).plVal(value);
				if (el.hasClass($.placeholder.settings.activeClass) && currentValue == el.attr('placeholder')) {
					el.removeClass($.placeholder.settings.activeClass);
				}
				return returnValue;
			}

			if (el.hasClass($.placeholder.settings.activeClass) && el.plVal() == el.attr('placeholder')) {
				$.placeholder.log('returning empty because its a placeholder');
				return '';
			} else {
				$.placeholder.log('returning original val');
				return el.plVal();
			}
		}
		$.placeholder.log('returning undefined');
		return undefined;
	};

	// Clear placeholder values upon page reload
	$(window).bind('beforeunload.placeholder', function () {
		var els = $('input.' + $.placeholder.settings.activeClass);
		if (els.length > 0)
			els.val('').attr('autocomplete', 'off');
	});


	// plugin code
	$.fn.placeholder = function (opts) {
		opts = $.extend({}, $.placeholder.settings, opts);

		// we don't have to do anything if the browser supports placeholder
		if (!opts.overrideSupport && $.support.placeholder)
			return this;

		return this.each(function () {
			var $el = $(this);

			// skip if we do not have the placeholder attribute
			if (!$el.is('[placeholder]'))
				return;

			// we cannot do password fields, but supported browsers can
			if ($el.is(':password'))
				return;

			// Prevent values from being reapplied on refresh
			if (opts.preventRefreshIssues)
				$el.attr('autocomplete', 'off');

			$el.bind('focus.placeholder', function () {
				var $el = $(this);
				if (this.value == $el.attr('placeholder') && $el.hasClass(opts.activeClass))
					$el.val('')
                       .removeClass(opts.activeClass)
                       .addClass(opts.focusClass);
			});
			$el.bind('blur.placeholder', function () {
				var $el = $(this);

				$el.removeClass(opts.focusClass);

				if (this.value == '' && !$el.is(':focus'))
					$el.val($el.attr('placeholder'))
                     .addClass(opts.activeClass);
			});

			$el.triggerHandler('blur.placeholder');

			// Prevent incorrect form values being posted
			$el.parents('form').submit(function () {
				$el.triggerHandler('focus.placeholder');
			});

		});
	};
})(jQuery);


