/**
 * @requires js/libs/jQuery/plugins/jquery.scrollTo.js
 * @requires js/libs/jQuery/plugins/jquery.validate.js
 * @requires js/libs/jQuery/plugins/localization/messages_ru.js
 */

if (typeof(m) == "undefined" || !m) {
	var m = {};
}

(function($) {
    var config = {
        errorsClass : 'field-errors', //класс ul с ошибками
        errorClass : 'field-error', //класс элемента input с ошибкой
        errorClassSuffix : '-err'
    },

    defaults = {
        showErrors   : __showErrors,
        focusInvalid : false,
        focusCleanup : false,
        onkeyup      : function() {},
        onfocusin    : function() {},
        onfocusout   : function() {},
        onclick      : function() {}
    };

    m.validate = {
        getConf : function() {
            return $.extend({}, defaults);
        },

        setupCustomsValidators : function() {
            $.validator.addMethod("uri", __validateUri, "Некорректное значение url! Допускается использовать только латинские буквы, цифры, знаки '-' и '_'.");
			$.validator.addMethod("youtube", __validateYoutube, "Ссылка на видео может быть только с youtube.com");
        }
    }

    //при загрузке вызываем
    m.validate.setupCustomsValidators();

    function __showErrors(texts, errors)
    {
        var isError = Boolean(errors.length),
        	self = this;

        __clearOldErrors.call(this);

        $.each(errors, function(i, val) {
            var el = $(val.element);
            el.addClass(config.errorClass);

			var name = el.attr('name');
			if (typeof(self.settings.rules[name]) == 'object' && typeof(self.settings.rules[name].errBlock) == 'object') {
				var errBlock = self.settings.rules[name].errBlock;
			} else {
				var errBlock = $('.' + name + config.errorClassSuffix, self.currentForm);
			}

			var ul = $('ul.' + config.errorsClass, errBlock);

            if (!ul.length) {
                errBlock.html('<ul class="' + config.errorsClass + '"></ul>');
                ul = $('ul.' + config.errorsClass, errBlock);
            }

			if (typeof(val.message) == 'string') {
				ul.html('<li>' + val.message + '</li>');
			} else if (typeof(val.message) == 'object') {
				$.each(val.message, function(mKey, msg) {
					ul.append('<li>' + msg + '</li>');
				});
			}
        });

        if (isError) {
            if (typeof(errors[0].element) == 'object') {
                if (typeof(errors[0].element.focus) == 'function') {
                    errors[0].element.focus();
                }
            }
        }
    }

    function __clearOldErrors()
    {
        $('ul.' + config.errorsClass, this.currentForm).remove();
        $('.' + config.errorClass, this.currentForm).removeClass(config.errorClass);
    }

    function __validateUri(val, el, props)
    {
        if (val == '' || !props) {
            return true;
        }

        var pattern = /^[a-z0-9\-\_]+$/i;

        if (pattern.test(val)) {
            return true;
        } else {
            return false;
        }
    }

		function __validateYoutube(val, el, props)
		{
			if (val == '' || !props) {
				return true;
			}

			var urlPattern = /^http:\/\/(www.)?youtube.com((\?|\/).*)?$/i;

            if (urlPattern.test(val)) {
                return true;
            } else {
                return false;
            }
		}
}) (jQuery);
