<?xml version='1.0' encoding='utf-8'?>
<netcatml>
  <widgetclasses>
    <widgetclass>
      <ID>68</ID>
      <Name>Яндекс: Карты. Кластеры</Name>
      <Keyword>ya-map_hc_clusters</Keyword>
      <Description><![CDATA[]]></Description>
      <Category>!hc</Category>
      <InDevelop>0</InDevelop>
      <Template><![CDATA[<script src="//api-maps.yandex.ru/2.0/?coordorder=longlat&load=package.standard,package.clusters&lang=ru-RU" type="text/javascript"></script>
    <style>
        #map {
            width: 400px;
            height: 300px;
        }
    </style>

<script type="text/javascript">
ymaps.ready(init);
        
function init() {
    var center = [<?= $f_map_center_x; ?>, <?= $f_map_center_y; ?>],
        myMap = new ymaps.Map('<?= $f_container_id; ?>', {
            center: center,
            zoom: <?= $f_map_zoom; ?>,
            behaviors: ['default', 'scrollZoom']
        }),
        
        // Создадим макет правой части балуна кластера.
        MainContentLayout = ymaps.templateLayoutFactory.createClass('', {
            build: function () {
                // Сначала вызываем метод build родительского класса.
                MainContentLayout.superclass.build.call(this);
                // Нужно отслеживать, какой из пунктов левого меню выбран,
                // чтобы обновлять содержимое правой части.
                this.stateListener = this.getData().state.events.group()
                    .add('change', this.onStateChange, this);
                // Запоминаем текущий активный объект.
                this.activeObject = this.getData().state.get('activeObject');
                this.applyContent();
            },
            
            clear: function () {
                if (this.activeObjectLayout) {
                    this.activeObjectLayout.setParentElement(null);
                    this.activeObjectLayout = null;
                }
                // Снимаем слушателей изменения полей.
                this.stateListener.removeAll();
                // А затем вызываем метод clear родительского класса.
                MainContentLayout.superclass.clear.call(this);
            },
            
            onStateChange: function () {
                // При изменении одного из полей состояния
                // проверяем, не сменился ли активный объект.
                var newActiveObject = this.getData().state.get('activeObject');
                if (newActiveObject != this.activeObject) {
                    // Если объект изменился, нужно обновить
                    // содержимое правой части.
                    this.activeObject = newActiveObject;
                    this.applyContent();
                }
            },
            
            applyContent: function () {
                if (this.activeObjectLayout) {
                    this.activeObjectLayout.setParentElement(null);
                }
                // Чтобы было удобнее формировать текстовый шаблон,
                // создадим внутренний макет, в который будем передавать
                // модифицированный dataSet.
                
                this.activeObjectLayout = new MainContentSubLayout({
                        // Поскольку внутренний макет будет отображать
                        // информацию какого-то геообъекта,
                        // будем передавать во входном хэше данные и опции
                        // текущего активного геообъекта.
                        options: this.options,
                        properties: this.activeObject.properties
                    });
                
                // Прикрепляем внутренний макет к внешнему.
                this.activeObjectLayout.setParentElement(this.getParentElement());
            }
        }),
        
        // Внутрений подмакет правой части балуна кластера.
        MainContentSubLayout = ymaps.templateLayoutFactory.createClass(
            // Мы можем использовать поля properties геообъекта,
            // так как будем передавать properties в конструктор макета.
            '<div width="100">' +
                '$[properties.balloonContentHeader]<br>' +
                '$[properties.balloonContentBody]' +
            '</div>'
        ),
        
        // Создадим макет для элемента списка в левой части балуна.
        ItemLayout = ymaps.templateLayoutFactory.createClass(
            '<div class="cluster-balloon-item" [if data.isSelected]style="font-weight: bold;"[endif]>$[properties.name]</div>'
        ),
        
        // Создадим кластеризатор и выставим ему созданные макеты
        // через опции.
        clusterer = new ymaps.Clusterer({
            // Поскольку опции задаются для кластеров, а не для всего
            // кластеризатора, им нужно приписать префикс 'cluster'.
            clusterDisableClickZoom: true,
    
            // Если нужно задать опции для балуна кластера, то к названию
            // опции приписываются сразу 2 префикса - 'cluster' и 'balloon'.
            clusterBalloonMainContentLayout: MainContentLayout,
            clusterBalloonSidebarItemLayout: ItemLayout,
            // Настроим ширину левой части балуна кластера
            clusterBalloonSidebarWidth: 150, clusterBalloonHeight: 150,
            // и ширину балуна целиком.
            clusterBalloonWidth: 450
        }),
        geoObjects = [];
    
        <? if ($f_use_zoom_control || $f_use_map_tools || $f_use_type_selector) { ?>
        myMap.controls<?= $f_use_zoom_control  ? '.add("zoomControl")' : ''; ?>
                    <?= $f_use_map_tools     ? '.add("mapTools")'    : ''; ?>
                    <?= $f_use_type_selector ? '.add(new ymaps.control.TypeSelector(["yandex#map", "yandex#satellite", "yandex#hybrid", "yandex#publicMap"]))' : ''; ?>;
        <? } ?>
    
    <? foreach($coor as $i => $c){ ?>
        var coordinates = [<?=$c[coor_x]?>, <?=$c[coor_y]?>];
        geoObjects[<?=$i?>] = new ymaps.Placemark(coordinates, {
            name: '<?=($c[name] ? $c[name] : ''))?>',
            clusterCaption: '<?=($c[caption] ? $c[street] : '')?>',
            balloonContentBody: '<div class="baloon_map"><?= ($c[img] ? '<div class="unit"><img src="'.nc_file_path($classID, $c[Message_ID], 'img').'" alt="" /></div>' : '') . '<div><div><b><a href="'.nc_message_link($c[Message_ID],$classID).'">' . ($c[name] ? $c[name] : '') .'</a></b></div>' ?>',
            balloonContentHeader: '',
            balloonContentFooter: ''
        });
    <?}?>
    
    // Добавим полученные геообъекты в кластеризатор.
    clusterer.add(geoObjects);
    // А сам кластеризатор добавим на карту.
    myMap.geoObjects.add(clusterer);
}
</script>
<div id="<?= $f_container_id; ?>" style="width: <?= $f_container_width; ?>; height: <?= $f_container_height; ?>;"></div>]]></Template>
      <Settings><![CDATA[<?php
global $cc;
global $classID;
$f_container_id = $f_container_id ? $f_container_id : "ymaps-map-id_" . substr($nc_core->get_settings('SecretKey'), 4, 6);
$f_container_width = ($f_container_width ? $f_container_width : '450px');
$f_container_height = ($f_container_height ? $f_container_height : '350px');
$f_map_zoom = +($f_map_zoom ? $f_map_zoom : 14);

$coor = $nc_core->db->get_results("SELECT coor_x, coor_y, name, caption, Message_ID FROM `Message$classID` Where Sub_Class_ID = $cc", ARRAY_A );

?>]]></Settings>
      <AddForm><![CDATA[]]></AddForm>
      <EditForm><![CDATA[]]></EditForm>
      <WidgetDisallow>0</WidgetDisallow>
      <Update>1</Update>
    </widgetclass>
  </widgetclasses>
  <fields>
    <field type_of_data_id='1'>
      <Field_Name>container_width</Field_Name>
      <Description><![CDATA[Ширина контейнера]]></Description>
      <Format></Format>
      <NotNull>0</NotNull>
      <Priority>2</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='1'>
      <Field_Name>container_id</Field_Name>
      <Description><![CDATA[ID контейнера div с картой]]></Description>
      <Format></Format>
      <NotNull>0</NotNull>
      <Priority>1</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='1'>
      <Field_Name>container_height</Field_Name>
      <Description><![CDATA[Высота контейнера]]></Description>
      <Format></Format>
      <NotNull>0</NotNull>
      <Priority>3</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='1'>
      <Field_Name>map_center_x</Field_Name>
      <Description><![CDATA[Х координата центра карты]]></Description>
      <Format></Format>
      <NotNull>1</NotNull>
      <Priority>4</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='1'>
      <Field_Name>map_center_y</Field_Name>
      <Description><![CDATA[У координата центра карты]]></Description>
      <Format></Format>
      <NotNull>1</NotNull>
      <Priority>5</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='2'>
      <Field_Name>map_zoom</Field_Name>
      <Description><![CDATA[Масштаб карты]]></Description>
      <Format></Format>
      <NotNull>1</NotNull>
      <Priority>6</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='5'>
      <Field_Name>use_zoom_control</Field_Name>
      <Description><![CDATA[Масштабирование]]></Description>
      <Format></Format>
      <NotNull>0</NotNull>
      <Priority>7</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='5'>
      <Field_Name>use_map_tools</Field_Name>
      <Description><![CDATA[Инструменты]]></Description>
      <Format></Format>
      <NotNull>0</NotNull>
      <Priority>8</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='5'>
      <Field_Name>use_type_selector</Field_Name>
      <Description><![CDATA[Режим карты]]></Description>
      <Format></Format>
      <NotNull>0</NotNull>
      <Priority>9</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='1'>
      <Field_Name>mark_x</Field_Name>
      <Description><![CDATA[Х координата метки]]></Description>
      <Format></Format>
      <NotNull>0</NotNull>
      <Priority>10</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='1'>
      <Field_Name>mark_y</Field_Name>
      <Description><![CDATA[Y координата метки]]></Description>
      <Format></Format>
      <NotNull>0</NotNull>
      <Priority>11</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='1'>
      <Field_Name>icon_content</Field_Name>
      <Description><![CDATA[Контент метки]]></Description>
      <Format></Format>
      <NotNull>0</NotNull>
      <Priority>12</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='1'>
      <Field_Name>balloon_content_header</Field_Name>
      <Description><![CDATA[Заголовок балуна]]></Description>
      <Format></Format>
      <NotNull>0</NotNull>
      <Priority>13</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='3'>
      <Field_Name>balloon_content_body</Field_Name>
      <Description><![CDATA[Контент балуна]]></Description>
      <Format>5:60;html:1;br:2;fck:2;bbcode:0;usereditor:0;</Format>
      <NotNull>0</NotNull>
      <Priority>14</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='3'>
      <Field_Name>balloon_content_footer</Field_Name>
      <Description><![CDATA[Контент балуна в подвале]]></Description>
      <Format>5:60;html:1;br:2;fck:2;bbcode:0;usereditor:0;</Format>
      <NotNull>0</NotNull>
      <Priority>15</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='1'>
      <Field_Name>hint_content</Field_Name>
      <Description><![CDATA[Текст подсказки]]></Description>
      <Format></Format>
      <NotNull>0</NotNull>
      <Priority>16</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
    <field type_of_data_id='1'>
      <Field_Name>preset</Field_Name>
      <Description><![CDATA[Стиль метки]]></Description>
      <Format></Format>
      <NotNull>0</NotNull>
      <Priority>17</Priority>
      <DoSearch>0</DoSearch>
      <DefaultState></DefaultState>
      <Inheritance>0</Inheritance>
      <TypeOfEdit_ID>1</TypeOfEdit_ID>
    </field>
  </fields>
  <tar_data>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
  </tar_data>
</netcatml>
