/*
 * © by christian at kumpe.de
 *
 * If you want to copy or use the code in any way, ask for permission.
 */

/*
 * Web tracking with IP anonymization to conform germany's data privacy
 * regulations.
 */
var _gaq = _gaq || [];
(function() {
	_gaq.push([ "_setAccount", "UA-25933681-1" ]);
	_gaq.push([ "_gat._anonymizeIp" ]);
	_gaq.push([ "_trackPageview" ]);

	if (location.host.match(/^localhost(:\d+)?$/)) {
		// no tracking while testing
		return;
	}

	var ga = document.createElement("script");
	ga.type = "text/javascript";
	ga.async = true;
	ga.src = ("https:" == document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js";
	var s = document.getElementsByTagName("script")[0];
	s.parentNode.insertBefore(ga, s);
})();

var kumpe = kumpe || {};

kumpe.EventTracker = function(category, action) {
	this.track = function(opt_label, opt_value, opt_noninteraction) {
		var trackArguments = [ "_trackEvent", category, action ];
		for ( var i = 0; i < arguments.length; i++) {
			trackArguments.push(arguments[i]);
		}
		_gaq.push(trackArguments);
	};
};

/*
 * Price calculator.
 */
kumpe.PriceCalculator = function() {
	function formatCurrency(value) {
		if (typeof value === "number") {
			return value.toFixed(2).replace(/\.00/, ",&ndash;").replace(/\./, ",") + "&thinsp;€";
		} else {
			return value;
		}
	}

	var priceForRoom = {
		Nebelhorn : 21,
		Rubihorn : 20,
		Wannenkopf : 18
	};

	this.pricePerNightFor = function(room) {
		return formatCurrency(priceForRoom[room]);
	};

	var additionalCharge = [ undefined, 6, 2.8, 2.8 ];

	function additionalChargeFor(nights) {
		return nights <= 3 && additionalCharge[nights];
	}

	this.hasAdditionalChargeFor = function(nights) {
		return additionalChargeFor(nights) && true;
	};

	this.additionalChargeFor = function(nights) {
		return formatCurrency(additionalChargeFor(nights));
	};

	this.priceFor = function(room, nights) {
		return formatCurrency(2 * nights * (priceForRoom[room] + additionalChargeFor(nights)));
	};
};

$.fn.priceCalculator = function() {
	return this.each(function() {
		var $calculator = $(this);
		$(this).find("form[name=calculator]").submit(function(event) {
			event.preventDefault();

			$calculator.find(".hidden").hide();

			var eventTracker = new kumpe.EventTracker("PriceCalculator", "submit");

			var room = $(this).find("select[name=room]").val();
			var nights = $(this).find("input[name=nights]").val() * 1;
			if (0 < nights && nights < 100) {
				eventTracker.track(room, nights);
				var $result = $calculator.find(".result");
				$result.find(".nights").html(nights);
				$result.toggleClass("singleNight", 1 == nights);

				var priceCalculator = new kumpe.PriceCalculator();
				$result.find(".roomPrice").html(priceCalculator.pricePerNightFor(room));

				if (priceCalculator.hasAdditionalChargeFor(nights)) {
					$result.find(".shortTime").show();
					$result.find(".shortTimePrice").html(priceCalculator.additionalChargeFor(nights));
				} else {
					$result.find(".shortTime").hide();
					$result.find(".shortTimePrice").html("?");
				}

				$result.find(".resultPrice").html(priceCalculator.priceFor(room, nights));
				$result.fadeIn("slow");
			} else {
				eventTracker.track(room, -1);
				$calculator.find(".illegalNights").fadeIn("slow");
			}
		});
	});
};

/*
 * Mail address obfuscation.
 */
kumpe.MailAddressDeobfuscator = function() {
	var characterMap = {
		at : "@",
		dot : ".",
		ddot : ":"
	};

	this.deobfuscate = function(element) {
		element.href = "mailto:" + (element.innerHTML = element.innerHTML.replace(/\s*\[(.*?)\]\s*/g, function() {
			return characterMap[arguments[1]];
		}));
	};
};

$.fn.deobfuscate = function() {
	var mailAddressDeobfuscator = new kumpe.MailAddressDeobfuscator();
	return this.each(function() {
		mailAddressDeobfuscator.deobfuscate(this);
	});
};

$(function() {
	// start calculator if present
	$(".calculator").priceCalculator();

	// deobfuscate email addresses
	$("a.obfuscatedMail").deobfuscate();

	/*
	 * Track outbound links.
	 */
	$("a").click(function(event) {
		var href = $(this).attr("href");
		if (-1 === href.indexOf(":")) {
			// don't track local links
			return;
		}

		event.preventDefault();

		_gaq.push([ "_trackEvent", "Outbound Link", "click", href ]);

		setTimeout(function() {
			location.href = href;
		}, 100);
	});

	/*
	 * Track email form.
	 */
	$("form[name=email] input[type=submit]").click(function(event) {
		event.preventDefault();

		_gaq.push([ "_trackEvent", "Contact Form", "submit" ]);

		var form = this.form;

		setTimeout(function() {
			form.submit();
		}, 100);
	});

	/*
	 * Gallery code.
	 */
	$("div.gallery")
			.each(
					function() {
						var $div = $(this).children("div").css("position", "relative");

						var image = $div.children("img")[0];

						var $label = $div.children(".label");

						var gallery = window[this.id];
						gallery.unshift({
							src : image.src,
							alt : image.alt,
							title : image.title
						});

						for ( var i = 0; i < gallery.length; i++) {
							var slide = gallery[i];
							if (!slide.title) {
								slide.title = slide.alt;
							}
							slide.preload = new Image();
							slide.preload.src = slide.src;
						}

						var currentImage = $(new Image()).addClass("buffer").attr(gallery[0]);
						$div.append(currentImage);

						var newImage = currentImage.clone().hide();
						$div.append(newImage);

						var currentImageIndex = 0;

						$div.append($(new Image()).attr("src", "images/layout/prev.png").addClass("prev").click(
								function() {
									nextImage(-1);
								}));

						$div.append($(new Image()).attr("src", "images/layout/next.png").addClass("next").click(
								function() {
									nextImage();
								}));

						var timerId = false;

						var playPauseButton = $(new Image()).attr("src", "images/layout/pause.png").addClass(
								"playPause").click(function() {
							if (!timerId) {
								scheduleNextImage();
							} else {
								clearTimeout(timerId);
								timerId = false;
								playPauseButton.attr("src", "images/layout/play.png");
							}
						});
						$div.append(playPauseButton);

						var progressMessage = $(document.createElement("div")).addClass("progress").text(
								"1/" + gallery.length);
						$div.append(progressMessage);

						if ($(this).hasClass("autoStart")) {
							scheduleNextImage();
						} else {
							playPauseButton.attr("src", "images/layout/play.png");
						}

						function scheduleNextImage() {
							clearTimeout(timerId);
							timerId = setTimeout(nextImage, 5000);
							playPauseButton.attr("src", "images/layout/pause.png");
						}

						function nextImage(step) {
							if (!step) {
								step = 1;
							}

							currentImage.attr(gallery[currentImageIndex]);

							currentImageIndex += step;
							if (0 > currentImageIndex) {
								currentImageIndex = gallery.length - 1;
							} else if (currentImageIndex >= gallery.length) {
								currentImageIndex = 0;
							}

							newImage.hide().attr(gallery[currentImageIndex]).fadeIn("slow", function() {
								$label.text(gallery[currentImageIndex].alt);
								progressMessage.text((currentImageIndex + 1) + "/" + gallery.length);
								scheduleNextImage();
							});
						}
					});
});

