| Версия 5.2
Введение
Установка
Администрирование
Сеть
Объекты
Почта
Сигналы
Доступ
Услуги
Справочник
Кластеры
Программы
Разное
Лицензирование
Веб Почта
Pronto!
PBX
Программы | Данные | CLI/API | Правила | CG/PL | PBXApp | XIMSS | WebApp | WSSP | Помощники
# Программирование Веб-Сервера (WSSP) Элементы Сценария Выражения Текстовые Элементы Структурные Элементы Модуль Веб Приложения CommuniGate Pro обрабатывает запросы для WSSP файлов вызывая компонент, который создаёт набор данных - словарь, содержащий ключи - текстовые строки и значения, связанный с этими ключами. Значения могут быть текстовыми строками, числами, отметками о времени или словарями. Дополнительную информацию о типах данных смотрите в разделе Данные. Например, когда требуется вывести страницу Домена по умолчанию, вызывается специальный компонент. Компонент обрабатывает параметры запроса (HTML FORM) и создаёт набор данных - словарь, содержащий ключи и их значения. Например, набор данных, созданный компонентом при обработки запроса на Вход (Login) может содержать ключи `canAutoSignup`, `hasMailLists` и `hasCertificate`. Модуль Веб Приложения может затем использовать код сценария из WSSP файла для преобразования этого набора данных в страницу, использующую язык разметки (HTML, WML и т.д.).

## Элементы Сценария

WSSP файл является файлом с языком разметки (обычно - HTML) с двумя дополнительными типами элементов:

- текстовыми элементами, начинающимися и заканчивающимися двумя символами процентов (`%%`)
- структурными элементами, начинающимися маркером `<!--%%` и заканчивающимися маркером `-->`.

Ниже приводится образец WSSP документа:

    <html>
    <body>

    <h1>Welcome to %%server%%. Your ID is %%ID%%.</h1>

    <!--%%IF EXISTS(lastLogin)-->
    Last time you visited us on %%lastLogin%%
    <!--%%ENDIF-->

    </body>
    </html>

Этот WSSP документ содержит текстовые элементы `%%server%%`, `%%ID%%` и `%%lastLogin%%`, а также структурные элементы `<!--%%IF EXISTS(lastLogin)-->` и `<!--%%ENDIF-->` (эти текстовые элементы являются фиктивными, не пытайтесь использовать эти примеры в ваших .wssp страницах).

Если WSSP документ должен содержать не ASCII символы, то должна использоваться кодировка UTF-8. При обработки WSSP документа, модуль Веб Приложения запрашивает значение строки `charset` из созданного словаря с данными. Если этот значение не равно `UTF-8`, то WSSP текст преобразовывается в эту кодировку страницы.

## Выражения

Текстовые и структурные элементы WSSP используют выражения - комбинации имён и символов, при помощи которых задаются данные, получаемые из словарей и других доступных источников данных.

В сценариях WSSP используется несколько типов выражений:

- элемент данных
- сканнер массива
- элемент с ключом
- индексированный элемент
- функция
- логическое выражение

Алфавитно-цифровая строка (такая как `system` или `id`) является именем элемента данных. Значением такого выражения является значение из набора данных, связанного с этим именем. Если в наборе данных не имеется указанного ключа, то значением выражения является нулевое значение.
Пример: набор данных имеет ключ `system` и связанное с ним значение строку `Sun Solaris`; соответственно, значением выражения `system` является строка `Sun Solaris`.

Словарь набора данных является независимым от регистра, так что имена элементов данных также являются независимыми от регистра.

Алфавитно-цифровая строка, за которое следуют символы `[]`интерпретируется как имя сканнера индекса. Она может использоваться только внутри структуры `<!--%%FOREACH name...-->` ....`<!--%%ENDFOR name-->`, где определён этот элемент индекса (смотрите ниже). Имена сканнеров индекса независимы от регистра.

Выражение, за которым следует символ точка (`.`) и алфавитно-цифровая строка является элементом с ключом. Выражение до символа точки вычисляется и его значение должно быть словарём. Алфавитно-цифровая строка после символа точки задаёт ключ, который будет использоваться для получения значения из этого словаря. Если значением выражения до символа точка не является словарь или если он не содержит указанного ключа, то значение элемента с ключом является нулевым.
Ключи могут быть указаны как строки в кавычках, в этом случае они могут содержать не алфавитно-цифровые символы.
Пример: набор данных имеет ключ `settings` и связанное с ним значение двухэлементный словарь`{OS = "Sun Solaris"; CPU = "sparc";}`. Значением выражения `settings.OS` является строка `Sun Solaris`, а значение выражения `settings."OS1"` является нулевым.

Выражение, за которым следует выражение индекса в квадратных скобках (`[index]`) является индексированным элементом. Выражение до квадратной скобки вычисляется, его значение должно быть массивом или словарём. Выражение индекса вычисляется и его значением должно быть число или строка, представляющая число. Это число указывает, какой именно элемент массива или ключ словаря будет значением этого индексированного выражения. Если значение выражения индекса равно `нулю`, то возвращается первый элемент массива или первый ключ словаря.
Выражение индекса может быть задано как числовая константа.
Если значение выражения до символа квадратная скобка не является массивом или словарём, или значение выражения индекса не является числом, или если значение выражения индекса имеет отрицательное, либо больше либо равное, чем число элементов массива/словаря, значение, то значение выражения индекса считается нулевым.

Алфавитно-цифровая строка, за которой следует символ `(`, является вызовом функции. Элементы после символа `(` задают параметры функции, за которыми должен следовать символ `)`.
Имена функций независимы от регистра.
В следующем списке приводятся все доступные функции и их параметры.

Логическое (булево) значение выражения положительно (истинно), если:

- значение выражение является строкой, не начинающейся с символов `N`, `n`, `-` и `0`, или
- значение выражения является ненулевым числом.
- значение выражения является отметкой о времени и это не константа "далёкое прошлое".

`SESSION(key)`
  Эта функция может использоваться только в сессионно-ориентированных запросах. Значением функции является значение набора данных сессии, связанного со строкой key. Параметр key может быть задан как алфавитно-цифровая строка или строка в кавычках.
  Пример: значением выражения `SESSION(accountName)` является имя Пользователя CommuniGate Pro, для которого была открыта эта сессия.
  Набор данных сессии является независимым от регистра. В нём содержатся следующие ключи и значения:

  Ключ | Значение
  --- | ---
  `ID` | строка с уникальным идентификатором этой сессии
  `accountName` | строка с именем Пользователя сессии
  `domainName` | строка с именем Домена, которому принадлежит Пользователь этой сессии
  `filesRef` | строка с URL-префиксом, необходимым для получения файлов Вида Интерфейса сессии
  `fullAccountName` | строка с полным именем Пользователя сессии `accountName@domainName`
  `loginAddress` | строка, содержащая сетевой (IP) адрес, с которого этот пользователь установил сессию
  `loginTime` | отметка о времени начала сессии
  `mailboxes` | массив, в котором содержатся имена всех "выбираемых" папок
  `selectedMailbox` | строка с именем требуемой Папки для последней операции Копировать/Передвинуть
  `webFolders` | массив с именами папок в Хранилище Файлов
  `selectedWebFolder` | строка с именем требуемой Папки в Хранилище Файлов для последней операции Записать Файлы
  `webSiteEnabled` | этот элемент - строка со значением `"YES"` существует, если Лимит Хранилища для Хранилища Файлов не установлен в ноль

`SETTINGS(key)`
  Эта функция может использоваться только в сессионно-ориентированных запросах. Значением функции является значение фактически действующей настройки Веб Интерфейса Пользователя, связанной со строкой key. Параметр key может быть задан как алфавитно-цифровая строка или строка в кавычках.
`ACCOUNTSETTINGS(key)`
  Эта функция может использоваться только в сессионно-ориентированных запросах. Значением функции является значение фактически действующей установки Пользователя, связанной со строкой key. Параметр key может быть задан как алфавитно-цифровая строка или строка в кавычках.
`INCLUDEARG(number)`
  Эта функция может использоваться только внутри включаемого файла. Key должно быть десятичным числом, указывающим номер параметра элемента `<!--%%INCLUDE-->` которым был вызван этот файл.
  Первый параметр имеет номер 0.
  Если в элементе `<!--%%INCLUDE-->` не было указано достаточное количество параметров, то значение функции является нулевым.
`EXISTS(expression)`
  Параметром является выражение. Его значение вычисляется и функция возвращает строку `"YES"`, если вычисленное значение не является нулевым или строку `"NO"`, если возвращённое значение является нулевым.
`DOESNOTEXIST(expression)`
  Параметром является выражение. Его значение вычисляется и функция возвращает строку `"NO"`, если вычисленное значение не является нулевым или строку `"YES"`, если возвращённое значение является нулевым.
`YESNO(expression)`
  Параметром является выражение. Его логическое значение вычисляется и, если оно положительно (истинно), то функция возвращает строку `"YES"`; в противном случает она возвращает строку `"NO"`.
`BOOLARRAY()`
  Значением является 2-х элементных массив, содержащий строки `"NO"` и `"YES"`.
`NOT(expression)`
  Параметром является выражение. Вычисляется логическое значение и функция возвращает нулевое значение, если значение значение положительно (истинно); иначе функция возвращает строку `"YES"`.
`EQUALS(expression1 AND expression2)`
  Оба выражения вычисляются и, если вычисленные значения совпадают (включая случай, когда оба выражения имеют нулевое значение), то функция возвращает строку `"YES"`. В противном случае функция возвращает нулевое значение.
`EQUALSNOCASE(expression1 AND expression2)`
  Оба выражения вычисляются. Функция возвращает строку `"YES"`, если оба вычисленных выражения имеют нулевое значение, либо они являтся строками и эти строки совпадают при использовании независимой от регистра операции ASCII сравнения. Во всех других случаях функция возвращает нулевое значение.
`EQUALS(expression AND string)`
  Значение выражения вычисляется и сравнивается со строкой в кавычках. Если значение соответствует строке, то функция возвращает строку `"YES"`. В противном случае функция возвращает нулевое значение.
`EQUALSNOCASE(expression AND string)`
  Значение выражения вычисляется и сравнивается со строкой в кавычках. Функция возвращает строку `"YES"`, если вычисленное выражение совпадает со строкой при использовании независимой от регистра операции ASCII сравнения. В противном случае функция возвращает нулевое значение.
`ISINDEX(expression IN scanner)`
  Scanner должен быть именем внешней по отношению к этой части кода сценария конструкции `<!--%%FOREACH scanner IN ...-->`. Значение выражения вычисляется и, если строка и её числовое значение совпадают с текущим индексом в массиве, для которого используется этот scanner, то функция возвращает строку `"YES"`. В противном случае функция возвращает нулевое значение.
`ISFIRST(scanner)`
  Scanner должен быть именем внешней по отношению к этой части кода сценария конструкции `<!--%%FOREACH scanner IN ...-->`. Если текущее значение индекса массива равно нулю, то функция возвращает строку `"YES"`. В противном случае функция возвращает нулевое значение.
`ISEVEN(scanner)`
  Scanner должен быть именем внешней по отношению к этой части кода сценария конструкции `<!--%%FOREACH scanner IN ...-->`. Если текущее значение индекса чётное, то функция возвращает строку `"YES"`. В противном случае функция возвращает нулевое значение.
`ISHALF(scanner)`
  Scanner должен быть именем внешней по отношению к этой части кода сценария конструкции `<!--%%FOREACH scanner IN ...-->`. Если текущее значение индекса равно числу элементов массива или словаря, разделённому на 2, то функция возвращает строку `"YES"`. В противном случае функция возвращает нулевое значение.
`CHECKED(expression)`
  Параметром является выражение. Вычисляется его логическое значение и, если значение положительно (истинно), то функция возвращает строку `"checked"`; в противном случае функция возвращает нулевое значение.
`HASPARENTMAILBOX(expression)`
  Параметром является выражение. Его значение вычисляется и функция возвращает строку `"YES"`, если вычисленное значение является строкой, являющейся именем иерархической папки. В противном случае функция возвращает нулевое значение.
`ISSTRING(expression)`
  Параметром является выражение. Его значение вычисляется и функция возвращает строку `"YES"`, если вычисленное значение является строкой. В противном случае функция возвращает нулевое значение.
`ISNUMBER(expression)`
  Параметром является выражение. Его значение вычисляется и функция возвращает строку `"YES"`, если вычисленное значение является числом. В противном случае функция возвращает нулевое значение.
`ISARRAY(expression)`
  Параметром является выражение. Его значение вычисляется и функция возвращает строку `"YES"`, если вычисленное значение является массивом. В противном случае функция возвращает нулевое значение.
`ISDICTIONARY(expression)`
  Параметром является выражение. Его значение вычисляется и функция возвращает строку `"YES"`, если вычисленное значение является словарём. В противном случае функция возвращает нулевое значение.
`ISDATE(expression)`
  Параметром является выражение. Его значение вычисляется и функция возвращает строку `"YES"`, если вычисленное значение является объектом типа отметка о времени. В противном случае функция возвращает нулевое значение.
`ISDATA(expression)`
  Параметром является выражение. Его значение вычисляется и функция возвращает строку `"YES"`, если вычисленное значение является объектом типа блок данных. В противном случае функция возвращает нулевое значение.
`NULL()`
  Эта функция возвращает нулевое значение.
`EMPTYSTRING()`
  Значением этой функции является пустая строка.
`EMPTYARRAY()`
  Значением этой функции является массив нулевых элементов.
`EMPTYDICTIONARY()`
  Значением этой функции является пустой словарь.
`CURRENTTIME()`
  Значением функции является отметка о времени - текущее глобальное время.
`SELECTEDLANGUAGE()`
  Значением функции является строка с именем текущего "выбранного языка".
`SELECTEDTIMEZONE()`
  Значением функции является строка с именем текущего "выбранного часового пояса".
`STRING(key)`
  Значением этой функции является объект, связанный с key в Наборе Текстовых Данных Вида Интерфейса. Объект должен быть строкой, в противном случае функция возвращает нулевое значение. Key может быть задан либо как строка в кавычках, либо как выражение - значение выражения вычисляется и используется как key.
`DICTIONARY(key)`
  Значением этой функции является объект, связанный с key в Наборе Текстовых Данных Вида Интерфейса. Объект должен быть словарём, в противном случае функция возвращает нулевое значение. Key может быть задан либо как строка в кавычках, либо как выражение - значение выражения вычисляется и используется как key.
`ARRAY(key)`
  Значением этой функции является объект, связанный с key в Наборе Текстовых Данных Вида Интерфейса. Объект должен быть массивом, в противном случае функция возвращает нулевое значение. Key может быть задан либо как строка в кавычках, либо как выражение - значение выражения вычисляется и используется как key.
`TRANSLATE(string USING dictionary)`
  Параметр string является выражением, которое должно возвращать значение типа строка; параметр dictionary является выражением, которое должно возвращать значение типа словарь. Если для ключа, заданного значением первого параметра в словаре, содержится значение типа строка, то функция возвращает эту строку. В противном случае возвращается значение параметра string;
  Пример: набор данных содержит элемент `boxName` с значением типа строка `INBOX` и элемент `boxNames` - словарь `{INBOX = Incoming; Trash = "Trash Can";}`. Значением выражение `TRANSLATE(boxName USING boxNames)` является строка `"Incoming"`.
`CONTAINS(string IN array)`
  Если значение параметра array является массивом и строка совпадает с одним из элементов массива, то функция возвращает строку `"YES"`. В противном случае функция возвращает нулевое значение.
  Строка может быть задана либо как строка в кавычках, либо как выражение.
`RANDOMELEMENT(array)`
  Параметр array является выражением, которое должно возвращать значение типа массив; значением этой функции является случайным образом выбранный элемент массива.
`MONTHNAMES()`
  Функция возвращает фиксированный массив из 12 строковых элементов: `("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")`.
`WEEKDAYS()` и `WEEKDAYS(expression)`
  Если выражение не указано, то функция возвращает фиксированный массив из 7 строковых элементов: (`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`).
  Если указано выражение, то его значением должна быть строка с одним из названий дня недели; в этом случае функция возвращает массив с названиями дней недели, начинающийся с указанного дня недели:
    `WEEKDAYS(startOfWeek)`
    возвращает `("Tue","Wed","Thu","Fri","Sat","Sun","Mon")` если значение переменной startOfWeek было `"Tue"`.
`KNOWNCHARSETS()`
  Функция возвращает фиксированный массив строковых элементов - названий кодировок, известных системе: `("ISO-8059-1","ISO-2022-jp","KOI8-R", ...)`.
`KNOWNTIMEZONES()`
  Функция возвращает фиксированный массив строковых элементов - названий часовых поясов, известных системе `("NorthAmerica/Pacific","Europe/Central","(+0900) Japan/Korea", ...)`
`REQUESTSECURE()`
  Функция возвращает строку `"YES"`, если текущий HTTP запрос является безопасным (то есть, отправленным по HTTPS протоколу); в противном случае функция возвращает нулевое значение.

Логические выражения являются двумя выражениями, разделёнными символами `|` (ИЛИ), символом `&` (И) или символом `^` (ИСКЛЮЧАЮЩЕЕ ИЛИ). Вы так же можете использовать скобки:

  `expression1 | expression2
  expression1 & expression2
  (expression1 & expression2) | expression3`

## Текстовые Элементы

Текстовые элементы указываются в двойных знаках процентов. Телом текстового элемента является выражение с (опционально) префиксом.

`%%expression%%`
  Выражение вычисляется. Если значением выражения является строка или число, то оно заменяет собой текстовый элемент в результирующем коде разметки.
  В противном случае весь текстовый элемент удаляется из результирующего кода разметки.
`%%HTML:expression%%`
  Выражение вычисляется. Если значением выражения является строка или число, то оно заменяет собой текстовый элемент, используя специальные HTML символы. Значение строки конвертируется из UTF-8 в требуемую кодировку.
  В противном случае весь текстовый элемент удаляется из результирующего кода разметки.
  Пример:
    Если результатом выражения является строка `">=GO=>"`, то этот текстовый элемент заменяется на:

        &gt;=GO=&gt;

`%%HTMLUTF8:expression%%`
  Выражение вычисляется. Если значением выражения является строка или число, то оно заменяет собой текстовый элемент, используя специальные HTML символы (строка не конвертируется из UTF-8 в кодировку страницы).
  В противном случае весь текстовый элемент удаляется из результирующего кода разметки.
  Пример:
    Если результатом выражения является строка `>=GO=>`, то этот текстовый элемент заменяется на:

        &gt;=GO=&gt;

`%%URL:expression%%`
  Выражение вычисляется. Если значением выражения является строка или число, то оно заменяет собой текстовый элемент, используя специальные символы для URL.
  В противном случае весь текстовый элемент удаляется из результирующего кода разметки.
  Пример:
    Если результатом выражения является строка `"Stop It?"`, то этот текстовый элемент заменяется на:

        Stop%20It%3F

`%%MAILBOXRAWNAME:expression%%`
  Выражение вычисляется. Если значение не является строкой, то весь текстовый элемент удаляется из результирующего кода разметки. Если результатом является строка, то она преобразовывается в характерное для IMAP имя папки в кодировке UTF-8, затем она преобразовывается в требуемую кодировку, а затем преобразованная строка заменяет собой текстовый элемент, используя специальные HTML символы.
`%%MAILBOXNAME:expression%%`
  Выражение вычисляется. Если значение не является строкой, то весь текстовый элемент удаляется из результирующего кода разметки. Если результатом является строка X, то вычисляется выражение `TRANSLATE(X USING DICTIONARY("MailboxNames"))`. Затем префикс работает аналогично префиксу `MAILBOXRAWNAME:`.
`%%MAILBOXLASTNAME:expression%%`
  Выражение вычисляется. Если значение не является строкой, то весь текстовый элемент удаляется из результирующего кода разметки. Если результатом является строка X, то она интерпретируется как имя папки. Если это имя иерархической папки, то используется только последняя часть имени; в противном случае используется всё имя. Имя (или его последняя часть) преобразовывается таким же образом, как и при использовании префикса `MAILBOXNAME:`.
`%%URLMAILBOXPARENT:expression%%`
  Выражение вычисляется. Если значение не является строкой, то весь текстовый элемент удаляется из результирующего кода разметки. Если результатом является строка X, то она интерпретируется как имя папки. Если это имя иерархической папки, то используется имя родительской папки. Оно преобразовывается таким же образом, как и при использовании префикса `URL:`. Если это имя не иерархической папки, то весь текстовый элемент удаляется из результирующего кода разметки.
`%%JAVASCRIPT:expression%%`
  Выражение вычисляется. Если значение не является строкой или числом, то весь текстовый элемент удаляется из результирующего кода разметки. Если значением выражения является строка или число, то оно заменяет собой текстовый элемент, используя специальные символы для JavaScript. Результат преобразовывается в Unicode и все не ASCII символы представляются в виде последовательностей `\uhhhh`.
  Обратите внимание: этот префикс не ставит знаков кавычек в начале и в конце строки.
  Пример:
    Если результатом выражения является строка `'What do "they" think?'`, то этот текстовый элемент заменяется на:

        What do \"they\" think

`%%SIZE:expression%%`
  Выражение вычисляется. Если значение не является строкой или числом, то весь текстовый элемент удаляется из результирующего кода разметки.
  Если значением выражения является строка, то она конвертируется в числовое значение (число байт).
  Строка должна содержать некоторое число и, опционально, суффикс `k` или `K` (в этом случае число умножается на 1024), либо суффикс `m` или `M` suffix (в этом случае число умножается на 1048576).
  В качестве альтернативы, строка может начинаться с буквы `u` или `U`; в этом случае она конвертируется в числовое значение -1.
  Если значением выражения является число, то используется это числовое значение.
  Результирующее число преобразовывается в "строку размера" с использованием словаря, получаемого при помощи выражения `DICTIONARY("SizePictures")`. Если число отрицательное, то для трансляции строки `unlimited` применяется словарь и результат используется для замещения этого текстового элемента; при этом проводятся такие же преобразования, как и для текстового элемента, имеющего префикс `HTML:`.
  Далее проверяется, является ли вычисленное число байт целым числом Мегабайт или Килобайт, и больше ли оно чем один. Затем из словаря получается значение строки, связанной с ключом `"M"`, `"K"` или `""` (пустая строка). Предполагается, что в строке содержится комбинация символов `^0`, замещаемая числом мегабайт, килобайт или байт, заданных в значении expression. Результирующая строка обрабатывается аналогично методу, используемому префиксом текстового элемента `HTML:`.
  Если результатом выражения `DICTIONARY("SizePictures")` является нулевое значение или словарь не содержит значения строки для требуемого ключа, то результирующая строка строится с использованием числа и имени ключа (`20M`, `1345K`, `182345777`).
`%%ROUNDSIZE:expression%%`
  Этот префикс работает так же, как и префикс `SIZE:`, но числовое значение expression может быть изменёно: если значение равно или больше 10000, то оно конвертируется в значение, выраженное в "Кило" (значение = значение / 1024 * 1024), а если значение больше либо равно чем 10240000, то оно конвертируется в значение, выраженное в "Мега" (значение = значение / 1048576 * 1048576).
`%%TIME:expression%%`
  Выражение вычисляется.
  Если результат является нулевым значением, то весь текстовый элемент удаляется из результирующего кода разметки.
  Если результатом является число, то его значение интерпретируется как число секунд.
  Если значением выражения является строка, то она конвертируется в числовое значение (число секунд):
  Строка должна содержать некоторое число и, опционально, либо суффикс `s` или `S`, либо суффикс `m` или `M` (в этом случае число умножается на 60), либо суффикс `h` или `H` (в этом случае число умножается на 3600), либо суффикс `d` или `D` (в этом случае число умножается на 86400).
  Результирующее число преобразовывается в "строку времени" с использованием словаря, получаемого при помощи выражения `DICTIONARY("TimePictures")`.
  Далее проверяется, является ли вычисленное число секунд целым числом недель, дней, часов или минут и больше ли оно чем один. Затем из словаря получается значение строки, связанной с ключом `weeks`, `days`, `hours`, `minutes` или `seconds`. Предполагается, что в строке содержится комбинация символов `^0`, замещаемая числом недель, дней, часов, минут или секунд, заданных в значении expression. Результирующая строка преобразовывается из UTF-8 в требуемую кодировку, а затем преобразованная строка заменяет собой текстовый элемент, используя специальные HTML символы.
  Если результатом выражения `DICTIONARY("TimePictures")` является нулевое значение или словарь не содержит значения строки для требуемого ключа, то результирующая строка строится с использованием числа, пробела и имени ключа (`3 weeks`, `11 hours`, `5 seconds`).
  Пример:
    Если элемент данных `elapsedTime` равен строке `2400`, то текстовый элемент

        %%TIME:elapsedTime%%

    будет заменяться следующей строкой:

        40 minutes

    Если `DICTIONARY("TimePictures")` существует и содержит в ключе `minutes` значение `"^0mins"`, то текстовый элемент

        %%TIME:elapsedTime%%

    будет заменяться на строку

        40mins

`%%DATETIME(formatName):expression%%`
  Выражение вычисляется. Если значение не является отметкой о времени, то весь текстовый элемент удаляется из результирующего кода разметки. Если значение является отметкой о времени, то оно преобразовывается в текстовую строку заданного формата.
  Параметр format может быть задан как алфавитно-цифровая строка или строка в кавычках.
  Строка формата является результатом выражения `DICTIONARY("DatePictures").formatName` Если это выражение не имеет результата в виде текстовой строки, то вместо него используется строка `((^h:^m:^s ^W ^D-^M-^Y))`.
  При обработке строки формата соответствующие комбинации символов заменяются фактическими значениями отметок о времени:

  символы | заменяются на
  `^D` | день месяца (2-х значное число)
  `^d` | день месяца (1- или 2-х значное число)
  `^M` | имя месяца (одно из возвращаемых функцией MONTHNAMES()), транслированное через словарь `DICTIONARY("DatePictures"))`
  `^N` | номер месяца (2-х значное число, от `01` до `12`)
  `^Y` | год (2-х значное число)
  `^y` | год (4-х значное число)
  `^s` | значение секунд (2-х значное число)
  `^m` | значение минут (2-х значное число)
  `^H` | значение часов (2-х значное число), от `00` до `23`
  `^h` | значение часов (1- или 2-х значное число), от `12`, `1` и до `11`
  `^t` | строка `AM` или `PM`, транслированная через `DICTIONARY("DatePictures")`
  `^w` | номер дня недели (Воскресенье - 0)
  `^W` | имя дня недели (одно из возвращаемых функцией WEEKDAYS()), транслированное через словарь `DICTIONARY("DatePictures")`

  Результирующая строка помещается в код разметки с использованием такой же обработки, как и у префикса `HTML:`.
`%%LOCALDATETIME(formatName):expression%%`
  Обработка совпадает с используемой в префиксе `DATETIME(formatName)`, но значение отметки о времени преобразовывается сначала в местное время.
`%%DATETIMEAS(format):expression%%`
  Выражение вычисляется. Если значение не является отметкой о времени, то весь текстовый элемент удаляется из результирующего кода разметки. Если значение является отметкой о времени, то оно преобразовывается в текстовую строку заданного формата.
  Параметр format должен быть строкой или выражением со значением типа строка. Эта строка используется в качестве строки формата.
`%%LOCALDATETIMEAS(format):expression%%`
  Обработка совпадает с используемой в префиксе `DATETIMEAS(format)`, но значение отметки о времени преобразовывается сначала в местное время.
`%%DATE:expression%%`
  Обрабатывается также, как префикс `DATETIME("dateOnly")`.
`%%LOCALDATE:expression%%`
  Обрабатывается также, как префикс `LOCALDATETIME("dateOnly")`.
`%%DATEWEEK:expression%%`
  Обрабатывается также, как префикс `DATETIME("dayAndDate")`.
`%%DATETIME:expression%%`
  Обрабатывается также, как префикс `DATETIME("dateAndTime")`.
`%%LOCALDATETIME:expression%%`
  Обрабатывается также, как префикс `LOCALDATETIME("dateAndTime")`.
`%%DATETIMESHORT:expression%%`
  Обрабатывается так же, как:
  - префикс `DATETIME("timeOnly")`, если значение отметки о времени, заданное в выражении, "очень близко" к текущему времени (абсолютная разница менее 22 часов),
  - префикс `DATETIME("monthDate")`, если значение отметки о времени, заданное в выражении, "близко" к текущей дате (абсолютная разница менее 180 дней),
  - префикс `DATETIME("dateOnly")` во всех остальных случаях.
`%%LOCALDATETIMESHORT:expression%%`
  Обработка совпадает с используемой в префиксе `DATETIMESHORT:`, но значение выражения преобразовывается сначала в местное время.
`%%HTMLTRUNCATED(number):expression%%`
  Выражение вычисляется. Если значение не является строкой, то весь текстовый элемент удаляется из результирующего кода разметки. Если результатом является строка, то она обрезается, а затем из UTF-8 преобразовывается в требуемую кодировку, а далее преобразованная строка заменяет собой текстовый элемент, используя специальные HTML символы. Заменяется не более чем number число символов ("глифов"). Если в строке имеется большее количество глифов, то символы `..` будут добавлены в конец строки.
  Пример: если результатом выражения является строка `"Test Subject"`, то текстовый элемент с префиксом HTMLTRUNCATED(10) заменяется на

      Test Subje..

`%%HTMLTRUNCATED(expression1):expression%%`
  Аналогично вышеописанному, но параметр expression1 является вычисляемым выражением. Параметр expression1 должен иметь числовое значение. Это значение задаёт число глифов, которое будет взято из строки expression.
  Пример: `HTMLTRUNCATED(STRING("FieldLength")):theField`
`%%HTMLSUBST(parameter0,parameter1,...):expression%%`
  Вычисляются выражение и все N параметров. Если значения параметров не является строкой, то весь текстовый элемент удаляется из результирующего кода разметки. Если результатом является строка, то все её подстроки вида ^N заменяются на строковые значения выражения параметраN (подстроки `^0` заменяются на значения параметра0, подстроки `^1` заменяются на значения параметра1 и т.д.). Если значением параметра не является строка, то подстрока ^N удаляется.
  Результирующая строка преобразовывается из кодировки UTF-8 в требуемую кодировку, а затем преобразованная строка заменяет собой текстовый элемент, используя специальные HTML символы.
  Пример: если элемент `text1` Набора данных Text является строкой `"My String1"`, элемент var2 Набора данных Result является `My Var2`, а элемент `text2` Набора данных Text является строкой `"comparing ^0 & ^1"` , то следующий код:

      %%HTMLSUBST(STRING("text1"),var2):STRING("text2")%%

  будет заменяться на строку

      comparing My String1 &amp; My Var2

  .
`%%URLSUBST(parameter0,parameter1,...):expression%%`
  Аналогично вышеописанному, но результирующая строка заменяет собой этот текстовый элемент, используя специальные символы для URL.
`%%INDEX:scanner%%`
  Scanner должен быть именем внешней по отношению к этой части кода сценария конструкции `<!--%%FOREACH scanner IN ...-->`. Этот текстовый элемент заменяется на десятичное значение индекса сканнера. Для первого элемента используется значение 0.
`%%INDEX1:scanner%%`
  Scanner должен быть именем внешней по отношению к этой части кода сценария конструкции `<!--%%FOREACH scanner IN ...-->`. Этот текстовый элемент заменяется на десятичное значение индекса сканнера. Для первого элемента используется значение 1.
`%%DUMP:expression%%`
  Выражение вычисляется. Значение текстового представления заменяет этот текстовый элемент.
`%%LENGTH:expression%%`
  Выражение вычисляется.
  Если значением является строка, то этот текстовый элемент заменяется на длину строки (в байтах).
  Если значение является массивом, то этот текстовый элемент заменяется на количество элементов в массиве.
  Если значением является словарь, то этот текстовый элемент заменяется на числа пар ключ-значение, содержащихся в этом словаре.
  В проитвном случае, этот текстовый элемент удаляется.
`%%CENTS:expression%%`
  Выражение вычисляется. Его числовое значение преобразовывается в числовую строку с как минимум 3 десятичными цифрами, а символ десятичной запятой (`.`) вставляется перед двумя последними десятичными цифрами. Результирующая строка заменяет собой этот текстовый элемент.

## Структурные Элементы

Структурные элементы начинаются с маркера `<!--%%` и заканчиваются маркером `-->`. Сами структурные элементы всегда удаляются из результирующего кода разметки.

`<!--%%IF expression-->`
  За этим структурным элементом могут следовать один или несколько
  `<!--%%ELIF expression-->`
  элемент(ов); за ними может идти
  `<!--%%ELSE-->`
  элемент, за должен быть
  `<!--%%ENDIF-->`
  элемент.
  Вычисляется логическое значение выражения элемента IF, затем вычисляются значения выражений ELIF (если они существуют) до тех пор, пока одно из этих значений не является положительным (истинно).
  Если найден элемент с таким значением, то обрабатывается часть сценария, находящаяся между этим элементом и элементами ELIF, ELSE или ENDIF.
  Если элемент не найден и элемент ELSE отсутствует, то сценарий между элементами IF и ENDIF удаляется полностью; в противном случае обрабатывается часть сценария, находящаяся между элементами ELSE и ENDIF.
  Пример:

        <!--%%IF EXISTS(lastLogin)-->We have not seen you since <i>%%HTML:lastLogin%%<iI>
        <!--%%ELSE-->Welcome, new user!
        <!--%%ENDIF-->

    Если в этом примере набор данных содержит элемент `lastLogin` со строковым значением `20-Apr-2007`, то эта часть сценария выведет следующий текст:
    `We have not seen you since <i>20-Apr-2007</i>`
    Если набор данных не содержит элемента `lastLogin`, то эта часть сценария выведет следующий текст:
    `Welcome, new user!`
`<!--%%FOREACH scanner in expression-->`
или
`<!--%%FORALL scanner in expression-->`
  За этим структурным элементом может следовать
  `<!--%%EMPTYFOR scanner-->`
  элемент, который должен оканчиваться
  `<!--%%ENDFOR scanner-->`
  элементом. Все элементы должны иметь одинаковую алфавитно-цифровую строку scanner.
  Значение expression вычисляется. Результирующее значение должно быть массивом или словарём.
  Часть сценария между элементами `<!--%%FOREACH scanner` ...`-->` и `<!--%%EMPTYFOR scanner-->` или (если элемент `<!--%%EMTPYFOR scanner-->` не существует) часть сценария между элементами `<!--%%FOREACH scanner` ...`-->` и `<!--%%ENDFOR scanner-->` обрабатывается повторно, для каждого элемента словаря или массива.
  Выражения, заданные в этой части сценария (называемой "телом цикла") могут использовать ссылку на scanner `scanner`[] для того, что бы получить доступ к текущему элементу значения expression.
  Если expression является словарём, то ссылка на ключ `scanner`[*] может использоваться для доступа к текущему элементу ключа.
  Если значение expression не является массивом или словарём, или же если оно является пустым массивом или словарём и при этом задан элемент `<!--%%EMPTYFOR scanner-->`, то обрабатывается часть сценария между элементами `<!--%%EMPTYFOR scanner-->` и `<!--%%ENDFOR scanner-->`.
  Пример:

        <table border="1">
        <tr><td>File Name</td><td>File Size</td></tr>
        <!--%%FOREACH elem in fileList-->
        <tr><td>%%HTML:elem[].name%%</td><td>%%elem[].size%%</td></tr>
        <!--%%EMPTYFOR elem-->
        <tr><td colspan="0">&nbsp;</td></tr>
        <!--%%ENDFOR elem-->
        </table>

    В этом примере предполагается, что элемент данных `fileList` является массивом или словарём. Предполагается, что в каждом словаре содержатся строковые значения для ключей `name` и `size`.
    Если значением `fileList` является
    `({name=MyReport; size=2300;},{name="My Old Report"; size=4000;})`
    то эта часть сценария создаст следующий HTML код:

        <table border="1">
        <tr><td>File Name</td><td>File Size</td></tr>
        <tr><td>MyReport</td><td>2300</td></tr>
        <tr><td>My Old Report</td><td>4000</td></tr>
        </table>

  Конструкция `<!--%%IF` ...`-->` ...`<!--%%ELSE-->` ...`<!--%%ENDIF-->` и конструкция `<!--%%FOREACH` ...`-->` ... `<!--%%ENDFOR` ...`-->` могут быть вложенными.
`<!--%%FOREACHINC scanner in expression-->`
  Аналогично конструкции `<!--%%FOREACH` , но часть кода в "теле цикла" повторяется на один раз больше, чем число элементов в массиве (или в словаре) значений expression.
  Для этого дополнительного прогона значения `scanner[*]` и `scanner[]` являются нулевыми.
  Если значение expression не является массивом или словарём, то тело цикла не повторяется и обрабатывается часть сценария между элементами `<!--%%EMPTYFOR scanner-->` и `<!--%%ENDFOR scanner-->` (если они есть).
`<!--%%FOREACHREV scanner in expression-->`
  Аналогично конструкции `<!--%%FOREACH` , но часть кода в "теле цикла" повторяется для каждого элемента массива (или словаря) в значении expression, взятых в обратном порядке (последний элемент - первым).
`<!--%%INCLUDE filename`[`( parameter1` [`, parameter2 ...` ]`)`]`-->`
  Файл с указанным именем filename берётся из того же Вида Интерфейса, из которого был взят этот сценарий. В файле должен содержаться какой-либо WSSP код. Этот код выполняется в текущем контексте (используя тот же набор данных).
  Результирующий код разметки используется для замены этого структурного элемента.
  Для файлов, предназначенных для использования в элементе INCLUDE, рекомендуется использовать расширения `.wssi`.
  Элементы INCLUDE могут быть вложенными, что означает, что `.wssi` файл может включать в себя другой `.wssi` файл.
  В отличие от операторов `#include` в языках C и C++, этот оператор является реальным оператором, а не оператором препроцессора. В результате, если элемент `<!--%%INCLUDE filename-->` используется внутри конструкции `<!--%%FOREACH` ...`-->` ... `<!--%%ENDFOR` ...`-->`, то код filename может выполняться несколько раз, по разу для каждого элемента массива, используемого в конструкции FOREACH.
  Вы также можете указать один или несколько параметров, заключив их в круглые скобки и разделяя их символом запятой. Каждый параметр является выражением, которое обрабатывается до выполнения кода filename.
  Код в filename может получать значения параметров, используя функцию `INCLUDEARG`.
`<!--%%NUMERICMENU selected` [`DEFAULT selectedDefault` ]`IN (number1,number2,....,numberN)` [`DISPLAY dictionary`]`-->`
  Этот элемент заменяется на последовательность строковых элементов `<option value="value">presentation`.
  Число элементов и value, используемое для каждого элемента, определяются согласно списка чисел number1,number2,....,numberN. Эти числа должны быть заданы по возрастанию и не должны быть меньше чем -1.
  Выражение selected вычисляется и его значением должна быть строка. Строковое числовое значение используется для добавления ключевого слова `selected` в элемент `<option value="value">`, имеющий это же value.
  Ключевое слово `DISPLAY` и выражение dictionary могут быть опущены. В этом случае строки presentation совпадают со строками value, что означает, что эти строки являются числами.
  Пример:
    Элемент набора данных `sizeLimit` имеет строковое значение `200`.
    Элемент:

        <!--%%NUMERICMENU sizeLimit IN (-1,0,100,200,300)-->

    будет заменяться следующим текстом кода разметки:

        <option value="-1">-1<option value="0">0
        <option value="100">100<option value="200" selected>200<option value="300">300

  Если ключевое слово `DISPLAY` и выражение dictionary указаны, то выражение вычисляется. Если значением выражения является словарь, то строки presentation являются числовыми значениями, "транслированными" через этот словарь; далее результаты преобразовывается в требуемую кодировку и представляется при помощи специальных символов HTML.
  Пример:
    Элемент набора данных `sizeLimit` имеет строковое значение `200`.
    Набор данных Text Вида Интерфейса содержит словарь `Limits`: `{"-1" = Unlimited; 0 = "Off & Shut";}`.
    Элемент:

        <!--%%NUMERICMENU sizeLimit IN (-1,0,100,200,300) DISPLAY DICTIONARY("Limits")-->

    будет заменяться следующим текстом кода разметки:

        <option value="-1">Unlimited<option value="0">Off &amp; Shut
        <option value="100">100<option value="200" selected>200<option value="300">300

  Если указано ключевое слово `DEFAULT` с выражением selectedDefault, то дополнительная строка `<option value="-2">defaultPresentation` добавляется перед последовательностью. Если значение выражения selected является нулевым, то к этому строковому элементу будет добавлено ключевое слово `selected`.
  Строка defaultPresentation является строкой `DefaultValuePicture`, полученной из Текстового Набора данных Вида Интерфейса. Эта строка должна содержать комбинацию символов `^0`. Эта комбинация символов заменяется на значение выражения selectedDefault. Если указано ключевое слово DISPLAY, то значение выражения selectedDefault сначала транслируется.
  Пример:
    Элемент набора данных `sizeLimit` имеет строковое значение `200`.
    Элемент набора данных `defLimit` является строкой `-1`.
    В Текстовом Наборе данных Вида Интерфейса содержится строка `DefaultValuePicture`: `default(^0)`.
    Текстовй Набор данных Вида Интерфейса содержит словарь `Limits`: `{"-1" = Unlimited; 0 = "Off & Shut";}`.
    Элемент:

        <!--%%NUMERICMENU sizeLimit DEFAULT defLimit IN (-1,0,100,200,300) DISPLAY DICTIONARY("Limits")-->

    будет заменяться на следующий текст разметки (HTML):

        <option value="-2">default(Unlimited)
        <option value="-1">Unlimited<option value="0">Off &amp; Shut
        <option value="100">100<option value="200" selected>200<option value="300">300

`<!--%%TIMEMENU selected` [`DEFAULT selectedDefault` ]`IN (time1,time2,....,timeN)` [`DISPLAY dictionary`]`-->`
  Этот элемент обрабатывается так же, как и элемент NUMERICMENU. Единицы timeN задают временные интервалы, преобразовываемые в числовые значения (число секунд), используя такой же алгоритм, как и при обработке текстового элемента `TIME:`.
  Выражения selected и selectedDefault должны возвращать строки. Каждая строка преобразовывается в числовое значение (число секунд), используя такой же алгоритм, как и при обработке текстовых элементов `TIME:`.
  Значения транслируются при помощи указанного словаря `DISPLAY`. Если словарь `DISPLAY` не задан или он не содержит для данного значения строки, то строки presentation для времени создаются с использованием такого же метода, как и при обработке текстовых элементов `TIME:`.
`<!--%%SIZEMENU selected` [`DEFAULT selectedDefault` ]`IN (size1,size2,....,sizeN)` [`DISPLAY dictionary`]`-->`
  Этот элемент обрабатывается так же, как и элемент NUMERICMENU. Единицы sizeN задают размеры данных, преобразовываемые в числовые значения (число байт), используя такой же алгоритм, как и при обработке текстовых элементов `SIZE:`.
  Выражения selected и selectedDefault должны возвращать строки. Каждая строка преобразовывается в числовое значение (число байт), используя такой же алгоритм, как и при обработке текстового элемента `SIZE:`.
  Значения транслируются при помощи указанного словаря `DISPLAY`. Если словарь `DISPLAY` не задан или он не содержит для данного значения строки, то строки presentation для размера создаются с использованием такого же метода, как и при обработке текстовых элементов `SIZE:`.
`<!--%%ENUMMENU selected` [`DEFAULT selectedDefault` ]`IN valueSet` [`DISPLAY dictionary`]`-->`
  Этот элемент заменяется на последовательность строковых элементов `<option value="value">presentation`.
  Число элементов и value, используемое для каждого элемента, определяются по значению выражения valueSet. Это значение должно быть массивом строк. Value в каждом элементе является строковым индексом в результирующем массиве valueSet.
  Выражение selected вычисляется и его значением должна быть строка. Ключевое слово `selected` добавляется в элемент `<option value="value">`, созданный для элемента массива valueSet, который соответствует результату выражения selected.
  Ключевое слово `DISPLAY` и выражение dictionary могут быть опущены. В этом случае строки presentation совпадают со результирующими строками элементов valueSet.
  Пример:
    Элемент набора данных `color` является строкой `"Green"`.
    Элемент набора данных `colors` является массивом `("Blue", "Green", "Red")`.
    Элемент:

        <!--%%ENUMMENU color IN colors-->

    будет заменяться на следующий текст разметки (HTML):

        <option value="0">Blue<option value="1" selected>Green<option value="2">Red

  Если ключевое слово `DISPLAY` и выражение dictionary указаны, то выражение вычисляется. Если значением выражения является словарь, то он используется для "трансляции" массива строк valueSet до преобразования их в требуемую кодировку и помещения в результирующий код разметки с использованием специальных символов HTML.
  Пример:
    Элемент набора данных `color` является строкой `"Green"`.
    Элемент набора данных `colors` является массивом `("Blue", "Green", "Red")`.
    Набор данных Вида Интерфейса содержит словарь `Colors`: `{Blue = "Night Blue"; Green = "Grass Green";}`.
    Элемент:

        <!--%%ENUMMENU color IN colors DISPLAY DICTIONARY("Colors")-->

    будет заменяться на следующий текст разметки (HTML):

        <option value="0">Night Blue<option value="1" selected>Grass Green<option value="2">Red

  Если указаны ключевое слово `DEFAULT` с выражением selectedDefault, то дополнительная строка `<option value="-1">defaultPresentation` добавляется до последовательности. Если значение выражения selected является нулевым, то к этому строковому элементу будет добавлено ключевое слово `selected`.
  Строка defaultPresentation является строкой `DefaultValuePicture`, полученной из Текстового Набора данных Вида Интерфейса. Эта строка должна содержать комбинацию символов `^0`. Эта комбинация символов заменяется на значение выражения selectedDefault. Если указано ключевое слово `DISPLAY`, то значение выражения selectedDefault сначала транслируется.
  Пример:
    Элемент набора данных `color` является строкой `"Green"`.
    Элемент набора данных `defColor` является строкой `"Blue"`.
    Элемент набора данных `colors` является массивом `("Blue", "Green", "Red")`.
    В Текстовом Наборе данных Вида Интерфейса содержится строка `DefaultValuePicture`: `default(^0)`.
    Набор данных Вида Интерфейса содержит словарь `Colors`: `{Blue = "Night Blue"; Green = "Grass Green";}`.
    Элемент:

        <!--%%ENUMMENU color DEFAULT defColor IN colors DISPLAY DICTIONARY("Colors")-->

    будет заменяться на следующий HTML код:

        <option value="-1">default(Night Blue)<option value="0">Night Blue
        <option value="1" selected>Grass Green<option value="2">Red

`<!--%%BOOLMENU selected` [`DEFAULT selectedDefault` ]`` [`DISPLAY dictionary`]`-->`
  Этот элемент заменяется на последовательность строковых элементов `<option value="value">presentation` аналогично тому, как это происходит при обработке элемента ENUMMENU.
  В отличие от элемента ENUMMENU, в этом элементе не содержится часть `IN valueSet`: вместо этого используется встроенный массив `("NO","YES")`.
`<!--%%MAILBOXMENU selected` [`DEFAULT selectedDefault` ]`IN mailboxList` [`NOINBOX` ]`-->`
  Этот элемент заменяется на последовательность строковых элементов `<option value="value">presentation` аналогично тому, как это происходит при обработке элемента ENUMMENU.
  Значения выражений selected и selectedDefault конвертируются так же, как они конвертируются для текстового элемента, имеющего префикс `MAILBOXNAME:`, используя словарь `MailboxNames` из Текстового Набора данных Вида Интерфейса; по этой причине элементы MAILBOXMENU не имеют части DISPLAY.
  Если указано ключевое слово NOINBOX, то папка INBOX (если она существует в mailboxList) не отображается.
`<!--%%DAYTIMEMENU selected` [`DEFAULT selectedDefault` ] [`PERIOD timePeriod` ] `-->`
  Этот элемент заменяется на последовательность строковых элементов `<option value="value">presentation` для формирования меню времени дня. Каждое значение является временем в секундах и его представлением является строка, отображающая это время с использованием формата "hourMinute" (или строки формата "^H:^m", если элемент "hourMinute" не найден в данных `DICTIONARY("DatePictures")`.
  Значение времени генерируются начинаю с полночи (`00:00`) и до 23:59 с шагом, заданным в timePeriod (указываемым в минутах).
  Если ключевое слово PERIOD и значение timePeriod не указаны, то используется шаг в 30 минут (1800 секунд).
  Если ключевое слово PERIOD указано, то значение timePeriod может быть либо числовой константой, задающей интервал времени в минутах, либо выражением. Значение выражения вычисляется и преобразовывается в число. Это число указывает период времени в секундах.
  Выражения selected и selectedDefault должны иметь числовые значения - текущее выбранное (и являющееся умолчанием) время дня (секунды, считая от полуночи).
`<!--%%CALENDARTIMEMENU selected` [`PERIOD timePeriod` ] `-->`
  Этот элемент создаёт такое же меню HTML, как и элемент DAYTIMEMENU.
  Значение выражения selected должно быть отметкой о времени. Временная часть этого значения используется как текущее выбранное значение времени дня.
`<!--%%LOCALCALENDARTIMEMENU selected` [`PERIOD timePeriod` ] `-->`
  Этот элемент создаёт такое же меню HTML, как и элемент DAYTIMEMENU.
  Значение выражения selected должно быть отметкой о времени. Значение преобразовывается в местный часовой пояс и временная часть этого значения используется как текущее выбранное значение времени дня.
`<!--%%STRINGMENU selected` [`DEFAULT selectedDefault` ]`IN valueSet` [`DISPLAY dictionary`]`-->`
  Этот элемент работает аналогично элементу ENUMMENU, но используемые значения являются фактическими значениями данных, а не их номерами, как в элементе ENUMMENU. Значением по умолчанию является строка `default`.
`<!--%%CALENDARDATECONTROL selected NAME name` [`DAYSBEFORE before`] [`DAYSAFTER after`] [`CANNEVER` ] `-->`
  Этот элемент создаёт элемент управления или набор элементов управления для данных календаря используя выражение selected. Значение выражения должно быть отметкой о времени; в противном случае весь текстовый элемент удаляется из результирующего кода разметки.
  Если указанное время раньше текущей даты больше чем на before дней или если оно позже текущей даты больше чем на after дней, то этот элемент заменяется текстом с несколькими текстовыми элементами управления. В противном случае создаётся управляющий элемент меню.
  Значения before и after должен быть заданы как числа.
  Если значение before не указано явно, оно считается равным 7.
  Если значение after не указано явно, оно считается равным 31.
  Если используется ключевое слово CANNEVER, то меню содержит пункт `Never`, имеющим значение remote future. Если выбранное значение равно значению remote future , то создаётся элемент управления.
  Элемент name быть строкой.
  Для создания элементов управления форматная строка `dateOnly` берётся из словаря `DatePictures` и коды текстового элемента управления используются для замены имеющихся в ней комбинаций символов `^D`, `^M`, `^Y` и `^y`. Каждый элемент управления имеет заданный name и префикс: элемент управления для дня имеет имя `name-D`, элемент управления для месяца имеет имя `name-M`, 2-х значный элемент управления для года имеет имя `name-Y` и 4-х значный элемент управления для года имеет имя `name-y`.
  Если создаётся меню, то генерируется элемент языка разметки `select`. Он имеет заданное имя name. Меню содержит элемент для текущей даты, элементы before для предыдущих дат и элементы after для последующих дат. Форматирование элементов осуществляется при помощи форматной строки `dayAndMonthDate` из словаря `DatePictures`.
  Для даты "after+1" добавляется дополнительный элемент с текстом `...`. При выборе этого элемента выбранное значение даты переносится за диапазон дат, имеющихся в меню, что позволяет пользователю использовать текстовый элемент управления и выбирать произвольную дату.
`<!--%%LOCALCALENDARDATECONTROL selected NAME name` [`DAYSBEFORE before`] [`DAYSAFTER after`] `-->`
  Этот элемент создаёт такой же код разметки HTML, как и элемент CALENDARDATECONTROL.
  Значение выражения selected должно быть отметкой о времени. Предполагается, что значение выражено в глобальном (GMT) времени, поэтому сначала значение преобразовывается в местное время.

Руководство CommuniGate® Pro. Copyright © 1998-2009, Stalker Software, Inc.