jQuery.noConflict();
var $j = jQuery;
//[k] карта, не внесено в объект управления потому как связанные классы хотят объект именно с таким именем
var map;
//[k] массив параметров страницы - для инициализации модификаторов начального состояния - например для печати
var hash = window.location.href;
var param = {};
if (hash.indexOf("#") != -1)
{
hash = hash.split('#'); hash= hash[1];
if (hash.indexOf("&"))
{
hash = hash.split('&');
for (i = 0; i < hash.length;i++)
{
var h = hash[i].split('=');
param[h[0]]= h[1];
}
}
}
else param = {"empty":true};
// объект управления картой
var m = {
markers:{small:[],big:[]},//[k] набор маркеров этажа
floor:{},//[k] текущий слой этажа
floorOverlay:'',//[k] текущий объект слоя этажа
lessee:{},//[k] текущий выбранный арендатор
start: new GLatLng(0, 0),//[k] начальная точка карты
minZoom: 2,//[k] максимальное отдаление карты
zoomLevels: 5,//[k] количество уровней зума
control : {},//[k] инициализация состояния легенды
swState : 'open',
info : {},
specoffericon : '/media/system/maps/markers/percent.png', //[k] иконка для спецпредложения
specnewsicon : '/media/system/maps/markers/box.png', //[k] иконка для новости
init : function ()//[k] инициализация
{
if (GBrowserIsCompatible())
{
map = new GMap2(document.getElementById("map_canvas")); //[k] создаем карту
var mapType = new GActisMapType(map, "/media/system/maps", "jpg", m.zoomLevels); //[k] кастомная карта на основе кастомного типа
map.setCenter(m.start, m.minZoom, mapType); //[k] установим
if (!param.simple) //[k] если режим печати - убираем лишнее с карты
{
m.control = new ActisLargeMapControl(); //[k] добавим красивый кастомный контрол зума с учетом отступа для контрола легенды
map.addControl(m.control, new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10,25)));
m.fillLegend(); //[k] наполним легенду
m.renderFloorsControl(conf.initfloor); //[k] инициализируем контрол этажей
}
else
{
m.swLegend();
}
map.enableScrollWheelZoom(); //[k] разрешим зумить колесом мыши
map.enableContinuousZoom(); //[k] разрешить непрерывный зум
m.manager = new MarkerManager(map); //[k] создаем менеджер меток арендаторов - для правильного показа при разных зумах
m.renderFloor(conf.initfloor); //[k] инициализируем установленный по умолчанию этаж
m.info = map.getInfoWindow(); //[k] получим инфоокно для использования
m.controlPrint(); //[k] инициализация печати
m.additionalInit(); //[k] дополнительная инициализация приложения - например для отдельного магазина
}
},
controlPrint: function(vis,id) //[k] метод управляет видимостью контрола печати и формирует ссылку для запуска печати в зависимости от выбранного магазина
{
if (vis) $j("#print_map").show(); else $j("#print_map").hide();
if (id) $j("#print_map").attr('href','print.wbp?id='+id);
},
swLegend : function() //[k] контрол легенды карты
{
if (m.swState == 'open')
{
//map.removeControl(m.control);
$j('#map_canvas').width(940);
map.checkResize();
map.setCenter(m.start);
$j('#legend').animate({left:-480},'normal');
$j('#l_switcher').animate({left:10},'normal');
document.getElementById('l_switch').innerHTML ='» Свернуть карту';
m.swState = 'close';
}
else
{
//map.removeControl(m.control);
$j('#legend').animate({left:0},'normal');
$j('#l_switcher').animate({left:480},'normal');
document.getElementById('l_switch').innerHTML ='« Развернуть карту';
$j('#map_canvas').width(470);
map.checkResize();
map.setCenter(m.start);
m.swState = 'open';
}
},
fillLegend : function() //[k] метод выполняет заполнение легенды категориями
{
var t = '
По категории товара
';
var half = Math.round(conf.cats.length / 2);
for (var i=0; i < conf.cats.length; i++)
{
t += '
'+conf.cats[i].name+'';
if ((i + 1) == half) t+='
';
}
t+='
';
t+='';
t+='По алфавиту
';
t+='';
for (var i = 0; i < conf.alfa.dig.length; i++)
{
if (conf.alfa.dig[i].offers.length > 0)
{
t += '
'+conf.alfa.dig[i].s+'';
}
}
t+='
';
t+='';
for (var i = 0; i < conf.alfa.ru.length; i++)
{
if (conf.alfa.ru[i].offers.length > 0)
{
t += '
'+conf.alfa.ru[i].s+'';
}
}
t+='
';
t+='';
for (var i = 0; i < conf.alfa.en.length; i++)
{
if (conf.alfa.en[i].offers.length > 0)
{
t += '
'+conf.alfa.en[i].s+'';
}
}
t+='
';
$j('#legend').html(t);
},
addOverlay : function(url) //[k] функция создает слой перекрытия, вписывая его в карту
{
m.setStart(); //[k] возвращаем карту в исходное
m.removeOverlay(); //[k] удаляем предыдущий слой
m.clearMarkers(); //[k] удаляем маркеры, если есть
var pos = new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)); // добавляем новый слой перекрытия
m.floorOverlay = new GGroundOverlay(url, pos);
map.addOverlay(m.floorOverlay);
},
removeOverlay : function () //[k] удаляет слой этажа с карты
{
if (m.floorOverlay != '') map.removeOverlay(m.floorOverlay);
},
setStart : function () //[k] метод устанавливает карту в ноль и зум до разрешенного минимума
{
map.setCenter(m.start);
map.setZoom (m.minZoom);
},
renderFloorsControl : function(id) //[k] метод формирует контрол этажей
{
var target = '';
for (var i=0; i'+conf.floor[i].name+'':''+conf.floor[i].name+'';
}
document.getElementById('floors_container').innerHTML = target;
},
renderFloor : function(id) //[k] рендер этажа
{
for (var i=0; i < conf.floor.length; i ++)
if (conf.floor[i].num == id) m.floor = conf.floor[i];
m.addOverlay(m.floor.url);
m.renderFloorsControl(id);
for (var i = 0; i < m.floor.offers.length; i++)
{
var curl = m.getNodeL(m.floor.offers[i]) ;
var MIcon = new GIcon();
MIcon.iconSize = new GSize(curl.iconw, curl.iconh);
MIcon.iconAnchor = new GPoint(curl.iconw/2, curl.iconh);
MIcon.infoWindowAnchor = new GPoint(curl.iconw/2, curl.iconh/2);
MIcon.image = curl.icon;
m.markers.small[curl.id]=new GMarker(new GLatLng(curl.x,curl.y), {title: curl.text, icon:MIcon});
m.markers.small[curl.id].id = curl.id;
GEvent.addListener(m.markers.small[curl.id], "click", function()
{
var html = m.renderInfo(m.getNodeL(this.id));
m.controlPrint(true,this.id);
this.openInfoWindowHtml(html);
});
m.manager.addMarker(m.markers.small[curl.id],m.minZoom,m.zoomLevels);
if (curl.iconz != '')
{
var MIcon = new GIcon();
MIcon.iconSize = new GSize(curl.iconzw, curl.iconzh);
MIcon.iconAnchor = new GPoint(curl.iconzw/2, curl.iconzh);
MIcon.infoWindowAnchor = new GPoint(curl.iconzw/2, curl.iconzh/2);
MIcon.image = curl.iconz;
m.markers.big[curl.id]=new GMarker(new GLatLng(curl.x,curl.y), {title: curl.text, icon:MIcon});
m.markers.big[curl.id].id = curl.id;
GEvent.addListener(m.markers.big[curl.id], "click", function()
{
var html = m.renderInfo(m.getNodeL(this.id));
m.controlPrint(true,this.id);
this.openInfoWindowHtml(html);
});
m.manager.addMarker(m.markers.big[curl.id],1,m.minZoom-1);
}
}
},
renderInfo : function (node) //[k] метод генерирует html для информационного окна
{
var onecat = m.getNode(node.onecat,conf.cats);
var lpath = (node.type == 'shop') ? conf.path+'/shops/lessee/'+onecat.url+node.url : conf.path+'food/'+node.url;
var mapimg = (node.mapimg != '')? '':'';
var spec = (node.specname != '')? '
'+node.specname+'
':'';
var news = (node.specnew != '')? '
'+node.specnew+'
':'';
return ''+
mapimg+'
'+node.text+'
'+
'

'+onecat.name+'
'+
node.info+'
'+spec+news+'
'+'
';
},
clearMarkers : function(id) //[k] метод удаляет маркеры, если есть
{
m.manager.clearMarkers();
m.markers.small = [];
m.markers.big = [];
},
panTo : function(id) //[k] метод позиционирует запрошенного арендатора по центру карты по запросу и открывает для него информационное окно
{
$j('#fdiv').css("visibility","hidden");
var les = m.getNodeL(id);
if (m.floor.num != les.floor) m.renderFloor(les.floor);
map.setCenter(new GLatLng(les.x,les.y));
GEvent.trigger(m.markers.small[id],'click');
},
showFlyTable: function(id) //[k] метод формирует всплывающее окошко для категории
{
var flyDiv = $('fdiv');
var flyContent = $('fcontent');
var cat = m.getNode(id,conf.cats);
var divContent = '| '+
cat.name+
' | |  |
| ';
var less = cat.offers.length;
less = Math.ceil(less / 2);
var j = 0;
for (var i= 0 ; i< cat.offers.length;i++)
{
var curl = m.getNodeL(cat.offers[i]);
divContent += m.renderItem(curl);
j++;
if (j == less)
{
divContent += ' | ';
}
}
divContent += ' |
';
flyContent.innerHTML = divContent;
var flyParent = $(id);
var x = 0;
var y = 0;
while (flyParent.offsetParent)
{
x += flyParent.offsetLeft;
y += flyParent.offsetTop;
flyParent = flyParent.offsetParent;
}
flyDiv.style.left = x - 15;
flyDiv.style.top = y - 25;
flyDiv.style.visibility = 'visible';
return;
},
showFlyTableA: function(id,a) //[k] метод формирует всплывающее окошко для сортировки по алфавиту
{
var flyDiv = $('fdiv');
var flyContent = $('fcontent');
var node;
var cat = m.getNode(id,conf.alfa[a]);
var divContent = '| '+
cat.s+
' | |  |
| ';
var less = cat.offers.length;
less = Math.ceil(less / 2);
var j = 0;
for (var i= 0 ; i< cat.offers.length;i++)
{
les = m.getNodeL(cat.offers[i]);
divContent += m.renderItem(les);
j++;
if (j == less)
{
divContent += ' | ';
}
}
divContent += ' |
';
flyContent.innerHTML = divContent;
var flyParent = $(id);
var x = 0;
var y = 0;
while (flyParent.offsetParent)
{
x += flyParent.offsetLeft;
y += flyParent.offsetTop;
flyParent = flyParent.offsetParent;
}
flyDiv.style.left = x - 15;
flyDiv.style.top = y - 25;
flyDiv.style.visibility = 'visible';
return;
},
//[k] метод рендерит ссылку для отображения во всплывающем окне при клике на категории или букве
renderItem : function(curl)
{
var onecat = m.getNode(curl.onecat,conf.cats);
var lpath = (curl.type == 'shop') ? conf.path+'/shops/lessee/'+onecat.url+curl.url : conf.path+'food/'+curl.url;
//var divContent = '' + curl.text+ ' ';
return divContent;
},
getNode : function(id,array) //[k] метод возвращает ноду по id или false
{
for (var i = 0; i < array.length; i++)
{
if (array[i].id == id) return array[i];
}
return false;
},
getNodeL : function(id) //[k] метод возвращает ноду арендатора
{
return conf.offers[id];
},
print : function () //[k] метод печатает текущее состояние карты
{
window.open($j('#print_map').attr('href'),'printwindow','left=0,top=0,width=980, scrollbars=1'); return false;
},
additionalInit : function ()
{
//[k] по умолчанию ничего не делает
//[k] можно переопределить на странице для выполнения дополнительных действий по инициализации приложения
}
}