(function($){
	$.fn.hotelsMap = function(options) {
		
		var hotelId = options.hotel_id || '';
		
		var filters = {
			city_id: options.city_id || ''
		};
		
		var cache = {};
		
		var requestParams = {
			resource_id: 'Action_MapHotels',
			event: 'getList',
			options: ''
		};
		
		var gMap;
		var mapContainer = $(this).prependTo('div.contentBox');
		
		mapContainer.find('#mapClose').bind('click', hideMap);
		
		var filtersBlock = mapContainer.find('div.options');
		var filterLinks = filtersBlock.find('a');
		filterLinks.bind('click', function(){
			filtersBlock.find('span').removeClass('active');
			$(this).parents('span').addClass('active');
			
			var category;
			if ($(this).attr('name')){
				category = $(this).attr('name').replace('_stars', '');
			}
			setFilter(category ? {'category': category} : null);
			gMap.resetMarkers();
			gMap.setCenter();
			loadHotels();
			
			return false;
		});
		
		function showMap(top){
			mapContainer.css({
				'left': ($('div.contentBox').width() - 800) / 2,
				'top': $(window).scrollTop() + ($(window).height() - 600) / 2
			});
			mapContainer.show();
			if (!gMap){
				gMap = mapContainer.find('div.map').googleMaps({
					latitude: options.lat,
			        longitude: options.lng,
			        depth: options.zoom
				});
			} else {
				gMap.setCenter();
			}
			resetFilters();
			loadHotels();
		}
		
		function resetFilters(){
			requestParams.options = $.param(filters);
			gMap.resetMarkers();
			filtersBlock.find('span').removeClass('active');
			filtersBlock.find('span:first').addClass('active');
		}
		
		function setFilter(filter){
			var options = $.extend(filter || {}, filters);
			requestParams.options = $.param(options);
		}
		
		function hideMap(){
			mapContainer.hide();
		}
		
		function loadHotels(){
			if (!cache[requestParams.options]){
				$.post('/', requestParams, loadCallback, 'json');
			} else {
				loadCallback(cache[requestParams.options], 'success');
			}
		}
		
		function loadCallback(data, status){
			if (status === 'success' && data.success){
				cache[requestParams.options] = data;
				
				var center;
				var markers = [];				
				$.each(data.hotels, function(i, item){
					
					var marker = {};
					var info = [];
					if (item.title){
						info.push('<div style="min-height: 100px; width: 400px; overflow:hidden; padding:15px 5px 15px 5px;">');
						if (item.img){
							info.push([
								'<div class="picHotel">',
									'<div class="imgBox">',
										'<a href="', item.url, '"><i></i><img width="100" height="100" src="', item.img, '"/></a>',
									'</div>',
								'</div>'
							].join(''));
						}
						info.push([
							'<div class="aboutH" style="font-size: 9pt; margin-left: ', (item.img ? 115 : 0), 'px;">',
								'<div class="name"><a href="', item.url, '">', item.title, '</a></div>',
								'<div class="rating rate', item.stars, '"></div>',
								'<div class="text">', item.address, '<p>' , item.descr, ' <a href="', item.url, '">Подробнее</a></p></div>',
							'</div>'].join(''));
						info.push('</div>');
					}
					marker.latitude = item.lat;
					marker.longitude = item.lng;
					if (info.length){
						marker.info = {
							html: info.join('')
						}
					}
					if (item.id == hotelId){
						center = [item.lat, item.lng];
			            marker.icon = { 
			                image: 'http://www.google.com/intl/en_us/mapfiles/ms/micons/blue-dot.png', 
			                shadow: 'http://chart.apis.google.com/chart?chst=d_map_pin_shadow', 
			                iconSize: '12, 20', 
			                shadowSize: '22, 20' 
			            };
					}
					markers.push(marker);
				});
				if (hotelId && center){
					gMap.setCenter.apply(null, center);
				}
				gMap.addMarkers(markers, hotelId && center);
			}
		}
		
		$.extend(this, {
			show: function(){
				showMap();
				return false;
			},
			hide: function(){
				hideMap();
			}
		});
		
		return this;
	}
})(jQuery);
