/*
* jQuery Form Example Plugin 1.4.2
* Populate form inputs with example text that disappears on focus.
*
* e.g.
* $('input#name').example('Bob Smith');
* $('input[@title]').example(function() {
* return $(this).attr('title');
* });
* $('textarea#message').example('Type your message here', {
* className: 'example_text'
* });
*
* Copyright (c) Paul Mucur (http://mucur.name), 2007-2008.
* Dual-licensed under the BSD (BSD-LICENSE.txt) and GPL (GPL-LICENSE.txt)
* licenses.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
(function($) {

    $.fn.example = function(text, args) {

        /* Only calculate once whether a callback has been used. */
        var isCallback = $.isFunction(text);

        /* Merge the arguments and given example text into one options object. */
        var options = $.extend({}, args, {
            example: text
        });

        return this.each(function() {

            /* Reduce method calls by saving the current jQuery object. */
            var $this = $(this);

            /* Merge the plugin defaults with the given options and, if present,
* any metadata.
*/
            if ($.metadata) {
                var o = $.extend({}, $.fn.example.defaults, $this.metadata(), options);
            } else {
                var o = $.extend({}, $.fn.example.defaults, options);
            }

            /* The following event handlers only need to be bound once
* per class name. In order to do this, an array of used
* class names is stored and checked on each use of the plugin.
* If the class name is in the array then this whole section
* is skipped. If not, the events are bound and the class name
* added to the array.
*
* As of 1.3.2, the class names are stored as keys in the
* array, rather than as elements. This removes the need for
* $.inArray().
*/
            if (!$.fn.example.boundClassNames[o.className]) {

                /* Because Gecko-based browsers cache form values
* but ignore all other attributes such as class, all example
* values must be cleared on page unload to prevent them from
* being saved.
*/
                $(window).unload(function() {
                    $('.' + o.className).val('');
                });

                /* Clear fields that are still examples before any form is submitted
* otherwise those examples will be sent along as well.
*
* Prior to 1.3, this would only be bound to forms that were
* parents of example fields but this meant that a page with
* multiple forms would not work correctly.
*/
                $('form').submit(function() {

                    /* Clear only the fields inside this particular form. */
                    $(this).find('.' + o.className).val('');
                });

                /* Add the class name to the array. */
                $.fn.example.boundClassNames[o.className] = true;
            }

            /* Internet Explorer will cache form values even if they are cleared
* on unload, so this will clear any value that matches the example
* text and hasn't been specified in the value attribute.
*
* If a callback is used, it is not possible or safe to predict
* what the example text is going to be so all non-default values
* are cleared. This means that caching is effectively disabled for
* that field.
*
* Many thanks to Klaus Hartl for helping resolve this issue.
*/
            if ($.browser.msie && !$this.attr('defaultValue') && (isCallback || $this.val() == o.example))
                $this.val('');

            /* Initially place the example text in the field if it is empty
* and doesn't have focus yet.
*/
            if ($this.val() == '' && this != document.activeElement) {
                $this.addClass(o.className);

                /* The text argument can now be a function; if this is the case,
* call it, passing the current element as `this`.
*/
                $this.val(isCallback ? o.example.call(this) : o.example);
            }

            /* Make the example text disappear when someone focuses.
*
* To determine whether the value of the field is an example or not,
* check for the example class name only; comparing the actual value
* seems wasteful and can stop people from using example values as real
* input.
*/
            $this.focus(function() {

                /* jQuery 1.1 has no hasClass(), so is() must be used instead. */
                if ($(this).is('.' + o.className)) {
                    $(this).val('');
                    $(this).removeClass(o.className);
                }
            });

            /* Detect a change event to the field and remove the example class. */
            $this.change(function() {
                if ($(this).is('.' + o.className)) {
                    $(this).removeClass(o.className);
                }
            });

            /* Make the example text reappear if the input is blank on blurring. */
            $this.blur(function() {
                if ($(this).val() == '') {
                    $(this).addClass(o.className);

                    /* Re-evaluate the callback function every time the user
* blurs the field without entering anything. While this
* is not as efficient as caching the value, it allows for
* more dynamic applications of the plugin.
*/
                    $(this).val(isCallback ? o.example.call(this) : o.example);
                }
            });
        });
    };

    /* Users can override the defaults for the plugin like so:
*
* $.fn.example.defaults.className = 'not_example';
*/
    $.fn.example.defaults = {
        className: 'example'
    };

    /* All the class names used are stored as keys in the following array. */
    $.fn.example.boundClassNames = [];

})(jQuery);
