﻿/* ShowHide, geeft een element de mogelijkheid een ander element te tonen/verbergen */
jQuery.fn.showHide = function(select, settings) {
    settings = jQuery.extend({
        delay: 1000
    }, settings);

    var timer;

    // Het element waarmee je kunt tonen/verbergen
    var handle = jQuery(this);
    // Het element dat getoond/verborgen wordt
    var target = jQuery(select);

    // Events voor het tonen
    handle.mouseenter(enterHandler);
    target.mouseenter(enterHandler);

    // Events voor het verbergen
    handle.mouseleave(leaveHandler);
    target.mouseleave(leaveHandler);

    function enterHandler() {
        // Verbergen annuleren als we het element gaan tonen
        clearTimeout(timer);
        target.show();
    }

    function leaveHandler() {
        // Het element verbergen (met een time-out)
        timer = setTimeout(function() { target.hide(); }, settings.delay);
    }
};

/* Menu */
jQuery.fn.menu = function(settings) {
	settings = jQuery.extend({
        defaultDocument: "index.html",
        currentClass: "current",
        activeClass: "active"
    }, settings);

	// De huidige pagina (zonder het domein e.d.)
	var path = document.location.pathname;
	if (path === "/") path += settings.defaultDocument;
	
	 $(this).find("a").each(function() {
		var elem = $(this);
		if (elem.attr("href") === undefined) return;

		var href = elem.attr("href");
		var loc = path.length - href.length;

		if (href != "" && loc >= 0 && path.toLowerCase().lastIndexOf(href.toLowerCase()) === loc) {
			// Als het href attribuut gelijk is aan het adres van de pagina
			elem.addClass(settings.currentClass);

			// Ook het li element op het hoogste niveau krijgt een class
			var top;
			elem.parents("li").each(function() {
				top = $(this);
			});
			top.addClass(settings.activeClass);
		}
	});

    // Alle items met een geneste ul waar de link zelf geen href attribuut heeft
    var parents = $("li:has(ul) > a:not(a[href])", this);
	parents.each(function() {
		var link = $(this);
		link.css("cursor", "pointer");
		link.attr("href", link.siblings("ul").find("a:first").attr("href"));
	});
	
	
};

/* Formuliervalidatie */
jQuery.fn.setupFormValidation = function() {
	jQuery.validator.messages.required = "";
	jQuery.validator.messages.email = "";

	$(this).validate({
		focusInvalid: false, 
		onfocusout: false, 
		onkeyup: false, 
		invalidHandler: function(e, validator) {
			var errors = validator.numberOfInvalids;
			if(errors) {
				$("p.error", validator.currentForm).show();
			}
		}
	});	
}

/* Slideshow */
jQuery.fn.slideshow = function(options) {
	var settings = $.extend({
		maskSelector: "#mask",
		overlaySelector: "#slideshow"
	}, options);

	// Filter de query op hyperlinks met een href-attribuut
	var links = this.filter("a[href]");
	var index = 0;

	// Elementen die getoond en verborgen worden
	var mask = $(settings.maskSelector);
	var overlay = $(settings.overlaySelector);

	// Controls in de overlay
	$(".close", overlay).click(hide);
	$(".previous", overlay).click(previousHandler);
	$(".next", overlay).click(nextHandler);

	// Events voor toetsenbord koppelen
	$(document).keydown(keydownHandler);

	links.click(function(e) {
		// Index van de geklikte link
		index = links.index(this);
		update();

		// Voorkom dat de hyperlinks gevolgd worden
		e.preventDefault();
	});

	function update() {
		// Welke link gaan we nu tonen
		var link = $(links[index % links.length]);
		var thumbnail = link.children("img");

		// Status bijwerken
		$(".total", overlay).text(links.length);
		$(".current", overlay).text(index + 1);
		$(".title", overlay).html(thumbnail.attr("alt") + "&nbsp;"); // HACK!
		
		if(links.length == 1) { $(".controls", overlay).hide(); }

		// Afbeelding plaatsen
		var image = $(".frame img");
		image.load(function() {
			$(this).show();
		}).hide().attr("src", link.attr("href"))
		show();
	}

	function show() {
		mask.show();
		overlay.show();
	}

	function hide() {
		mask.hide();
		overlay.hide();
	}

	function keydownHandler(e) {
		// Esc-toets verbergt de popup
		if (e.keyCode == 27) {
			hide();
			e.preventDefault();
		}
	}

	function nextHandler(e) {
		index++;
		index = index % links.length;
		update();
	}

	function previousHandler(e) {
		index = index + links.length - 1;
		index = index % links.length;
		update();
	}

	return this;
};
