2011-08-12 13:26:13 +04:00
|
|
|
/*
|
|
|
|
* @name Show Password
|
2016-04-04 11:57:17 +03:00
|
|
|
* @description
|
2011-08-12 13:26:13 +04:00
|
|
|
* @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
|
2017-05-01 06:42:53 +03:00
|
|
|
var callback = {'fn':null,'args':{}};
|
|
|
|
callback.fn = c;
|
2011-08-12 13:26:13 +04:00
|
|
|
|
|
|
|
// 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',
|
2013-04-07 23:51:10 +04:00
|
|
|
'tabindex' : $element.attr('tabindex'),
|
|
|
|
'autocomplete' : 'off'
|
2011-08-12 13:26:13 +04:00
|
|
|
});
|
2013-10-11 17:02:43 +04:00
|
|
|
|
|
|
|
if($element.attr('placeholder') !== undefined) {
|
|
|
|
$clone.attr('placeholder', $element.attr('placeholder'));
|
|
|
|
}
|
|
|
|
|
2011-08-12 13:26:13 +04:00
|
|
|
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);
|
2017-07-26 17:18:57 +03:00
|
|
|
$clone.insertBefore($input);
|
2011-08-12 13:26:13 +04:00
|
|
|
|
|
|
|
// 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() {
|
2017-05-01 06:42:53 +03:00
|
|
|
update( $input, $clone );
|
2011-08-12 13:26:13 +04:00
|
|
|
});
|
|
|
|
|
|
|
|
$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 );
|
2013-04-19 12:06:18 +04:00
|
|
|
|
|
|
|
// 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');
|
|
|
|
});
|
|
|
|
|
2011-08-12 13:26:13 +04:00
|
|
|
if( callback.fn ){
|
|
|
|
callback.fn( callback.args );
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
})(jQuery);
|