(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 it\'s 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.val($el.attr('placeholder'))
                    .addClass(opts.activeClass);
            });

            $el.triggerHandler('blur');
			
            // Prevent incorrect form values being posted
            $el.parents('form').submit(function(){
                //$el.triggerHandler('focus.placeholder');
            });

        });
    };
})(jQuery);

