(function ($) {
    $.fn.formControl = function (options) {
        var defaults = {
            message: "Management",
            color: "#F30000",
            submitmod: "",
            position: "right",
            callback: ""
        };
        var options = $.extend(defaults, options);
        var thecolor = options.color;
        var message = options.message;
        var position = options.position;
        var cn = options.classname;
        var targetForm = this.find("input[type=submit]").parents("form");
        var alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        var numeric = "1234567890";
        var symb = "!.,?+-_'\"";
        var phone = "1234567890 -().";
        var position = options.position;
        var callback = options.callback;

        function checkthis(obj) {
            var errorstring = "";
            if (obj.hasClass("required") && obj.val() == "" || obj.hasClass("required") && obj.find(":selected").val() == "") {
                errorstring += "This is a required field<br />";
            }
            if (obj.filter("[maxlength]").length > 0 && obj.val().length > obj.attr("maxlength")) {
                errorstring += "Max length for this field is " + obj.attr("maxlength") + "<br />";
            }
            if (obj.filter("[minlength]").length > 0 && obj.val().length < obj.attr("minlength")) {
                if (obj.val().length > 0) {
                    errorstring += "Minimum length for this field is " + obj.attr("minlength") + "<br />";
                }
            }
            if (obj.hasClass("email") && obj.val().indexOf("@") == -1 || obj.hasClass("email") && obj.val().indexOf(".") == -1) {
                if (obj.val().length > 0) {
                    errorstring += "Email Address must contain both '@' and '.' characters<br />";
                }
            }
            if (obj.hasClass("phone")) {
                var boom = obj.val().split("");
                var track = 0;
                $.each(boom, function () {
                    if (phone.indexOf(this) == -1) {
                        track += 1;
                    }
                });
                if (track > 0) {
                    errorstring += "Must be a valid phone number<br />";
                }
            }
            var track = 0;
            var boom = obj.val().split("");
            var arrayed = "";
            var containonly = "";
            if (obj.hasClass("alpha")) {
                arrayed += alpha;
                containonly += "letters";
            }
            if (obj.hasClass("numeric")) {
                arrayed += numeric;
                if (containonly != "") { containonly += ", " }
                containonly += "numbers"
            }
            if (obj.hasClass("space")) {
                arrayed += " ";
                if (containonly != "") { containonly += ", " }
                containonly += "spaces";
            }
            if (obj.hasClass("symbol")) {
                arrayed += symb;
                if (containonly != "") { containonly += ", " }
                containonly += "the symbols !.,?+-_'\"";
            }
            if (obj.hasClass("customval")) {
                arrayed += obj.attr("customval");
                if (containonly != "") { containonly += ", " }
                containonly += "the characters " + obj.attr("customval");
            }
            if (arrayed != "") {
                $.each(boom, function () {
                    if (arrayed.indexOf(this) == -1) {
                        track += 1;
                    }
                });
            }
            if (track > 0) {
                var hm = containonly.lastIndexOf(",");
                if (hm != -1) {
                    containonly = containonly.substr(0, hm) + ' and' + containonly.substr(hm + 1);
                }
                errorstring += "This field may only contain " + containonly + ".<br />";
            }
            if (errorstring != "") {
                return ["errors", $("<span class='errorbox' style='left:" + (obj.position().left + obj.width()) + "px;top:" + obj.position().top + "px;'><span>" + errorstring + "</span></span>"), obj];
            } else {
                return ["none", "", obj];
            }
        }

        targetForm.find("input, textarea, select").bind("focus", function () {
            var a = checkthis($(this));
            if (a[0] == "errors") {
                a[1].appendTo(a[2].offsetParent());
            }
        }).bind("keyup", function () {
            var a = checkthis($(this));
            if (a[0] == "errors") {
                $(".errorbox").remove();
                a[1].appendTo(a[2].offsetParent());
                a[2].css("border-color", thecolor);
            } else {
                a[2].css("border-color", "");
                $(".errorbox").remove();
            }
        }).bind("blur", function () {
            var a = checkthis($(this));
            $(".errorbox").remove();
            if (a[0] == "errors") {
                a[2].css("border-color", thecolor);
            } else {
                a[2].css("border-color", "");
            }
        });

        targetForm.find("input[type=submit]").bind("click.iv", function (e) {
            e.preventDefault();
            targetForm.find("input, textarea, select").each(function () {
                var a = checkthis($(this));
                if (a[0] == "errors") {
                    a[2].css("border-color", thecolor).addClass("thesewerewrong");
                }
            });

            if ($(".thesewerewrong").length > 0) {
                $(".errorbox").remove();
                $(".thesewerewrong").removeClass("thesewerewrong").first().focus();
                return false;
            } else {
                if (targetForm.find("input[type=file]").length > 0) {
                    $('<iframe id="hiffufs" name="hiffufs" src="" style="width:0;height:0;border-width:0px;" frameborder="0"></iframe>').appendTo("body");
                    targetForm.attr({ "target": "hiffufs", "action": options.submitmod + targetForm.find("form").attr("action") });
                    $("#hiffufs").bind("load", function () {
                        targetForm.html($(this).contents().find("body").html());
                        if (typeof callback == 'function') {
                            callback(targetForm);
                        }
                        $(this).remove();
                    });
                    targetForm.children().css("display", "none");
                    targetForm.append("Sending...");
                    $(this).unbind("click.iv").attr('form').onsubmit();
                    return false;
                } else {
                    sendstring = options.submitmod + $(this).parents("form").attr("action") + "?";
                    targetForm.find("input[type=text], input[type=hidden], textarea, input[type=radio]:checked, input[type=checkbox]:checked").each(function () {
                        sendstring += $(this).attr("name") + "=" + $(this).val() + "&";
                    });
                    targetForm.find("select").each(function () {
                        sendstring += $(this).attr("name") + "=" + $(this).find("option:selected").text() + "&";
                    });
                    $.ajax({
                        type: targetForm.attr("method"),
                        url: sendstring,
                        success: function (data) {
                            targetForm.html(data);
                            if (typeof callback == 'function') {
                                callback(targetForm);
                            }
                        }
                    });
                    targetForm.html("Sending...");
                    return false;
                }
            }
        });

    };
})(jQuery);
