/*
** Returns the caret (cursor) position of the specified text field.
** Return value range is 0-oField.value.length.
*/
function getCaretPosition (oField) {
// Initialize
var iCaretPos = 0;
// IE Support
if (document.selection) {
// Set focus on the element
oField.focus();
// To get cursor position, get empty selection range
var oSel = document.selection.createRange();
// Move selection start to 0 position
oSel.moveStart('character', -oField.value.length);
// The caret position is selection length
iCaretPos = oSel.text.length;
}
// Firefox support
else if (oField.selectionStart || oField.selectionStart == '0')
iCaretPos = oField.selectionStart;
// Return results
return iCaretPos;
}
/* Return the selected text in the document */
function getSelectionText() {
var text = "";
if (window.getSelection) {
text = window.getSelection().toString();
} else if (document.selection && document.selection.type != "Control") {
text = document.selection.createRange().text;
}
return text;
}
/* Enforce numeric input in apex number fields (which are strangely input="text" iso input="number")
NOTE: in this implementation we assume that decimal separators can be either '.' or ','. */
function makeFieldsNumericOnly(numberFields) {
numberFields.keydown(function (e) {
var oldVal = e.target.value;
var first = oldVal.substr(0, getCaretPosition(e.target));
var last = oldVal.substr(getCaretPosition(e.target));
var newVal = first + e.key + last;
if (e.key === ' ') { // Prevent space straight away
e.preventDefault();
} else {
if (getSelectionText() == oldVal) {
// The old value was selected, make the entered key the newVal
newVal = e.key;
}
if (
// Allow following input
((e.key === '+' || e.key === '-') && newVal.substr(1).indexOf(e.key) == -1) ||
(newVal.indexOf(e.key) === 0 && e.key === ',') ||
(newVal.indexOf(e.key) === 0 && e.key === 'Decimal') || // For '.' in IE...
(e.key === 'Backspace') ||
(e.key === 'Tab') ||
(e.key === 'Insert') ||
(e.key ==='Delete') ||
(e.key === 'ArrowLeft' || e.key === 'ArrowRight') ||
(e.key === 'Home' || e.key === 'End') ||
((e.keyCode === 65 || e.keyCode === 67 || e.keyCode === 86) && (e.ctrlKey === true || e.metaKey === true)) // Ctrl+A/C/V, Command+A/C/V
) {
return; // Let it happen
} else if (isNaN(newVal.replace(',', '.'))) {
// Not a number, block input
e.preventDefault();
} else if(newVal.indexOf(',') >= 0 && e.key != ',') { // Allow only 1 decimal
var decimals = newVal.substr(newVal.indexOf(',') + 1);
if (decimals.length > 1) {
e.preventDefault();
}
} else if(newVal.indexOf('.') >= 0 && e.key != '.') { // Allow only 1 decimal
var decimals = newVal.substr(newVal.indexOf('.') + 1);
if (decimals.length > 1) {
e.preventDefault();
}
}
}
});
}
Comments