/******************************************
 * Autodealers jQuery library
 * Copyright Autodealers 2010
 ******************************************
 * versie: 1.0.1
 * schrijver: Jaap van Hardeveld
 * 
 * omschrijving: Dit is de autodealers
 * jQuery library. De plugins in deze 
 * library hebben de volgende relaties
 * 
 * verzendFormulier: 	-> bericht
 * -> valideerFormulier
 * 
 * valideerFormulier: 	-> valideerVeld
 * 
 * Wanneer plugins los gebruikt worden is
 * het belangrijk dat benodige plugins ook
 */


/******************************************
 * Autodealers verzend jquery plugin
 *****************************************/

$.fn.verzendFormulier = function(opties) {
	
	// root handler
	var root = this;
	// default opties
	var defaults = {
		url: "verzendemail.ashx",
		formulier: "form",
		inputContainer: null,
		customData: null,
		voorVersturen: null,
		naVersturen: null,
		validatie: false,
		validatieWeergave: null,
		markeerVelden: false,
		berichtOpties: null,
		serverResponse: null
	}
	
	opties = $.extend(defaults, opties); // overschrijf de defaults
	
	if(opties.inputContainer == null) { // als er geen input container is
		opties.inputContainer = opties.formulier; // formulier als selector gebruiken
	}
	
	function submitForm(inputsContainer) {
		data = prepData();
		if (data.length > 0) { // als de data goed is geprepareerd
			// var data = preppedData;
			
			var validatieResult;
			
			if ($.isFunction(opties.validatie)) {
				validatieResult = opties.validatie.call(this, opties.inputContainer);
			} else if (opties.validatie == true) {
				validatieResult = $(opties.inputContainer).valideerFormulier({
					markeerVelden: opties.markeerVelden
				});
			} else {
				validatieResult = true;
			}
			
			if (validatieResult == true) {
				// voor versturen callback
				if ($.isFunction(opties.voorVersturen)) {
					var voorVersturenCallback = opties.voorVersturen.call(this);
					if (voorVersturenCallback == false) {
						return false;
					}
				}
				
				// versturen
				$.post(opties.url, data, function(resultaat, textStatus){
					
					// na vesturen callback
					if ($.isFunction(opties.naVersturen)) {
						opties.naVersturen.call(this, resultaat);
					} else {
						showBericht(resultaat, "success");
						return false;
					}
				},opties.serverResponse);
			} else {
				if ($.isFunction(opties.validatieWeergave)) {
					opties.validatieWeergave.call(this, validatieResult);
				} else {
					showBericht(validatieResult, "error");
					return false;
				}
			}
		}
	} // einde submitForm
	
	function prepData() {
		var serializedVars = $(opties.formulier).serialize();
	
		if (typeof opties.customData == "function") {
			serializedVars = opties.customData.call(this, serializedVars);
		}
		
		return serializedVars;
	} // einde prepData
	
	function showBericht(berichtText, customClassNaam) {
		if (opties.berichtOpties == null) {
			opties.berichtOpties = {
				customClass: customClassNaam
			};
			
		} else if(opties.berichtOpties.customClassNaam == null) {
			opties.berichtOpties.customClass = customClassNaam;
		}
		$(root).bericht(berichtText, opties.berichtOpties);
	}
	
	return submitForm();
}

/******************************************
 * einde verzendFormulier jquery plugin
 *****************************************/

/******************************************
 * Autodealers notify jquery plugin
 *****************************************/

$.fn.bericht = function(bericht, opties) {
	var root = this;
	
	var defaults = {
		x: $(root).offset().left,
		y: $(root).offset().top,
		duur: 3000,
		container: "#pagewrap",
		customClass: null,
		fadeInDuur: 150,
		fadeOutDuur: 150,
		boxclass: "adnotify_box",
		statisch: false,
		offset: {
			x: 0,
			y: 0
		}
	}
	
	opties = $.extend(defaults, opties); // overschrijf defaults met opties
	
	notify_class= "."+opties.boxclass;
	// verwijder ouwe box
	$(notify_class).fadeOut(opties.fadeOutDuur, function(){
		$(this).remove();
	});
	
	notify_box = $("<div class=\""+opties.boxclass+"\">" + bericht + "</div>");
	notify_box.hide().appendTo(opties.container);
	if (opties.customClass != null) {
		notify_box.addClass(opties.customClass);
	}
	
	var boxHeight = notify_box.height();
	notify_box.css({'top': opties.y - (boxHeight/2) + opties.offset.y, 'left' : opties.x + opties.offset.x, 'height' : boxHeight}).fadeIn(opties.fadeInDuur);
	if (opties.duur == 0) {
		$("body").bind("click", function() {
			notify_box.fadeOut(opties.fadeOutDuur, function(){
				notify_box.remove();
				notify_box.unbind("click");
			}).unbind("click");
			$("body").unbind("click");
		});
	} else if(opties.statisch == false) {
		t = setTimeout(function(){
			notify_box.fadeOut(opties.fadeOutDuur, function(){
				notify_box.remove();
				clearTimeout(t);
			});
		}, opties.duur);
	}
}

/******************************************
 * einde notify jquery plugin
 *****************************************/

 /******************************************
 * Autodealers valideerVeld jquery plugin
 *****************************************/

$.fn.valideerVeld = function(opties){
	var root = this;
	
	var defaults = {
		soortVeld: null,
		customLabel: null,
		errors: {
			email: {
				ongeldig: "Ingevoerde email is ongeldig",
				missend: "Er is geen email ingevoerd"
			},
			telefoon: {
				ongeldig: "Ingevoerd telefoonummer is ongeldig",
				missend: "Er is geen telefoonnummer ingevoerd"
			},
			postcode: {
				ongeldig: "Ingevoerd postcode is ongeldig",
				missend: "Er is geen postcode ingevoerd"
			},
			prijs: {
				ongeldig: "Ingevoerde prijs is ongeldig",
				missend: "Er is geen prijs ingevoerd"
			},
			text: {
				ongeldig: "Ingevoerde tekst is ongeldig",
				missend: "Er is geen tekst ingevoerd"
			}
		}
	};
	
	// labels updaten voor text fields
	
	defaults.errors.prijs.ongeldig = "Ingevoerde "+genereerLabel()+" is ongeldig";
	defaults.errors.prijs.missend = "Er is geen "+genereerLabel()+" ingevoerd";
	defaults.errors.text.ongeldig = "Ingevoerde "+genereerLabel()+" is ongeldig";
	defaults.errors.text.missend = "Er is geen "+genereerLabel()+" ingevoerd";
	
	opties = $.extend(defaults, opties);
	
	if (opties.soortVeld == null) {
		opties.soortVeld = parseClasses();
	}
	
	function valideer() {
		switch(opties.soortVeld) {
			case "email":
				if (valideerEmail()) {
					return true;
				} else {
					return genereerError();
				}
				break;
			case "telefoon":
				if (valideerTelefoon()) {
					return true;
				} else {
					return genereerError();
				}
				break;
			case "postcode":
				if (valideerPostcode()) {
					return true;
				} else {
					return genereerError();
				}
				break;
			case "prijs":
				if (valideerPrijs()) {
					return true;
				} else {
					return genereerError();
				}
				break;
			case "text":
				if (valideerText()) {
					return true;
				} else {
					return genereerError();
				}
				break;
			default:
				return false;
				break;
		}
	}
	
	function genereerError() {
		var error_object= {};
		error_object.veldNaam = $(root).attr("name");
		if ($(root).val().length < 1) {
			error_object.error_bericht = opties.errors[opties.soortVeld].missend;
			
		} else {
			error_object.error_bericht = opties.errors[opties.soortVeld].ongeldig;
		}
		return error_object;
	}
	
	function genereerLabel() {
		// check voor customLabel
		if (defaults.customLabel != null) { // geen custom label
			return defaults.customLabel;
		} else { 
			// probeer naam van veld te achterhalen
			if ($(root).attr("title").length > 0) { // als er een title attribuut aan de input zit
				return $(root).attr("title").toLowerCase();
			} else {
			
			
				// check voor label gekoppeld aan de input
				var inputID = $(root).attr("id");
				var labelSelector = "label[for=" + inputID + "]";
				
				if ($(labelSelector).length > 0) { // als er een label gevonden wordt
					// check voor title
					if ($(labelSelector).attr("title").length > 0) { // als er een title in de label zit
						return $(labelSelector).attr("title").toLowerCase();
					}
					else {
						// verwerk label
						var pattern = /[\*\s]+/;
						var strippedLabel = $(labelSelector).text().replace(pattern, "").toLowerCase();
						return strippedLabel;
					}
				}
				else {
					return "naamloos veld";
				}
			}
		}
	}
	
	function parseClasses() {
		if ($(root).hasClass("email")) {
			return "email";
		} else if($(root).hasClass("telefoon")) {
			return "telefoon";
		} else if($(root).hasClass("postcode")) {
			return "postcode";
		} else if($(root).hasClass("prijs")) {
			return "prijs";
		} else {
			return "text";
		}
	}
	
	function valideerEmail() {
		var emailPattern = /^[A-Za-z0-9_\-.]+@[A-Za-z0-9_\-.]+\.[A-Za-z]{2,4}$/;
		return emailTest = emailPattern.test($(root).val());
	}
	
	function valideerTelefoon() {
		var telefoonPattern = /^(\+)?[0-9]{8,}$/;
		var strippedTelefoon = $(root).val().replace(/[\(\)\s-]/g,"");
		return telefoonTest = telefoonPattern.test(strippedTelefoon);
	}
	
	function valideerPostcode() {
		var postcodePattern = /^[0-9]{4}[\s]*[A-Za-z]{2}$/;
		return postcodeTest = postcodePattern.test($(root).val());
	}
	
	function valideerPrijs() {
		var prijsPattern = /^[\d]+$/;
		var strippedPrijs = $(root).val().replace(/[a-zA-Z\,\-\s\.]/g, "");
		return prijsTest = prijsPattern.test(strippedPrijs);
	}
	
	function valideerText() {
		var textPattern = /^([\s]*)?[\w\-\_\.:]+([\s\w\-\_\.:]+)?$/;
		return textTest = textPattern.test($(root).val());
	}
	
	return valideer();
	
}
 
 /******************************************
 * einde valideerVeld jquery plugin
 *****************************************/

 /******************************************
 * Autodealers valideerFormulier jquery plugin
 *****************************************/

$.fn.valideerFormulier = function(opties){
	var root = this;
	
	var defaults = {
		markeerVelden: false,
		errorClass: "error"
	}
	
	opties = $.extend(defaults, opties); // defaults overschrijven met opties
	
	function valideer() {
		var valideerBericht = true;
		var valideerResultaten = [];
		
		$(root).find("input:text").each(function(i){ // voor elk veld wat gevonden wordt
			verwijderMarkering(this);
			if ($(this).hasClass("verplicht")) { // als veld verplicht is, valideren
				valideerResultaten[valideerResultaten.length] = $(this).valideerVeld();
			} else if($(this).val().length > 0) { // alleen als er iets is ingevoerd valideren wanneer niet verplicht
				valideerResultaten[valideerResultaten.length] = $(this).valideerVeld();
			}
		});
		
		for (var i=0; i < valideerResultaten.length; i++) {
			if (valideerResultaten[i] != true) {
				if (valideerBericht == true) {
					valideerBericht = valideerResultaten[i].error_bericht+"<br />";
				} else {
					valideerBericht += valideerResultaten[i].error_bericht+"<br />";
				}
				
				if (opties.markeerVelden == true) {
					markeerVeld(valideerResultaten[i].veldNaam);
				}
			}
		}
		
		return valideerBericht;
	}
	
	function markeerVeld(veldNaam) {
		var inputObject = $("input[name="+veldNaam+"]");
		inputObject.addClass(opties.errorClass);
		
		inputObject.bind("focus", function(){
			inputObject.removeClass(opties.errorClass);
			inputObject.unbind("focus");
		});
	}
	
	function verwijderMarkering(veldObject) {
		$(veldObject).removeClass(opties.errorClass);
	}
	
	return valideer();
}
 
 /******************************************
 * einde valideerFormulier jquery plugin
 *****************************************/
