(function ($) {

    $.fn.live_validation = function () {
        return this.each(function () {
            var $form = $(this);
            var $general_error = $form.find('.error-msg');
            var $inputs = $form.find('div.input.req input, div.input.req textarea').not(':checkbox').not(':button');

            // form submit
            $form.submit(function () {
                $inputs.trigger('blur', [false]); // trigger blur on all fields to validate                

                if ($(this).find('.input.error').size()) // prevent form from posting if errors are found
                {
                    $('.error-msg').fadeIn();
                    //                    $general_error.fadeIn();
                    $('html, body').animate({ scrollTop: 4 }, 'fast');
                    return false;
                }
            });

            // field focus
            $inputs.focus(function () {
                var $this = $(this);
                var $input_container = $this.parents('.input');
                var $msg_container = $input_container.find('.msg');
            });

            $inputs.keyup(function () {
                var $this = $(this);
                var $input_container = $this.parents('.input');
                var $msg_container = $input_container.find('.msg');

                if ($this.val() != '') {
                    if (methods.validate($this)) {

                        if ($this.attr('id') == "EmailAddress") {
                            methods.isEmailInUseReset($this);
                        } else {
                            $input_container.removeClass('error').addClass('success');
                            $msg_container.hide();
                        }

                    } else {
                        if ($this.attr('id') == "Email") {
                            $input_container.removeClass('error').removeClass('success');
                            $('#email_is_register').hide();
                        }

                        $input_container.removeClass('success');
                        $msg_container.show();
                    }
                }
                else {
                    $input_container.removeClass('error').removeClass('success');

                    if ($('#email_is_register').is(":visible")) {
                        $('#email_is_register').hide();
                    }

                    $msg_container.show();
                }
            });

            $inputs.blur(function (event, ignore_empty) {
                var $this = $(this);
                var $input_container = $this.parents('.input');
                var $msg_container = $input_container.find('.msg');


                if ($this.is(':visible') && $this.val() != '' || $this.is(':visible') && ignore_empty == false) {

                    var result = methods.validate($this);

                    if (result != 'skip') {

                        if (methods.validate($this)) {

                            if ($this.attr('id') == "Email") {
                                methods.isEmailInUse($this);
                            }

                            if ($this.attr('id') == "EmailAddress") {
                                methods.isEmailInUseReset($this);
                            }

                            if ($('#email_is_register').hasClass('show_registred')) {
                            } else {
                                $input_container.removeClass('error').addClass('success');
                                $('#email_is_register').addClass('hide');
                            }

                            $input_container.addClass('success');
                            $msg_container.hide();
                        }
                        else {
                            $input_container.removeClass('success').addClass('error');

                            var $password = $('#Password');

                            if ($this.attr('id') == "VerifyPassword" && $this.val() != $password.val()) {
                                $input_container.addClass('error');
                            }
                        }
                    }
                }
            });

            // trigger blur on all fields to validate
            $inputs.trigger('blur', [true]);
        });
    };

    var methods =
	{
	    validate: function ($input) {
	        var value = $input.val();
	        var validate_types = $input.attr('data_validate');
	        var validate_types = validate_types.split('|');

	        if ($.inArray('required', validate_types) == -1 && value == '') {
	            return 'skip';
	        }

	        var i, type, compare_val;

	        for (i in validate_types) {
	            type = validate_types[i];

	            if (type.indexOf('min[') != -1) {
	                compare_val = type.match(/\d+/)[0];

	                type = 'min';
	            }
	            if (type.indexOf('max[') != -1) {
	                compare_val = type.match(/\d+/)[0];

	                type = 'max';
	            }
	            else if (type.indexOf('match[') != -1) {
	                compare_field_name = type.replace('match[', '');
	                compare_field_name = compare_field_name.replace(']', '');

	                compare_val = $('input[name="' + compare_field_name + '"]').val();

	                type = 'match';
	            }

	            switch (type) {
	                case 'not-empty':
	                    if (value == '') {
	                        return false;
	                    }
	                    break;
	                case 'email':
	                    var pattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
	                    return pattern.test(value);
	                    break;
	                case 'min':
	                    if (value.length < compare_val) {
	                        return false;
	                    }
	                    break;
	                case 'max':
	                    if (value.length > compare_val) {
	                        return false;
	                    }
	                    break;
	                case 'match':
	                    if (value != compare_val) {
	                        return false;
	                    }
	                    break;
	                case 'org_no':
	                    var pattern = /^[0-9]{6}-[0-9]{4}$/;
	                    return pattern.test(value);
	                    break;
	                case 'phone':
	                    var pattern = /^[0-9+-]{6,20}$/;
	                    return pattern.test(value);
	                    break;

	                default:
	            }
	        }

	        return true;
	    },
	    isEmailInUse: function ($input) {
	        $.post("/SelfRegister/VerifyEmailsCowab", { emailInput: $input.val() }, function (data) {
	            if ($('#Email').val() != "") {
	                if (data.validatedAnswer == "1") {
	                    var $this = $input;
	                    var $input_container = $this.parents('.input');
	                    $input_container.removeClass('success').addClass('error');

	                    $('#email_hint').hide('hide');
	                    $('#email_is_register').removeClass('hide');
	                    $('#email_is_register').addClass('show_registred');
	                    $('#email_is_register').show();
	                }
	                else if (data.validatedAnswer == "0") {

	                    $('#email_is_register').removeClass('show_registred');
	                    $('#email_is_register').addClass('hide');
	                    $('#email_is_register').hide();
	                }
	            }
	        });
	    },
	    isEmailInUseReset: function ($input) {
	        $.post("/SelfRegister/VerifyEmailsCowab", { emailInput: $input.val() }, function (data) {
	            if ($('#EmailAddress').val() != "") {
	                var $this = $input;
	                var $input_container = $this.parents('.input');

	                if (data.validatedAnswer == "1") {
	                    $input_container.removeClass('error').addClass('success');
	                }
	                else if (data.validatedAnswer == "0") {
	                    $input_container.removeClass('success').addClass('error');
	                    $('#yourEmail').hide();
	                    $('#doesNotExist').show();
	                }
	            }
	        });
	    }
	};

})(jQuery);

$(function () {
    $('#signup form').not('#signup #resetPasswordFormPanel form').live_validation();
});
