jquery-keypad-rails 2.0.0.2 → 2.0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDZkN2E0M2ZhNzBiMDllNmYyZjc1MTg4MjQxMjM1N2RmN2IxZDEwNA==
4
+ ODgyODdkZTFmMTE5NGM4MjEwMGVkMTU5ODdmN2ZkMDllMTY2YWM1Mw==
5
5
  data.tar.gz: !binary |-
6
- ODM2NzM0ZWFlODgxZDI3YTFiNDRmMDRiZTFmYzI3YTlhMmY3Mjc3Mw==
6
+ ZmUzN2YxMWE1YTgyNWQwMzI4ZmU2YmFkYjBjNmNlNTdlOWVjYmZjZQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MGYwODFiZmFmYWEyNmQwMTM2Y2NiODRmNWUzYTIyOTRkN2EwYzdlYzEwYmM3
10
- ODhhOTc2ODJmNDhlNTVhNmNkODUzOWZjYjNmMzFlOWQyMjYxODE3ZTJkM2Ex
11
- OTdhNzg4NmFkMGJiNGNiZGUzMWRmN2I2NGY4ZTlkMWQ2ODRiZDg=
9
+ ZWY0MjcxZTMyNWUwYTkxZTM3OWZjYTMzOGQ1YmFlNDMxOWIyNzkyOWRkMDVm
10
+ ODgzODlhZDI4NmEyMDA4YjU1ZGIwZDMwMWJjZjFmNzk1MDM0ZGI5OTEzNjI2
11
+ OTQ4NThhMzlhMWYyOTVhZDAwYThiNjQyNDE2OGZiMmQzMzcyYmY=
12
12
  data.tar.gz: !binary |-
13
- ZjczZGY2ZWU0Y2UyMDk1N2UzODYzZDdjMWE4ODE3MWI5NjBiZWYyN2NlNzFi
14
- YzYyODQ4MWZkM2E3YjdkYmJmNWY5YTFmYzJjOWM2MTAyMDQ5MTY5Y2Y5Y2I0
15
- MjIwYjBlZDg2Y2M1YWU5YTU4ZWQ3YTg5ZjJmZGFlYmYxZjNmOWY=
13
+ OTgyM2M5NGFmNGZhOTE4NDZjMGQzMWU4NGUxMzFkZTFkZGVlNDY4ZGZkMGYy
14
+ ODM1ZjIwYmM5ZGUwNWJhNjAwOTNlZGNiZDM3YWM1ZDUwMmEzNjAxMWFiMTRm
15
+ ZTYyY2FlNmY4YTk2N2M1MGNmOTQ0MDEzYTMyN2ExN2NjNjhjMGM=
data/build.me CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/bin/bash
2
2
 
3
- VER=2.0.0
4
- REV=.2
3
+ VER=2.0.1
4
+ REV=.1
5
5
 
6
6
  rm build/*
7
7
  pushd build
@@ -1,7 +1,7 @@
1
1
  module Jquery
2
2
  module Keypad
3
3
  module Rails
4
- VERSION = "2.0.0.2"
4
+ VERSION = "2.0.1.1"
5
5
  end
6
6
  end
7
7
  end
@@ -1,7 +1,7 @@
1
1
  /* http://keith-wood.name/keypad.html
2
- Keypad field entry extension for jQuery v2.0.0.
2
+ Keypad field entry extension for jQuery v2.0.1.
3
3
  Written by Keith Wood (kbwood{at}iinet.com.au) August 2008.
4
- Available under the MIT (https://github.com/jquery/jquery/blob/master/MIT-LICENSE.txt) license.
4
+ Available under the MIT (https://github.com/jquery/jquery/blob/master/LICENSE.txt) license.
5
5
  Please attribute the author if you use it. */
6
6
 
7
7
  (function($) { // hide the namespace
@@ -129,7 +129,7 @@
129
129
  @property [clearStatus='Erase all the text'] {string} Status text for clear link.
130
130
  @property [backText='Back'] {string} Display text for back link.
131
131
  @property [backStatus='Erase the previous character'] {string} Status text for back link.
132
- @property [spacebarText=' '] {string} Display text for space bar.
132
+ @property [spacebarText=' '] {string} Display text for space bar.
133
133
  @property [spacebarStatus='Space'] {string} Status text for space bar.
134
134
  @property [enterText='Enter'] {string} Display text for carriage return.
135
135
  @property [enterStatus='Carriage return'] {string} Status text for carriage return.
@@ -153,7 +153,7 @@
153
153
  clearStatus: 'Erase all the text',
154
154
  backText: 'Back',
155
155
  backStatus: 'Erase the previous character',
156
- spacebarText: ' ',
156
+ spacebarText: ' ',
157
157
  spacebarStatus: 'Space',
158
158
  enterText: 'Enter',
159
159
  enterStatus: 'Carriage return',
@@ -193,15 +193,15 @@
193
193
  _keyClass: pluginName + '-key', // The key marker class
194
194
  _keyDownClass: pluginName + '-key-down', // The key down marker class
195
195
 
196
- // Standard US keyboard alphabetic layout
196
+ // Standard US keyboard alphabetic layout
197
197
  qwertyAlphabetic: ['qwertyuiop', 'asdfghjkl', 'zxcvbnm'],
198
- // Standard US keyboard layout
198
+ // Standard US keyboard layout
199
199
  qwertyLayout: ['!@#$%^&*()_=' + this.HALF_SPACE + this.SPACE + this.CLOSE,
200
- this.HALF_SPACE + '`~[]{}<>\\|/' + this.SPACE + '789',
201
- 'qwertyuiop\'"' + this.HALF_SPACE + '456',
202
- this.HALF_SPACE + 'asdfghjkl;:' + this.SPACE + '123',
203
- this.SPACE + 'zxcvbnm,.?' + this.SPACE + this.HALF_SPACE + '-0+',
204
- '' + this.TAB + this.ENTER + this.SPACE_BAR + this.SHIFT +
200
+ this.HALF_SPACE + '`~[]{}<>\\|/' + this.SPACE + '789',
201
+ 'qwertyuiop\'"' + this.HALF_SPACE + '456',
202
+ this.HALF_SPACE + 'asdfghjkl;:' + this.SPACE + '123',
203
+ this.SPACE + 'zxcvbnm,.?' + this.SPACE + this.HALF_SPACE + '-0+',
204
+ '' + this.TAB + this.ENTER + this.SPACE_BAR + this.SHIFT +
205
205
  this.HALF_SPACE + this.BACK + this.CLEAR],
206
206
 
207
207
  /** Add the definition of a special key.
@@ -211,15 +211,15 @@
211
211
  @param noHighlight {boolean} True to suppress highlight when using ThemeRoller.
212
212
  @return {Keypad} The keypad object for chaining further calls.
213
213
  @example $.keypad.addKeyDef('CLEAR', 'clear', function(inst) { plugin._clearValue(inst); }); */
214
- addKeyDef: function(id, name, action, noHighlight) {
215
- if (this._keyCode == 32) {
216
- throw 'Only 32 special keys allowed';
217
- }
218
- this[id] = String.fromCharCode(this._keyCode++);
219
- this._specialKeys.push({code: this[id], id: id, name: name,
220
- action: action, noHighlight: noHighlight});
221
- return this;
222
- },
214
+ addKeyDef: function(id, name, action, noHighlight) {
215
+ if (this._keyCode == 32) {
216
+ throw 'Only 32 special keys allowed';
217
+ }
218
+ this[id] = String.fromCharCode(this._keyCode++);
219
+ this._specialKeys.push({code: this[id], id: id, name: name,
220
+ action: action, noHighlight: noHighlight});
221
+ return this;
222
+ },
223
223
 
224
224
  /** Additional setup for the keypad.
225
225
  Create popup div. */
@@ -238,12 +238,12 @@
238
238
  if (inst._inline) {
239
239
  elem.append(inst._mainDiv).
240
240
  on('click.' + inst.name, function() { inst._input.focus(); });
241
- this._updateKeypad(inst);
242
- }
241
+ this._updateKeypad(inst);
242
+ }
243
243
  else if (elem.is(':disabled')) {
244
244
  this.disable(elem);
245
- }
246
- },
245
+ }
246
+ },
247
247
 
248
248
  /** Determine the input field for the keypad.
249
249
  @private
@@ -252,76 +252,76 @@
252
252
  _setInput: function(elem, inst) {
253
253
  inst._input = $(!inst._inline ? elem : inst.options.target ||
254
254
  '<input type="text" class="' + this._inlineEntryClass + '" disabled/>');
255
- if (inst._inline) {
255
+ if (inst._inline) {
256
256
  elem.find('input').remove();
257
- if (!inst.options.target) {
257
+ if (!inst.options.target) {
258
258
  elem.append(inst._input);
259
+ }
259
260
  }
260
- }
261
- },
261
+ },
262
262
 
263
263
  _optionsChanged: function(elem, inst, options) {
264
264
  $.extend(inst.options, options);
265
265
  elem.off('.' + inst.name).
266
266
  siblings('.' + this._appendClass).remove().end().
267
267
  siblings('.' + this._triggerClass).remove();
268
- var appendText = inst.options.appendText;
269
- if (appendText) {
268
+ var appendText = inst.options.appendText;
269
+ if (appendText) {
270
270
  elem[inst.options.isRTL ? 'before' : 'after'](
271
- '<span class="' + this._appendClass + '">' + appendText + '</span>');
272
- }
273
- if (!inst._inline) {
274
- if (inst.options.showOn == 'focus' || inst.options.showOn == 'both') {
275
- // pop-up keypad when in the marked field
271
+ '<span class="' + this._appendClass + '">' + appendText + '</span>');
272
+ }
273
+ if (!inst._inline) {
274
+ if (inst.options.showOn == 'focus' || inst.options.showOn == 'both') {
275
+ // pop-up keypad when in the marked field
276
276
  elem.on('focus.' + inst.name, this.show).
277
277
  on('keydown.' + inst.name, this._doKeyDown);
278
- }
279
- if (inst.options.showOn == 'button' || inst.options.showOn == 'both') {
280
- // pop-up keypad when button clicked
281
- var buttonStatus = inst.options.buttonStatus;
282
- var buttonImage = inst.options.buttonImage;
283
- var trigger = $(inst.options.buttonImageOnly ?
284
- $('<img src="' + buttonImage + '" alt="' +
285
- buttonStatus + '" title="' + buttonStatus + '"/>') :
286
- $('<button type="button" title="' + buttonStatus + '"></button>').
287
- html(buttonImage == '' ? inst.options.buttonText :
288
- $('<img src="' + buttonImage + '" alt="' +
289
- buttonStatus + '" title="' + buttonStatus + '"/>')));
290
- elem[inst.options.isRTL ? 'before' : 'after'](trigger);
291
- trigger.addClass(this._triggerClass).click(function() {
278
+ }
279
+ if (inst.options.showOn == 'button' || inst.options.showOn == 'both') {
280
+ // pop-up keypad when button clicked
281
+ var buttonStatus = inst.options.buttonStatus;
282
+ var buttonImage = inst.options.buttonImage;
283
+ var trigger = $(inst.options.buttonImageOnly ?
284
+ $('<img src="' + buttonImage + '" alt="' +
285
+ buttonStatus + '" title="' + buttonStatus + '"/>') :
286
+ $('<button type="button" title="' + buttonStatus + '"></button>').
287
+ html(buttonImage == '' ? inst.options.buttonText :
288
+ $('<img src="' + buttonImage + '" alt="' +
289
+ buttonStatus + '" title="' + buttonStatus + '"/>')));
290
+ elem[inst.options.isRTL ? 'before' : 'after'](trigger);
291
+ trigger.addClass(this._triggerClass).click(function() {
292
292
  if (plugin._keypadShowing && plugin._lastField == elem[0]) {
293
293
  plugin.hide();
294
- }
295
- else {
294
+ }
295
+ else {
296
296
  plugin.show(elem[0]);
297
- }
298
- return false;
299
- });
297
+ }
298
+ return false;
299
+ });
300
+ }
300
301
  }
301
- }
302
302
  inst.saveReadonly = elem.attr('readonly');
303
303
  elem[inst.options.keypadOnly ? 'attr' : 'removeAttr']('readonly', true).
304
304
  on('setData.' + inst.name, function(event, key, value) {
305
- inst.options[key] = value;
305
+ inst.options[key] = value;
306
306
  }).
307
307
  on('getData.' + inst.name, function(event, key) {
308
- return inst.options[key];
309
- });
308
+ return inst.options[key];
309
+ });
310
310
  this._setInput(elem, inst);
311
- this._updateKeypad(inst);
312
- },
311
+ this._updateKeypad(inst);
312
+ },
313
313
 
314
314
  _preDestroy: function(elem, inst) {
315
- if (this._curInst == inst) {
315
+ if (this._curInst == inst) {
316
316
  this.hide();
317
- }
317
+ }
318
318
  elem.siblings('.' + this._appendClass).remove().end().
319
- siblings('.' + this._triggerClass).remove().end().
320
- prev('.' + this._inlineEntryClass).remove();
319
+ siblings('.' + this._triggerClass).remove().end().
320
+ prev('.' + this._inlineEntryClass).remove();
321
321
  elem.empty().off('.' + inst.name)
322
- [inst.saveReadonly ? 'attr' : 'removeAttr']('readonly', true);
322
+ [inst.saveReadonly ? 'attr' : 'removeAttr']('readonly', true);
323
323
  inst._input.removeData(inst.name);
324
- },
324
+ },
325
325
 
326
326
  /** Enable the keypad for a jQuery selection.
327
327
  @param elem {Element} The target text field.
@@ -329,21 +329,21 @@
329
329
  enable: function(elem) {
330
330
  elem = $(elem);
331
331
  if (!elem.hasClass(this._getMarker())) {
332
- return;
333
- }
332
+ return;
333
+ }
334
334
  var nodeName = elem[0].nodeName.toLowerCase();
335
- if (nodeName.match(/input|textarea/)) {
335
+ if (nodeName.match(/input|textarea/)) {
336
336
  elem.prop('disabled', false).
337
337
  siblings('button.' + this._triggerClass).prop('disabled', false).end().
338
338
  siblings('img.' + this._triggerClass).css({opacity: '1.0', cursor: ''});
339
- }
340
- else if (nodeName.match(/div|span/)) {
339
+ }
340
+ else if (nodeName.match(/div|span/)) {
341
341
  elem.children('.' + this._disableClass).remove();
342
342
  this._getInst(elem)._mainDiv.find('button').prop('disabled', false);
343
- }
344
- this._disabledFields = $.map(this._disabledFields,
343
+ }
344
+ this._disabledFields = $.map(this._disabledFields,
345
345
  function(value) { return (value == elem[0] ? null : value); }); // delete entry
346
- },
346
+ },
347
347
 
348
348
  /** Disable the keypad for a jQuery selection.
349
349
  @param elem {Element} The target text field.
@@ -351,34 +351,34 @@
351
351
  disable: function(elem) {
352
352
  elem = $(elem);
353
353
  if (!elem.hasClass(this._getMarker())) {
354
- return;
355
- }
354
+ return;
355
+ }
356
356
  var nodeName = elem[0].nodeName.toLowerCase();
357
- if (nodeName.match(/input|textarea/)) {
357
+ if (nodeName.match(/input|textarea/)) {
358
358
  elem.prop('disabled', true).
359
359
  siblings('button.' + this._triggerClass).prop('disabled', true).end().
360
360
  siblings('img.' + this._triggerClass).css({opacity: '0.5', cursor: 'default'});
361
- }
362
- else if (nodeName.match(/div|span/)) {
361
+ }
362
+ else if (nodeName.match(/div|span/)) {
363
363
  var inline = elem.children('.' + this._inlineClass);
364
- var offset = inline.offset();
365
- var relOffset = {left: 0, top: 0};
366
- inline.parents().each(function() {
367
- if ($(this).css('position') == 'relative') {
368
- relOffset = $(this).offset();
369
- return false;
370
- }
371
- });
364
+ var offset = inline.offset();
365
+ var relOffset = {left: 0, top: 0};
366
+ inline.parents().each(function() {
367
+ if ($(this).css('position') == 'relative') {
368
+ relOffset = $(this).offset();
369
+ return false;
370
+ }
371
+ });
372
372
  elem.prepend('<div class="' + this._disableClass + '" style="width: ' +
373
- inline.outerWidth() + 'px; height: ' + inline.outerHeight() +
374
- 'px; left: ' + (offset.left - relOffset.left) +
375
- 'px; top: ' + (offset.top - relOffset.top) + 'px;"></div>');
373
+ inline.outerWidth() + 'px; height: ' + inline.outerHeight() +
374
+ 'px; left: ' + (offset.left - relOffset.left) +
375
+ 'px; top: ' + (offset.top - relOffset.top) + 'px;"></div>');
376
376
  this._getInst(elem)._mainDiv.find('button').prop('disabled', true);
377
- }
378
- this._disabledFields = $.map(this._disabledFields,
377
+ }
378
+ this._disabledFields = $.map(this._disabledFields,
379
379
  function(value) { return (value == elem[0] ? null : value); }); // delete entry
380
380
  this._disabledFields[this._disabledFields.length] = elem[0];
381
- },
381
+ },
382
382
 
383
383
  /** Is the text field disabled as a keypad?
384
384
  @param elem {Element} The target text field.
@@ -394,78 +394,78 @@
394
394
  show: function(elem) {
395
395
  elem = elem.target || elem;
396
396
  if (plugin.isDisabled(elem) || plugin._lastField == elem) { // already here
397
- return;
398
- }
397
+ return;
398
+ }
399
399
  var inst = plugin._getInst(elem);
400
400
  plugin.hide(null, '');
401
401
  plugin._lastField = elem;
402
402
  plugin._pos = plugin._findPos(elem);
403
403
  plugin._pos[1] += elem.offsetHeight; // add the height
404
- var isFixed = false;
404
+ var isFixed = false;
405
405
  $(elem).parents().each(function() {
406
- isFixed |= $(this).css('position') == 'fixed';
407
- return !isFixed;
408
- });
409
- var offset = {left: plugin._pos[0], top: plugin._pos[1]};
410
- plugin._pos = null;
411
- // determine sizing offscreen
412
- inst._mainDiv.css({position: 'absolute', display: 'block', top: '-1000px', width: 'auto'});
413
- plugin._updateKeypad(inst);
414
- // and adjust position before showing
415
- offset = plugin._checkOffset(inst, offset, isFixed);
416
- inst._mainDiv.css({position: (isFixed ? 'fixed' : 'absolute'), display: 'none',
417
- left: offset.left + 'px', top: offset.top + 'px'});
418
- var duration = inst.options.duration;
419
- var showAnim = inst.options.showAnim;
420
- var postProcess = function() {
421
- plugin._keypadShowing = true;
422
- };
423
- if ($.effects && ($.effects[showAnim] || ($.effects.effect && $.effects.effect[showAnim]))) {
424
- var data = inst._mainDiv.data(); // Update old effects data
425
- for (var key in data) {
426
- if (key.match(/^ec\.storage\./)) {
427
- data[key] = inst._mainDiv.css(key.replace(/ec\.storage\./, ''));
406
+ isFixed |= $(this).css('position') == 'fixed';
407
+ return !isFixed;
408
+ });
409
+ var offset = {left: plugin._pos[0], top: plugin._pos[1]};
410
+ plugin._pos = null;
411
+ // determine sizing offscreen
412
+ inst._mainDiv.css({position: 'absolute', display: 'block', top: '-1000px', width: 'auto'});
413
+ plugin._updateKeypad(inst);
414
+ // and adjust position before showing
415
+ offset = plugin._checkOffset(inst, offset, isFixed);
416
+ inst._mainDiv.css({position: (isFixed ? 'fixed' : 'absolute'), display: 'none',
417
+ left: offset.left + 'px', top: offset.top + 'px'});
418
+ var duration = inst.options.duration;
419
+ var showAnim = inst.options.showAnim;
420
+ var postProcess = function() {
421
+ plugin._keypadShowing = true;
422
+ };
423
+ if ($.effects && ($.effects[showAnim] || ($.effects.effect && $.effects.effect[showAnim]))) {
424
+ var data = inst._mainDiv.data(); // Update old effects data
425
+ for (var key in data) {
426
+ if (key.match(/^ec\.storage\./)) {
427
+ data[key] = inst._mainDiv.css(key.replace(/ec\.storage\./, ''));
428
+ }
428
429
  }
429
- }
430
- inst._mainDiv.data(data).show(showAnim,
430
+ inst._mainDiv.data(data).show(showAnim,
431
431
  inst.options.showOptions || {}, duration, postProcess);
432
- }
433
- else {
434
- inst._mainDiv[showAnim || 'show']((showAnim ? duration : 0), postProcess);
435
- }
436
- if (inst._input[0].type != 'hidden') {
437
- inst._input[0].focus();
438
- }
439
- plugin._curInst = inst;
440
- },
432
+ }
433
+ else {
434
+ inst._mainDiv[showAnim || 'show']((showAnim ? duration : 0), postProcess);
435
+ }
436
+ if (inst._input[0].type != 'hidden') {
437
+ inst._input[0].focus();
438
+ }
439
+ plugin._curInst = inst;
440
+ },
441
441
 
442
442
  /** Generate the keypad content.
443
443
  @private
444
444
  @param inst {object} The instance settings. */
445
- _updateKeypad: function(inst) {
446
- var borders = this._getBorders(inst._mainDiv);
447
- inst._mainDiv.empty().append(this._generateHTML(inst)).
448
- removeClass().addClass(inst.options.keypadClass +
449
- (inst.options.useThemeRoller ? ' ui-widget ui-widget-content' : '') +
450
- (inst.options.isRTL ? ' ' + this._rtlClass : '') + ' ' +
451
- (inst._inline ? this._inlineClass : this._mainDivClass));
452
- if ($.isFunction(inst.options.beforeShow)) {
453
- inst.options.beforeShow.apply((inst._input ? inst._input[0] : null),
454
- [inst._mainDiv, inst]);
455
- }
456
- },
445
+ _updateKeypad: function(inst) {
446
+ var borders = this._getBorders(inst._mainDiv);
447
+ inst._mainDiv.empty().append(this._generateHTML(inst)).
448
+ removeClass().addClass(inst.options.keypadClass +
449
+ (inst.options.useThemeRoller ? ' ui-widget ui-widget-content' : '') +
450
+ (inst.options.isRTL ? ' ' + this._rtlClass : '') + ' ' +
451
+ (inst._inline ? this._inlineClass : this._mainDivClass));
452
+ if ($.isFunction(inst.options.beforeShow)) {
453
+ inst.options.beforeShow.apply((inst._input ? inst._input[0] : null),
454
+ [inst._mainDiv, inst]);
455
+ }
456
+ },
457
457
 
458
458
  /** Retrieve the size of left and top borders for an element.
459
459
  @private
460
460
  @param elem {jQuery} The element of interest.
461
461
  @return {number[]} The left and top borders. */
462
- _getBorders: function(elem) {
463
- var convert = function(value) {
464
- return {thin: 1, medium: 3, thick: 5}[value] || value;
465
- };
466
- return [parseFloat(convert(elem.css('border-left-width'))),
467
- parseFloat(convert(elem.css('border-top-width')))];
468
- },
462
+ _getBorders: function(elem) {
463
+ var convert = function(value) {
464
+ return {thin: 1, medium: 3, thick: 5}[value] || value;
465
+ };
466
+ return [parseFloat(convert(elem.css('border-left-width'))),
467
+ parseFloat(convert(elem.css('border-top-width')))];
468
+ },
469
469
 
470
470
  /** Check positioning to remain on screen.
471
471
  @private
@@ -473,181 +473,181 @@
473
473
  @param offset {object} The current offset.
474
474
  @param isFixed {boolean} True if the text field is fixed in position.
475
475
  @return {object} The updated offset. */
476
- _checkOffset: function(inst, offset, isFixed) {
477
- var pos = inst._input ? this._findPos(inst._input[0]) : null;
478
- var browserWidth = window.innerWidth || document.documentElement.clientWidth;
479
- var browserHeight = window.innerHeight || document.documentElement.clientHeight;
480
- var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
481
- var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
482
- // recalculate width as otherwise set to 100%
483
- var width = 0;
484
- inst._mainDiv.find(':not(div)').each(function() {
485
- width = Math.max(width, this.offsetLeft + $(this).outerWidth(true));
486
- });
487
- inst._mainDiv.css('width', width + 1);
488
- // reposition keypad panel horizontally if outside the browser window
489
- if (inst.options.isRTL ||
490
- (offset.left + inst._mainDiv.outerWidth() - scrollX) > browserWidth) {
491
- offset.left = Math.max((isFixed ? 0 : scrollX),
492
- pos[0] + (inst._input ? inst._input.outerWidth() : 0) -
493
- (isFixed ? scrollX : 0) - inst._mainDiv.outerWidth());
494
- }
495
- else {
496
- offset.left = Math.max((isFixed ? 0 : scrollX), offset.left - (isFixed ? scrollX : 0));
497
- }
498
- // reposition keypad panel vertically if outside the browser window
499
- if ((offset.top + inst._mainDiv.outerHeight() - scrollY) > browserHeight) {
500
- offset.top = Math.max((isFixed ? 0 : scrollY),
501
- pos[1] - (isFixed ? scrollY : 0) - inst._mainDiv.outerHeight());
502
- }
503
- else {
504
- offset.top = Math.max((isFixed ? 0 : scrollY), offset.top - (isFixed ? scrollY : 0));
505
- }
506
- return offset;
507
- },
476
+ _checkOffset: function(inst, offset, isFixed) {
477
+ var pos = inst._input ? this._findPos(inst._input[0]) : null;
478
+ var browserWidth = window.innerWidth || document.documentElement.clientWidth;
479
+ var browserHeight = window.innerHeight || document.documentElement.clientHeight;
480
+ var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
481
+ var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
482
+ // recalculate width as otherwise set to 100%
483
+ var width = 0;
484
+ inst._mainDiv.find(':not(div)').each(function() {
485
+ width = Math.max(width, this.offsetLeft + $(this).outerWidth(true));
486
+ });
487
+ inst._mainDiv.css('width', width + 1);
488
+ // reposition keypad panel horizontally if outside the browser window
489
+ if (inst.options.isRTL ||
490
+ (offset.left + inst._mainDiv.outerWidth() - scrollX) > browserWidth) {
491
+ offset.left = Math.max((isFixed ? 0 : scrollX),
492
+ pos[0] + (inst._input ? inst._input.outerWidth() : 0) -
493
+ (isFixed ? scrollX : 0) - inst._mainDiv.outerWidth());
494
+ }
495
+ else {
496
+ offset.left = Math.max((isFixed ? 0 : scrollX), offset.left - (isFixed ? scrollX : 0));
497
+ }
498
+ // reposition keypad panel vertically if outside the browser window
499
+ if ((offset.top + inst._mainDiv.outerHeight() - scrollY) > browserHeight) {
500
+ offset.top = Math.max((isFixed ? 0 : scrollY),
501
+ pos[1] - (isFixed ? scrollY : 0) - inst._mainDiv.outerHeight());
502
+ }
503
+ else {
504
+ offset.top = Math.max((isFixed ? 0 : scrollY), offset.top - (isFixed ? scrollY : 0));
505
+ }
506
+ return offset;
507
+ },
508
508
 
509
509
  /** Find an object's position on the screen.
510
510
  @private
511
511
  @param obj {Element} The element to find the position for.
512
512
  @return {number[]} The element's position. */
513
- _findPos: function(obj) {
514
- while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
515
- obj = obj.nextSibling;
516
- }
517
- var position = $(obj).offset();
518
- return [position.left, position.top];
519
- },
513
+ _findPos: function(obj) {
514
+ while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
515
+ obj = obj.nextSibling;
516
+ }
517
+ var position = $(obj).offset();
518
+ return [position.left, position.top];
519
+ },
520
520
 
521
521
  /** Hide the keypad from view.
522
522
  @param elem {Element} The text field attached to the keypad.
523
523
  @param duration {string} The duration over which to close the keypad.
524
524
  @example $(selector).keypad('hide') */
525
525
  hide: function(elem, duration) {
526
- var inst = this._curInst;
527
- if (!inst || (elem && inst != $.data(elem, this.propertyName))) {
528
- return;
529
- }
530
- if (this._keypadShowing) {
531
- duration = (duration != null ? duration : inst.options.duration);
532
- var showAnim = inst.options.showAnim;
533
- if ($.effects && ($.effects[showAnim] || ($.effects.effect && $.effects.effect[showAnim]))) {
526
+ var inst = this._curInst;
527
+ if (!inst || (elem && inst != $.data(elem, this.name))) {
528
+ return;
529
+ }
530
+ if (this._keypadShowing) {
531
+ duration = (duration != null ? duration : inst.options.duration);
532
+ var showAnim = inst.options.showAnim;
533
+ if ($.effects && ($.effects[showAnim] || ($.effects.effect && $.effects.effect[showAnim]))) {
534
534
  inst._mainDiv.hide(showAnim, inst.options.showOptions || {}, duration);
535
+ }
536
+ else {
537
+ inst._mainDiv[(showAnim == 'slideDown' ? 'slideUp' :
538
+ (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))](showAnim ? duration : 0);
539
+ }
535
540
  }
536
- else {
537
- inst._mainDiv[(showAnim == 'slideDown' ? 'slideUp' :
538
- (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))](showAnim ? duration : 0);
541
+ if ($.isFunction(inst.options.onClose)) {
542
+ inst.options.onClose.apply((inst._input ? inst._input[0] : null), // trigger custom callback
543
+ [inst._input.val(), inst]);
539
544
  }
540
- }
541
- if ($.isFunction(inst.options.onClose)) {
542
- inst.options.onClose.apply((inst._input ? inst._input[0] : null), // trigger custom callback
543
- [inst._input.val(), inst]);
544
- }
545
- if (this._keypadShowing) {
546
- this._keypadShowing = false;
547
- this._lastField = null;
548
- }
549
- if (inst._inline) {
550
- inst._input.val('');
551
- }
552
- this._curInst = null;
553
- },
545
+ if (this._keypadShowing) {
546
+ this._keypadShowing = false;
547
+ this._lastField = null;
548
+ }
549
+ if (inst._inline) {
550
+ inst._input.val('');
551
+ }
552
+ this._curInst = null;
553
+ },
554
554
 
555
555
  /** Handle keystrokes.
556
556
  @private
557
557
  @param event {Event} The key event. */
558
558
  _doKeyDown: function(event) {
559
559
  if (event.keyCode == 9) { // Tab out
560
- plugin.mainDiv.stop(true, true);
560
+ plugin.mainDiv.stop(true, true);
561
561
  plugin.hide();
562
- }
563
- },
562
+ }
563
+ },
564
564
 
565
565
  /** Close keypad if clicked elsewhere.
566
566
  @private
567
567
  @param event {Event} The mouseclick details. */
568
- _checkExternalClick: function(event) {
569
- if (!plugin._curInst) {
570
- return;
571
- }
572
- var target = $(event.target);
568
+ _checkExternalClick: function(event) {
569
+ if (!plugin._curInst) {
570
+ return;
571
+ }
572
+ var target = $(event.target);
573
573
  if (target.closest('.' + plugin._mainDivClass).length === 0 &&
574
574
  !target.hasClass(plugin._getMarker()) &&
575
575
  target.closest('.' + plugin._triggerClass).length === 0 &&
576
- plugin._keypadShowing) {
576
+ plugin._keypadShowing) {
577
577
  plugin.hide();
578
- }
579
- },
578
+ }
579
+ },
580
580
 
581
581
  /** Toggle between upper and lower case.
582
582
  @private
583
583
  @param inst {object} The instance settings. */
584
- _shiftKeypad: function(inst) {
585
- inst.ucase = !inst.ucase;
586
- this._updateKeypad(inst);
587
- inst._input.focus(); // for further typing
588
- },
584
+ _shiftKeypad: function(inst) {
585
+ inst.ucase = !inst.ucase;
586
+ this._updateKeypad(inst);
587
+ inst._input.focus(); // for further typing
588
+ },
589
589
 
590
590
  /** Erase the text field.
591
591
  @private
592
592
  @param inst {object} The instance settings. */
593
- _clearValue: function(inst) {
594
- this._setValue(inst, '', 0);
595
- this._notifyKeypress(inst, plugin.DEL);
596
- },
593
+ _clearValue: function(inst) {
594
+ this._setValue(inst, '', 0);
595
+ this._notifyKeypress(inst, plugin.DEL);
596
+ },
597
597
 
598
598
  /** Erase the last character.
599
599
  @private
600
600
  @param inst {object} The instance settings. */
601
- _backValue: function(inst) {
601
+ _backValue: function(inst) {
602
602
  var elem = inst._input[0];
603
- var value = inst._input.val();
604
- var range = [value.length, value.length];
603
+ var value = inst._input.val();
604
+ var range = [value.length, value.length];
605
605
  range = (inst._input.prop('readonly') || inst._input.prop('disabled') ? range :
606
606
  (elem.setSelectionRange /* Mozilla */ ? [elem.selectionStart, elem.selectionEnd] :
607
607
  (elem.createTextRange /* IE */ ? this._getIERange(elem) : range)));
608
- this._setValue(inst, (value.length == 0 ? '' :
609
- value.substr(0, range[0] - 1) + value.substr(range[1])), range[0] - 1);
610
- this._notifyKeypress(inst, plugin.BS);
611
- },
608
+ this._setValue(inst, (value.length == 0 ? '' :
609
+ value.substr(0, range[0] - 1) + value.substr(range[1])), range[0] - 1);
610
+ this._notifyKeypress(inst, plugin.BS);
611
+ },
612
612
 
613
613
  /** Update the text field with the selected value.
614
614
  @private
615
615
  @param inst {object} The instance settings.
616
616
  @param value {string} The new character to add. */
617
- _selectValue: function(inst, value) {
618
- this.insertValue(inst._input[0], value);
619
- this._setValue(inst, inst._input.val());
620
- this._notifyKeypress(inst, value);
621
- },
617
+ _selectValue: function(inst, value) {
618
+ this.insertValue(inst._input[0], value);
619
+ this._setValue(inst, inst._input.val());
620
+ this._notifyKeypress(inst, value);
621
+ },
622
622
 
623
623
  /** Update the text field with the selected value.
624
624
  @param input {string|Element|jQuery} The jQuery selector, input field, or jQuery collection.
625
625
  @param value {string} The new character to add.
626
626
  @example $.keypad.insertValue(field, 'abc'); */
627
- insertValue: function(input, value) {
628
- input = (input.jquery ? input : $(input));
627
+ insertValue: function(input, value) {
628
+ input = (input.jquery ? input : $(input));
629
629
  var elem = input[0];
630
- var newValue = input.val();
631
- var range = [newValue.length, newValue.length];
630
+ var newValue = input.val();
631
+ var range = [newValue.length, newValue.length];
632
632
  range = (input.attr('readonly') || input.attr('disabled') ? range :
633
633
  (elem.setSelectionRange /* Mozilla */ ? [elem.selectionStart, elem.selectionEnd] :
634
634
  (elem.createTextRange /* IE */ ? this._getIERange(elem) : range)));
635
- input.val(newValue.substr(0, range[0]) + value + newValue.substr(range[1]));
636
- pos = range[0] + value.length;
637
- if (input.is(':visible')) {
638
- input.focus(); // for further typing
639
- }
640
- if (elem.setSelectionRange) { // Mozilla
635
+ input.val(newValue.substr(0, range[0]) + value + newValue.substr(range[1]));
636
+ pos = range[0] + value.length;
641
637
  if (input.is(':visible')) {
642
- elem.setSelectionRange(pos, pos);
638
+ input.focus(); // for further typing
639
+ }
640
+ if (elem.setSelectionRange) { // Mozilla
641
+ if (input.is(':visible')) {
642
+ elem.setSelectionRange(pos, pos);
643
+ }
643
644
  }
644
- }
645
645
  else if (elem.createTextRange) { // IE
646
646
  range = elem.createTextRange();
647
- range.move('character', pos);
648
- range.select();
649
- }
650
- },
647
+ range.move('character', pos);
648
+ range.select();
649
+ }
650
+ },
651
651
 
652
652
  /** Get the coordinates for the selected area in the text field in IE.
653
653
  @private
@@ -655,37 +655,37 @@
655
655
  @return {number[]} The start and end positions of the selection. */
656
656
  _getIERange: function(elem) {
657
657
  elem.focus();
658
- var selectionRange = document.selection.createRange().duplicate();
659
- // Use two ranges: before and selection
658
+ var selectionRange = document.selection.createRange().duplicate();
659
+ // Use two ranges: before and selection
660
660
  var beforeRange = this._getIETextRange(elem);
661
- beforeRange.setEndPoint('EndToStart', selectionRange);
662
- // Check each range for trimmed newlines by shrinking the range by one
663
- // character and seeing if the text property has changed. If it has not
664
- // changed then we know that IE has trimmed a \r\n from the end.
665
- var checkCRLF = function(range) {
666
- var origText = range.text;
667
- var text = origText;
668
- var finished = false;
669
- while (true) {
670
- if (range.compareEndPoints('StartToEnd', range) == 0) {
671
- break;
672
- }
673
- else {
674
- range.moveEnd('character', -1);
675
- if (range.text == origText) {
676
- text += '\r\n';
661
+ beforeRange.setEndPoint('EndToStart', selectionRange);
662
+ // Check each range for trimmed newlines by shrinking the range by one
663
+ // character and seeing if the text property has changed. If it has not
664
+ // changed then we know that IE has trimmed a \r\n from the end.
665
+ var checkCRLF = function(range) {
666
+ var origText = range.text;
667
+ var text = origText;
668
+ var finished = false;
669
+ while (true) {
670
+ if (range.compareEndPoints('StartToEnd', range) == 0) {
671
+ break;
677
672
  }
678
673
  else {
679
- break;
674
+ range.moveEnd('character', -1);
675
+ if (range.text == origText) {
676
+ text += '\r\n';
677
+ }
678
+ else {
679
+ break;
680
+ }
680
681
  }
681
682
  }
682
- }
683
- return text;
684
- };
685
- var beforeText = checkCRLF(beforeRange);
686
- var selectionText = checkCRLF(selectionRange);
687
- return [beforeText.length, beforeText.length + selectionText.length];
688
- },
683
+ return text;
684
+ };
685
+ var beforeText = checkCRLF(beforeRange);
686
+ var selectionText = checkCRLF(selectionRange);
687
+ return [beforeText.length, beforeText.length + selectionText.length];
688
+ },
689
689
 
690
690
  /** Create an IE text range for the text field.
691
691
  @private
@@ -694,189 +694,191 @@
694
694
  _getIETextRange: function(elem) {
695
695
  var isInput = (elem.nodeName.toLowerCase() == 'input');
696
696
  var range = (isInput ? elem.createTextRange() : document.body.createTextRange());
697
- if (!isInput) {
697
+ if (!isInput) {
698
698
  range.moveToElementText(elem); // Selects all the text for a textarea
699
- }
700
- return range;
701
- },
699
+ }
700
+ return range;
701
+ },
702
702
 
703
703
  /** Set the text field to the selected value, and trigger any on change event.
704
704
  @private
705
705
  @param inst {object} The instance settings.
706
706
  @param value {string} The new value for the text field. */
707
- _setValue: function(inst, value) {
708
- var maxlen = inst._input.attr('maxlength');
709
- if (maxlen > -1) {
710
- value = value.substr(0, maxlen);
711
- }
712
- inst._input.val(value);
713
- if (!$.isFunction(inst.options.onKeypress)) {
714
- inst._input.trigger('change'); // fire the change event
715
- }
716
- },
707
+ _setValue: function(inst, value) {
708
+ var maxlen = inst._input.attr('maxlength');
709
+ if (maxlen > -1) {
710
+ value = value.substr(0, maxlen);
711
+ }
712
+ inst._input.val(value);
713
+ if (!$.isFunction(inst.options.onKeypress)) {
714
+ inst._input.trigger('change'); // fire the change event
715
+ }
716
+ },
717
717
 
718
718
  /** Notify clients of a keypress.
719
719
  @private
720
720
  @param inst {object} The instance settings.
721
721
  @param key {string} The character pressed. */
722
- _notifyKeypress: function(inst, key) {
723
- if ($.isFunction(inst.options.onKeypress)) { // trigger custom callback
724
- inst.options.onKeypress.apply((inst._input ? inst._input[0] : null),
725
- [key, inst._input.val(), inst]);
726
- }
727
- },
722
+ _notifyKeypress: function(inst, key) {
723
+ if ($.isFunction(inst.options.onKeypress)) { // trigger custom callback
724
+ inst.options.onKeypress.apply((inst._input ? inst._input[0] : null),
725
+ [key, inst._input.val(), inst]);
726
+ }
727
+ },
728
728
 
729
729
  /** Generate the HTML for the current state of the keypad.
730
730
  @private
731
731
  @param inst {object} The instance settings.
732
732
  @return {jQuery} The HTML for this keypad. */
733
- _generateHTML: function(inst) {
734
- var html = (!inst.options.prompt ? '' : '<div class="' + this._promptClass +
735
- (inst.options.useThemeRoller ? ' ui-widget-header ui-corner-all' : '') + '">' +
736
- inst.options.prompt + '</div>');
737
- var layout = this._randomiseLayout(inst);
738
- for (var i = 0; i < layout.length; i++) {
739
- html += '<div class="' + this._rowClass + '">';
740
- var keys = layout[i].split(inst.options.separator);
741
- for (var j = 0; j < keys.length; j++) {
742
- if (inst.ucase) {
743
- keys[j] = inst.options.toUpper(keys[j]);
744
- }
745
- var keyDef = this._specialKeys[keys[j].charCodeAt(0)];
746
- if (keyDef) {
747
- html += (keyDef.action ? '<button type="button" class="' + this._specialClass +
748
- ' ' + this._namePrefixClass + keyDef.name +
749
- (inst.options.useThemeRoller ? ' ui-corner-all ui-state-default' +
750
- (keyDef.noHighlight ? '' : ' ui-state-highlight') : '') +
751
- '" title="' + inst.options[keyDef.name + 'Status'] + '">' +
752
- (inst.options[keyDef.name + 'Text'] || '&nbsp;') + '</button>' :
753
- '<div class="' + this._namePrefixClass + keyDef.name + '"></div>');
754
- }
755
- else {
756
- html += '<button type="button" class="' + this._keyClass +
757
- (inst.options.useThemeRoller ? ' ui-corner-all ui-state-default' : '') + '">' +
758
- (keys[j] == ' ' ? '&nbsp;' : keys[j]) + '</button>';
733
+ _generateHTML: function(inst) {
734
+ var html = (!inst.options.prompt ? '' : '<div class="' + this._promptClass +
735
+ (inst.options.useThemeRoller ? ' ui-widget-header ui-corner-all' : '') + '">' +
736
+ inst.options.prompt + '</div>');
737
+ var layout = this._randomiseLayout(inst);
738
+ for (var i = 0; i < layout.length; i++) {
739
+ html += '<div class="' + this._rowClass + '">';
740
+ var keys = layout[i].split(inst.options.separator);
741
+ for (var j = 0; j < keys.length; j++) {
742
+ if (inst.ucase) {
743
+ keys[j] = inst.options.toUpper(keys[j]);
744
+ }
745
+ var keyDef = this._specialKeys[keys[j].charCodeAt(0)];
746
+ if (keyDef) {
747
+ html += (keyDef.action ? '<button type="button" class="' +
748
+ this._specialClass + ' ' + this._namePrefixClass + keyDef.name +
749
+ (inst.options.useThemeRoller ? ' ui-corner-all ui-state-default' +
750
+ (keyDef.noHighlight ? '' : ' ui-state-highlight') : '') +
751
+ '" title="' + inst.options[keyDef.name + 'Status'] + '">' +
752
+ (inst.options[keyDef.name + 'Text'] || '&#160;') + '</button>' :
753
+ '<div class="' + this._namePrefixClass + keyDef.name + '"></div>');
754
+ }
755
+ else {
756
+ html += '<button type="button" class="' + this._keyClass +
757
+ (inst.options.useThemeRoller ? ' ui-corner-all ui-state-default' : '') +
758
+ '">' + (keys[j] == ' ' ? '&#160;' : keys[j]) + '</button>';
759
+ }
759
760
  }
761
+ html += '</div>';
760
762
  }
761
- html += '</div>';
762
- }
763
- html = $(html);
764
- var thisInst = inst;
765
- var activeClasses = this._keyDownClass + (inst.options.useThemeRoller ? ' ui-state-active' : '');
766
- html.find('button').mousedown(function() { $(this).addClass(activeClasses); }).
767
- mouseup(function() { $(this).removeClass(activeClasses); }).
768
- mouseout(function() { $(this).removeClass(activeClasses); }).
769
- filter('.' + this._keyClass).click(function() { plugin._selectValue(thisInst, $(this).text()); });
770
- $.each(this._specialKeys, function(i, keyDef) {
771
- html.find('.' + plugin._namePrefixClass + keyDef.name).click(function() {
772
- keyDef.action.apply(thisInst._input, [thisInst]);
763
+ html = $(html);
764
+ var thisInst = inst;
765
+ var activeClasses = this._keyDownClass +
766
+ (inst.options.useThemeRoller ? ' ui-state-active' : '');
767
+ html.find('button').mousedown(function() { $(this).addClass(activeClasses); }).
768
+ mouseup(function() { $(this).removeClass(activeClasses); }).
769
+ mouseout(function() { $(this).removeClass(activeClasses); }).
770
+ filter('.' + this._keyClass).
771
+ click(function() { plugin._selectValue(thisInst, $(this).text()); });
772
+ $.each(this._specialKeys, function(i, keyDef) {
773
+ html.find('.' + plugin._namePrefixClass + keyDef.name).click(function() {
774
+ keyDef.action.apply(thisInst._input, [thisInst]);
775
+ });
773
776
  });
774
- });
775
- return html;
776
- },
777
+ return html;
778
+ },
777
779
 
778
780
  /** Check whether characters should be randomised, and, if so, produce the randomised layout.
779
781
  @private
780
782
  @param inst {object} The instance settings.
781
783
  @return {string[]} The layout with any requested randomisations applied. */
782
- _randomiseLayout: function(inst) {
783
- if (!inst.options.randomiseNumeric && !inst.options.randomiseAlphabetic &&
784
- !inst.options.randomiseOther && !inst.options.randomiseAll) {
785
- return inst.options.layout;
786
- }
787
- var numerics = [];
788
- var alphas = [];
789
- var others = [];
790
- var newLayout = [];
791
- // Find characters of different types
792
- for (var i = 0; i < inst.options.layout.length; i++) {
793
- newLayout[i] = '';
794
- var keys = inst.options.layout[i].split(inst.options.separator);
795
- for (var j = 0; j < keys.length; j++) {
796
- if (this._isControl(keys[j])) {
797
- continue;
798
- }
799
- if (inst.options.randomiseAll) {
800
- others.push(keys[j]);
801
- }
802
- else if (inst.options.isNumeric(keys[j])) {
803
- numerics.push(keys[j]);
804
- }
805
- else if (inst.options.isAlphabetic(keys[j])) {
806
- alphas.push(keys[j]);
807
- }
808
- else {
809
- others.push(keys[j]);
784
+ _randomiseLayout: function(inst) {
785
+ if (!inst.options.randomiseNumeric && !inst.options.randomiseAlphabetic &&
786
+ !inst.options.randomiseOther && !inst.options.randomiseAll) {
787
+ return inst.options.layout;
788
+ }
789
+ var numerics = [];
790
+ var alphas = [];
791
+ var others = [];
792
+ var newLayout = [];
793
+ // Find characters of different types
794
+ for (var i = 0; i < inst.options.layout.length; i++) {
795
+ newLayout[i] = '';
796
+ var keys = inst.options.layout[i].split(inst.options.separator);
797
+ for (var j = 0; j < keys.length; j++) {
798
+ if (this._isControl(keys[j])) {
799
+ continue;
800
+ }
801
+ if (inst.options.randomiseAll) {
802
+ others.push(keys[j]);
803
+ }
804
+ else if (inst.options.isNumeric(keys[j])) {
805
+ numerics.push(keys[j]);
806
+ }
807
+ else if (inst.options.isAlphabetic(keys[j])) {
808
+ alphas.push(keys[j]);
809
+ }
810
+ else {
811
+ others.push(keys[j]);
812
+ }
810
813
  }
811
814
  }
812
- }
813
- // Shuffle them
814
- if (inst.options.randomiseNumeric) {
815
- this._shuffle(numerics);
816
- }
817
- if (inst.options.randomiseAlphabetic) {
818
- this._shuffle(alphas);
819
- }
820
- if (inst.options.randomiseOther || inst.options.randomiseAll) {
821
- this._shuffle(others);
822
- }
823
- var n = 0;
824
- var a = 0;
825
- var o = 0;
826
- // And replace them in the layout
827
- for (var i = 0; i < inst.options.layout.length; i++) {
828
- var keys = inst.options.layout[i].split(inst.options.separator);
829
- for (var j = 0; j < keys.length; j++) {
830
- newLayout[i] += (this._isControl(keys[j]) ? keys[j] :
831
- (inst.options.randomiseAll ? others[o++] :
832
- (inst.options.isNumeric(keys[j]) ? numerics[n++] :
833
- (inst.options.isAlphabetic(keys[j]) ? alphas[a++] :
834
- others[o++])))) + inst.options.separator;
815
+ // Shuffle them
816
+ if (inst.options.randomiseNumeric) {
817
+ this._shuffle(numerics);
835
818
  }
836
- }
837
- return newLayout;
838
- },
819
+ if (inst.options.randomiseAlphabetic) {
820
+ this._shuffle(alphas);
821
+ }
822
+ if (inst.options.randomiseOther || inst.options.randomiseAll) {
823
+ this._shuffle(others);
824
+ }
825
+ var n = 0;
826
+ var a = 0;
827
+ var o = 0;
828
+ // And replace them in the layout
829
+ for (var i = 0; i < inst.options.layout.length; i++) {
830
+ var keys = inst.options.layout[i].split(inst.options.separator);
831
+ for (var j = 0; j < keys.length; j++) {
832
+ newLayout[i] += (this._isControl(keys[j]) ? keys[j] :
833
+ (inst.options.randomiseAll ? others[o++] :
834
+ (inst.options.isNumeric(keys[j]) ? numerics[n++] :
835
+ (inst.options.isAlphabetic(keys[j]) ? alphas[a++] :
836
+ others[o++])))) + inst.options.separator;
837
+ }
838
+ }
839
+ return newLayout;
840
+ },
839
841
 
840
842
  /** Is a given character a control character?
841
843
  @private
842
844
  @param ch {string} The character to test.
843
845
  @return {boolean} True if a control character, false if not. */
844
- _isControl: function(ch) {
845
- return ch < ' ';
846
- },
846
+ _isControl: function(ch) {
847
+ return ch < ' ';
848
+ },
847
849
 
848
850
  /** Is a given character alphabetic?
849
851
  @param ch {string} The character to test.
850
852
  @return {boolean} True if alphabetic, false if not. */
851
- isAlphabetic: function(ch) {
852
- return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
853
- },
853
+ isAlphabetic: function(ch) {
854
+ return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
855
+ },
854
856
 
855
857
  /** Is a given character numeric?
856
858
  @param ch {string} The character to test.
857
859
  @return {boolean} True if numeric, false if not. */
858
- isNumeric: function(ch) {
859
- return (ch >= '0' && ch <= '9');
860
- },
860
+ isNumeric: function(ch) {
861
+ return (ch >= '0' && ch <= '9');
862
+ },
861
863
 
862
864
  /** Convert a character to upper case.
863
865
  @param ch {string} The character to convert.
864
866
  @return {string} Its uppercase version. */
865
- toUpper: function(ch) {
866
- return ch.toUpperCase();
867
- },
867
+ toUpper: function(ch) {
868
+ return ch.toUpperCase();
869
+ },
868
870
 
869
871
  /** Randomise the contents of an array.
870
872
  @private
871
873
  @param values {string[]} The array to rearrange. */
872
- _shuffle: function(values) {
873
- for (var i = values.length - 1; i > 0; i--) {
874
- var j = Math.floor(Math.random() * values.length);
875
- var ch = values[i];
876
- values[i] = values[j];
877
- values[j] = ch;
874
+ _shuffle: function(values) {
875
+ for (var i = values.length - 1; i > 0; i--) {
876
+ var j = Math.floor(Math.random() * values.length);
877
+ var ch = values[i];
878
+ values[i] = values[j];
879
+ values[j] = ch;
880
+ }
878
881
  }
879
- }
880
882
  });
881
883
 
882
884
  var plugin = $.keypad;
@@ -904,14 +906,15 @@
904
906
  plugin.SPACE + 'zxcvbnm,.?' + plugin.SPACE + plugin.HALF_SPACE + '-0+',
905
907
  '' + plugin.TAB + plugin.ENTER + plugin.SPACE_BAR + plugin.SHIFT +
906
908
  plugin.HALF_SPACE + plugin.BACK + plugin.CLEAR],
907
- $.extend(plugin.regionalOptions[''], {alphabeticLayout: plugin.qwertyAlphabetic, fullLayout: plugin.qwertyLayout,
909
+ $.extend(plugin.regionalOptions[''],
910
+ {alphabeticLayout: plugin.qwertyAlphabetic, fullLayout: plugin.qwertyLayout,
908
911
  isAlphabetic: plugin.isAlphabetic, isNumeric: plugin.isNumeric, toUpper: plugin.toUpper});
909
912
  plugin.setDefaults($.extend({layout: plugin.numericLayout}, plugin.regionalOptions['']));
910
913
 
911
914
  // Add the keypad division and external click check
912
915
  $(function() {
913
- $(document.body).append(plugin.mainDiv).
914
- mousedown(plugin._checkExternalClick);
916
+ $(document.body).append(plugin.mainDiv).
917
+ on('mousedown.' + pluginName, plugin._checkExternalClick);
915
918
  });
916
919
 
917
920
  })(jQuery);