var isIE7 = navigator.userAgent.toLowerCase().indexOf('msie 7') != -1;
var isIE6 = navigator.userAgent.toLowerCase().indexOf('msie 6') != -1;

// Turn on background image caching in IE6
if (isIE6 && document && document.execCommand) {
	try { document.execCommand("BackgroundImageCache",false, true); }
	catch (e) { }
}

function geoUpdate(id, lng, lat) {
	$.post(
		"/geo_update/" + id + "/",
		{ "lng": lng, "lat": lat },
		function(response) {
			if(response == "Change request " + id + " OK") {
				alert("Спасибо. Адрес будет изменен после просмотра модератором.");
			}
		}
	);
}

var VSMap = function(el, options) {
	this.map = new YMaps.Map(el);
	
	var toolbar = new YMaps.ToolBar();
	
	var typeControl = new YMaps.TypeControl([YMaps.MapType.MAP, YMaps.MapType.SATELLITE, YMaps.MapType.HYBRID], [0,1,2]);
	map.addControl(typeControl);

	
	this.map.addControl(new YMaps.Zoom());
	this.map.addControl(new YMaps.ScaleLine());
	
	var buttonFullscreen = new YMaps.ToolBarToggleButton({ 
			icon: "/static/images/icon-fullscreen.png", 
			hint: "Развернуть карту на весь экран"
	});
	
	toolbar.add(buttonFullscreen);
	
	this.map.addControl(toolbar);
	
	YMaps.Events.observe(this.map, this.map.Events.Click, function() {
		this.enableScrollZoom();
	});
	
	this.map.setCenter(new YMaps.GeoPoint(options.centerLng, options.centerLat), options.zoom, YMaps.MapType.MAP);
	
	// Если кнопка активна, то карта разворачивается во весь экран
	YMaps.Events.observe(buttonFullscreen, buttonFullscreen.Events.Select, function () {
			$("#map").wrap("<div class='map-fullscreen'/>").parent().height($(window).height()).appendTo("body");
			map.redraw();
	});
	
	// Если кнопка неактивна, то карта принимает фиксированный размер
	YMaps.Events.observe(buttonFullscreen, buttonFullscreen.Events.Deselect, function () {
			$("#map").unwrap().appendTo(".map-outer");
			map.redraw();
	});


	if(options.mapType == "details" && (this.map.getMaxZoom() > this.map.getZoom() + 1)) {
		this.map.setZoom(this.map.getMaxZoom()-1);
	}
	
	if(options.mapType == "details") {
		setTimeout(function() {
			if($("#map .YMaps-tile-container img[src$='404.gif']").length > 0) {
				this.map.setZoom(this.map.getZoom() - 2);
			}
		}, 3000);
	}

	function addMapStyles() {
		var subtypes = [
			"carwash", "petrolstation", "repairshop", "tireshop", 
			"carwash-vip", "petrolstation-vip", "repairshop-vip", "tireshop-vip"];
	
		for(var i=0; i <= subtypes.length-1; i++) {
			var t = new YMaps.Template('<div class="' + subtypes[i] + '"></div>');
			
			var strStyle = "vsesto#" + subtypes[i];
			YMaps.Templates.add(strStyle, t);
			
			var s = new YMaps.Style();
			s.iconStyle = new YMaps.IconStyle(strStyle);
			YMaps.Styles.add(strStyle, s);
		}
	}
	
	addMapStyles();
	
	function genBalloonContent(data) {
		var balloonContent = '';
		var isThumbnail = typeof(data.thumbnail) != 'undefined';
		var url = data.url + (!!data.vip_slot ? '?vip=map' : '?from=map');
		
		balloonContent += '<h3><a href="' + url + '">' + data.title + '</a></h3>';
		
		balloonContent += '<p><b>Адрес:</b> '+ data.address + '</p>';
		
		if(data.tel && data.tel !== null) {
			balloonContent += '<p><b>Тел:</b> ' + data.tel + '</p>';
		}
		
		if(data.name == "СТО" && data.service_type == "authorized") {
			balloonContent += '<p><b>Авторизированная СТО</b>';
			
			if(data.marks_serviced.length >= 1) {
				balloonContent += ' (' + data.marks_serviced.join(', ') + ')';
			}
			
			balloonContent += '</p>';
		}
		
		if(typeof(data.rating_integral) != "undefined") {
			balloonContent += '<p><b>Рейтинг:</b > <span class="stars stars-' +
				data.rating_integral + '">&nbsp;</span></p>';
		}
		
		if(isThumbnail && !isIE7 && !isIE6) {
			var img = '<img class="thumbnail" src="/static/images/blank.gif"' +
				'style="background-image: url(' + data.thumbnail + ')" ' +
				'alt="фото" width="' + data.thumb_width + '"/>';
			
			balloonContent += '<p><a href="' + url + '">' + img + '</a></p>';
		}
		
		return balloonContent;
	}
	
	function addJSONData(json_src, subtype) {
		$.getJSON(json_src, function(jsonData) {
			for(var i=jsonData.length-1; i>=0; i--) {
				var item = jsonData[i];
				var placemarkStyle = "vsesto#" + subtype;
				
				if(!!item.vip_slot) {
					placemarkStyle += "-vip";
				}
				
				if((item.lng != 0 && item.lat != 0) &&
					 (options.mapType != "details" || item.id != autoservice.id)) {
					var placemark = new YMaps.Placemark(
						new YMaps.GeoPoint(item.lng, item.lat),
						{style: placemarkStyle}
					);
					
					placemark.setBalloonContent(genBalloonContent(item));
					
					map.addOverlay(placemark);
				}			
			}
			
			// Centering map if points count is small
			if(options.mapType != "details" && jsonData.length <= 10) {
				(function() {
					var points = [];
					for(var i=jsonData.length-1; i>=0; i--) {
						if(jsonData[i].lng !=0 && jsonData[i].lat != 0) {
							points.push(new YMaps.GeoPoint(jsonData[i].lng, jsonData[i].lat));
						}
					}
					var bounds = new YMaps.GeoCollectionBounds(points);
					var l = bounds.getLeft();
					var r = bounds.getRight();
					var t = bounds.getTop();
					var b = bounds.getBottom();
					bounds.add(new YMaps.GeoPoint((11*l-r)/10, (11*b-t)/10), new YMaps.GeoPoint((11*r-l)/10, (11*t-b)/10));
					map.setBounds(bounds);
					map.redraw();
				})();
			}
		});
	}
	
	if(typeof(json_src) == "string") {
		addJSONData(json_src, subtype);
	}
	
	if(options.mapType == "details") {
		if(autoservice.lng != 0 && autoservice.lat != 0) {
			var placemark = new YMaps.Placemark(
				new YMaps.GeoPoint(autoservice.lng, autoservice.lat),
				{draggable: true, hasBalloon: false}
			);
			
			placemark.setIconContent(autoservice.title);
			
			map.addOverlay(placemark);
			
			YMaps.Events.observe(placemark, placemark.Events.DragEnd, function() {
				$(".map-wrap .save").show();
			});
			
			$(".map-wrap .save").click(function() {
				geoUpdate(autoservice.id, placemark.getGeoPoint().getLng(), placemark.getGeoPoint().getLat());
				$(".map-wrap .save").hide();
			});
			
			if(typeof(new_address) != "undefined") {
				var placemarkNew = new YMaps.Placemark(
					new YMaps.GeoPoint(new_address.lng, new_address.lat),
					{hasBalloon: false});
					
				placemarkNew.setIconContent("новый адрес");
				map.addOverlay(placemarkNew);
			}
		}
		else {
			var geocoder = new YMaps.Geocoder(autoservice.address);
			var id = autoservice.id;
			
			YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
				var geoPoint = this.get(0).getGeoPoint();					
				geoUpdate(id, geoPoint.getLng(), geoPoint.getLat());
			});
		}
	}
};

$(function () {
	/*------------- Init map -----------*/
	var mapDiv = $("#map");	
	
	if(mapDiv.length > 0) {
		var mapOptions = {};
		
		if(mapDiv.hasClass("map-details")) {
			mapOptions = {
				centerLng: autoservice.lng,
				centerLat: autoservice.lat,
				zoom: 13,
				mapType: "details"
			};
		}
		
		else {
			mapOptions = {
				centerLng: cityCenterLng,
				centerLat: cityCenterLat,
				zoom: 12,
				mapType: "catalog"
			};
			
			if(mapDiv.hasClass("map-catalog")) {
				mapOptions.zoom = 11;
			}
			else if(mapDiv.hasClass("map-embed")) {
				mapOptions.mapType = "embed";
			}
		}
		
		VSMap(mapDiv.get(0), mapOptions);
	}
	
	/*------------- stars-radios ---------------*/
	$("ul.stars-radios input").click(function() {
		var $cbx = $(this);
		$cbx.closest("ul").find("li.current").removeClass("current");
		$cbx.closest("li").addClass("current");
	});
	$("ul.stars-radios input:checked").closest("li").addClass("current");
	
	/*------------- Fancybox (gallery) ---------------*/
	if(typeof($.fn.fancybox) == "function") {
		$(".gallery a").fancybox();
	}

	/*------------- City selector --------------------*/
	$(".header .city-select").hover(
		function() { $(this).addClass("city-select-active"); },
		function() { $(this).removeClass("city-select-active"); }
	);
	
	/*------------- Update review --------------------*/
	$(".reviews .myreview .update-review-link").click(function() {
		$(this).parents(".myreview").find("form").toggle().find("textarea").focus();
		return false;
	});

	/*------------- Track events with GA -------------*/
	if(typeof(_gaq) != "undefined") {
		$(".feedback-form").submit(function() {
			_gaq.push(['_trackEvent', 'Forms', 'Feedback']);
		});
		
		$(".register-form").submit(function() {
			_gaq.push(['_trackEvent', 'Forms', 'Register']);
		});
		
		$(".add-form-simple, .add-form").submit(function() {
			_gaq.push(['_trackEvent', 'Forms', 'Add autoservice']);
		});
		
		$("#cse-search-box").submit(function() {
			_gaq.push(['_trackEvent', 'Forms', 'Google search', $(this).find(".search-term").val()]);
		});
		
		$("a").click(function() {
			var link = this.href;
			
			function isLinkExternal(link) {
				var r = new RegExp('^https?://(?:www.)?' + location.host.replace(/^www./, ''));
				
				return !r.test(link);
			}
			
			if(isLinkExternal(link) 
				&& (link.indexOf('javascript') == -1)
				&& (link.indexOf('media.vse-sto') == -1)) {
				_gaq.push(['_trackEvent', 'Clicks', 'Outgoing', link]);
			}
		});
	}
});

/**
 *   Used for split testing experiments.
 *   User participation to an experiment is available through:
 *       experiments.control("experiments_name");
 *   and
 *       experiments.test("experiments_name");
 *   Relies on JQuery
**/
experiments = function() {
    // experiment_enrollment should have the following format { experiment_name : group }
    var experiment_enrollment = {};

    return {
        record_enrollment: function(experiment_name, group) {
            experiment_enrollment[experiment_name] = group;
        },
        control: function(experiment_name) {
            if (experiment_enrollment[experiment_name]) {
                return experiment_enrollment[experiment_name] == "control";
            } else {
                if (console) {
                    console.error("Can't find experiment named " + experiment_name);
                }
                return true;
            }
        },
        test: function(experiment_name) {
            if (experiment_enrollment[experiment_name]) {
                return experiment_enrollment[experiment_name] == "test";
            } else {
                if (console) {
                    console.error("Can't find experiment named " + experiment_name);
                }
                return false;
            }
        },
        confirm_human: function() {
            $.get("/experiments/confirm_human/");
        }
    };
}();
