/* === rkz.js === */


(function($) {
	$.extend( {
		
		config: (function() {
			// Put config settings in configObj (private):
			var confObj = {
				printLabel:		"Print",
				fontSize:		{
									header:	"Lettergrootte:",
									symbol:	"A",
									titles:	{
												small:	"Kleine letters",
												normal:	"Standaard lettergrootte",
												big:	"Grote letters"
											}
								},
				siteSearch:		{
									overLabel:		"Zoek in deze site",
									emptySearch:	"U heeft geen zoekterm opgegeven.\nVul een of meerdere zoektermen in en klik op het vergrootglas, of druk op Enter."
								},
				sectionMap:		{
									show:	"Toon overzicht",
									hide:	"Verberg overzicht"
								},
				zwSearch:		{
									form:	"zwKeywords",
									input:	"filter",
									flyout:	"zwSuggest"
								},
				jsLinks:		{	// actual [link text] between square brackets
									back:		"Ga terug naar de [vorige pagina].",
									close:		"[Sluit venster]"
								},
				alphaNumAll:	"Toon alles"
			};
			
			// Private methods:
			var extend = function(conf, callbacks) {
				if (!conf || typeof conf !== "object") { return; }
				var proceed;
				for (var key in conf) {
					proceed = true;
					if (callbacks) {
						// Call appropriate callback function, if specified:
						if (confObj[key] && callbacks.onAlter) { proceed = callbacks.onAlter(key, conf[key], confObj[key]); }
						else if (!confObj[key] && callbacks.onAdd) { proceed = callbacks.onAdd(key, conf[key]); }
					}
					// Set value, unless callback function returned false:
					if (proceed || proceed == null) { confObj[key] = conf[key]; }
				}
			};
			var get = function(key) {
				return key ? confObj[key] : confObj;
			};
			
			// Interface:
			return {extend: extend, get: get};
		})(),
		
		initSiteSearch: function() {
			// overLabel:
			$("#zkr_words").overLabel().blur();
			
			// add hook for CSS + simple validation:
			$("#siteSearch")
				.addClass("jsSiteSearch")
				.submit(function(e){
					var jSearchBox = $("#zkr_words");
					if (!jSearchBox.val()) {
						var msg = $.config.get().siteSearch.emptySearch;
						alert(msg);
						jSearchBox.focus();
						e.preventDefault();
					}
				});
				
			var overLabelText = $.config.get().siteSearch.overLabel;
			$("#siteSearch label.jsOverLabel").text(overLabelText);
		},
		
		sectionFold: function() {
			var sectionMenu = $("#sectionNav ul.nav");
			if (sectionMenu.length == 0) return;
			$("li.parent", sectionMenu)
				.click(function(e) {
					e.preventDefault();
					e.stopPropagation();
					var jThis = $(this);
					if (jThis.hasClass("expanded")) {
						//collapseFolder(jThis);
						jThis.removeClass("expanded");
						sectionMenu.removeData("exp");
					} else {
						//expandFolder(jThis);
						jThis.addClass("expanded");
						var currExp = sectionMenu.data("exp");
						if (currExp && currExp !== jThis) {
							currExp.removeClass("expanded");
						}
						sectionMenu.data("exp", jThis);
					}
				});
				
			var collapseFolder = function(jFolder) {
				$("li.noParent", jFolder)
					.slideUp("fast", function() {
						$(this).removeClass("expanded");
					});
				sectionMenu.removeData("exp");
			};
				
			var expandFolder = function(jFolder) {
				var currExp = sectionMenu.data("exp");
				if (currExp && currExp !== jThis) {
					collapseFolder(currExp);
				}
				$("li.noParent", jFolder)
					.slideDown("fast", function() {
						$(this).addClass("expanded");
					});
				sectionMenu.data("exp", jThis);
			};
		},
		
		initSiteNav: function() {
			var siteNav = $("#siteNav");
			var sectionMapNav = $("#sectionMap div").eq(0);
			if (siteNav.length == 0 || sectionMapNav.length == 0) return;
			var toggleLabelShow = $.config.get().sectionMap.show;
			var toggleLabelHide = $.config.get().sectionMap.hide;
			sectionMapNav.before('<p id="toggleMap"><a href="#">' + toggleLabelShow + '</a></p>');
			$("#toggleMap a").toggle(
				function(e) {
					siteNav.removeClass("jsCollapsed");
					sectionMapNav.slideDown("fast");
					$(this).text(toggleLabelHide);
					e.preventDefault();
				},
				function(e) {
					sectionMapNav.slideUp("fast", function() {
						siteNav.addClass("jsCollapsed");
					});
					$(this).text(toggleLabelShow);
					e.preventDefault();
				}
			);
			siteNav.addClass("jsCollapsable").addClass("jsCollapsed");
			sectionMapNav.hide();	// needed to make first slide run smoothly
		},
		
		initFontSize: function() {
			var fontSize = $.cookie("fontSize");	// get cookie
			if (!fontSize) {
				// set cookie and check if it succeeded:
				$.cookie("fontSize", "normal", { expires: 30 });
				fontSize = $.cookie("fontSize");
				if (!fontSize) {
					return;	// no cookie support: abort (otherwise reset on every page)
				}
			}
			
			// create #fontSize:
			var fontSizeItems = "";
			var selected;
			for (var fs in $.config.get().fontSize.titles) {
				// choose stylesheet:
				var CSSlink = $("link[title='" + fs + "Fonts']").get(0);
				if (CSSlink) {
					CSSlink.disabled = (fs == fontSize) ? false : true;
					//alert(fs + "\n" + fontSize + "\n" + CSSlink.disabled);
				}
				
				// create fontSize button:
				fontSizeItems += '<li id="' + fs + '"><a href="#" title="' + $.config.get().fontSize.titles[fs] + '">' + $.config.get().fontSize.symbol + '</a></li>';
			}
			var fontSizeMenu = '<div id="fontSize"><p class="offScreen"><em>' + $.config.get().fontSize.header + '</em></p><ul class="nav ' + fontSize + '">' + fontSizeItems + '</ul></div>';
			
			// add #fontSize to DOM:
			var siteSearch = $("#siteSearch");
			if (siteSearch.length > 0) {
				siteSearch.before(fontSizeMenu);
			} else {
				$("#mainNav").after(fontSizeMenu);
			}
			
			// handle click events:
			$("#fontSize li").click( function(e) {
				e.preventDefault();
				
				var fontSize = $.cookie("fontSize");
				
				var jParent = $(this).parent().eq(0);
				if (jParent.hasClass(this.id)) {
					return;
				}
				
				// disable current stylesheet:
				var oldCSSlink = $("link[title='" + fontSize + "Fonts']").get(0);
				if (oldCSSlink) {
					oldCSSlink.disabled = true;
				}
				
				// enable new stylesheet:
				var newFontSize = this.id;
				var newCSSlink = $("link[title='" + newFontSize + "Fonts']").get(0);
				if (newCSSlink) {
					newCSSlink.disabled = false;
				}
				
				// set cookie + correct className:
				$.cookie("fontSize", newFontSize, { expires: 30 });
				jParent.removeClass(fontSize).addClass(newFontSize);
			});
		},
		
		addJSLinks: function() {
			$.initPrintPage();
			$.returnLinks("#accessDenied", "back");
			if ($.config.get("isPopup")) {
				$.returnLinks("#sendPageDone", "close");
			}
		},
		
		initPrintPage: function() {
			if (window.print) {
				$("#pageTools ul.nav").prepend('<li id="printPage"><a href="#">' + $.config.get().printLabel + '</a></li>');
				$("#printPage").click( function(e) {
					e.preventDefault();
					window.print();
				});
			}
		},
		
		returnLinks: function(parentSelector, type) {
			if (!parentSelector) { return; }
			if (!type) { type = "back" }
			
			var returnLink = $.config.get("jsLinks")[type].replace(/(.*)\[(.*)\](.*)/, '<p class="' + type + '">$1<a href="#">$2</a>$3</p>');
			$(parentSelector).append(returnLink);
			
			// go back:
			$("p.back a").click(function(e) {
				e.preventDefault();
				window.history.back();
			});
			
			// close window:
			$("p.close a").click(function(e) {
				e.preventDefault();
				window.close();
			});
		},
		
		initHomeLeads: function() {
			$("#homeLeads>li, #homeLeads>li span.altLogo").hover(
				function() {
					$(this).addClass("jsHover");
				},
				function() {
					$(this).removeClass("jsHover");
				});
		},
		
		keywordSuggest: function() {
			var zwForm = $("#" + $.config.get().zwSearch.form);
			var zwInput = $("#" + $.config.get().zwSearch.input);
			var swSuggestID = $.config.get().zwSearch.flyout;
			
			var xhr;
			var url = $("#zwKeywords").attr("action");
			
			zwInput.focus(zwFocus);
			zwInput.blur(zwBlur);
			
			// add suggest container:
			zwInput.wrap('<div></div>').after('<div id="' + swSuggestID + '"></div>');
			var suggest = $("#" + swSuggestID);
			if (suggest.length == 0) { return; }
			
			suggest.find("a").live("click", function(e){
				e.preventDefault();
				zwInput.val($(this).text());
				zwForm.submit();
			});
			
			// empty zwSuggest when focus goes elsewhere:
			$(document.body).bind("click", elsewhere);
			$("#headerContent.zoekwijzer *").bind("focus", elsewhere);
			
			function elsewhere(e) {
				if (!$(e.target).is("#" + $.config.get().zwSearch.form + " *")) {
					zwBlur();
					updateSuggest();
				}
			};
			
			function zwFocus() {
				zwForm.addClass("jsFocus");
			};
			
			function zwBlur() {
				zwForm.removeClass("jsFocus");
			};
			
			function updateSuggest(html, prop) {
				suggest.empty();
				if (html) {
					// append suggestions:
					suggest.append(html);
					if (prop) {
						// cache suggestions:
						suggest.data(prop, html);
					}
				}
			};
			
			function passFocus(jNode, next) {
				var toItem;
				
				if (jNode && jNode.filter("a").length > 0) {
					// focus is on link
					var fromItem = jNode.closest("li");
					toItem = next ? fromItem.next() : fromItem.prev();
				}
				else if (next) {
					// focus is on keywords input
					toItem = suggest.find("li:first");
				}
				
				if (toItem && toItem.length > 0) {
					zwInput.blur();
					toItem.find("a:first").focus();
				}
				else if (!next) {
					zwInput.focus();
				}
			};
			
			zwForm.keyup(function(e){
					var jTarget = $(e.target);
					
					if (e.keyCode == 38 || e.keyCode == 40) {
						// arrow keys
						var next = (e.keyCode == 38) ? false : true;
						passFocus(jTarget.filter("input:text, a"), next);
					}
					else if (jTarget.attr("id") == $.config.get().zwSearch.input) {
						// focus is on keywords input
						var val = jTarget.val();
						
						// make suggestion only if input contains 2 or more characters:
						if (val.length > 1) {
							var cache = suggest.data(val);
							if (cache) {
								// update from cache:
								updateSuggest(cache);
							} else {
								if (xhr) {
									// abort previous ajax call:
									xhr.abort();
								}
								
								var data = { ajax: true };
								data[$.config.get().zwSearch.input] = val;
								// make ajax call:
								xhr = $.ajax({
									url:		url,
									type:		"POST",
									data:		data,
									timeout:	1000,
									dataType:	"html",
									error:		function() {
													updateSuggest();
												},
									success:	function(data) {
													updateSuggest(data, val);
												}
								});
							}
						} else {
							updateSuggest();
						}
					}
				});
		},
		
		hoverBodyParts: function() {
			$("#zwBodyParts li").hover(
				function() { $(this).addClass("jsHover"); },
				function() { $(this).removeClass("jsHover"); }
			);
		},
		
		popImages: function() {
			var links = $.config.get().popImages;
			for (lnk in links) {
				$("#" + lnk).popLink({width:links[lnk][0], height:links[lnk][1]})
			}
		},
		
		zwLinksExpand: function() {
			var x = $("#zwLinks ul.overview>li h3");
			$("#zwLinks ul.overview>li h3")
				.click(function(e){
					e.preventDefault();
					$(this)
						.siblings("ul")
						.slideToggle("fast", function() {
							$(this).parent().toggleClass("expand");
						});
				});
		},
		
		alphaNumNav: function() {
			var alphaNum = $("ol.alphaNum");
			var overview = alphaNum.parent().find("ol.overview, #wachttijden");
			if (alphaNum.length == 0 || overview.length == 0) { return; }
			
			var currChar = window.location.hash || alphaNum.find("li a").eq(0).attr("href");
			currChar = currChar.substring(1);
			var currExpr, prevChar, prevExpr;
			
			var overviewItems = overview.find("li:not(ol.overview li li), tbody");
			
			alphaNum.find("a[href$='" + currChar + "']").parent().addClass("selected");
			if (currChar != "alpha_all") {
				overviewItems.filter("li:not(." + currChar + "), tbody:not(." + currChar + ")").addClass("jsHide");
			}
			
			alphaNum.find("a")
				.click(function(e) {
					e.preventDefault();
					var jThis = $(this);
					prevChar = currChar;
					currChar = jThis.attr("href").substring(1);
					if (prevChar) {
						prevExpr = (prevChar == "alpha_all") ? "" : "." + prevChar;
						overviewItems.filter("li" + prevExpr + ", tbody" + prevExpr).addClass("jsHide");
					}
					currExpr = (currChar == "alpha_all") ? "" : "." + currChar;
					overviewItems.filter("li" + currExpr + ", tbody" + currExpr).removeClass("jsHide");
					alphaNum.find("li.selected").removeClass("selected");
					jThis.parent().addClass("selected");
					$("#" + currChar).focus();
				});
		}
		
	} );
	
	$.fn.extend( {
		validateForm: function(checkObj) {
			/* optional checkObj keys:
				{
					required: Boolean (default: true),
					pattern: RegExp, or one of the keys in config.patterns (e.g. "email"),
					label: String (name used in error message),
					error: String (additional error message)
				} 	*/
			var config = {
				defProps:	{
								required: true
							},
				errorMsg:	"De volgende velden zijn niet (juist) ingevuld:",
				patterns:	{
								email: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i
							}
			};
			for (field in checkObj) {
				var fieldObj = checkObj[field];
				for (prop in config.defProps) {
					if (fieldObj[prop] == null) {
						fieldObj[prop] = config.defProps[prop];
					}
				}
				if (fieldObj.pattern && config.patterns[fieldObj.pattern]) {
					fieldObj.pattern = config.patterns[fieldObj.pattern];
				}
				if (!fieldObj.label) {
					fieldObj.label = field;
				}
			}
			
			var jThis = $(this);
			var fields = jThis.is("form :input") ? jThis : jThis.find(":input:not(:hidden)");
			fields.each(function() {
				var jThis = $(this);
				jThis.data("valObj", checkObj[jThis.attr("name")]);
			});
			var jForm = $($.unique(fields.closest("form")));
			jForm.submit(function(e) {
				var jThis = $(this),
					errorStr = "",
					firstItem,
					fieldsDone = {};
				jThis.find(":input:not(:hidden)")
					.each(function() {
						var jThis = $(this);
						var name = jThis.attr("name");
						if (name && !fieldsDone[name]) {
							fieldsDone[name] = true;
							var value = jThis.attr("type") == "radio" ? $("input[name='" + name + "']:checked").val() : jThis.val();
							var valObj = jThis.data("valObj");
							if (valObj) {
								if ((valObj.required && !value) || (value && valObj.pattern && !value.match(new RegExp(valObj.pattern)))) {
									errorStr += "\n- " + valObj.label;
									if (valObj.error) {
										errorStr += " (" + valObj.error + ")";
									}
									if (!firstItem) {
										firstItem = jThis;
									}
								}
							}
						}
					});
				if (errorStr != "") {
					e.preventDefault();
					alert(config.errorMsg + errorStr);
					firstItem.focus();
				}
			});
		}
	} );
} )(jQuery);

jQuery( function( $ ) {
	
	// extend $.config with window.config (if any):
	$.config.extend(window.config);

	// init #siteSearch (overLabel + button image [onfocus]):
	$.initSiteSearch();
	
	// init #fontSize:
	$.initFontSize();
	
	// add JavaScript links (print, back):
	$.addJSLinks();
	
	// init #homeLeads (hover):
	$.initHomeLeads();
	
	// init #siteNav (expand/collapse)
	$.initSiteNav();
	
	// keywordSuggest:
	//$.keywordSuggest();
	
	// metabin:
	$.zwLinksExpand();
	
	// fix IE6 bodyParts hovering (z-index):
	$.hoverBodyParts();
	
	// popImages:
	$.popImages();
	
	// init alphanumeric (in page) navigation:
	$.alphaNumNav();
	
	// popLinks:
	$("#sendPage a").popLink({ width: 540, height: 600, props: ["resizable", "scrollbars"] });
	
	// validate forms:
	$("#email_form").validateForm({
			"fields[uwnaam]": { label: "Uw naam" },
			"fields[uwemail]": { label: "Uw e-mailadres", pattern: "email", error: "vul één geldig e-mailadres in" },
			"fields[naam]": { label: "Naam van de ontvanger" },
			"fields[email]": { label: "E-mailadres van de ontvanger", pattern: "email", error: "vul één geldig e-mailadres in" },
			"fields[onderwerp]": { label: "Onderwerp" }
	});

} );