/** 
 * Myvalidate - simple form validation plugin for jQuery
 * Version 0.1.2
 * 2008-11-03 - 2010-12-09
 * Alexey Tcherevatov - <darth.lemming@gmail.com> 
 * Licensed under the MIT license:
 * http://www.opensource.org/licenses/mit-license.php
 * 
 */

(function($) {
    $.fn.validate = function(options) {

        var $form = this;

        var settings = {
            validClassName   : 'valid',
            invalidClassName : 'invalid'
        }

        if (options) {
            $.extend(settings, options);
        }

        this.submit(function() {
            var valid = true;
            $(this).find("input.required").each(function() {
                valid = checkRequired($(this)) ? valid : false;
            }).end().find("input.email").each(function() {
                if ($(this).hasClass("required") && $(this).val() != "")
                    valid = checkEmail($(this)) ? valid : false;
            }).end().find("input.url").each(function() {
                if ($(this).hasClass("required") && $(this).val() != "")
                    valid = checkUrl($(this)) ? valid : false;
            }).end().find("input.password").each(function() {
                $password = $(this);
                $confirmation = $form.find("input[name=" + $(this).attr("name") + " confirmation]");
                if ($(this).hasClass("required") && $(this).val() != "") 
                    valid = checkPassword($(this), $confirmation) ? valid : false;
            }).end().find("select.required").each(function() {
                valid = checkRequired($(this)) ? valid : false;
            }).end().find("textarea.required").each(function() {
                valid = checkRequired($(this)) ? valid : false;
            });
            $(window).scrollTop($('.' + settings.invalidClassName + ':first').offset().top);
            return valid;
        }).find("input").each(function() {
            if ($(this).hasClass("email")) {
                $(this).after('<label class="' + settings.invalidClassName + '" style="display:none"></label>');
                $(this).bind("change", function() {
                    if (checkRequired($(this))) 
                        checkEmail($(this));
                });
            } else if ($(this).hasClass("url")) {
                $(this).after('<label class="' + settings.invalidClassName + '" style="display:none"></label>');
                $(this).bind('change', function() {
                if (checkRequired($(this)))
                    checkUrl($(this));
                });
            }
            else if ($(this).hasClass("password") && $(this).attr("name").substr($(this).attr("name").length - 13, 12) != "confirmation") {
                $password = $(this);
                $confirmation = $form.find("input[name=" + $(this).attr("name") + " confirmation]");
                $password.after('<label class="' + settings.invalidClassName + '" style="display:none"></label>');
                $password.bind("change", function() {
                    if (checkRequired($(this))) 
                        checkPassword($(this), $confirmation);
                });
                $confirmation.bind("change", function() {
                    if (checkRequired($password))
                        if (checkPassword($password, $(this)))
                            checkConfirmation($password, $(this));
                });
            } else if ($(this).hasClass("required")) {
                $(this).after('<label class="' + settings.invalidClassName + '" style="display:none"></label>');
                $(this).bind('change', function() {
                    checkRequired($(this));
                })
            }
        }).end()
        .find("select.required").each(function() {
                $(this).after('<label class="' + settings.invalidClassName + '" style="display:none"></label><a name="' + $(this).attr("name") + '"></a>');
            }).blur(function() {
            checkRequired($(this));
        }).end()
        .find("textarea.required").each(function() {
            $(this).after('<label class="' + settings.invalidClassName + '" style="display:none"></label><a name="' + $(this).attr("name") + '"></a>');
            $(this).bind('change', function() {
                checkRequired($(this));
            });
        });
        
        function checkRequired(elm) {
            if (elm.hasClass("required")) {
                if ((elm.is("input")) && elm.val() == "") {
                    setError(elm, "это поле должно быть обязательно заполнено ");
                    return false;
                }
                else if (elm.is("select") && elm.children(":selected").is(":disabled")) {
                    setError(elm, "необходимо выбрать значение из списка ");
                    return false;
                }
                else if (elm.is('textarea') && elm.val() == '') {
                    setError(elm, "необходимо ввести текст");
                    return false;
                }
                else {
                    setValid(elm);
                    return true;
                }
            }
            if (elm.val() == '')
                return false;
            else
                return true;
        }
        
        function checkEmail(elm) {
            if (isValidEmail(elm.val())) {
                setValid(elm);
                return true;
            }
            else {
                setError(elm, "введён некорректный e-mail");
                return false;
            }
        }
        
        function checkUrl(elm) {
            if (isValidUrl(elm.val())) {
                setValid(elm);
                return true;
            }
            else {
                setError(elm, "введён некорректный адрес");
                return false;
            }
        }
        
        function checkPassword($password, $confirmation) {
            if ($password.val().length < 6) {
                setError($password, "пароль слишком короткий");
                return false;
            }
            else
                if (!isValidPassword($password.val())) {
                    setError($password, "недопустимые символы в пароле");
                    return false;
                }
            else
                if ($confirmation.val() == "") {
                    setError($password, "необходимо подтвердить пароль");
                    return false;
                }
            else 
                if ($password.val() != $confirmation.val() && $confirmation.val() != "") {
                    setError($password, "пароль и подтверждение пароля не совпадают");
                    return false;
                }
            setValid($password);
            return true;
        }
        
        function checkConfirmation($password, $confirmation) {
            if ($confirmation.val() != $password.val()) {
                setError($password, "пароль и подтверждение пароля не совпадают");
                return false;
            }
            else {
                setValid($password);
            }
            return true;            
        }
        
        function setValid(elm) {
            elm.next().removeClass(settings.invalidClassName)
                      .addClass(settings.validClassName)
                      .html('&nbsp;')
                      .show();
            elm.removeClass(settings.invalidClassName).addClass(settings.validClassName);
        }
        
        function setError(elm, strError) {
            elm.next().removeClass(settings.validClassName)
                      .addClass(settings.invalidClassName)
                      .text(strError)
                      .show();
            elm.removeClass(settings.validClassName).addClass(settings.invalidClassName);
        }
        
        function isValidPassword(strPassword) {
            var regExp = /^\w+$/;
            return regExp.test(strPassword);
        }
        function isValidEmail(strEmail) {
            var regExp = /^\w+[\+\.\w-]*@([\w-]+\.)*\w+[\w-]*\.([a-z]{2,4}|\d+)$/i
            return regExp.test(strEmail);
        }
        
        function isValidUrl(strUrl) {
            var regExp = /^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/;
            return regExp.test(strUrl);
        }
    }
})(jQuery);

