UNPKG

oidc-lib

Version:

A library for creating OIDC Service Providers

269 lines (204 loc) 7.48 kB
/* ========================================================== * 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);