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 = '

По категории товара

'; 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 = ' '; 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] можно переопределить на странице для выполнения дополнительных действий по инициализации приложения } }