/**********************************************************************/

function Yandex_Map (canvas_obj_id, operations_obj_id, container_obj_id, center_lat, center_lng)
{
	this.container_obj 		= null;
	this.canvas_obj	   		= null;
	this.operations_obj		= null;
	this.map 		   		= null;
	this.b_show  	   		= false;
	this.center_x	   		= center_lng;
	this.center_y	   		= center_lat;
	this.default_scale		= 10;
	this.bounds				= new YMaps.GeoCollectionBounds();
	this.phys_id_list		= [];
	this.b_load_running		= false;
	this.form_obj			= null;
	this.msg_obj			= null;
	this.add_shop_marker	= null;
	this.max_auto_zoom		= 12;
	this.b_bounds_empty		= true;
	
	this.canvas_obj = $('#' + canvas_obj_id);
	if ( ! this.canvas_obj.length)
		return alert ("Can't find map container object!");
	
	if (container_obj_id)
		this.container_obj = $('#' + container_obj_id);

	if (operations_obj_id)
		this.operations_obj = $('#' + operations_obj_id);

	/******************************************************************/
	
	this.show = function () 
	{
		if (this.operations_obj)
			this.operations_obj.css('display', 	'block');
		this.canvas_obj.css('display', 		'block');
		
		if (this.map)
			this.map.redraw();
	}
	
	this.hide = function () 
	{
		if (this.operations_obj)
			this.operations_obj.css('display', 	'none');
		this.canvas_obj.css('display', 		'none');
	}
	
	this.add_shop_add_marker = function (point, b_autocenter)
	{
		if (this.add_shop_marker)
			this.clear_all();
		
		var options = 
		{
			style : "default#redPoint",
			draggable: true,
			hideIcon : false,
			balloonOptions: 
			{
	        	maxWidth: 170,
			}

			/* , hasBalloon: false */
		};
		
		this.add_shop_marker = new YMaps.Placemark(point, options);
		this.add_shop_marker.description = "Точку можно переносить по карте при помощи мышки.";

		this.map.addOverlay(this.add_shop_marker);
		this.extend_bounds (point);
		this.phys_id_list.push (0);
		if (b_autocenter)
			this.auto_center();
	}
	
	this.clear_all = function ()
	{
		this.map.removeAllOverlays ();
		this.add_shop_marker = null;
		this.bounds = new YMaps.GeoCollectionBounds();
		this.phys_id_list = [];
		this.b_bounds_empty = true;
	}
	
	this.map_init = function (b_admin)
	{
		this.show();
		
		if (this.map)
			return;
		
		this.map = new YMaps.Map(this.canvas_obj[0]);
		this.map.setCenter(new YMaps.GeoPoint(this.center_x, this.center_y), this.default_scale);
		
		this.map.addControl(new YMaps.TypeControl());
		this.map.addControl(new YMaps.ToolBar());
		this.map.addControl(new YMaps.Zoom());
		
		if ( ! b_admin)
			return;
		
		this.form_obj = $('#add_shop_form');
		if ( ! this.form_obj)
			return alert ('Can not find add shop form!');
		this.form_obj = this.form_obj[0];
		
		this.msg_obj = $('#add_shop_map_info_msg');
		if ( ! this.msg_obj)
			return alert ("Can't find messages container!");
		this.msg_obj = this.msg_obj[0];
		
		if (this.form_obj.map_point_lat.value != "")
		{
			var x = this.form_obj.map_point_lng.value;
			var y = this.form_obj.map_point_lat.value;
			this.add_shop_add_marker (new YMaps.GeoPoint (x, y), true);
		}
		else
		{
			YMaps.Events.observe(this.map, this.map.Events.Click, function (map, mEvent) 
			{
				var point = mEvent.getGeoPoint();
				this.add_shop_add_marker (point, false);
			}, this);
			
			this.msg_obj.innerHTML = 'Кликните на карте, чтобы установить точку.<br /> ' 
				+ 'Точку можно переносить по карте при помощи мышки.';
		}
	}
	
	this.create_placemark = function(point, desc)
	{
		var s = new YMaps.Style();
		
        s.iconStyle = new YMaps.IconStyle();
        s.iconStyle.href = "/images/i/map_placemark.png";
        s.iconStyle.size = new YMaps.Point(12, 20);
        s.iconStyle.offset = new YMaps.Point(-6, -20);
       
        s.iconStyle.shadow = new YMaps.IconShadowStyle();
        s.iconStyle.shadow.href = "/images/i/map_placemark_shadow.png";
        s.iconStyle.shadow.size = new YMaps.Point(22, 20);
        s.iconStyle.shadow.offset = new YMaps.Point(-11, -20);

       	s.balloonContentStyle = new YMaps.BalloonContentStyle (new YMaps.Template(desc));
		var placemark = new YMaps.Placemark(point, {style : s, hideIcon : false});
		
		YMaps.Events.observe(placemark, placemark.Events.MouseEnter, function (obj) {
			placemark.openBalloon();
        });
        YMaps.Events.observe(placemark, placemark.Events.MouseLeave, function (obj) {
        	// placemark.closeBalloon();
        });
		
		return placemark;
	}

	this.extend_bounds = function (point)
	{
		this.b_bounds_empty = false;
		this.bounds.add (point);
	}
	
	this.auto_center = function ()
	{
		if (this.b_bounds_empty)
			return;
		
		this.map.setBounds (this.bounds);
		
		var max_zoom = this.map.getMaxZoom ();
		if (max_zoom > this.max_auto_zoom)
			max_zoom = this.max_auto_zoom;
		
		if (this.map.getZoom() > max_zoom)
			this.map.setZoom (max_zoom);
	}
	
	this.create_marker = function (point_dom)
	{
		var phys_id = point_dom.getAttribute("id");
		if (this.phys_id_list.indexOf (phys_id) >= 0)
			return;
		this.phys_id_list.push (phys_id);
		
		var x = point_dom.getAttribute("map_point_lng");
		var y = point_dom.getAttribute("map_point_lat");
		
		var desc = '<div style="width: 300px;"><a href="'+
			site_base_addr + 'view_shop/' + point_dom.getAttribute ('shop_str_id') + '.html'
			+'"><b>' + point_dom.getAttribute ('shop_name') + "</b></a><br />" 
			+ '<div style="font-size: 10pt;">'
			+ point_dom.getAttribute ('address') 
			+ '</div>';
		
		var phone = point_dom.getAttribute ('phone');
		var tt    = point_dom.getAttribute ('timetable');
		
		if (phone != '')
			desc += '<br /><span style="font-weight: bold;">Тел.:</span> ' + phone;
		if (tt != '' && tt != null)
			desc += '<br /><span style="font-weight: bold;">Режим работы:</span> ' + tt;
		
		desc += '</div>';
		
		var point = new YMaps.GeoPoint (x, y);
		var placemark = this.create_placemark (point, desc);
		this.map.addOverlay (placemark);
		this.extend_bounds (point);
	}
		
	this.load_push_points = function (url)
	{
		if (this.b_load_running)
			return;
		
		this.b_load_running = true;
		
		$.ajax
		({
			url: url,
			success : function (map_object) 
			{
				return function (data)
				{
					var markers = data.documentElement.getElementsByTagName("point");
					
					if (markers.length == 0)
					{
						alert ('К сожалению, для компаний в этой катетегории/рубрике не задано ни одной торговой точки.');
						return;
					}
					
					for (var i = 0; i < markers.length; i++) 
						map_object.create_marker (markers[i]);
					
					map_object.auto_center();
				}
			} (this),
			complete : function (map_object) 
			{
				return function ()
				{
					map_object.b_load_running = false;
				}
			} (this),
			error : function () { alert("Невозможно получить информацию по URL: '" + url + "'"); }
		});
	}
	
	this.add_viewshop_point = function (point_id)
	{
		this.map_init (false);
		var markersUrl = site_base_addr + 'view_shop/phys_info/id.' + point_id + '.xml';
		this.load_push_points (markersUrl);
	}
	
	this.show_all_viewshop = function (shop_id)
	{
		this.map_init (false);
		var markersUrl = site_base_addr + 'view_shop/phys_info/shop_id.' + shop_id + '.xml';
		this.load_push_points (markersUrl);
	}
	
	this.add_shop_addr2latlng = function ()
	{
		var addr_str = this.form_obj.address.value;
		var reg = new RegExp (cur_city_name, 'i');
		if ( ( ! addr_str.match(reg)) && ( ! addr_str.match(/г\./i )) )
			addr_str = cur_city_name + ", " + addr_str;
		// alert (addr_str);
		
		var coder_options = {results : 1};
		var geocoder = new YMaps.Geocoder(addr_str, coder_options);
		
		YMaps.Events.observe(geocoder, geocoder.Events.Load, function (map) 
		{
			return function (coder)
			{
				if ( ! coder.length())
					return alert ('Не найдено ни одной точки, соотвествующей адресу!');
				
				/* var result_txt = "";
				for (var i = 0; i < coder.length(); i++)
				{
					var result = coder.get(i);
					result_txt += result.text + ", precision: " + result.precision +  "\n";
				}
				alert (result_txt); */ 
				
				var result = coder.get(0);
				if (result.precision != 'exact' && result.precision != 'number')
					/*return*/ alert ('Дом не найден (возможно он ещё не нанесён на карту)!' 
							+ ' Точка на карте установлена по ближайшему адресу!');
				
				var point = result.getGeoPoint();
				map.add_shop_add_marker (point, true);
			}
		} (this));
		 
		YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (error) 
		{
		    alert("Произошла ошибка: " + error.message)
		});
			
		return false;
	}
	
	this.set_map_click_tell_coords = function ()
	{
		YMaps.Events.observe(this.map, this.map.Events.Click, function (map, mEvent) 
		{
			var point = mEvent.getGeoPoint();
			alert ('Lat: ' + point.getLat() + ', Lng: ' + point.getLng());
		}, this);
	}
	
	this.sauna_view_point = function (lat, lng, desc)
	{
		var point = new YMaps.GeoPoint(lng, lat);
		var placemark = this.create_placemark (point, desc);
		this.map.addOverlay (placemark);
		this.extend_bounds (point);
		this.auto_center();
	}
	
	this.create_sauna_marker = function (dom_node)
	{
		var id = dom_node.getAttribute ('id');
		if (this.phys_id_list.indexOf (id) >= 0)
			return;
		this.phys_id_list.push (id);
		
		var point = new YMaps.GeoPoint
		(
			parseFloat(dom_node.getAttribute("map_point_lng")),
			parseFloat(dom_node.getAttribute("map_point_lat"))
		);
						
		var desc = '<div style="width: 300px;"><a href="'+
		site_base_addr + 'catalog/' + id + '/'
		+'" target="_blank"><b>' + dom_node.getAttribute ('name') + "</b></a><br />" 
		+ '<div style="font-size: 10pt;">'
			+ dom_node.getAttribute ('address') 
			+ '</div>'
			+ '</div>';
		
		var placemark = this.create_placemark (point, desc);
		this.map.addOverlay (placemark);
		this.extend_bounds (point);
	}
	
	this.sauna_show_id_list = function (field, id_list)
	{
		this.map_init (false);
		
		if (this.b_load_running)
			return;
		
		this.b_load_running = true;
		
		var url = site_base_addr + 'catalog/ajax_get_sauna_list/' + field + '.' + id_list + '/';
		
		$.ajax (
		{
			url: url,
			success: function (map_object) { return function (xml)
			{
				var markers = xml.documentElement.getElementsByTagName("sauna");
				for (var i = 0; i < markers.length; i++) 
					map_object.create_sauna_marker (markers[i]);
				map_object.auto_center();
			}} (this),
			complete : function (map_object) 
			{
				return function ()
				{
					map_object.b_load_running = false;
				}
			} (this),
			error : function () { alert("Невозможно получить информацию по URL: '" + url + "'"); }
		});
	}
	
	this.showSkidkiPoints = function (mode, categ_id, rubric_id)
	{
		this.map_init (false);
		
		var url = site_base_addr + 'skidki/map_points/';
		url += (categ_id != '') ? ('categ_id.' + categ_id) : ('rubric_id.' + rubric_id);
		url += '.xml';

		this.load_push_points (url);
	}
	
	this.showDiscountCenters = function (physId, categId)
	{
		this.map_init (false);
		var url = site_base_addr + 'discount_stock_center/viewPoints/';
		
		if (categId)
			url += 'categId.' + categId + '/';
		
		if (physId)
			url += 'id.' + physId + '/';
		
		this.load_push_points (url);
	}
}

/**********************************************************************/
