/* === juvans.js === */


(function($) {
	$.extend( {
		
		config: (function() {
			// Put config settings in confObj (private):
			var confObj = {
				reqPassword:		{
										forgotLink:	"Wachtwoord vergeten?",
										backLink:	"Terug naar inloggen"
									},
				nlMonths:			[ "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december" ]
			};
			
			// 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};
		})(),
		
		requestPassword: function() {
			var emailServiceForm = $("#emailService #searchForm");
			var reqPassword = emailServiceForm.find("#requestPassword");
			var action = emailServiceForm.find("#actieField");
			var login = emailServiceForm.find("#login");
			if (!login || login.length == 0 || !reqPassword || reqPassword.length == 0) { return; }
			
			emailServiceForm.addClass("jsSwap");
			var links = $.config.get("reqPassword");
			login.append('<p class="swapLink"><a href="#">' + links.forgotLink + '</a></p>');
			reqPassword.append('<p class="swapLink"><a href="#">' + links.backLink + '</a></p>');
			emailServiceForm
				.find("p.swapLink a")
				.click(function(e) {
					e.preventDefault();
					emailServiceForm.toggleClass("jsRequest");
					emailServiceForm.hasClass("jsRequest") ? action.val("wachtwoord") : action.val("inloggen");
				})
		},
		
		emailDays: function() {
			var days = $("#searchForm.emailServiceProfile #dagen");
			var val;
			days
				.keyup(function() {
					// validate value:
					var jThis = $(this);
					val = jThis.val();
					var absIntVal = Math.abs(parseInt(val), 10);
					if (val != absIntVal && val != "") {
						val = absIntVal;
					}
					if (isNaN(val)) {
						val = 0;
					}
					if (val > 999) {
						val = 999;
					}
					jThis.val(val);
					
					calcDate(val);
				})
				.blur(function() {
					// validate value:
					var jThis = $(this);
					if (jThis.val() == "") {
						jThis.val("0");
						val = 0;
					}
					calcDate(val);
				});
				
			function calcDate(period) {
				if (period > 0) {
					var today = new Date();
					var futureDate = new Date(today.getTime() + 86400000 * period);	// 24 * 60 *60 * 1000 = 86400000 milliseconds in a day
					var dateTxt = futureDate.getDate() + " " + $.config.get("nlMonths")[futureDate.getMonth] + " " + futureDate.getFullYear();
					var endDate = $("#verloopdatum");
					var finalDate = $("#finalDate");
					if (finalDate.length == 0) {
						endDate.before(', tot <span id="finalDate">' + dateTxt + '</span>');
						finalDate = $("#finalDate");
					}
					finalDate.text(futureDate.toLocaleDateString());
					endDate.val(
						leadingZero(futureDate.getDate()) + " " + 
						leadingZero(futureDate.getMonth()) + " " + 
						futureDate.getFullYear()
					);
				}
			}
			
			function leadingZero(str) {
				return str.length == 2 ? str : "0" + str;
			}
		}
	} );
	
	$.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);
				var errorStr = "";
				var firstItem;
				var radioButtons = [];
				jForm.find(":radio")
					.each(function() {
						var name = $(this).attr("name");
				   		if (name && $.inArray(name, radioButtons) < 0) {
							radioButtons.push(name);
						}
					});
				jForm.find(":input:not(:hidden)")
					.each(function() {
						var jThis = $(this);
						var name = jThis.attr("name");
						var nameIndex = $.inArray(name, radioButtons);
						if (nameIndex != -1) {
							var checkedRadio = jForm.find(":radio[name='" + radioButtons[nameIndex] + "']:checked");
							var value = checkedRadio.val();
							radioButtons.splice(nameIndex, 1);
						} else {
							var value = 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);
	
	// requestPassword swap:
	$.requestPassword();
	
	// validate forms:
	var validJobAppl = {
		"s[Naam]": { label: "Naam" },
		"s[Adres]": { label: "Adres" },
		"s[Postcode]": { label: "Postcode" },
		"s[Plaats]": { label: "Plaats" },
		"s[Telefoon]": { label: "Telefoon" },
		"s[Email]": { label: "E-mailadres", pattern: "email", error: "vul een geldig e-mailadres in" },
		"s[Geslacht]": { label: "Geslacht" },
		"file_upload_brief": { label: "Sollicitatiebrief" },
		"file_upload_cv": { label: "CV" }
	};
	$("#applyForJob").validateForm(validJobAppl);
	
	// set final date email service:
	$.emailDays();
	
} );
