﻿(function($) {

    var regexp = $.extend({
        zipcode: /^\d{3}-\d{3}$/,
        phone: /^[0]\d{1,2}-\d{3,4}-\d{4}$/,
        date: /^[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/,
        email: /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
    }, regexp || {});

    $.fn.formValidation = function(options) {

        if (!options) { alert("속성 정의 파라미터는 필수입니다."); return false; }

        var rules = options.rules;
        var messages = options.messages;
        var property = "";
        var isValid = true;
        var $fields = $(this).find("input, select, textarea, span, table").not(":submit, :button");
        var $label = null;
        var $errorLabel = null;
        var $container = null;
        var $field = null;
        var $errorFields = $([]);

        $.each(rules, function(key, args) {
            $field = $fields.filter("[id$='" + key + "']");

            if (!$field.attr("id")) {
                alert("formValidation library invalid.\r\n\r\nFORM TAG ID와 일치하지 않은 rules 항목이 존재합니다.");
                return (isValid = false);
            }
            if (!messages[key]) {
                alert("rules key와 일치하지 않은 항목이 존재합니다.");
                return (isValid = false);
            }

            property = $field.attr("id");
            $container = $field.parent();
            $label = $("<label />").addClass("messageInvalid").attr("title", property);
            $errorLabel = $("label[title=" + property + "]");

            if ($errorLabel.length)
                $errorLabel.remove();

            if (args.required) {
                if (args.checkbox) {
                    if (args.checkbox == "aspnet") {
                        var checkboxes = $field.find(":checkbox:checked");
                        if (checkboxes.length == 0) {
                            $label.attr("for", $field.attr("id")).html("<br/> " + messages[key].required);
                            $label.appendTo($container);
                            $errorFields = $errorFields.add($field);
                            isValid = false;
                        }
                    }
                    if (args.checkbox == "html") {
                        var checkboxes = $container.find("input[name=" + property + "]:checked");
                        if (checkboxes.length == 0) {
                            $label.attr("for", $field.attr("id")).html("<br/> " + messages[key].required);
                            $label.appendTo($container);
                            $errorFields = $errorFields.add($field);
                            isValid = false;
                        }
                    }
                }
                else if ($.trim($field.val()).length == 0) {
                    $label.attr("for", $field.attr("id")).html("<br/>" + messages[key].required);
                    $label.appendTo($container);
                    $errorFields = $errorFields.add($field);
                    isValid = false;
                }

                if (isValid && args.minlength) {
                    if ($.trim($field.val()).length < args.minlength) {
                        $label.attr("for", $field.attr("id")).html("<br/>" + messages[key].minlength);
                        $label.appendTo($container);
                        $errorFields = $errorFields.add($field);
                        isValid = false;
                    }
                }
                if (isValid && args.format) {
                    var regValid = regexp[args.format].test($field.val());
                    if (!regValid) {
                        $label.attr("for", $field.attr("id")).html("<br/>" + messages[key].format);
                        $label.appendTo($container);
                        $errorFields = $errorFields.add($field);
                        isValid = false;
                    }
                }
            }
        });

        //        if ($errorFields[0])
        //            $errorFields[0].focus();

        return isValid;
    };
})(jQuery);
