Техническое описание базовых средств представления
векторной интерактивной графики в Интернет

1. Структура изображения и его "активных" зон
2. Параметры слоя графических элементов изображения
3. Графические элементы изображения
4. Статическое задание векторного изображения
5. Динамическое задание векторных изображений
5.1. Задание списка объектов группы
5.2. Управление текущим состоянием
5.3. Получение информации об элементах изображения, выбранных курсором ("активных" зонах)
5.4. Получение атрибутов слоя и элемента изображения
5.5. Редактирование состава элементов и атрибутов отдельного элемента слоя
5.6. Создание и удаление слоев, редактирование их атрибутов
5.7. Работа с группами объектов
5.8. Работа с виртуальными экранами
5.9. Работа с динамически создаваемыми растровыми изображениями
5.10. Получение информации о состоянии кнопок "мыши" и клавиатуры
5.11. Специальные режимы работы апплета для интерактивного графического задания параметров изображения
5.12. Работа с массивами данных
5.13. Работа с таблицами поименованных объектов
6. Примеры и рекомендации по использованию апплета
7. Литература


1. Структура изображения и его "активных" зон

Изображение, которое создается с помощью апплета MultiView является иерархической структурой и состоит из следующих базовых элементов изображения:

Отдельные элементы изображения организованы в объеты типа слой. Слой - это множество элементов изображения, обладающих некоторыми параметрами, общими для всех элементов, входящих в состав слоя. Например, толщина и цвет границ, цвет фона.

Слои могут быть организованы в объекты типа группа. Группы не содержат параметров отображения и служат лишь для управления составом изображения и последовательностью выводимых на экран слоев.

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

Подобная же гибкость допускается и при описании объектов типа активная зона изображения - областей изображения, чувствительных к положению курсора. Апплет следит за перемещением курсора и позволяет получать информацию обо всех активных зонах, в которых в данный момент времени находится курсор. Для задания "активных" зон также используются элементы изображения. "Активной" считается область, которую занимает на экране соответствующий элемент изображения. Для задания множества "активных" зон используются элементы изображения, составляющие слои, и группы слоев. Элементы, входящие в состав слоев, принадлежащих одной группе образуют множество зависимых друг от друга областей изображения. В таком множестве в каждый момент времени может быть "активной" только одна зона (соответственно, один элемент слоя). Если "активные" зоны в таком множестве геометрически пересекаются, то всегда однозначно определено какая зона "экранирует" другие зоны (т.е. расположена "сверху"). Элементы, входящие в состав слоев, принадлежащих разным группам, не зависят друг от друга - т.е. их зоны могут быть одновременно активными несмотря, на взаимное геометрическое пересечение.

В последующих разделах (2-6) приведено описание параметров основных объектов, с которыми приходится иметь дело при написании JavaScript программ, использующих описываемый апплет. В разделе 5 описаны основные методы апплета, которыми можно пользоваться в JavaScript программах. В заключительном шестом разделе приведены примеры и рекомендации по использованию апплета.

2. Параметры слоя графических элементов изображения

Описание слоя представляет собой строку, состоящую из ключевых параметров, которые задают некоторые атрибуты отображения и другие свойства, общие для всех, входящих в состав слоя элементов. Параметры слоя можно разделить на несколько групп:
    2.1. Управление отображением элементов слоя в обычном режиме 

 draw_layer= - признаки управляющие отображением элементов слоя: 
   bit00(0x00001) - показ текста,
   bit01(0x00002) - использование индивидуального цвета для показа текста,
   bit08(0x00100) - показ границ элемента,
   bit09(0x00200) - показ границ элемента индивидуальным цветом,
   bit10(0x00400) - заливка элемента,
   bit11(0x00800) - заливка элемента индивидуальным цветом,
   bit12(0x01000) - показ растрового изображения в прямоугольном элементе,
   bit13(0x02000) - штриховка элемента,
   bit14(0x04000) - штриховка элемента индивидуальным цветом,
   bit15(0x08000) - штриховка элемента с использованием индивидуальных
                    параметров штриховки.
 xshift= - смещение по горизонтали для всего слоя.

 yshift= - смещение по вертикали для всего слоя.

 shifts= - смещение по горизонтали и вертикали для всего слоя (xshift,yshift).

 round= - два числа, задающие ширину и высоту овалов скругления для элементов, 
 имеющих форму прямоугольника.

 border_width_layer= - толщина границ элементов при отображении слоя (в пикселах).

 border_color_layer= - цвет границ элементов при отображении слоя (см. п. 2.10.).

 border_style_layer= - стиль изображения границ прямоугольных элементов. Это 
 последовательность двухцветных элементов, для каждого из которых заданы толщина, 
 шаг в приделах заданной толщины, и цвета левого верхнего и правого нижнего 
 фрагментов границы:

       width0,step0,color01,color02,...,widthN,stepN,colorN1,colorN2
       
       Если шаг меньше толщины, то выполняется градиентная заливка рамки с 
 заданным шагом, если шаг задан меньше нуля, то в данном фрагменте рамки 
 выполняется заливка от внутреннего контура к наружному. С помощью этого атрибута 
 можно придать объемность границам прямоугольного элемента. Оттенки цвета 
 задаются в соответствии с общими правилами (см. п. 2.10.).

 fill_color_layer= - цвет заливки элементов при отображении слоя (см. п. 2.10.).

 xstroke= - параметры горизонтальной штриховки (задаются через запятую без пробелов):

   xstroke=line_step[,line_width,dash_step,dash_width,line_shift,dash_shift]
   line_step  - расстояние между линиями
   line_width - толщина линии
   dash_step  - шаг штриха вдоль линии
   dash_width - размер штриха вдоль линии
   line_shift - общее смещение линий штриховки по вертикали
   dash_shift - смещение штриха вдоль линии при переходе от линии к линии.

 ystroke= - параметры вертикальной штриховки (задаются через запятую без пробелов) 

   ystroke=line_step[,line_width,dash_step,dash_width,line_shift,dash_shift]
   line_step  - расстояние между линиями
   line_width - толщина линии
   dash_step  - шаг штриха вдоль линии
   dash_width - размер штриха вдоль линии
   line_shift - общее смещение линий штриховки по горизонтали
   dash_shift - смещение штриха поперек линии (при переходе от строки к строке 
                по горизонтали).

 strokes= - массив данных, содержащий индивидуальные параметры штриховки для 
 элементов слоя, которые заменяют индивидуальные параметры штриховки, заданные в 
 самом элементе слоя.

 text_pos= - положение текстового элемента слоя в его описывающем прямоугольнике 
 (см. п. 3.7 - атрибут pos_code у элемента типа text). Значение text_pos используется 
 как значение по умолчанию для атрибута pos_code всех текстовых элементов слоя.

 text_color_layer= - цвет символов текста.


    2.2. Управление отображением элементов слоя в режиме выделения "активного" 

 draw_active= - признаки, управляющие отображением активного элемента 
   bit00(0x00001) - показ текста 
   bit01(0x00002) - использование индивидуального цвета для показа текста
   bit02(0x00004) - показ текста подсказки 
   bit03(0x00008) - использование индивидуального цвета для показа текста подсказки 
   bit04(0x00010) - показ границ подсказки 
   bit05(0x00020) - показ границ подсказки индивидуальным цветом 
   bit06(0x00040) - заливка фона подсказки 
   bit07(0x00080) - заливка фона подсказки индивидуальным цветом
   bit08(0x00100) - показ границ элемента 
   bit09(0x00200) - показ границ элемента индивидуальным цветом
   bit10(0x00400) - заливка элемента 
   bit11(0x00800) - заливка элемента индивидуальным цветом
   bit16(0x10000) - показ растрового изображения в измененном масштабе при "наезжании" 
                    курсором.

 active_time= - время отображения выделенного элемента слоя в миллисекундах. 
 Если параметр задан, то отображение выделенного элемента слоя пропадает через заданное
 время, иначе элемент слоя отображается в режиме выделения до тех пор, пока курсор
 находится над эти элементом.

 fill_color= - цвет заливки активного элемента (см. п. 2.10.).

 border_color= - цвет границы активного элемента (см. п. 2.10.).

 border_width= - толщина границы в пикселях.

 border_style= - стиль изображения границ (см. описание стиля рамки в параметрах
 отображения в обычном режиме). Действие этого атрибута распространяется только на
 прямоугольные элементы изображения.

 text_color= - цвет символов текста активного элемента (см. п.  2.10.).

 prompt_fcolor= - цвет символов и рамки текста подсказки (см. п. 2.10.).

 prompt_bcolor= - цвет фона прямоугольника с текстом подсказки (см. п. 2.10.).

 prompt_round= - два числа, задающие ширину и высоту овалов скругления углов
 прямоугольника подсказки,

 prompt_abs= - признак абсолютного размещения текста подсказки (по умолчанию =0):
      =0 - текст подсказки размещается вблизи курсора
      =1 - текст подсказки размещается в области определяемой параметрами 
           prompt_pos, prompt_size.

 prompt_align= - положение прямоугольника-окна подсказки относительно базовой
 точки (x,y) и положение текста в описывающем прямоугольнике. Задается десятичным,
 восьмеричным или шестнадцатеричным числом (если не задан или задан равным -1, то
 устанавливается значение из параметра text_pos слоя):

   bits(0-1)(0x03) - размещение прямоугольника-окна по горизонтали:
      =0 - базовая точка на левой границе,
      =1 - базовая точка в середине,
      =2 - базовая точка на правой границе,
   bits(2-3)(0x0C) - размещение текста в прямоугольнике-окне по горизонтали
      =0 - выровнен по левой границе,
      =1 - центрирован,
      =2 - выровнен по правой границе,
      =3 - выровнен по левой и правой границам,
   bits(4-5)(0x30) - размещение прямоугольника-окна по вертикали:
      =0 - базовая точка на верхней границе,
      =1 - базовая точка в середине,
      =2 - базовая точка на нижней границе,
   bits(6-7)(0xC0) - размещение текста в прямоугольнике-окне по вертикали:
      =0 - выровнен по верхней границе,
      =1 - центрирован,
      =2 - выровнен по нижней границе.

 prompt_pos= - два числа (через запятую без пробелов), задающие координаты базовой
 точки при отображении подсказки.

 prompt_size= - два числа, задающие ширину и высоту области для вывода текстовой
 подсказки.

 point_width= - ширина активной области для элементов типа точка.

 point_height= - высота активной области для элементов типа точка.

 cursor= - имя слоя, изображение которого появляется рядом с курсором, при его
 движении над элементами данного слоя


    2.3. Управление форматированием и отображением текстовой части элементов
          слоя в обычном и выделенном режимах и для отображения "подсказки" 

   font_name= - имя шрифта.

   font_style= - тип шрифта - целое число, значения которого означают:
      0 - обычный, 
      1 - полужирный, 
      2 - курсив, 
      3 - полужирный курсив.

   font_size= - размер шрифта.

   font= - альтернативный способ задания шрифта в одном атрибуте:

      <имя>:<размер>[,<стиль>], 

      где    <имя> - имя шрифта или "*", для указания на текущий шрифт, 
             <размер> - размер шрифта или -1, если используется размер текущего шрифта,
             <стиль> - стиль шрифта - целое число значения которого означают: 
               0 - обычный,
               1 - полужирный,
               2 - курсив,
               3 - полужирный курсив.

   xpadding= - отступ от текста до границ элемента по горизонтали в пикселях.

   ypadding= - отступ от текста до границ элемента по вертикали в пикселях.
   
   paddings= - отступ от текста до границ элемента по горизонтали и вертикали 
   в пикселях (два числа разделенных запятой),

   line_height= - расстояние между строками в пикселях.

   line_space= - расстояние между словами в пикселях.

   ident= - абзацный отступ в пикселях.


    2.4. Управление некоторыми индивидуальными атрибутами отображения элементов слоя 

   colors= - массив данных, содержащий индивидуальные цвета для элементов
 слоя, которые заменяют индивидуальные цвета, заданные в самом элементе слоя.


    2.5. Управление "видимостью" и "активностью" 

   visible= - признак видимости элементов слоя (0/1).

   active= - признак активности (чувствительности к положению курсора) 
   элементов слоя (0-32):

      bits0-5(0x00000) - все элементы слоя нечувствительны к положению курсора),
      bit00(0x01) - активность элементов слоя независимо от состояния клавиш (Shift Ctrl Alt),
      bit01(0x02) - активность элементов слоя при нажатой клавише Shift,
      bit02(0x04) - активность элементов слоя при нажатой клавише Ctrl,
      bit04(0x10) - активность элементов слоя при нажатой клавише Alt,
      bit05(0x20) - активность элементов слоя при отжатых клавишах Shift, Ctrl, Alt.

   actives= - массив данных, содержащий битовую шкалу признаков 
   чувствительности к положению курсора для всех элементов слоя.

   visibles= - массив данных, содержащий битовую шкалу признаков видимости
   для элементов слоя.


    2.6. Управление созданием нового слоя по заданному слою 

   group= - имя группы, в которую включается данный слой. Если оно не задано,
   то слой включается в текущую группу, или в ту группу, которая указана при 
   задании полного имени слоя.

   clone= - имя слоя, к элементам которого подключается вновь создаваемый слой. 
   При задании этого параметра создается новый слой, начальные значения 
   атрибутов которого берутся из слоя, указанного в параметре; все элементы
   заданного слоя включаются в состав элементов нового слоя.

   copy= - имя слоя, копии элементов которого включаются в состав элементов
   вновь создаваемого слоя. Если в качестве имени копируемого слоя задан символ
   '*', то это означает, что копирование элементов идет из слоя с тем же именем,
   что и вновь создаваемый слой. Если в качестве источника копирования указан,
   тот же слой, то это означает копирование элементов "сам в себя". Этот режим
   используется при задании аффинного преобразования элементов слоя.

   source= - имя группы для выбора слоев источников данных при копировании
   или клонировании.

   affine= - параметры аффинного преобразования, выполняемого над элементами
   слоя при копировании. Параметры аффинного преобразования могут быть заданы
   как последовательность аффинных преобразований:

      [flags:1],type1:p1,...pn1,type2:p21,...pn2,...typeN:...

      flags:copy - признак блокировки копирования "невидимых" после
      преобразования (оказавшихся за пределами отсекающего прямоугольника)
      элементов слоя. Если copy = 1, то невидимые элементы слоя копируются
      в новый слой с признаком "невиден", иначе невидимые элементы слоя не
      копируются.

      type: p1,...pn  - типы аффинных преобразований и их параметры, описанные
      в следующем пункте.


    2.6.1. Типы аффинных преобразований 

   shift:xshift,yshift - сдвиг.

   scale:kx,ky - масштабирование.
   
   rotate:alpha,xc,yc - поворот, где 

      alpha - угол поворота в градусах,

      xc,yc - координаты центра поворота.

   reper:xs1,ys1,xs2,ys2,xs3,ys3,xd1,yd1,xd2,yd2,xd3,yd3 - преобразование по 
   трем точкам, где 

      xs1,ys1,xs2,ys2,xs3,ys3 - координаты трех точек плоскости до преобразования,

      xd1,yd1,xd2,yd2,xd3,yd3 - координаты трех точек плоскости после преобразования.

   rect:xs,ys,ws,hs,xd,yd,wd,hd - преобразование по двум прямоугольникам, где
 	
      xs,ys,ws,hs - координаты левого верхнего угла и размеры 
      прямоугольника до преобразования,

      xd,yd,wd,hd - координаты левого верхнего угла и размеры 
      прямоугольника после преобразования.

   affine:sx,sy,cxx,cyy,cxy,cyx - явно заданные коэффициенты аффинного преобразования.


    2.7. Управление загрузкой документов 

   href= - общий для всех элементов слоя URL для загрузки HTML документа в 
   случае нажатия кнопки "мыши" на выделенном элементе слоя.

   target= - имя общего для слоя целевого окна для загрузки HTML-документа в 
   случае нажатия кнопки "мыши" на выделенном элементе Если параметр не задан,
   то загрузки документа при нажатии кнопки мыши не происходит.

   hrefs= - массив данных, содержащий индивидуальные URL для загрузки HTML-
   документов в случае нажатия кнопки "мыши" на выделенном элементе слоя.


    2.8. Управление содержанием текстовой части элементов слоя 

   texts= - массив изображений строк текста или изображений многострочного
    многошрифтового текста, содержащий индивидуальные значения текстов для 
    элементов слоя типа text.

   prompts= - массив изображений строк текста или изображений многострочного
   многошрифтового текста, содержащий индивидуальные значения текстов 
   подсказок для элементов слоя.


    2.9. Другие параметры 

   ids= - массив чисел, содержащий идентификаторы, соответствующие
   идентификаторам элементов слоя. С помощью этого параметра можно
   переопределить идентификаторы элементов слоя. Идентификаторы элементов
   слоя используются как индексы по массивам индивидуальных атрибутов.

   clip_rect= - четыре числа, задающие координаты левого верхнего угла и
   размеры отсекающего прямоугольника для элементов слоя. Отсекающий
   прямоугольник ограничивает количество видимых элементов слоя при
   отображении и при поиске "активных" элементов слоя. При выполнении
   аффинного преобразования отсекающий прямоугольник позволяет ограничить
   количество элементов, попадающих в результирующий слой при выполнении
   преобразования координат копируемых элементов исходного слоя.


    2.10. Задание оттенка цвета в параметрах слоя 

        Оттенок  цвета  задается  десятичным,  восьмеричным  или 
   шестнадцатеричным числом или в виде последовательности символов #rrggbb,
   где rr, gg и bb - шестнадцатеричные числа, задающие соответственно оттенки
   красного, зеленого и синего.


 3. Графические элементы изображения 

        Описание  графического  элемента изображения имеет следующий синтаксис: первая
   лексема описания - тип графического элемента. За типом следуют разделенные пробелом
   позиционные и ключевые параметры характерные для заданного типа графического элемента.
   Ряд ключевых параметров (далее - общие ключевые параметры) может присутствовать у всех
   типов графических элементов.


    3.1. Общие ключевые параметры 

        Общие ключевые параметры задают свойства, применимые для любого типа 
   графического элемента.

   id= - идентификатор элемента слоя (целое число). Если id положительное целое 
   число, то оно используется как индекс по массивам индивидуальных атрибутов 
   элементов слоя (ids, actives, visibles, colors, texts, prompts, strokes, hrefs).

   href= - URL для загрузки HTML документа в случае нажатия кнопки "мыши" на 
   выделенном элементе слоя.

   active= - признак активности - способности быть "выделенным" при попадании 
   курсора внутрь элемента (если атрибут не задан, то элемент слоя не может быть
   активен).

   visible= - признак видимости элемента при отображении слоя (если атрибут не 
   задан, то элемент слоя не отображается).

   color= - цвет, используемый для индивидуальной параметризации отображения
   элемента слоя (см. п. 2.10.).

   round= - два числа, задающие ширину и высоту овалов скругления при 
   отображении охватывающего прямоугольника для прямоугольных графических
   элементов.

   prompt= - текст подсказки, отображаемой при выделении элемента, которая 
   выдается одной строкой.

   tprompt= - текст подсказки, отображаемой при выделении элемента, которая 
   выдается в виде многострочного многошрифтового текста.

   xstroke= - параметры горизонтальной штриховки (см. п. 2.1).

   ystroke= - параметры вертикальной штриховки (см. п. 2.1).


    3.2. Точка 

   point x y [<common key params>]

      x y - координаты точки, которая является центром некоторой прямоугольной
      области,
   
   common key params - общие ключевые параметры.

      Элемент типа point предназначен, прежде всего, для удобного задания 
   прямоугольных  "активных"  зон  на  изображении, а  не  для рисования. 
   Прямоугольную "активную" зону можно задать с помощью элемента rect 
   (прямоугольник), но для точек необходимо задавать только координаты центров
   прямоугольников, а ширина и высота, общая для всех элементов слоя типа 
   point, задается в параметрах слоя point_width и point_height. По умолчанию,
   ширина и высота "активных" зон для точечных элементов равны 10 пикселям. 

      Для того, чтобы изобразить один пиксель, можно нарисовать ломаную 
   линию (line) из одного отрезка, координаты начала и конца которого совпадают,
   или нарисовать один пиксель растра (image). Но, как правило, изображение
   удобно составлять не из отдельных пикселей, а из более сложных объектов,
   таких как прямоугольник, ломаная линия, эллипс, окружность, сектор, полигон,
   текст, растровое изображение.


    3.3. Ломаная линия 


   line  x0 y0 x1 y1 ... xn yn    [<common key params>]

   iline x0 y0 dx1 dy1 ... dxn dyn    [<common key params>]

      где   x0 y0 - координаты начальной вершины,

            x1 y1 ... xn yn - координаты остальных вершин,

            dx1 dy1 ... dxn dyn - смещения координат очередной вершины
            относительно предыдущей,

            common key params - общие ключевые параметры.

      Элементы типа line и iline позволяют задавать ломаные линии При
   использовании элемента типа line, пользователь явно задает координаты
   вершин ломанной. При использовании элемента типа iline явно задаются 
   только координаты начальной вершины. Координаты очередной вершины 
   ломаной задаются как приращения по горизонтали и вертикали к координатам 
   предыдущей вершины. Тип iline предназначен для более компактного описания
   ломаной линии.

      Толщина линии задается в атрибутах отображения слоя через параметр
   border_width_layer. Цвет линии можно задать с помощью общего для всех 
   элементов слоя атрибута border_color_layer. Для рисования линии может быть
   использован и индивидуальный цвет элемента (см. флаги рисования в атрибуте
   слоя draw_layer).


    3.4. Прямоугольник 


   rect xul yul width height [<common key params>]

   rectc xul xul xdr ydr [<common key params>]

   где   xul yul - координаты левого верхнего угла прямоугольника,

         width height - ширина и высота прямоугольника,

         xdr ydr - координаты правого нижнего угла прямоугольника,

         common key params - общие ключевые параметры.

      Толщина границ прямоугольника задается в атрибутах отображения слоя
   через параметр border_width_layer. Цвет границ можно задать с помощью
   общего для всех элементов слоя атрибута border_color_layer. Заливка 
   внутренности прямоугольника осуществляется цветом, заданным с помощью
   общего для всех элементов слоя атрибута fill_color_layer. Для рисования
   границ и заливки внутренности может быть использован и индивидуальный цвет
   элемента. Признаки рисования границ и заливки внутренности задаются в 
   атрибуте слоя draw_layer. Если в слое, которому принадлежит прямоугольник,
   задан атрибут border_style_layer, то граница прямоугольника может быть 
   отображена разноцветными ломаными, например, для придания объемности.


    3.5. Эллипс 


   arc pos_code x y width height start_angle arc_angle [<common key params>]

   где   pos_code - положение прямоугольника, описанного вокруг эллипса, 
         относительно базовой точки (x,y) задается десятичным, восьмеричным
		 или шестнадцатеричным числом

            bits(0-1)(0x03) - размещение описанного прямоугольника по горизонтали:
                =0 - базовая точка на левой границе,
                =1 - базовая точка в середине,
                =2 - базовая точка на правой границе.
            bits(4-5)(0x30) - размещение описанного прямоугольника по вертикали:
                =0 - базовая точка на верхней границе,
                =1 - базовая точка в середине,
                =2 - базовая точка на нижней границе,

         x y - координаты базовой точки,

         width - ширина описанного прямоугольника,
 
         height - высота описанного прямоугольника,
 
         start_angle - начальный угол дуги в градусах,

         arc_angle - длина дуги в градусах,

         common key params - общие ключевые параметры.

      Элемент типа arc позволяет отображать сектор эллипса, центром которого
   является центр описанного прямоугольника. Положение прямоугольника 
   определяется координатами базовой точки (x,y) и значением параметра pos_code.
   Элемент типа arc представляет собой замкнутую фигуру. Если длина дуги сектора
   эллипса меньше 360 градусов, то границы сектора включают и два радиуса, 
   соединяющие концы дуги с центром.


    3.6. Полигон 


   poly x0 y0 x1 y1 ... xn yn [<common key params>]

   ipoly x0 y0 dx1 dy1 ... dxn dyn [<common key params>]

   lpoly llayer0 n00 n10 ... nk0 ... llayerm n0m n1m ... nkm [<common key params>]

   где   x0 y0 - координаты начальной вершины,

         x1 y1 ... xn yn - координаты остальных вершин,

         dx1 dy1 ... dxn dyn - смещения координат очередной вершины 
		 относительно предыдущей,

         llayeri n0i ... nki - имя слоя линий и номера элементов этого слоя, 
		 составляющих границы полигона,

         common key params - общие ключевые параметры.

      При использовании элемента типа poly, пользователь явно задает координаты 
   вершин полигона. При использовании элемента типа ipoly явно задаются только 
   координаты начальной вершины. Координаты очередной вершины полигона задаются
   как приращения по горизонтали и вертикали к координатам предыдущей вершины. 
   Тип ipoly предназначен для более компактного представления границ полигона. 
   При использовании lpoly предполагается, что линии, составляющие границы полигона,
   уже заданы в другом слое. В элементе типа lpoly необходимо задавать имя слоя линий
   и номера элементов этого слоя, в которых заданы линии, составляющие границы 
   описываемого полигона. При этом границы одного полигона могут состоять из линий, 
   входящих в состав разных слоев. Применение элемента типа lpoly особенно удобно при
   задании полигонального покрытия. В случае полигонального покрытия, для внутренних 
   полигонов линии, составляющие границы одного полигона, являются одновременно и 
   границами других полигонов. Если для описания полигонов, входящих в полигональное
   покрытие использовать элементы типа poly или ipoly, то общий размер описания может
   удвоится.


    3.7. Многострочный многошрифтовой фрагмент текста 


   text [pos_code  x  y  pos=p  x=x  y=y  width=w  height=h  hlines=hl 
   draw_rect=x,y,width,height  scroll=scx,scy  shifts=shx,shy  font=<имя
   шрифта>:<размер>,<стиль> <common key params>]  value="text"

   где pos_code - положение описанного прямоугольника относительно базовой
   точки (x,y) и положение текста в описанном прямоугольнике; задается десятичным,
   восьмеричным или шестнадцатеричным числом (если не задан или задан равным -1, 
   то устанавливается значение из параметра слоя text_pos): 
    
       bits(0-1)(0x03) - размещение описанного прямоугольника 
       по горизонтали:
           =0 - базовая точка на левой границе,
           =1 - базовая точка в середине,
           =2 - базовая точка на правой границе.
       bits(2-3)(0x0C) - размещение текста в описанном 
       прямоугольнике по горизонтали
           =0 - выровнен по левой границе,
           =1 - центрирован,
           =2 - выровнен по правой границе,
           =3 - выровнен по левой и правой границам.
       bits(4-5)(0x30) - размещение описанного прямоугольника 
       по вертикали:
           =0 - базовая точка на верхней границе,
           =1 - базовая точка в середине,
           =2 - базовая точка на нижней границе.
       bits(5-6)(0xC0) - размещение текста в описанном 
       прямоугольнике по вертикали
           =0 - выровнен по верхней границе,
           =1 - центрирован,
           =2 - выровнен по нижней границе

       x y - координаты базовой точки.

       pos= - аналогичный позиционному параметру pos_code.

       x= - координата базовой точки по горизонтали в пикселях.

       y= - координата базовой точки по вертикали в пикселях.

       width= - ширина описанного прямоугольника в пикселях.

       height= - высота описанного прямоугольника в пикселях.
 
       hlines= - высота описанного прямоугольника в строках.

       draw_rect= - заданные через запятую (без пробелов) координаты 
       левого верхнего угла и размеры описанного прямоугольника в пикселях.

       shifts= - не масштабируемое смещение описанного прямоугольника 
       относительно базового положения.

       scroll= - смещение текста внутри описанного прямоугольника.

       font= - атрибуты шрифта:

          <имя шрифта>:<размер>[,<стиль>]

          где имя - имя шрифта или "*", если изменяют
          только размер или стиль текущего шрифта,

              размер - размер шрифта или -1, если 
          сохраняется размер выбранного щрифта,

              стиль - стиль шрифта - целое число значения 
           которого означают:
                  
              0 - обычный, 

              1 - полужирный, 

              2 - курсив, 

              3 - полужирный курсив.
 
       value = - (ключевой параметр) отображаемый тест.

       common key params - общие ключевые параметры.

      Элемент text предназначен для отображения многострочного 
   многошрифтового текста. Помимо перечисленных выше параметров элемента 
   text, на размещение текста в заданной прямоугольной области оказывают 
   влияние атрибуты слоя, управляющие форматированием текста (см. атрибуты 
   слоя п. 2.3.).

      Отображаемый текст (значение ключевого параметра value) может 
   содержать управляющую информацию, оформленную в виде отделенных от 
   остального текста пробелами и заключенных в угловые скобки команд с 
   параметрами:

      <br> - переход на новую строку,

      <sp:num> - продолжить выдачу, сдвинувшись вдоль строки на num 
	  пробелов,

      <shift:sx,sy> - для всех следующих лексем (до признака окончания 
	  сдвига) установить сдвиг на sx пикселей по горизонтали и sy пикселей по 
	  вертикали,

      </shift> - признак конца действия сдвига,

      <font=name:size,style> - для всех следующих лексем (до признака 
	  окончания действия шрифта) установить шрифт, заданный в параметрах 
	  этой команды, 

      </font> - признак конца действия шрифта.



    3.8. Текст, размещенный вдоль ломаной линии 


   pltext  value="text"  line=line_coords  |  iline=iline_coords  | 
   link=layer:number      [step=sw      shifts=sx,sy 
   font=<имя_шрифта>:<размер>,<стиль> <common key params>]

   где value = - отображаемый тест.

       line= - координаты вершин ломаной линии, вдоль которой 
       располагается текст (аналогично элементу типа line).

       iline= - координаты вершин ломаной линии, вдоль которой 
       располагается текст (аналогично элементу типа iline).

       link= - ссылка на линию (на элемент другого слоя):

          layer - имя слоя,
          number - номер элемента в слое.

       Если имя слоя не задано (link=:number), это означает 
       ссылку на элемент текущего слоя.

       step= - не масштабируемое дополнительное смещение 
       вдоль линии между символами заданное в пикселях.

       shifts= - не масштабируемое смещение текста относительно
       положения, определяемого линией заданное в пикселях (два 
       разделенных запятой числа xshift,yshift).

       font= - атрибуты шрифта:

          <имя шрифта>:<размер>[,<стиль>]

          где имя - имя шрифта или "*", если изменяют
          только размер или стиль текущего шрифта,

              размер - размер шрифта или -1, если 
          сохраняется размер выбранного щрифта,

              стиль - стиль шрифта - целое число значения 
          которого означают:
                  
              0 - обычный, 

              1 - полужирный, 

              2 - курсив, 

              3 - полужирный курсив.
 
       common key params - общие ключевые параметры.

       Элемент типа pltext позволяет отобразить текст, располагаемый вдоль заданной
   линии. Координаты линии, вдоль которой размещается текст, могут быть заданы 
   непосредственно при описании этого элемента одним из указанных выше способов 
   (line или iline). Координаты линии текста можно взять и из другого элемента 
   (link). Длина линии текста не влияет на расстояние между символами вдоль линии. 
   Если длины линии не хватает для размещения текста, то остаток текста располагается
   вдоль продолжения последнего отрезка ломаной.


    3.9. Растровое изображение 


   image name [pos_code x y pos=p width=w height=h draw_rect=x,y,w,h 
   image_rect=xi,yi,wi,hi image_size=wi,hi load=<yes/no> <common key params>]
 
   где name идентификатор растрового изображения: 

       - имя растрового изображения, подготовленного 
       средствами апплета (см. п. 5.9.),

       - имя файла с растровым изображением (если не задан 
       полный URL, то реальный URL образуется за счет 
       добавления базового URL, заданного в параметре 
       bpath (см. п. 4.),

       - *<виртуальный экран> изображение, подготовленное 
       на каком-либо виртуальном экране,

       - use=number ссылка на растровое изображение 
       заданное в этом же слое в элементе с номером number,

       - g1=color1,color2,xg,yg,wg,hg параметры шаблона 
       градиентной заливки следующего типа - плавное 
       изменение цвета от color1 к color2 от границ 
       прямоугольника, заданного в параметре image_rect 
       до границ прямоугольника, левый верхний угол которого
       имеет координаты (xg,yg) относительно левого верхнего 
       угла image_rect, а ширина и высота соответственно wg и hg,

       pos_code - положение области отображения относительно 
       базовой точки (x,y) задается десятичным, восьмеричным 
       или шестнадцатеричным числом:

          bits(0-1)(0x03) - размещение по горизонтали:
              =0 - базовая точка на левой границе,
              =1 - базовая точка в середине,
              =2 - базовая точка на правой границе,
          bits(4-5)(0x30) - размещение по вертикали:
              =0 - базовая точка на верхней границе,
              =1 - базовая точка в середине,
              =2 - базовая точка на нижней границе
       
	   x y - координаты базовой точки 

       pos= - положение описывающего прямоугольника 
       относительно базовой точки (x,y) - это альтернативный 
       способ задания значения pos_code,

       width= - ширина области отображения, если не задана или 
       равно 0, то значение width принимается равным ширине 
       изображения, заданного в параметре name,

       height= - высота области отображения, если не задана или 
       равно 0, то значение height принимается равным высоте 
       изображения, заданного в параметре name,

       draw_rect= - альтернативный способ задания области 
       отображения (x, y, width и height),

       image_rect= - прямоугольник изображения - положение и 
       отображаемые размеры изображения,

       image_size= - два разделенных запятой числа, задающих 
       размеры изображения - альтернативный способ задания 
       размеров изображения для случая, когда левый верхний 
       угол изображения совпадает с левым верхним углом 
       области отображения,

       load= - (yes/no) признак начала загрузки изображения из 
       файла, URL которого задан в параметре name,

       common key params - общие ключевые параметры.

      Элемент типа image предназначен для задания растрового изображения. 
   Изображение, выводимое с помощью элемента типа image, может быть 
   уменьшено, увеличено, оно может быть показано целиком или частично, оно 
   может быть размножено для заполнения заданной прямоугольной области 
   отображения. Область, в которой осуществляется построение изображения, 
   задается с помощью параметров draw_rect или pos_code, базовой точки (x,y) 
   и размеров (width, height). Положение и отображаемые размеры растрового 
   изображения задаются параметром image_rect или image_size. Если параметры 
   image_size и image_rect не заданы, то отображаемые размеры изображения 
   принимаются равными размерам изображения, заданного в параметре name. 
   Если размеры изображения заданы равными 0, то отображаемые размеры 
   изображения принимаются равными размерам области отображения. Если 
   отображаемые размеры меньше размеров области отображения, то происходит 
   размножение изображения для заполнения всей области отображения.

      Если в качестве источника изображения указан URL файла, то ключевой 
   параметр load= указывает осуществлять ли загрузку изображения немедленно 
   или отложить ее до начала реального вывода изображения на экран.

      При задании шаблона градиентной заливки для цветов color1 и color2 
   можно задать степень прозрачности цвета. Если использовать для построения 
   шаблона непрозрачные цвета, то color1 и color2 задаются так, как описано в 
   п.2.10. Для задания степени прозрачности необходимо описать оттенок цвета 
   следующим образом -  #AA#RRGGBB, где AA степень прозрачности, заданная 
   в виде шестнадцатеричного числа от 00 до FF (00 соответствует полной 
   прозрачности, а FF полной непрозрачности), а RR, GG и BB - 
   шестнадцатеричные числа, задающие соответственно оттенки красного, 
   зеленого и синего.


    3.10. Ссылка на элемент другого слоя 

   link layer number

   где layer  - имя слоя графических элементов,

       number - номер элемента в слое.

   Элемент типа link позволяет в качестве элемента одного слоя указать 
   элемент другого слоя. 


    3.11. Копия элемента другого слоя 

   copy layer number

   где layer  - имя слоя графических элементов,

       number - номер элемента в слое.

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


 4. Статическое задание векторного изображения 

      Средства нижнего уровня СПО позволяют разместить требуемое 
   изображение на странице HTML-документа без дополнительного 
   программирования на JavaScript.

      Для размещения апплета на Web-странице, необходимо использовать тег 
   <APPLET>. Параметризация апплета осуществляется с помощью параметров 
   двух типов - общих и индивидуальных. Параметры, общие для любого апплета, 
   задающие для браузера размеры изображения, которое должен создавать 
   апплет, сетевой адрес программного кода апплета и т.д. Эти параметры 
   задаются в форме атрибутов тега <APPLET>. Основные атрибуты тега <APPLET>:

   - CODE - имя файла класса исполняемого Java-апплета (обязательный 
   атрибут);

   - HEIGHT - высота окна апплета (обязательный атрибут);

   - WIDTH - ширина окна апплета (обязательный атрибут);

   - CODEBASE - базовый адрес URL апплета (если этот атрибут не указан, 
   то в качестве базового используется базовый адрес URL документа, на 
   котором размещается апплет;

   - ARCHIVE - имя файла архива, содержащего классы используемые в 
   процессе работы апплета;

   - NAME - имя экземпляра апплета, которое может быть использовано 
   другими апплетами, расположенными на одной странице для 
   взаимодействия друг с другом;

   - MAYSCRIPT - признак, указывающий на возможность вызова методов 
   апплета из программ на языках JavaScript и VBScript.

      Параметры, индивидуальные для каждого конкретного типа апплета, 
   задаются с помощью произвольного количества тегов <PARAM>, размещаемых 
   между тегами <APPLET> и </APPLET>. Тег <PARAM> должен содержать два 
   обязательных атрибута:

   - name - имя параметра;

   - value - значение параметра.

      Апплет MultiView позволяет описать с помощью тегов <PARAM> 
   изображение, состоящее из произвольного количества элементов, 
   организованных в произвольное количество слоев. Часть параметров апплета 
   имеют фиксированные имена. Имена остальных параметров различны. Для их 
   формирования используются описанные ниже правила и они предназначены для 
   задания произвольного количества элементов изображения и их распределения 
   по слоям.

      Далее перечислены параметры апплета, имеющие фиксированные имена: 

   - bpath - базовый URL для файлов с изображениями, которые будут 
   задаваться в элементах слоев типа image (если параметр не задан, то 
   базовый URL устанавливается равным URL каталога файловой системы 
   сервера, в котором размещен сам апплет);

   - bgcolor - число, задающее оттенок цвета фона (см. 2.10.),

   - layers_all - список имен слоев, которые будут заданы статически в 
   параметрах апплета (имена в списке разделены пробелами);

   - layers_draw - список имен слоев, которые будут отображены после 
   окончания загрузки апплета и его параметров (для задания списка имен 
   слоев используется специальный синтаксис - см. ниже).

      Имена параметров, описывающих элементы изображения и их 
   распределение по слоям, образуются по следующему закону. Если параметр 
   layers_all содержит слой с именем <layer_name>, то среди параметров апплета 
   должен находится параметр, имеющий атрибут name равный <layer_name>, а 
   значение атрибута value для этого параметра должно содержать строку с 
   описанием общих для всех элементов слоя атрибутов отображения. Кроме того, 
   среди параметров апплета могут встречаться параметры, имена которых имеют 
   следующую структуру <layer_name>_object_<num>, где <num> - номер элемента 
   слоя (нумерация элементов слоя начинается с нуля). Атрибут value такого 
   параметра содержит строку с описание соответствующего элемента слоя.

      Все слои, заданные в параметре layers_draw, включаются и в список 
   слоев для выбора курсором. При динамическом задании параметров апплета из 
   программ на JavaScript списки слоев для отображения и для выбора элементов 
   изображения курсором можно изменять независимо.
      Пример статического задания изображения приведен в п.6.


 5. Динамическое задание векторных изображений 

      Для динамического изменения векторного изображения на странице 
   HTML-документа (для создания анимационных эффектов) требуется написание 
   программ на JavaScript, которые с помощью соответствующих методов апплета 
   осуществляют генерацию изображения и вывод его на экран. Методы апплета 
   позволяют удалять и создавать графические элементы изображения, изменять 
   их атрибуты, удалять и создавать слои графических элементов, изменять их 
   состав и атрибуты отображения элементов, организовывать слои в группы и 
   выводить в нужный момент времени на экран сконструированные векторные 
   изображения. Ниже приводится полное описание методов апплета и их 
   параметров дающее представление о возможностях разработанного апплета 
   MultiView, в части динамического построения изображений в программах на 
   JavaScript.


    5.1. Задание списка объектов группы 

      Список объектов группы задается с помощью строки, в которой 
   помещаются разделенные пробелами имена объектов, входящих в состав 
   группы - слои, массивы данных, таблицы поименованных объектов, группы. 
   Имеется возможность задать в качестве объектов, включаемых в группу, 
   файлы с растровыми изображениями. Для каждого включенного таким образом 
   файла с изображением создается слой, в состав которого включается 
   соответствующий элемент типа image. Перед именем объекта, включаемого 
   в состав группы, размещается управляющий символ, который определяет 
   действия по изменению состава группы:

      "%"              - удалить все объекты из группы,

      "-<имя объекта>" - удалить заданный объект,

      "#<имя объекта>" - добавить заданный объект,

      ":<имя группы>"  - добавить все объекты, входящие в состав 
                         указанной группы,

      "!<URL файла>"   - добавить в состав группы слой, содержащий 
                         растровое изображение, определяемое заданным 
                         файлом.


    5.2. Управление текущим состоянием 


    5.2.1. Открытие режима редактирования 

   void open_change_mode( int bflag )

   где flag - признак блокировки реакции апплета на движение мыши и 
   перерисовку по инициативе браузера на период редактирования:

      =0, реакция на движение мыши и перерисовка разрешаются,

      =1, реакция на движение мыши и перерисовка запрещаются.


    5.2.2. Закрытие режима редактирования 

   int close_change_mode( int redraw_flag ) 

   где redraw_flag - режим перерисовки изображения по окончании редактирования:

         bit00(0x00001) - переопределение выделенных элементов 
	     изображения по текущему положению курсора (отмена режима 
	     выделения для ранее выделенных, поиск новых и выделение 
	     найденных),

         bit01(0x00002) - отказ от всех ранее выделенных элементов 
	     изображения,

         bit02(0x00004) - построение на основном виртуальном экране 
	     растрового изображения по соответствующему векторному 
	     изображению и вывод его на экран,

         bit04(0x00010) - блокировка снятия режима редактирования 
	     (используется для отрисовки изображения до окончательного 
	     завершения редактирования).

      Метод возвращает значение 0 если изображение полностью построено. 
   Если векторное изображение содержало растровые изображения, которые еще 
   не успели загрузится по сети, то на экран выводятся все элементы изображения 
   кроме незагруженных растровых изображений. В этом случае метод возвращает 
   значение -1. Кроме того, при закрытии режима редактирования апплет 
   "забывает" какой из слоев графических объектов был текущим.


    5.2.3. Установка области построения изображения 

   void set_change_rect( int x, int y, int width, int height )

   где x,y    - координаты левого верхнего угла в пикселях,

       width  - ширина в пикселях,

       height - высота в пикселях.

   Если не обращаться к методу set_change_rect, вывод изображения будет 
   выполняться по всему полю апплета на странице HTML-документа. С помощью 
   set_change_rect можно сократить область рисования и таким образом ускорить 
   вывод изображения на экран.


    5.2.4. Задание текущей группы 

   int set_current_group( String group_name )

   где group_name - имя группы

   Метод возвращает значение 0 если группа существует и -1 если группа 
   отсутствует. Задание текущей группы аналогично заданию текущего каталога в 
   файловой системе ОС. Использование текущей группы позволяет при 
   идентификации объектов (слоев, массивов данных, таблиц поименованных 
   объектов, групп) указывать относительный путь доступа к объекту.


    5.2.5. Задание текущего слоя 

   int set_current_layer( String layer_name )

   где layer_name - имя слоя.

   Метод возвращает номер слоя, если слой существует, иначе -1. Методы работы 
   с графическими элементами изображения оперируют с элементами текущего слоя.


    5.2.6. Изменение списка отображаемых слоев 

   void set_layers_draw( String llist )
   
   где llist - список слоев, заданный в соответствии с синтаксисом 
   списка объектов группы (см. 5.1.)

   Метод представляет упрощенный способ изменения состава отображаемых 
   слоев, которые были заданы статически в параметре апплета layers_draw. 
   

    5.2.7. Задание состава изображение в виде списка групп слоев 

   void set_draw_groups( String groups_list )

   где groups_list - список групп слоев - строка, состоящая из разделенных 
   пробелами полных имен групп (включая путь).


    5.2.8. Задание списка групп слоев для выбора курсором ("активных" зон) 

   void set_active_groups( String groups_list )

   где groups_list - список групп слоев - строка, состоящая из разделенных 
   пробелами полных имен групп (включая путь).


    5.2.9. Задание изображения при курсоре 

   void set_cursor_layer( String layer_name )

   где layer_name - имя слоя.

   Апплет, размещенный на странице HTML-документа не может изменять курсор. 
   Для того, чтобы компенсировать отсутствие данного изобразительного 
   средства, предоставляется возможность в момент нахождения курсора над 
   полем апплета показывать рядом с курсором произвольное изображение. Состав 
   этого изображения и его расположение относительно курсора задаются с 
   помощью элементов некоторого слоя. Для отключения режима показа 
   изображения при курсоре необходимо обратиться к методу set_cursor_layer 
   с параметром layer_name равным null.


    5.3. Получение информации об элементах изображения, выбранных 
   курсором ("активных" зонах) 


    5.3.1. Получение информации о выбранном элементе слоя 

   int get_selected_in_layer( String layer_name, int select_par )

   где layer_name - имя слоя,
       
	   select_par - идентификатор возвращаемого значения:

         =0 - номер элемента слоя,
         =1 - идентификатор (значение атрибута id) элемента слоя 
              без учета вектора идентификаторов (атрибута ids) слоя,
         =2 - идентификатор (значение атрибута id) элемента слоя с 
              учетом вектора идентификаторов (атрибута ids) слоя 
              (ids[id].)


    5.3.2. Получение информации о выбранном слое группы слоев 

   String get_selected_in_group_layer( String group_name )

   где group_name - имя группы слоев.

   Метод возвращает имя слоя, в котором находится выбранный элемент. 


    5.3.3. Получение информации о выбранном элементе группы слоев 

   int get_selected_in_group( String group_name, int select_par )

   где group_name - имя группы слоев,

	   select_par - идентификатор возвращаемого значения:

         =0 - номер элемента слоя,
         =1 - идентификатор (значение атрибута id) элемента слоя 
              без учета вектора идентификаторов (атрибута ids) слоя,
         =2 - идентификатор (значение атрибута id) элемента слоя с 
              учетом вектора идентификаторов (атрибута ids) слоя 
              (ids[id].)

   Метод удобно использовать, если элементы слоев, входящих в состав 
   группы имеют уникальные идентификаторы, однозначно характеризующие 
   выбранную "активную" зону.


    5.4. Получение информации об элементах изображения, выбранных 
   курсором ("активных" зонах) 


    5.4.1. Получение информации о выбранном элементе слоя 

   String get_group_layer_attribs( String group_name, String atr_name )

   где group_name - имя группы слоев,

       atr_name - имя параметра охватывающего прямоугольника:

        "xpos"   - смещение левого верхнего угла охватывающего прямоугольника 
                   по горизонтали,
        "ypos"   - смещение левого верхнего угла охватывающего прямоугольника 
                   по вертикали,
        "width"  - ширина охватывающего прямоугольника,
        "height" - высота охватывающего прямоугольника,
        "size"   - размеры охватывающего прямоугольника (два разделенных
                   запятой числа - ширина и высота),
        "bbox"   - охватывающий прямоугольник (четыре разделенных запятой
                   числа - координаты левого верхнего угла, ширина и высота).


    5.4.2. Получение параметров охватывающего прямоугольника и некоторых 
   других атрибутов текущего слоя 

   String get_layer_attribs( String atr_name )

   где atr_name - имя параметра:

        "number"   - количество элементов в слое,
        "selected" - номер выбранного элемента,
        "shifts"   - значение параметров сдвига слоя (два разделенных запятой 
                     числа - сдвиг по горизонтали и по вертикали),
        "xshift"   - значение горизонтального сдвига слоя,
        "yshift"   - значение вертикального сдвига слоя,
        "xpos"     - смещение левого верхнего угла охватывающего прямоугольника 
                     по горизонтали,
        "ypos"     - смещение левого верхнего угла охватывающего прямоугольника 
                     по вертикали,
        "width"    - ширина охватывающего прямоугольника,
        "height"   - высота охватывающего прямоугольника,
        "size"     - размеры охватывающего прямоугольника (два разделенных
                     запятой числа - ширина и высота),
        "bbox"     - охватывающий прямоугольник (четыре разделенных запятой
                     числа - координаты левого верхнего угла, ширина и высота).


    5.4.3. Получение параметров охватывающего прямоугольника и некоторых 
   других атрибутов элемента текущего слоя 

   String get_element_attribs( int element_num, String atr_name )

   где atr_name - имя параметра:

        "id"     - идентификатор элемента,
        "shifts" - значение параметров сдвига слоя (два разделенных запятой 
                   числа - сдвиг по горизонтали и по вертикали),
        "xshift" - значение горизонтального сдвига слоя (только для элементов 
                   типа текст),
        "yshift" - значение вертикального сдвига слоя (только для элементов 
                   типа текст),
        "xpos"   - смещение левого верхнего угла охватывающего прямоугольника 
                   по горизонтали,
        "ypos"   - смещение левого верхнего угла охватывающего прямоугольника 
                   по вертикали,
        "width"  - ширина охватывающего прямоугольника,
        "height" - высота охватывающего прямоугольника,
        "size"   - размеры охватывающего прямоугольника (два разделенных
                   запятой числа - ширина и высота),
        "bbox"   - охватывающий прямоугольник (четыре разделенных запятой
                   числа - координаты левого верхнего угла, ширина и высота).


    5.5. Редактирование состава элементов и атрибутов отдельного 
   элемента слоя 


    5.5.1. Изменение элемента слоя по номеру 

   void set_layer_element_num( int element_num, String atrs_type, String atrs_value )

   где element_num - номер элемента, если num < 0, или > максимального, то 
       выполняется добавление нового элемента, иначе замена существующего 
       элемента,

       atrs_type - задает назначение атрибута atrs_value: 

        "object" - переопределение или добавление нового элемента слоя,
        "attribs" - переопределение общих ключевых параметров (см. 3.1),

       atrs_value - значение переопределяемых общих ключевых параметров 
       или полное описание элемента слоя.


    5.5.2. Изменение элемента слоя по идентификатору 

   int set_layer_element_id( int element_id, String atrs_type, String atrs_value )

   где element_id - идентификатор элемента слоя,

       atrs_type - задает назначение атрибута atrs_value: 

        "object" - переопределение или добавление нового элемента слоя,
        "attribs" - переопределение общих ключевых параметров (см. 3.1),

       atrs_value - значение переопределяемых общих ключевых параметров 
       или полное описание элемента слоя.

   Метод возвращает номер измененного элемента слоя или -1, если элемент с 
   заданным идентификатором не найден.


    5.6. Создание и удаление слоев, редактирование их атрибутов 


    5.6.1. Создание нового слоя 

   add_layer( String layer_name, String layer_attribs )

   где layer_name    - имя слоя,

       layer_attribs - описание атрибутов слоя.

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


    5.6.2. Удаление слоя 

   del_layer( String layer_name)

   где layer_name - имя слоя.

   Метод выполняет удаление ранее созданного слоя. Удаленный слой 
   исключается из всех групп, в состав которых он входил.


    5.6.3. Исключение элементов из состава текущего слоя 

   clear_layer_elements( )

   Метод выполняет исключений всех элементов из состава текущего слоя. Если 
   исключаемый элемент не входил в состав других слоев, то он удаляется.


    5.6.4. Исключение элементов из состава слоя 

   clear_layer_elements( String layer_name)

   где layer_name - имя слоя.

   Метод выполняет исключений всех элементов из состава заданного слоя. Если 
   исключаемый элемент не входил в состав других слоев, то он удаляется.


    5.6.5. Изменение атрибутов текущего слоя 

   set_layer_attribs( String layer_attribs )

   где layer_attribs - описание атрибутов слоя.

   Метод выполняет изменение атрибутов текущего слоя.


    5.6.6. Изменение атрибутов заданного слоя 

   set_layer_attribs( String layer_name, String layer_attribs )

   где layer_name    - имя слоя,

       layer_attribs - описание атрибутов слоя.

   Метод выполняет изменение атрибутов заданного слоя.


    5.6.7. Изменение атрибутов слоев, входящих в состав группы 

   int set_group_attribs( String group_name, String layer_attribs )

   где group_name    - имя группы,

       layer_attribs - описание атрибутов слоя.

   Метод выполняет изменение атрибутов всех слоев, входящих в состав заданной 
   группы. Возвращает 0 если группа найдена, и -1 если заданная группа 
   отсутствует.


    5.7. Работа с группами объектов 


    5.7.1. Создание группы 

   int add_group ( String group_name, String list )

   где group_name - имя группы,
   
       list       - изменения списка объектов группы (см. синтаксис списка 
                    объектов группы 5.1.)

   Метод выполняет создание новой группы и включение в ее состав 
   заданного списка объектов. Если группа уже существует, то происходит 
   изменение состава объектов группы. Если объект с именем group_name 
   существует, но не является группой, метод возвращает значение -1, иначе 
   возвращаемое значение равно 0.


    5.7.2. Удаление группы 

   int del_group ( String group_name )

   где group_name - имя группы.

   Метод выполняет удаление ранее созданной группы. Удаленная группа 
   исключается из всех групп, в состав которых она входила.


    5.7.3. Удаление всех объектов, входящих в состава группы 

   int del_group_elements( String group_name )

   где group_name - имя группы.

   Метод выполняет удаление всех объектов, входящих в состав группы. 
   Удаляемые объекты группа исключаются из всех групп, в состав которых 
   они входили.


    5.7.4. Синхронное создание группы 

   int add_new_group ( String group_name, String list )

   где group_name - имя группы,

       list  - изменения списка объектов группы, заданные в соответствии 
               с синтаксисом списка объектов группы (см. 5.1.)

   Если группа с указанным именем отсутствует, метод выполняет создание новой 
   группы и включение в ее состав заданного списка объектов. В этом случае 
   возвращаемое значение равно 0. Если группа уже существует, то никаких 
   действий не выполняется и возвращается значение 1. Если объект с заданным 
   именем существует, но не является группой, метод возвращает значение -1.
   Интернет браузер выполняет программы, написанные на JavaScript, в 
   многопоточном режиме. Средства синхронизации выполнения JavaScript 
   программ отсутствуют. Данный метод может быть использован для 
   синхронизации выполнения JavaScript программ, поскольку программный код 
   метода синхронизирован средствами Java, и позволяет создавать новую группу 
   одновременно только в одном потоке.


    5.7.5. Получение информации о составе группы 


   int get_group_elements( String group_name, int obj_type )

   где group_name - имя группы,

       obj_type - тип объектов, входящих в состав группы:

         =0 - группы,
         =1 - слои графических элементов,
         =2 - массивы данных,
         =3 - таблицы поименованных объектов,
         =4 - все не группы.

   Метод осуществляет создание списка строк с именами объектов заданного типа. 
   Возвращаемое значение - количество элементов в созданном списке. Для 
   доступа к элементам списка используется метод get_element_name (см. 5.7.7.).


    5.7.6. Получение пути к объекту по имени 

   String get_element_name (String obj_name )

   где obj_name - имя объекта.

   Метод возвращает путь к объекту т.е. полное имя группы (включая путь от 
   "корня"), в состав которой входит объект. Если в качестве имени объекта задана 
   пустая строка, то возвращается полное имя текущей группы.


    5.7.7. Получение значения элемента списка 

   String get_element_name ( int lnum )

   где lnum - номер элемента списка.

   Метод возвращает значение соответствующего элемента списка созданного 
   методом get_group_elements (5.7.5) или get_htable_elements (5.12.8).


    5.8. Работа с виртуальными экранами 


    5.8.1. Создание виртуального экрана 

   add_screen( String screen_name, int width, int height )

   где screen_name - имя виртуального экрана,

       width  - ширина виртуального экрана в пикселях,

       height - высота виртуального экрана в пикселях.

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


    5.8.2. Создание виртуального экрана с заданным фоновым цветом 

   void add_screen( String screen_name, int width, int height, int bgcolor )

   где screen_name - имя виртуального экрана,

       width   - ширина виртуального экрана в пикселях,

       height  - высота виртуального экрана в пикселях,

       bgcolor - десятичное или шестнадцатеричное число (0xRRGGBB, 
                 где RR - шестнадцатеричное число, задающее оттенок красного,
                 GG - зеленого и BB - синего в заданном цвете).

   Метод создает новый виртуальный экран заданного размера с фоновым цветом, 
   заданным в параметре bgcolor. Если экран уже существует, то никаких 
   действий по изменению его размера или фонового цвета не производится.


    5.8.3. Удаление виртуального экрана 

   void del_screen( String screen_name )

   где screen_name - имя виртуального экрана.

   Метод удаляет ранее созданный виртуальный экран.


    5.8.4. Подготовка изображения на виртуальном экране по заданному списку
    групп слоев графических элементов 

   int prepare_screen( String screen_name, String group_name )

   где screen_name - имя виртуального экрана,

       group_name - имя группы со списком групп слоев для отображения.

   Метод возвращает значение 0, если изображение полностью построено. Если 
   векторное изображение содержало растровые изображения, которые еще не 
   успели загрузится по сети, то на виртуальный экран выводятся все элементы 
   изображения кроме незагруженных растровых изображений. В этом случае 
   метод возвращает значение -1. Список групп слоев, заданный с помощью 
   параметра group_name, запоминается в виртуальном экране. В дальнейшем 
   можно перестраивать растровое изображение виртуального экрана не задавая 
   списка групп слоев графических объектов (см. 5.7.5.).


    5.8.5. Подготовка изображения на виртуальном экране по ранее 
    установленному списку слоев 

   int draw_screen( String screen_name )

   где screen_name - имя виртуального экрана.

   Метод возвращает значение 0 если изображение полностью построено. Если 
   векторное изображение содержало растровые изображения, которые еще не 
   успели загрузится по сети, то на виртуальный экран выводятся все элементы 
   изображения кроме незагруженных растровых изображений. В этом случае 
   метод возвращает значение -1.


    5.8.6. Смена изображения на основном виртуальном экране на изображение 
    подготовленное на другом виртуальном экране 

   int swith_screen( String screen_name, String swith_params )

   где screen_name  - имя виртуального экрана,

       swith_params - строка параметров задающих визуальный 
	                  эффект, используемый для смены изображения.

   Строка параметров имеет следующую структуру. Первая лексема - задает тип 
   визуального эффекта. Остальная часть строки - набор ключевых параметров 
   состав которых зависит от типа визуального эффекта. Реализованы следующие 
   типы визуальных эффектов:

      shift  - "сдвиг",

      blind  - "шторки",

      random - "случайное проявление".

   Параметры визуального эффекта shift ("сдвиг"):

      time= - время выполнения эффекта в миллисекундах,

      step= - начальный шаг в пикселях (шаг может меняться в процессе 
              выполнения эффекта для того, чтобы уложиться в заданное время),

      xdir= - признак сдвига в горизонтальном направлении:

        =1 - выполняется сдвиг по горизонтали, 
        =0 - не выполняется сдвиг по горизонтали,

      ydir= - признак сдвига в вертикальном направлении:

        =1 - выполняется сдвиг по вертикали, 
        =0 - не выполняется сдвиг по вертикали,

      old= - признак сдвига "старого" изображения синхронно с "новым":

        =1 - сдвиг "старого" изображения выполняется,
        =0 - сдвиг "старого" изображения не выполняется,

      center= - признак выполнения "расширения" "нового" изображения от центра к краям:

        =1 - выполняется "расширение",
        =0 - не выполняется "расширение".

   Параметры визуального эффекта blind ("шторки"):

      time= - время выполнения эффекта в миллисекундах,

      step= - начальный шаг в пикселях (шаг может меняться в процессе 
              выполнения эффекта для того, чтобы уложиться в заданное время),

      start= - начальное раскрытие "шторки" в пикселях - часть "шторки", 
               раскрывающаяся немедленно (до начала цикла показа раскрывающейся 
               "шторки"), если начальное раскрытие задано отрицательным числом, то 
               начальная область шторки не раскрывается, а процесс раскрытия 
               начинается в каждой секции "шторки" с пикселя с номером start,

      number= - количество циклов показа раскрывающейся "шторки" (в 
                каждом цикле показа "шторка" раскрывается на один пиксель), 
                если количество циклов показа не задано, то осуществляется полное 
                раскрытие "шторки",

      xdir=  - признак раскрытия "шторки" в горизонтальном направлении:

        =1  - выполняется раскрытие вправо, 
        =0  - раскрытия не выполняется,
        =-1 - выполняется раскрытие влево, 

      ydir= - признак раскрытия "шторки" в вертикальном направлении:

        =1  - выполняется раскрытие вниз, 
        =0  - раскрытия не выполняется,
        =-1 - выполняется раскрытие вверх, 

      center= - признак выполнения "расширения" "нового" изображения от 
                центра к краям:

        =1 - выполняется "расширение",

        =0 - не выполняется "расширение",

      xshift= - смещение "нового" виртуального экрана по горизонтали,

      yshift= - смещение "нового" виртуального экрана по вертикали.

   Параметры визуального эффекта random ("случайное проявление"):

      time= - время выполнения эффекта в миллисекундах,

      step= - размер прямоугольной области одновременного случайного 
	          проявления в пикселях,

      xshift= - смещение "нового" виртуального экрана по горизонтали,

      yshift= - смещение "нового" виртуального экрана по вертикали.

   Выполнение всех визуальных эффектов осуществляется в прямоугольной 
   области изображения заданной методом set_change_rect (см. п. 5.2.3.).


    5.8.7. Получение объекта изображение (Image) 

   Image get_screen_image( String screen_name )

   где screen_name - имя виртуального экрана.

   Метод позволяет получить в объекте JavaScript объект Image языка Java. 
   Полученный результат можно использовать для создания поименованных 
   растровых изображений с прозрачным цветом (см. п. 5.9.1) или для 
   отображения объекта Image каким-либо другим апплетом.


    5.9. Работа с динамически создаваемыми растровыми изображениями 


    5.9.1. Создание поименованного растрового изображения 

   void add_named_image( String image_name, Image image, boolean tcolor, 
   int x, int y, int width, int height )

   где image_name - имя создаваемого растрового изображения,

       image      – объект Image языка Java,

       tcolor     – признак прозрачности фона изображения,

       x y        – координаты левого верхнего угла фрагмента изображения,

       int width  – ширина фрагмента изображения,

       int height – высота фрагмента изображения.

   Метод создает поименованное растровое изображение, которое в дальнейшем 
   можно использовать при создании графического элемента типа image. Если 
   значение параметра tcolor равно true, то пиксели созданного изображения, 
   имеющие фоновый цвет становятся прозрачными. В качестве фонового цвета 
   выбирается цвет правого нижнего пикселя фрагмента изображения. Если 
   ширина или высота прямоугольного фрагмента заданы равными нулю, то 
   фактический размер фрагмента по соответствующему направлению 
   устанавливается равным разности между размером исходного изображения и 
   положением левого верхнего угла фрагмента по этому направлению.


    5.9.2. Удаление поименованного растрового изображения 

   void del_named_image( String image_name )

   где image_name - имя создаваемого растрового изображения.


    5.10. Получение информации о состоянии кнопок «мыши» и клавиатуры 


    5.10.1. Получение информации о состоянии кнопок «мыши» 

   int get_mouse_state( int clear_state )

   где clear_state - управление хранением состояния кнопок «мыши».

   Апплет запоминает события «нажатие» и «отпускание» кнопки мыши. 
   Метод позволяет опросить запомненное апплетом состояние и при необходимости 
   «очистить» его. Возвращаемое значение метода равно:

        =0 – нажатия не было,
        =1 – было нажатие,
        =2 – было отпускание после нажатия.

   Параметр clear_state может принимать значения 0, 1 или 2. Если clear_state 
   совпадает с возвращаемым значением, то запомненное состояние 
   "сбрасывается" в 0. Иначе изменения запомненного состояния кнопок «мыши» 
   не происходит.


    5.10.2. Получение информации о состоянии клавиш клавиатуры 

   int get_key_state( int clear_state )

   где clear_state - управление хранением состояния клавиш клавиатуры.

   Апплет запоминает события «нажатие» и «отпускание» клавиш клавиатуры. 
   Метод позволяет опросить запомненное апплетом состояние и при необходимости 
   «очистить» его. Возвращаемое значение метода равно:

        =0 – нажатия не было,
        =1 – было нажатие,
        =2 – было отпускание после нажатия.

   Параметр clear_state может принимать значения 0, 1 или 2. Если clear_state 
   совпадает с возвращаемым значением, то запомненное состояние 
   "сбрасывается" в 0. Иначе изменения запомненного состояния клавиш 
   клавиатуры не происходит.


    5.10.3. Получение дополнительной информации о некоторых событиях 
   «мыши» и клавиатуры 

   int get_event_info( int info_type )

   где info_type – тип запрашиваемой информации.

   Апплет запоминает некоторую информацию состоянии аппаратуры в момент 
   событий от «мыши» и клавиатуры. Метод позволяет опросить запомненное 
   апплетом состояние. Возвращаемое значение метода зависит от значения 
   параметра info_type:

       =0 – значение модификаторов Crtl, Alt и Shift при нажатии кнопок мыши,
       =1 – значение модификаторов Crtl, Alt и Shift при нажатии клавиши,
       =2 – код клавиши,
       =3 – значение модификаторов Crtl, Alt и Shift при движении мыши,
       =4 – положение мыши: =0 - внутри апплета, =-1 - вне апплета.

   Значение клавиш модификаторов возвращается в следующем виде:

       bit0(0x1) – нажата клавиша Shift,
       bit1(0x2) – нажата клавиша Crtl,
       bit2(0x4) – нажата клавиша Meta (признак нажатия правой кнопки «мыши»),
       bit3(0x8) – нажата клавиша Alt.


    5.11. Специальные режимы работы апплета для интерактивного 
   графического задания параметров изображения 


    5.11.1. Перемещение элементов изображения в режиме "drag" 

      Апплет позволяет перемещать элементы изображения в режиме "drag" 
   (перемещение «мыши» с нажатой кнопкой). В этом режиме перемещаются все 
   элементы выбранного слоя. Перемещение слоя по горизонтали и вертикали 
   запоминается соответственно в атрибутах слоя xshift и yshift. Значение этих 
   атрибутов слоя после завершения перемещения можно получить с помощью 
   метода get_layer_attribs (см. п. 5.4.2). Перемещение в режиме "drag" 
   завершается после отпускания кнопки «мыши».


    5.11.1.1. Предварительное задание слоя для перемещения 

   int set_drag_layer( String layer_name )
   
   где layer_name – имя слоя, элементы которого будут перемещаться.

   Метод задает слой для будущего перемещения в режиме "drag". Если после 
   выполнения этого метода через некоторое время пользователь нажмет кнопку 
   «мыши» и начнет ее перемещать, не отпуская кнопку, то элементы заданного 
   слоя будут отображены поверх остального изображения и начнут перемещаться 
   в соответствии с перемещениями «мыши». После отпускания кнопки мыши 
   перемещение элементов слоя прекращается и их отображение выведенное 
   поверх остального изображения исчезает. Метод возвращает значение 0, если 
   предыдущее перемещение не было выполнено, т.е. слой для перемещения был 
   задан, а режим "drag" не был осуществлен (курсор в режиме "drag" не 
   сдвинулся). Метод возвращает 1, если заданный ранее слой перемещался. Если 
   задать параметр layer_name равным null, то апплет «забывает» заданный ранее 
   слой для перемещения в режиме "drag".


    5.11.1.2. Начало перемещения слоя 


   void start_drag_layer( String layer_name )

   где layer_name – имя слоя, элементы которого будут перемещаться.

   Метод задает слой для перемещения и отображает элементы заданного слоя 
   поверх остального изображения. Метод предназначен для вызова после того как 
   пользователь уже нажал кнопку «мыши».

    5.11.1.3. Задание области перемещения 

   void set_move_zone( int x, int y, int width, int height )

   где x y    - координаты левого верхнего угла в пикселях,

       width  - ширина в пикселях,

       height - высота в пикселях.

   Если область перемещения не задана, то изображения элементов слоя 
   перемещаются по всему полю апплета. Метод set_move_zone позволяет 
   ограничить область перемещения.


    5.11.2. Интерактивный выбор прямоугольного фрагмента изображения 

      Апплет позволяет интерактивно выбирать прямоугольный фрагмент 
   изображения в режиме "drag" (перемещение «мыши» с нажатой кнопкой). В 
   этом режиме изменяется размер прямоугольной рамки отображаемой поверх 
   остального изображения, за счет перемещения ее правого нижнего угла в 
   соответствии с перемещением курсора. Параметры отображения рамки (цвет, 
   толщина линии и др.) задаются в параметрах слоя, нулевой элемент которого и 
   отображается в режиме интерактивного выбора прямоугольного фрагмента 
   изображения. Размеры рамки запоминаются в атрибутах нулевого элемента 
   слоя. После завершения выбора прямоугольной области можно получить ее 
   координаты с помощью метода get_layer_attribs (см. п. 5.4.2). Интерактивный 
   выбор прямоугольного фрагмента изображения завершается после отпускания 
   кнопки «мыши».


    5.11.2.1. Предварительное задание слоя для выбора прямоугольного 
   фрагмента изображения 

  int set_choose_box_layer( String layer_name, int chmode, int width, int height )

   где layer_name – имя слоя с параметрами рамки,

       chmode – режим изменения рамки:

         =1 - произвольная рамка
         =2 - рамка пропорциональна прямоугольнику, установленному 
              с помощью функции set_move_zone (см. 5.11.1.3)

       width  – начальная ширина рамки,

       height – начальная высота рамки.

   Метод задает слой для будущего интерактивного выбора прямоугольного 
   фрагмента изображения. Слой, имя которого задано в параметре layer_name, не 
   должен содержать никаких элементов изображения. Если после выполнения 
   этого метода через некоторое время пользователь нажмет кнопку «мыши» и 
   начнет перемещать «мышь», не отпуская кнопку, то рамка заданного размера, 
   левый верхний угол которой расположен в точке соответствующей текущему 
   положению курсора, будет отображена поверх остального изображения и 
   правый нижний угол рамки начнет перемещаться в соответствии с 
   перемещениями «мыши». После отпускания кнопки мыши перемещение рамки 
   прекращается и ее отображение выведенное поверх остального изображения 
   стирается. Метод возвращает значение 0, если предыдущий выбор 
   прямоугольного фрагмента изображения не был выполнен, т.е. слой для выбора 
   был задан, а режим "drag" не был осуществлен (курсор в режиме "drag" не 
   сдвинулся). Метод возвращает 1, если заданный ранее слой был использован 
   для выбора прямоугольного фрагмента изображения. Если задать параметр 
   layer_name равным null, то апплет «забывает» ранее заданный слой.


    5.11.2.2. Начало выбора прямоугольного фрагмента изображения 

   void start_choose_box_layer( String layer_name, int chmode, int width, int height )

   где layer_name – имя слоя, элементы которого будут перемещаться,

       chmode – режим изменения рамки:

         =1 - произвольная рамка
         =2 - рамка пропорциональна прямоугольнику, установленному 
              с помощью функции set_move_zone (см. 5.11.1.3)

       width  – начальная ширина рамки,

       height – начальная высота рамки.

   Метод задает слой для интерактивного выбора прямоугольного фрагмента 
   изображения и отображает начальное положение рамки поверх остального 
   изображения. Метод предназначен для вызова после того как пользователь 
   уже нажал кнопку «мыши». Слой, имя которого задано в параметре layer_name, 
   не должен содержать никаких элементов изображения.


    5.12. Работа с массивами данных 


    5.12.1. Создание массива данных 

   void add_data_array( String name, String params )

   где name – имя массива данных,

       params – описание массива данных.

   Метод создает новый массив данных. Если массив данных существует, метод не 
   выполняет никаких действий. Параметр params - строка с описанием типа 
   массива и его элементов. Первая лексема описания массива данных - тип 
   элементов или ссылка на другой массив данных. Возможны следующие типы 
   элементов массива данных:

      "number" - действительные числа,

      "color"  - оттенки цвета,

      "string" - строки,

      "stroke" - параметры штриховки,

      "text"   - форматированный многострочный текст,

      "prompt" - форматированный однострочный текст,

      "bitset" - логические значения (шкала битов).

      Если первая лексема строки параметров равна copy=<имя массива 
   данных> или clone=<имя массива данных>, то новый массив данных будет 
   копией другого массива данных или, соответственно, ссылкой на значения 
   другого массива данных.

      Если первая лексема описания - тип массива данных, то вторая лексема - 
   число, задающее размерность массива. Остальные лексемы - значения 
   элементов массива. Если число, задающее размерность массива данных равно 0, 
   то размерность массива определяется количеством лексем с описанием 
   элементов массива данных.

      Лексемы описания, задающие значения элементов массива, разделяются 
   пробелом или запятой и представляют собой для различных типов:

      "number" - последовательность чисел,

      "color"  - последовательность оттенков цвета заданных в соответствии с 
                 правилами задания цвета в параметрах слоя графических элементов 
                 (см. 4.10),

      "string" - последовательность подстрок,

      "stroke" - последовательность подстрок вида 

             "xstroke=line_step… ystroke=line_step…",

      "text"   - последовательность подстрок,

      "prompt" - последовательность подстрок,

      "bitset" - последовательность 0 и 1 (0 - false, 1 - true).


    5.12.2. Удаление массива данных 

   void del_data_array( String name )

   где name – имя массива данных.

   Метод удаляет массив данных из всех групп, в состав которых он входил.


    5.12.3. Задание значения элементов массива данных 

   int set_data_array_value( String name, int start, String values )

   где name   – имя массива данных,

       start  – номер начального элемента массива, с которого начинается 
                присваивание,

       values – значения элементов массива.

   Метод задает значение элементам массива, начиная с номера start. Количество 
   элементов, которым присваивается значение, определяется количеством лексем 
   с описанием значений в параметре values (см. п. 5.12.1). Если количество 
   лексем, заданных в параметре values, больше, чем доступное количество 
   элементов массива, то размерность массива данных увеличивается до 
   необходимой величины. Возвращаемое значение равно 0, если массив данных 
   существует. Иначе, возвращаемое значение равно -1.


    5.12.4. Задание значение рабочего интервала для массива данных 

   int set_data_array_segment( String name, int start, int length )

   где name   – имя массива данных,

       start  – номер начального элемента интервала,

       length – длина рабочего интервала.

   Часть операций с массивами данных осуществляется в рабочем интервале 
   элементов массивов данных. Метод позволяет установить новый рабочий 
   интервал номеров элементов для заданного массива данных. Если начальный 
   номер элемента start меньше 0, то реальный начальный номер определяется как
   сумма размерности массива и параметра start (-1 - последний элемент, -2 - 
   предпоследний и т.д.). Если длина рабочего интервала length меньше либо 
   равна 0, то реальная длина рабочего интервала определяется как сумма 
   размерности массива данных и значения параметра length, из которой 
   вычитается номер начального элемента интервала.


    5.12.5. Получение значения элементов массива данных 

   String get_data_array_string ( String name, int ind )

   где name – имя массива данных,

       ind  – номер начального элемента интервала.

   Метод возвращает строку со значением заданного элемента массива данных. 
   Если номер элемента ind равен -1, то возвращаемое значение содержит строку 
   лексем со значениями всех элементов массива данных.


    5.12.6. Получение параметров массива данных 

   int get_data_array_info ( String name, String property )

   где name – имя массива данных,

       property – определяет возвращаемое значение:

           "size" - размерность массива данных,

           "type" - тип элементов:

                 0 - действительные числа,
                 1 - оттенки цвета,
                 2 - строки,
                 3 - параметры штриховки,
                 4 - форматированный многострочный текст,
                 5 - форматированный однострочный текст,
                 6 - битовая шкала.
           
           "begin" - номер начального элемента рабочего интервала

           "end" - увеличенный на 1 номер последнего элемента 
                   рабочего интервала.

   Метод возвращает целое число со значением заданного свойства заданного 
   массива данных.


    5.12.7. Операции над массивом данных, результатом которых является число 

   double op_data_array( String name, String op )

   где name – имя массива данных,

       op - операция:

          min - получение минимального значения элементов 
                массива в рабочем интервале
          max - получение максимального значения элементов 
                массива в рабочем интервале
          sum - получение значения суммы элементов массива 
                в рабочем интервале
          del - удаление элементов массива, заданных рабочим 
                интервалом.

   Метод возвращает действительное число – результат заданной опрерации над 
   элементами заданного массива данных.


    5.12.8. Операции над одним массивом данных, результатом которых 
   является массив 

   double op1_data_array( String dname, String op, String sname, double nvalue )

   где dname – имя результирующего массива данных,

       op – операция:

        "abs"   - получение абсолютной величины элементов 
                  массива в рабочем интервале,
        "round" - округление элементов с сохранением nvalue 
                  знаков после запятой в рабочем интервале,
        "$"     - сумма произведений элементов массива на число 
                  nvalue в рабочем интервале,
        "+"     - добавить число nvalue к элементам массива данных в 
                  рабочем интервале,
        "-"     - вычесть число nvalue из элементов массива данных в 
                  рабочем интервале,
        "*"     - умножить элементы массива данных на число nvalue в 
                  рабочем интервале,
        "/"     - разделить элементы массива данных на число nvalue 
                  в рабочем интервале,
        "~"     - инвертировать битовую шкалу (тип элементов 
                  массивов sname и dname должен быть bitset),
        "="     - присвоить значение элементам массива данных 
                  dname в рабочем интервале (результат существенно 
                  зависит от типов массивов sname и dname),
        "sort"  - построить в результирующем массиве данных 
                  список номеров элементов исходного массива данных в 
                  порядке возрастания (nvalue равно 0) или убывания 
                  (nvalue не равно 0) их значений,
        "index" - построить в результирующем массиве данных 
                  список номеров элементов исходного массива, 
                  отвечающих определенным условиям (результат 
                  существенно зависит от типов массивов sname и dname),

      sname – имя исходного массива данных,

      nvalue – числовой параметр ряда перечисленных выше операций.

      Метод возвращает -1, если массивы данных не определены. Для большинства 
   операций метод возвращает количество обработанных элементов. Если задана 
   операция "$", то возвращаемое значение - сумма произведений элементов 
   массива на число nvalue.

      Выполнение операции "=" существенно зависит от массивов данных 
   dname и sname. 

      Если в качестве параметров dname и sname задан один и тот же массив 
   данных, то осуществляется рассылка фиксированного значения в элементы 
   массива, заданные рабочим интервалом. При этом, если тип элементов массивов 
   number, то происходит рассылка значения nvalue, а если их тип bitset, то 
   элементы битовой шкалы заполняются значениями false или true в зависимости 
   от значения параметра nvalue (равно 0 - false, не равно 0 - true). Если же массив 
   данных имеет другой тип, то никаких действий не производится.

      Если dname и sname разные массивы данных одного типа, то 
   производится перепись значений из элементов массива sname в 
   соответствующие элементы массива dname. Если длина массива dname больше, 
   чем длина массива sname, то при выборе элементов массива sname происходит 
   их циклический перебор.

      Если массивы dname и sname имеют разный тип элементов, то, как 
   правило, никаких действий не производится, кроме случаев когда их типы 
   равны bitset и number. Если тип dname - bitset, а тип sname - number, то sname 
   рассматривается как список номеров элементов массива dname, которым нужно 
   присвоить значения true. Остальным элементам массива dname в этом случае 
   присваивается значение false. Если же наоборот sname имеет тип bitset, а 
   dname имеет тип number, то в dname строится список номеров элементов 
   sname, имеющих значение true.

      Условия отбора элементов при выполнении операции "index" также 
   зависят типа элементов массива sname. Если массив sname имеет тип bitset, то 
   в массив dname помещаются номера элементов массива sname, имеющих 
   значения true. Если массив sname имеет тип number то в массив dname 
   помещаются номера элементов массива sname, имеющих значения неравные 
   нулю. В случае если массив sname имеет любой другой тип, то в массив dname 
   помещаются номера элементов массива sname, имеющих значения неравные null.


    5.12.9. Операции над двумя массивами данных, результатом которых 
   является массив 

   int op2_data_array( String dname, String op, String sname1, String sname2 )

   где dname - имя результирующего массива данных,

       op - операция:

        "+"       - поэлементная сумма элементов массивов данных в 
                    рабочем интервале,
        "-"       - поэлементная разность элементов массивов данных в 
                    рабочем интервале (тип элементов массивов должен 
                    быть number),
        "*"       - поэлементное произведение элементов массивов данных 
                    в рабочем интервале (тип элементов массивов должен 
                    быть number),
        "/"       - поэлементное частное элементов массивов данных в 
                    рабочем интервале (тип элементов массивов должен 
                    быть number),
        "|"       - поэлементное логическое сложение элементов массивов 
                    данных (тип элементов массивов должен быть bitset),
        "&"       - поэлементное логическое умножение элементов массивов 
                    данных (тип элементов массивов должен быть bitset),
        "^"       - поэлементное исключающее ИЛИ элементов массивов 
                    данных (тип элементов массивов должен быть bitset),
        "sassign" - присваивание значений элементов массива sname1 элементам 
                    массива dname в соответствии со списком номеров элементов, 
                    заданным в массиве sname2 (dname[i] = sname1[sname2[i]]),
        "dassign" - присваивание значений элементов массива sname1 элементам 
                    массива dname в соответствии со списком номеров элементов, 
                    заданным в массиве sname2 (dname[sname2[i]] = sname1[i]),
        "bassign" - присваивание значений элементов массива sname1 элементам 
                    массива dname в соответствии со списком номеров элементов, 
                    заданным в массиве sname2 (dname[sname2[i]] = sname1[sname2[i]]),
        "concat"  - добавление к элементам массива sname1 строки, заданной в 
                    параметре sname2 (dname[i]] = sname1[i]+ sname2),
        "rconcat" - добавление к строке, заданной в параметре sname2, элементов 
                    массива sname1 (dname[i]] = sname2 + sname1[i]),

       sname1 - имя первого исходного массива данных,

       sname2 - имя второго исходного массива данных или строка при 
                выполнении операций "concat" и "rconcat".

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

   Тип результата	Тип первого операнда   Тип второго операнда
       number             number                  number
       string             string                  number
       string             string                  string
       prompt             string                  number
       prompt             string                  string
        text              string                  number
        text              string                  string

   Метод возвращает количество обработанных элементов или -1, если массивы 
   данных не определены.


    5.12.10. Присваивание массивов данных 

   int assign_data_array( String dname, int dstart, String sname, int sstart, 
   int num )

   где dname  - имя результирующего массива данных,

       dstart - номер начального элемента результирующего массива

       sname  - имя исходного массива данных,

       sstart - номер начального элемента исходного массива,

       num    - количество пересылаемых элементов.

   Типы исходного и результирующего массивов должны совпадать. Метод 
   возвращает количество присвоенных элементов или -1, если массивы данных не 
   определены.


    5.12.11. Присваивание массивов данных с использованием шкалы 
   диапазонов 

   int assign_data_array_by_scale( String dname, String sname, String adata, String scale )

   где dname - имя результирующего массива данных произвольного 
               типа,
       sname - имя исходного массива данных, значения элементов 
               которого рассылаются в элементы результирующего массива,
       adata - имя массива данных типа number, на основании анализа 
               элементов которого осуществляется выбор соответствующего 
               элемента результирующего массива для рассылки (длина массива 
               adata должна совпадать с длиной массива dname),
       scale - имя массива данных типа number, содержащего границы 
               диапазонов значений для элементов массива adata (длина массива 
               scale должна быть на единицу меньше длины массива sname).

   Метод возвращает количество присвоенных элементов или -1, если 
   массивы данных не определены. Рассылка значений элементов массива sname в 
   элементы массива dname осуществляется следующим образом. Все множество 
   значений x, которые могут принимать элементы массива adata разбивается на 
   n+1 интервалов, где n - это размерность массива scale следующим образом:

          x < scale[0]; scale[0] <= x < scale[1]; … scale[n] <= x

   Если величина i-го элемента массива adata попадает в j-й интервал, то i-му 
   элементу массива dname присваивается значение j-го элемента массива sname.


    5.12.12. Выборка массива данных  из соответствующих элементов 
   группы массивов 

   int get_data_array_row( String dname, String gname, int enum )

   где dname - имя результирующего массива данных,

       gname - имя группы массивов данных

       enum  - номер элемента, из которого осуществляется выборка

   Метод возвращает количество присвоенных элементов или -1, если массив или 
   группа данных не определены. Выборка осуществляется только из тех массивов 
   группы, тип которых совпадает с типом результирующего массива.


    5.13. Работа с таблицами поименованных объектов 


    5.13.1. Создание таблицы поименованных объектов 

   void add_data_htable( String name, String values )

   где name   - имя таблицы поименованных объектов,

       values - описание элементов таблицы поименованных объектов

             (<имя1>=<значение1> … <имяN>=<значениеN>).

   Метод создает таблицу поименованных объектов и инициализирует ее 
   поименованными строками.


    5.13.2. Удаление таблицы поименованных объектов 

   void del_data_htable( String name )

   где name - имя таблицы поименованных объектов.

   Метод удаляет заданную таблицу поименованных объектов.


    5.13.3. Изменение значения элементов таблицы поименованных объектов 

   int set_data_htable_value( String name, String values )

   где name   - имя таблицы поименованных объектов,

       values - описание элементов таблицы поименованных объектов

             (<имя1>=<значение1> … <имяN>=<значениеN>).

   Метод возвращает 0, если таблица существует, и -1, если отсутствует. Метод 
   дополняет таблицу поименованными строками или изменяет значения уже 
   существующих элементов.


    5.13.4. Изменение значения элемента таблицы значением, 
   не являющимся строкой 

   int set_data_htable_obj( String name, String item_id, Object obj )

   где name    - имя таблицы поименованных объектов,

       item_id - имя элемента таблицы.

       obj     - произвольный объект - новое значение элемента item_id.

   Метод возвращает 0, если таблица существует, и -1, если отсутствует.


    5.13.5. Создание таблицы поименованных объектов 

   String get_data_htable_string( String name, String item_id )

   где name    - имя таблицы поименованных объектов,

       item_id - имя элемента таблицы.

   Метод возвращает значение найденного элемента или null, если отсутствует 
   таблица или элемент с соответствующим идентификатором.


    5.13.6. Получение значения элемента таблицы, не являющегося строкой 

   Object get_data_htable_string( String name, String item_id )

   где name    - имя таблицы поименованных объектов,

       item_id - имя элемента таблицы.
	   
   Метод возвращает значение найденного элемента или null, если отсутствует 
   таблица или элемент с соответствующим идентификатором.


    5.13.7. Удаление элемента из таблицы 

   Object remove_data_htable_obj ( String name, String item_id )

   где name    - имя таблицы поименованных объектов,

       item_id - имя элемента таблицы.

   Метод возвращает значение удаленного элемента или null, если отсутствует 
   таблица или элемент с соответствующим идентификатором.


    5.13.8. Получение информации о составе таблицы 

   int get_htable_elements( String name )

   где name - имя таблицы поименованных объектов.

   Метод создает список всех имен элементов таблицы и возвращает их 
   количество. Для доступа к элементам списка используется метод 
   get_element_name (см. п. 5.7.7.).


 6. Примеры и рекомендации по использованию апплета 


    6.1. Пример статического задания изображения 

   Ниже приведен код HTML страницы позволяющей получить на экране 
   следующее изображение:

   

   Описание изображения задается непосредственно в параметрах апплета.

   <html>
   <head>
   <title>Пример статического задания параметров апплета multy_view</title>
   </head>
   <body>
   <applet 
      code= multy_view.class   name= MultyView
      width=250  height=250  archive=multy_view.zip mayscript>
      <param name=layers_all value="example">
      <param name=layers_draw value="#example" >
   <param name=example value="draw_layer=0x01D01
                           border_width_layer=2 
                           border_color_layer=#FF0099 
                           fill_color_layer=#CCCCFF
                           text_color_layer=#0
                           xstroke=5,1,2,3,0,0  
                           ystroke=5,1,2,3,0,0">
       <param name=bgcolor value=#F0F0F0>
       <param name=example_object_0 
          value="rect 15 15 80 100  color=#009999 ystroke=6,2,5,2,0,0"> 
       <param name=example_object_1 
          value="line 60 80 20 160 80 140 30 240  color=#FF66CC" >
       <param name=example_object_2 
          value="poly 120 70 160 5 240 70 115 30 245 30 120 70 color=#336699"> 
       <param name=example_object_3 
          value="image  Image/Bbear.gif 0x00 150 70 width=60 height=80             
                 image_size=60,80 color=#FF9999"> 
      <param name=example_object_4 
          value="text 0x45 160 160  font=*:14,3 value='Текстовая строка' 
                 color=#990099">
       <param name=example_object_5 
          value="arc 0x11 185 190 100 100 -90 90  color=#009900"> 
       <param name=example_object_6 
          value="arc 0x11 100 220 100 40 0 360 
                 color=#6600CC  xstroke=0,0,0,0,0,0 ystroke=6,2,10,5,0,0">  
   </applet>
   </body>
   </html>


    6.2. Пример динамического изменения изображения 

   Ниже приведен код HTML страницы позволяющей получить на экране это же 
   изображение. В данном примере изображение задается динамически из 
   программы на языке JavaScript после завершения загрузки страницы. 

   <html>
   <head>
   <title>Пример динамического задания параметров апплета multy_view</title>
   <script>
   </script>
   function PreparePicture()
   {
      var MV = document.applets.MultyView ; 
      if( MV == null ) return;
      MV.open_change_mode(0);
      MV.add_layer( "example", 
   "draw_layer=0x01D01 border_width_layer=2 border_color_layer=#FF0099"+
   "fill_color_layer=#CCCCFF  text_color_layer=#0  xstroke=5,1,2,3,0,0"+
   "ystroke=5,1,2,3,0,0" );
      MV.set_layer_element_num( 0, "object", 
   "rect 15 15 80 100  color=#009999 ystroke=6,2,5,2,0,0" );
      MV.set_layer_element_num( 1, "object", 
   "line 60 80 20 160 80 140 30 240  color=#FF66CC " );
      MV.set_layer_element_num( 2, "object", 
   "poly 120 70 160 5 240 70 115 30 245 30 120 70 color=#336699" );
      MV.set_layer_element_num( 3, "object", 
   "image  Image/Bbear.gif 0x00 150 70 width=60 height=80 image_size=60,80" + 
   "color=#FF9999" );
      MV.set_layer_element_num( 4, "object", 
   "text 0x45 160 160  font=*:14,3 value='Текстовая строка' color=#990099" );
      MV.set_layer_element_num( 5, "object", 
      "arc 0x11 185 190 100 100 -90 90  color=#009900" );
      MV.set_layer_element_num( 6, "object", 
      "arc 0x11 100 220 100 40 0 360 color=#6600CC  xstroke=0,0,0,0,0,0" + 
   "ystroke=6,2,10,5,0,0" );
      MV.set_layers_draw( "#example" );
      MV.close_change_mode( 5 );
   }
   </head>
   <body onLoad="PreparePicture();">
   <applet 
      code= multy_view.class   name= MultyView
      width=250  height=250  archive=multy_view.zip mayscript>
         <param name=bgcolor value=#F0F0F0>
   </applet>
   </body>
   </html>


    6.3. Особенности написания JavaScript программ взаимодействия с 
   апплетом 

         Главная сложность написания JavaScript программ, осуществляющих 
   динамическую генерацию изображений и обеспечивающих реакции на действия 
   пользователя (нажатие кнопок "мыши", клавиш на клавиатуре и попадание 
   курсором в "активные" зоны изображения), состоит в синхронизации 
   JavaScript-программ с работой апплета. Явные средства синхронизации 
   практически отсутствуют. Так анализ перечисленных выше действий 
   пользователя осуществляет сам апплет, однако апплет не может активизировать 
   JavaScript-программы по собственной инициативе. Поэтому при написании 
   JavaScript-программ необходимо использовать ряд перечисленных ниже 
   правил и приемов.
   1. Вызов методов апплета возможен только после полного завершения его 
      инициализации. Момент готовности апплета можно определить по 
      наступлению события OnLoad, собственную реакцию на которое можно 
      разместить в теге <body>. Однако нужно иметь в виду, что на страничке с 
      апплетом не следует использовать HTML-слои, так как при их 
      использовании событие OnLoad может наступить до завершения 
      инициализации апплета.
   2. Для написания интерактивных JavaScript-программ, реагирующих на 
      события, наступление которых определяется апплетом, необходимо 
      организовывать JavaScript-потоки, ведущие регулярный опрос состояния 
      апплета и осуществляющие нужные JavaScript -реакции на эти события.
   3. Для написания JavaScript-потоков удобно использовать оператор языка 
      JavaScript setTimeout. Ниже приведен фрагмент HTML-документа, в 
      котором используется поток обслуживающий апплет с именем MultiView.
   <htm>
   <head>
   …
   <script>

   function start()
   {
      run();
   }
   function run()
   {
      if( document.applets.MultiView.get_selected_in_layer( "layer0", 0 ) >= 0 )
      { // реакция на попадание курсора а "активную" зону слоя "layer0"
      …
      }
   // очередной запуск цикла опроса состояния апплета через 200 миллисекунд
      setTimeout( "run()", 200 );
   }
   </script>
   …
   </head>
   <body … OnLoad="start();" … >
   …
   <applet name= MultiView mayscript … >
   …
   </applet>
   …
   </body>
   </html>


    Литература 

   1. Джейсон Мейджер. JavaScript: основы программирования: Пер. с англ. - К.:
   Издательская группа BHV, 1997. - 512 с.
   2. М.Браун, Д.Ханикат. HTML 3.2 в подлиннике: пер. с англ. - СПб.: BHV - 
   Санкт-Петербург, 1998. - 1040с.
   3. Джамса К. Библиотека программиста JAVA / Пер. с англ. - Мн.: ООО 
   "Попури", 1996. - 640 с.