"use strict";
// в задачи этого кода входит преобразование JSON объектов в human-читаемый текст с характеристиками
function MobjInfoParser() {
var _this = this;
// с помощью этого хелпера можно понять, например, что square это "общая площадь" (типа locales/ru.yml)
var _i18n = null;
// todo-clear22:: необходимо сбрасывать это значение после того, как сбросили поиск
// текущий результат поиска - какие полигоны площадей соответствуют поиску и содержат искомые магазины
var _sresults_areas = null;
// используется в _row_area_with_shop() и в _row_area_shop()
// 20170327-hover: был добавлен id='link_shop_{MAP_AREA_ID}', для подсветки полигона, который соответствует магазину при наведении мышкой на ссылку
// 20170327-hover: в тех же целях был добавлен css-класс
// 20170328-view_area: был добавлен id вцелом элементу списка, чтобы можно было скрывать нерелевантные элементы при входе в площадь
var _row_area_shop_pattern = "
{TITLE} ({AREA_TITLE}), {PHONE}";
// используется в _row_area_data()
var _row_area_pattern = "{AREA_TITLE}";
// режимы отображения данных - user mode. Их два: "режим арендатора" и "режим обычного пользователя"
var _umode = 'umode_simple_user'; // umode_arendator, umode_simple_user
//--[ public ]------------------------------------------------------------------------------------------------------
/**
* Лабаем html текст из json-данных полигона Этажа/Здания/Площади.
*
* @param json
*/
this.makeHtmlText = function (json) {
console.log(" Лабаем html текст из json данных полигона.");
var result = "";
//#-> предполагается, что json в поряде и данные целостны (т.е. уровнем выше была проверка json на корректность)
switch (json["class_name"]) {
case "C80MapFloors::Floor":
/* [aa34qq] json:
{
<...свойства картинки этажа, чисто класс C80MapFloors::Floor..>
"areas": [ // полигоны площадей этой картинки этажа
{ "id": 5,
<...C80MapFloors::Floor..>
"data": { // данные привязанной к плоигону Площади
"id": 9,
"title": "Дом-1",
"square": null,
"desc": "",
"price_string": null,
"communications": null,
"is_free": false,
"shop": { // данные Магазина, который занимает эту Площадь
"id": 130,
"title": "ИП Кибардин",
"desc": "",
"tel": "(910) 514 08 68",
"site": "",
"url": "/shops/ip-kibardin.html"
}
}
},
],
"data": // данные Этажа, привязанного к картинке этажа
"id": 40,
"ord": 1,
"title": "1 этаж",
"square": 0.0,
"square_free": 0.0,
"areas_count": 2,
"areas_free_count": 2,
"price_string": "от до руб./кв.м",
"floor_height": null,
"communications": ""
}
}*/
/* [aa34qq] или сокращённо
json:
{
"areas": [ // полигоны площадей этой картинки этажа
{ "id": 5,
"data": { // данные привязанной к плоигону Площади
"id": 9,
"title": "Дом-1",
"is_free": false,
"shop": { // данные Магазина, который занимает эту Площадь
"id": 130,
"title": "ИП Кибардин",
}
}
},
],
"data": // данные Этажа, привязанного к картинке этажа
"id": 40,
"title": "1 этаж",
}
}
*/
// при наличии результатов поиска
if (_sresults_areas != null) {
//
// подготовительно: соберём айдишники полигонов площадей в отдельный массив
var arr_map_areas_ids = $.map(json['areas'], function (val, index) {
return val['id'];
});
console.log(' В массиве [' + arr_map_areas_ids.join(', ') +'] ищем элементы: [' + _sresults_areas.join(', ') + '].');
//
/* результат (индексы объектов для отображения из массива json['areas']) соберём в массиве [**] */
var i, len = _sresults_areas.length;
var i_search_index; // индекс айдишника `искомой пользователем полигона площади` в массиве json['areas'] полигонов площадей (просматриваемого этажа)
var isaid; // iterated searched area's id
var arr_search_indexes = []; // [**] - индексы объектов полигонов площадей просматриваемого этажа (для отображения в инфо панели) из массива json['areas']
for (i=0; i В массиве [' + arr_map_areas_ids.join(', ') +'] обнаружен ' + isaid + '.');
// запомним каждый i_search_index (затем я намереваюсь обработать их в отдельном цикле: найти соответствующие данные полигонов площадей (просматриваемого этажа) в массиве json['areas'], и собрать html-сроки для каждого объекта с данными в один список
arr_search_indexes.push(i_search_index);
}
}
//
//
len = arr_search_indexes.length;
// если на этаже есть площади, удовлетворяющие поиску
if (len > 0) {
var i_json_area;
// переберём индексы
for (i=0; i если всё в порядке (есть данные полигона площади по этому индексу) - лабаем из них html-строку
if (i_json_area != undefined) {
result += _this._row_area_with_shop(i_json_area);
}
// иначе - сообщим об ошибке в лог
else {
console.log(' [ERROR] Вроде индекс есть ('+i_search_index+'), а данных по этому адресу не нашлось...');
}
}
}
// если же на этаже нету результатов, удовлетворяющих поиску
else {
// "просто отобразим данные об этаже согласно режиму"
result = _this._makeHtmlText_Umode_Floor(json);
}
//
//
}
// если это не поиск
else {
// "просто отобразим данные об этаже согласно режиму"
result = _this._makeHtmlText_Umode_Floor(json);
}
break;
}
result = "";
return result;
};
/**
* Задаём текущие результаты поиска (вызывается из BuildingInfo).
* @param sresult_areas
*/
this.setSearchResultAreas = function (sresult_areas) {
_sresults_areas = sresult_areas;
};
/** Извне задаём текущий режим просмотра данных.
*
* @param umode
*/
this.setUmode = function (umode) {
_umode = umode;
};
/**
* 20170327-hover: После того, как вставили html текст (собранный методом makeHtmlText), вызывается этот hook.
*
*/
this.afterPastingHtmlText = function () {
$('a.link_shop').hover(_this._row_area_shop_mover, _this._row_area_shop_mout);
};
//--[ private ]-----------------------------------------------------------------------------------------------------
/**
* На основе режима пользователя карты (Арендатор или ОбычныйПокупатель) выдать html-строку с `просто данными` об Этаже.
*
* @param json_floor - данные полигона этажа от C80MapFloors::Floor.my_as_json (пример можно лицезреть в [aa34qq]
* @returns {string} - html-строка, которая завернётся в
* @private
*/
this._makeHtmlText_Umode_Floor = function (json_floor) {
var result = '';
// todo-umode:: внедрить и использовать режим пользователя карты (Арендатор или ОбычныйПокупатель) и соответствующим образом отрисовать `просто данные` об Этаже
if (_umode == 'umode_arendator') {
//
result += _this._row('square', json_floor);
result += _this._row('square_free', json_floor);
//result += _this._row('floor_height', json);
result += _this._row('communications', json_floor);
result += _this._row('areas_count', json_floor);
result += _this._row('areas_free_count', json_floor);
result += _this._row('price_string', json_floor);
//
}
else if (_umode == 'umode_simple_user') {
// отобразим всех арендаторов на этом этаже
var areas = json_floor['areas'];
if (areas != null) {
var len = areas.length;
var i, iar, iard; // i_area, i_area_data
for (i=0; i";
} else {
s = "" + _i18n.t(key) + ": " + "" + json['data'][key] + "" + ""
}
return s;
};
/**
* Соорудить html-строку, описывающую только Площадь (согласно паттерну _row_area_pattern).
* Т.е. даже если есть Магазин, занимающий эту Площадь - он не будет браться в рассчёт.
*
* Нет защиты от ошибок (это значит, что этот метод должен использоваться в if..else конструкции,
* которая проверяет наличие необходимых данных).
*
* @param area_data_json - это узел 'data' объекта, описывающего полигон площади.
* @private
*/
this._row_area_data = function (area_data_json) {
var res = _row_area_pattern;
res = res.split('{HREF}').join('#'); // todo:: какой должен быть href у свободной Площади?
res = res.split('{AREA_TITLE}').join(area_data_json['title']);
return res;
};
/**
* Этот служебный метод является контейнером кода, который желательно использовать только в makeHtmlText.
* Выдать человекочитаемую html-строку ..., которая описывает искомый Магазин.
* Т.к. ВСЕГДА в таком случае ожидается наличие магазина - то в случае ошибки результат будет содержать
* сообщение об ошибке.
*
* @param area_json - данные об полигоне площади, сформированные методом C80MapFloors::Area.my_as_json4
* @returns {string} - Магазин такой-то(площадь такая-то), телефоны
* @private
*
*/
this._row_area_with_shop = function (area_json) {
var res = '[ERROR] Нет данных о магазине в полигоне площади с id='+area_json['id']+'';
if (area_json['data'] != undefined && area_json['data']['shop'] != undefined) {
res = _this._row_area_shop(area_json);
}
return res;
};
/**
* Соорудить строку, описывающую Магазин (согласно паттерну _row_area_shop_pattern).
*
* На вход подаётся json полигона площади.
* Нет защиты от ошибок (это значит, что этот метод должен использоваться в if..else конструкции,
* которая проверяет наличие необходимых данных)..
*
* Метод (контейнер кода) родился из метода _row_area_with_shop, когда начали внедрять режим _umode
* и расширять функционал _makeHtmlText_Umode_Floor.
*
* @param area_json
* @returns {string}
* @private
*/
this._row_area_shop = function (area_json) {
//console.log('<_row_area_shop>');
/*
{ floor_id:6,
id: 550, # айди полигона
coords: Array,
data: {
id: 444, # айди Rent-площади
desc: '...',
is_free: false,
price_string: '',
square: 130,
title: "МЕБ-1"
}
}
*/
var shop = area_json['data']['shop'];
var res = _row_area_shop_pattern;
res = res.split('{TITLE}').join(shop['title']);
res = res.split('{HREF}').join(shop['url']);
res = res.split('{PHONE}').join(shop['tel']);
res = res.split('{AREA_TITLE}').join(area_json['data']['title']);
res = res.split('{MAP_AREA_ID}').join(area_json['id']);
return res;
};
// при наведении мышки на ссылку
// будут подсвечиваться соответствующие полигоны
// при убирании мышки с ссылки - все полигоны не подсвечены
this._row_area_shop_mover = function () {
console.log('<_row_area_shop_mover>');
var map_area_id = $(this).attr('id').split('link_shop_').join('');
// сначала уберём мышку со всех полигонов
$('.polygon_overlay').mouseleave();
// затем "наведём" мышь на соответствующий полигон
$('.polygon_overlay#map_area_id_' + map_area_id).mouseenter();
};
this._row_area_shop_mout = function () {
// уберём мышку со всех полигонов
$('.polygon_overlay').mouseleave();
};
//--[ init ]--------------------------------------------------------------------------------------------------------
var _fInit = function () {
// кастуем locales-помощника
_i18n = new I18n();
};
_fInit();
}