jquery-keypad-rails 1.4.2.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OWU1NmI5OTJhMjIzOWIxYjc0MWVmNDdmOTg0YjEzODNmNmUwMDlmMg==
4
+ YjhiZDFlNGJlY2M3YzRmZDhkY2VlN2M5MTJmN2U0OWM0NDNjODM4Mg==
5
5
  data.tar.gz: !binary |-
6
- YjcyY2QyNDEwYTJmMmY1MzgxMzA2OWIwMDc4ZjUxMGJhOTZjMjkzYw==
6
+ YzI2OTlmNDhkNTk5ODkzMzZlNGJkMzVmM2QyMTU4Y2YyMTg1YzBhNw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NGQ1OTg0ODUxNTJhNjdlMDliNzZhZTc3MDMyYmM0ODcwYzkwMDZhY2E1MWZh
10
- ZGIyODIyZWY1YzkyM2M1ZjAzZWEwZmE4MjBmMGJiZmViNjBjMDY5MjcxYjY0
11
- ZGJkMGE4OGRmYjBhYTE0OGQxMTY3ODAyYWJjMjk4NmEyOTIzMDI=
9
+ ODkzNGZlNTE1MjAzYTc5NDU2YTFhZmI4ZWNlMzMyNmUzMTczOGQ2OGMxNjUy
10
+ NDljNDE0NTkxMGNlMDNjYWI4MDRjN2U5M2FlYmMxNGIwNmJjMzc5ODU5NjU2
11
+ Zjc5ZmRlZjRmNzQxODJjY2U5YWZmYTNmN2U2MDQ4YjdmMzFkM2Y=
12
12
  data.tar.gz: !binary |-
13
- ZGU0OGIwOWIyZmFlYjAzOTcyNWJlMWE4OWU3MjczZTFlYzU0YmM1NTM5NmYy
14
- ODkzMzI5NmUwZGQ5ODAwZTUxZjZkOGM2YmM0M2M0OTkwY2UzODc5MTA4MGU3
15
- ODE3Yjk4MzdhZjMyYjFiYzU5MGE4ODQyZTc2ZTVhOWNlNDY2NzY=
13
+ ZmQ2MzEwM2MzYzJjNjNhNjdlNzcxZjFkYmZlYjBmNzUwNmNkMjcxNjcwYWQ0
14
+ ODU5MzE2NWU0NzVmMDBiOTc2ZjJlZjEwODk1MTYzYjE5Y2EzMTU2YzgyNTI3
15
+ OTkzM2YxMTFjNTZmNDViMWQ5MWVjMDVlNGUxNGQ1MTExYTkyZDk=
data/build.me CHANGED
@@ -1,7 +1,6 @@
1
1
  #!/bin/bash
2
2
 
3
- VER=1.4.2
4
- REV=.1
3
+ VER=1.5.0
5
4
 
6
5
  rm build/*
7
6
  pushd build
@@ -20,15 +19,13 @@ cat >lib/jquery/keypad/rails/version.rb <<EOF
20
19
  module Jquery
21
20
  module Keypad
22
21
  module Rails
23
- VERSION = "${VER}${REV}"
22
+ VERSION = "${VER}"
24
23
  end
25
24
  end
26
25
  end
27
26
  EOF
28
27
 
29
- git commit -a
30
-
31
28
  gem update --system
32
29
  gem build jquery-keypad-rails.gemspec
33
- # gem push jquery-keypad-rails-${VER}.gem
30
+ gem push jquery-keypad-rails-${VER}.gem
34
31
 
@@ -1,7 +1,7 @@
1
1
  module Jquery
2
2
  module Keypad
3
3
  module Rails
4
- VERSION = "1.4.2.1"
4
+ VERSION = "1.5.0"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,21 @@
1
+ /* http://keith-wood.name/keypad.html
2
+ Catalan initialisation for the jQuery keypad extension
3
+ Written by Ignasi Nogues (inogues@clickartedu.com). */
4
+ (function($) { // hide the namespace
5
+ $.keypad.regional['ca'] = {
6
+ buttonText: '...', buttonStatus: 'Obrir el teclat',
7
+ closeText: 'Tancar', closeStatus: 'Tancar el teclat',
8
+ clearText: 'Netejar', clearStatus: 'Eliminar tot el text',
9
+ backText: 'Tornar', backStatus: 'Borrar el caràcter anterior',
10
+ shiftText: 'Shift', shiftStatus: 'Canviar majúscules/minúscules',
11
+ spacebarText: '&nbsp;', spacebarStatus: '',
12
+ enterText: 'Entrar', enterStatus: '',
13
+ tabText: '→', tabStatus: '',
14
+ alphabeticLayout: $.keypad.qwertyAlphabetic,
15
+ fullLayout: $.keypad.qwertyLayout,
16
+ isAlphabetic: $.keypad.isAlphabetic,
17
+ isNumeric: $.keypad.isNumeric,
18
+ toUpper: $.keypad.toUpper,
19
+ isRTL: false};
20
+ $.keypad.setDefaults($.keypad.regional['ca']);
21
+ })(jQuery);
@@ -0,0 +1,21 @@
1
+ /* http://keith-wood.name/keypad.html
2
+ Czech initialisation for the jQuery keypad extension
3
+ Written by Amadeo Mareš. */
4
+ (function($) { // hide the namespace
5
+ $.keypad.regional['cs'] = {
6
+ buttonText: '...', buttonStatus: 'Otevřít',
7
+ closeText: 'Zavřít', closeStatus: 'Zavře klávesnici',
8
+ clearText: 'Vymazat', clearStatus: 'Smaže text',
9
+ backText: 'Smazat', backStatus: 'Smaže poslední písmeno',
10
+ shiftText: 'Velikost', shiftStatus: 'Nastaví velká/malá písmena',
11
+ spacebarText: '&nbsp;', spacebarStatus: '',
12
+ enterText: 'Enter', enterStatus: '',
13
+ tabText: '→', tabStatus: '',
14
+ alphabeticLayout: $.keypad.qwertyAlphabetic,
15
+ fullLayout: $.keypad.qwertyLayout,
16
+ isAlphabetic: $.keypad.isAlphabetic,
17
+ isNumeric: $.keypad.isNumeric,
18
+ toUpper: $.keypad.toUpper,
19
+ isRTL: false};
20
+ $.keypad.setDefaults($.keypad.regional['cs']);
21
+ })(jQuery);
@@ -29,6 +29,7 @@
29
29
  fullLayout: $.keypad.qwertzLayout,
30
30
  isAlphabetic: $.keypad.isAlphabetic,
31
31
  isNumeric: $.keypad.isNumeric,
32
+ toUpper: $.keypad.toUpper,
32
33
  isRTL: false};
33
34
  $.keypad.setDefaults($.keypad.regional['de']);
34
35
 
@@ -15,6 +15,7 @@
15
15
  fullLayout: $.keypad.qwertyLayout,
16
16
  isAlphabetic: $.keypad.isAlphabetic,
17
17
  isNumeric: $.keypad.isNumeric,
18
+ toUpper: $.keypad.toUpper,
18
19
  isRTL: false};
19
20
  $.keypad.setDefaults($.keypad.regional['es']);
20
21
  })(jQuery);
@@ -25,6 +25,7 @@
25
25
  fullLayout: $.keypad.azertyLayout,
26
26
  isAlphabetic: $.keypad.isAlphabetic,
27
27
  isNumeric: $.keypad.isNumeric,
28
+ toUpper: $.keypad.toUpper,
28
29
  isRTL: false};
29
30
  $.keypad.setDefaults($.keypad.regional['fr']);
30
31
 
@@ -15,6 +15,7 @@
15
15
  fullLayout: $.keypad.qwertyLayout,
16
16
  isAlphabetic: $.keypad.isAlphabetic,
17
17
  isNumeric: $.keypad.isNumeric,
18
+ toUpper: $.keypad.toUpper,
18
19
  isRTL: false};
19
20
  $.keypad.setDefaults($.keypad.regional['it']);
20
21
  })(jQuery);
@@ -15,6 +15,7 @@
15
15
  fullLayout: $.keypad.qwertyLayout,
16
16
  isAlphabetic: $.keypad.isAlphabetic,
17
17
  isNumeric: $.keypad.isNumeric,
18
+ toUpper: $.keypad.toUpper,
18
19
  isRTL: false};
19
20
  $.keypad.setDefaults($.keypad.regional['nl']);
20
21
  })(jQuery);
@@ -15,6 +15,7 @@
15
15
  fullLayout: $.keypad.qwertyLayout,
16
16
  isAlphabetic: $.keypad.isAlphabetic,
17
17
  isNumeric: $.keypad.isNumeric,
18
+ toUpper: $.keypad.toUpper,
18
19
  isRTL: false};
19
20
  $.keypad.setDefaults($.keypad.regional['pt-BR']);
20
21
  })(jQuery);
@@ -15,6 +15,7 @@
15
15
  fullLayout: $.keypad.qwertyLayout,
16
16
  isAlphabetic: $.keypad.isAlphabetic,
17
17
  isNumeric: $.keypad.isNumeric,
18
+ toUpper: $.keypad.toUpper,
18
19
  isRTL: false};
19
20
  $.keypad.setDefaults($.keypad.regional['tr']);
20
21
  })(jQuery);
@@ -1,5 +1,5 @@
1
1
  /* http://keith-wood.name/keypad.html
2
- Keypad field entry extension for jQuery v1.4.2.
2
+ Keypad field entry extension for jQuery v1.5.0.
3
3
  Written by Keith Wood (kbwood{at}iinet.com.au) August 2008.
4
4
  Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and
5
5
  MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses.
@@ -7,8 +7,6 @@
7
7
 
8
8
  (function($) { // hide the namespace
9
9
 
10
- var PROP_NAME = 'keypad';
11
-
12
10
  /* Keypad manager.
13
11
  Use the singleton instance of this class, $.keypad, to interact with the plugin.
14
12
  Settings for keypad fields are maintained in instance objects,
@@ -20,17 +18,17 @@ function Keypad() {
20
18
  this._keyCode = 0;
21
19
  this._specialKeys = [];
22
20
  this.addKeyDef('CLOSE', 'close', function(inst) {
23
- $.keypad._curInst = (inst._inline ? inst : $.keypad._curInst);
24
- $.keypad._hideKeypad();
21
+ plugin._curInst = (inst._inline ? inst : plugin._curInst);
22
+ plugin._hidePlugin();
25
23
  });
26
- this.addKeyDef('CLEAR', 'clear', function(inst) { $.keypad._clearValue(inst); });
27
- this.addKeyDef('BACK', 'back', function(inst) { $.keypad._backValue(inst); });
28
- this.addKeyDef('SHIFT', 'shift', function(inst) { $.keypad._shiftKeypad(inst); });
29
- this.addKeyDef('SPACE_BAR', 'spacebar', function(inst) { $.keypad._selectValue(inst, ' '); }, true);
24
+ this.addKeyDef('CLEAR', 'clear', function(inst) { plugin._clearValue(inst); });
25
+ this.addKeyDef('BACK', 'back', function(inst) { plugin._backValue(inst); });
26
+ this.addKeyDef('SHIFT', 'shift', function(inst) { plugin._shiftKeypad(inst); });
27
+ this.addKeyDef('SPACE_BAR', 'spacebar', function(inst) { plugin._selectValue(inst, ' '); }, true);
30
28
  this.addKeyDef('SPACE', 'space');
31
29
  this.addKeyDef('HALF_SPACE', 'half-space');
32
- this.addKeyDef('ENTER', 'enter', function(inst) { $.keypad._selectValue(inst, '\x0D'); }, true);
33
- this.addKeyDef('TAB', 'tab', function(inst) { $.keypad._selectValue(inst, '\x09'); }, true);
30
+ this.addKeyDef('ENTER', 'enter', function(inst) { plugin._selectValue(inst, '\x0D'); }, true);
31
+ this.addKeyDef('TAB', 'tab', function(inst) { plugin._selectValue(inst, '\x09'); }, true);
34
32
  // Standard US keyboard alphabetic layout
35
33
  this.qwertyAlphabetic = ['qwertyuiop', 'asdfghjkl', 'zxcvbnm'];
36
34
  // Standard US keyboard layout
@@ -63,6 +61,7 @@ function Keypad() {
63
61
  fullLayout: this.qwertyLayout, // Default layout for full keyboard
64
62
  isAlphabetic: this.isAlphabetic, // Function to determine if character is alphabetic
65
63
  isNumeric: this.isNumeric, // Function to determine if character is numeric
64
+ toUpper: this.toUpper, // Function to convert characters to upper case
66
65
  isRTL: false // True if right-to-left language, false if left-to-right
67
66
  };
68
67
  this._defaults = { // Global defaults for all the keypad instances
@@ -96,20 +95,29 @@ function Keypad() {
96
95
  $.extend(Keypad.prototype, {
97
96
  /* Class name added to elements to indicate already configured with keypad. */
98
97
  markerClassName: 'hasKeypad',
99
-
100
- _mainDivClass: 'keypad-popup', // The name of the main keypad division class
101
- _inlineClass: 'keypad-inline', // The name of the inline marker class
102
- _appendClass: 'keypad-append', // The name of the append marker class
103
- _triggerClass: 'keypad-trigger', // The name of the trigger marker class
104
- _disableClass: 'keypad-disabled', // The name of the disabled covering marker class
105
- _inlineEntryClass: 'keypad-keyentry', // The name of the inline entry marker class
106
- _coverClass: 'keypad-cover', // The name of the IE select cover marker class
107
-
108
- /* Override the default settings for all instances of keypad.
98
+ /* Name of the data property for instance settings. */
99
+ propertyName: 'keypad',
100
+
101
+ _mainDivClass: 'keypad-popup', // The main keypad division class
102
+ _inlineClass: 'keypad-inline', // The inline marker class
103
+ _appendClass: 'keypad-append', // The append marker class
104
+ _triggerClass: 'keypad-trigger', // The trigger marker class
105
+ _disableClass: 'keypad-disabled', // The disabled covering marker class
106
+ _inlineEntryClass: 'keypad-keyentry', // The inline entry marker class
107
+ _coverClass: 'keypad-cover', // The IE select cover marker class
108
+ _rtlClass: 'keypad-rtl', // The right-to-left marker class
109
+ _rowClass: 'keypad-row', // The keypad row marker class
110
+ _promptClass: 'keypad-prompt', // The prompt marker class
111
+ _specialClass: 'keypad-special', // The special key marker class
112
+ _namePrefixClass: 'keypad-', // The key name marker class prefix
113
+ _keyClass: 'keypad-key', // The key marker class
114
+ _keyDownClass: 'keypad-key-down', // The key down marker class
115
+
116
+ /* Override the default settings for all keypad instances.
109
117
  @param settings (object) the new settings to use as defaults
110
- @return (object) the manager object */
118
+ @return (Keypad) this object */
111
119
  setDefaults: function(settings) {
112
- extendRemove(this._defaults, settings || {});
120
+ $.extend(this._defaults, settings || {});
113
121
  return this;
114
122
  },
115
123
 
@@ -120,7 +128,7 @@ $.extend(Keypad.prototype, {
120
128
  @param action (function) the action performed for this key -
121
129
  receives inst as a parameter
122
130
  @param noHighlight (boolean) true to suppress highlight when using ThemeRoller
123
- @return (object) the manager object */
131
+ @return (Keypad) this object */
124
132
  addKeyDef: function(id, name, action, noHighlight) {
125
133
  if (this._keyCode == 32) {
126
134
  throw 'Only 32 special keys allowed';
@@ -132,24 +140,26 @@ $.extend(Keypad.prototype, {
132
140
  },
133
141
 
134
142
  /* Attach the keypad to a jQuery selection.
135
- @param target (element) the target control
136
- @param settings (object) the new settings to use for this instance */
137
- _attachKeypad: function(target, settings) {
138
- var inline = (target.nodeName.toLowerCase() != 'input' &&
139
- target.nodeName.toLowerCase() != 'textarea');
140
- var inst = {_inline: inline,
141
- _mainDiv: (inline ? $('<div class="' + this._inlineClass + '"></div>') :
142
- $.keypad.mainDiv), ucase: false};
143
- inst.settings = $.extend({}, settings || {});
143
+ @param target (element) the control to affect
144
+ @param options (object) the custom options for this instance */
145
+ _attachPlugin: function(target, options) {
146
+ target = $(target);
147
+ if (target.hasClass(this.markerClassName)) {
148
+ return;
149
+ }
150
+ var inline = !target[0].nodeName.toLowerCase().match(/input|textarea/);
151
+ var inst = {options: $.extend({}, this._defaults, options), _inline: inline,
152
+ _mainDiv: (inline ? $('<div class="' + this._inlineClass + '"></div>') : plugin.mainDiv),
153
+ ucase: false};
144
154
  this._setInput(target, inst);
145
155
  this._connectKeypad(target, inst);
146
156
  if (inline) {
147
- $(target).append(inst._mainDiv).
148
- bind('click.keypad', function() { inst._input.focus(); });
157
+ target.append(inst._mainDiv).
158
+ bind('click.' + this.propertyName, function() { inst._input.focus(); });
149
159
  this._updateKeypad(inst);
150
160
  }
151
- else if ($(target).is(':disabled')) {
152
- this._disableKeypad(target);
161
+ else if (target.is(':disabled')) {
162
+ this._disablePlugin(target);
153
163
  }
154
164
  },
155
165
 
@@ -157,132 +167,161 @@ $.extend(Keypad.prototype, {
157
167
  @param target (jQuery) the target control
158
168
  @param inst (object) the instance settings */
159
169
  _setInput: function(target, inst) {
160
- inst._input = $(!inst._inline ? target : this._get(inst, 'target') ||
170
+ inst._input = $(!inst._inline ? target : inst.options.target ||
161
171
  '<input type="text" class="' + this._inlineEntryClass + '" disabled="disabled"/>');
162
172
  if (inst._inline) {
163
- target = $(target);
164
173
  target.find('input').remove();
165
- if (!this._get(inst, 'target')) {
174
+ if (!inst.options.target) {
166
175
  target.append(inst._input);
167
176
  }
168
177
  }
169
178
  },
170
179
 
171
180
  /* Attach the keypad to a text field.
172
- @param target (element) the target text field
181
+ @param target (jQuery) the target text field
173
182
  @param inst (object) the instance settings */
174
183
  _connectKeypad: function(target, inst) {
175
- var field = $(target);
176
- if (field.hasClass(this.markerClassName)) {
177
- return;
178
- }
179
- var appendText = this._get(inst, 'appendText');
180
- var isRTL = this._get(inst, 'isRTL');
184
+ target = $(target);
185
+ var appendText = inst.options.appendText;
181
186
  if (appendText) {
182
- field[isRTL ? 'before' : 'after'](
187
+ target[inst.options.isRTL ? 'before' : 'after'](
183
188
  '<span class="' + this._appendClass + '">' + appendText + '</span>');
184
189
  }
185
190
  if (!inst._inline) {
186
- var showOn = this._get(inst, 'showOn');
187
- if (showOn == 'focus' || showOn == 'both') { // pop-up keypad when in the marked field
188
- field.focus(this._showKeypad).keydown(this._doKeyDown);
191
+ if (inst.options.showOn == 'focus' || inst.options.showOn == 'both') {
192
+ // pop-up keypad when in the marked field
193
+ target.bind('focus.' + this.propertyName, this._showPlugin).
194
+ bind('keydown.' + this.propertyName, this._doKeyDown);
189
195
  }
190
- if (showOn == 'button' || showOn == 'both') { // pop-up keypad when button clicked
191
- var buttonText = this._get(inst, 'buttonText');
192
- var buttonStatus = this._get(inst, 'buttonStatus');
193
- var buttonImage = this._get(inst, 'buttonImage');
194
- var trigger = $(this._get(inst, 'buttonImageOnly') ?
196
+ if (inst.options.showOn == 'button' || inst.options.showOn == 'both') {
197
+ // pop-up keypad when button clicked
198
+ var buttonStatus = inst.options.buttonStatus;
199
+ var buttonImage = inst.options.buttonImage;
200
+ var trigger = $(inst.options.buttonImageOnly ?
195
201
  $('<img src="' + buttonImage + '" alt="' +
196
202
  buttonStatus + '" title="' + buttonStatus + '"/>') :
197
203
  $('<button type="button" title="' + buttonStatus + '"></button>').
198
- html(buttonImage == '' ? buttonText :
204
+ html(buttonImage == '' ? inst.options.buttonText :
199
205
  $('<img src="' + buttonImage + '" alt="' +
200
206
  buttonStatus + '" title="' + buttonStatus + '"/>')));
201
- field[isRTL ? 'before' : 'after'](trigger);
207
+ target[inst.options.isRTL ? 'before' : 'after'](trigger);
202
208
  trigger.addClass(this._triggerClass).click(function() {
203
- if ($.keypad._keypadShowing && $.keypad._lastField == target) {
204
- $.keypad._hideKeypad();
209
+ if (plugin._keypadShowing && plugin._lastField == target[0]) {
210
+ plugin._hidePlugin();
205
211
  }
206
212
  else {
207
- $.keypad._showKeypad(target);
213
+ plugin._showPlugin(target[0]);
208
214
  }
209
215
  return false;
210
216
  });
211
217
  }
212
218
  }
213
- inst.saveReadonly = field.attr('readonly');
214
- field.addClass(this.markerClassName)
215
- [this._get(inst, 'keypadOnly') ? 'attr' : 'removeAttr']('readonly', true).
216
- bind('setData.keypad', function(event, key, value) {
217
- inst.settings[key] = value;
218
- }).bind('getData.keypad', function(event, key) {
219
- return this._get(inst, key);
219
+ inst.saveReadonly = target.attr('readonly');
220
+ target.addClass(this.markerClassName).
221
+ data(this.propertyName, inst)
222
+ [inst.options.keypadOnly ? 'attr' : 'removeAttr']('readonly', true).
223
+ bind('setData.' + this.propertyName, function(event, key, value) {
224
+ inst.options[key] = value;
225
+ }).bind('getData.' + this.propertyName, function(event, key) {
226
+ return inst.options[key];
220
227
  });
221
- $.data(target, PROP_NAME, inst);
228
+ },
229
+
230
+ /* Retrieve or reconfigure the settings for a control.
231
+ @param target (element) the control to affect
232
+ @param options (object) the new options for this instance or
233
+ (string) an individual property name
234
+ @param value (any) the individual property value (omit if options
235
+ is an object or to retrieve the value of a setting)
236
+ @return (any) if retrieving a value */
237
+ _optionPlugin: function(target, options, value) {
238
+ target = $(target);
239
+ var inst = target.data(this.propertyName);
240
+ if (!options || (typeof options == 'string' && value == null)) { // Get option
241
+ var name = options;
242
+ options = (inst || {}).options;
243
+ return (options && name ? options[name] : options);
244
+ }
245
+
246
+ if (!target.hasClass(this.markerClassName)) {
247
+ return;
248
+ }
249
+ options = options || {};
250
+ if (typeof options == 'string') {
251
+ var name = options;
252
+ options = {};
253
+ options[name] = value;
254
+ }
255
+ if (this._curInst == inst) {
256
+ this._hidePlugin();
257
+ }
258
+ $.extend(inst.options, options);
259
+ this._setInput(target, inst);
260
+ this._updateKeypad(inst);
222
261
  },
223
262
 
224
263
  /* Detach keypad from its control.
225
264
  @param target (element) the target text field */
226
- _destroyKeypad: function(target) {
227
- var $target = $(target);
228
- if (!$target.hasClass(this.markerClassName)) {
265
+ _destroyPlugin: function(target) {
266
+ target = $(target);
267
+ if (!target.hasClass(this.markerClassName)) {
229
268
  return;
230
269
  }
231
- var inst = $.data(target, PROP_NAME);
270
+ var inst = target.data(this.propertyName);
232
271
  if (this._curInst == inst) {
233
- this._hideKeypad();
272
+ this._hidePlugin();
234
273
  }
235
- $target.siblings('.' + this._appendClass).remove().end().
274
+ target.siblings('.' + this._appendClass).remove().end().
236
275
  siblings('.' + this._triggerClass).remove().end().
237
276
  prev('.' + this._inlineEntryClass).remove();
238
- $target.empty().unbind('focus', this._showKeypad).
239
- removeClass(this.markerClassName)
277
+ target.removeClass(this.markerClassName).empty().
278
+ unbind('.' + this.propertyName).
279
+ removeData(this.propertyName)
240
280
  [inst.saveReadonly ? 'attr' : 'removeAttr']('readonly', true);
241
- $.removeData(inst._input[0], PROP_NAME);
242
- $.removeData(target, PROP_NAME);
281
+ inst._input.removeData(this.propertyName);
243
282
  },
244
283
 
245
284
  /* Enable the keypad for a jQuery selection.
246
285
  @param target (element) the target text field */
247
- _enableKeypad: function(target) {
248
- var control = $(target);
249
- if (!control.hasClass(this.markerClassName)) {
286
+ _enablePlugin: function(target) {
287
+ target = $(target);
288
+ if (!target.hasClass(this.markerClassName)) {
250
289
  return;
251
290
  }
252
- var nodeName = target.nodeName.toLowerCase();
253
- if (nodeName == 'input' || nodeName == 'textarea') {
254
- target.disabled = false;
255
- control.siblings('button.' + this._triggerClass).
291
+ var nodeName = target[0].nodeName.toLowerCase();
292
+ if (nodeName.match(/input|textarea/)) {
293
+ target[0].disabled = false;
294
+ target.siblings('button.' + this._triggerClass).
256
295
  each(function() { this.disabled = false; }).end().
257
296
  siblings('img.' + this._triggerClass).
258
297
  css({opacity: '1.0', cursor: ''});
259
298
  }
260
- else if (nodeName == 'div' || nodeName == 'span') {
261
- control.children('.' + this._disableClass).remove();
262
- var inst = $.data(target, PROP_NAME);
263
- inst._mainDiv.find('button').attr('disabled', '');
299
+ else if (nodeName.match(/div|span/)) {
300
+ target.children('.' + this._disableClass).remove();
301
+ var inst = target.data(this.propertyName);
302
+ inst._mainDiv.find('button').removeAttr('disabled');
264
303
  }
265
304
  this._disabledFields = $.map(this._disabledFields,
266
- function(value) { return (value == target ? null : value); }); // delete entry
305
+ function(value) { return (value == target[0] ? null : value); }); // delete entry
267
306
  },
268
307
 
269
308
  /* Disable the keypad for a jQuery selection.
270
309
  @param target (element) the target text field */
271
- _disableKeypad: function(target) {
272
- var control = $(target);
273
- if (!control.hasClass(this.markerClassName)) {
310
+ _disablePlugin: function(target) {
311
+ target = $(target);
312
+ if (!target.hasClass(this.markerClassName)) {
274
313
  return;
275
314
  }
276
- var nodeName = target.nodeName.toLowerCase();
277
- if (nodeName == 'input' || nodeName == 'textarea') {
278
- target.disabled = true;
279
- control.siblings('button.' + this._triggerClass).
280
- each(function() { this.disabled = true; }).end().
281
- siblings('img.' + this._triggerClass).
282
- css({opacity: '0.5', cursor: 'default'});
315
+ var nodeName = target[0].nodeName.toLowerCase();
316
+ if (nodeName.match(/input|textarea/)) {
317
+ target[0].disabled = true;
318
+ target.siblings('button.' + this._triggerClass).
319
+ each(function() { this.disabled = true; }).end().
320
+ siblings('img.' + this._triggerClass).
321
+ css({opacity: '0.5', cursor: 'default'});
283
322
  }
284
- else if (nodeName == 'div' || nodeName == 'span') {
285
- var inline = control.children('.' + this._inlineClass);
323
+ else if (nodeName.match(/div|span/)) {
324
+ var inline = target.children('.' + this._inlineClass);
286
325
  var offset = inline.offset();
287
326
  var relOffset = {left: 0, top: 0};
288
327
  inline.parents().each(function() {
@@ -291,91 +330,69 @@ $.extend(Keypad.prototype, {
291
330
  return false;
292
331
  }
293
332
  });
294
- control.prepend('<div class="' + this._disableClass + '" style="width: ' +
333
+ target.prepend('<div class="' + this._disableClass + '" style="width: ' +
295
334
  inline.outerWidth() + 'px; height: ' + inline.outerHeight() +
296
335
  'px; left: ' + (offset.left - relOffset.left) +
297
336
  'px; top: ' + (offset.top - relOffset.top) + 'px;"></div>');
298
- var inst = $.data(target, PROP_NAME);
337
+ var inst = target.data(this.propertyName);
299
338
  inst._mainDiv.find('button').attr('disabled', 'disabled');
300
339
  }
301
340
  this._disabledFields = $.map(this._disabledFields,
302
- function(value) { return (value == target ? null : value); }); // delete entry
303
- this._disabledFields[this._disabledFields.length] = target;
341
+ function(value) { return (value == target[0] ? null : value); }); // delete entry
342
+ this._disabledFields[this._disabledFields.length] = target[0];
304
343
  },
305
344
 
306
345
  /* Is the text field disabled as a keypad?
307
346
  @param target (element) the target text field
308
347
  @return (boolean) true if disabled, false if enabled */
309
- _isDisabledKeypad: function(target) {
348
+ _isDisabledPlugin: function(target) {
310
349
  return (target && $.inArray(target, this._disabledFields) > -1);
311
350
  },
312
351
 
313
- /* Update the settings for keypad attached to a text field
314
- @param target (element) the target text field
315
- @param name (object) the new settings to update or
316
- (string) the name of the setting to change
317
- @param value (any) the new value for the setting (omit if above is an object) */
318
- _changeKeypad: function(target, name, value) {
319
- var settings = name || {};
320
- if (typeof name == 'string') {
321
- settings = {};
322
- settings[name] = value;
323
- }
324
- var inst = $.data(target, PROP_NAME);
325
- if (inst) {
326
- if (this._curInst == inst) {
327
- this._hideKeypad();
328
- }
329
- extendRemove(inst.settings, settings);
330
- this._setInput($(target), inst);
331
- this._updateKeypad(inst);
332
- }
333
- },
334
-
335
352
  /* Pop-up the keypad for a given text field.
336
353
  @param field (element) the text field attached to the keypad or
337
354
  (event) if triggered by focus */
338
- _showKeypad: function(field) {
355
+ _showPlugin: function(field) {
339
356
  field = field.target || field;
340
- if ($.keypad._isDisabledKeypad(field) ||
341
- $.keypad._lastField == field) { // already here
357
+ if (plugin._isDisabledPlugin(field) ||
358
+ plugin._lastField == field) { // already here
342
359
  return;
343
360
  }
344
- var inst = $.data(field, PROP_NAME);
345
- $.keypad._hideKeypad(null, '');
346
- $.keypad._lastField = field;
347
- $.keypad._pos = $.keypad._findPos(field);
348
- $.keypad._pos[1] += field.offsetHeight; // add the height
361
+ var inst = $.data(field, plugin.propertyName);
362
+ plugin._hidePlugin(null, '');
363
+ plugin._lastField = field;
364
+ plugin._pos = plugin._findPos(field);
365
+ plugin._pos[1] += field.offsetHeight; // add the height
349
366
  var isFixed = false;
350
367
  $(field).parents().each(function() {
351
368
  isFixed |= $(this).css('position') == 'fixed';
352
369
  return !isFixed;
353
370
  });
354
371
  if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
355
- $.keypad._pos[0] -= document.documentElement.scrollLeft;
356
- $.keypad._pos[1] -= document.documentElement.scrollTop;
372
+ plugin._pos[0] -= document.documentElement.scrollLeft;
373
+ plugin._pos[1] -= document.documentElement.scrollTop;
357
374
  }
358
- var offset = {left: $.keypad._pos[0], top: $.keypad._pos[1]};
359
- $.keypad._pos = null;
375
+ var offset = {left: plugin._pos[0], top: plugin._pos[1]};
376
+ plugin._pos = null;
360
377
  // determine sizing offscreen
361
378
  inst._mainDiv.css({position: 'absolute', display: 'block', top: '-1000px',
362
379
  width: ($.browser.opera ? '1000px' : 'auto')});
363
- $.keypad._updateKeypad(inst);
380
+ plugin._updateKeypad(inst);
364
381
  // and adjust position before showing
365
- offset = $.keypad._checkOffset(inst, offset, isFixed);
382
+ offset = plugin._checkOffset(inst, offset, isFixed);
366
383
  inst._mainDiv.css({position: (isFixed ? 'fixed' : 'absolute'), display: 'none',
367
384
  left: offset.left + 'px', top: offset.top + 'px'});
368
- var showAnim = $.keypad._get(inst, 'showAnim');
369
- var duration = $.keypad._get(inst, 'duration');
385
+ var duration = inst.options.duration;
370
386
  duration = (duration == 'normal' && $.ui && $.ui.version >= '1.8' ? '_default' : duration);
387
+ var showAnim = inst.options.showAnim;
371
388
  var postProcess = function() {
372
- $.keypad._keypadShowing = true;
373
- var borders = $.keypad._getBorders(inst._mainDiv);
374
- inst._mainDiv.find('iframe.' + $.keypad._coverClass). // IE6- only
389
+ plugin._keypadShowing = true;
390
+ var borders = plugin._getBorders(inst._mainDiv);
391
+ inst._mainDiv.find('iframe.' + plugin._coverClass). // IE6- only
375
392
  css({left: -borders[0], top: -borders[1],
376
393
  width: inst._mainDiv.outerWidth(), height: inst._mainDiv.outerHeight()});
377
394
  };
378
- if ($.effects && $.effects[showAnim]) {
395
+ if ($.effects && ($.effects[showAnim] || ($.effects.effect && $.effects.effect[showAnim]))) {
379
396
  var data = inst._mainDiv.data(); // Update old effects data
380
397
  for (var key in data) {
381
398
  if (key.match(/^ec\.storage\./)) {
@@ -383,7 +400,7 @@ $.extend(Keypad.prototype, {
383
400
  }
384
401
  }
385
402
  inst._mainDiv.data(data).show(showAnim,
386
- $.keypad._get(inst, 'showOptions'), duration, postProcess);
403
+ inst.options.showOptions, duration, postProcess);
387
404
  }
388
405
  else {
389
406
  inst._mainDiv[showAnim || 'show']((showAnim ? duration : ''), postProcess);
@@ -394,7 +411,7 @@ $.extend(Keypad.prototype, {
394
411
  if (inst._input[0].type != 'hidden') {
395
412
  inst._input[0].focus();
396
413
  }
397
- $.keypad._curInst = inst;
414
+ plugin._curInst = inst;
398
415
  },
399
416
 
400
417
  /* Generate the keypad content.
@@ -405,13 +422,12 @@ $.extend(Keypad.prototype, {
405
422
  find('iframe.' + this._coverClass). // IE6- only
406
423
  css({left: -borders[0], top: -borders[1],
407
424
  width: inst._mainDiv.outerWidth(), height: inst._mainDiv.outerHeight()});
408
- inst._mainDiv.removeClass().addClass(this._get(inst, 'keypadClass') +
409
- (this._get(inst, 'useThemeRoller') ? ' ui-widget ui-widget-content' : '') +
410
- (this._get(inst, 'isRTL') ? ' keypad-rtl' : '') + ' ' +
425
+ inst._mainDiv.removeClass().addClass(inst.options.keypadClass +
426
+ (inst.options.useThemeRoller ? ' ui-widget ui-widget-content' : '') +
427
+ (inst.options.isRTL ? ' ' + this._rtlClass : '') + ' ' +
411
428
  (inst._inline ? this._inlineClass : this._mainDivClass));
412
- var beforeShow = this._get(inst, 'beforeShow');
413
- if (beforeShow) {
414
- beforeShow.apply((inst._input ? inst._input[0] : null),
429
+ if ($.isFunction(inst.options.beforeShow)) {
430
+ inst.options.beforeShow.apply((inst._input ? inst._input[0] : null),
415
431
  [inst._mainDiv, inst]);
416
432
  }
417
433
  },
@@ -449,7 +465,7 @@ $.extend(Keypad.prototype, {
449
465
  inst._mainDiv.css('width', width);
450
466
  }
451
467
  // reposition keypad panel horizontally if outside the browser window
452
- if (this._get(inst, 'isRTL') ||
468
+ if (inst.options.isRTL ||
453
469
  (offset.left + inst._mainDiv.outerWidth() - scrollX) > browserWidth) {
454
470
  offset.left = Math.max((isFixed ? 0 : scrollX),
455
471
  pos[0] + (inst._input ? inst._input.outerWidth() : 0) -
@@ -485,36 +501,34 @@ $.extend(Keypad.prototype, {
485
501
  /* Hide the keypad from view.
486
502
  @param field (element) the text field attached to the keypad
487
503
  @param duration (string) the duration over which to close the keypad */
488
- _hideKeypad: function(field, duration) {
504
+ _hidePlugin: function(field, duration) {
489
505
  var inst = this._curInst;
490
- if (!inst || (field && inst != $.data(field, PROP_NAME))) {
506
+ if (!inst || (field && inst != $.data(field, this.propertyName))) {
491
507
  return;
492
508
  }
493
509
  if (this._keypadShowing) {
494
- duration = (duration != null ? duration : this._get(inst, 'duration'));
510
+ duration = (duration != null ? duration : inst.options.duration);
495
511
  duration = (duration == 'normal' && $.ui && $.ui.version >= '1.8' ? '_default' : duration);
496
- var showAnim = this._get(inst, 'showAnim');
497
- if ($.effects && $.effects[showAnim]) {
498
- inst._mainDiv.hide(showAnim, this._get(inst, 'showOptions'), duration);
512
+ var showAnim = inst.options.showAnim;
513
+ if ($.effects && ($.effects[showAnim] || ($.effects.effect && $.effects.effect[showAnim]))) {
514
+ inst._mainDiv.hide(showAnim, inst.options.showOptions, duration);
499
515
  }
500
516
  else {
501
517
  inst._mainDiv[(showAnim == 'slideDown' ? 'slideUp' :
502
518
  (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))](showAnim ? duration : '');
503
519
  }
504
520
  }
505
- var onClose = this._get(inst, 'onClose');
506
- if (onClose) {
507
- onClose.apply((inst._input ? inst._input[0] : null), // trigger custom callback
521
+ if ($.isFunction(inst.options.onClose)) {
522
+ inst.options.onClose.apply((inst._input ? inst._input[0] : null), // trigger custom callback
508
523
  [inst._input.val(), inst]);
509
524
  }
510
525
  if (this._keypadShowing) {
511
526
  this._keypadShowing = false;
512
527
  this._lastField = null;
513
528
  }
514
- // JJL commented out as interferes with our CSS
515
- // if (inst._inline) {
516
- // inst._input.val('');
517
- // }
529
+ if (inst._inline) {
530
+ inst._input.val('');
531
+ }
518
532
  this._curInst = null;
519
533
  },
520
534
 
@@ -522,23 +536,23 @@ $.extend(Keypad.prototype, {
522
536
  @param e (event) the key event */
523
537
  _doKeyDown: function(e) {
524
538
  if (e.keyCode == 9) { // Tab out
525
- $.keypad.mainDiv.stop(true, true);
526
- $.keypad._hideKeypad();
539
+ plugin.mainDiv.stop(true, true);
540
+ plugin._hidePlugin();
527
541
  }
528
542
  },
529
543
 
530
544
  /* Close keypad if clicked elsewhere.
531
545
  @param event (event) the mouseclick details */
532
546
  _checkExternalClick: function(event) {
533
- if (!$.keypad._curInst) {
547
+ if (!plugin._curInst) {
534
548
  return;
535
549
  }
536
550
  var target = $(event.target);
537
- if (!target.parents().andSelf().is('.' + $.keypad._mainDivClass) &&
538
- !target.hasClass($.keypad.markerClassName) &&
539
- !target.parents().andSelf().hasClass($.keypad._triggerClass) &&
540
- $.keypad._keypadShowing) {
541
- $.keypad._hideKeypad();
551
+ if (!target.parents().andSelf().hasClass(plugin._mainDivClass) &&
552
+ !target.hasClass(plugin.markerClassName) &&
553
+ !target.parents().andSelf().hasClass(plugin._triggerClass) &&
554
+ plugin._keypadShowing) {
555
+ plugin._hidePlugin();
542
556
  }
543
557
  },
544
558
 
@@ -554,7 +568,7 @@ $.extend(Keypad.prototype, {
554
568
  @param inst (object) the instance settings */
555
569
  _clearValue: function(inst) {
556
570
  this._setValue(inst, '', 0);
557
- this._notifyKeypress(inst, $.keypad.DEL);
571
+ this._notifyKeypress(inst, plugin.DEL);
558
572
  },
559
573
 
560
574
  /* Erase the last character.
@@ -573,7 +587,7 @@ $.extend(Keypad.prototype, {
573
587
  }
574
588
  this._setValue(inst, (value.length == 0 ? '' :
575
589
  value.substr(0, range[0] - 1) + value.substr(range[1])), range[0] - 1);
576
- this._notifyKeypress(inst, $.keypad.BS);
590
+ this._notifyKeypress(inst, plugin.BS);
577
591
  },
578
592
 
579
593
  /* Update the text field with the selected value.
@@ -678,58 +692,46 @@ $.extend(Keypad.prototype, {
678
692
  value = value.substr(0, maxlen);
679
693
  }
680
694
  inst._input.val(value);
681
- if (!this._get(inst, 'onKeypress')) {
695
+ if (!$.isFunction(inst.options.onKeypress)) {
682
696
  inst._input.trigger('change'); // fire the change event
683
697
  }
684
698
  },
685
699
 
686
700
  _notifyKeypress: function(inst, key) {
687
- var onKeypress = this._get(inst, 'onKeypress');
688
- if (onKeypress) { // trigger custom callback
689
- onKeypress.apply((inst._input ? inst._input[0] : null),
701
+ if ($.isFunction(inst.options.onKeypress)) { // trigger custom callback
702
+ inst.options.onKeypress.apply((inst._input ? inst._input[0] : null),
690
703
  [key, inst._input.val(), inst]);
691
704
  }
692
705
  },
693
706
 
694
- /* Get a setting value, defaulting if necessary.
695
- @param inst (object) the instance settings
696
- @param name (string) the name of the setting
697
- @return (any) the value of the setting, or its default if not set explicitly */
698
- _get: function(inst, name) {
699
- return inst.settings[name] !== undefined ?
700
- inst.settings[name] : this._defaults[name];
701
- },
702
-
703
707
  /* Generate the HTML for the current state of the keypad.
704
708
  @param inst (object) the instance settings
705
709
  @return (jQuery) the HTML for this keypad */
706
710
  _generateHTML: function(inst) {
707
- var useTR = this._get(inst, 'useThemeRoller');
708
- var isRTL = this._get(inst, 'isRTL');
709
- var prompt = this._get(inst, 'prompt');
710
- var separator = this._get(inst, 'separator');
711
- var html = (!prompt ? '' : '<div class="keypad-prompt' +
712
- (useTR ? ' ui-widget-header ui-corner-all' : '') + '">' + prompt + '</div>');
711
+ var html = (!inst.options.prompt ? '' : '<div class="' + this._promptClass +
712
+ (inst.options.useThemeRoller ? ' ui-widget-header ui-corner-all' : '') + '">' +
713
+ inst.options.prompt + '</div>');
713
714
  var layout = this._randomiseLayout(inst);
714
715
  for (var i = 0; i < layout.length; i++) {
715
- html += '<div class="keypad-row">';
716
- var keys = layout[i].split(separator);
716
+ html += '<div class="' + this._rowClass + '">';
717
+ var keys = layout[i].split(inst.options.separator);
717
718
  for (var j = 0; j < keys.length; j++) {
718
719
  if (inst.ucase) {
719
- keys[j] = keys[j].toUpperCase();
720
+ keys[j] = inst.options.toUpper(keys[j]);
720
721
  }
721
722
  var keyDef = this._specialKeys[keys[j].charCodeAt(0)];
722
723
  if (keyDef) {
723
- html += (keyDef.action ? '<button type="button" class="keypad-special keypad-' +
724
- keyDef.name + (useTR ? ' ui-corner-all ui-state-default' +
724
+ html += (keyDef.action ? '<button type="button" class="' + this._specialClass +
725
+ ' ' + this._namePrefixClass + keyDef.name +
726
+ (inst.options.useThemeRoller ? ' ui-corner-all ui-state-default' +
725
727
  (keyDef.noHighlight ? '' : ' ui-state-highlight') : '') +
726
- '" title="' + this._get(inst, keyDef.name + 'Status') + '">' +
727
- (this._get(inst, keyDef.name + 'Text') || '&nbsp;') + '</button>' :
728
- '<div class="keypad-' + keyDef.name + '"></div>');
728
+ '" title="' + inst.options[keyDef.name + 'Status'] + '">' +
729
+ (inst.options[keyDef.name + 'Text'] || '&nbsp;') + '</button>' :
730
+ '<div class="' + this._namePrefixClass + keyDef.name + '"></div>');
729
731
  }
730
732
  else {
731
- html += '<button type="button" ' +
732
- 'class="keypad-key' + (useTR ? ' ui-corner-all ui-state-default' : '') + '">' +
733
+ html += '<button type="button" class="' + this._keyClass +
734
+ (inst.options.useThemeRoller ? ' ui-corner-all ui-state-default' : '') + '">' +
733
735
  (keys[j] == ' ' ? '&nbsp;' : keys[j]) + '</button>';
734
736
  }
735
737
  }
@@ -737,16 +739,16 @@ $.extend(Keypad.prototype, {
737
739
  }
738
740
  html += '<div style="clear: both;"></div>' +
739
741
  (!inst._inline && $.browser.msie && parseInt($.browser.version, 10) < 7 ?
740
- '<iframe src="javascript:false;" class="' + $.keypad._coverClass + '"></iframe>' : '');
742
+ '<iframe src="javascript:false;" class="' + plugin._coverClass + '"></iframe>' : '');
741
743
  html = $(html);
742
744
  var thisInst = inst;
743
- var activeClasses = 'keypad-key-down' + (useTR ? ' ui-state-active' : '');
745
+ var activeClasses = this._keyDownClass + (inst.options.useThemeRoller ? ' ui-state-active' : '');
744
746
  html.find('button').mousedown(function() { $(this).addClass(activeClasses); }).
745
747
  mouseup(function() { $(this).removeClass(activeClasses); }).
746
748
  mouseout(function() { $(this).removeClass(activeClasses); }).
747
- filter('.keypad-key').click(function() { $.keypad._selectValue(thisInst, $(this).text()); });
749
+ filter('.' + this._keyClass).click(function() { plugin._selectValue(thisInst, $(this).text()); });
748
750
  $.each(this._specialKeys, function(i, keyDef) {
749
- html.find('.keypad-' + keyDef.name).click(function() {
751
+ html.find('.' + plugin._namePrefixClass + keyDef.name).click(function() {
750
752
  keyDef.action.apply(thisInst._input, [thisInst]);
751
753
  });
752
754
  });
@@ -758,36 +760,29 @@ $.extend(Keypad.prototype, {
758
760
  @param inst (object) the instance settings
759
761
  @return (string[]) the layout with any requested randomisations applied */
760
762
  _randomiseLayout: function(inst) {
761
- var randomiseNumeric = this._get(inst, 'randomiseNumeric');
762
- var randomiseAlpha = this._get(inst, 'randomiseAlphabetic');
763
- var randomiseOther = this._get(inst, 'randomiseOther');
764
- var randomiseAll = this._get(inst, 'randomiseAll');
765
- var layout = this._get(inst, 'layout');
766
- if (!randomiseNumeric && !randomiseAlpha && !randomiseOther && !randomiseAll) {
767
- return layout;
768
- }
769
- var isNumeric = this._get(inst, 'isNumeric');
770
- var isAlphabetic = this._get(inst, 'isAlphabetic');
771
- var separator = this._get(inst, 'separator');
763
+ if (!inst.options.randomiseNumeric && !inst.options.randomiseAlphabetic &&
764
+ !inst.options.randomiseOther && !inst.options.randomiseAll) {
765
+ return inst.options.layout;
766
+ }
772
767
  var numerics = [];
773
768
  var alphas = [];
774
769
  var others = [];
775
770
  var newLayout = [];
776
771
  // Find characters of different types
777
- for (var i = 0; i < layout.length; i++) {
772
+ for (var i = 0; i < inst.options.layout.length; i++) {
778
773
  newLayout[i] = '';
779
- var keys = layout[i].split(separator);
774
+ var keys = inst.options.layout[i].split(inst.options.separator);
780
775
  for (var j = 0; j < keys.length; j++) {
781
776
  if (this._isControl(keys[j])) {
782
777
  continue;
783
778
  }
784
- if (randomiseAll) {
779
+ if (inst.options.randomiseAll) {
785
780
  others.push(keys[j]);
786
781
  }
787
- else if (isNumeric(keys[j])) {
782
+ else if (inst.options.isNumeric(keys[j])) {
788
783
  numerics.push(keys[j]);
789
784
  }
790
- else if (isAlphabetic(keys[j])) {
785
+ else if (inst.options.isAlphabetic(keys[j])) {
791
786
  alphas.push(keys[j]);
792
787
  }
793
788
  else {
@@ -796,27 +791,27 @@ $.extend(Keypad.prototype, {
796
791
  }
797
792
  }
798
793
  // Shuffle them
799
- if (randomiseNumeric) {
794
+ if (inst.options.randomiseNumeric) {
800
795
  this._shuffle(numerics);
801
796
  }
802
- if (randomiseAlpha) {
797
+ if (inst.options.randomiseAlphabetic) {
803
798
  this._shuffle(alphas);
804
799
  }
805
- if (randomiseOther || randomiseAll) {
800
+ if (inst.options.randomiseOther || inst.options.randomiseAll) {
806
801
  this._shuffle(others);
807
802
  }
808
803
  var n = 0;
809
804
  var a = 0;
810
805
  var o = 0;
811
806
  // And replace them in the layout
812
- for (var i = 0; i < layout.length; i++) {
813
- var keys = layout[i].split(separator);
807
+ for (var i = 0; i < inst.options.layout.length; i++) {
808
+ var keys = inst.options.layout[i].split(inst.options.separator);
814
809
  for (var j = 0; j < keys.length; j++) {
815
810
  newLayout[i] += (this._isControl(keys[j]) ? keys[j] :
816
- (randomiseAll ? others[o++] :
817
- (isNumeric(keys[j]) ? numerics[n++] :
818
- (isAlphabetic(keys[j]) ? alphas[a++] :
819
- others[o++])))) + separator;
811
+ (inst.options.randomiseAll ? others[o++] :
812
+ (inst.options.isNumeric(keys[j]) ? numerics[n++] :
813
+ (inst.options.isAlphabetic(keys[j]) ? alphas[a++] :
814
+ others[o++])))) + inst.options.separator;
820
815
  }
821
816
  }
822
817
  return newLayout;
@@ -843,6 +838,12 @@ $.extend(Keypad.prototype, {
843
838
  return (ch >= '0' && ch <= '9');
844
839
  },
845
840
 
841
+ /* Convert a character to upper case.
842
+ @param ch (char) the character to convert
843
+ @return (char) its uppercase version */
844
+ toUpper: function(ch) {
845
+ return ch.toUpperCase();
846
+ },
846
847
  /* Randomise the contents of an array.
847
848
  @param values (string[]) the array to rearrange */
848
849
  _shuffle: function(values) {
@@ -855,44 +856,51 @@ $.extend(Keypad.prototype, {
855
856
  }
856
857
  });
857
858
 
858
- /* jQuery extend now ignores nulls!
859
- @param target (object) the object to extend
860
- @param props (object) the new settings
861
- @return (object) the updated target */
862
- function extendRemove(target, props) {
863
- $.extend(target, props);
864
- for (var name in props) {
865
- if (props[name] == null || props[name] == undefined) {
866
- target[name] = props[name];
867
- }
859
+ // The list of commands that return values and don't permit chaining
860
+ var getters = ['isDisabled'];
861
+
862
+ /* Determine whether a command is a getter and doesn't permit chaining.
863
+ @param command (string, optional) the command to run
864
+ @param otherArgs ([], optional) any other arguments for the command
865
+ @return true if the command is a getter, false if not */
866
+ function isNotChained(command, otherArgs) {
867
+ if (command == 'option' && (otherArgs.length == 0 ||
868
+ (otherArgs.length == 1 && typeof otherArgs[0] == 'string'))) {
869
+ return true;
868
870
  }
869
- return target;
870
- };
871
+ return $.inArray(command, getters) > -1;
872
+ }
871
873
 
872
874
  /* Invoke the keypad functionality.
873
- @param options (string) a command, optionally followed by additional parameters or
874
- (object) settings for attaching new keypad functionality
875
- @return (object) the jQuery object */
875
+ @param options (object) the new settings to use for these instances (optional) or
876
+ (string) the command to run (optional)
877
+ @return (jQuery) for chaining further calls or
878
+ (any) getter value */
876
879
  $.fn.keypad = function(options) {
877
880
  var otherArgs = Array.prototype.slice.call(arguments, 1);
878
- if (options == 'isDisabled') {
879
- return $.keypad['_' + options + 'Keypad'].
880
- apply($.keypad, [this[0]].concat(otherArgs));
881
+ if (isNotChained(options, otherArgs)) {
882
+ return plugin['_' + options + 'Plugin'].apply(plugin, [this[0]].concat(otherArgs));
881
883
  }
882
884
  return this.each(function() {
883
- typeof options == 'string' ?
884
- $.keypad['_' + options + 'Keypad'].
885
- apply($.keypad, [this].concat(otherArgs)) :
886
- $.keypad._attachKeypad(this, options);
885
+ if (typeof options == 'string') {
886
+ if (!plugin['_' + options + 'Plugin']) {
887
+ throw 'Unknown command: ' + options;
888
+ }
889
+ plugin['_' + options + 'Plugin'].apply(plugin, [this].concat(otherArgs));
890
+ }
891
+ else {
892
+ plugin._attachPlugin(this, options || {});
893
+ }
887
894
  });
888
895
  };
889
896
 
890
- $.keypad = new Keypad(); // singleton instance
897
+ /* Initialise the keypad functionality. */
898
+ var plugin = $.keypad = new Keypad(); // Singleton instance
891
899
 
892
900
  // Add the keypad division and external click check
893
901
  $(function() {
894
- $(document.body).append($.keypad.mainDiv).
895
- mousedown($.keypad._checkExternalClick);
902
+ $(document.body).append(plugin.mainDiv).
903
+ mousedown(plugin._checkExternalClick);
896
904
  });
897
905
 
898
906
  })(jQuery);