Маска ввода даты в access

Alias definitions

date aliases

$(document).ready(function(){
   $("#date").inputmask("dd/mm/yyyy");
   $("#date").inputmask("mm/dd/yyyy");
   $("#date").inputmask("date"); // alias for dd/mm/yyyy
});

The date aliases take leapyears into account. There is also autocompletion on day, month, year.
For example:

input: 2/2/2012 result: 02/02/2012
input: 352012 result: 03/05/2012
input: 3530 result: 03/05/2030
input: rightarrow result: the date from today

numeric aliases

$(document).ready(function(){
   $("#numeric").inputmask("decimal");
   $("#numeric").inputmask("non-negative-decimal");
   $("#numeric").inputmask("integer");
});

There is autocompletion on tab with decimal numbers.

Define the radixpoint

$(document).ready(function(){
   $("#numeric").inputmask("decimal", { radixPoint: "," });
});

Define the number of digits after the radixpoint

$(document).ready(function(){
   $("#numeric").inputmask("decimal", { digits: 3 });
});

Grouping support through: autoGroup, groupSeparator, groupSize

$(document).ready(function(){
   $("#numeric").inputmask("decimal", { radixPoint: ",", autoGroup: true, groupSeparator: ".", groupSize: 3 });
});

Customization

Initalization

If you are ok with all the default options you can have masked-inputs initalize it self and avoid writing any JavaScript at all. Simply add the attribute to your script tag

Alternativly if you need to pass custom options or want to initalize the script your self you can do so like this

new InputMask( *options* );

masked

Don’t like the class for a selector? Pass an options object instead and set your selector with the masked property or event pass a .

// Selector
new InputMask({
  masked: ".custom-selector"
});

// Node List
new InputMask({
  masked: nodeList
});

number

Want to use something other than X? right now the script handles XdDmMyY9 for numeric placeholding. MM/YY and mm/yy will work fine. Want to use something else, simply pass an options object setting the option.

// Selector
new InputMask({
  number: 'XZdDmMyY9'
});

letter

Want to use something other than X in your placeholder look for masked inputs that require both letters and numbers, you can. You can put different characters in your placeholder, as long as your contains Xs and _ only.

<input placeholder="XXX XXX" pattern="\w\d\w \d\w\d" class="masked" 
      data-charset="?X? X?X" id="zipca" type="text" name="canadianzip" 
        title="6-character alphanumeric code in the format of A1A 1A1">

If you require _ as a special character in your mask? Simply pass an options object setting the option, and also the value of in your HTML.

new InputMask({
  letter: '?'
});
<input placeholder="XXX_XXX" pattern="\w\d\w\_\d\w\d" class="masked" 
      data-charset="?X?_X?X" id="underscore" type="text" name="underscoredstring" 
        title="6-character alphanumeric code in the format of A1A_1A1">

onError

Want to add error handling? Simply pass a function to the option. The function will recieve the keyboard event as the first paramater.

new InputMask({
  onError: function( e ) {
    // Handle your errors!
  }
});

noValidate

As the pattern attribute is being used, you may want to add via javascript the novalidate attribute on any ancestor or form control to disable native browser validation. Do add it via JS, because if the JS fails, native validation is a good alternative.

You can have input masking do this for you by setting the option to true.

new InputMask({
  noValidate: true
});

Exceptions

Complex Regular Expressions

If the digits allowed by your regular expression are constrained or complicated, such as months only allowing 01-12, include a made up attribute that takes as its value a valid value that would match the pattern.

	<label for="expiration"> Credit Card Expiration </label>
    <input id="expiration" type="tel" placeholder="MM/YY" class="masked" 
    	pattern="(1|0)\/(1|2\d)" 
    	data-valid-example="11/18"
    	title="2-digit month and 2-digit year greater than 01/15"> 

I’ve taken care of MM in , because that is common. If you have exceptions, add the exceptions there. If you need an expiration month, it is best to use instead.

Define custom definitions

You can define your own definitions to use in your mask.Start by choosing a masksymbol.

Next define your validator. The validator can be a regular expression or a function.

The return value of a validator can be true, false or a command object.

  • pos : position to insert

  • c : character to insert

  • caret : position of the caret

  • remove : position(s) to remove

    pos or

  • insert : position(s) to add :

    • { pos : position to insert, c : character to insert }
  • refreshFromBuffer :

    • true => refresh validPositions from the complete buffer
    • { start: , end: } => refresh from start to end

Cardinality specifies how many characters are represented and validated for the definition.

The prevalidator option is used to validate the characters before the definition cardinality is reached. (see ‘j’ example)

When you insert or delete characters, they are only shifted when the definition type is the same. This behavior can be overridden by giving a definitionSymbol. (see example x, y, z, which can be used for ip-address masking, the validation is different, but it is allowed to shift the characters between the definitions)

Inputmask.extendDefinitions({'f'{"validator""[0-9\(\)\.\+/ ]","cardinality"1,'prevalidator'null},'g'{"validator"function(chrs,buffer,pos,strict,opts){}"cardinality"1,'prevalidator'null},'j'{    validator"(19|20)\\d{2}",    cardinality4,    prevalidator{ validator"", cardinality1},{ validator"(19|20)", cardinality2},{ validator"(19|20)\\d", cardinality3}},'x'{    validator"",    cardinality1,    definitionSymbol"i"},'y'{validatorfunction(chrs,buffer,pos,strict,opts){var valExp2 =newRegExp("2|");returnvalExp2.test(bufferpos -1+ chrs);},    cardinality1,    definitionSymbol"i"},'z'{validatorfunction(chrs,buffer,pos,strict,opts){var valExp3 =newRegExp("25|2|");returnvalExp3.test(bufferpos -2+ bufferpos -1+ chrs);},    cardinality1,    definitionSymbol"i"}});

Specify a placeholder for a definition.

Defaults can be set as below.

Inputmask.extendDefaults({'autoUnmask'true});Inputmask.extendDefinitions({'A'{    validator"[A-Za-z\u0410-\u044F\u0401\u0451\u00C0-\u00FF\u00B5",    cardinality1,    casing"upper"},'+'{    validator"[0-9A-Za-z\u0410-\u044F\u0401\u0451\u00C0-\u00FF\u00B5",    cardinality1,    casing"upper"}});Inputmask.extendAliases({'Regex'{    mask"r",    greedyfalse,...}});

But if the property is defined within an alias you need to set it for the alias definition.

Inputmask.extendAliases({'numeric'{    allowPlusfalse,    allowMinusfalse}});

However, the preferred way to alter properties for an alias is by creating a new alias which inherits from the default alias definition.

Inputmask.extendAliases({'myNum'{    alias"numeric",    placeholder'',    allowPlusfalse,    allowMinusfalse}});

Once defined, you can call the alias by:

$(selector).inputmask("myNum");

All callbacks are implemented as options. This means that you can set general implementations for the callbacks by setting a default.

Inputmask.extendDefaults({onKeyValidationfunction(key,result){if(!result){alert('Your input is not valid')}}});

Supported markup options

data-inputmask attribute

You can also apply an inputmask by using the data-inputmask attribute. In the attribute, you specify the options wanted for the inputmask. This gets parsed with $.parseJSON (for the moment), so be sure to use a well-formed JSON-string without the {}.

<input data-inputmask="'alias': 'datetime'" />
<input data-inputmask="'mask': '9', 'repeat': 10, 'greedy' : false" />
$(document).ready(function(){
  $(":input").inputmask();
});

data-inputmask-<option> attribute

All options can also be passed through data-attributes.

<input data-inputmask-mask="9" data-inputmask-repeat="10" data-inputmask-greedy="false" />
$(document).ready(function(){
  $(":input").inputmask();
});

.NET Nuget Package Install

PM> Install-Package jQuery.InputMask

In App_Start, BundleConfig.cs

bundles.Add(new ScriptBundle("~/bundles/inputmask").Include(
                        "~/Scripts/jquery.inputmask/jquery.inputmask-{version}.js",
						"~/Scripts/jquery.inputmask/jquery.inputmask.extensions-{version}.js",
						"~/Scripts/jquery.inputmask/jquery.inputmask.date.extensions-{version}.js",
						"~/Scripts/jquery.inputmask/jquery.inputmask.numeric.extensions-{version}.js"));

In Layout

@Scripts.Render("~/bundles/inputmask")

#=========== TODO ===========

getemptymask command

return the default (empty) mask value

$(document).ready(function(){
   $("#test").inputmask("999-AAA");
   var initialValue = $("#test").inputmask("getemptymask");  // initialValue  => "___-___"
});

onKeyUp / onKeyDown option

Use this to do some extra processing of the input when certain keys are pressed.
This can be usefull when implementing an alias, ex. decimal alias, autofill the digits when pressing tab.

see jquery.inputmask.extensions.js for some examples

onBeforePaste

This callback allows for preprocessing the pasted value before actually handling the value for masking. This can be usefull for stripping away some characters before processing.

$(document).ready(function(){
   $("#test").inputmask("99.", {
                repeat: 4,
                onBeforePaste: function (pastedValue) {
                    //do somehing with the value
                    return pastedValue;
                }
            });
});

onBeforeMask

This callback allows for preprocessing the initial value before actually handling the value for masking. This can be usefull for stripping away some characters before processing.

$(document).ready(function(){
   $("#test").inputmask("99.", {
                repeat: 4,
                onBeforeMask: function (initialValue) {
                    //do somehing with the value
                    return initialValue;
                }
            });
});

hasMaskedValue

Check whether the returned value is masked or not; currently only works reliably when using jquery.val fn to retrieve the value

$(document).ready(function(){
	function validateMaskedValue(val){}
	function validateValue(val){}

	var val = $("#test").val();
    if($("#test").inputmask("hasMaskedValue"))
	  validateMaskedValue(val); 
   else validateValue(val); 
});

Поле ввода

Проконсультироватьсясо специалистом 1С

Для 1с поле ввода с типом строка можно применить маску ввода. В 1с маска задает формат представления данных и ограничивает вводимой информации. Это очень удобно бывает во многих жизненных задачках, например ввод телефона, ввод специального кода или представления номера. В 1с маску можно задать как интерактивно «в режиме конфигуратора», так и программно.

Для 1с поле ввода маска доступны следующие форматы ограничители. Ввод только числовых данных: * 9 – вводятся только цифры * # – вводятся цифры и знаки «+» «-» и пробел * h ввод шестеричных цифр

Ввод цифр и букв: * @ – ввод символов алфавита, и при этом они будут преобразованы в верхний регистр * N – разрешен ввод алфавитных символов но уже можно контролировать регистр. * U – вводи символов алфавита с преобразованием в верхней регистр. Отличие между U и @ не смог найти. * ! – любой введенный символ автоматический преобразуется к верхнему регистру * X – разрешен ввод только латиницы

Для запрет ввода символа «^» в 1с поле ввода, необходимо прописать этот символ в маску

В маске могут присутствовать специальные символы «.» , «(», «)», «-» и «,» и некоторые другие, они позволяют форматировать строку.

Например, нам нужно указать, что номер вводится с указанием кода города. То нужно прописать 1с маску ввода «9 (999) 999 99 99» или «9 (999) 999-99-99». Все зависит от требуемого формата представления строки. Или допустим нам нужно ввести формат дополнительного номера накладной типа «код подразделение.месяц.год», тогда маска будет «UUUU.99.9999» или «UUUU/99/9999»

Стоит помнить что, задавая маску – мы обязаны задать её полностью такой длины, какой длины вводится строка. Либо если существуют несколько форматов строки, короткий и длинный – то можно задать две и более масок, через запятую.

Например, вводим сотовый телефон клиента, либо городской (без указания кода города), тогда 1c маска будет 9 (999) 999-99-99;999-99-99

Из справки 1С: ПолеВвода (TextBox) — Маска (Mask) Использование: Чтение и запись. Описание: Тип: Строка. Содержит посимвольную строку маски интерактивного ввода текста в поле. В строке маски допустимо использование следующих специальных символов: ! — любой введенный символ преобразуется в верхний регистр; 9 — допустимо ввести произвольный символ цифры; # — допустимо ввести произвольный символ цифры или — (знак минус) или + (знак плюс) или пробел; N — допустимо ввести любые алфавитно-цифровые символы (буквы или цифры); U — допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) и любой введенный символ преобразуется в верхний регистр; X (латинского алфавита) — допустимо ввести произвольный символ; ^ — не допустимо вводить этот символ интерактивно пользователем, он может устанавливаться только из языка; h — допустим ввод символов обозначения шестнадцатеричных цифр; @ – допустимо ввести любые алфавитно-цифровые символы (буквы или цифры) в верхнем регистре или пробел. При помещении значения из поля ввода с маской в текстовый реквизит, связанный с этим полем ввода, происходит следующее преобразование: на тех позициях, где в маске стоит символ «@», а в строке пробел – пробел удаляется. Если в маске из специальных символов используются только символы «@», то все символы текста, соответствующие символам маски, не являющимся специальными символами, удаляются после по-следнего непустого блока из символов «@». Например, при маске «@@.@@.@@.» текст «41. 2. .» преобразуется в «41.2». Для того, чтобы использовать в маске один из специальных символов, нужно использовать перед ним символ «». Допускается указание нескольких масок в одном параметре. Маски разделяются символом «;». В этом случае использоваться будет та маска, к которой подходит введенный текст. Недоступно на сервере 1С:Предприятие. Не используется в модуле внешнего соединения.

Properties

Name Type Default
disabled Boolean false

Sets or gets whether the widget is disabled.

$('#jqxMaskedInput').jqxMaskedInput({ disabled: true});

Get the property.

Try it: disabled is set to true

height Number/String null

Sets or gets height of the masked input in pixels.

$('#jqxMaskedInput').jqxMaskedInput({ height: '25px'});

Get the property.

Try it: height is set to ’25px’

mask String ‘#####’

Sets or gets the masked input’s mask.

Mask characters:

  • # — For digit character. Accepts values from 0 to 9
  • 9 — For digit character. Accepts values from 0 to 9
  • 0 — For digit character. Accepts values from 0 to 9
  • A — For alpha numeric character. Accepts values from 0 to 9 and from a to z and A to Z.
  • L — For alpha character. Accepts values from a to z and A to Z
  • — For character set. Matches any one of the enclosed characters. You can specify a range of characters by using a hyphen. For example, is the same as .
    Examples: — accepts values from 0 to 5. — accepts only a or b.

Get the property.

Try it: mask is set to ‘###-##-####’

promptChar String «_»

Sets or gets the prompt char displayed when an editable char is empty.

$('#jqxMaskedInput').jqxMaskedInput({ promptChar: "." });

Get the property.

Try it: promptChar is set to «#»

readOnly Boolean false

Sets or gets the readOnly state of the input.

$('#jqxMaskedInput').jqxMaskedInput({ readOnly: true });

Get the property.

Try it: readOnly is set to true

rtl Boolean false

Sets or gets a value indicating whether widget’s elements are aligned to support locales using right-to-left fonts.

Get the property.

Try it: rtl is set to true

theme String »

Sets the widget’s theme.

jQWidgets uses a pair of css files — jqx.base.css and jqx..css. The base stylesheet creates the styles related to the widget’s layout like margin, padding, border-width, position. The second css file applies the widget’s colors and backgrounds. The jqx.base.css should be included before the second CSS file.
In order to set a theme, you need to do the following:

  • Include the theme’s CSS file after jqx.base.css.
    The following code example adds the ‘energyblue’ theme.

  • Set the widget’s theme property to ‘energyblue’ when you initialize it.

Try it: theme is set to ‘energyblue’

textAlign String left

Sets or gets the text alignment.

Possible Values:

Initialize a MaskedInput with the property specified.

$('#jqxMaskedInput').jqxMaskedInput({ textAlign: "right"});

Get the property.

Try it: textAlign is set to ‘right’

value String null

Sets or gets the masked input’s value.

Get the property.

Try it: value is set to 300

width Number/String null

Sets or gets width of the masked input in pixels. Only positive values have effect.

$('#jqxMaskedInput').jqxMaskedInput({ width: '250px'});

Get the property.

Try it: width is set to ‘250px’

change Event

This event is triggered when the value is changed and the control’s focus is lost.

Bind to the event by type: jqxMaskedInput.

Try it: Bind to the change event by type:jqxMaskedInput

valueChanged Event

This event is triggered when the value is changed.

Bind to the event by type: jqxMaskedInput.

Try it: Bind to the valueChanged event by type:jqxMaskedInput

clear Method

Clears the value.

Parameter Type Description
None

Return ValueNone

Invoke the method.

Try it: clears the jqxMaskedInput

destroy Method

Destroys the widget.

Parameter Type Description
None

Return ValueNone

Invoke the method.

Try it: destroys the jqxMaskedInput

focus Method

Focuses the widget.

Parameter Type Description
None

Return ValueNone

Invoke the method.

Try it: focuses the jqxMaskedInput

val Method

Sets or gets the value.

Parameter Type Description
value String

Return ValueString

Get the value using the val method.

// Get the value using jQuery’s val.

Set the value using the val method.

// Set the value using jQuery’s val.

Try it: sets the value of the jqxMaskedInput

General

set a value and apply mask

this can be done with the traditional jquery.val function (all browsers) or JavaScript value property for browsers which implement lookupGetter or getOwnPropertyDescriptor

$(document).ready(function(){
   $("#number").val(12345);

   var number = document.getElementById("number");
   number.value = 12345;
});

with the autoUnmaskoption you can change the return of $.fn.val (or value property) to unmaskedvalue or the maskedvalue

$(document).ready(function(){
       $('#<%= tbDate.ClientID%>').inputmask({ "mask": "d/m/y", 'autoUnmask' : true});    //  value: 23/03/1973
    alert($('#<%= tbDate.ClientID%>').val());    // shows 23031973     (autoUnmask: true)

    var tbDate = document.getElementById("<%= tbDate.ClientID%>");
    alert(tbDate.value);    // shows 23031973     (autoUnmask: true)
});

auto upper/lower- casing inputmask

You can define within a definition to automatically lowercase or uppercase the entry in an input by giving the casing.Casing can be null, «upper» or «lower»

   Inputmask.extendDefinitions({
        'A': {
            validator: "",
            cardinality: 1,
            casing: "upper" //auto uppercasing
        },
        '+': {
            validator: "",
            cardinality: 1,
            casing: "upper"
        }
    });

Include jquery.inputmask.extensions.js for using the A and # definitions.

$(document).ready(function(){
   $("#test").inputmask("999-AAA");    //   => 123abc ===> 123-ABC
});

date & datetime extensions

$(document).ready(function(){
   $(selector).inputmask("dd/mm/yyyy");
   $(selector).inputmask("mm/dd/yyyy");
   $(selector).inputmask("date"); // alias for dd/mm/yyyy
   $(selector).inputmask("date", {yearrange: { minyear: 1900, maxyear: 2099 }}); //specify year range
});

The date aliases take leap years into account. There is also autocompletion on day, month, year.
For example:

input: 2/2/2012 result: 02/02/2012
input: 352012 result: 03/05/2012
input: 3/530 result: 03/05/2030
input: ctrl rightarrow result: the date from today

$(document).ready(function(){
   $(selector).inputmask("datetime"); // 24h
   $(selector).inputmask("datetime12"); // am/pm
});

Определение пользовательского символа маски

Вы можете определить свои собственные символы для использования в вашей маске. Начните с выбора символа маски.

валидатор(chrs, maskset, pos, strict, opts)

Затем определите свой валидатор. Проверка может быть регулярным выражением или функцией.

Возвращаемое значение валидатор может быть истинным, ложным или объектом.

Опциональные команды

  • pos : позиция для вставки

  • c : символ для вставки

  • caret : позиция каретки

  • remove : позиция (позиции) для удаления

    pos или

  • insert : позиции (позиций) для добавления :

    • { pos : позиция вставки, c : символ для вставки }
  • refreshFromBuffer :

    • true => refresh validPositions from the complete buffer
    • { start: , end: } => refresh from start to end

prevalidator(chrs, maskset, pos, strict, opts)

Опция предварительной проверки используется для проверки символов перед кардинальным определением, которое будет достигнуто. (См ‘J’ пример)

definitionSymbol

При вставке или удалении символов, они смещаются только тогда, когда определение типа является то же самое. Такое поведение может быть отменено, давая definitionSymbol. (См пример х, у, z, который может быть использован для IP-адреса маски, проверка отличается, но допускается сдвиг символов между определениями)

Inputmask.extendDefinitions({
  'f': {  //masksymbol
    "validator": "[0-9\(\)\.\+/ ]",
    "cardinality": 1,
    'prevalidator': null
  },
  'g': {
    "validator": function (chrs, buffer, pos, strict, opts) {
      //do some logic and return true, false, or { "pos": new position, "c": character to place }
    }
    "cardinality": 1,
    'prevalidator': null
  },
  'j': { //basic year
    validator: "(19|20)\\d{2}",
    cardinality: 4,
    prevalidator: 
      { validator: "", cardinality: 1 },
      { validator: "(19|20)", cardinality: 2 },
      { validator: "(19|20)\\d", cardinality: 3 }
    
  },
  'x': {
    validator: "",
    cardinality: 1,
    definitionSymbol: "i" //это позволяет сдвига значениt из других определений, с тем же символом маски или определения символа
  },
  'y': {
    validator: function (chrs, buffer, pos, strict, opts) {
      var valExp2 = new RegExp("2|");
      return valExp2.test(bufferpos - 1 + chrs);
    },
    cardinality: 1,
    definitionSymbol: "i"
  },
  'z': {
    validator: function (chrs, buffer, pos, strict, opts) {
      var valExp3 = new RegExp("25|2|");
      return valExp3.test(bufferpos - 2 + bufferpos - 1 + chrs);
    },
    cardinality: 1,
    definitionSymbol: "i"
  }
});

set defaults

Значения по умолчанию могут быть установлены, как показано ниже.

Inputmask.extendDefaults({
  'autoUnmask': true
});
Inputmask.extendDefinitions({
  'A': {
    validator: "",
    cardinality: 1,
    casing: "upper" //автоматический перевод в верхний регистр
  },
  '+': {
    validator: "",
    cardinality: 1,
    casing: "upper"
  }
});
Inputmask.extendAliases({
  'Regex': {
    mask: "r",
    greedy: false,
    ...
  }
});

Но если свойство определяется в качестве псевдонима необходимо установить его для определения псевдонима.

Inputmask.extendAliases({
  'numeric': {
    allowPlus: false,
    allowMinus: false
  }
});

Тем не менее, предпочтительный способ, чтобы изменить свойства псевдонима путем создания нового псевдонима, который наследуется из определения псевдонима по умолчанию.

Inputmask.extendAliases({
  'myNum': {
    alias: "numeric",
    placeholder: '',
    allowPlus: false,
    allowMinus: false
  }
});

После того, как определено, вы можете вызвать псевдоним с помощью:

$(selector).inputmask("myNum");

Все обратные вызовы реализованы в виде опций. Это означает, что вы можете установить общие для реализации обратных вызовов путем установки по умолчанию.

Inputmask.extendDefaults({
  onKeyValidation: function(key, result){
    if (!result){
      alert('Ваше введенное значение не верно')
    }
  }
});

Usage:

Include the js-files which you can find in the dist-folder. You have the bundled file which contains the main plugin code and also all extensions (date, numerics, other) or if you prefer to only include some parts, use the separate js-files in the dist/min folder.

The minimum to include is the jquery.inputmask.js

<script src="jquery.js" type="text/javascript"></script>
<script src="jquery.inputmask.js" type="text/javascript"></script>

Define your masks:

$(document).ready(function(){
   $(selector).inputmask("99-9999999");  //static mask
   $(selector).inputmask("mask", {"mask": "(999) 999-9999"}); //specifying fn & options
   $(selector).inputmask({"mask": "99-9999999"}); //specifying options only
   $(selector).inputmask("9-a{1,3}9{1,3}"); //mask with dynamic syntax 
});

or via data-inputmask attribute

<input data-inputmask="'alias': 'date'" />
<input data-inputmask="'mask': '9', 'repeat': 10, 'greedy' : false" />
<input data-inputmask="'mask': '99-9999999'" />
$(document).ready(function(){
    $(":input").inputmask();
});

Any option can also be passed through the use of a data attribute. Use data-inputmask-<the name op the option>=»value»

<input id="example1" data-inputmask-clearmaskonlostfocus="false" />
<input id="example2" data-inputmask-regex="[a-za-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:(?:*)?\.)+(?:*)?" />
$(document).ready(function(){
   $("#example1").inputmask("99-9999999");
   $("#example2").inputmask("Regex");
});

Default masking definitions

  • 9 : numeric
  • a : alphabetical

There are more definitions defined within the extensions.
You can find info within the js-files or by further exploring the options.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector