Модуль заявок

parent 21a0719f
......@@ -16,15 +16,16 @@ return [
'modules' => [
'languages' => ['class' => 'common\modules\languages\Module'],
'content' => ['class' => 'common\modules\content\Module'],
'bids' => ['class' => 'common\modules\bids\Module'],
'faq' => ['class' => 'common\modules\faq\Module'],
'reviews' => ['class' => 'common\modules\reviews\Module'],
'users' => ['class' => 'common\modules\users\users'],
'testings' => ['class' => 'common\modules\testings\Module'],
'main' => ['class' => 'common\modules\main\main'],
'rbac' => ['class' => 'common\modules\rbac\rbac'],
'utility' => ['class' => 'c006\utility\migration\Module'],
'triggers' => ['class' => 'common\modules\triggers\Module'],
'school' => ['class' => 'common\modules\school\Module'],
'rbac' => ['class' => 'common\modules\rbac\rbac'],
],
'components' => [
'session' => [
......
<?php
namespace common\modules\bids;
/**
* bids module definition class
*/
class Module extends \common\components\WebModule
{
/**
* @inheritdoc
*/
public $controllerNamespace = 'common\modules\bids\controllers';
public static $active = true;
public $menu_icons = 'fa fa-inbox';
/**
* @inheritdoc
*/
public function init()
{
parent::init();
// custom initialization code goes here
}
public static function name()
{
return 'Управление заявками';
}
public static function description()
{
return 'Управление заявками';
}
public static function version()
{
return '1.0';
}
public static function adminMenu()
{
return array(
'Список заявок' => '/bids/bid-admin/manage',
);
}
}
<?php
namespace common\modules\bids\controllers;
use Yii;
use common\modules\bids\models\Bid;
use common\modules\bids\models\SearchBid;
use common\components\AdminController;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
/**
* BidAdminController implements the CRUD actions for Bid model.
*/
class BidAdminController extends AdminController
{
public static function actionsTitles(){
return [
'Manage' => 'Управление заявками',
'Create' => 'Добавление заявки',
'Update' => 'Редактирование заявки',
'Delete' => 'Удаление заявки',
'View' => 'Просмотр заявки',
];
}
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['POST'],
],
],
];
}
/**
* Lists all Bid models.
* @return mixed
*/
public function actionManage()
{
$searchModel = new SearchBid();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('manage', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* Displays a single Bid model.
* @param integer $id
* @return mixed
*/
public function actionView($id)
{
return $this->render('view', [
'model' => $this->findModel($id),
]);
}
/**
* Creates a new Bid model.
* If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
{
$model = new Bid();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
/**
* Updates an existing Bid model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param integer $id
* @return mixed
*/
public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
/**
* Deletes an existing Bid model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* @param integer $id
* @return mixed
*/
public function actionDelete($id)
{
$this->findModel($id)->delete();
return $this->redirect(['index']);
}
/**
* Finds the Bid model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param integer $id
* @return Bid the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = Bid::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}
<?php
namespace common\modules\bids\controllers;
use Yii;
use yii\helpers\Json;
use yii\web\NotFoundHttpException;
use yii\widgets\ActiveForm;
use yii\web\Response;
use yii\web\UploadedFile;
use common\modules\bids\models\Bid;
/**
* BidAdminController implements the CRUD actions for Bid model.
*/
class BidController extends \common\components\BaseController
{
public static function actionsTitles()
{
return [
'Add' => 'Добавление заявки',
];
}
/**
* Lists all Bid models.
* @return mixed
*/
public function actionAdd()
{
$model = new Bid;
$model->scenario = Yii::$app->request->post('scenario');
if(Yii::$app->request->isAjax)
{
$model->load(Yii::$app->request->post());
$model->file = UploadedFile::getInstance($model, 'file');
Yii::$app->response->format = Response::FORMAT_JSON;
if($model->validate())
{
if($model->file)
{
$model->upload();
$model->file = null;
}
$model->save();
$model->send();
return ['success' => true];
}
else
{
return ActiveForm::validate($model);
}
}
else
{
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}
<?php
namespace common\modules\bids\models;
use Yii;
/**
* This is the model class for table "bids".
*
* @property integer $id
* @property string $name
* @property string $phone
* @property string $file
* @property string $text
*/
class Bid extends \common\components\ActiveRecordModel
{
const SCENARIO_PROJECT = 'project';
const SCENARIO_CALLBACK = 'callback';
const FILE_FOLDER = '/uploads/bids/';
public $file;
/**
* @inheritdoc
*/
public static function tableName()
{
return 'bids';
}
/**
* @inheritdoc
*/
public function name()
{
return 'Заявки';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['name', 'phone', 'email'], 'required', 'on' => self::SCENARIO_PROJECT],
[['email'], 'email', 'on' => self::SCENARIO_PROJECT],
[['name', 'phone'], 'required', 'on' => self::SCENARIO_CALLBACK],
[['file'], 'file', 'skipOnEmpty' => true, 'extensions' => 'png, jpg, jpeg, gif, xls, xlsx, doc, docx, pdf'],
[['text'], 'string'],
[['name'], 'string', 'max' => 100],
[['phone'], 'string', 'max' => 30],
[['email'], 'string', 'max' => 70],
[['filename'], 'string', 'max' => 50],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => '#',
'name' => 'Имя',
'phone' => 'Телефон',
'email' => 'Email',
'filename' => 'Прикрепленный файл',
'file' => 'Прикрепленный файл',
'text' => 'Сообщение',
'created_at' => 'Дата добавления',
'updated_at' => 'Дата обновления',
];
}
public function getUrl()
{
return Yii::$app->params['frontUrl'] . self::FILE_FOLDER . $this->filename;
}
private function getPath()
{
return Yii::getAlias('@frontend/web') . self::FILE_FOLDER;
}
public function upload()
{
if(!file_exists($this->getPath()))
{
mkdir($this->getPath(), 0777, true);
}
$this->filename = date('dmYHis-') . uniqid() . '.' . $this->file->extension;
$this->file->saveAs($this->getPath() . $this->filename);
}
public function send()
{
}
}
<?php
namespace common\modules\bids\models;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use common\modules\bids\models\Bid;
/**
* SearchBid represents the model behind the search form about `common\modules\bids\models\Bid`.
*/
class SearchBid extends Bid
{
/**
* @inheritdoc
*/
public function rules()
{
return [
[['id'], 'integer'],
[['name', 'phone', 'email', 'filename', 'text', 'created_at'], 'safe'],
];
}
/**
* @inheritdoc
*/
public function scenarios()
{
// bypass scenarios() implementation in the parent class
return Model::scenarios();
}
/**
* Creates data provider instance with search query applied
*
* @param array $params
*
* @return ActiveDataProvider
*/
public function search($params)
{
$query = Bid::find();
// add conditions that should always apply here
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$this->load($params);
if (!$this->validate()) {
// uncomment the following line if you do not want to return any records when validation fails
// $query->where('0=1');
return $dataProvider;
}
// grid filtering conditions
$query->andFilterWhere([
'id' => $this->id,
'created_at' => ($this->created_at?strtotime($this->created_at):$this->created_at),
]);
$query->andFilterWhere(['like', 'name', $this->name])
->andFilterWhere(['like', 'phone', $this->phone])
->andFilterWhere(['like', 'email', $this->email])
->andFilterWhere(['like', 'filename', $this->filename])
->andFilterWhere(['like', 'text', $this->text]);
return $dataProvider;
}
}
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $model common\modules\bids\models\Bid */
/* @var $form yii\widgets\ActiveForm */
?>
<div class="bid-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'phone')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'email')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'file')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'text')->textarea(['rows' => 6]) ?>
<div class="form-group">
<?= Html::submitButton('Сохранить', ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $model common\modules\bids\models\SearchBid */
/* @var $form yii\widgets\ActiveForm */
?>
<div class="bid-search">
<?php $form = ActiveForm::begin([
'action' => ['index'],
'method' => 'get',
]); ?>
<?= $form->field($model, 'id') ?>
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'phone') ?>
<?= $form->field($model, 'file') ?>
<?= $form->field($model, 'text') ?>
<div class="form-group">
<?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
<?= Html::resetButton('Reset', ['class' => 'btn btn-default']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
<?php
use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $model common\modules\bids\models\Bid */
$this->title = 'Create Bid';
$this->params['breadcrumbs'][] = ['label' => 'Bids', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="bid-create">
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>
<?php
use yii\helpers\Html;
use common\modules\bids\models\Bid;
/* @var $this yii\web\View */
/* @var $searchModel common\modules\bids\models\SearchBid */
/* @var $dataProvider yii\data\ActiveDataProvider */
$this->title = 'Bids';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="bid-index">
<p>
<?= Html::a('Добавить', ['create'], ['class' => 'btn btn-success']) ?>
</p>
<?= \common\components\zii\AdminGrid::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
'id',
'name',
'phone',
'email:email',
[
'attribute' => 'filename',
'format' => 'html',
'value' => function($model)
{
return ($model->filename?Html::a($model->filename, $model->getUrl()):null);
}
],
'text:ntext',
[
'attribute' => 'created_at',
'format' => ['date', 'php:d.m.Y H:i:s']
],
[
'class' => 'common\components\ColorActionColumn',
'template' => '{view} {update}',
]
],
]); ?>
</div>
<?php
use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $model common\modules\bids\models\Bid */
$this->title = 'Update Bid: ' . ' ' . $model->name;
$this->params['breadcrumbs'][] = ['label' => 'Bids', 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => $model->name, 'url' => ['view', 'id' => $model->id]];
$this->params['breadcrumbs'][] = 'Update';
?>
<div class="bid-update">
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>
<?php
use yii\helpers\Html;
use yii\widgets\DetailView;
/* @var $this yii\web\View */
/* @var $model common\modules\bids\models\Bid */
$this->title = $model->name;
$this->params['breadcrumbs'][] = ['label' => 'Bids', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="bid-view">
<p>
<?= Html::a('Редактировать', ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?>
</p>
<?= DetailView::widget([
'model' => $model,
'attributes' => [
'id',
'name',
'phone',
'email:email',
'file',
'text:ntext',
[
'attribute' => 'created_at',
'format' => ['date', 'php:d.m.Y H:i:s']
],
[
'attribute' => 'updated_at',
'format' => ['date', 'php:d.m.Y H:i:s']
],
],
]) ?>
</div>
......@@ -20,10 +20,10 @@ class BlockAdminController extends AdminController
public static function actionsTitles(){
return [
'Manage' => 'Управление блоками',
'Create' => 'Добавление контента',
'Update' => 'Редактирование контента',
'Delete' => 'Удаление контента',
'View' => 'Просмотр контента',
'Create' => 'Добавление блока',
'Update' => 'Редактирование блока',
'Delete' => 'Удаление блока',
'View' => 'Просмотр блока',
];
}
......
<?php
use yii\helpers\Html;
use yii\grid\GridView;
use \yii\helpers\ArrayHelper;
use \common\modules\content\models\CoCategory;
/* @var $this yii\web\View */
......
<?php
use yii\db\Schema;
use yii\db\Migration;
class m160204_090228_create_bids extends Migration
{
public function up()
{
$this->createTable('bids', [
'id' => Schema::TYPE_PK,
'name' => Schema::TYPE_STRING . '(100) DEFAULT NULL',
'phone' => Schema::TYPE_STRING . '(30) DEFAULT NULL',
'email' => Schema::TYPE_STRING . '(70) DEFAULT NULL',
'filename' => Schema::TYPE_STRING . '(50) DEFAULT NULL',
'text' => Schema::TYPE_TEXT . ' DEFAULT NULL',
'created_at' => Schema::TYPE_INTEGER . '(11) NOT NULL',
'updated_at' => Schema::TYPE_INTEGER . '(11) NOT NULL',
]);
}
public function down()
{
$this->dropTable('bids');
}
}
......@@ -20,6 +20,7 @@ return [
'faq' => ['class' => 'common\modules\faq\Module'],
'main' => ['class' => 'common\modules\main\main'],
'school' => ['class' => 'common\modules\school\Module',],
'bids' => ['class' => 'common\modules\bids\Module'],
'testings' => ['class' => 'common\modules\testings\Module',],
'sitemap' => [
'class' => 'himiklab\sitemap\Sitemap',
......
......@@ -17,4 +17,9 @@
<?php $this->registerJsFile('/js/jquery-validate.min.js', ['position' => yii\web\View::POS_END ]);?>
<?php $this->registerJsFile('/js/jquery.mb.YTPlayer.min.js', ['position' => yii\web\View::POS_END ]);?>
<?php $this->registerJsFile('/js/jquery.PageScroll2id.min.js', ['position' => yii\web\View::POS_END ]);?>
<?php $this->registerJsFile('/js/inputmask.js', ['position' => yii\web\View::POS_END ]);?>
<?php $this->registerJsFile('/js/jquery.inputmask.js', ['position' => yii\web\View::POS_END ]);?>
<?php $this->registerJsFile('/js/inputmask.phone.extensions.js', ['position' => yii\web\View::POS_END ]);?>
<?php $this->registerJsFile('/js/common.js', ['position' => yii\web\View::POS_END ]);?>
\ No newline at end of file
<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
use yii\helpers\Url;
use common\modules\bids\models\Bid;
?>
<style type="text/css">
.footer_form input,
.footer_form textarea {
margin-bottom: 9px;
}
.field-bid-file {
margin: 0;
}
</style>
<?php
$js = <<<JS
$('#bid-phone').inputmask("phone", {
url: "js/phone-codes/phone-codes.js",
});
$('form#form_foot').on('beforeSubmit', function(e) {
var form = $(this), xhr = new XMLHttpRequest, filebool = false, file, data = new FormData();
form.find('input, textarea').each(function(){
data.append($(this).attr('name'), $(this).val());
});
if(form.find('input[type=file]').length) {
file = form.find('input[type=file]')[0].files[0];
filebool = !filebool;
data.append("Bid[file]", file);
}
xhr.open("POST", '/bids/bid/add', true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.send(data);
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4){
try
{
var response = JSON.parse(xhr.responseText);
}
catch(e)
{
var response = xhr.responseText;
}
if(response.success)
{
form.find('input[name!="scenario"], textarea').val('');
}
}
}
}).on('submit', function(e){
return false;
});
JS;
$this->registerJs($js);
?>
<footer>
<div class="container">
<div class="row">
......@@ -5,25 +74,59 @@
<div class="calk_form">
<span class="calk_form__title">Рассчитать проект</span>
<span class="calk_form_subtitle">Готовы обсудить любой проект. Есть идея или готовое ТЗ по проекту - отправьте его нам</span>
<form class="footer_form" id="form_foot">
<input type="text" placeholder="Ваше имя*" name="name" class="footer_form__input field-input required alphanumeric">
<input type="tel" placeholder="Телефон*" name="phone" class="footer_form__input field-input required alphanumeric">
<input type="email" placeholder="E-mail*" class="footer_form__input field-input required email">
<textarea placeholder="Опишите в двух словах ваш проект" class="footer_form__textarea"></textarea>
<?php
$model = new Bid;
$model->scenario = Bid::SCENARIO_PROJECT;
$form = ActiveForm::begin([
'id' => 'form_foot',
'action' => '/',
'options' => [
'class' => 'footer_form',
'enctype' => 'multipart/form-data'
],
]); ?>
<?php echo Html::hiddenInput('scenario', $model->scenario); ?>
<?php echo $form->field($model, 'name')->textInput([
'placeholder' => 'Ваше имя*',
'class' => 'footer_form__input'
])->label(false); ?>
<?php echo $form->field($model, 'phone')->textInput([
'placeholder' => 'Телефон*',
'class' => 'footer_form__input'
])->label(false); ?>
<?php echo $form->field($model, 'email')->textInput([
'placeholder' => 'E-mail*',
'class' => 'footer_form__input'
])->label(false); ?>
<?php echo $form->field($model, 'text')->textArea([
'placeholder' => 'Опишите в двух словах ваш проект',
'class' => 'footer_form__textarea'
])->label(false); ?>
<div class="file-upload_block">
<div class="file_upload_bt">
<div class="file-upload">
<label>
<input type="file" name="file">
<span>Выбрать файл</span>
</label>
<label>
<?php echo $form->field($model, 'file')->fileInput()->label(false); ?>
<span>Выбрать файл</span>
</label>
</div>
<input type="text" id="filename" class="filename" disabled>
<div class="file_drop">Перетащите файл в данную область<br/> или выберите файл с компьютера</div>
</div>
</div>
<button class="btn-default save-button">Рассчитать проект</button>
</form>
<?php echo Html::submitButton('Рассчитать проект', ['class' => 'btn-default save-button']); ?>
<?php ActiveForm::end(); ?>
</div>
</div>
</div>
......
/*
Input Mask plugin extensions
http://github.com/RobinHerbots/jquery.inputmask
Copyright (c) 2010 - Robin Herbots
Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
Version: 0.0.0-dev
Optional extensions on the jquery.inputmask base
*/
(function(factory) {
if (typeof define === "function" && define.amd) {
define(["inputmask.dependencyLib", "inputmask"], factory);
} else if (typeof exports === "object") {
module.exports = factory(require("./inputmask.dependencyLib.jquery"), require("./inputmask"));
} else {
factory(window.dependencyLib || jQuery, window.Inputmask);
}
}
(function($, Inputmask) {
//date & time aliases
Inputmask.extendDefinitions({
"h": { //hours
validator: "[01][0-9]|2[0-3]",
cardinality: 2,
prevalidator: [{
validator: "[0-2]",
cardinality: 1
}]
},
"s": { //seconds || minutes
validator: "[0-5][0-9]",
cardinality: 2,
prevalidator: [{
validator: "[0-5]",
cardinality: 1
}]
},
"d": { //basic day
validator: "0[1-9]|[12][0-9]|3[01]",
cardinality: 2,
prevalidator: [{
validator: "[0-3]",
cardinality: 1
}]
},
"m": { //basic month
validator: "0[1-9]|1[012]",
cardinality: 2,
prevalidator: [{
validator: "[01]",
cardinality: 1
}]
},
"y": { //basic year
validator: "(19|20)\\d{2}",
cardinality: 4,
prevalidator: [{
validator: "[12]",
cardinality: 1
}, {
validator: "(19|20)",
cardinality: 2
}, {
validator: "(19|20)\\d",
cardinality: 3
}]
}
});
Inputmask.extendAliases({
"dd/mm/yyyy": {
mask: "1/2/y",
placeholder: "dd/mm/yyyy",
regex: {
val1pre: new RegExp("[0-3]"), //daypre
val1: new RegExp("0[1-9]|[12][0-9]|3[01]"), //day
val2pre: function(separator) {
var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
return new RegExp("((0[1-9]|[12][0-9]|3[01])" + escapedSeparator + "[01])");
}, //monthpre
val2: function(separator) {
var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
return new RegExp("((0[1-9]|[12][0-9])" + escapedSeparator + "(0[1-9]|1[012]))|(30" + escapedSeparator + "(0[13-9]|1[012]))|(31" + escapedSeparator + "(0[13578]|1[02]))");
} //month
},
leapday: "29/02/",
separator: "/",
yearrange: {
minyear: 1900,
maxyear: 2099
},
isInYearRange: function(chrs, minyear, maxyear) {
if (isNaN(chrs)) return false;
var enteredyear = parseInt(chrs.concat(minyear.toString().slice(chrs.length)));
var enteredyear2 = parseInt(chrs.concat(maxyear.toString().slice(chrs.length)));
return (!isNaN(enteredyear) ? minyear <= enteredyear && enteredyear <= maxyear : false) ||
(!isNaN(enteredyear2) ? minyear <= enteredyear2 && enteredyear2 <= maxyear : false);
},
determinebaseyear: function(minyear, maxyear, hint) {
var currentyear = (new Date()).getFullYear();
if (minyear > currentyear) return minyear;
if (maxyear < currentyear) {
var maxYearPrefix = maxyear.toString().slice(0, 2);
var maxYearPostfix = maxyear.toString().slice(2, 4);
while (maxyear < maxYearPrefix + hint) {
maxYearPrefix--;
}
var maxxYear = maxYearPrefix + maxYearPostfix;
return minyear > maxxYear ? minyear : maxxYear;
}
return currentyear;
},
onKeyDown: function(e, buffer, caretPos, opts) {
var $input = $(this);
if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) {
var today = new Date();
$input.val(today.getDate().toString() + (today.getMonth() + 1).toString() + today.getFullYear().toString());
$input.trigger("setvalue");
}
},
getFrontValue: function(mask, buffer, opts) {
var start = 0,
length = 0;
for (var i = 0; i < mask.length; i++) {
if (mask.charAt(i) === "2") break;
var definition = opts.definitions[mask.charAt(i)];
if (definition) {
start += length;
length = definition.cardinality;
} else length++;
}
return buffer.join("").substr(start, length);
},
definitions: {
"1": { //val1 ~ day or month
validator: function(chrs, maskset, pos, strict, opts) {
var isValid = opts.regex.val1.test(chrs);
if (!strict && !isValid) {
if (chrs.charAt(1) === opts.separator || "-./".indexOf(chrs.charAt(1)) !== -1) {
isValid = opts.regex.val1.test("0" + chrs.charAt(0));
if (isValid) {
maskset.buffer[pos - 1] = "0";
return {
"refreshFromBuffer": {
start: pos - 1,
end: pos
},
"pos": pos,
"c": chrs.charAt(0)
};
}
}
}
return isValid;
},
cardinality: 2,
prevalidator: [{
validator: function(chrs, maskset, pos, strict, opts) {
var pchrs = chrs;
if (!isNaN(maskset.buffer[pos + 1])) pchrs += maskset.buffer[pos + 1];
var isValid = pchrs.length === 1 ? opts.regex.val1pre.test(pchrs) : opts.regex.val1.test(pchrs);
if (!strict && !isValid) {
isValid = opts.regex.val1.test(chrs + "0");
if (isValid) {
maskset.buffer[pos] = chrs;
maskset.buffer[++pos] = "0";
return {
"pos": pos,
"c": "0"
};
}
isValid = opts.regex.val1.test("0" + chrs);
if (isValid) {
maskset.buffer[pos] = "0";
pos++;
return {
"pos": pos
};
}
}
return isValid;
},
cardinality: 1
}]
},
"2": { //val2 ~ day or month
validator: function(chrs, maskset, pos, strict, opts) {
var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts);
if (frontValue.indexOf(opts.placeholder[0]) !== -1) frontValue = "01" + opts.separator;
var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs);
if (!strict && !isValid) {
if (chrs.charAt(1) === opts.separator || "-./".indexOf(chrs.charAt(1)) !== -1) {
isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0));
if (isValid) {
maskset.buffer[pos - 1] = "0";
return {
"refreshFromBuffer": {
start: pos - 1,
end: pos
},
"pos": pos,
"c": chrs.charAt(0)
};
}
}
}
//check leap yeap
if ((opts.mask.indexOf("2") === opts.mask.length - 1) && isValid) {
var dayMonthValue = maskset.buffer.join("").substr(4, 4) + chrs;
if (dayMonthValue !== opts.leapday) {
return true;
} else {
var year = parseInt(maskset.buffer.join("").substr(0, 4), 10); //detect leap year
if (year % 4 === 0) {
if (year % 100 === 0) {
if (year % 400 === 0) {
return true;
} else {
return false;
}
} else {
return true;
}
} else return false;
}
}
return isValid;
},
cardinality: 2,
prevalidator: [{
validator: function(chrs, maskset, pos, strict, opts) {
if (!isNaN(maskset.buffer[pos + 1])) chrs += maskset.buffer[pos + 1];
var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts);
if (frontValue.indexOf(opts.placeholder[0]) !== -1) frontValue = "01" + opts.separator;
var isValid = chrs.length === 1 ? opts.regex.val2pre(opts.separator).test(frontValue + chrs) : opts.regex.val2(opts.separator).test(frontValue + chrs);
if (!strict && !isValid) {
isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs);
if (isValid) {
maskset.buffer[pos] = "0";
pos++;
return {
"pos": pos
};
}
}
return isValid;
},
cardinality: 1
}]
},
"y": { //year
validator: function(chrs, maskset, pos, strict, opts) {
if (opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) {
var dayMonthValue = maskset.buffer.join("").substr(0, 6);
if (dayMonthValue !== opts.leapday) {
return true;
} else {
var year = parseInt(chrs, 10); //detect leap year
if (year % 4 === 0) {
if (year % 100 === 0) {
if (year % 400 === 0) return true;
else return false;
} else return true;
} else return false;
}
} else return false;
},
cardinality: 4,
prevalidator: [{
validator: function(chrs, maskset, pos, strict, opts) {
var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
if (!strict && !isValid) {
var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 1);
isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
if (isValid) {
maskset.buffer[pos++] = yearPrefix.charAt(0);
return {
"pos": pos
};
}
yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2);
isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
if (isValid) {
maskset.buffer[pos++] = yearPrefix.charAt(0);
maskset.buffer[pos++] = yearPrefix.charAt(1);
return {
"pos": pos
};
}
}
return isValid;
},
cardinality: 1
}, {
validator: function(chrs, maskset, pos, strict, opts) {
var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
if (!strict && !isValid) {
var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2);
isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear);
if (isValid) {
maskset.buffer[pos++] = yearPrefix.charAt(1);
return {
"pos": pos
};
}
yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2);
if (opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) {
var dayMonthValue = maskset.buffer.join("").substr(0, 6);
if (dayMonthValue !== opts.leapday) {
isValid = true;
} else {
var year = parseInt(chrs, 10); //detect leap year
if (year % 4 === 0) {
if (year % 100 === 0) {
if (year % 400 === 0) isValid = true;
else isValid = false;
} else isValid = true;
} else isValid = false;
}
} else isValid = false;
if (isValid) {
maskset.buffer[pos - 1] = yearPrefix.charAt(0);
maskset.buffer[pos++] = yearPrefix.charAt(1);
maskset.buffer[pos++] = chrs.charAt(0);
return {
"refreshFromBuffer": {
start: pos - 3,
end: pos
},
"pos": pos
};
}
}
return isValid;
},
cardinality: 2
}, {
validator: function(chrs, maskset, pos, strict, opts) {
return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
},
cardinality: 3
}]
}
},
insertMode: false,
autoUnmask: false
},
"mm/dd/yyyy": {
placeholder: "mm/dd/yyyy",
alias: "dd/mm/yyyy", //reuse functionality of dd/mm/yyyy alias
regex: {
val2pre: function(separator) {
var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])");
}, //daypre
val2: function(separator) {
var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)");
}, //day
val1pre: new RegExp("[01]"), //monthpre
val1: new RegExp("0[1-9]|1[012]") //month
},
leapday: "02/29/",
onKeyDown: function(e, buffer, caretPos, opts) {
var $input = $(this);
if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) {
var today = new Date();
$input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString());
$input.trigger("setvalue");
}
}
},
"yyyy/mm/dd": {
mask: "y/1/2",
placeholder: "yyyy/mm/dd",
alias: "mm/dd/yyyy",
leapday: "/02/29",
onKeyDown: function(e, buffer, caretPos, opts) {
var $input = $(this);
if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) {
var today = new Date();
$input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString());
$input.trigger("setvalue");
}
}
},
"dd.mm.yyyy": {
mask: "1.2.y",
placeholder: "dd.mm.yyyy",
leapday: "29.02.",
separator: ".",
alias: "dd/mm/yyyy"
},
"dd-mm-yyyy": {
mask: "1-2-y",
placeholder: "dd-mm-yyyy",
leapday: "29-02-",
separator: "-",
alias: "dd/mm/yyyy"
},
"mm.dd.yyyy": {
mask: "1.2.y",
placeholder: "mm.dd.yyyy",
leapday: "02.29.",
separator: ".",
alias: "mm/dd/yyyy"
},
"mm-dd-yyyy": {
mask: "1-2-y",
placeholder: "mm-dd-yyyy",
leapday: "02-29-",
separator: "-",
alias: "mm/dd/yyyy"
},
"yyyy.mm.dd": {
mask: "y.1.2",
placeholder: "yyyy.mm.dd",
leapday: ".02.29",
separator: ".",
alias: "yyyy/mm/dd"
},
"yyyy-mm-dd": {
mask: "y-1-2",
placeholder: "yyyy-mm-dd",
leapday: "-02-29",
separator: "-",
alias: "yyyy/mm/dd"
},
"datetime": {
mask: "1/2/y h:s",
placeholder: "dd/mm/yyyy hh:mm",
alias: "dd/mm/yyyy",
regex: {
hrspre: new RegExp("[012]"), //hours pre
hrs24: new RegExp("2[0-4]|1[3-9]"),
hrs: new RegExp("[01][0-9]|2[0-4]"), //hours
ampm: new RegExp("^[a|p|A|P][m|M]"),
mspre: new RegExp("[0-5]"), //minutes/seconds pre
ms: new RegExp("[0-5][0-9]")
},
timeseparator: ":",
hourFormat: "24", // or 12
definitions: {
"h": { //hours
validator: function(chrs, maskset, pos, strict, opts) {
if (opts.hourFormat === "24") {
if (parseInt(chrs, 10) === 24) {
maskset.buffer[pos - 1] = "0";
maskset.buffer[pos] = "0";
return {
"refreshFromBuffer": {
start: pos - 1,
end: pos
},
"c": "0"
};
}
}
var isValid = opts.regex.hrs.test(chrs);
if (!strict && !isValid) {
if (chrs.charAt(1) === opts.timeseparator || "-.:".indexOf(chrs.charAt(1)) !== -1) {
isValid = opts.regex.hrs.test("0" + chrs.charAt(0));
if (isValid) {
maskset.buffer[pos - 1] = "0";
maskset.buffer[pos] = chrs.charAt(0);
pos++;
return {
"refreshFromBuffer": {
start: pos - 2,
end: pos
},
"pos": pos,
"c": opts.timeseparator
};
}
}
}
if (isValid && opts.hourFormat !== "24" && opts.regex.hrs24.test(chrs)) {
var tmp = parseInt(chrs, 10);
if (tmp === 24) {
maskset.buffer[pos + 5] = "a";
maskset.buffer[pos + 6] = "m";
} else {
maskset.buffer[pos + 5] = "p";
maskset.buffer[pos + 6] = "m";
}
tmp = tmp - 12;
if (tmp < 10) {
maskset.buffer[pos] = tmp.toString();
maskset.buffer[pos - 1] = "0";
} else {
maskset.buffer[pos] = tmp.toString().charAt(1);
maskset.buffer[pos - 1] = tmp.toString().charAt(0);
}
return {
"refreshFromBuffer": {
start: pos - 1,
end: pos + 6
},
"c": maskset.buffer[pos]
};
}
return isValid;
},
cardinality: 2,
prevalidator: [{
validator: function(chrs, maskset, pos, strict, opts) {
var isValid = opts.regex.hrspre.test(chrs);
if (!strict && !isValid) {
isValid = opts.regex.hrs.test("0" + chrs);
if (isValid) {
maskset.buffer[pos] = "0";
pos++;
return {
"pos": pos
};
}
}
return isValid;
},
cardinality: 1
}]
},
"s": { //seconds || minutes
validator: "[0-5][0-9]",
cardinality: 2,
prevalidator: [{
validator: function(chrs, maskset, pos, strict, opts) {
var isValid = opts.regex.mspre.test(chrs);
if (!strict && !isValid) {
isValid = opts.regex.ms.test("0" + chrs);
if (isValid) {
maskset.buffer[pos] = "0";
pos++;
return {
"pos": pos
};
}
}
return isValid;
},
cardinality: 1
}]
},
"t": { //am/pm
validator: function(chrs, maskset, pos, strict, opts) {
return opts.regex.ampm.test(chrs + "m");
},
casing: "lower",
cardinality: 1
}
},
insertMode: false,
autoUnmask: false
},
"datetime12": {
mask: "1/2/y h:s t\\m",
placeholder: "dd/mm/yyyy hh:mm xm",
alias: "datetime",
hourFormat: "12"
},
"mm/dd/yyyy hh:mm xm": {
mask: "1/2/y h:s t\\m",
placeholder: "mm/dd/yyyy hh:mm xm",
alias: "datetime12",
regex: {
val2pre: function (separator) {
var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])");
},
val2: function (separator) {
var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)");
},
val1pre: new RegExp("[01]"),
val1: new RegExp("0[1-9]|1[012]")
},
leapday: "02/29/",
onKeyDown: function (e, buffer, caretPos, opts) {
var $input = $(this);
if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) {
var today = new Date();
$input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()),
$input.trigger("setvalue");
}
}
},
"hh:mm t": {
mask: "h:s t\\m",
placeholder: "hh:mm xm",
alias: "datetime",
hourFormat: "12"
},
"h:s t": {
mask: "h:s t\\m",
placeholder: "hh:mm xm",
alias: "datetime",
hourFormat: "12"
},
"hh:mm:ss": {
mask: "h:s:s",
placeholder: "hh:mm:ss",
alias: "datetime",
autoUnmask: false
},
"hh:mm": {
mask: "h:s",
placeholder: "hh:mm",
alias: "datetime",
autoUnmask: false
},
"date": {
alias: "dd/mm/yyyy" // "mm/dd/yyyy"
},
"mm/yyyy": {
mask: "1/y",
placeholder: "mm/yyyy",
leapday: "donotuse",
separator: "/",
alias: "mm/dd/yyyy"
},
"shamsi": {
regex: {
val2pre: function(separator) {
var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "[0-3])");
},
val2: function(separator) {
var escapedSeparator = Inputmask.escapeRegex.call(this, separator);
return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[1-9]|1[012])" + escapedSeparator + "30)|((0[1-6])" + escapedSeparator + "31)");
},
val1pre: new RegExp("[01]"),
val1: new RegExp("0[1-9]|1[012]")
},
yearrange: {
minyear: 1300,
maxyear: 1499
},
mask: "y/1/2",
leapday: "/12/30",
placeholder: "yyyy/mm/dd",
alias: "mm/dd/yyyy",
clearIncomplete: true
}
});
return Inputmask;
}));
(function(factory) {
if (typeof define === "function" && define.amd) {
define(["jquery"], factory);
} else if (typeof exports === "object") {
module.exports = factory(require("jquery"));
} else {
factory(jQuery);
}
}
(function($) {
window.dependencyLib = $;
return $;
}));
/*
Input Mask plugin extensions
http://github.com/RobinHerbots/jquery.inputmask
Copyright (c) 2010 - Robin Herbots
Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
Version: 0.0.0-dev
Optional extensions on the jquery.inputmask base
*/
(function(factory) {
if (typeof define === "function" && define.amd) {
define(["inputmask.dependencyLib", "inputmask"], factory);
} else if (typeof exports === "object") {
module.exports = factory(require("./inputmask.dependencyLib.jquery"), require("./inputmask"));
} else {
factory(window.dependencyLib || jQuery, window.Inputmask);
}
}
(function($, Inputmask) {
//extra definitions
Inputmask.extendDefinitions({
"A": {
validator: "[A-Za-z\u0410-\u044F\u0401\u0451\u00C0-\u00FF\u00B5]",
cardinality: 1,
casing: "upper" //auto uppercasing
},
"&": { //alfanumeric uppercasing
validator: "[0-9A-Za-z\u0410-\u044F\u0401\u0451\u00C0-\u00FF\u00B5]",
cardinality: 1,
casing: "upper"
},
"#": { //hexadecimal
validator: "[0-9A-Fa-f]",
cardinality: 1,
casing: "upper"
}
});
Inputmask.extendAliases({
"url": {
definitions: {
"i": {
validator: ".",
cardinality: 1
}
},
mask: "(\\http://)|(\\http\\s://)|(ftp://)|(ftp\\s://)i{+}",
insertMode: false,
autoUnmask: false
},
"ip": { //ip-address mask
mask: "i[i[i]].i[i[i]].i[i[i]].i[i[i]]",
definitions: {
"i": {
validator: function(chrs, maskset, pos, strict, opts) {
if (pos - 1 > -1 && maskset.buffer[pos - 1] !== ".") {
chrs = maskset.buffer[pos - 1] + chrs;
if (pos - 2 > -1 && maskset.buffer[pos - 2] !== ".") {
chrs = maskset.buffer[pos - 2] + chrs;
} else chrs = "0" + chrs;
} else chrs = "00" + chrs;
return new RegExp("25[0-5]|2[0-4][0-9]|[01][0-9][0-9]").test(chrs);
},
cardinality: 1
}
},
onUnMask: function(maskedValue, unmaskedValue, opts) {
return maskedValue;
}
},
"email": {
mask: "*{1,64}[.*{1,64}][.*{1,64}][.*{1,64}]@*{1,64}[.*{2,64}][.*{2,6}][.*{1,2}]",
greedy: false,
onBeforePaste: function(pastedValue, opts) {
pastedValue = pastedValue.toLowerCase();
return pastedValue.replace("mailto:", "");
},
definitions: {
"*": {
validator: "[0-9A-Za-z!#$%&'*+/=?^_`{|}~\-]",
cardinality: 1,
casing: "lower"
}
},
onUnMask: function(maskedValue, unmaskedValue, opts) {
return maskedValue;
}
},
"mac": {
mask: "##:##:##:##:##:##"
}
});
return Inputmask;
}));
This source diff could not be displayed because it is too large. You can view the blob instead.
/*
Input Mask plugin extensions
http://github.com/RobinHerbots/jquery.inputmask
Copyright (c) 2010 - Robin Herbots
Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
Version: 0.0.0-dev
Optional extensions on the jquery.inputmask base
*/
(function(factory) {
if (typeof define === "function" && define.amd) {
define(["inputmask.dependencyLib", "inputmask"], factory);
} else if (typeof exports === "object") {
module.exports = factory(require("./inputmask.dependencyLib.jquery"), require("./inputmask"));
} else {
factory(window.dependencyLib || jQuery, window.Inputmask);
}
}
(function($, Inputmask) {
//number aliases
Inputmask.extendAliases({
"numeric": {
mask: function(opts) {
function autoEscape(txt) {
var escapedTxt = "";
for (var i = 0; i < txt.length; i++) {
escapedTxt += opts.definitions[txt.charAt(i)] ? "\\" + txt.charAt(i) : txt.charAt(i);
}
return escapedTxt;
}
if (opts.repeat !== 0 && isNaN(opts.integerDigits)) {
opts.integerDigits = opts.repeat;
}
opts.repeat = 0;
if (opts.groupSeparator === opts.radixPoint) { //treat equal separator and radixpoint
if (opts.radixPoint === ".") {
opts.groupSeparator = ",";
} else if (opts.radixPoint === ",") {
opts.groupSeparator = ".";
} else opts.groupSeparator = "";
}
if (opts.groupSeparator === " ") { //prevent conflict with default skipOptionalPartCharacter
opts.skipOptionalPartCharacter = undefined;
}
opts.autoGroup = opts.autoGroup && opts.groupSeparator !== "";
if (opts.autoGroup) {
if (typeof opts.groupSize == "string" && isFinite(opts.groupSize)) opts.groupSize = parseInt(opts.groupSize);
if (isFinite(opts.integerDigits)) {
var seps = Math.floor(opts.integerDigits / opts.groupSize);
var mod = opts.integerDigits % opts.groupSize;
opts.integerDigits = parseInt(opts.integerDigits) + (mod === 0 ? seps - 1 : seps);
if (opts.integerDigits < 1) {
opts.integerDigits = "*";
}
}
}
//enforce placeholder to single
if (opts.placeholder.length > 1) {
opts.placeholder = opts.placeholder.charAt(0);
}
//only allow radixfocus when placeholder = 0
opts.radixFocus = opts.radixFocus && opts.placeholder !== "" && opts.integerOptional === true;
opts.definitions[";"] = opts.definitions["~"]; //clone integer def for decimals
opts.definitions[";"].definitionSymbol = "~";
if (opts.numericInput == true) { //finance people input style
opts.radixFocus = false;
opts.digitsOptional = false;
if (isNaN(opts.digits)) opts.digits = 2;
opts.decimalProtect = false;
}
var mask = autoEscape(opts.prefix);
mask += "[+]";
if (opts.integerOptional === true) {
mask += "~{1," + opts.integerDigits + "}";
} else mask += "~{" + opts.integerDigits + "}";
if (opts.digits !== undefined && (isNaN(opts.digits) || parseInt(opts.digits) > 0)) {
if (opts.digitsOptional) {
mask += "[" + (opts.decimalProtect ? ":" : opts.radixPoint) + ";{1," + opts.digits + "}]";
} else mask += (opts.decimalProtect ? ":" : opts.radixPoint) + ";{" + opts.digits + "}";
}
if (opts.negationSymbol.back !== "") {
mask += "[-]";
}
mask += autoEscape(opts.suffix);
opts.greedy = false; //enforce greedy false
return mask;
},
placeholder: "",
greedy: false,
digits: "*", //number of fractionalDigits
digitsOptional: true,
radixPoint: ".",
radixFocus: true,
groupSize: 3,
groupSeparator: "",
autoGroup: false,
allowPlus: true,
allowMinus: true,
negationSymbol: {
front: "-", //"("
back: "" //")"
},
integerDigits: "+", //number of integerDigits
integerOptional: true,
prefix: "",
suffix: "",
rightAlign: true,
decimalProtect: true, //do not allow assumption of decimals input without entering the radixpoint
min: null, //minimum value
max: null, //maximum value
step: 1,
insertMode: true,
autoUnmask: false,
unmaskAsNumber: false,
postFormat: function(buffer, pos, reformatOnly, opts) { //this needs to be removed // this is crap
// console.log(buffer);
if (opts.numericInput === true) {
buffer = buffer.reverse();
if (isFinite(pos)) {
pos = buffer.join("").length - pos - 1;
}
}
var suffixStripped = false,
i, l;
if (buffer.length >= opts.suffix.length && buffer.join("").indexOf(opts.suffix) === (buffer.length - opts.suffix.length)) {
buffer.length = buffer.length - opts.suffix.length; //strip suffix
suffixStripped = true;
}
//position overflow corrections
pos = pos >= buffer.length ? buffer.length - 1 : (pos < opts.prefix.length ? opts.prefix.length : pos);
var needsRefresh = false,
charAtPos = buffer[pos];
if (opts.groupSeparator === "" || (opts.numericInput !== true &&
($.inArray(opts.radixPoint, buffer) !== -1 && pos > $.inArray(opts.radixPoint, buffer)) ||
new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "\+]").test(charAtPos))) {
if (suffixStripped) {
for (i = 0, l = opts.suffix.length; i < l; i++) {
buffer.push(opts.suffix.charAt(i));
}
}
//console.log("return input " + buffer);
return {
pos: pos
};
}
var cbuf = buffer.slice();
if (charAtPos === opts.groupSeparator) {
cbuf.splice(pos--, 1);
charAtPos = cbuf[pos];
}
if (reformatOnly) {
if (charAtPos !== opts.radixPoint) cbuf[pos] = "?";
} else cbuf.splice(pos, 0, "?"); //set position indicator
var bufVal = cbuf.join(""),
bufValOrigin = bufVal;
if (bufVal.length > 0 && opts.autoGroup || (reformatOnly && bufVal.indexOf(opts.groupSeparator) !== -1)) {
var escapedGroupSeparator = Inputmask.escapeRegex(opts.groupSeparator);
needsRefresh = bufVal.indexOf(opts.groupSeparator) === 0;
bufVal = bufVal.replace(new RegExp(escapedGroupSeparator, "g"), "");
var radixSplit = bufVal.split(opts.radixPoint);
bufVal = opts.radixPoint === "" ? bufVal : radixSplit[0];
if (bufVal !== (opts.prefix + "?0") && bufVal.length >= (opts.groupSize + opts.prefix.length)) {
//needsRefresh = true;
var reg = new RegExp("([-\+]?[\\d\?]+)([\\d\?]{" + opts.groupSize + "})");
while (reg.test(bufVal)) {
bufVal = bufVal.replace(reg, "$1" + opts.groupSeparator + "$2");
bufVal = bufVal.replace(opts.groupSeparator + opts.groupSeparator, opts.groupSeparator);
}
}
if (opts.radixPoint !== "" && radixSplit.length > 1) {
bufVal += opts.radixPoint + radixSplit[1];
}
}
needsRefresh = bufValOrigin !== bufVal;
buffer.length = bufVal.length; //align the length
for (i = 0, l = bufVal.length; i < l; i++) {
buffer[i] = bufVal.charAt(i);
}
var newPos = $.inArray("?", buffer);
if (newPos === -1 && charAtPos === opts.radixPoint) newPos = $.inArray(opts.radixPoint, buffer);
if (reformatOnly) buffer[newPos] = charAtPos;
else buffer.splice(newPos, 1);
if (!needsRefresh && suffixStripped) {
for (i = 0, l = opts.suffix.length; i < l; i++) {
buffer.push(opts.suffix.charAt(i));
}
}
// console.log("formatted " + buffer + " refresh " + needsRefresh);
newPos = (opts.numericInput && isFinite(pos)) ? buffer.join("").length - newPos - 1 : newPos;
if (opts.numericInput) {
buffer = buffer.reverse();
if ($.inArray(opts.radixPoint, buffer) < newPos && (buffer.join("").length - opts.suffix.length) !== newPos) {
newPos = newPos - 1;
}
}
return {
pos: newPos,
"refreshFromBuffer": needsRefresh,
"buffer": buffer
};
},
onBeforeWrite: function(e, buffer, caretPos, opts) {
if (e && (e.type === "blur" || e.type === "checkval")) {
//handle minvalue
var maskedValue = buffer.join(""),
processValue = maskedValue.replace(opts.prefix, "");
processValue = processValue.replace(opts.suffix, "");
processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "");
if (opts.radixPoint === ",") processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".");
if (isFinite(processValue)) {
if (isFinite(opts.min) && parseFloat(processValue) < parseFloat(opts.min)) {
return $.extend(true, {
"refreshFromBuffer": true,
"buffer": (opts.prefix + opts.min).split("")
}, opts.postFormat((opts.prefix + opts.min).split(""), 0, true, opts));
}
}
if (opts.numericInput !== true) {
var tmpBufSplit = opts.radixPoint !== "" ? buffer.join("").split(opts.radixPoint) : [buffer.join("")],
matchRslt = tmpBufSplit[0].match(opts.regex.integerPart(opts)),
matchRsltDigits = tmpBufSplit.length === 2 ? tmpBufSplit[1].match(opts.regex.integerNPart(opts)) : undefined;
if (matchRslt) {
if ((matchRslt[0] === opts.negationSymbol.front + "0" || matchRslt[0] === opts.negationSymbol.front || matchRslt[0] === "+") && (matchRsltDigits === undefined || matchRsltDigits[0].match(/^0+$/))) {
buffer.splice(matchRslt.index, 1);
}
var radixPosition = $.inArray(opts.radixPoint, buffer);
if (radixPosition !== -1) {
if (isFinite(opts.digits) && !opts.digitsOptional) {
for (var i = 1; i <= opts.digits; i++) {
if (buffer[radixPosition + i] === undefined || buffer[radixPosition + i] === opts.placeholder.charAt(0)) {
buffer[radixPosition + i] = "0";
}
}
return {
"refreshFromBuffer": maskedValue !== buffer.join(""),
"buffer": buffer
};
} else if (radixPosition === buffer.length - opts.suffix.length - 1) {
buffer.splice(radixPosition, 1);
return {
"refreshFromBuffer": true,
"buffer": buffer
};
}
}
}
}
}
if (opts.autoGroup) {
var rslt = opts.postFormat(buffer, opts.numericInput ? caretPos : caretPos - 1, true, opts);
rslt.caret = caretPos <= opts.prefix.length ? rslt.pos : rslt.pos + 1;
return rslt;
}
},
regex: {
integerPart: function(opts) {
return new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "\+]?\\d+");
},
integerNPart: function(opts) {
return new RegExp("[\\d" + Inputmask.escapeRegex(opts.groupSeparator) + "]+");
}
},
signHandler: function(chrs, maskset, pos, strict, opts) {
if (!strict && (opts.allowMinus && chrs === "-") || (opts.allowPlus && chrs === "+")) {
var matchRslt = maskset.buffer.join("").match(opts.regex.integerPart(opts));
if (matchRslt && matchRslt[0].length > 0) {
if (maskset.buffer[matchRslt.index] === (chrs === "-" ? "+" : opts.negationSymbol.front)) {
if (chrs === "-") {
if (opts.negationSymbol.back !== "") {
return {
"pos": matchRslt.index,
"c": opts.negationSymbol.front,
"remove": matchRslt.index,
"caret": pos,
"insert": {
"pos": maskset.buffer.length - opts.suffix.length - 1,
"c": opts.negationSymbol.back
}
};
} else {
return {
"pos": matchRslt.index,
"c": opts.negationSymbol.front,
"remove": matchRslt.index,
"caret": pos
};
}
} else {
if (opts.negationSymbol.back !== "") {
return {
"pos": matchRslt.index,
"c": "+",
"remove": [matchRslt.index, maskset.buffer.length - opts.suffix.length - 1],
"caret": pos
};
} else {
return {
"pos": matchRslt.index,
"c": "+",
"remove": matchRslt.index,
"caret": pos
};
}
}
} else if (maskset.buffer[matchRslt.index] === (chrs === "-" ? opts.negationSymbol.front : "+")) {
if (chrs === "-" && opts.negationSymbol.back !== "") {
return {
"remove": [matchRslt.index, maskset.buffer.length - opts.suffix.length - 1],
"caret": pos - 1
};
} else {
return {
"remove": matchRslt.index,
"caret": pos - 1
};
}
} else {
if (chrs === "-") {
if (opts.negationSymbol.back !== "") {
return {
"pos": matchRslt.index,
"c": opts.negationSymbol.front,
"caret": pos + 1,
"insert": {
"pos": maskset.buffer.length - opts.suffix.length,
"c": opts.negationSymbol.back
}
};
} else {
return {
"pos": matchRslt.index,
"c": opts.negationSymbol.front,
"caret": pos + 1
};
}
} else {
return {
"pos": matchRslt.index,
"c": chrs,
"caret": pos + 1
};
}
}
}
}
return false;
},
radixHandler: function(chrs, maskset, pos, strict, opts) {
if (!strict) {
if ($.inArray(chrs, [",", "."]) !== -1) chrs = opts.radixPoint;
if (chrs === opts.radixPoint && (opts.digits !== undefined && (isNaN(opts.digits) || parseInt(opts.digits) > 0))) {
var radixPos = $.inArray(opts.radixPoint, maskset.buffer),
integerValue = maskset.buffer.join("").match(opts.regex.integerPart(opts));
if (radixPos !== -1 && maskset.validPositions[radixPos]) {
if (maskset.validPositions[radixPos - 1]) {
return {
"caret": radixPos + 1
};
} else {
return {
"pos": integerValue.index,
c: integerValue[0],
"caret": radixPos + 1
};
}
} else if (!integerValue || (integerValue["0"] === "0" && (integerValue.index + 1) !== pos)) {
maskset.buffer[integerValue ? integerValue.index : pos] = "0";
return {
"pos": (integerValue ? integerValue.index : pos) + 1,
c: opts.radixPoint
};
}
}
}
return false;
},
leadingZeroHandler: function(chrs, maskset, pos, strict, opts) {
if (opts.numericInput === true) {
if (maskset.buffer[maskset.buffer.length - opts.prefix.length - 1] === "0") {
return {
"pos": pos,
"remove": maskset.buffer.length - opts.prefix.length - 1
};
}
} else {
var matchRslt = maskset.buffer.join("").match(opts.regex.integerNPart(opts)),
radixPosition = $.inArray(opts.radixPoint, maskset.buffer);
if (matchRslt && !strict && (radixPosition === -1 || pos <= radixPosition)) {
if (matchRslt["0"].indexOf("0") === 0) {
if (pos < opts.prefix.length) pos = matchRslt.index; //position
var _radixPosition = $.inArray(opts.radixPoint, maskset._buffer);
var digitsMatch = maskset._buffer && maskset.buffer.slice(radixPosition).join("") === maskset._buffer.slice(_radixPosition).join("") || parseInt(maskset.buffer.slice(radixPosition + 1).join("")) === 0;
var integerMatch = maskset._buffer && maskset.buffer.slice(matchRslt.index, radixPosition).join("") === maskset._buffer.slice(opts.prefix.length, _radixPosition).join("") || maskset.buffer.slice(matchRslt.index, radixPosition).join("") === "0";
if (radixPosition === -1 || digitsMatch && integerMatch) {
maskset.buffer.splice(matchRslt.index, 1);
pos = pos > matchRslt.index ? pos - 1 : matchRslt.index;
return {
"pos": pos,
"remove": matchRslt.index
};
} else if (matchRslt.index + 1 === pos || chrs === "0") {
maskset.buffer.splice(matchRslt.index, 1);
pos = matchRslt.index;
return {
"pos": pos,
"remove": matchRslt.index
};
}
} else if (chrs === "0" && pos <= matchRslt.index && matchRslt["0"] !== opts.groupSeparator) {
return false;
}
}
}
return true;
},
postValidation: function(buffer, currentResult, opts) {
//handle maxvalue
var isValid = true,
maskedValue = opts.numericInput ? buffer.slice().reverse().join("") : buffer.join(""),
processValue = maskedValue.replace(opts.prefix, "");
processValue = processValue.replace(opts.suffix, "");
processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "");
if (opts.radixPoint === ",") processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".");
//handle negation symbol
processValue = processValue.replace(new RegExp("^" + Inputmask.escapeRegex(opts.negationSymbol.front)), "-");
processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), "");
processValue = processValue === opts.negationSymbol.front ? processValue + "0" : processValue;
if (isFinite(processValue)) {
if (opts.max !== null && isFinite(opts.max)) {
processValue = parseFloat(processValue) > parseFloat(opts.max) ? opts.max : processValue;
isValid = opts.postFormat((opts.prefix + processValue).split(""), 0, true, opts);
}
if (opts.min !== null && isFinite(opts.min)) {
processValue = parseFloat(processValue) < parseFloat(opts.min) ? opts.min : processValue;
isValid = opts.postFormat((opts.prefix + processValue).split(""), 0, true, opts);
}
}
return isValid;
},
definitions: {
"~": {
validator: function(chrs, maskset, pos, strict, opts) {
var isValid = opts.signHandler(chrs, maskset, pos, strict, opts);
if (!isValid) {
isValid = opts.radixHandler(chrs, maskset, pos, strict, opts);
if (!isValid) {
isValid = strict ? new RegExp("[0-9" + Inputmask.escapeRegex(opts.groupSeparator) + "]").test(chrs) : new RegExp("[0-9]").test(chrs);
if (isValid === true) {
isValid = opts.leadingZeroHandler(chrs, maskset, pos, strict, opts);
if (isValid === true) {
//handle overwrite when fixed precision
var radixPosition = $.inArray(opts.radixPoint, maskset.buffer);
if (radixPosition !== -1 && opts.digitsOptional === false && opts.numericInput !== true && pos > radixPosition && !strict) {
isValid = {
"pos": pos,
"remove": pos
};
} else {
isValid = {
pos: pos
};
}
}
}
}
}
return isValid;
},
cardinality: 1,
prevalidator: null
},
"+": {
validator: function(chrs, maskset, pos, strict, opts) {
var isValid = opts.signHandler(chrs, maskset, pos, strict, opts);
if (!isValid && ((strict && opts.allowMinus && chrs === opts.negationSymbol.front) || (opts.allowMinus && chrs === "-") || (opts.allowPlus && chrs === "+"))) {
if (chrs === "-") {
if (opts.negationSymbol.back !== "") {
isValid = {
"pos": pos,
"c": chrs === "-" ? opts.negationSymbol.front : "+",
"caret": pos + 1,
"insert": {
"pos": maskset.buffer.length,
"c": opts.negationSymbol.back
}
};
} else {
isValid = {
"pos": pos,
"c": chrs === "-" ? opts.negationSymbol.front : "+",
"caret": pos + 1
};
}
} else {
isValid = true;
}
}
return isValid;
},
cardinality: 1,
prevalidator: null,
placeholder: ""
},
"-": {
validator: function(chrs, maskset, pos, strict, opts) {
var isValid = opts.signHandler(chrs, maskset, pos, strict, opts);
if (!isValid && strict && opts.allowMinus && chrs === opts.negationSymbol.back) {
isValid = true;
}
return isValid;
},
cardinality: 1,
prevalidator: null,
placeholder: ""
},
":": {
validator: function(chrs, maskset, pos, strict, opts) {
var isValid = opts.signHandler(chrs, maskset, pos, strict, opts);
if (!isValid) {
var radix = "[" + Inputmask.escapeRegex(opts.radixPoint) + ",\\." + "]";
isValid = new RegExp(radix).test(chrs);
if (isValid && maskset.validPositions[pos] && maskset.validPositions[pos].match.placeholder === opts.radixPoint) {
isValid = {
"caret": pos + 1
};
}
}
return isValid ? {
c: opts.radixPoint
} : isValid;
},
cardinality: 1,
prevalidator: null,
placeholder: function(opts) {
return opts.radixPoint;
}
}
},
onUnMask: function(maskedValue, unmaskedValue, opts) {
var processValue = maskedValue.replace(opts.prefix, "");
processValue = processValue.replace(opts.suffix, "");
processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "");
if (opts.unmaskAsNumber) {
if (opts.radixPoint !== "" && processValue.indexOf(opts.radixPoint) !== -1) processValue = processValue.replace(Inputmask.escapeRegex.call(this, opts.radixPoint), ".");
return Number(processValue);
}
return processValue;
},
isComplete: function(buffer, opts) {
var maskedValue = buffer.join(""),
bufClone = buffer.slice();
//verify separator positions
opts.postFormat(bufClone, 0, true, opts);
if (bufClone.join("") !== maskedValue) return false;
var processValue = maskedValue.replace(opts.prefix, "");
processValue = processValue.replace(opts.suffix, "");
processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "");
if (opts.radixPoint === ",") processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".");
return isFinite(processValue);
},
onBeforeMask: function(initialValue, opts) {
if (opts.radixPoint !== "" && isFinite(initialValue)) {
initialValue = initialValue.toString().replace(".", opts.radixPoint);
} else {
var kommaMatches = initialValue.match(/,/g);
var dotMatches = initialValue.match(/\./g);
if (dotMatches && kommaMatches) {
if (dotMatches.length > kommaMatches.length) {
initialValue = initialValue.replace(/\./g, "");
initialValue = initialValue.replace(",", opts.radixPoint);
} else if (kommaMatches.length > dotMatches.length) {
initialValue = initialValue.replace(/,/g, "");
initialValue = initialValue.replace(".", opts.radixPoint);
} else { //equal
initialValue = initialValue.indexOf(".") < initialValue.indexOf(",") ? initialValue.replace(/\./g, "") : initialValue = initialValue.replace(/,/g, "");
}
} else {
initialValue = initialValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "");
}
}
if (opts.digits === 0) {
if (initialValue.indexOf(".") !== -1) {
initialValue = initialValue.substring(0, initialValue.indexOf("."));
} else if (initialValue.indexOf(",") !== -1) {
initialValue = initialValue.substring(0, initialValue.indexOf(","));
}
}
if (opts.radixPoint !== "" && isFinite(opts.digits) && initialValue.indexOf(opts.radixPoint) !== -1) {
var valueParts = initialValue.split(opts.radixPoint),
decPart = valueParts[1].match(new RegExp("\\d*"))[0];
if (parseInt(opts.digits) < decPart.toString().length) {
var digitsFactor = Math.pow(10, parseInt(opts.digits));
//make the initialValue a valid javascript number for the parsefloat
initialValue = initialValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".");
initialValue = Math.round(parseFloat(initialValue) * digitsFactor) / digitsFactor;
initialValue = initialValue.toString().replace(".", opts.radixPoint);
}
}
return initialValue.toString();
},
canClearPosition: function(maskset, position, lvp, strict, opts) {
var positionInput = maskset.validPositions[position].input,
canClear = ((positionInput !== opts.radixPoint || (maskset.validPositions[position].match.fn !== null && opts.decimalProtect === false)) || isFinite(positionInput)) ||
position === lvp ||
positionInput === opts.groupSeparator ||
positionInput === opts.negationSymbol.front ||
positionInput === opts.negationSymbol.back;
if (canClear && isFinite(positionInput)) {
var matchRslt,
radixPos = $.inArray(opts.radixPoint, maskset.buffer);
//inject radixpoint
var radixInjection = false;
if (maskset.validPositions[radixPos] === undefined) {
maskset.validPositions[radixPos] = {
input: opts.radixPoint
};
radixInjection = true;
}
if (!strict && maskset.buffer) {
matchRslt = maskset.buffer.join("").substr(0, position).match(opts.regex.integerNPart(opts));
var pos = position + 1,
isNull = matchRslt == null || parseInt(matchRslt["0"].replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "")) === 0;
if (isNull) {
while (maskset.validPositions[pos] && (maskset.validPositions[pos].input === opts.groupSeparator || maskset.validPositions[pos].input === "0")) {
delete maskset.validPositions[pos];
pos++;
}
}
}
var buffer = [];
//build new buffer from validPositions
for (var vp in maskset.validPositions) {
if (maskset.validPositions[vp].input !== undefined) buffer.push(maskset.validPositions[vp].input);
}
//remove radix Injection
if (radixInjection) {
delete maskset.validPositions[radixPos];
}
if (radixPos > 0) {
var bufVal = buffer.join("");
matchRslt = bufVal.match(opts.regex.integerNPart(opts));
if (matchRslt) {
if (position <= radixPos) {
if (matchRslt["0"].indexOf("0") === 0) {
canClear = matchRslt.index !== position || opts.placeholder === "0";
} else {
var intPart = parseInt(matchRslt["0"].replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "")),
radixPart = parseInt(bufVal.split(opts.radixPoint)[1]);
if (intPart < 10 && maskset.validPositions[position] && (opts.placeholder !== "0" || radixPart > 0)) {
maskset.validPositions[position].input = "0";
maskset.p = opts.prefix.length + 1;
canClear = false;
}
}
} else if (matchRslt["0"].indexOf("0") === 0) {
if (bufVal.length === 3) {
maskset.validPositions = {};
canClear = false;
}
}
}
}
}
return canClear;
},
onKeyDown: function(e, buffer, caretPos, opts) {
var $input = $(this);
if (e.ctrlKey) {
switch (e.keyCode) {
case Inputmask.keyCode.UP:
$input.val(parseFloat(this.inputmask.unmaskedvalue()) + parseInt(opts.step));
$input.trigger("setvalue");
break;
case Inputmask.keyCode.DOWN:
$input.val(parseFloat(this.inputmask.unmaskedvalue()) - parseInt(opts.step));
$input.trigger("setvalue");
break;
}
}
}
},
"currency": {
prefix: "$ ",
groupSeparator: ",",
alias: "numeric",
placeholder: "0",
autoGroup: true,
digits: 2,
digitsOptional: false,
clearMaskOnLostFocus: false
},
"decimal": {
alias: "numeric"
},
"integer": {
alias: "numeric",
digits: 0,
radixPoint: ""
},
"percentage": {
alias: "numeric",
digits: 2,
radixPoint: ".",
placeholder: "0",
autoGroup: false,
min: 0,
max: 100,
suffix: " %",
allowPlus: false,
allowMinus: false
}
});
return Inputmask;
}));
/*
Input Mask plugin extensions
http://github.com/RobinHerbots/jquery.inputmask
Copyright (c) 2010 - Robin Herbots
Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
Version: 0.0.0-dev
Phone extension.
When using this extension make sure you specify the correct url to get the masks
$(selector).inputmask("phone", {
url: "Scripts/jquery.inputmask/phone-codes/phone-codes.json",
onKeyValidation: function () { //show some metadata in the console
console.log($(this).inputmask("getmetadata")["cd"]);
}
});
*/
(function(factory) {
if (typeof define === "function" && define.amd) {
define(["jquery", "inputmask"], factory);
} else if (typeof exports === "object") {
module.exports = factory(require("jquery"), require("./inputmask"));
} else {
factory(window.dependencyLib || jQuery, window.Inputmask);
}
}
(function($, Inputmask) {
Inputmask.extendAliases({
"phone": {
url: "phone-codes/phone-codes.js",
countrycode: "",
phoneCodeCache: {},
mask: function(opts) {
if (opts.phoneCodeCache[opts.url] === undefined) {
var maskList = [];
opts.definitions["#"] = opts.definitions["9"];
$.ajax({
url: opts.url,
async: false,
type: "get",
dataType: "json",
success: function(response) {
maskList = response;
},
error: function(xhr, ajaxOptions, thrownError) {
alert(thrownError + " - " + opts.url);
}
});
opts.phoneCodeCache[opts.url] = maskList.sort(function(a, b) {
return (a.mask || a) < (b.mask || b) ? -1 : 1;
});
}
return opts.phoneCodeCache[opts.url];
},
keepStatic: false,
nojumps: true,
nojumpsThreshold: 1,
onBeforeMask: function(value, opts) {
var processedValue = value.replace(/^0{1,2}/, "").replace(/[\s]/g, "");
if (processedValue.indexOf(opts.countrycode) > 1 || processedValue.indexOf(opts.countrycode) === -1) {
processedValue = "+" + opts.countrycode + processedValue;
}
return processedValue;
}
},
"phonebe": {
alias: "phone",
url: "phone-codes/phone-be.js",
countrycode: "32",
nojumpsThreshold: 4
}
});
return Inputmask;
}));
/*
Input Mask plugin extensions
http://github.com/RobinHerbots/jquery.inputmask
Copyright (c) 2010 - Robin Herbots
Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
Version: 0.0.0-dev
Regex extensions on the jquery.inputmask base
Allows for using regular expressions as a mask
*/
(function(factory) {
if (typeof define === "function" && define.amd) {
define(["inputmask.dependencyLib", "inputmask"], factory);
} else if (typeof exports === "object") {
module.exports = factory(require("./inputmask.dependencyLib.jquery"), require("./inputmask"));
} else {
factory(window.dependencyLib || jQuery, window.Inputmask);
}
}
(function($, Inputmask) {
Inputmask.extendAliases({ // $(selector).inputmask("Regex", { regex: "[0-9]*"}
"Regex": {
mask: "r",
greedy: false,
repeat: "*",
regex: null,
regexTokens: null,
//Thx to https://github.com/slevithan/regex-colorizer for the tokenizer regex
tokenizer: /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g,
quantifierFilter: /[0-9]+[^,]/,
isComplete: function(buffer, opts) {
return new RegExp(opts.regex).test(buffer.join(""));
},
definitions: {
"r": {
validator: function(chrs, maskset, pos, strict, opts) {
var cbuffer = maskset.buffer.slice(),
bufferStr,
regexPart = "",
isValid = false,
openGroupCount = 0,
groupToken;
function RegexToken(isGroup, isQuantifier) {
this.matches = [];
this.isGroup = isGroup || false;
this.isQuantifier = isQuantifier || false;
this.quantifier = {
min: 1,
max: 1
};
this.repeaterPart = undefined;
}
function analyseRegex() {
var currentToken = new RegexToken(),
match, m, opengroups = [];
opts.regexTokens = [];
// The tokenizer regex does most of the tokenization grunt work
while (match = opts.tokenizer.exec(opts.regex)) {
m = match[0];
switch (m.charAt(0)) {
case "(": // Group opening
opengroups.push(new RegexToken(true));
break;
case ")": // Group closing
groupToken = opengroups.pop();
if (opengroups.length > 0) {
opengroups[opengroups.length - 1].matches.push(groupToken);
} else {
currentToken.matches.push(groupToken);
}
break;
case "{":
case "+":
case "*": //Quantifier
var quantifierToken = new RegexToken(false, true);
m = m.replace(/[{}]/g, "");
var mq = m.split(","),
mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]),
mq1 = mq.length === 1 ? mq0 : (isNaN(mq[1]) ? mq[1] : parseInt(mq[1]));
quantifierToken.quantifier = {
min: mq0,
max: mq1
};
if (opengroups.length > 0) {
var matches = opengroups[opengroups.length - 1].matches;
match = matches.pop();
if (!match.isGroup) {
groupToken = new RegexToken(true);
groupToken.matches.push(match);
match = groupToken;
}
matches.push(match);
matches.push(quantifierToken);
} else {
match = currentToken.matches.pop();
if (!match.isGroup) {
groupToken = new RegexToken(true);
groupToken.matches.push(match);
match = groupToken;
}
currentToken.matches.push(match);
currentToken.matches.push(quantifierToken);
}
break;
default:
if (opengroups.length > 0) {
opengroups[opengroups.length - 1].matches.push(m);
} else {
currentToken.matches.push(m);
}
break;
}
}
if (currentToken.matches.length > 0) {
opts.regexTokens.push(currentToken);
}
}
function validateRegexToken(token, fromGroup) {
var isvalid = false;
if (fromGroup) {
regexPart += "(";
openGroupCount++;
}
for (var mndx = 0; mndx < token.matches.length; mndx++) {
var matchToken = token.matches[mndx];
if (matchToken.isGroup === true) {
isvalid = validateRegexToken(matchToken, true);
} else if (matchToken.isQuantifier === true) {
var crrntndx = $.inArray(matchToken, token.matches),
matchGroup = token.matches[crrntndx - 1];
var regexPartBak = regexPart;
if (isNaN(matchToken.quantifier.max)) {
while (matchToken.repeaterPart && matchToken.repeaterPart !== regexPart && matchToken.repeaterPart.length > regexPart.length) {
isvalid = validateRegexToken(matchGroup, true);
if (isvalid) break;
}
isvalid = isvalid || validateRegexToken(matchGroup, true);
if (isvalid) matchToken.repeaterPart = regexPart;
regexPart = regexPartBak + matchToken.quantifier.max;
} else {
for (var i = 0, qm = matchToken.quantifier.max - 1; i < qm; i++) {
isvalid = validateRegexToken(matchGroup, true);
if (isvalid) break;
}
regexPart = regexPartBak + "{" + matchToken.quantifier.min + "," + matchToken.quantifier.max + "}";
}
} else if (matchToken.matches !== undefined) {
for (var k = 0; k < matchToken.length; k++) {
isvalid = validateRegexToken(matchToken[k], fromGroup);
if (isvalid) break;
}
} else {
var testExp;
if (matchToken.charAt(0) == "[") {
testExp = regexPart;
testExp += matchToken;
for (var j = 0; j < openGroupCount; j++) {
testExp += ")";
}
var exp = new RegExp("^(" + testExp + ")$");
isvalid = exp.test(bufferStr);
} else {
for (var l = 0, tl = matchToken.length; l < tl; l++) {
if (matchToken.charAt(l) === "\\") continue;
testExp = regexPart;
testExp += matchToken.substr(0, l + 1);
testExp = testExp.replace(/\|$/, "");
for (var j = 0; j < openGroupCount; j++) {
testExp += ")";
}
var exp = new RegExp("^(" + testExp + ")$");
isvalid = exp.test(bufferStr);
if (isvalid) break;
}
}
regexPart += matchToken;
}
if (isvalid) break;
}
if (fromGroup) {
regexPart += ")";
openGroupCount--;
}
return isvalid;
}
if (opts.regexTokens === null) {
analyseRegex();
}
cbuffer.splice(pos, 0, chrs);
bufferStr = cbuffer.join("");
for (var i = 0; i < opts.regexTokens.length; i++) {
var regexToken = opts.regexTokens[i];
isValid = validateRegexToken(regexToken, regexToken.isGroup);
if (isValid) break;
}
return isValid;
},
cardinality: 1
}
}
}
});
return Inputmask;
}));
/*
* Input Mask plugin for jquery
* http://github.com/RobinHerbots/jquery.inputmask
* Copyright (c) 2010 - Robin Herbots
* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
* Version: 0.0.0-dev
*/
(function(factory) {
if (typeof define === "function" && define.amd) {
define(["jquery", "inputmask"], factory);
} else if (typeof exports === "object") {
module.exports = factory(require("jquery"), require("./inputmask"));
} else {
factory(jQuery, window.Inputmask);
}
}
(function($, Inputmask) {
if ($.fn.inputmask === undefined) {
//jquery plugin
$.fn.inputmask = function(fn, options) {
var nptmask, input = this[0];
options = options || {};
if (typeof fn === "string") {
switch (fn) {
case "unmaskedvalue":
return input && input.inputmask ? input.inputmask.unmaskedvalue() : $(input).val();
case "remove":
return this.each(function() {
if (this.inputmask) this.inputmask.remove();
});
case "getemptymask":
return input && input.inputmask ? input.inputmask.getemptymask() : "";
case "hasMaskedValue": //check wheter the returned value is masked or not; currently only works reliable when using jquery.val fn to retrieve the value
return input && input.inputmask ? input.inputmask.hasMaskedValue() : false;
case "isComplete":
return input && input.inputmask ? input.inputmask.isComplete() : true;
case "getmetadata": //return mask metadata if exists
return input && input.inputmask ? input.inputmask.getmetadata() : undefined;
case "setvalue":
$(input).val(options);
if (input && input.inputmask !== undefined) {
$(input).triggerHandler("setvalue");
}
break;
case "option":
if (typeof options === "string") {
if (input && input.inputmask !== undefined) {
return input.inputmask.option(options);
}
} else {
return this.each(function() {
if (this.inputmask !== undefined) {
return this.inputmask.option(options);
}
});
}
break;
default:
options.alias = fn;
nptmask = new Inputmask(options);
return this.each(function() {
nptmask.mask(this);
});
}
} else if (typeof fn == "object") {
nptmask = new Inputmask(fn);
if (fn.mask === undefined && fn.alias === undefined) {
return this.each(function() {
if (this.inputmask !== undefined) {
return this.inputmask.option(fn);
} else nptmask.mask(this);
});
} else {
return this.each(function() {
nptmask.mask(this);
});
}
} else if (fn === undefined) {
//look for data-inputmask atributes
return this.each(function() {
nptmask = new Inputmask(options);
nptmask.mask(this);
});
}
};
}
return $.fn.inputmask;
}));
[
{ "mask": "+32(53)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Aalst (Alost)" },
{ "mask": "+32(3)###-##-##", "cc": "BE", "cd": "Belgium", "city": "Antwerpen (Anvers)" },
{ "mask": "+32(63)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Arlon" },
{ "mask": "+32(67)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Ath" },
{ "mask": "+32(50)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Brugge (Bruges)" },
{ "mask": "+32(2)###-##-##", "cc": "BE", "cd": "Belgium", "city": "Brussel/Bruxelles (Brussels)" },
{ "mask": "+32(71)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Charleroi" },
{ "mask": "+32(60)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Chimay" },
{ "mask": "+32(83)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Ciney" },
{ "mask": "+32(52)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Dendermonde" },
{ "mask": "+32(13)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Diest" },
{ "mask": "+32(82)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Dinant" },
{ "mask": "+32(86)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Durbuy" },
{ "mask": "+32(89)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Genk" },
{ "mask": "+32(9)###-##-##", "cc": "BE", "cd": "Belgium", "city": "Gent (Gand)" },
{ "mask": "+32(11)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Hasselt" },
{ "mask": "+32(14)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Herentals" },
{ "mask": "+32(85)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Huy (Hoei)" },
{ "mask": "+32(64)##-##-##", "cc": "BE", "cd": "Belgium", "city": "La Louvière" },
{ "mask": "+32(16)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Leuven (Louvain)" },
{ "mask": "+32(61)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Libramont" },
{ "mask": "+32(4)###-##-##", "cc": "BE", "cd": "Belgium", "city": "Liège (Luik)" },
{ "mask": "+32(15)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Mechelen (Malines)" },
{ "mask": "+32(46#)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Mobile Phones" },
{ "mask": "+32(47#)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Mobile Phones" },
{ "mask": "+32(48#)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Mobile Phones" },
{ "mask": "+32(49#)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Mobile Phones" },
{ "mask": "+32(461)8#-##-##", "cc": "BE", "cd": "Belgium", "city": "GSM-R (NMBS)" },
{ "mask": "+32(65)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Mons (Bergen)" },
{ "mask": "+32(81)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Namur (Namen)" },
{ "mask": "+32(58)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Nieuwpoort (Nieuport)" },
{ "mask": "+32(54)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Ninove" },
{ "mask": "+32(67)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Nivelles (Nijvel)" },
{ "mask": "+32(59)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Oostende (Ostende)" },
{ "mask": "+32(51)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Roeselare (Roulers)" },
{ "mask": "+32(55)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Ronse" },
{ "mask": "+32(80)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Stavelot" },
{ "mask": "+32(12)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Tongeren (Tongres)" },
{ "mask": "+32(69)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Tounai" },
{ "mask": "+32(14)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Turnhout" },
{ "mask": "+32(87)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Verviers" },
{ "mask": "+32(58)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Veurne" },
{ "mask": "+32(19)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Wareme" },
{ "mask": "+32(10)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Wavre (Waver)" },
{ "mask": "+32(50)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Zeebrugge" }
]
[
{ "mask": "+247-####", "cc": "AC", "cd": "Ascension", "desc_en": "", "name_ru": "Остров Вознесения", "desc_ru": "" },
{ "mask": "+376-###-###", "cc": "AD", "cd": "Andorra", "desc_en": "", "name_ru": "Андорра", "desc_ru": "" },
{ "mask": "+971-5#-###-####", "cc": "AE", "cd": "United Arab Emirates", "desc_en": "mobile", "name_ru": "Объединенные Арабские Эмираты", "desc_ru": "мобильные" },
{ "mask": "+971-#-###-####", "cc": "AE", "cd": "United Arab Emirates", "desc_en": "", "name_ru": "Объединенные Арабские Эмираты", "desc_ru": "" },
{ "mask": "+93-##-###-####", "cc": "AF", "cd": "Afghanistan", "desc_en": "", "name_ru": "Афганистан", "desc_ru": "" },
{ "mask": "+1(268)###-####", "cc": "AG", "cd": "Antigua & Barbuda", "desc_en": "", "name_ru": "Антигуа и Барбуда", "desc_ru": "" },
{ "mask": "+1(264)###-####", "cc": "AI", "cd": "Anguilla", "desc_en": "", "name_ru": "Ангилья", "desc_ru": "" },
{ "mask": "+355(###)###-###", "cc": "AL", "cd": "Albania", "desc_en": "", "name_ru": "Албания", "desc_ru": "" },
{ "mask": "+374-##-###-###", "cc": "AM", "cd": "Armenia", "desc_en": "", "name_ru": "Армения", "desc_ru": "" },
{ "mask": "+599-###-####", "cc": "AN", "cd": "Caribbean Netherlands", "desc_en": "", "name_ru": "Карибские Нидерланды", "desc_ru": "" },
{ "mask": "+599-###-####", "cc": "AN", "cd": "Netherlands Antilles", "desc_en": "", "name_ru": "Нидерландские Антильские острова", "desc_ru": "" },
{ "mask": "+599-9###-####", "cc": "AN", "cd": "Netherlands Antilles", "desc_en": "Curacao", "name_ru": "Нидерландские Антильские острова", "desc_ru": "Кюрасао" },
{ "mask": "+244(###)###-###", "cc": "AO", "cd": "Angola", "desc_en": "", "name_ru": "Ангола", "desc_ru": "" },
{ "mask": "+672-1##-###", "cc": "AQ", "cd": "Australian bases in Antarctica", "desc_en": "", "name_ru": "Австралийская антарктическая база", "desc_ru": "" },
{ "mask": "+54(###)###-####", "cc": "AR", "cd": "Argentina", "desc_en": "", "name_ru": "Аргентина", "desc_ru": "" },
{ "mask": "+1(684)###-####", "cc": "AS", "cd": "American Samoa", "desc_en": "", "name_ru": "Американское Самоа", "desc_ru": "" },
{ "mask": "+43(###)###-####", "cc": "AT", "cd": "Austria", "desc_en": "", "name_ru": "Австрия", "desc_ru": "" },
{ "mask": "+61-#-####-####", "cc": "AU", "cd": "Australia", "desc_en": "", "name_ru": "Австралия", "desc_ru": "" },
{ "mask": "+297-###-####", "cc": "AW", "cd": "Aruba", "desc_en": "", "name_ru": "Аруба", "desc_ru": "" },
{ "mask": "+994-##-###-##-##", "cc": "AZ", "cd": "Azerbaijan", "desc_en": "", "name_ru": "Азербайджан", "desc_ru": "" },
{ "mask": "+387-##-#####", "cc": "BA", "cd": "Bosnia and Herzegovina", "desc_en": "", "name_ru": "Босния и Герцеговина", "desc_ru": "" },
{ "mask": "+387-##-####", "cc": "BA", "cd": "Bosnia and Herzegovina", "desc_en": "", "name_ru": "Босния и Герцеговина", "desc_ru": "" },
{ "mask": "+1(246)###-####", "cc": "BB", "cd": "Barbados", "desc_en": "", "name_ru": "Барбадос", "desc_ru": "" },
{ "mask": "+880-##-###-###", "cc": "BD", "cd": "Bangladesh", "desc_en": "", "name_ru": "Бангладеш", "desc_ru": "" },
{ "mask": "+32(###)###-###", "cc": "BE", "cd": "Belgium", "desc_en": "", "name_ru": "Бельгия", "desc_ru": "" },
{ "mask": "+226-##-##-####", "cc": "BF", "cd": "Burkina Faso", "desc_en": "", "name_ru": "Буркина Фасо", "desc_ru": "" },
{ "mask": "+359(###)###-###", "cc": "BG", "cd": "Bulgaria", "desc_en": "", "name_ru": "Болгария", "desc_ru": "" },
{ "mask": "+973-####-####", "cc": "BH", "cd": "Bahrain", "desc_en": "", "name_ru": "Бахрейн", "desc_ru": "" },
{ "mask": "+257-##-##-####", "cc": "BI", "cd": "Burundi", "desc_en": "", "name_ru": "Бурунди", "desc_ru": "" },
{ "mask": "+229-##-##-####", "cc": "BJ", "cd": "Benin", "desc_en": "", "name_ru": "Бенин", "desc_ru": "" },
{ "mask": "+1(441)###-####", "cc": "BM", "cd": "Bermuda", "desc_en": "", "name_ru": "Бермудские острова", "desc_ru": "" },
{ "mask": "+673-###-####", "cc": "BN", "cd": "Brunei Darussalam", "desc_en": "", "name_ru": "Бруней-Даруссалам", "desc_ru": "" },
{ "mask": "+591-#-###-####", "cc": "BO", "cd": "Bolivia", "desc_en": "", "name_ru": "Боливия", "desc_ru": "" },
{ "mask": "+55-##-####[#]-####", "cc": "BR", "cd": "Brazil", "desc_en": "", "name_ru": "Бразилия", "desc_ru": "" },
{ "mask": "+1(242)###-####", "cc": "BS", "cd": "Bahamas", "desc_en": "", "name_ru": "Багамские Острова", "desc_ru": "" },
{ "mask": "+975-17-###-###", "cc": "BT", "cd": "Bhutan", "desc_en": "", "name_ru": "Бутан", "desc_ru": "" },
{ "mask": "+975-#-###-###", "cc": "BT", "cd": "Bhutan", "desc_en": "", "name_ru": "Бутан", "desc_ru": "" },
{ "mask": "+267-##-###-###", "cc": "BW", "cd": "Botswana", "desc_en": "", "name_ru": "Ботсвана", "desc_ru": "" },
{ "mask": "+375(##)###-##-##", "cc": "BY", "cd": "Belarus", "desc_en": "", "name_ru": "Беларусь (Белоруссия)", "desc_ru": "" },
{ "mask": "+501-###-####", "cc": "BZ", "cd": "Belize", "desc_en": "", "name_ru": "Белиз", "desc_ru": "" },
{ "mask": "+243(###)###-###", "cc": "CD", "cd": "Dem. Rep. Congo", "desc_en": "", "name_ru": "Дем. Респ. Конго (Киншаса)", "desc_ru": "" },
{ "mask": "+236-##-##-####", "cc": "CF", "cd": "Central African Republic", "desc_en": "", "name_ru": "Центральноафриканская Республика", "desc_ru": "" },
{ "mask": "+242-##-###-####", "cc": "CG", "cd": "Congo (Brazzaville)", "desc_en": "", "name_ru": "Конго (Браззавиль)", "desc_ru": "" },
{ "mask": "+41-##-###-####", "cc": "CH", "cd": "Switzerland", "desc_en": "", "name_ru": "Швейцария", "desc_ru": "" },
{ "mask": "+225-##-###-###", "cc": "CI", "cd": "Cote d’Ivoire (Ivory Coast)", "desc_en": "", "name_ru": "Кот-д’Ивуар", "desc_ru": "" },
{ "mask": "+682-##-###", "cc": "CK", "cd": "Cook Islands", "desc_en": "", "name_ru": "Острова Кука", "desc_ru": "" },
{ "mask": "+56-#-####-####", "cc": "CL", "cd": "Chile", "desc_en": "", "name_ru": "Чили", "desc_ru": "" },
{ "mask": "+237-####-####", "cc": "CM", "cd": "Cameroon", "desc_en": "", "name_ru": "Камерун", "desc_ru": "" },
{ "mask": "+86(###)####-####", "cc": "CN", "cd": "China (PRC)", "desc_en": "", "name_ru": "Китайская Н.Р.", "desc_ru": "" },
{ "mask": "+86(###)####-###", "cc": "CN", "cd": "China (PRC)", "desc_en": "", "name_ru": "Китайская Н.Р.", "desc_ru": "" },
{ "mask": "+86-##-#####-#####", "cc": "CN", "cd": "China (PRC)", "desc_en": "", "name_ru": "Китайская Н.Р.", "desc_ru": "" },
{ "mask": "+57(###)###-####", "cc": "CO", "cd": "Colombia", "desc_en": "", "name_ru": "Колумбия", "desc_ru": "" },
{ "mask": "+506-####-####", "cc": "CR", "cd": "Costa Rica", "desc_en": "", "name_ru": "Коста-Рика", "desc_ru": "" },
{ "mask": "+53-#-###-####", "cc": "CU", "cd": "Cuba", "desc_en": "", "name_ru": "Куба", "desc_ru": "" },
{ "mask": "+238(###)##-##", "cc": "CV", "cd": "Cape Verde", "desc_en": "", "name_ru": "Кабо-Верде", "desc_ru": "" },
{ "mask": "+599-###-####", "cc": "CW", "cd": "Curacao", "desc_en": "", "name_ru": "Кюрасао", "desc_ru": "" },
{ "mask": "+357-##-###-###", "cc": "CY", "cd": "Cyprus", "desc_en": "", "name_ru": "Кипр", "desc_ru": "" },
{ "mask": "+420(###)###-###", "cc": "CZ", "cd": "Czech Republic", "desc_en": "", "name_ru": "Чехия", "desc_ru": "" },
{ "mask": "+49(####)###-####", "cc": "DE", "cd": "Germany", "desc_en": "", "name_ru": "Германия", "desc_ru": "" },
{ "mask": "+49(###)###-####", "cc": "DE", "cd": "Germany", "desc_en": "", "name_ru": "Германия", "desc_ru": "" },
{ "mask": "+49(###)##-####", "cc": "DE", "cd": "Germany", "desc_en": "", "name_ru": "Германия", "desc_ru": "" },
{ "mask": "+49(###)##-###", "cc": "DE", "cd": "Germany", "desc_en": "", "name_ru": "Германия", "desc_ru": "" },
{ "mask": "+49(###)##-##", "cc": "DE", "cd": "Germany", "desc_en": "", "name_ru": "Германия", "desc_ru": "" },
{ "mask": "+49-###-###", "cc": "DE", "cd": "Germany", "desc_en": "", "name_ru": "Германия", "desc_ru": "" },
{ "mask": "+253-##-##-##-##", "cc": "DJ", "cd": "Djibouti", "desc_en": "", "name_ru": "Джибути", "desc_ru": "" },
{ "mask": "+45-##-##-##-##", "cc": "DK", "cd": "Denmark", "desc_en": "", "name_ru": "Дания", "desc_ru": "" },
{ "mask": "+1(767)###-####", "cc": "DM", "cd": "Dominica", "desc_en": "", "name_ru": "Доминика", "desc_ru": "" },
{ "mask": "+1(809)###-####", "cc": "DO", "cd": "Dominican Republic", "desc_en": "", "name_ru": "Доминиканская Республика", "desc_ru": "" },
{ "mask": "+1(829)###-####", "cc": "DO", "cd": "Dominican Republic", "desc_en": "", "name_ru": "Доминиканская Республика", "desc_ru": "" },
{ "mask": "+1(849)###-####", "cc": "DO", "cd": "Dominican Republic", "desc_en": "", "name_ru": "Доминиканская Республика", "desc_ru": "" },
{ "mask": "+213-##-###-####", "cc": "DZ", "cd": "Algeria", "desc_en": "", "name_ru": "Алжир", "desc_ru": "" },
{ "mask": "+593-##-###-####", "cc": "EC", "cd": "Ecuador ", "desc_en": "mobile", "name_ru": "Эквадор ", "desc_ru": "мобильные" },
{ "mask": "+593-#-###-####", "cc": "EC", "cd": "Ecuador", "desc_en": "", "name_ru": "Эквадор", "desc_ru": "" },
{ "mask": "+372-####-####", "cc": "EE", "cd": "Estonia ", "desc_en": "mobile", "name_ru": "Эстония ", "desc_ru": "мобильные" },
{ "mask": "+372-###-####", "cc": "EE", "cd": "Estonia", "desc_en": "", "name_ru": "Эстония", "desc_ru": "" },
{ "mask": "+20(###)###-####", "cc": "EG", "cd": "Egypt", "desc_en": "", "name_ru": "Египет", "desc_ru": "" },
{ "mask": "+291-#-###-###", "cc": "ER", "cd": "Eritrea", "desc_en": "", "name_ru": "Эритрея", "desc_ru": "" },
{ "mask": "+34(###)###-###", "cc": "ES", "cd": "Spain", "desc_en": "", "name_ru": "Испания", "desc_ru": "" },
{ "mask": "+251-##-###-####", "cc": "ET", "cd": "Ethiopia", "desc_en": "", "name_ru": "Эфиопия", "desc_ru": "" },
{ "mask": "+358(###)###-##-##", "cc": "FI", "cd": "Finland", "desc_en": "", "name_ru": "Финляндия", "desc_ru": "" },
{ "mask": "+679-##-#####", "cc": "FJ", "cd": "Fiji", "desc_en": "", "name_ru": "Фиджи", "desc_ru": "" },
{ "mask": "+500-#####", "cc": "FK", "cd": "Falkland Islands", "desc_en": "", "name_ru": "Фолклендские острова", "desc_ru": "" },
{ "mask": "+691-###-####", "cc": "FM", "cd": "F.S. Micronesia", "desc_en": "", "name_ru": "Ф.Ш. Микронезии", "desc_ru": "" },
{ "mask": "+298-###-###", "cc": "FO", "cd": "Faroe Islands", "desc_en": "", "name_ru": "Фарерские острова", "desc_ru": "" },
{ "mask": "+262-#####-####", "cc": "FR", "cd": "Mayotte", "desc_en": "", "name_ru": "Майотта", "desc_ru": "" },
{ "mask": "+33(###)###-###", "cc": "FR", "cd": "France", "desc_en": "", "name_ru": "Франция", "desc_ru": "" },
{ "mask": "+508-##-####", "cc": "FR", "cd": "St Pierre & Miquelon", "desc_en": "", "name_ru": "Сен-Пьер и Микелон", "desc_ru": "" },
{ "mask": "+590(###)###-###", "cc": "FR", "cd": "Guadeloupe", "desc_en": "", "name_ru": "Гваделупа", "desc_ru": "" },
{ "mask": "+241-#-##-##-##", "cc": "GA", "cd": "Gabon", "desc_en": "", "name_ru": "Габон", "desc_ru": "" },
{ "mask": "+1(473)###-####", "cc": "GD", "cd": "Grenada", "desc_en": "", "name_ru": "Гренада", "desc_ru": "" },
{ "mask": "+995(###)###-###", "cc": "GE", "cd": "Rep. of Georgia", "desc_en": "", "name_ru": "Грузия", "desc_ru": "" },
{ "mask": "+594-#####-####", "cc": "GF", "cd": "Guiana (French)", "desc_en": "", "name_ru": "Фр. Гвиана", "desc_ru": "" },
{ "mask": "+233(###)###-###", "cc": "GH", "cd": "Ghana", "desc_en": "", "name_ru": "Гана", "desc_ru": "" },
{ "mask": "+350-###-#####", "cc": "GI", "cd": "Gibraltar", "desc_en": "", "name_ru": "Гибралтар", "desc_ru": "" },
{ "mask": "+299-##-##-##", "cc": "GL", "cd": "Greenland", "desc_en": "", "name_ru": "Гренландия", "desc_ru": "" },
{ "mask": "+220(###)##-##", "cc": "GM", "cd": "Gambia", "desc_en": "", "name_ru": "Гамбия", "desc_ru": "" },
{ "mask": "+224-##-###-###", "cc": "GN", "cd": "Guinea", "desc_en": "", "name_ru": "Гвинея", "desc_ru": "" },
{ "mask": "+240-##-###-####", "cc": "GQ", "cd": "Equatorial Guinea", "desc_en": "", "name_ru": "Экваториальная Гвинея", "desc_ru": "" },
{ "mask": "+30(###)###-####", "cc": "GR", "cd": "Greece", "desc_en": "", "name_ru": "Греция", "desc_ru": "" },
{ "mask": "+502-#-###-####", "cc": "GT", "cd": "Guatemala", "desc_en": "", "name_ru": "Гватемала", "desc_ru": "" },
{ "mask": "+1(671)###-####", "cc": "GU", "cd": "Guam", "desc_en": "", "name_ru": "Гуам", "desc_ru": "" },
{ "mask": "+245-#-######", "cc": "GW", "cd": "Guinea-Bissau", "desc_en": "", "name_ru": "Гвинея-Бисау", "desc_ru": "" },
{ "mask": "+592-###-####", "cc": "GY", "cd": "Guyana", "desc_en": "", "name_ru": "Гайана", "desc_ru": "" },
{ "mask": "+852-####-####", "cc": "HK", "cd": "Hong Kong", "desc_en": "", "name_ru": "Гонконг", "desc_ru": "" },
{ "mask": "+504-####-####", "cc": "HN", "cd": "Honduras", "desc_en": "", "name_ru": "Гондурас", "desc_ru": "" },
{ "mask": "+385-##-###-###", "cc": "HR", "cd": "Croatia", "desc_en": "", "name_ru": "Хорватия", "desc_ru": "" },
{ "mask": "+509-##-##-####", "cc": "HT", "cd": "Haiti", "desc_en": "", "name_ru": "Гаити", "desc_ru": "" },
{ "mask": "+36(###)###-###", "cc": "HU", "cd": "Hungary", "desc_en": "", "name_ru": "Венгрия", "desc_ru": "" },
{ "mask": "+62(8##)###-####", "cc": "ID", "cd": "Indonesia ", "desc_en": "mobile", "name_ru": "Индонезия ", "desc_ru": "мобильные" },
{ "mask": "+62-##-###-##", "cc": "ID", "cd": "Indonesia", "desc_en": "", "name_ru": "Индонезия", "desc_ru": "" },
{ "mask": "+62-##-###-###", "cc": "ID", "cd": "Indonesia", "desc_en": "", "name_ru": "Индонезия", "desc_ru": "" },
{ "mask": "+62-##-###-####", "cc": "ID", "cd": "Indonesia", "desc_en": "", "name_ru": "Индонезия", "desc_ru": "" },
{ "mask": "+62(8##)###-###", "cc": "ID", "cd": "Indonesia ", "desc_en": "mobile", "name_ru": "Индонезия ", "desc_ru": "мобильные" },
{ "mask": "+62(8##)###-##-###", "cc": "ID", "cd": "Indonesia ", "desc_en": "mobile", "name_ru": "Индонезия ", "desc_ru": "мобильные" },
{ "mask": "+353(###)###-###", "cc": "IE", "cd": "Ireland", "desc_en": "", "name_ru": "Ирландия", "desc_ru": "" },
{ "mask": "+972-5#-###-####", "cc": "IL", "cd": "Israel ", "desc_en": "mobile", "name_ru": "Израиль ", "desc_ru": "мобильные" },
{ "mask": "+972-#-###-####", "cc": "IL", "cd": "Israel", "desc_en": "", "name_ru": "Израиль", "desc_ru": "" },
{ "mask": "+91(####)###-###", "cc": "IN", "cd": "India", "desc_en": "", "name_ru": "Индия", "desc_ru": "" },
{ "mask": "+246-###-####", "cc": "IO", "cd": "Diego Garcia", "desc_en": "", "name_ru": "Диего-Гарсия", "desc_ru": "" },
{ "mask": "+964(###)###-####", "cc": "IQ", "cd": "Iraq", "desc_en": "", "name_ru": "Ирак", "desc_ru": "" },
{ "mask": "+98(###)###-####", "cc": "IR", "cd": "Iran", "desc_en": "", "name_ru": "Иран", "desc_ru": "" },
{ "mask": "+354-###-####", "cc": "IS", "cd": "Iceland", "desc_en": "", "name_ru": "Исландия", "desc_ru": "" },
{ "mask": "+39(###)####-###", "cc": "IT", "cd": "Italy", "desc_en": "", "name_ru": "Италия", "desc_ru": "" },
{ "mask": "+1(876)###-####", "cc": "JM", "cd": "Jamaica", "desc_en": "", "name_ru": "Ямайка", "desc_ru": "" },
{ "mask": "+962-#-####-####", "cc": "JO", "cd": "Jordan", "desc_en": "", "name_ru": "Иордания", "desc_ru": "" },
{ "mask": "+81-##-####-####", "cc": "JP", "cd": "Japan ", "desc_en": "mobile", "name_ru": "Япония ", "desc_ru": "мобильные" },
{ "mask": "+81(###)###-###", "cc": "JP", "cd": "Japan", "desc_en": "", "name_ru": "Япония", "desc_ru": "" },
{ "mask": "+254-###-######", "cc": "KE", "cd": "Kenya", "desc_en": "", "name_ru": "Кения", "desc_ru": "" },
{ "mask": "+996(###)###-###", "cc": "KG", "cd": "Kyrgyzstan", "desc_en": "", "name_ru": "Киргизия", "desc_ru": "" },
{ "mask": "+855-##-###-###", "cc": "KH", "cd": "Cambodia", "desc_en": "", "name_ru": "Камбоджа", "desc_ru": "" },
{ "mask": "+686-##-###", "cc": "KI", "cd": "Kiribati", "desc_en": "", "name_ru": "Кирибати", "desc_ru": "" },
{ "mask": "+269-##-#####", "cc": "KM", "cd": "Comoros", "desc_en": "", "name_ru": "Коморы", "desc_ru": "" },
{ "mask": "+1(869)###-####", "cc": "KN", "cd": "Saint Kitts & Nevis", "desc_en": "", "name_ru": "Сент-Китс и Невис", "desc_ru": "" },
{ "mask": "+850-191-###-####", "cc": "KP", "cd": "DPR Korea (North) ", "desc_en": "mobile", "name_ru": "Корейская НДР ", "desc_ru": "мобильные" },
{ "mask": "+850-##-###-###", "cc": "KP", "cd": "DPR Korea (North)", "desc_en": "", "name_ru": "Корейская НДР", "desc_ru": "" },
{ "mask": "+850-###-####-###", "cc": "KP", "cd": "DPR Korea (North)", "desc_en": "", "name_ru": "Корейская НДР", "desc_ru": "" },
{ "mask": "+850-###-###", "cc": "KP", "cd": "DPR Korea (North)", "desc_en": "", "name_ru": "Корейская НДР", "desc_ru": "" },
{ "mask": "+850-####-####", "cc": "KP", "cd": "DPR Korea (North)", "desc_en": "", "name_ru": "Корейская НДР", "desc_ru": "" },
{ "mask": "+850-####-#############", "cc": "KP", "cd": "DPR Korea (North)", "desc_en": "", "name_ru": "Корейская НДР", "desc_ru": "" },
{ "mask": "+82-##-###-####", "cc": "KR", "cd": "Korea (South)", "desc_en": "", "name_ru": "Респ. Корея", "desc_ru": "" },
{ "mask": "+965-####-####", "cc": "KW", "cd": "Kuwait", "desc_en": "", "name_ru": "Кувейт", "desc_ru": "" },
{ "mask": "+1(345)###-####", "cc": "KY", "cd": "Cayman Islands", "desc_en": "", "name_ru": "Каймановы острова", "desc_ru": "" },
{ "mask": "+7(6##)###-##-##", "cc": "KZ", "cd": "Kazakhstan", "desc_en": "", "name_ru": "Казахстан", "desc_ru": "" },
{ "mask": "+7(7##)###-##-##", "cc": "KZ", "cd": "Kazakhstan", "desc_en": "", "name_ru": "Казахстан", "desc_ru": "" },
{ "mask": "+856(20##)###-###", "cc": "LA", "cd": "Laos ", "desc_en": "mobile", "name_ru": "Лаос ", "desc_ru": "мобильные" },
{ "mask": "+856-##-###-###", "cc": "LA", "cd": "Laos", "desc_en": "", "name_ru": "Лаос", "desc_ru": "" },
{ "mask": "+961-##-###-###", "cc": "LB", "cd": "Lebanon ", "desc_en": "mobile", "name_ru": "Ливан ", "desc_ru": "мобильные" },
{ "mask": "+961-#-###-###", "cc": "LB", "cd": "Lebanon", "desc_en": "", "name_ru": "Ливан", "desc_ru": "" },
{ "mask": "+1(758)###-####", "cc": "LC", "cd": "Saint Lucia", "desc_en": "", "name_ru": "Сент-Люсия", "desc_ru": "" },
{ "mask": "+423(###)###-####", "cc": "LI", "cd": "Liechtenstein", "desc_en": "", "name_ru": "Лихтенштейн", "desc_ru": "" },
{ "mask": "+94-##-###-####", "cc": "LK", "cd": "Sri Lanka", "desc_en": "", "name_ru": "Шри-Ланка", "desc_ru": "" },
{ "mask": "+231-##-###-###", "cc": "LR", "cd": "Liberia", "desc_en": "", "name_ru": "Либерия", "desc_ru": "" },
{ "mask": "+266-#-###-####", "cc": "LS", "cd": "Lesotho", "desc_en": "", "name_ru": "Лесото", "desc_ru": "" },
{ "mask": "+370(###)##-###", "cc": "LT", "cd": "Lithuania", "desc_en": "", "name_ru": "Литва", "desc_ru": "" },
{ "mask": "+352(###)###-###", "cc": "LU", "cd": "Luxembourg", "desc_en": "", "name_ru": "Люксембург", "desc_ru": "" },
{ "mask": "+371-##-###-###", "cc": "LV", "cd": "Latvia", "desc_en": "", "name_ru": "Латвия", "desc_ru": "" },
{ "mask": "+218-##-###-###", "cc": "LY", "cd": "Libya", "desc_en": "", "name_ru": "Ливия", "desc_ru": "" },
{ "mask": "+218-21-###-####", "cc": "LY", "cd": "Libya", "desc_en": "Tripoli", "name_ru": "Ливия", "desc_ru": "Триполи" },
{ "mask": "+212-##-####-###", "cc": "MA", "cd": "Morocco", "desc_en": "", "name_ru": "Марокко", "desc_ru": "" },
{ "mask": "+377(###)###-###", "cc": "MC", "cd": "Monaco", "desc_en": "", "name_ru": "Монако", "desc_ru": "" },
{ "mask": "+377-##-###-###", "cc": "MC", "cd": "Monaco", "desc_en": "", "name_ru": "Монако", "desc_ru": "" },
{ "mask": "+373-####-####", "cc": "MD", "cd": "Moldova", "desc_en": "", "name_ru": "Молдова", "desc_ru": "" },
{ "mask": "+382-##-###-###", "cc": "ME", "cd": "Montenegro", "desc_en": "", "name_ru": "Черногория", "desc_ru": "" },
{ "mask": "+261-##-##-#####", "cc": "MG", "cd": "Madagascar", "desc_en": "", "name_ru": "Мадагаскар", "desc_ru": "" },
{ "mask": "+692-###-####", "cc": "MH", "cd": "Marshall Islands", "desc_en": "", "name_ru": "Маршалловы Острова", "desc_ru": "" },
{ "mask": "+389-##-###-###", "cc": "MK", "cd": "Republic of Macedonia", "desc_en": "", "name_ru": "Респ. Македония", "desc_ru": "" },
{ "mask": "+223-##-##-####", "cc": "ML", "cd": "Mali", "desc_en": "", "name_ru": "Мали", "desc_ru": "" },
{ "mask": "+95-##-###-###", "cc": "MM", "cd": "Burma (Myanmar)", "desc_en": "", "name_ru": "Бирма (Мьянма)", "desc_ru": "" },
{ "mask": "+95-#-###-###", "cc": "MM", "cd": "Burma (Myanmar)", "desc_en": "", "name_ru": "Бирма (Мьянма)", "desc_ru": "" },
{ "mask": "+95-###-###", "cc": "MM", "cd": "Burma (Myanmar)", "desc_en": "", "name_ru": "Бирма (Мьянма)", "desc_ru": "" },
{ "mask": "+976-##-##-####", "cc": "MN", "cd": "Mongolia", "desc_en": "", "name_ru": "Монголия", "desc_ru": "" },
{ "mask": "+853-####-####", "cc": "MO", "cd": "Macau", "desc_en": "", "name_ru": "Макао", "desc_ru": "" },
{ "mask": "+1(670)###-####", "cc": "MP", "cd": "Northern Mariana Islands", "desc_en": "", "name_ru": "Северные Марианские острова Сайпан", "desc_ru": "" },
{ "mask": "+596(###)##-##-##", "cc": "MQ", "cd": "Martinique", "desc_en": "", "name_ru": "Мартиника", "desc_ru": "" },
{ "mask": "+222-##-##-####", "cc": "MR", "cd": "Mauritania", "desc_en": "", "name_ru": "Мавритания", "desc_ru": "" },
{ "mask": "+1(664)###-####", "cc": "MS", "cd": "Montserrat", "desc_en": "", "name_ru": "Монтсеррат", "desc_ru": "" },
{ "mask": "+356-####-####", "cc": "MT", "cd": "Malta", "desc_en": "", "name_ru": "Мальта", "desc_ru": "" },
{ "mask": "+230-###-####", "cc": "MU", "cd": "Mauritius", "desc_en": "", "name_ru": "Маврикий", "desc_ru": "" },
{ "mask": "+960-###-####", "cc": "MV", "cd": "Maldives", "desc_en": "", "name_ru": "Мальдивские острова", "desc_ru": "" },
{ "mask": "+265-1-###-###", "cc": "MW", "cd": "Malawi", "desc_en": "Telecom Ltd", "name_ru": "Малави", "desc_ru": "Telecom Ltd" },
{ "mask": "+265-#-####-####", "cc": "MW", "cd": "Malawi", "desc_en": "", "name_ru": "Малави", "desc_ru": "" },
{ "mask": "+52(###)###-####", "cc": "MX", "cd": "Mexico", "desc_en": "", "name_ru": "Мексика", "desc_ru": "" },
{ "mask": "+52-##-##-####", "cc": "MX", "cd": "Mexico", "desc_en": "", "name_ru": "Мексика", "desc_ru": "" },
{ "mask": "+60-##-###-####", "cc": "MY", "cd": "Malaysia ", "desc_en": "mobile", "name_ru": "Малайзия ", "desc_ru": "мобильные" },
{ "mask": "+60(###)###-###", "cc": "MY", "cd": "Malaysia", "desc_en": "", "name_ru": "Малайзия", "desc_ru": "" },
{ "mask": "+60-##-###-###", "cc": "MY", "cd": "Malaysia", "desc_en": "", "name_ru": "Малайзия", "desc_ru": "" },
{ "mask": "+60-#-###-###", "cc": "MY", "cd": "Malaysia", "desc_en": "", "name_ru": "Малайзия", "desc_ru": "" },
{ "mask": "+258-##-###-###", "cc": "MZ", "cd": "Mozambique", "desc_en": "", "name_ru": "Мозамбик", "desc_ru": "" },
{ "mask": "+264-##-###-####", "cc": "NA", "cd": "Namibia", "desc_en": "", "name_ru": "Намибия", "desc_ru": "" },
{ "mask": "+687-##-####", "cc": "NC", "cd": "New Caledonia", "desc_en": "", "name_ru": "Новая Каледония", "desc_ru": "" },
{ "mask": "+227-##-##-####", "cc": "NE", "cd": "Niger", "desc_en": "", "name_ru": "Нигер", "desc_ru": "" },
{ "mask": "+672-3##-###", "cc": "NF", "cd": "Norfolk Island", "desc_en": "", "name_ru": "Норфолк (остров)", "desc_ru": "" },
{ "mask": "+234(###)###-####", "cc": "NG", "cd": "Nigeria", "desc_en": "", "name_ru": "Нигерия", "desc_ru": "" },
{ "mask": "+234-##-###-###", "cc": "NG", "cd": "Nigeria", "desc_en": "", "name_ru": "Нигерия", "desc_ru": "" },
{ "mask": "+234-##-###-##", "cc": "NG", "cd": "Nigeria", "desc_en": "", "name_ru": "Нигерия", "desc_ru": "" },
{ "mask": "+234(###)###-####", "cc": "NG", "cd": "Nigeria ", "desc_en": "mobile", "name_ru": "Нигерия ", "desc_ru": "мобильные" },
{ "mask": "+505-####-####", "cc": "NI", "cd": "Nicaragua", "desc_en": "", "name_ru": "Никарагуа", "desc_ru": "" },
{ "mask": "+31-##-###-####", "cc": "NL", "cd": "Netherlands", "desc_en": "", "name_ru": "Нидерланды", "desc_ru": "" },
{ "mask": "+47(###)##-###", "cc": "NO", "cd": "Norway", "desc_en": "", "name_ru": "Норвегия", "desc_ru": "" },
{ "mask": "+977-##-###-###", "cc": "NP", "cd": "Nepal", "desc_en": "", "name_ru": "Непал", "desc_ru": "" },
{ "mask": "+674-###-####", "cc": "NR", "cd": "Nauru", "desc_en": "", "name_ru": "Науру", "desc_ru": "" },
{ "mask": "+683-####", "cc": "NU", "cd": "Niue", "desc_en": "", "name_ru": "Ниуэ", "desc_ru": "" },
{ "mask": "+64(###)###-###", "cc": "NZ", "cd": "New Zealand", "desc_en": "", "name_ru": "Новая Зеландия", "desc_ru": "" },
{ "mask": "+64-##-###-###", "cc": "NZ", "cd": "New Zealand", "desc_en": "", "name_ru": "Новая Зеландия", "desc_ru": "" },
{ "mask": "+64(###)###-####", "cc": "NZ", "cd": "New Zealand", "desc_en": "", "name_ru": "Новая Зеландия", "desc_ru": "" },
{ "mask": "+968-##-###-###", "cc": "OM", "cd": "Oman", "desc_en": "", "name_ru": "Оман", "desc_ru": "" },
{ "mask": "+507-###-####", "cc": "PA", "cd": "Panama", "desc_en": "", "name_ru": "Панама", "desc_ru": "" },
{ "mask": "+51(###)###-###", "cc": "PE", "cd": "Peru", "desc_en": "", "name_ru": "Перу", "desc_ru": "" },
{ "mask": "+689-##-##-##", "cc": "PF", "cd": "French Polynesia", "desc_en": "", "name_ru": "Французская Полинезия (Таити)", "desc_ru": "" },
{ "mask": "+675(###)##-###", "cc": "PG", "cd": "Papua New Guinea", "desc_en": "", "name_ru": "Папуа-Новая Гвинея", "desc_ru": "" },
{ "mask": "+63(###)###-####", "cc": "PH", "cd": "Philippines", "desc_en": "", "name_ru": "Филиппины", "desc_ru": "" },
{ "mask": "+92(###)###-####", "cc": "PK", "cd": "Pakistan", "desc_en": "", "name_ru": "Пакистан", "desc_ru": "" },
{ "mask": "+48(###)###-###", "cc": "PL", "cd": "Poland", "desc_en": "", "name_ru": "Польша", "desc_ru": "" },
{ "mask": "+970-##-###-####", "cc": "PS", "cd": "Palestine", "desc_en": "", "name_ru": "Палестина", "desc_ru": "" },
{ "mask": "+351-##-###-####", "cc": "PT", "cd": "Portugal", "desc_en": "", "name_ru": "Португалия", "desc_ru": "" },
{ "mask": "+680-###-####", "cc": "PW", "cd": "Palau", "desc_en": "", "name_ru": "Палау", "desc_ru": "" },
{ "mask": "+595(###)###-###", "cc": "PY", "cd": "Paraguay", "desc_en": "", "name_ru": "Парагвай", "desc_ru": "" },
{ "mask": "+974-####-####", "cc": "QA", "cd": "Qatar", "desc_en": "", "name_ru": "Катар", "desc_ru": "" },
{ "mask": "+262-#####-####", "cc": "RE", "cd": "Reunion", "desc_en": "", "name_ru": "Реюньон", "desc_ru": "" },
{ "mask": "+40-##-###-####", "cc": "RO", "cd": "Romania", "desc_en": "", "name_ru": "Румыния", "desc_ru": "" },
{ "mask": "+381-##-###-####", "cc": "RS", "cd": "Serbia", "desc_en": "", "name_ru": "Сербия", "desc_ru": "" },
{ "mask": "+7(###)###-##-##", "cc": "RU", "cd": "Russia", "desc_en": "", "name_ru": "Россия", "desc_ru": "" },
{ "mask": "+250(###)###-###", "cc": "RW", "cd": "Rwanda", "desc_en": "", "name_ru": "Руанда", "desc_ru": "" },
{ "mask": "+966-5-####-####", "cc": "SA", "cd": "Saudi Arabia ", "desc_en": "mobile", "name_ru": "Саудовская Аравия ", "desc_ru": "мобильные" },
{ "mask": "+966-#-###-####", "cc": "SA", "cd": "Saudi Arabia", "desc_en": "", "name_ru": "Саудовская Аравия", "desc_ru": "" },
{ "mask": "+677-###-####", "cc": "SB", "cd": "Solomon Islands ", "desc_en": "mobile", "name_ru": "Соломоновы Острова ", "desc_ru": "мобильные" },
{ "mask": "+677-#####", "cc": "SB", "cd": "Solomon Islands", "desc_en": "", "name_ru": "Соломоновы Острова", "desc_ru": "" },
{ "mask": "+248-#-###-###", "cc": "SC", "cd": "Seychelles", "desc_en": "", "name_ru": "Сейшелы", "desc_ru": "" },
{ "mask": "+249-##-###-####", "cc": "SD", "cd": "Sudan", "desc_en": "", "name_ru": "Судан", "desc_ru": "" },
{ "mask": "+46-##-###-####", "cc": "SE", "cd": "Sweden", "desc_en": "", "name_ru": "Швеция", "desc_ru": "" },
{ "mask": "+65-####-####", "cc": "SG", "cd": "Singapore", "desc_en": "", "name_ru": "Сингапур", "desc_ru": "" },
{ "mask": "+290-####", "cc": "SH", "cd": "Saint Helena", "desc_en": "", "name_ru": "Остров Святой Елены", "desc_ru": "" },
{ "mask": "+290-####", "cc": "SH", "cd": "Tristan da Cunha", "desc_en": "", "name_ru": "Тристан-да-Кунья", "desc_ru": "" },
{ "mask": "+386-##-###-###", "cc": "SI", "cd": "Slovenia", "desc_en": "", "name_ru": "Словения", "desc_ru": "" },
{ "mask": "+421(###)###-###", "cc": "SK", "cd": "Slovakia", "desc_en": "", "name_ru": "Словакия", "desc_ru": "" },
{ "mask": "+232-##-######", "cc": "SL", "cd": "Sierra Leone", "desc_en": "", "name_ru": "Сьерра-Леоне", "desc_ru": "" },
{ "mask": "+378-####-######", "cc": "SM", "cd": "San Marino", "desc_en": "", "name_ru": "Сан-Марино", "desc_ru": "" },
{ "mask": "+221-##-###-####", "cc": "SN", "cd": "Senegal", "desc_en": "", "name_ru": "Сенегал", "desc_ru": "" },
{ "mask": "+252-##-###-###", "cc": "SO", "cd": "Somalia", "desc_en": "", "name_ru": "Сомали", "desc_ru": "" },
{ "mask": "+252-#-###-###", "cc": "SO", "cd": "Somalia", "desc_en": "", "name_ru": "Сомали", "desc_ru": "" },
{ "mask": "+252-#-###-###", "cc": "SO", "cd": "Somalia ", "desc_en": "mobile", "name_ru": "Сомали ", "desc_ru": "мобильные" },
{ "mask": "+597-###-####", "cc": "SR", "cd": "Suriname ", "desc_en": "mobile", "name_ru": "Суринам ", "desc_ru": "мобильные" },
{ "mask": "+597-###-###", "cc": "SR", "cd": "Suriname", "desc_en": "", "name_ru": "Суринам", "desc_ru": "" },
{ "mask": "+211-##-###-####", "cc": "SS", "cd": "South Sudan", "desc_en": "", "name_ru": "Южный Судан", "desc_ru": "" },
{ "mask": "+239-##-#####", "cc": "ST", "cd": "Sao Tome and Principe", "desc_en": "", "name_ru": "Сан-Томе и Принсипи", "desc_ru": "" },
{ "mask": "+503-##-##-####", "cc": "SV", "cd": "El Salvador", "desc_en": "", "name_ru": "Сальвадор", "desc_ru": "" },
{ "mask": "+1(721)###-####", "cc": "SX", "cd": "Sint Maarten", "desc_en": "", "name_ru": "Синт-Маартен", "desc_ru": "" },
{ "mask": "+963-##-####-###", "cc": "SY", "cd": "Syrian Arab Republic", "desc_en": "", "name_ru": "Сирийская арабская республика", "desc_ru": "" },
{ "mask": "+268-##-##-####", "cc": "SZ", "cd": "Swaziland", "desc_en": "", "name_ru": "Свазиленд", "desc_ru": "" },
{ "mask": "+1(649)###-####", "cc": "TC", "cd": "Turks & Caicos", "desc_en": "", "name_ru": "Тёркс и Кайкос", "desc_ru": "" },
{ "mask": "+235-##-##-##-##", "cc": "TD", "cd": "Chad", "desc_en": "", "name_ru": "Чад", "desc_ru": "" },
{ "mask": "+228-##-###-###", "cc": "TG", "cd": "Togo", "desc_en": "", "name_ru": "Того", "desc_ru": "" },
{ "mask": "+66-##-###-####", "cc": "TH", "cd": "Thailand ", "desc_en": "mobile", "name_ru": "Таиланд ", "desc_ru": "мобильные" },
{ "mask": "+66-##-###-###", "cc": "TH", "cd": "Thailand", "desc_en": "", "name_ru": "Таиланд", "desc_ru": "" },
{ "mask": "+992-##-###-####", "cc": "TJ", "cd": "Tajikistan", "desc_en": "", "name_ru": "Таджикистан", "desc_ru": "" },
{ "mask": "+690-####", "cc": "TK", "cd": "Tokelau", "desc_en": "", "name_ru": "Токелау", "desc_ru": "" },
{ "mask": "+670-###-####", "cc": "TL", "cd": "East Timor", "desc_en": "", "name_ru": "Восточный Тимор", "desc_ru": "" },
{ "mask": "+670-77#-#####", "cc": "TL", "cd": "East Timor", "desc_en": "Timor Telecom", "name_ru": "Восточный Тимор", "desc_ru": "Timor Telecom" },
{ "mask": "+670-78#-#####", "cc": "TL", "cd": "East Timor", "desc_en": "Timor Telecom", "name_ru": "Восточный Тимор", "desc_ru": "Timor Telecom" },
{ "mask": "+993-#-###-####", "cc": "TM", "cd": "Turkmenistan", "desc_en": "", "name_ru": "Туркменистан", "desc_ru": "" },
{ "mask": "+216-##-###-###", "cc": "TN", "cd": "Tunisia", "desc_en": "", "name_ru": "Тунис", "desc_ru": "" },
{ "mask": "+676-#####", "cc": "TO", "cd": "Tonga", "desc_en": "", "name_ru": "Тонга", "desc_ru": "" },
{ "mask": "+90(###)###-####", "cc": "TR", "cd": "Turkey", "desc_en": "", "name_ru": "Турция", "desc_ru": "" },
{ "mask": "+1(868)###-####", "cc": "TT", "cd": "Trinidad & Tobago", "desc_en": "", "name_ru": "Тринидад и Тобаго", "desc_ru": "" },
{ "mask": "+688-90####", "cc": "TV", "cd": "Tuvalu ", "desc_en": "mobile", "name_ru": "Тувалу ", "desc_ru": "мобильные" },
{ "mask": "+688-2####", "cc": "TV", "cd": "Tuvalu", "desc_en": "", "name_ru": "Тувалу", "desc_ru": "" },
{ "mask": "+886-#-####-####", "cc": "TW", "cd": "Taiwan", "desc_en": "", "name_ru": "Тайвань", "desc_ru": "" },
{ "mask": "+886-####-####", "cc": "TW", "cd": "Taiwan", "desc_en": "", "name_ru": "Тайвань", "desc_ru": "" },
{ "mask": "+255-##-###-####", "cc": "TZ", "cd": "Tanzania", "desc_en": "", "name_ru": "Танзания", "desc_ru": "" },
{ "mask": "+380(##)###-##-##", "cc": "UA", "cd": "Ukraine", "desc_en": "", "name_ru": "Украина", "desc_ru": "" },
{ "mask": "+256(###)###-###", "cc": "UG", "cd": "Uganda", "desc_en": "", "name_ru": "Уганда", "desc_ru": "" },
{ "mask": "+44-##-####-####", "cc": "UK", "cd": "United Kingdom", "desc_en": "", "name_ru": "Великобритания", "desc_ru": "" },
{ "mask": "+598-#-###-##-##", "cc": "UY", "cd": "Uruguay", "desc_en": "", "name_ru": "Уругвай", "desc_ru": "" },
{ "mask": "+998-##-###-####", "cc": "UZ", "cd": "Uzbekistan", "desc_en": "", "name_ru": "Узбекистан", "desc_ru": "" },
{ "mask": "+39-6-698-#####", "cc": "VA", "cd": "Vatican City", "desc_en": "", "name_ru": "Ватикан", "desc_ru": "" },
{ "mask": "+1(784)###-####", "cc": "VC", "cd": "Saint Vincent & the Grenadines", "desc_en": "", "name_ru": "Сент-Винсент и Гренадины", "desc_ru": "" },
{ "mask": "+58(###)###-####", "cc": "VE", "cd": "Venezuela", "desc_en": "", "name_ru": "Венесуэла", "desc_ru": "" },
{ "mask": "+1(284)###-####", "cc": "VG", "cd": "British Virgin Islands", "desc_en": "", "name_ru": "Британские Виргинские острова", "desc_ru": "" },
{ "mask": "+1(340)###-####", "cc": "VI", "cd": "US Virgin Islands", "desc_en": "", "name_ru": "Американские Виргинские острова", "desc_ru": "" },
{ "mask": "+84-##-####-###", "cc": "VN", "cd": "Vietnam", "desc_en": "", "name_ru": "Вьетнам", "desc_ru": "" },
{ "mask": "+84(###)####-###", "cc": "VN", "cd": "Vietnam", "desc_en": "", "name_ru": "Вьетнам", "desc_ru": "" },
{ "mask": "+678-##-#####", "cc": "VU", "cd": "Vanuatu ", "desc_en": "mobile", "name_ru": "Вануату ", "desc_ru": "мобильные" },
{ "mask": "+678-#####", "cc": "VU", "cd": "Vanuatu", "desc_en": "", "name_ru": "Вануату", "desc_ru": "" },
{ "mask": "+681-##-####", "cc": "WF", "cd": "Wallis and Futuna", "desc_en": "", "name_ru": "Уоллис и Футуна", "desc_ru": "" },
{ "mask": "+685-##-####", "cc": "WS", "cd": "Samoa", "desc_en": "", "name_ru": "Самоа", "desc_ru": "" },
{ "mask": "+967-###-###-###", "cc": "YE", "cd": "Yemen ", "desc_en": "mobile", "name_ru": "Йемен ", "desc_ru": "мобильные" },
{ "mask": "+967-#-###-###", "cc": "YE", "cd": "Yemen", "desc_en": "", "name_ru": "Йемен", "desc_ru": "" },
{ "mask": "+967-##-###-###", "cc": "YE", "cd": "Yemen", "desc_en": "", "name_ru": "Йемен", "desc_ru": "" },
{ "mask": "+27-##-###-####", "cc": "ZA", "cd": "South Africa", "desc_en": "", "name_ru": "Южно-Африканская Респ.", "desc_ru": "" },
{ "mask": "+260-##-###-####", "cc": "ZM", "cd": "Zambia", "desc_en": "", "name_ru": "Замбия", "desc_ru": "" },
{ "mask": "+263-#-######", "cc": "ZW", "cd": "Zimbabwe", "desc_en": "", "name_ru": "Зимбабве", "desc_ru": "" },
{ "mask": "+1(###)###-####", "cc": ["US", "CA"], "cd": "USA and Canada", "desc_en": "", "name_ru": "США и Канада", "desc_ru": "" }
]
[
{ "mask": "+31-10-###-####", "cc": "NL", "cd": "Netherlands", "city": "Rotterdam" },
{ "mask": "+31-111-###-###", "cc": "NL", "cd": "Netherlands", "city": "Zierikzee" },
{ "mask": "+31-113-###-###", "cc": "NL", "cd": "Netherlands", "city": "Goes" },
{ "mask": "+31-114-###-###", "cc": "NL", "cd": "Netherlands", "city": "Hulst" },
{ "mask": "+31-115-###-###", "cc": "NL", "cd": "Netherlands", "city": "Terneuzen" },
{ "mask": "+31-117-###-###", "cc": "NL", "cd": "Netherlands", "city": "Oostburg" },
{ "mask": "+31-118-###-###", "cc": "NL", "cd": "Netherlands", "city": "Middelburg" },
{ "mask": "+31-13-###-####", "cc": "NL", "cd": "Netherlands", "city": "Tilburg" },
{ "mask": "+31-14-###-####", "cc": "NL", "cd": "Netherlands", "city": "Intern gebruik door KPN" },
{ "mask": "+31-15-###-####", "cc": "NL", "cd": "Netherlands", "city": "Delft" },
{ "mask": "+31-161-###-###", "cc": "NL", "cd": "Netherlands", "city": "Rijen" },
{ "mask": "+31-162-###-###", "cc": "NL", "cd": "Netherlands", "city": "Oosterhout" },
{ "mask": "+31-164-###-###", "cc": "NL", "cd": "Netherlands", "city": "Bergen op Zoom" },
{ "mask": "+31-165-###-###", "cc": "NL", "cd": "Netherlands", "city": "Roosendaal" },
{ "mask": "+31-166-###-###", "cc": "NL", "cd": "Netherlands", "city": "Tholen" },
{ "mask": "+31-167-###-###", "cc": "NL", "cd": "Netherlands", "city": "Steenbergen" },
{ "mask": "+31-168-###-###", "cc": "NL", "cd": "Netherlands", "city": "Zevenbergen" },
{ "mask": "+31-172-###-###", "cc": "NL", "cd": "Netherlands", "city": "Alphen aan den Rijn" },
{ "mask": "+31-174-###-###", "cc": "NL", "cd": "Netherlands", "city": "Naaldwijk" },
{ "mask": "+31-180-###-###", "cc": "NL", "cd": "Netherlands", "city": "Krimpen aan den IJsel" },
{ "mask": "+31-181-###-###", "cc": "NL", "cd": "Netherlands", "city": "Spijkenisse" },
{ "mask": "+31-182-###-###", "cc": "NL", "cd": "Netherlands", "city": "Gouda" },
{ "mask": "+31-183-###-###", "cc": "NL", "cd": "Netherlands", "city": "Gorinchem" },
{ "mask": "+31-184-###-###", "cc": "NL", "cd": "Netherlands", "city": "Sliedrecht" },
{ "mask": "+31-186-###-###", "cc": "NL", "cd": "Netherlands", "city": "Oud-Beijerland" },
{ "mask": "+31-187-###-###", "cc": "NL", "cd": "Netherlands", "city": "Middelharnis" },
{ "mask": "+31-20-###-####", "cc": "NL", "cd": "Netherlands", "city": "Amsterdam" },
{ "mask": "+31-222-###-###", "cc": "NL", "cd": "Netherlands", "city": "Den Burg" },
{ "mask": "+31-223-###-###", "cc": "NL", "cd": "Netherlands", "city": "Den Helder" },
{ "mask": "+31-224-###-###", "cc": "NL", "cd": "Netherlands", "city": "Schagen" },
{ "mask": "+31-226-###-###", "cc": "NL", "cd": "Netherlands", "city": "Noord-Scharwoude" },
{ "mask": "+31-227-###-###", "cc": "NL", "cd": "Netherlands", "city": "Middenmeer" },
{ "mask": "+31-228-###-###", "cc": "NL", "cd": "Netherlands", "city": "Enkhuizen" },
{ "mask": "+31-229-###-###", "cc": "NL", "cd": "Netherlands", "city": "Hoorn" },
{ "mask": "+31-23-###-####", "cc": "NL", "cd": "Netherlands", "city": "Haarlem" },
{ "mask": "+31-24-###-####", "cc": "NL", "cd": "Netherlands", "city": "Nijmegen" },
{ "mask": "+31-251-###-###", "cc": "NL", "cd": "Netherlands", "city": "Beverwijk" },
{ "mask": "+31-252-###-###", "cc": "NL", "cd": "Netherlands", "city": "Hillegom" },
{ "mask": "+31-255-###-###", "cc": "NL", "cd": "Netherlands", "city": "IJmuiden" },
{ "mask": "+31-26-###-####", "cc": "NL", "cd": "Netherlands", "city": "Arnhem" },
{ "mask": "+31-294-###-###", "cc": "NL", "cd": "Netherlands", "city": "Weesp" },
{ "mask": "+31-297-###-###", "cc": "NL", "cd": "Netherlands", "city": "Uithoorn" },
{ "mask": "+31-299-###-###", "cc": "NL", "cd": "Netherlands", "city": "Purmerend" },
{ "mask": "+31-30-###-####", "cc": "NL", "cd": "Netherlands", "city": "Utrecht" },
{ "mask": "+31-313-###-###", "cc": "NL", "cd": "Netherlands", "city": "Dieren" },
{ "mask": "+31-314-###-###", "cc": "NL", "cd": "Netherlands", "city": "Doetinchem" },
{ "mask": "+31-315-###-###", "cc": "NL", "cd": "Netherlands", "city": "Terborg" },
{ "mask": "+31-316-###-###", "cc": "NL", "cd": "Netherlands", "city": "Zevenaar" },
{ "mask": "+31-317-###-###", "cc": "NL", "cd": "Netherlands", "city": "Wageningen" },
{ "mask": "+31-318-###-###", "cc": "NL", "cd": "Netherlands", "city": "Ede" },
{ "mask": "+31-320-###-###", "cc": "NL", "cd": "Netherlands", "city": "Lelystad" },
{ "mask": "+31-321-###-###", "cc": "NL", "cd": "Netherlands", "city": "Dronten" },
{ "mask": "+31-33-###-####", "cc": "NL", "cd": "Netherlands", "city": "Amersfoort" },
{ "mask": "+31-341-###-###", "cc": "NL", "cd": "Netherlands", "city": "Harderwijk" },
{ "mask": "+31-342-###-###", "cc": "NL", "cd": "Netherlands", "city": "Barneveld" },
{ "mask": "+31-343-###-###", "cc": "NL", "cd": "Netherlands", "city": "Doorn" },
{ "mask": "+31-344-###-###", "cc": "NL", "cd": "Netherlands", "city": "Tiel" },
{ "mask": "+31-294-###-###", "cc": "NL", "cd": "Netherlands", "city": "Weesp" },
{ "mask": "+31-297-###-###", "cc": "NL", "cd": "Netherlands", "city": "Uithoorn" },
{ "mask": "+31-299-###-###", "cc": "NL", "cd": "Netherlands", "city": "Purmerend" },
{ "mask": "+31-30-###-####", "cc": "NL", "cd": "Netherlands", "city": "Utrecht" },
{ "mask": "+31-313-###-###", "cc": "NL", "cd": "Netherlands", "city": "Dieren" },
{ "mask": "+31-314-###-###", "cc": "NL", "cd": "Netherlands", "city": "Doetinchem" },
{ "mask": "+31-315-###-###", "cc": "NL", "cd": "Netherlands", "city": "Terborg" },
{ "mask": "+31-316-###-###", "cc": "NL", "cd": "Netherlands", "city": "Zevenaar" },
{ "mask": "+31-317-###-###", "cc": "NL", "cd": "Netherlands", "city": "Wageningen" },
{ "mask": "+31-318-###-###", "cc": "NL", "cd": "Netherlands", "city": "Ede" },
{ "mask": "+31-320-###-###", "cc": "NL", "cd": "Netherlands", "city": "Lelystad" },
{ "mask": "+31-321-###-###", "cc": "NL", "cd": "Netherlands", "city": "Dronten" },
{ "mask": "+31-33-###-####", "cc": "NL", "cd": "Netherlands", "city": "Amersfoort" },
{ "mask": "+31-341-###-###", "cc": "NL", "cd": "Netherlands", "city": "Harderwijk" },
{ "mask": "+31-342-###-###", "cc": "NL", "cd": "Netherlands", "city": "Barneveld" },
{ "mask": "+31-343-###-###", "cc": "NL", "cd": "Netherlands", "city": "Doorn" },
{ "mask": "+31-344-###-###", "cc": "NL", "cd": "Netherlands", "city": "Tiel" },
{ "mask": "+31-345-###-###", "cc": "NL", "cd": "Netherlands", "city": "Culemborg" },
{ "mask": "+31-346-###-###", "cc": "NL", "cd": "Netherlands", "city": "Maarssen" },
{ "mask": "+31-347-###-###", "cc": "NL", "cd": "Netherlands", "city": "Vianen" },
{ "mask": "+31-348-###-###", "cc": "NL", "cd": "Netherlands", "city": "Woerden" },
{ "mask": "+31-35-###-####", "cc": "NL", "cd": "Netherlands", "city": "Hilversum" },
{ "mask": "+31-36-###-####", "cc": "NL", "cd": "Netherlands", "city": "Almere" },
{ "mask": "+31-38-###-####", "cc": "NL", "cd": "Netherlands", "city": "Zwolle" },
{ "mask": "+31-40-###-####", "cc": "NL", "cd": "Netherlands", "city": "Eindhoven" },
{ "mask": "+31-411-###-###", "cc": "NL", "cd": "Netherlands", "city": "Boxtel" },
{ "mask": "+31-412-###-###", "cc": "NL", "cd": "Netherlands", "city": "Oss" },
{ "mask": "+31-413-###-###", "cc": "NL", "cd": "Netherlands", "city": "Veghel" },
{ "mask": "+31-416-###-###", "cc": "NL", "cd": "Netherlands", "city": "Waalwijk" },
{ "mask": "+31-418-###-###", "cc": "NL", "cd": "Netherlands", "city": "Zaltbommel" },
{ "mask": "+31-43-###-####", "cc": "NL", "cd": "Netherlands", "city": "Maastricht" },
{ "mask": "+31-45-###-####", "cc": "NL", "cd": "Netherlands", "city": "Heerlen" },
{ "mask": "+31-46-###-####", "cc": "NL", "cd": "Netherlands", "city": "Sittard" },
{ "mask": "+31-475-###-###", "cc": "NL", "cd": "Netherlands", "city": "Roermond" },
{ "mask": "+31-478-###-###", "cc": "NL", "cd": "Netherlands", "city": "Venray" },
{ "mask": "+31-481-###-###", "cc": "NL", "cd": "Netherlands", "city": "Bemmel" },
{ "mask": "+31-485-###-###", "cc": "NL", "cd": "Netherlands", "city": "Cuijk" },
{ "mask": "+31-486-###-###", "cc": "NL", "cd": "Netherlands", "city": "Grave" },
{ "mask": "+31-487-###-###", "cc": "NL", "cd": "Netherlands", "city": "Druten" },
{ "mask": "+31-488-###-###", "cc": "NL", "cd": "Netherlands", "city": "Zetten" },
{ "mask": "+31-492-###-###", "cc": "NL", "cd": "Netherlands", "city": "Helmond" },
{ "mask": "+31-493-###-###", "cc": "NL", "cd": "Netherlands", "city": "Deurne" },
{ "mask": "+31-495-###-###", "cc": "NL", "cd": "Netherlands", "city": "Weert" },
{ "mask": "+31-497-###-###", "cc": "NL", "cd": "Netherlands", "city": "Eersel" },
{ "mask": "+31-499-###-###", "cc": "NL", "cd": "Netherlands", "city": "Best" },
{ "mask": "+31-50-###-####", "cc": "NL", "cd": "Netherlands", "city": "Groningen" },
{ "mask": "+31-511-###-###", "cc": "NL", "cd": "Netherlands", "city": "Feanw�lden" },
{ "mask": "+31-512-###-###", "cc": "NL", "cd": "Netherlands", "city": "Drachten" },
{ "mask": "+31-513-###-###", "cc": "NL", "cd": "Netherlands", "city": "Heerenveen" },
{ "mask": "+31-514-###-###", "cc": "NL", "cd": "Netherlands", "city": "Balk" },
{ "mask": "+31-515-###-###", "cc": "NL", "cd": "Netherlands", "city": "Sneek" },
{ "mask": "+31-516-###-###", "cc": "NL", "cd": "Netherlands", "city": "Oosterwolde" },
{ "mask": "+31-517-###-###", "cc": "NL", "cd": "Netherlands", "city": "Franeker" },
{ "mask": "+31-518-###-###", "cc": "NL", "cd": "Netherlands", "city": "St Annaparochie" },
{ "mask": "+31-519-###-###", "cc": "NL", "cd": "Netherlands", "city": "Dokkum" },
{ "mask": "+31-521-###-###", "cc": "NL", "cd": "Netherlands", "city": "Steenwijk" },
{ "mask": "+31-522-###-###", "cc": "NL", "cd": "Netherlands", "city": "Meppel" },
{ "mask": "+31-523-###-###", "cc": "NL", "cd": "Netherlands", "city": "Dedemsvaart" },
{ "mask": "+31-524-###-###", "cc": "NL", "cd": "Netherlands", "city": "Coevorden" },
{ "mask": "+31-525-###-###", "cc": "NL", "cd": "Netherlands", "city": "Elburg" },
{ "mask": "+31-527-###-###", "cc": "NL", "cd": "Netherlands", "city": "Emmeloord" },
{ "mask": "+31-528-###-###", "cc": "NL", "cd": "Netherlands", "city": "Hoogeveen" },
{ "mask": "+31-529-###-###", "cc": "NL", "cd": "Netherlands", "city": "Ommen" },
{ "mask": "+31-53-###-####", "cc": "NL", "cd": "Netherlands", "city": "Enschede" },
{ "mask": "+31-541-###-###", "cc": "NL", "cd": "Netherlands", "city": "Oldenzaal" },
{ "mask": "+31-543-###-###", "cc": "NL", "cd": "Netherlands", "city": "Winterswijk" },
{ "mask": "+31-544-###-###", "cc": "NL", "cd": "Netherlands", "city": "Groenlo" },
{ "mask": "+31-545-###-###", "cc": "NL", "cd": "Netherlands", "city": "Neede" },
{ "mask": "+31-546-###-###", "cc": "NL", "cd": "Netherlands", "city": "Almelo" },
{ "mask": "+31-547-###-###", "cc": "NL", "cd": "Netherlands", "city": "Goor" },
{ "mask": "+31-548-###-###", "cc": "NL", "cd": "Netherlands", "city": "Rijssen" },
{ "mask": "+31-55-###-####", "cc": "NL", "cd": "Netherlands", "city": "Apeldoorn" },
{ "mask": "+31-561-###-###", "cc": "NL", "cd": "Netherlands", "city": "Wolvega" },
{ "mask": "+31-562-###-###", "cc": "NL", "cd": "Netherlands", "city": "West-Terschelling" },
{ "mask": "+31-566-###-###", "cc": "NL", "cd": "Netherlands", "city": "Jirnsum" },
{ "mask": "+31-570-###-###", "cc": "NL", "cd": "Netherlands", "city": "Deventer" },
{ "mask": "+31-571-###-###", "cc": "NL", "cd": "Netherlands", "city": "Twello" },
{ "mask": "+31-572-###-###", "cc": "NL", "cd": "Netherlands", "city": "Raalte" },
{ "mask": "+31-573-###-###", "cc": "NL", "cd": "Netherlands", "city": "Lochem" },
{ "mask": "+31-575-###-###", "cc": "NL", "cd": "Netherlands", "city": "Zutphen" },
{ "mask": "+31-577-###-###", "cc": "NL", "cd": "Netherlands", "city": "Uddel" },
{ "mask": "+31-578-###-###", "cc": "NL", "cd": "Netherlands", "city": "Epe" },
{ "mask": "+31-58-###-####", "cc": "NL", "cd": "Netherlands", "city": "Leeuwarden" },
{ "mask": "+31-591-###-###", "cc": "NL", "cd": "Netherlands", "city": "Emmen" },
{ "mask": "+31-592-###-###", "cc": "NL", "cd": "Netherlands", "city": "Assen" },
{ "mask": "+31-593-###-###", "cc": "NL", "cd": "Netherlands", "city": "Beilen" },
{ "mask": "+31-594-###-###", "cc": "NL", "cd": "Netherlands", "city": "Zuidhorn" },
{ "mask": "+31-595-###-###", "cc": "NL", "cd": "Netherlands", "city": "Warffum" },
{ "mask": "+31-596-###-###", "cc": "NL", "cd": "Netherlands", "city": "Appingedam" },
{ "mask": "+31-597-###-###", "cc": "NL", "cd": "Netherlands", "city": "Winschoten" },
{ "mask": "+31-598-###-###", "cc": "NL", "cd": "Netherlands", "city": "Hoogezand" },
{ "mask": "+31-599-###-###", "cc": "NL", "cd": "Netherlands", "city": "Stadskanaal" },
{ "mask": "+31-70-###-####", "cc": "NL", "cd": "Netherlands", "city": "Den Haag" },
{ "mask": "+31-71-###-####", "cc": "NL", "cd": "Netherlands", "city": "Leiden" },
{ "mask": "+31-72-###-####", "cc": "NL", "cd": "Netherlands", "city": "Alkmaar" },
{ "mask": "+31-73-###-####", "cc": "NL", "cd": "Netherlands", "city": "'s-Hertogenbosch" },
{ "mask": "+31-74-###-####", "cc": "NL", "cd": "Netherlands", "city": "Hengelo" },
{ "mask": "+31-75-###-####", "cc": "NL", "cd": "Netherlands", "city": "Zaandam" },
{ "mask": "+31-76-###-####", "cc": "NL", "cd": "Netherlands", "city": "Breda" },
{ "mask": "+31-77-###-####", "cc": "NL", "cd": "Netherlands", "city": "Venlo" },
{ "mask": "+31-78-###-####", "cc": "NL", "cd": "Netherlands", "city": "Dordrecht" },
{ "mask": "+31-79-###-####", "cc": "NL", "cd": "Netherlands", "city": "Zoetermeer" },
{ "mask": "+31-61-###-####", "cc": "NL", "cd": "Netherlands", "city": "Mobiele nummers" },
{ "mask": "+31-62-###-####", "cc": "NL", "cd": "Netherlands", "city": "Mobiele nummers" },
{ "mask": "+31-63-###-####", "cc": "NL", "cd": "Netherlands", "city": "Mobiele nummers" },
{ "mask": "+31-64-###-####", "cc": "NL", "cd": "Netherlands", "city": "Mobiele nummers" },
{ "mask": "+31-65-###-####", "cc": "NL", "cd": "Netherlands", "city": "Mobiele nummers" },
{ "mask": "+31-68-###-####", "cc": "NL", "cd": "Netherlands", "city": "Mobiele nummers" },
{ "mask": "+31-69-###-####", "cc": "NL", "cd": "Netherlands", "city": "Mobiele nummers" },
{ "mask": "+31-66-###-####", "cc": "NL", "cd": "Netherlands", "city": "Semafonie" },
{ "mask": "+31-670-###-###", "cc": "NL", "cd": "Netherlands", "city": "Videotex" },
{ "mask": "+31-671-###-###", "cc": "NL", "cd": "Netherlands", "city": "Videotex" },
{ "mask": "+31-672-###-###", "cc": "NL", "cd": "Netherlands", "city": "Videotex" },
{ "mask": "+31-673-###-###", "cc": "NL", "cd": "Netherlands", "city": "Videotex" },
{ "mask": "+31-674-###-###", "cc": "NL", "cd": "Netherlands", "city": "Videotex" },
{ "mask": "+31-675-###-###", "cc": "NL", "cd": "Netherlands", "city": "Videotex" },
{ "mask": "+31-676-###-###", "cc": "NL", "cd": "Netherlands", "city": "Inbelnummers van internetproviders" },
{ "mask": "+31-800-###-###", "cc": "NL", "cd": "Netherlands", "city": "Gratis informatienummers" },
{ "mask": "+31-82-###-####", "cc": "NL", "cd": "Netherlands", "city": "Virtual Private Network" },
{ "mask": "+31-88-###-####", "cc": "NL", "cd": "Netherlands", "city": "Bedrijfsnummers" },
{ "mask": "+31-900-###-###", "cc": "NL", "cd": "Netherlands", "city": "Betaalde informatienummers" },
{ "mask": "+31-906-###-###", "cc": "NL", "cd": "Netherlands", "city": "Betaalde informatienummers" },
{ "mask": "+31-909-###-###", "cc": "NL", "cd": "Netherlands", "city": "Betaalde informatienummers" },
{ "mask": "+31-91-###-####", "cc": "NL", "cd": "Netherlands", "city": "Plaatsonafhankelijk netnummer, geschikt voor beeldtelefonie of lijnen met verhoogde kwaliteit" }
]
This source diff could not be displayed because it is too large. You can view the blob instead.
[
{ "mask": "+44(113)-###-####", "cc": "UK", "cd": "United Kingdom", "city": "Leeds" },
{ "mask": "+44(114)-###-####", "cc": "UK", "cd": "United Kingdom", "city": "Sheffield" },
{ "mask": "+44(115)-###-####", "cc": "UK", "cd": "United Kingdom", "city": "Nottingham" },
{ "mask": "+44(116)-###-####", "cc": "UK", "cd": "United Kingdom", "city": "Leicester" },
{ "mask": "+44(117)-###-####", "cc": "UK", "cd": "United Kingdom", "city": "Bristol" },
{ "mask": "+44(118)-###-####", "cc": "UK", "cd": "United Kingdom", "city": "Reading" },
{ "mask": "+44(1200)-######", "cc": "UK", "cd": "United Kingdom", "city": "Clitheroe" },
{ "mask": "+44(1202)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bournemouth" },
{ "mask": "+44(1204)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bolton" },
{ "mask": "+44(1205)-######", "cc": "UK", "cd": "United Kingdom", "city": "Boston" },
{ "mask": "+44(1206)-######", "cc": "UK", "cd": "United Kingdom", "city": "Colchester" },
{ "mask": "+44(1207)-######", "cc": "UK", "cd": "United Kingdom", "city": "Consett" },
{ "mask": "+44(1208)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bodmin" },
{ "mask": "+44(1209)-######", "cc": "UK", "cd": "United Kingdom", "city": "Redruth" },
{ "mask": "+44(121)-###-####", "cc": "UK", "cd": "United Kingdom", "city": "Birmingham" },
{ "mask": "+44(1223)-######", "cc": "UK", "cd": "United Kingdom", "city": "Cambridge" },
{ "mask": "+44(1224)-######", "cc": "UK", "cd": "United Kingdom", "city": "Aberdeen" },
{ "mask": "+44(1225)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bath" },
{ "mask": "+44(1226)-######", "cc": "UK", "cd": "United Kingdom", "city": "Barnsley" },
{ "mask": "+44(1227)-######", "cc": "UK", "cd": "United Kingdom", "city": "Canterbury" },
{ "mask": "+44(1228)-######", "cc": "UK", "cd": "United Kingdom", "city": "Carlisle" },
{ "mask": "+44(1229)-######", "cc": "UK", "cd": "United Kingdom", "city": "Barrow-in-Furness(2,4,5,6,8), Millom(3,7,9)" },
{ "mask": "+44(1233)-######", "cc": "UK", "cd": "United Kingdom", "city": "Ashford (Kent)" },
{ "mask": "+44(1234)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bedford" },
{ "mask": "+44(1235)-######", "cc": "UK", "cd": "United Kingdom", "city": "Abingdon" },
{ "mask": "+44(1236)-######", "cc": "UK", "cd": "United Kingdom", "city": "Coatbridge" },
{ "mask": "+44(1237)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bideford" },
{ "mask": "+44(1239)-######", "cc": "UK", "cd": "United Kingdom", "city": "Cardigan" },
{ "mask": "+44(1241)-######", "cc": "UK", "cd": "United Kingdom", "city": "Arbroath" },
{ "mask": "+44(1242)-######", "cc": "UK", "cd": "United Kingdom", "city": "Cheltenham" },
{ "mask": "+44(1243)-######", "cc": "UK", "cd": "United Kingdom", "city": "Chichester" },
{ "mask": "+44(1244)-######", "cc": "UK", "cd": "United Kingdom", "city": "Chester" },
{ "mask": "+44(1245)-######", "cc": "UK", "cd": "United Kingdom", "city": "Chelmsford" },
{ "mask": "+44(1246)-######", "cc": "UK", "cd": "United Kingdom", "city": "Chesterfield" },
{ "mask": "+44(1248)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bangor (Gwynedd)" },
{ "mask": "+44(1249)-######", "cc": "UK", "cd": "United Kingdom", "city": "Chippenham" },
{ "mask": "+44(1250)-######", "cc": "UK", "cd": "United Kingdom", "city": "Blairgowrie" },
{ "mask": "+44(1252)-######", "cc": "UK", "cd": "United Kingdom", "city": "Aldershot" },
{ "mask": "+44(1253)-######", "cc": "UK", "cd": "United Kingdom", "city": "Blackpool" },
{ "mask": "+44(1254)-######", "cc": "UK", "cd": "United Kingdom", "city": "Blackburn" },
{ "mask": "+44(1255)-######", "cc": "UK", "cd": "United Kingdom", "city": "Clacton-on-Sea" },
{ "mask": "+44(1256)-######", "cc": "UK", "cd": "United Kingdom", "city": "Basingstoke" },
{ "mask": "+44(1257)-######", "cc": "UK", "cd": "United Kingdom", "city": "Coppull" },
{ "mask": "+44(1258)-######", "cc": "UK", "cd": "United Kingdom", "city": "Blandford" },
{ "mask": "+44(1259)-######", "cc": "UK", "cd": "United Kingdom", "city": "Alloa" },
{ "mask": "+44(1260)-######", "cc": "UK", "cd": "United Kingdom", "city": "Congleton" },
{ "mask": "+44(1261)-######", "cc": "UK", "cd": "United Kingdom", "city": "Banff" },
{ "mask": "+44(1262)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bridlington" },
{ "mask": "+44(1263)-######", "cc": "UK", "cd": "United Kingdom", "city": "Cromer" },
{ "mask": "+44(1264)-######", "cc": "UK", "cd": "United Kingdom", "city": "Andover" },
{ "mask": "+44(1267)-######", "cc": "UK", "cd": "United Kingdom", "city": "Carmarthen" },
{ "mask": "+44(1268)-######", "cc": "UK", "cd": "United Kingdom", "city": "Basildon" },
{ "mask": "+44(1269)-######", "cc": "UK", "cd": "United Kingdom", "city": "Ammanford" },
{ "mask": "+44(1270)-######", "cc": "UK", "cd": "United Kingdom", "city": "Crewe" },
{ "mask": "+44(1271)-######", "cc": "UK", "cd": "United Kingdom", "city": "Barnstaple" },
{ "mask": "+44(1273)-######", "cc": "UK", "cd": "United Kingdom", "city": "Brighton" },
{ "mask": "+44(1274)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bradford" },
{ "mask": "+44(1275)-######", "cc": "UK", "cd": "United Kingdom", "city": "Clevedon" },
{ "mask": "+44(1276)-######", "cc": "UK", "cd": "United Kingdom", "city": "Camberley" },
{ "mask": "+44(1277)-######", "cc": "UK", "cd": "United Kingdom", "city": "Brentwood" },
{ "mask": "+44(1278)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bridgwater" },
{ "mask": "+44(1279)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bishops Stortford" },
{ "mask": "+44(1280)-######", "cc": "UK", "cd": "United Kingdom", "city": "Buckingham" },
{ "mask": "+44(1282)-######", "cc": "UK", "cd": "United Kingdom", "city": "Burnley" },
{ "mask": "+44(1283)-######", "cc": "UK", "cd": "United Kingdom", "city": "Burton-on-Trent" },
{ "mask": "+44(1284)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bury St Edmunds" },
{ "mask": "+44(1285)-######", "cc": "UK", "cd": "United Kingdom", "city": "Cirencester" },
{ "mask": "+44(1286)-######", "cc": "UK", "cd": "United Kingdom", "city": "Caernarfon" },
{ "mask": "+44(1287)-######", "cc": "UK", "cd": "United Kingdom", "city": "Guisborough" },
{ "mask": "+44(1288)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bude" },
{ "mask": "+44(1289)-######", "cc": "UK", "cd": "United Kingdom", "city": "Berwick-upon-Tweed" },
{ "mask": "+44(1290)-######", "cc": "UK", "cd": "United Kingdom", "city": "Cumnock" },
{ "mask": "+44(1291)-######", "cc": "UK", "cd": "United Kingdom", "city": "Chepstow" },
{ "mask": "+44(1292)-######", "cc": "UK", "cd": "United Kingdom", "city": "Ayr" },
{ "mask": "+44(1293)-######", "cc": "UK", "cd": "United Kingdom", "city": "Crawley" },
{ "mask": "+44(1294)-######", "cc": "UK", "cd": "United Kingdom", "city": "Ardrossan" },
{ "mask": "+44(1295)-######", "cc": "UK", "cd": "United Kingdom", "city": "Banbury" },
{ "mask": "+44(1296)-######", "cc": "UK", "cd": "United Kingdom", "city": "Aylesbury" },
{ "mask": "+44(1297)-######", "cc": "UK", "cd": "United Kingdom", "city": "Axminster" },
{ "mask": "+44(1298)-######", "cc": "UK", "cd": "United Kingdom", "city": "Buxton" },
{ "mask": "+44(1299)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bewdley" },
{ "mask": "+44(1300)-######", "cc": "UK", "cd": "United Kingdom", "city": "Cerne Abbas" },
{ "mask": "+44(1301)-######", "cc": "UK", "cd": "United Kingdom", "city": "Arrochar" },
{ "mask": "+44(1302)-######", "cc": "UK", "cd": "United Kingdom", "city": "Doncaster" },
{ "mask": "+44(1303)-######", "cc": "UK", "cd": "United Kingdom", "city": "Folkestone" },
{ "mask": "+44(1304)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dover" },
{ "mask": "+44(1305)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dorchester" },
{ "mask": "+44(1306)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dorking" },
{ "mask": "+44(1307)-######", "cc": "UK", "cd": "United Kingdom", "city": "Forfar" },
{ "mask": "+44(1308)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bridport" },
{ "mask": "+44(1309)-######", "cc": "UK", "cd": "United Kingdom", "city": "Forres" },
{ "mask": "+44(131)-###-###", "cc": "UK", "cd": "United Kingdom", "city": "Edinburgh" },
{ "mask": "+44(1320)-######", "cc": "UK", "cd": "United Kingdom", "city": "Fort Augustus" },
{ "mask": "+44(1322)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dartford" },
{ "mask": "+44(1323)-######", "cc": "UK", "cd": "United Kingdom", "city": "Eastbourne" },
{ "mask": "+44(1324)-######", "cc": "UK", "cd": "United Kingdom", "city": "Falkirk" },
{ "mask": "+44(1325)-######", "cc": "UK", "cd": "United Kingdom", "city": "Darlington" },
{ "mask": "+44(1326)-######", "cc": "UK", "cd": "United Kingdom", "city": "Falmouth" },
{ "mask": "+44(1327)-######", "cc": "UK", "cd": "United Kingdom", "city": "Daventry" },
{ "mask": "+44(1328)-######", "cc": "UK", "cd": "United Kingdom", "city": "Fakenham" },
{ "mask": "+44(1329)-######", "cc": "UK", "cd": "United Kingdom", "city": "Fareham" },
{ "mask": "+44(1330)-######", "cc": "UK", "cd": "United Kingdom", "city": "Banchory" },
{ "mask": "+44(1332)-######", "cc": "UK", "cd": "United Kingdom", "city": "Derby" },
{ "mask": "+44(1333)-######", "cc": "UK", "cd": "United Kingdom", "city": "Peat Inn" },
{ "mask": "+44(1334)-######", "cc": "UK", "cd": "United Kingdom", "city": "St Andrews" },
{ "mask": "+44(1335)-######", "cc": "UK", "cd": "United Kingdom", "city": "Ashbourne" },
{ "mask": "+44(1337)-######", "cc": "UK", "cd": "United Kingdom", "city": "Ladybank" },
{ "mask": "+44(1339)-######", "cc": "UK", "cd": "United Kingdom", "city": "Aboyne(2,3,5,8), Ballater(4,6,7,9)" },
{ "mask": "+44(1340)-######", "cc": "UK", "cd": "United Kingdom", "city": "Craigellachie" },
{ "mask": "+44(1341)-######", "cc": "UK", "cd": "United Kingdom", "city": "Barmouth" },
{ "mask": "+44(1342)-######", "cc": "UK", "cd": "United Kingdom", "city": "East Grinstead" },
{ "mask": "+44(1343)-######", "cc": "UK", "cd": "United Kingdom", "city": "Elgin" },
{ "mask": "+44(1344)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bracknell" },
{ "mask": "+44(1346)-######", "cc": "UK", "cd": "United Kingdom", "city": "Fraserburgh" },
{ "mask": "+44(1347)-######", "cc": "UK", "cd": "United Kingdom", "city": "Easingwold" },
{ "mask": "+44(1348)-######", "cc": "UK", "cd": "United Kingdom", "city": "Fishguard" },
{ "mask": "+44(1349)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dingwall" },
{ "mask": "+44(1350)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dunkeld" },
{ "mask": "+44(1352)-######", "cc": "UK", "cd": "United Kingdom", "city": "Mold" },
{ "mask": "+44(1353)-######", "cc": "UK", "cd": "United Kingdom", "city": "Ely" },
{ "mask": "+44(1354)-######", "cc": "UK", "cd": "United Kingdom", "city": "Chatteris" },
{ "mask": "+44(1355)-######", "cc": "UK", "cd": "United Kingdom", "city": "East Kilbride" },
{ "mask": "+44(1356)-######", "cc": "UK", "cd": "United Kingdom", "city": "Brechin" },
{ "mask": "+44(1357)-######", "cc": "UK", "cd": "United Kingdom", "city": "Strathaven" },
{ "mask": "+44(1358)-######", "cc": "UK", "cd": "United Kingdom", "city": "Ellon" },
{ "mask": "+44(1359)-######", "cc": "UK", "cd": "United Kingdom", "city": "Pakenham" },
{ "mask": "+44(1360)-######", "cc": "UK", "cd": "United Kingdom", "city": "Killearn" },
{ "mask": "+44(1361)-######", "cc": "UK", "cd": "United Kingdom", "city": "Duns" },
{ "mask": "+44(1362)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dereham" },
{ "mask": "+44(1363)-######", "cc": "UK", "cd": "United Kingdom", "city": "Crediton" },
{ "mask": "+44(1364)-######", "cc": "UK", "cd": "United Kingdom", "city": "Ashburton" },
{ "mask": "+44(1366)-######", "cc": "UK", "cd": "United Kingdom", "city": "Downham Market" },
{ "mask": "+44(1367)-######", "cc": "UK", "cd": "United Kingdom", "city": "Faringdon" },
{ "mask": "+44(1368)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dunbar" },
{ "mask": "+44(1369)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dunoon" },
{ "mask": "+44(1371)-######", "cc": "UK", "cd": "United Kingdom", "city": "Great Dunmow" },
{ "mask": "+44(1372)-######", "cc": "UK", "cd": "United Kingdom", "city": "Esher" },
{ "mask": "+44(1373)-######", "cc": "UK", "cd": "United Kingdom", "city": "Frome" },
{ "mask": "+44(1375)-######", "cc": "UK", "cd": "United Kingdom", "city": "Grays Thurrock" },
{ "mask": "+44(1376)-######", "cc": "UK", "cd": "United Kingdom", "city": "Braintree" },
{ "mask": "+44(1377)-######", "cc": "UK", "cd": "United Kingdom", "city": "Driffield" },
{ "mask": "+44(1379)-######", "cc": "UK", "cd": "United Kingdom", "city": "Diss" },
{ "mask": "+44(1380)-######", "cc": "UK", "cd": "United Kingdom", "city": "Devizes" },
{ "mask": "+44(1381)-######", "cc": "UK", "cd": "United Kingdom", "city": "Fortrose" },
{ "mask": "+44(1382)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dundee" },
{ "mask": "+44(1383)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dunfermline" },
{ "mask": "+44(1384)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dudley" },
{ "mask": "+44(1386)-######", "cc": "UK", "cd": "United Kingdom", "city": "Evesham" },
{ "mask": "+44(1387)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dumfries" },
{ "mask": "+44(13873)-####[#]", "cc": "UK", "cd": "United Kingdom", "city": "Langholm" },
{ "mask": "+44(1388)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bishop Auckland(3,4,6,7,8,9), Stanhope(2,5)" },
{ "mask": "+44(1389)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dumbarton" },
{ "mask": "+44(1392)-######", "cc": "UK", "cd": "United Kingdom", "city": "Exeter" },
{ "mask": "+44(1394)-######", "cc": "UK", "cd": "United Kingdom", "city": "Felixstowe" },
{ "mask": "+44(1395)-######", "cc": "UK", "cd": "United Kingdom", "city": "Budleigh Salterton" },
{ "mask": "+44(1397)-######", "cc": "UK", "cd": "United Kingdom", "city": "Fort William" },
{ "mask": "+44(1398)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dulverton" },
{ "mask": "+44(1400)-######", "cc": "UK", "cd": "United Kingdom", "city": "Honington" },
{ "mask": "+44(1403)-######", "cc": "UK", "cd": "United Kingdom", "city": "Horsham" },
{ "mask": "+44(1404)-######", "cc": "UK", "cd": "United Kingdom", "city": "Honiton" },
{ "mask": "+44(1405)-######", "cc": "UK", "cd": "United Kingdom", "city": "Goole" },
{ "mask": "+44(1406)-######", "cc": "UK", "cd": "United Kingdom", "city": "Holbeach" },
{ "mask": "+44(1407)-######", "cc": "UK", "cd": "United Kingdom", "city": "Holyhead" },
{ "mask": "+44(1408)-######", "cc": "UK", "cd": "United Kingdom", "city": "Golspie" },
{ "mask": "+44(1409)-######", "cc": "UK", "cd": "United Kingdom", "city": "Holsworthy" },
{ "mask": "+44(141)-###-###", "cc": "UK", "cd": "United Kingdom", "city": "Glasgow" },
{ "mask": "+44(1420)-######", "cc": "UK", "cd": "United Kingdom", "city": "Alton" },
{ "mask": "+44(1422)-######", "cc": "UK", "cd": "United Kingdom", "city": "Halifax" },
{ "mask": "+44(1423)-######", "cc": "UK", "cd": "United Kingdom", "city": "Boroughbridge(3,4,9), Harrogate(2,5,6,7,8)" },
{ "mask": "+44(1424)-######", "cc": "UK", "cd": "United Kingdom", "city": "Hastings" },
{ "mask": "+44(1425)-######", "cc": "UK", "cd": "United Kingdom", "city": "Ringwood" },
{ "mask": "+44(1427)-######", "cc": "UK", "cd": "United Kingdom", "city": "Gainsborough" },
{ "mask": "+44(1428)-######", "cc": "UK", "cd": "United Kingdom", "city": "Haslemere" },
{ "mask": "+44(1429)-######", "cc": "UK", "cd": "United Kingdom", "city": "Hartlepool" },
{ "mask": "+44(1430)-######", "cc": "UK", "cd": "United Kingdom", "city": "Market Weighton(6,7,8,9), North Cave(2,3,4,5)" },
{ "mask": "+44(1431)-######", "cc": "UK", "cd": "United Kingdom", "city": "Helmsdale" },
{ "mask": "+44(1432)-######", "cc": "UK", "cd": "United Kingdom", "city": "Hereford" },
{ "mask": "+44(1433)-######", "cc": "UK", "cd": "United Kingdom", "city": "Hathersage" },
{ "mask": "+44(1434)-######", "cc": "UK", "cd": "United Kingdom", "city": "Bellingham(2,4,9), Haltwhistle(3,5), Hexham(6,7,8)" },
{ "mask": "+44(1435)-######", "cc": "UK", "cd": "United Kingdom", "city": "Heathfield" },
{ "mask": "+44(1436)-######", "cc": "UK", "cd": "United Kingdom", "city": "Helensburgh" },
{ "mask": "+44(1437)-######", "cc": "UK", "cd": "United Kingdom", "city": "Clynderwen(2,3,4,5), Haverfordwest(6,7,8,9)" },
{ "mask": "+44(1438)-######", "cc": "UK", "cd": "United Kingdom", "city": "Stevenage" },
{ "mask": "+44(1439)-######", "cc": "UK", "cd": "United Kingdom", "city": "Helmsley" },
{ "mask": "+44(1440)-######", "cc": "UK", "cd": "United Kingdom", "city": "Haverhill" },
{ "mask": "+44(1442)-######", "cc": "UK", "cd": "United Kingdom", "city": "Hemel Hempstead" },
{ "mask": "+44(1443)-######", "cc": "UK", "cd": "United Kingdom", "city": "Pontypridd" },
{ "mask": "+44(1444)-######", "cc": "UK", "cd": "United Kingdom", "city": "Haywards Heath" },
{ "mask": "+44(1445)-######", "cc": "UK", "cd": "United Kingdom", "city": "Gairloch" },
{ "mask": "+44(1446)-######", "cc": "UK", "cd": "United Kingdom", "city": "Barry" },
{ "mask": "+44(1449)-######", "cc": "UK", "cd": "United Kingdom", "city": "Stowmarket" },
{ "mask": "+44(1450)-######", "cc": "UK", "cd": "United Kingdom", "city": "Hawick" },
{ "mask": "+44(1451)-######", "cc": "UK", "cd": "United Kingdom", "city": "Stow-on-the-Wold" },
{ "mask": "+44(1452)-######", "cc": "UK", "cd": "United Kingdom", "city": "Gloucester" },
{ "mask": "+44(1453)-######", "cc": "UK", "cd": "United Kingdom", "city": "Dursley" },
{ "mask": "+44(1454)-######", "cc": "UK", "cd": "United Kingdom", "city": "Chipping Sodbury" },
{ "mask": "+44(1455)-######", "cc": "UK", "cd": "United Kingdom", "city": "Hinckley" },
{ "mask": "+44(1456)-######", "cc": "UK", "cd": "United Kingdom", "city": "Glenurquhart" }
//
// //http://en.wikipedia.org/wiki/Telephone_numbers_in_the_United_Kingdom
// 01457 Glossop
// 01458 Glastonbury
// 01460 Chard
// 01461 Gretna
// 01462 Hitchin
// 01463 Inverness
// 01464 Insch
// 01465 Girvan
// 01466 Huntly
// 01467 Inverurie
// 01469 Killingholme
// 01470 Isle of Skye - Edinbane
// 01471 Isle of Skye - Broadford
// 01472 Grimsby
// 01473 Ipswich
// 01474 Gravesend
// 01475 Greenock
// 01476 Grantham
// 01477 Holmes Chapel
// 01478 Isle of Skye - Portree
// 01479 Grantown-on-Spey
// 01480 Huntingdon
// 01481 Guernsey
// 01482 Hull
// 01483 Guildford
// 01484 Huddersfield
// 01485 Hunstanton
// 01487 Warboys
// 01488 Hungerford
// 01489 Bishops Waltham
// 01490 Corwen
// 01491 Henley-on-Thames
// 01492 Colwyn Bay
// 01493 Great Yarmouth
// 01494 High Wycombe
// 01495 Pontypool
// 01496 Port Ellen
// 01497 Hay-on-Wye
// 01499 Inveraray
// 01501 Harthill
// 01502 Lowestoft
// 01503 Looe
// 01505 Johnstone
// 01506 Bathgate
// 01507 Alford (Lincs)(4,8,9), Louth (3,6,7), Spilsby(2,5)
// 01508 Brooke
// 01509 Loughborough
// 0151 Liverpool
// 01520 Lochcarron
// 01522 Lincoln
// 01524 Lancaster
// 015242 Hornby
// 01525 Leighton Buzzard
// 01526 Martin
// 01527 Redditch
// 01528 Laggan
// 01529 Sleaford
// 01530 Coalville
// 01531 Ledbury
// 01534 Jersey
// 01535 Keighley
// 01536 Kettering
// 01538 Ipstones
// 01539 Kendal
// 015394 Hawkshead
// 015395 Grange-over-Sands
// 015396 Sedbergh
// 01540 Kingussie
// 01542 Keith
// 01543 Cannock
// 01544 Kington
// 01545 Llanarth
// 01546 Lochgilphead
// 01547 Knighton
// 01548 Kingsbridge
// 01549 Lairg
// 01550 Llandovery
// 01553 Kings Lynn
// 01554 Llanelli
// 01555 Lanark
// 01556 Castle Douglas
// 01557 Kirkcudbright
// 01558 Llandeilo
// 01559 Llandysul
// 01560 Moscow
// 01561 Laurencekirk
// 01562 Kidderminster
// 01563 Kilmarnock
// 01564 Lapworth
// 01565 Knutsford
// 01566 Launceston
// 01567 Killin
// 01568 Leominster
// 01569 Stonehaven
// 01570 Lampeter
// 01571 Lochinver
// 01572 Oakham
// 01573 Kelso
// 01575 Kirriemuir
// 01576 Lockerbie
// 01577 Kinross
// 01578 Lauder
// 01579 Liskeard
// 01580 Cranbrook
// 01581 New Luce
// 01582 Luton
// 01583 Carradale
// 01584 Ludlow
// 01586 Campbeltown
// 01588 Bishops Castle
// 01590 Lymington
// 01591 Llanwrtyd Wells
// 01592 Kirkcaldy
// 01593 Lybster
// 01594 Lydney
// 01595 Lerwick, Foula(75), Fair Isle(76)
// 01597 Llandrindod Wells
// 01598 Lynton
// 01599 Kyle
// 01600 Monmouth
// 01603 Norwich
// 01604 Northampton
// 01606 Northwich
// 01608 Chipping Norton
// 01609 Northallerton
// 0161 Manchester
// 01620 North Berwick
// 01621 Maldon
// 01622 Maidstone
// 01623 Mansfield
// 01624 Isle of Man
// 01625 Macclesfield
// 01626 Newton Abbot
// 01628 Maidenhead
// 01629 Matlock
// 01630 Market Drayton
// 01631 Oban
// 01633 Newport
// 01634 Medway
// 01635 Newbury
// 01636 Newark
// 01637 Newquay
// 01638 Newmarket
// 01639 Neath
// 01641 Strathy
// 01642 Middlesbrough
// 01643 Minehead
// 01644 New Galloway
// 01646 Milford Haven
// 01647 Moretonhampstead
// 01650 Cemmaes Road
// 01651 Oldmeldrum
// 01652 Brigg
// 01653 Malton
// 01654 Machynlleth
// 01655 Maybole
// 01656 Bridgend
// 01659 Sanquhar
// 01661 Prudhoe
// 01663 New Mills
// 01664 Melton Mowbray
// 01665 Alnwick
// 01666 Malmesbury
// 01667 Nairn
// 01668 Bamburgh
// 01669 Rothbury
// 01670 Morpeth
// 01671 Newton Stewart
// 01672 Marlborough
// 01673 Market Rasen
// 01674 Montrose
// 01675 Coleshill
// 01676 Meriden
// 01677 Bedale
// 01678 Bala
// 01680 Isle of Mull - Craignure
// 01681 Isle of Mull - Fionnphort
// 01683 Moffat
// 01684 Malvern
// 01685 Merthyr Tydfil
// 01686 Llanidloes(2,3,4,7), Newtown(5,6,8,9)
// 01687 Mallaig
// 01688 Isle of Mull - Tobermory
// 01689 Orpington
// 01690 Betws-y-Coed
// 01691 Oswestry
// 01692 North Walsham
// 01694 Church Stretton
// 01695 Skelmersdale
// 01697 Brampton
// 016973 Wigton
// 016974 Raughton Head
// 01698 Motherwell
// 01700 Rothesay
// 01702 Southend-on-Sea
// 01704 Southport
// 01706 Rochdale
// 01707 Welwyn Garden City
// 01708 Romford
// 01709 Rotherham
// 01720 Isles of Scilly
// 01721 Peebles
// 01722 Salisbury
// 01723 Scarborough
// 01724 Scunthorpe
// 01725 Rockbourne
// 01726 St Austell
// 01727 St Albans
// 01728 Saxmundham
// 01729 Settle
// 01730 Petersfield
// 01732 Sevenoaks
// 01733 Peterborough
// 01736 Penzance
// 01737 Redhill
// 01738 Perth
// 01740 Sedgefield
// 01743 Shrewsbury
// 01744 St Helens
// 01745 Rhyl
// 01746 Bridgnorth
// 01747 Shaftesbury
// 01748 Richmond
// 01749 Shepton Mallet
// 01750 Selkirk
// 01751 Pickering
// 01752 Plymouth
// 01753 Slough
// 01754 Skegness
// 01756 Skipton
// 01757 Selby
// 01758 Pwllheli
// 01759 Pocklington
// 01760 Swaffham
// 01761 Temple Cloud
// 01763 Royston
// 01764 Crieff
// 01765 Ripon
// 01766 Porthmadog
// 01767 Sandy
// 01768 Penrith
// 017683 Appleby
// 017684 Pooley Bridge
// 017687 Keswick
// 01769 South Molton
// 01770 Isle of Arran
// 01771 Maud
// 01772 Preston
// 01773 Ripley
// 01775 Spalding
// 01776 Stranraer
// 01777 Retford
// 01778 Bourne
// 01779 Peterhead
// 01780 Stamford
// 01782 Stoke-on-Trent
// 01784 Staines
// 01785 Stafford
// 01786 Stirling
// 01787 Sudbury
// 01788 Rugby
// 01789 Stratford-upon-Avon
// 01790 Spilsby
// 01792 Swansea
// 01793 Swindon
// 01794 Romsey
// 01795 Sittingbourne
// 01796 Pitlochry
// 01797 Rye
// 01798 Pulborough
// 01799 Saffron Walden
// 01803 Torquay
// 01805 Torrington
// 01806 Shetland
// 01807 Ballindalloch
// 01808 Tomatin
// 01809 Tomdoun
// 01821 Kinrossie
// 01822 Tavistock
// 01823 Taunton
// 01824 Ruthin
// 01825 Uckfield
// 01827 Tamworth
// 01828 Coupar Angus
// 01829 Tarporley
// 01830 Kirkwhelpington
// 01832 Clopton
// 01833 Barnard Castle
// 01834 Narberth
// 01835 St Boswells
// 01837 Okehampton
// 01838 Dalmally
// 01840 Camelford
// 01841 Newquay
// 01842 Thetford
// 01843 Thanet
// 01844 Thame
// 01845 Thirsk
// 01847 Thurso(2,3,4,5,8), Tongue(6,7,9)
// 01848 Thornhill
// 01851 Great Bernera(4,6,9), Stornoway(2,3,5,7,8)
// 01852 Kilmelford
// 01854 Ullapool
// 01855 Ballachulish
// 01856 Orkney
// 01857 Sanday
// 01858 Market Harborough
// 01859 Harris
// 01862 Tain
// 01863 Ardgay
// 01864 Abington
// 01865 Oxford
// 01866 Kilchrenan
// 01869 Bicester
// 01870 Isle of Benbecula
// 01871 Castlebay
// 01872 Truro
// 01873 Abergavenny
// 01874 Brecon
// 01875 Tranent
// 01876 Lochmaddy
// 01877 Callander
// 01878 Lochboisdale
// 01879 Scarinish
// 01880 Tarbert
// 01882 Kinloch Rannoch
// 01883 Caterham
// 01884 Tiverton
// 01885 Pencombe
// 01886 Bromyard
// 01887 Aberfeldy
// 01888 Turriff
// 01889 Rugeley
// 01890 Ayton(5,6,7,9), Coldstream(2,3,4,8)
// 01892 Tunbridge Wells
// 01895 Uxbridge
// 01896 Galashiels
// 01899 Biggar
// 01900 Workington
// 01902 Wolverhampton
// 01903 Worthing
// 01904 York
// 01905 Worcester
// 01908 Milton Keynes
// 01909 Worksop
// 0191 Tyneside(2,4,6), Durham(3), Sunderland(5)
// 01920 Ware
// 01922 Walsall
// 01923 Watford
// 01924 Wakefield
// 01925 Warrington
// 01926 Warwick
// 01928 Runcorn
// 01929 Wareham
// 01931 Shap
// 01932 Weybridge
// 01933 Wellingborough
// 01934 Weston-super-Mare
// 01935 Yeovil
// 01937 Wetherby
// 01938 Welshpool
// 01939 Wem
// 01942 Wigan
// 01943 Guiseley
// 01944 West Heslerton
// 01945 Wisbech
// 01946 Whitehaven
// 019467 Gosforth
// 01947 Whitby
// 01948 Whitchurch
// 01949 Whatton
// 01950 Sandwick
// 01951 Colonsay
// 01952 Telford
// 01953 Wymondham
// 01954 Madingley
// 01955 Wick
// 01957 Mid Yell
// 01959 Westerham
// 01962 Winchester
// 01963 Wincanton
// 01964 Hornsea(2,5,8,9), Patrington(3,4,6,7)
// 01967 Strontian
// 01968 Penicuik
// 01969 Leyburn
// 01970 Aberystwyth
// 01971 Scourie
// 01972 Glenborrodale
// 01974 Llanon
// 01975 Alford (Aberdeen)(2,4,5,9), Strathdon(3,6,7,8)
// 01977 Pontefract
// 01978 Wrexham
// 01980 Amesbury
// 01981 Wormbridge
// 01982 Builth Wells
// 01983 Isle of Wight
// 01984 Watchet
// 01985 Warminster
// 01986 Bungay
// 01987 Ebbsfleet
// 01988 Wigtown
// 01989 Ross-on-Wye
// 01992 Lea Valley
// 01993 Witney
// 01994 St Clears
// 01995 Garstang
// 01997 Strathpeffer
// 020 London
// 023 Southampton(8X), Portsmouth(9X)
// 024 Coventry
// 028 Ballycastle(20), Martinstown(21), Ballymena(25), Ballymoney(27), Larne(28), Kilrea(29), Newry(30), Armagh(37), Portadown(38), Banbridge(40), Rostrevor(41), Kircubbin(42), Newcastle(Co. Down)(43), Downpatrick(44), Enniskillen(66), Lisnaskea(67), Kesh(68), Coleraine(70), Londonderry(71), Limavady(77), Magherafelt(79), Carrickmore(80), Newtownstewart(81), Omagh(82), Ballygawley(85), Cookstown(86), Dungannon(87), Fivemiletown(89), Belfast(90&95), Bangor(Co. Down)(91), Lisburn(92), Ballyclare(93), Antrim(94), Saintfield(97)
// 029 Cardiff
//
//
]
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment