| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 | ;(function(factory) {    if (typeof define === 'function' && define.amd) {        // AMD        define(['jquery'], factory);    } else if (typeof module === 'object' && module.exports) {        factory(require('jquery'));    } else {        // Browser globals        factory(jQuery);    }}(function($) {    /****     * Allows plugin behavior simulation in modern browsers for easier debugging.      * When setting to true, use attribute "placeholder-x" rather than the usual "placeholder" in your inputs/textareas      * i.e. <input type="text" placeholder-x="my placeholder text" />     */    var debugMode = false;     // Opera Mini v7 doesn't support placeholder although its DOM seems to indicate so    var isOperaMini = Object.prototype.toString.call(window.operamini) === '[object OperaMini]';    var isInputSupported = 'placeholder' in document.createElement('input') && !isOperaMini && !debugMode;    var isTextareaSupported = 'placeholder' in document.createElement('textarea') && !isOperaMini && !debugMode;    var valHooks = $.valHooks;    var propHooks = $.propHooks;    var hooks;    var placeholder;    var settings = {};    if (isInputSupported && isTextareaSupported) {        placeholder = $.fn.placeholder = function() {            return this;        };        placeholder.input = true;        placeholder.textarea = true;    } else {        placeholder = $.fn.placeholder = function(options) {            var defaults = {customClass: 'placeholder'};            settings = $.extend({}, defaults, options);            return this.filter((isInputSupported ? 'textarea' : ':input') + '[' + (debugMode ? 'placeholder-x' : 'placeholder') + ']')                .not('.'+settings.customClass)                .not(':radio, :checkbox, :hidden')                .bind({                    'focus.placeholder': clearPlaceholder,                    'blur.placeholder': setPlaceholder                })                .data('placeholder-enabled', true)                .trigger('blur.placeholder');        };        placeholder.input = isInputSupported;        placeholder.textarea = isTextareaSupported;        hooks = {            'get': function(element) {                var $element = $(element);                var $passwordInput = $element.data('placeholder-password');                if ($passwordInput) {                    return $passwordInput[0].value;                }                return $element.data('placeholder-enabled') && $element.hasClass(settings.customClass) ? '' : element.value;            },            'set': function(element, value) {                var $element = $(element);                var $replacement;                var $passwordInput;                if (value !== '') {                    $replacement = $element.data('placeholder-textinput');                    $passwordInput = $element.data('placeholder-password');                    if ($replacement) {                        clearPlaceholder.call($replacement[0], true, value) || (element.value = value);                        $replacement[0].value = value;                    } else if ($passwordInput) {                        clearPlaceholder.call(element, true, value) || ($passwordInput[0].value = value);                        element.value = value;                    }                }                if (!$element.data('placeholder-enabled')) {                    element.value = value;                    return $element;                }                if (value === '') {                                        element.value = value;                                        // Setting the placeholder causes problems if the element continues to have focus.                    if (element != safeActiveElement()) {                        // We can't use `triggerHandler` here because of dummy text/password inputs :(                        setPlaceholder.call(element);                    }                } else {                                        if ($element.hasClass(settings.customClass)) {                        clearPlaceholder.call(element);                    }                    element.value = value;                }                // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363                return $element;            }        };        if (!isInputSupported) {            valHooks.input = hooks;            propHooks.value = hooks;        }        if (!isTextareaSupported) {            valHooks.textarea = hooks;            propHooks.value = hooks;        }        $(function() {            // Look for forms            $(document).delegate('form', 'submit.placeholder', function() {                                // Clear the placeholder values so they don't get submitted                var $inputs = $('.'+settings.customClass, this).each(function() {                    clearPlaceholder.call(this, true, '');                });                setTimeout(function() {                    $inputs.each(setPlaceholder);                }, 10);            });        });        // Clear placeholder values upon page reload        $(window).bind('beforeunload.placeholder', function() {            var clearPlaceholders = true;            try {                // Prevent IE javascript:void(0) anchors from causing cleared values                if (document.activeElement.toString() === 'javascript:void(0)') {                    clearPlaceholders = false;                }            } catch (exception) { }            if (clearPlaceholders) {                $('.'+settings.customClass).each(function() {                    //this.value = '';                });            }        });    }    function args(elem) {        // Return an object of element attributes        var newAttrs = {};        var rinlinejQuery = /^jQuery\d+$/;        $.each(elem.attributes, function(i, attr) {            if (attr.specified && !rinlinejQuery.test(attr.name)) {                newAttrs[attr.name] = attr.value;            }        });        return newAttrs;    }    function clearPlaceholder(event, value) {                var input = this;        var $input = $(this);                if (input.value === $input.attr((debugMode ? 'placeholder-x' : 'placeholder')) && $input.hasClass(settings.customClass)) {                        input.value = '';            $input.removeClass(settings.customClass);            if ($input.data('placeholder-password')) {                $input = $input.hide().nextAll('input[type="password"]:first').show().attr('id', $input.removeAttr('id').data('placeholder-id'));                                // If `clearPlaceholder` was called from `$.valHooks.input.set`                if (event === true) {                    $input[0].value = value;                    return value;                }                $input.focus();            } else {                input == safeActiveElement() && input.select();            }        }    }    function setPlaceholder(event) {        var $replacement;        var input = this;        var $input = $(this);        var id = input.id;        // If the placeholder is activated, triggering blur event (`$input.trigger('blur')`) should do nothing.        if (event && event.type === 'blur' && $input.hasClass(settings.customClass)) {            return;        }        if (input.value === '') {            if (input.type === 'password') {                if (!$input.data('placeholder-textinput')) {                                        try {                        $replacement = $input.clone().prop({ 'type': 'text' });                    } catch(e) {                        $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));                    }                    $replacement                        .removeAttr('name')                        .data({                            'placeholder-enabled': true,                            'placeholder-password': $input,                            'placeholder-id': id                        })                        .bind('focus.placeholder', clearPlaceholder);                    $input                        .data({                            'placeholder-textinput': $replacement,                            'placeholder-id': id                        })                        .before($replacement);                }                input.value = '';                $input = $input.removeAttr('id').hide().prevAll('input[type="text"]:first').attr('id', $input.data('placeholder-id')).show();            } else {                                var $passwordInput = $input.data('placeholder-password');                if ($passwordInput) {                    $passwordInput[0].value = '';                    $input.attr('id', $input.data('placeholder-id')).show().nextAll('input[type="password"]:last').hide().removeAttr('id');                }            }            $input.addClass(settings.customClass);            $input[0].value = $input.attr((debugMode ? 'placeholder-x' : 'placeholder'));        } else {            $input.removeClass(settings.customClass);        }    }    function safeActiveElement() {        // Avoid IE9 `document.activeElement` of death        try {            return document.activeElement;        } catch (exception) {}    }}));$(function(){	$('input[placeholder], textarea[placeholder]').placeholder();});
 |