(function ($, undefined) {
    var methods = {

        //###############################
        // Initalisierung der Elemente, 
        // generieren der InputIcons
        //###############################

        init: function (method) {
            method = $.extend({
                tag: "input", // input, select und textarea
                icon: true, // true, false
                empty: false, // true, false -> ob bei icon: false ein leeres Icon eingesetzt wird.
                length: 200, // Gesamtlaenge der Boxen (Input u. Select) in Pixel
                glow: true, // true, false für Gloweffekt bei focusin
                iconsrc: "", // alternative Icon CSS-Klasse
                ie_margin: -1, //IE Eigentschaft um den Ramen der Selectoptions weg zu bekommen
                emptystring: "" //Bei welchem String wird das Icon zum "!" (nur sinnvoll fuer icon: true)
            }, method);

            if (method.tag == "input") {
                inputlength = method.length - 25;
                if (method.icon == true) {
                    if (method.iconsrc == "") {
                        AlertClass = "ui-icon ui-icon-alert";
                        CheckClass = "ui-icon ui-icon-check";
                    }
                    else {
                        AlertClass = method.iconsrc;
                        CheckClass = AlertClass;
                    }
                }
                else {
                    if (method.empty == true) {
                        inputlength = method.length - 3;
                        AlertClass = "";
                        CheckClass = "";
                    }
                    else {
                        AlertClass = "ui-icon ui-icon-empty";
                        CheckClass = "ui-icon ui-icon-empty";
                    }
                }

                if ($(this).val() == method.emptystring) {
                    $(this).attr("style", "border:solid 1px #FFFFFF; width:" + inputlength + "px;");
                    //$(this).val(inputlength+" - "+method.length+" - "+AlertClass);
                    $(this).addClass("jqIconCheck");
                    $(this).wrap("<div class='ui-state-error-soft ui-corner-all jqIconCheckBoder' style='background-color:#FFFFFF; border:solid #777777 1px; width:" + method.length + "px; padding:1px;'>");
                    if (method.empty == false) {
                        $(this).before("<span style='float:left;' class='" + AlertClass + "'></span>");
                    }
                }
                else {
                    $(this).attr("style", "border:solid 1px #FFFFFF; width:" + inputlength + "px;");
                    //$(this).val(inputlength+" - "+method.length+" - "+AlertClass);
                    $(this).addClass("jqIconCheck");
                    $(this).wrap("<div class='ui-state-check-soft ui-corner-all jqIconCheckBoder' style='background-color:#FFFFFF; border:solid #777777 1px; width:" + method.length + "px; padding:1px;'>");
                    if (method.empty == false) {
                        $(this).before("<span style='float:left;' class='" + CheckClass + "'></span>");
                    }
                }

                $(this).change(function () {
                    if ($(this).val() == method.emptystring) {
                        $(this).parent().removeClass("ui-state-check-soft");
                        $(this).parent().addClass("ui-state-error-soft");

                        $(this).prev().removeClass("ui-icon-check");
                        $(this).prev().addClass("ui-icon-alert");
                    }
                    else {
                        $(this).parent().removeClass("ui-state-error-soft");
                        $(this).parent().addClass("ui-state-check-soft");

                        $(this).prev().removeClass("ui-icon-alert");
                        $(this).prev().addClass("ui-icon-check");
                    }
                });

                $(this).keyup(function () {
                    if ($(this).val() == method.emptystring) {
                        $(this).parent().removeClass("ui-state-check-soft");
                        $(this).parent().addClass("ui-state-error-soft");

                        $(this).prev().removeClass("ui-icon-check");
                        $(this).prev().addClass("ui-icon-alert");
                    }
                    else {
                        $(this).parent().removeClass("ui-state-error-soft");
                        $(this).parent().addClass("ui-state-check-soft");

                        $(this).prev().removeClass("ui-icon-alert")
                        $(this).prev().addClass("ui-icon-check")
                    }
                });
            }
            else if (method.tag == "select") {
                inputlength = method.length - 25;
                divlength = method.length - 18;

                if (method.icon == true) {
                    AlertClass = "ui-icon ui-icon-alert";
                    CheckClass = "ui-icon ui-icon-check";
                }
                else {
                    AlertClass = "ui-icon ui-icon-empty";
                    CheckClass = "ui-icon ui-icon-empty";
                }

                if ($(this).val() == method.emptystring) {
                    $(this).wrap("<div class='ui-state-error-soft ui-corner-all jqIconCheckBoder' style='background-color:#FFFFFF; border:solid #777777 1px; width:" + method.length + "px; padding:1px;'>");
                    $(this).before("<span style='float:left;' class='" + AlertClass + "'></span>");
                    $(this).addClass("jqIconCheck");

                    if (!$.browsercheck()) {
                        $(this).wrap("<div class='ui-SelectBorder'>");
                        $(this).attr("style", "width:" + divlength + "px; margin: " + method.ie_margin + "px;");
                    }
                    else {
                        $(this).attr("style", "border:solid 1px #FFFFFF; width:" + inputlength + "px;");
                    }
                }
                else {
                    $(this).wrap("<div class='ui-state-check-soft ui-corner-all ui-SelectBorder jqIconCheckBoder' style='background-color:#FFFFFF; border:solid #777777 1px; width:" + method.length + "px; padding:1px;'>");
                    $(this).before("<span style='float:left;' class='" + CheckClass + "'></span>");
                    $(this).addClass("jqIconCheck");

                    if (!$.browsercheck()) {
                        $(this).wrap("<div class='ui-SelectBorder'>");
                        $(this).attr("style", "width:" + divlength + "px; margin: " + method.ie_margin + "px;");
                    }
                    else {
                        $(this).attr("style", "border:solid 1px #FFFFFF; width:" + inputlength + "px;");
                    }
                }

                $(this).change(function () {
                    if ($(this).val() == method.emptystring) {
                        if (!$.browsercheck()) {
                            $(this).parent().parent().removeClass("ui-state-check-soft");
                            $(this).parent().parent().addClass("ui-state-error-soft");

                            $(this).parent().prev().removeClass("ui-icon-check");
                            $(this).parent().prev().addClass("ui-icon-alert");
                        }
                        else {
                            $(this).parent().removeClass("ui-state-check-soft");
                            $(this).parent().addClass("ui-state-error-soft");

                            $(this).prev().removeClass("ui-icon-check");
                            $(this).prev().addClass("ui-icon-alert");
                        }
                    }
                    else {
                        if (!$.browsercheck()) {
                            $(this).parent().parent().removeClass("ui-state-error-soft");
                            $(this).parent().parent().addClass("ui-state-check-soft");

                            $(this).parent().prev().removeClass("ui-icon-alert");
                            $(this).parent().prev().addClass("ui-icon-check");
                        }
                        else {
                            $(this).parent().removeClass("ui-state-error-soft");
                            $(this).parent().addClass("ui-state-check-soft");

                            $(this).prev().removeClass("ui-icon-alert");
                            $(this).prev().addClass("ui-icon-check");
                        }
                    }
                });

                $(this).keyup(function () {
                    if ($(this).val() == method.emptystring) {
                        if (!$.browsercheck()) {
                            $(this).parent().parent().removeClass("ui-state-check-soft");
                            $(this).parent().parent().addClass("ui-state-error-soft");

                            $(this).parent().prev().removeClass("ui-icon-check");
                            $(this).parent().prev().addClass("ui-icon-alert");
                        }
                        else {
                            $(this).parent().removeClass("ui-state-check-soft");
                            $(this).parent().addClass("ui-state-error-soft");

                            $(this).prev().removeClass("ui-icon-check");
                            $(this).prev().addClass("ui-icon-alert");
                        }
                    }
                    else {
                        if (!$.browsercheck()) {
                            $(this).parent().parent().removeClass("ui-state-error-soft");
                            $(this).parent().parent().addClass("ui-state-check-soft");

                            $(this).parent().prev().removeClass("ui-icon-alert");
                            $(this).parent().prev().addClass("ui-icon-check");
                        }
                        else {
                            $(this).parent().removeClass("ui-state-error-soft");
                            $(this).parent().addClass("ui-state-check-soft");

                            $(this).prev().removeClass("ui-icon-alert");
                            $(this).prev().addClass("ui-icon-check");
                        }
                    }
                });
            }
            else if (method.tag == "textarea") {
                if ($(this).val() == method.emptystring && method.icon == true) {
                    $(this).wrap("<div class='ui-state-error jqIconCheckBoder ui-corner-all' align='right' style='border:solid #777777 1px; width:auto; padding-right:2px;'>");
                    $(this).attr("style", "border: 0px; width:100%;");
                    $(this).addClass("ui-state-error").addClass("jqIconCheck");
                }
                else {
                    $(this).wrap("<div class='ui-state-check jqIconCheckBoder ui-corner-all' align='right' style='border:solid #777777 1px; width:auto; padding-right:2px;'>");
                    $(this).attr("style", "border: 0px; width:100%;");
                    $(this).addClass("ui-state-check").addClass("jqIconCheck"); ;
                }

                $(this).change(function () {
                    if ($(this).val() == method.emptystring && method.icon == true) {
                        $(this).removeClass("ui-state-check").addClass("ui-state-error");
                        $(this).parent().removeClass("ui-state-check").addClass("ui-state-error");
                    }
                    else {
                        $(this).removeClass("ui-state-error").addClass("ui-state-check");
                        $(this).parent().removeClass("ui-state-error").addClass("ui-state-check");
                    }
                });

                $(this).keyup(function () {
                    if ($(this).val() == method.emptystring && method.icon == true) {
                        $(this).removeClass("ui-state-check").addClass("ui-state-error");
                        $(this).parent().removeClass("ui-state-check").addClass("ui-state-error");
                    }
                    else {
                        $(this).removeClass("ui-state-error").addClass("ui-state-check");
                        $(this).parent().removeClass("ui-state-error").addClass("ui-state-check");
                    }
                });
            }

            ////###############################
            // Inputfelder werden mit einem roten Rand (glow-Effekt) umrandet
            // sofern die übergebene Methode (glow) nicht false ist.
            // IE 7 erhält nur einen roten border (border:1px solid #FF0000;
            ////###############################

            $(this).live("focusin", function () {
                if (method.glow == true) {
                    if ($.browsercheck()) {
                        if ($(this).get(0).tagName.toLowerCase() == "input" || $(this).get(0).tagName.toLowerCase() == "textarea" || $.browsercheck()) {
                            $(".jqIconCheckBoder").removeClass("ui-glowBorder");
                            $(this).parent().addClass("ui-glowBorder");
                        }
                    }
                    if (!$.browsercheck() && ($(this).get(0).tagName.toLowerCase() == "input" || $(this).get(0).tagName.toLowerCase() == "textarea") || $.browsercheck()) {
                        $(".jqIconCheckBoder").css("border", "1px solid #777777");
                        $(this).parent().css("border", "1px solid #FF0000");
                    }
                }
            });
            $(this).live("focusout", function () {
                if (method.glow == true) {
                    if ($.browsercheck()) {
                        if ($(this).get(0).tagName.toLowerCase() == "input" || $(this).get(0).tagName.toLowerCase() == "textarea" || $.browsercheck()) {
                            $(this).parent().removeClass("ui-glowBorder");
                        }
                    }
                    if (!$.browsercheck() && ($(this).get(0).tagName.toLowerCase() == "input" || $(this).get(0).tagName.toLowerCase() == "textarea") || $.browsercheck()) {
                        $(this).parent().css("border", "1px solid #777777");
                    }
                }
            });
        },

        //###############################
        // Update-Methode
        // aktualisierung der InputIcons
        //###############################

        update: function (method) {
            method = $.extend({
                tag: "input", // input, select und textarea				
                emptystring: "" //Bei welchem String wird das Icon zum "!" (nur sinnvoll fuer icon: true)
            }, method);

            $(".jqIconCheck").each(function (IntInput) {
                if ($(this).is("input")) {
                    if ($(this).val() == method.emptystring) {
                        $(this).parent().removeClass("ui-state-check-soft");
                        $(this).parent().addClass("ui-state-error-soft");

                        $(this).prev().removeClass("ui-icon-check");
                        $(this).prev().addClass("ui-icon-alert");
                    }
                    else {
                        $(this).parent().removeClass("ui-state-error-soft");
                        $(this).parent().addClass("ui-state-check-soft");

                        $(this).prev().removeClass("ui-icon-alert")
                        $(this).prev().addClass("ui-icon-check")
                    }
                }
                else if ($(this).is("select")) {
                    if ($(this).val() == method.emptystring) {
                        if (!$.browsercheck()) {
                            $(this).parent().parent().removeClass("ui-state-check-soft");
                            $(this).parent().parent().addClass("ui-state-error-soft");

                            $(this).parent().prev().removeClass("ui-icon-check");
                            $(this).parent().prev().addClass("ui-icon-alert");
                        }
                        else {
                            $(this).parent().removeClass("ui-state-check-soft");
                            $(this).parent().addClass("ui-state-error-soft");

                            $(this).prev().removeClass("ui-icon-check");
                            $(this).prev().addClass("ui-icon-alert");
                        }
                    }
                    else {
                        if (!$.browsercheck()) {
                            $(this).parent().parent().removeClass("ui-state-error-soft");
                            $(this).parent().parent().addClass("ui-state-check-soft");

                            $(this).parent().prev().removeClass("ui-icon-alert");
                            $(this).parent().prev().addClass("ui-icon-check");
                        }
                        else {
                            $(this).parent().removeClass("ui-state-error-soft");
                            $(this).parent().addClass("ui-state-check-soft");

                            $(this).prev().removeClass("ui-icon-alert");
                            $(this).prev().addClass("ui-icon-check");
                        }
                    }
                }
                else if ($(this).is("textarea")) {
                    if ($(this).val() == method.emptystring && method.icon == true) {
                        $(this).removeClass("ui-state-check").addClass("ui-state-error");
                        $(this).parent().removeClass("ui-state-check").addClass("ui-state-error");
                    }
                    else {
                        $(this).removeClass("ui-state-error").addClass("ui-state-check");
                        $(this).parent().removeClass("ui-state-error").addClass("ui-state-check");
                    }
                }
            });
        }
    };

    //###############################
    // Aufruf der Funktion und Überprüfung ob eine Mehtode
    // angegeben wurde und wenn ja ob diese definiert ist.
    // Wenn diese nicht definiert wurde, wird eine Fehlermeldung
    // im Log (FF) ausgegeben:
    // 
    // "Method 'XXX' does not exist on jQuery.inputicon".
    //###############################

    $.fn.IconCheck = function (method) {
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error(alert('Method ' + method + ' does not exist on jQuery.inputicon'));
        }
    }
})(jQuery);
