oidc-lib
Version:
A library for creating OIDC Service Providers
269 lines (204 loc) • 7.48 kB
JavaScript
/* ==========================================================
* bootstrap-formhelpers-phone.js
* https://github.com/vlamanna/BootstrapFormHelpers
* ==========================================================
* Copyright 2012 Vincent Lamanna
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
+function ($) {
'use strict';
/* PHONE CLASS DEFINITION
* ====================== */
var BFHPhone = function (element, options) {
this.options = $.extend({}, $.fn.bfhphone.defaults, options);
this.$element = $(element);
if (this.$element.is('input[type="text"]') || this.$element.is('input[type="tel"]')) {
this.addFormatter();
}
if (this.$element.is('span')) {
this.displayFormatter();
}
};
BFHPhone.prototype = {
constructor: BFHPhone,
addFormatter: function() {
var $country;
if (this.options.country !== '') {
$country = $(document).find('#' + this.options.country);
if ($country.length !== 0) {
this.options.format = BFHPhoneFormatList[$country.val()];
$country.on('change', {phone: this}, this.changeCountry);
} else {
this.options.format = BFHPhoneFormatList[this.options.country];
}
}
this.$element.on('keyup.bfhphone.data-api', BFHPhone.prototype.change);
this.loadFormatter();
},
loadFormatter: function () {
var formattedNumber;
formattedNumber = formatNumber(this.options.format, this.$element.val());
this.$element.val(formattedNumber);
},
displayFormatter: function () {
var formattedNumber;
if (this.options.country !== '') {
this.options.format = BFHPhoneFormatList[this.options.country];
}
formattedNumber = formatNumber(this.options.format, this.options.number);
this.$element.html(formattedNumber);
},
changeCountry: function (e) {
var $this,
$phone;
$this = $(this);
$phone = e.data.phone;
$phone.$element.val(String($phone.$element.val()).replace(/\+\d*/g, ''));
$phone.options.format = BFHPhoneFormatList[$this.val()];
$phone.loadFormatter();
},
change: function(e) {
var $this,
cursorPosition,
cursorEnd,
formattedNumber;
$this = $(this).data('bfhphone');
if ($this.$element.is('.disabled') || $this.$element.attr('disabled') !== undefined) {
return true;
}
cursorPosition = getCursorPosition($this.$element[0]);
cursorEnd = false;
if (cursorPosition === $this.$element.val().length) {
cursorEnd = true;
}
if (e.which === 8 && $this.options.format.charAt($this.$element.val().length) !== 'd') {
$this.$element.val(String($this.$element.val()).substring(0, $this.$element.val().length - 1));
}
formattedNumber = formatNumber($this.options.format, $this.$element.val());
if (formattedNumber === $this.$element.val()) {
return true;
}
$this.$element.val(formattedNumber);
if (cursorEnd) {
cursorPosition = $this.$element.val().length;
}
setCursorPosition($this.$element[0], cursorPosition);
return true;
}
};
function formatNumber(format, number) {
var formattedNumber,
indexFormat,
indexNumber,
lastCharacter;
formattedNumber = '';
number = String(number).replace(/\D/g, '');
for (indexFormat = 0, indexNumber = 0; indexFormat < format.length; indexFormat = indexFormat + 1) {
if (/\d/g.test(format.charAt(indexFormat))) {
if (format.charAt(indexFormat) === number.charAt(indexNumber)) {
formattedNumber += number.charAt(indexNumber);
indexNumber = indexNumber + 1;
} else {
formattedNumber += format.charAt(indexFormat);
}
} else if (format.charAt(indexFormat) !== 'd') {
if (number.charAt(indexNumber) !== '' || format.charAt(indexFormat) === '+') {
formattedNumber += format.charAt(indexFormat);
}
} else {
if (number.charAt(indexNumber) === '') {
formattedNumber += '';
} else {
formattedNumber += number.charAt(indexNumber);
indexNumber = indexNumber + 1;
}
}
}
lastCharacter = format.charAt(formattedNumber.length);
if (lastCharacter !== 'd') {
formattedNumber += lastCharacter;
}
return formattedNumber;
}
function getCursorPosition($element) {
var position = 0,
selection;
if (document.selection) {
// IE Support
$element.focus();
selection = document.selection.createRange();
selection.moveStart ('character', -$element.value.length);
position = selection.text.length;
} else if ($element.selectionStart || $element.selectionStart === 0) {
position = $element.selectionStart;
}
return position;
}
function setCursorPosition($element, position) {
var selection;
if (document.selection) {
// IE Support
$element.focus ();
selection = document.selection.createRange();
selection.moveStart ('character', -$element.value.length);
selection.moveStart ('character', position);
selection.moveEnd ('character', 0);
selection.select ();
} else if ($element.selectionStart || $element.selectionStart === 0) {
$element.selectionStart = position;
$element.selectionEnd = position;
$element.focus ();
}
}
/* PHONE PLUGIN DEFINITION
* ======================= */
var old = $.fn.bfhphone;
$.fn.bfhphone = function (option) {
return this.each(function () {
var $this,
data,
options;
$this = $(this);
data = $this.data('bfhphone');
options = typeof option === 'object' && option;
if (!data) {
$this.data('bfhphone', (data = new BFHPhone(this, options)));
}
if (typeof option === 'string') {
data[option].call($this);
}
});
};
$.fn.bfhphone.Constructor = BFHPhone;
$.fn.bfhphone.defaults = {
format: '',
number: '',
country: ''
};
/* PHONE NO CONFLICT
* ========================== */
$.fn.bfhphone.noConflict = function () {
$.fn.bfhphone = old;
return this;
};
/* PHONE DATA-API
* ============== */
$(document).ready( function () {
$('form input[type="text"].bfh-phone, form input[type="tel"].bfh-phone, span.bfh-phone').each(function () {
var $phone;
$phone = $(this);
$phone.bfhphone($phone.data());
});
});
}(window.jQuery);