/*
 *	jQuery ajaxContactForm
 *	www.frebsite.nl
 *	Copyright (c) 2009 Fred Heusschen
 *	Licensed under the MIT license.
 *	http://www.opensource.org/licenses/mit-license.php
 */

(function($) {
    $.fn.ajaxContactForm = function(act, opts) {

        return this.each(function() {

            var t = this;
            var f = $(this);
            f.prepend('<input type="text" name="bottrap" value="" style="display: none;" />');

            var options 	= $.extend({}, $.fn.ajaxContactForm.defaults, opts);
            var submit_btn	= ($(':submit', f).length) ? $(':submit', f) : $(options.submitButton, f);
            var reset_btn	= ($(':reset',  f).length) ? $(':reset',  f) : $(options.resetButton, f);
            var action		= (act == undefined) ? '' : act;

            $('input, textarea', f).each(function() {
                if ($.fn.ajaxContactForm.is_invoerveld($(this))) {
                    $(this).focus(function() {
                        $(this).addClass('focussed');
                    });
                    $(this).blur(function() {
                        $(this).removeClass('focussed');
                        if (!$.fn.ajaxContactForm.test_veld($(this))) {
                            options.falseFieldFunc($(this));
                        } else {
                            options.rightFieldFunc($(this));
                        }
                    });
                }
            });

            submit_btn.click(function() {
                f.css('opacity', '0.5');

                var miss_arr = new Array();
                var data_arr = new Array();

                $('input, textarea, select', f).each(function(i) {
                    if ($.fn.ajaxContactForm.is_invoerveld($(this))) {
                        var veld = $(this);
                        var name = veld.attr('name');
                        var valu = veld.val();

                        if ($.fn.ajaxContactForm.test_veld(veld)) {
                            if (veld.attr('type') == 'radio' 	&& !veld.is(':checked'))	valu = '';
                            if (veld.attr('type') == 'checkbox'	&& !veld.is(':checked')) 	valu = '';

                            if (valu.length > 0) {
                                data_arr.push(name+'='+escape(valu));
                            }
                        } else	miss_arr.push($(this));
                    }
                });
                //	niet goedkeuren
                if (miss_arr.length > 0 || data_arr.length == 0) {
                    options.falseMessageFunc(options.language);
                    f.css('opacity', '1');
                    for (var z = 0; z < miss_arr.length; z++) {
                        options.falseFieldFunc(miss_arr[z]);
                    }
                    return false;

                //	goedkeuren en versturen
                } else {

                    //	via ajax versturen
                    if (action != '') {
                        data_arr.push('language='+options.language);
                        for (var i in options.extraValues) {
                            data_arr.push(i+'='+options.extraValues[i]);
                        }
                        var vals = data_arr.join('&');

                        $.ajax({
                            type: options.method,
                            url: action,
                            data: 'ajaxcontactform=ajaxcontactform&'+vals,
                            success: function(msg) {
                                var msg = msg.split('___');

                                if (msg[0].toUpperCase() != 'Y')	{
                                    options.errorMessageFunc(msg[1]);
                                } else {
                                    options.succesMessageFunc(msg[1], f);
                                }
                                f.css('opacity', '1');
                            },
                            error: function() {
                                options.errorMessageFunc('Error, file not found');
                                f.css('opacity', '1');
                            }
                        });
                        return false;

                    //	via form versturen
                    } else {
                        f.css('opacity', '1');
                        if (t.nodeName.toLowerCase() == 'form') {
                            return true;
                        }
                        return false;
                    }
                }
            });
            reset_btn.click(function() {
                if (t.nodeName.toLowerCase() == 'form') {
                    $.fn.ajaxContactForm.resetForm(f);
                } else {
                    $.fn.ajaxContactForm.clearForm(f);
                }
                return false;
            });
        });
    };

    $.fn.ajaxContactForm.defaults = {
        submitButton:		'.submit',
        resetButton:		'.reset',
        method:				'POST',
        language:			'nl',
        extraValues:		{},
        falseFieldFunc:		function(veld) {
            veld.effect("highlight", {
                color: '#dd0000'
            }, 1000);
            veld.parent().parent().find(".valide").css("display", "none");
            veld.parent().parent().find(".error").css("display", "block");
        },
        falseMessageFunc:	function(lang) {
            switch (lang) {
                case 'en':
                    msg = "Attention, not all the fields have been filled out correctly.";
                    break;

                case 'fr':
                    msg = "Attention, tous les champs ne sont pas correctement remplis.";
                    break;

                case 'de':
                    msg = "Achtung, nicht alle Felder sind korrekt ausgefuellt.";
                    break;

                default:
                    msg = "Let op, niet alle velden zijn correct ingevuld.";
                    break;
            }
            //alert(msg);
            //$("#false.tooltip").css("display", "block");
            var $dialog = $('<div></div>')
            .html(msg)
            .dialog({
                autoOpen: false,
                title: "Attention",
                buttons: { "Ok": function() { $(this).dialog("close"); }},
                resizable: false,
                modal: true,
		width: 460,
            });
            $dialog.dialog('open');
        },
        errorMessageFunc:	function(msg) {
        //alert(msg);
            var $dialog = $('<div></div>')
            .html(msg)
            .dialog({
                autoOpen: false,
                title: "Attention",
                buttons: { "Ok": function() { $(this).dialog("close"); }},
                resizable: false,
                modal: true,
		width: 460
            });
            $dialog.dialog('open');
        },
        succesMessageFunc:	function(msg, form) {
            $.fn.ajaxContactForm.clearForm(form);
            //alert(msg);
            var $dialog = $('<div></div>')
            .html(msg)
            .dialog({
                autoOpen: false,
                title: "Attention",
                buttons: { "Ok": function() { $(this).dialog("close"); }},
                resizable: false,
                modal: true,
		width: 460
            });
            $dialog.dialog('open');
        },
        rightFieldFunc:		function(veld) {
            veld.effect("highlight", {
                color: '#3DF500'
            }, 1000);
            veld.parent().parent().find(".error").css("display", "none");
            veld.parent().parent().find(".valide").css("display", "block");
        }
    };

    $.fn.ajaxContactForm.clearForm = function(form) {
        $('input, textarea, select', form).each(function() {
            var type	= this.type.toLowerCase();
            var tag		= this.tagName.toLowerCase();
            
            //$(document).find(".tooltip").css("display", "none");
            $(this).parent().find(".error").css("display", "none");
            $(this).parent().find(".valide").css("display", "none");
            if (type == 'text' || type == 'password' || tag == 'textarea') this.value = '';
            else if (type == 'checkbox' || type == 'radio') this.checked = false;
            else if (tag == 'select') this.selectedIndex = 0;
        });

    };
    $.fn.ajaxContactForm.resetForm = function(form) {
        form.get(0).reset();
    }
    $.fn.ajaxContactForm.test_v = function(name, valu, veld) {
        if (name.indexOf('_v') == -1) 	return true;
        if (jQuery.trim(valu).length < 1) return false;

        if ((veld.attr('type') == 'radio' || veld.attr('type') == 'checkbox')
            && !veld.is(':checked')) return false;
        return true;
    };
    $.fn.ajaxContactForm.test_n = function(name, valu) {
        if (name.indexOf('_n') == -1) 	return true;

        var vervangen = new Array(' ', '-', '+', '(', ')', '/', '\\');
        for (var i = 0; i < vervangen.length; i++)	{
            valu = valu.split(vervangen[i]).join('');
        }
        if (valu.length == 0) return true;
        else if (isNaN(valu)) return false;
        return true;
    };
    $.fn.ajaxContactForm.test_e = function(name, valu) {
        if (name.indexOf('_e') == -1) return true;
        if (valu.length < 1) return true;
        if (valu.indexOf("@") != -1 &&
            valu.indexOf(".") != -1 &&
            valu.length > 4
            ) {
            return true;
        } else return false;
    };
    $.fn.ajaxContactForm.test_veld = function(veld) {
        var name = veld.attr('name');
        var valu = veld.attr('value');

        if ($.fn.ajaxContactForm.test_v(name, valu, veld) 	&&
            $.fn.ajaxContactForm.test_n(name, valu) 		&&
            $.fn.ajaxContactForm.test_e(name, valu)
            ) {
            return true;
        } else return false
    };
    $.fn.ajaxContactForm.is_invoerveld = function(veld) {
        if (veld.attr('type') == 'button') 	return false;
        if (veld.attr('type') == 'submit') 	return false;
        if (veld.attr('type') == 'reset') 	return false;
        if (veld.attr('name') == 'bottrap')	return false;
        return true;
    }


})(jQuery);

