summaryrefslogtreecommitdiffstats
path: root/core/js/jquery-showpassword.js
blob: fc9de2170f98d595e351a17198b2e36db0776f1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
*	@name							Show Password
*	@description
*	@version						1.3
*	@requires						Jquery 1.5
*
*	@author							Jan Jarfalk
*	@author-email					jan.jarfalk@unwrongest.com
*	@author-website					http://www.unwrongest.com
*
*	@special-thanks					Michel Gratton
*
*	@licens							MIT License - http://www.opensource.org/licenses/mit-license.php
*/
(function($){
     $.fn.extend({
         showPassword: function(c) {	
            
            // Setup callback object
			var callback 	= {'fn':null,'args':{}};
			callback.fn = c;
			
			// Clones passwords and turn the clones into text inputs
			var cloneElement = function( element ) {
				
				var $element = $(element);
					
				$clone = $("<input />");
					
				// Name added for JQuery Validation compatibility
				// Element name is required to avoid script warning.
				$clone.attr({
					'type'		:	'text',
					'class'		:	$element.attr('class'),
					'style'		:	$element.attr('style'),
					'size'		:	$element.attr('size'),
					'name'		:	$element.attr('name')+'-clone',
					'tabindex' 	:	$element.attr('tabindex'),
					'autocomplete'	:	'off'
				});

				if($element.attr('placeholder') !== undefined) {
					$clone.attr('placeholder', $element.attr('placeholder'));
				}

				return $clone;
			
			};
			
			// Transfers values between two elements
			var update = function(a,b){
				b.val(a.val());
			};
			
			// Shows a or b depending on checkbox
			var setState = function( checkbox, a, b ){
			
				if(checkbox.is(':checked')){
					update(a,b);
					b.show();
					a.hide();
				} else {
					update(b,a);
					b.hide();
					a.show();
				}
				
			};
            
            return this.each(function() {
            	
            	var $input					= $(this),
            		$checkbox 				= $($input.data('typetoggle'));
            	
            	// Create clone
				var $clone = cloneElement($input);
					$clone.insertBefore($input);
				
				// Set callback arguments
            	if(callback.fn){	
            		callback.args.input		= $input;
            		callback.args.checkbox	= $checkbox;
					callback.args.clone 	= $clone;
            	}
				

				
				$checkbox.bind('click', function() {
					setState( $checkbox, $input, $clone );
				});
				
				$input.bind('keyup', function() {
					update( $input, $clone );
				});
				
				$clone.bind('keyup', function(){ 
					update( $clone, $input );
					
					// Added for JQuery Validation compatibility
					// This will trigger validation if it's ON for keyup event
					$input.trigger('keyup');
					
				});
				
				// Added for JQuery Validation compatibility
				// This will trigger validation if it's ON for blur event
				$clone.bind('blur', function() { $input.trigger('focusout'); });
				
				setState( $checkbox, $input, $clone );

				// set type of password field clone (type=text) to password right on submit
				// to prevent browser save the value of this field
				$clone.closest('form').submit(function(e) {
					// .prop has to be used, because .attr throws
					// an error while changing a type of an input
					// element
					$clone.prop('type', 'password');
				});

				if( callback.fn ){
					callback.fn( callback.args );
				}

            });
        }
    });
})(jQuery);