 /*
    *
    * 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);




