/**
* Follow instructions here to compile this file:
* https://code.google.com/p/libphonenumber/source/browse/trunk/javascript/README
*
* (start by copying the contents of this file into
* libphonenumber/javascript/i18n/phonenumbers/demo.js)
*/
// includes
goog.require('i18n.phonenumbers.AsYouTypeFormatter');
goog.require('i18n.phonenumbers.PhoneNumberFormat');
goog.require('i18n.phonenumbers.PhoneNumberUtil');
function getExampleNumber(countryCode, national) {
try {
var phoneUtil = i18n.phonenumbers.PhoneNumberUtil.getInstance();
var numberObj = phoneUtil.getExampleNumber(countryCode);
var format = (national) ? i18n.phonenumbers.PhoneNumberFormat.NATIONAL : i18n.phonenumbers.PhoneNumberFormat.INTERNATIONAL;
return phoneUtil.format(numberObj, format);
} catch (e) {
return "";
}
}
function formatNumberE164(number, countryCode) {
try {
var phoneUtil = i18n.phonenumbers.PhoneNumberUtil.getInstance();
var numberObj = phoneUtil.parseAndKeepRawInput(number, countryCode);
return phoneUtil.format(numberObj, i18n.phonenumbers.PhoneNumberFormat.E164);
} catch (e) {
return "";
}
}
function isValidNumber(number, countryCode) {
try {
var phoneUtil = i18n.phonenumbers.PhoneNumberUtil.getInstance();
var numberObj = phoneUtil.parseAndKeepRawInput(number, countryCode);
return phoneUtil.isValidNumber(numberObj);
} catch (e) {
return false;
}
}
function formatNumber(val, countryCode, addSuffix) {
try {
var clean = val.replace(/\D/g, "");
if (val.substr(0, 1) == "+") {
clean = "+" + clean;
}
// NOTE: we use AsYouTypeFormatter because the default format function can't handle incomplete numbers e.g. "+17024" formats to "+1 7024" as opposed to "+1 702-4"
var formatter = new i18n.phonenumbers.AsYouTypeFormatter(countryCode);
// if clean is empty, we still need this to be a string otherwise we get errors later
var result = "",
next;
for (var i = 0; i < clean.length; i++) {
// TODO: improve this so don't just pump in every digit every time - we should just cache this formatter object, and just call inputDigit once each time the user enters a new digit
next = formatter.inputDigit(clean.charAt(i));
// if adding this char didn't change the length, or made it smaller: that means that formatting failed which means the number was no longer a potentially valid number, so stop!
if (result && next.length <= result.length) {
break;
}
result = next;
}
// for some reason libphonenumber formats "+44" to "+44 ", but doesn't do the same with "+1"
if (result.charAt(result.length - 1) == " ") {
result = result.substr(0, result.length - 1);
}
if (addSuffix) {
// hack to get formatting suffix
var test = formatter.inputDigit('5');
// again the "+44 " problem... (also affects "+45" apparently)
if (test.charAt(test.length - 1) == " ") {
test = test.substr(0, test.length - 1);
}
// if adding a '5' introduces a formatting char (i.e. it's length changes by >1)
if (test.length - result.length > 1) {
// update the result to the new value (minus that last '5' we just added)
result = test.substr(0, test.length - 1);
}
}
return result;
} catch (e) {
return val;
}
}
function getNumberType(number, countryCode) {
try {
var phoneUtil = i18n.phonenumbers.PhoneNumberUtil.getInstance();
var numberObj = phoneUtil.parseAndKeepRawInput(number, countryCode);
return phoneUtil.getNumberType(numberObj)
} catch (e) {
return -2;
}
}
// copied this from i18n.phonenumbers.PhoneNumberType in https://code.google.com/p/libphonenumber/source/browse/trunk/javascript/i18n/phonenumbers/phonenumberutil.js and put the keys in quotes to force closure compiler to preserve the keys
// TODO: there must be a way to just tell closure compiler to preserve the keys on i18n.phonenumbers.PhoneNumberType and just export that
var numberType = {
"FIXED_LINE": 0,
"MOBILE": 1,
// In some regions (e.g. the USA), it is impossible to distinguish between
// fixed-line and mobile numbers by looking at the phone number itself.
"FIXED_LINE_OR_MOBILE": 2,
// Freephone lines
"TOLL_FREE": 3,
"PREMIUM_RATE": 4,
// The cost of this call is shared between the caller and the recipient, and
// is hence typically less than PREMIUM_RATE calls. See
// http://en.wikipedia.org/wiki/Shared_Cost_Service for more information.
"SHARED_COST": 5,
// Voice over IP numbers. This includes TSoIP (Telephony Service over IP).
"VOIP": 6,
// A personal number is associated with a particular person, and may be routed
// to either a MOBILE or FIXED_LINE number. Some more information can be found
// here: http://en.wikipedia.org/wiki/Personal_Numbers
"PERSONAL_NUMBER": 7,
"PAGER": 8,
// Used for 'Universal Access Numbers' or 'Company Numbers'. They may be
// further routed to specific offices, but allow one number to be used for a
// company.
"UAN": 9,
// Used for 'Voice Mail Access Numbers'.
"VOICEMAIL": 10,
// A phone number is of type UNKNOWN when it does not fit any of the known
// patterns for a specific region.
"UNKNOWN": -1
};
// exports
goog.exportSymbol('intlTelInputUtils', {});
goog.exportSymbol('intlTelInputUtils.formatNumber', formatNumber);
goog.exportSymbol('intlTelInputUtils.formatNumberE164', formatNumberE164);
goog.exportSymbol('intlTelInputUtils.getExampleNumber', getExampleNumber);
goog.exportSymbol('intlTelInputUtils.getNumberType', getNumberType);
goog.exportSymbol('intlTelInputUtils.isValidNumber', isValidNumber);
goog.exportSymbol('intlTelInputUtils.numberType', numberType);