var FormValidator = function () {

	"use strict";

	var validateCheckRadio = function (val) {

        $("input[type='radio'], input[type='checkbox']").on('ifChecked', function(event) {

			$(this).parent().closest(".has-error").removeClass("has-error").addClass("has-success").find(".help-block").hide().end().find('.symbol').addClass('ok');

		});

    }; 

    // function to initiate Validation Sample 1

    var runValidator1 = function () {

        var form1 = $('#form');

        var errorHandler1 = $('.errorHandler', form1);

        var successHandler1 = $('.successHandler', form1);

        $.validator.addMethod("FullDate", function () {

            //if all values are selected

            if ($("#dd").val() != "" && $("#mm").val() != "" && $("#yyyy").val() != "") {

                return true;

            } else {

                return false;

            }

        }, 'Please select a day, month, and year');

        $('#form').validate({

            errorElement: "span", // contain the error msg in a span tag

            errorClass: 'help-block',

            errorPlacement: function (error, element) { // render error placement for each input type

                if (element.attr("type") == "radio" || element.attr("type") == "checkbox") { // for chosen elements, need to insert the error after the chosen container

                    error.insertAfter($(element).closest('.form-group').children('div').children().last());

                } else if (element.attr("name") == "dd" || element.attr("name") == "mm" || element.attr("name") == "yyyy") {

                    error.insertAfter($(element).closest('.form-group').children('div'));

                } else {

                    error.insertAfter(element);

                    // for other inputs, just perform default behavior

                }

            },

            ignore: "",

            rules: {

                firstname: {

                    minlength: 2,

                    required: true

                },

                lastname: {

                    minlength: 2,

                    required: true

                },

                email: {

                    required: true,

                    email: true

                },

                password: {

                    minlength: 6,

                    required: true

                },

                password_again: {

                    required: true,

                    minlength: 5,

                    equalTo: "#password"

                },

                yyyy: "FullDate",

                gender: {

                    required: true

                },

                zipcode: {

                    required: true,

                    number: true,

                    minlength: 5

                },

                city: {

                    required: true

                },

                newsletter: {

                    required: true

                }

            },

            messages: {

                firstname: "Please specify your first name",

                lastname: "Please specify your last name",

                email: {

                    required: "We need your email address to contact you",

                    email: "Your email address must be in the format of name@domain.com"

                },

                gender: "Please check a gender!"

            },

            groups: {

                DateofBirth: "dd mm yyyy",

            },

            invalidHandler: function (event, validator) { //display error alert on form submit

                successHandler1.hide();

                errorHandler1.show();

            },

            highlight: function (element) {

                $(element).closest('.help-block').removeClass('valid');

                // display OK icon

                $(element).closest('.form-group').removeClass('has-success').addClass('has-error').find('.symbol').removeClass('ok').addClass('required');

                // add the Bootstrap error class to the control group

            },

            unhighlight: function (element) { // revert the change done by hightlight

                $(element).closest('.form-group').removeClass('has-error');

                // set error class to the control group

            },

            success: function (label, element) {

                label.addClass('help-block valid');

                // mark the current input as valid and display OK icon

                $(element).closest('.form-group').removeClass('has-error').addClass('has-success').find('.symbol').removeClass('required').addClass('ok');

            },

            submitHandler: function (form) {

                successHandler1.show();

                errorHandler1.hide();

                // submit form

                //$('#form').submit();

            }

        });

    };

    // function to initiate Validation Sample 2

    var runValidator2 = function () {

        var form2 = $('#form2');

        var errorHandler2 = $('.errorHandler', form2);

        var successHandler2 = $('.successHandler', form2);

        $.validator.addMethod("getEditorValue", function () {

            $("#editor1").val($('#form2 .summernote').code());

            if ($("#editor1").val() != "" && $("#editor1").val().replace(/(<([^>]+)>)/ig, "") != "") {

                $('#editor1').val('');

                return true;

            } else {

                return false;

            }

        }, 'This field is required.');

        form2.validate({

            errorElement: "span", // contain the error msg in a small tag

            errorClass: 'help-block',

            errorPlacement: function (error, element) { // render error placement for each input type

                if (element.attr("type") == "radio" || element.attr("type") == "checkbox") { // for chosen elements, need to insert the error after the chosen container

                    error.insertAfter($(element).closest('.form-group').children('div').children().last());

                } else if (element.hasClass("ckeditor")) {

                    error.appendTo($(element).closest('.form-group'));

                } else {

                    error.insertAfter(element);

                    // for other inputs, just perform default behavior

                }

            },

            ignore: "",

            rules: {

                firstname2: {

                    minlength: 2,

                    required: true

                },

                lastname2: {

                    minlength: 2,

                    required: true

                },

                email2: {

                    required: true,

                    email: true

                },

                occupation: {

                    required: true

                },

                dropdown: {

                    required: true

                },

                services: {

                    required: true,

                    minlength: 2

                },

                creditcard: {

                    required: true,

                    creditcard: true

                },

                url: {

                    required: true,

                    url: true

                },

                zipcode2: {

                    required: true,

                    number: true,

                    minlength: 5

                },

                city2: {

                    required: true

                },

                editor1: "getEditorValue",

                editor2: {

                    required: true

                }

            },

            messages: {

                firstname: "Please specify your first name",

                lastname: "Please specify your last name",

                email: {

                    required: "We need your email address to contact you",

                    email: "Your email address must be in the format of name@domain.com"

                },

                services: {

                    minlength: jQuery.validator.format("Please select  at least {0} types of Service")

                }

            },

            invalidHandler: function (event, validator) { //display error alert on form submit

                successHandler2.hide();

                errorHandler2.show();

            },

            highlight: function (element) {

                $(element).closest('.help-block').removeClass('valid');

                // display OK icon

                $(element).closest('.form-group').removeClass('has-success').addClass('has-error').find('.symbol').removeClass('ok').addClass('required');

                // add the Bootstrap error class to the control group

            },

            unhighlight: function (element) { // revert the change done by hightlight

                $(element).closest('.form-group').removeClass('has-error');

                // set error class to the control group

            },

            success: function (label, element) {

                label.addClass('help-block valid');

                // mark the current input as valid and display OK icon

                $(element).closest('.form-group').removeClass('has-error').addClass('has-success').find('.symbol').removeClass('required').addClass('ok');

            },

            submitHandler: function (form) {

                successHandler2.show();

                errorHandler2.hide();

                // submit form

                //$('#form2').submit();

            }

        });

        CKEDITOR.disableAutoInline = true;

        $('textarea.ckeditor').ckeditor();

    };

    return {

        //main function to initiate template pages

        init: function () {

        	validateCheckRadio();

            runValidator1();

            runValidator2();

        }

    };

}();