﻿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 ='&raquo; Свернуть карту';
                    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 ='&laquo; Развернуть карту';
                    $j('#map_canvas').width(470);
                    map.checkResize();
                    map.setCenter(m.start);
                    m.swState = 'open';
            }
    },
    fillLegend : function()																		//[k] метод выполняет заполнение легенды категориями
    {
        var t = '<h3 style="margin-bottom:15px;">По категории товара</h3><div class="catLink">';
       	var half = Math.round(conf.cats.length / 2);
       	for (var i=0; i < conf.cats.length; i++)
        {
        	t += '<a href="'+conf.path+'/shops/'+conf.cats[i].url+'" style="background: url('+conf.cats[i].img+') left 3px no-repeat; padding-left:15px;" onClick="m.showFlyTable(\''+conf.cats[i].id+'\'); return false;" id="'+conf.cats[i].id+'">'+conf.cats[i].name+'</a>';
        	if ((i + 1) == half) t+='</div><div class="catLink">';
        }
		t+='</div>';
		t+='<div class="clear"></div>';
		t+='<h3 style="margin:15px 0;">По алфавиту</h3>';

		t+='<div class="catLinkAlpha">';
		for (var i = 0; i < conf.alfa.dig.length; i++)
		{
			if (conf.alfa.dig[i].offers.length > 0)
			{
        		t += '<a onClick="m.showFlyTableA(\''+conf.alfa.dig[i].id+'\',\'dig\'); return false;" id="'+conf.alfa.dig[i].id+'">'+conf.alfa.dig[i].s+'</a>';				
			}
		}
		t+='</div>';
		
		t+='<div class="catLinkAlpha">';
		for (var i = 0; i < conf.alfa.ru.length; i++)
		{
			if (conf.alfa.ru[i].offers.length > 0)
			{
        		t += '<a onClick="m.showFlyTableA(\''+conf.alfa.ru[i].id+'\',\'ru\'); return false;" id="'+conf.alfa.ru[i].id+'">'+conf.alfa.ru[i].s+'</a>';				
			}
		}
		t+='</div>';

		t+='<div class="catLinkAlpha">';
		for (var i = 0; i < conf.alfa.en.length; i++)
		{
			if (conf.alfa.en[i].offers.length > 0)
			{
        		t += '<a onClick="m.showFlyTableA(\''+conf.alfa.en[i].id+'\',\'en\'); return false;" id="'+conf.alfa.en[i].id+'">'+conf.alfa.en[i].s+'</a>';				
			}
		}
		t+='</div>';

       	
       	$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.length; i++)
        {
        	target += (conf.floor[i].num!=id)?'<a onclick="m.renderFloor('+conf.floor[i].num+')">'+conf.floor[i].name+'</a>':'<a id="floorControl'+conf.floor[i].num+'" class="cur_floor">'+conf.floor[i].name+'</a>';
        }
        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 != '')? '<image src="'+node.mapimg+'" style="float:left; margin:0 15px 10px 0;"/>':'';
		var spec = (node.specname != '')? '<div><img src="'+m.specoffericon+'" style="margin-right:5px; position:relative; top:3px;"/>'+node.specname+'</div>':'';
		var news = (node.specnew != '')? '<div><img src="'+m.specnewsicon+'" style="margin-right:5px; position:relative; top:3px;"/>'+node.specnew+'</div>':'';
		return '<div id="mapinfo"><div style="overflow:hidden; zoom:1; padding-bottom:0;">'+
		mapimg+'<div style="font-weight:bold;">'+node.text+'</div>'+
		'<div><img src="'+onecat.img+'" style="margin-right:5px; position:relative; top:1px;"/>'+onecat.name+'</div>'+
		node.info+'</div>'+spec+news+'<div><a href="'+lpath+'">подробнее</a></div>'+'</div>';
    },
    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 = '<table class="fhead"><tr><td class="fcat">'+
					cat.name+
					'</td><td class="space"></td><td class="fcl"><a onClick="hideFly(\'fdiv\');"><img src="/media/system/images/flyimgs/cross.gif"/></a></td></tr></table><table class="flyt"><tr><td>';
		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 += '</td><td>';
			}
		}
		divContent += '</tr></table>';
		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 = '<table class="fhead"><tr><td class="fcat">'+
				cat.s+
				'</td><td class="space"></td><td class="fcl"><a onClick="hideFly(\'fdiv\');"><img src="/media/system/images/flyimgs/cross.gif"/></a></td></tr></table><table class="flyt"><tr><td>';
		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 += '</td><td>';
			}
		}
		divContent += '</tr></table>';
		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 = '<a href="'+lpath+'" onClick="m.panTo(\''+curl.id+'\'); return false;" ';
		var divContent = '<a href="'+lpath+'"';
		var bicon = '';
		if (curl.specname != '') bicon = m.specoffericon
		else if (curl.specnew != '') bicon = m.specnewsicon;
		divContent += 'style="background: url('+bicon+') left top no-repeat;"';
		divContent += '>' + curl.text+ '</a> ';
		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] можно переопределить на странице для выполнения дополнительных действий по инициализации приложения
	}
}