/******************************************
 * Autodealers jQuery library
 * Copyright Autodealers 2010
 ******************************************
 * versie: 1.0.0
 * schrijver: Jaap, Frank, Corben
 * 
 * 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
 * worden bijgevoegd.
 */


/******************************************
 * 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
	}
	
	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;
			if ($.isFunction(opties.voorVersturen)) {
				opties.voorVersturen.call(this);
			}
			
			var validatieResult;
			
			if ($.isFunction(opties.validatie)) {
				validatieResult = opties.validatie.call(this);
			} else if (opties.validatie == true) {
				validatieResult = $(opties.inputContainer).valideerFormulier({
					markeerVelden: opties.markeerVelden
				});
			} else {
				validatieResult = true;
			}
			
			if (validatieResult == true) {
				$.post(opties.url, data, function(resultaat, textStatus){
					if ($.isFunction(opties.naVersturen)) {
						opties.naVersturen.call(this, resultaat);
					} else {
						showBericht(resultaat, "success");
					}
				});
			} else {
				if ($.isFunction(opties.validatieWeergave)) {
					opties.validatieWeergave.call(this, validatieWeergave);
				} else {
					showBericht(validatieResult, "error");
				}
			}
		}
	} // 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, customClass) {
		
		if (opties.berichtOpties == null) {
			opties.berichtOpties.customClass = customClass;
		} else if(opties.berichtOpties.customClass == null) {
			opties.berichtOpties.customClass = customClass;
		}
		$(root).bericht(berichtText, opties.berichtOpties);
	}
	
	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 {
            // 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
                // verwerk label
                var pattern = /[\*\s]+/;
                var strippedLabel = $(labelSelector).text().replace(pattern, "").toLowerCase();
                return strippedLabel;
            } else {
                return "default tekst";
            }
        }
    }

    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 = /^[\-\;\w\.\,\:]{1,}([\-\;\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 = {
		container: "",
		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
 *****************************************/
 /******************************************
 * Begin slider jquery plugin
 *****************************************/
  $.fn.slideshow = function(obj){
  if(obj == undefined){var obj = {}}
  	var self = $(this);
    var t = (obj.time == undefined) ? 1500 : obj.time;
    var d = (obj.delay == undefined) ? 1500 : obj.delay;
    slide(self.children(":first").fadeIn());
   		function slide(e){
           e.fadeOut(t);
           e = (e.next().length == 0) ? self.children(":first") : e.next();
               e.fadeIn(t, function(){
                        var el = $(this);
                     setTimeout(function(){
                        slide(el);
                    }, d);
               });
       }
}

 /******************************************
 * einde slider jquery plugin
 *****************************************/

