merged cont.
[opensuse:yast-rest-service.git] / webservice / public / javascripts / jQuery.dPassword.js
1 /*******************************************************************************\r
2  * Source: dPassword v0.1 - jQuery delayed password masking (iPhone style)\r
3  *\r
4  * licensed under MIT License\r
5  *\r
6  * Copyright (c) 2009 DECAF°, Stefan Ullrich (http://decaf.de)\r
7  *\r
8  * Permission is hereby granted, free of charge, to any person obtaining \r
9  * a copy of this software and associated documentation files (the "Software"), \r
10  * to deal in the Software without restriction, including without limitation \r
11  * the rights to use, copy, modify, merge, publish, distribute, sublicense, \r
12  * and/or sell copies of the Software, and to permit persons to whom the \r
13  * Software is furnished to do so, subject to the following conditions:\r
14  *\r
15  * The above copyright notice and this permission notice shall be \r
16  * included in all copies or substantial portions of the Software.\r
17  *\r
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, \r
19  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES \r
20  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. \r
21  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, \r
22  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR \r
23  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR \r
24  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
25  *\r
26  * Known Issues: - delete marked text will not work\r
27  *               - deleting a single chars will not work if char is \r
28  *                 not the last char\r
29  *               - view will not follow cursor if textfield is too small\r
30  *               - if id based styles are assigned, these styles will \r
31  *                 not be taken over\r
32  *\r
33  *******************************************************************************/\r
34 \r
35 (function($){\r
36    $.fn.dPassword = function(options) {\r
37 \r
38       var defaults = {\r
39          interval:      200,\r
40          duration:      3000,\r
41          replacement:   '%u25CF',\r
42          prefix:        'password_',\r
43          debug:                         false\r
44       }\r
45 \r
46       var opts    = $.extend(defaults, options);\r
47       var checker = new Array();\r
48       var timer   = new Array();\r
49 \r
50       $(this).each(function() {\r
51          if (opts.debug) console.log('init [' + $(this).attr('id') + ']');\r
52 \r
53          // get original password tag values\r
54          var name        = $(this).attr('name');\r
55          var id          = $(this).attr('id');\r
56          var cssclass    = $(this).attr('class');\r
57          var style       = $(this).attr('style');\r
58          var size        = $(this).attr('size');\r
59          var maxlength   = $(this).attr('maxlength');\r
60          var disabled    = $(this).attr('disabled');\r
61          var tabindex    = $(this).attr('tabindex');\r
62          var accesskey   = $(this).attr('accesskey');\r
63          var value       = $(this).attr('value');\r
64 \r
65          // set timers\r
66          checker.push(id);\r
67          timer.push(id);\r
68 \r
69          // hide field\r
70          $(this).hide();\r
71          \r
72          // add debug span\r
73          if (opts.debug) {\r
74                                 $(this).after('<span id="debug_' + opts.prefix + name + '" style="color: #f00;"></span>');         \r
75          }\r
76          // add new text field\r
77          $(this).after(' <input name="' + (opts.prefix + name) + '" ' +\r
78                                  'id="' +  (opts.prefix + id) + '" ' + \r
79                                'type="text" ' +\r
80                               'value="' + value + '" ' +\r
81                (cssclass != '' ? 'class="' + cssclass + '"' : '') +\r
82                (style != '' ? 'style="' + style + '"' : '') +\r
83                  (size != '' ? 'size="' + size + '"' : '') +\r
84        (maxlength != -1 ? 'maxlength="' + maxlength + '"' : '') +\r
85          (disabled != '' ? 'disabled="' + disabled + '"' : '') +\r
86          (tabindex != '' ? 'tabindex="' + tabindex + '"' : '') +\r
87  (accesskey != undefined ? 'accesskey="' + accesskey + '"' : '') +\r
88                       'autocomplete="off" />');\r
89          \r
90          // change label\r
91          $('label[for='+id+']').attr('for', opts.prefix + id);\r
92          // disable tabindex\r
93          $(this).attr('tabindex', '');\r
94          // disable accesskey\r
95          $(this).attr('accesskey', '');\r
96 \r
97 \r
98          // bind event\r
99          $('#' + opts.prefix + id).bind('focus', function(event) {\r
100             if (opts.debug) console.log('event: focus [' + getId($(this).attr('id')) + ']');\r
101             clearTimeout(checker[getId($(this).attr('id'))]);\r
102             checker[getId($(this).attr('id'))] = setTimeout("check('" + getId($(this).attr('id')) + "', '')", opts.interval);\r
103          });\r
104          $('#' + opts.prefix + id).bind('blur', function(event) {\r
105             if (opts.debug) console.log('event: blur [' + getId($(this).attr('id')) + ']');\r
106             clearTimeout(checker[getId($(this).attr('id'))]);\r
107          });\r
108 \r
109                         setTimeout("check('" + id + "', '', true);", opts.interval);\r
110       });\r
111 \r
112       getId = function(id) {\r
113          var pattern = opts.prefix+'(.*)';\r
114          var regex = new RegExp(pattern);\r
115          regex.exec(id);\r
116          id = RegExp.$1;\r
117          \r
118          return id;\r
119       }\r
120    \r
121       setPassword = function(id, str) {\r
122          if (opts.debug) console.log('setPassword: [' + id + ']');\r
123 \r
124          var tmp = '';\r
125          for (i=0; i < str.length; i++) {\r
126             if (str.charAt(i) == unescape(opts.replacement)) {\r
127                tmp = tmp + $('#' + id).val().charAt(i);\r
128             }\r
129             else {\r
130                tmp = tmp + str.charAt(i);\r
131             }\r
132          }\r
133          $('#' + id).val(tmp);\r
134       }\r
135       \r
136       check = function(id, oldValue, initialCall) {\r
137          if (opts.debug) console.log('check: [' + id + ']');\r
138          \r
139          var bullets = $('#' + opts.prefix + id).val();\r
140 \r
141          if (oldValue != bullets) {\r
142             setPassword(id, bullets);\r
143             if (bullets.length > 1) {\r
144                var tmp = '';\r
145                for (i=0; i < bullets.length-1; i++) {\r
146                   tmp = tmp + unescape(opts.replacement);\r
147                }\r
148                tmp = tmp + bullets.charAt(bullets.length-1);\r
149    \r
150                $('#' + opts.prefix + id).val(tmp);\r
151             }\r
152             else {\r
153             }\r
154             clearTimeout(timer[id]);\r
155             timer[id] = setTimeout("convertLastChar('" + id + "')", opts.duration);\r
156          }\r
157          if (opts.debug) {\r
158                 $('#debug_' + opts.prefix + id).text($('#' + id).val());\r
159          }\r
160          if (!initialCall) {\r
161                  checker[id] = setTimeout("check('" + id + "', '" + $('#' + opts.prefix + id).val() + "', false)", opts.interval);\r
162                         }\r
163       }\r
164       \r
165       convertLastChar = function(id) {\r
166          if ($('#' + opts.prefix + id).val() != '') {\r
167             var tmp = '';\r
168             for (i=0; i < $('#' + opts.prefix + id).val().length; i++) {\r
169                tmp = tmp + unescape(opts.replacement);\r
170             }\r
171    \r
172             $('#' + opts.prefix + id).val(tmp);\r
173          }\r
174       }\r
175    };\r
176 }) (jQuery);\r
177 \r