/**
 * @module       RD Mail Form
 * @version      1.1.0
 * @author       Evgeniy Gusarov
 * @see          https://ua.linkedin.com/pub/evgeniy-gusarov/8a/a40/54a
 */
!function (e) {
    function t(o, s, n) {
        i = e.extend(!0, {}, i, n), this.options = e.extend(!0, {}, t.Defaults, s), this.$element = e(o), this._plugins = {}, this._handlers = {
            "mf.success mf.fail": e.proxy(this.update, this),
            "mf.process": e.proxy(this.process, this),
            reset: e.proxy(this.reset, this)
        }, e.each(t.Plugins, e.proxy(function (e, t) {
            this._plugins[e[0].toLowerCase() + e.slice(1)] = new t(this)
        }, this)), this.initialize()
    }

    var i;
    i = {
        MF000: "Sent",
        MF001: "Recipients are not set!",
        MF002: "Form will not work locally!",
        MF003: "Please, define email field in your form!",
        MF004: "Please, define type of your form!",
        MF254: "Something went wrong with PHPMailer!",
        MF255: "Aw, snap! Something went wrong."
    }, t.Defaults = {baseClass: "rd-mailform"}, t.Plugins = {}, t.prototype.initialize = function () {
        this.$element.trigger("mf.initialize"), this.$element.addClass(this.options.baseClass).trigger("reset"), this.create(), this.watch(), this.$element.trigger("mf.initialized")
    }, t.prototype.create = function () {
    }, t.prototype.watch = function () {
        var e = this;
        e.$element.ajaxForm({
            beforeSubmit: function () {
                e.$element.trigger("mf.process")
            }, error: function (t) {
                e.$element.trigger("mf.fail", {code: t, message: i[t]})
            }, success: function (t) {
                console.log(t), "MF000" == t ? e.$element.trigger("mf.success", {
                    code: t,
                    message: i[t]
                }) : (t = 5 == t.length ? t : "MF255", e.$element.trigger("mf.fail", {code: t, message: i[t]}))
            }
        }).on(this._handlers)
    }, t.prototype.process = function () {
        this.$element.addClass("process")
    }, t.prototype.update = function (t, i) {
        this.$element.removeClass("process"), this.$element.addClass("MF000" === i.code ? "success" : "fail"), setTimeout(e.proxy(function () {
            this.$element.trigger("reset")
        }, this), 3e3)
    }, t.prototype.reset = function () {
        this.$element.removeClass("success"), this.$element.removeClass("fail"), this.$element.trigger("mf.reset")
    }, e.fn.rdMailForm = function (i, o) {
        return this.each(function () {
            e(this).data("rdMailForm") || e(this).data("rdMailForm", new t(this, i, o))
        })
    }, e.fn.rdMailForm.Constructor = t
}(window.jQuery, window, document), function (e) {
    var t = e.fn.rdMailForm.Constructor.Plugins.Validator = function (i) {
        this._core = i, this._handlers = {
            "mfValidator.validate": this.validate,
            "mfValidator.error": this.error,
            "mfValidator.valid": this.valid,
            "mfValidator.reset": this.reset,
            "mfValidator.click": e.noop()
        }, this._core.options = e.extend(!0, {}, t.Defaults, this._core.options), this.initialize()
    };
    t.Defaults = {
        validator: {
            applyTo: "[data-constraints]",
            "class": "mfValidation",
            constraints: {
                "@LettersOnly": {
                    rule: "^([a-zA-Zа-яА-ЯіїёІЇЁєЄҐґ\\s]{0,})$",
                    message: "Please use letters only!"
                },
                "@NumbersOnly": {rule: "^-?\\d*\\.?\\d*$", message: "Please use numbers only!"},
                "@NotEmpty": {rule: "([^\\s])", message: "Field should not be empty!"},
                "@Email": {
                    rule: "^(([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)){0,}$",
                    message: "Enter valid e-mail address!"
                },
                "@Phone": {
                    rule: "^(\\+?\\d{0,3}\\s*\\(?\\d{1,3}\\)?\\s*\\d{3}\\s*\\d{4}){0,}$",
                    message: "Enter valid phone number!"
                },
                "@Date": {
                    rule: function (e) {
                        return navigator.userAgent.match(/(iPod|iPhone|iPad)/) ? !0 : new RegExp("^($)|(((0[13578]|10|12)(-|\\/)((0[1-9])|([12])([0-9])|(3[01]?))(-|\\/)((19)([2-9])(\\d{1})|(20)([01])(\\d{1})|([8901])(\\d{1}))|(0?[2469]|11)(-|/)(([1-9])|(0[1-9])|([12])([0-9]?)|(3[0]?))(-|/)((19)([2-9])(\\d{1})|(20)([01])(\\d{1})|([8901])(\\d{1}))))$").test(e.val())
                    }, message: "Use MM/DD/YYYY format!"
                },
                "@SelectRequired": {
                    rule: function (e) {
                        return 0 !== e.find("option:selected").index()
                    }, message: "Please choose an option!"
                }
            }
        }
    }, t.prototype.initialize = function () {
        this._core.$element.trigger("mfValidator.initialize"), this.create(), this.watch(), this._core.$element.trigger("mfValidator.initialized")
    }, t.prototype.create = function () {
        var t = this;
        this._core.$element.find(this._core.options.validator.applyTo).each(function () {
            e(this).parent().append(e("<span/>", {"class": t._core.options.validator["class"]}))
        })
    }, t.prototype.watch = function () {
        var t = this;
        this._core.$element.find(this._core.options.validator.applyTo).on("keyup", function () {
            (e(this).is("input") || e(this).is("textarea")) && e(this).parent().find(".mfValidation").hasClass("error") && e(this).parent().trigger("mfValidator.validate", {options: t._core.options.validator})
        }).on("blur", function () {
            (e(this).is("input") || e(this).is("textarea")) && e(this).parent().trigger("mfValidator.validate", {options: t._core.options.validator})
        }).on("change", function () {
            e(this).is("select") && e(this).parent().trigger("mfValidator.validate", {options: t._core.options.validator})
        }).parent().on(this._handlers).find("." + this._core.options.validator["class"]).on("click", function () {
            e(this).removeClass("error").removeClass("show").addClass("hide").parent().trigger("mfValidator.click").find(t._core.options.validator.applyTo).focus()
        }), this._core.$element.on("submit", e.proxy(function (i) {
            return this._core.$element.find(this._core.options.validator.applyTo).each(function () {
                e(this).parent().trigger("mfValidator.validate", {options: t._core.options.validator})
            }), this._core.$element.find(".error").length ? (i.preventDefault(), !1) : void 0
        }, this)).on("mf.reset", e.proxy(function () {
            this._core.$element.find(this._core.options.validator.applyTo).each(function () {
                e(this).parent().trigger("mfValidator.reset", {options: t._core.options.validator})
            })
        }, this))
    }, t.prototype.validate = function (t, i) {
        var o, s = [], n = [], a = e(this), r = a.find(i.options.applyTo), l = r.data("constraints").match(/\@\w+/g), c = r.val();
        for (var d in l)if (i.options.constraints[l[d]]) {
            switch (typeof i.options.constraints[l[d]].rule) {
                case"function":
                    i.options.constraints[l[d]].rule(r) ? a.find(".mfValidation") && a.find(".mfValidation").attr("data-index") === d && (o = !0, a.find(".mfValidation").attr("data-index", -1)) : (s.push(i.options.constraints[l[d]].message), n.push(d), o = !0);
                    break;
                default:
                    new RegExp(i.options.constraints[l[d]].rule).test(c) ? a.find(".mfValidation").attr("data-index") && a.find(".mfValidation").attr("data-index") == d && (o = !0, a.find(".mfValidation").attr("data-index", -1)) : (s.push(i.options.constraints[l[d]].message), n.push(d), o = !0)
            }
            if (o)break
        }
        s.length ? e(this).trigger("mfValidator.error", {
            options: i.options,
            errors: s,
            indexes: n
        }) : e(this).trigger("mfValidator.valid", {options: i.options})
    }, t.prototype.error = function (t, i) {
        e(this).find("." + i.options["class"]).removeClass("valid").removeClass("hide").addClass("show").addClass("error").attr("data-index", i.indexes[0]).text(i.errors)
    }, t.prototype.valid = function (t, i) {
        var o = e(this).find("." + i.options["class"]);
        o.hasClass("error") && o.removeClass("error").addClass("hide"), o.find("." + i.options["class"]).removeClass("show").addClass("valid").text(i.errors)
    }, t.prototype.reset = function (t, i) {
        var o = e(this).find("." + i.options["class"]);
        o.hasClass("error") && o.removeClass("error").addClass("hide"), e(this).find("." + i.options["class"]).removeClass("show")
    }
}(window.jQuery, window, document), function (e) {
    var t = e.fn.rdMailForm.Constructor.Plugins.Input = function (i) {
        this._core = i, this._handlers = {
            "mfInput.focus": this.focus,
            "mfInput.blur": this.blur,
            "mfInput.type": this.type,
            "mfInput.delete": this["delete"],
            "mfInput.fill": this.fill,
            "mfInput.empty": this.empty,
            "mfInput.idle": this.idle,
            "mfInput.reset": this.reset,
            click: function (e) {
                return e.preventDefault(), !1
            }
        }, this._core.options = e.extend(!0, {}, t.Defaults, this._core.options), this.initialize()
    };
    t.Defaults = {
        input: {
            applyto: 'input[type="text"], input[type="date"], textarea',
            "class": "mfInput"
        }
    }, t.prototype.initialize = function () {
        this._core.$element.trigger("mfInput.initialize"), this.create(), this.watch(), this._core.$element.trigger("mfInput.initialized")
    }, t.prototype.create = function () {
        this._core.$element.find(this._core.options.input.applyto).parent().addClass(this._core.options.input["class"])
    }, t.prototype.watch = function () {
        this._core.$element.find(this._core.options.input.applyto).on("focus", function () {
            e(this).parent().trigger("mfInput.focus")
        }).on("blur", function () {
            e(this).parent().trigger("mfInput.blur"), "" === e(this).val() && e(this).parent().trigger("mfInput.void")
        }).on("keydown", this, function (t) {
            t.data.ignore(t) || ((8 === t.keyCode || 46 === t.keyCode) && e(this).parent().trigger("mfInput.delete"), (32 === t.keyCode || t.keyCode > 46) && e(this).parent().trigger("mfInput.type"))
        }).on("keyup", this, function (t) {
            var i = e(this);
            t.data.ignore(t) || ("" === i.val() && i.parent().trigger("mfInput.empty"), 8 === t.keyCode || 46 === t.keyCode ? (self.timer && clearTimeout(self.timer), self.timer = setTimeout(function () {
                i.parent().trigger("mfInput.idle")
            }, 1e3)) : (i.parent().trigger("mfInput.fill"), i.parent().trigger("mfInput.type"), self.timer && clearTimeout(self.timer), self.timer = setTimeout(function () {
                i.parent().trigger("mfInput.idle")
            }, 1e3)))
        }).on("keypress", this, function (t) {
            if (!t.data.ignore(t.keyCode)) {
                var i = e(this);
                self.timer && clearTimeout(self.timer), self.timer = setTimeout(function () {
                    i.parent().trigger("mfInput.idle")
                }, 1e3)
            }
        }).parent().on(this._handlers), this._core.$element.on("mf.reset", this, function (t) {
            e(this).find("." + t.data._core.options.input["class"]).each(function () {
                e(this).trigger("mfInput.reset")
            })
        })
    }, t.prototype.focus = function () {
        e(this).addClass("focused")
    }, t.prototype.blur = function () {
        e(this).removeClass("focused")
    }, t.prototype.type = function () {
        e(this).removeClass("deleting"), e(this).addClass("typing")
    }, t.prototype["delete"] = function () {
        e(this).removeClass("typing"), e(this).addClass("deleting")
    }, t.prototype.fill = function () {
        e(this).addClass("filled")
    }, t.prototype.empty = function () {
        e(this).removeClass("filled")
    }, t.prototype.idle = function () {
        e(this).removeClass("typing"), e(this).removeClass("deleting")
    }, t.prototype.reset = function () {
        e(this).removeClass("focused"), e(this).removeClass("deleting"), e(this).removeClass("filled"), e(this).removeClass("typing"), e(this).removeClass("error")
    }, t.prototype.ignore = function (e) {
        return 144 === e.keyCode || 20 === e.keyCode || 17 === e.keyCode || 37 === e.keyCode || 38 === e.keyCode || 39 === e.keyCode || 40 === e.keyCode || 112 === e.keyCode || 113 === e.keyCode || 114 === e.keyCode || 115 === e.keyCode || 116 === e.keyCode || 117 === e.keyCode || 118 === e.keyCode || 119 === e.keyCode || 120 === e.keyCode || 121 === e.keyCode || 122 === e.keyCode || 123 === e.keyCode || 9 === e.keyCode || e.ctrlKey ? !0 : !1
    }
}(window.jQuery, window, document), function (e) {
    var t = e.fn.rdMailForm.Constructor.Plugins.Select = function (i) {
        this._core = i, this._handlers = {
            "mfSelect.close": this.close,
            "mfSelect.open": this.open,
            "mfSelect.select": this.select,
            click: function (e) {
                e.preventDefault(), e.stopPropagation()
            }
        }, this._core.options = e.extend(!0, {}, t.Defaults, this._core.options), this.initialize()
    };
    t.Defaults = {select: {applyTo: "select", "class": "mfSelect"}}, t.prototype.initialize = function () {
        this._core.$element.trigger("mfSelect.initialize"), this.create(), this.watch(), this._core.$element.trigger("mfSelect.initialized")
    }, t.prototype.create = function () {
        this._core.$element.find(this._core.options.select.applyTo).each(function () {
            var t = e(this);
            t.css({
                position: "absolute",
                left: "50%",
                width: "0",
                height: "0",
                overflow: "hidden",
                opacity: "0"
            }).parent().append(e("<div/>", {
                "class": "value",
                text: t.find("option:selected").text()
            })).append(e("<ul/>", {"class": "dropdown"})).end().find("option").each(function (t) {
                if (0 != t) {
                    var i = e(this);
                    i.parent().parent().find(".dropdown").append(e("<li/>", {
                        "class": "option",
                        text: i.text()
                    }).addClass(i.is(":selected") ? "selected" : ""))
                }
            })
        }).parent().addClass(this._core.options.select["class"])
    }, t.prototype.watch = function () {
        var t = this;
        this._core.$element.find(t._core.options.select.applyTo).on("focus", this.focus).on("blur", function () {
            e(this).parent().trigger("mfSelect.close").removeClass("focus")
        }).on("keydown", function (t) {
            38 == t.keyCode && e(this).val(e(this).find("option").eq(e(this).find("option:selected").index() > 0 ? e(this).find("option:selected").index() - 1 : 0).text()).trigger("change"), 40 == t.keyCode && e(this).val(e(this).find("option").eq(e(this).find("option:selected").index() < e(this).find("option").length - 1 ? e(this).find("option:selected").index() + 1 : e(this).find("option").length - 1).text()).trigger("change"), 13 == t.keyCode && e(this).parent().trigger(e(this).parent().hasClass("show") ? "mfSelect.close" : "mfSelect.open"), (32 == t.keyCode || 37 == t.keyCode || 38 == t.keyCode || 39 == t.keyCode || 40 == t.keyCode || 13 == t.keyCode) && t.preventDefault()
        }).on("change", function () {
            e(this).parent().trigger("mfSelect.open").find(".value").text(e(this).val());
            var t = e(this).find("option:selected").index(), i = e(this).parent().find(".option").removeClass("selected");
            t > 0 && i.eq(t - 1).addClass("selected")
        }).parent().on(this._handlers).find(".value").on("click", function () {
            var i = e(this), o = i.parent().find("select"), s = o.find("option").eq(0).text();
            if (i.text(s), o.trigger("focus").off("focus", t.focus), !e(this).parent().hasClass("show")) {
                o.on("focus", t.focus);
                var n = e(this).parent().find(".option.selected");
                n.length && i.text(n.text())
            }
        }).parent().find(".option").on("click", function () {
            e(this).parent().find(".option").removeClass("selected"), e(this).addClass("selected"), e(this).parent().parent().find("select").focus().on("focus", t.focus), e(this).parent().parent().trigger("mfSelect.select", {
                options: t._core.options.select,
                value: e(this).text()
            })
        }).parents("body").on("click", function (i) {
            var o = t._core.$element.find("." + t._core.options.select["class"]);
            o.length && (o.is(i.target) || 0 !== o.has(i.target).length || o.find("select").each(function () {
                var t = e(this).parent().find(".option.selected");
                t.length && e(this).parent().find(".value").text(t.text())
            }).on("focus", t.focus))
        }), this._core.$element.on("mf.reset", function () {
            e(this).find(t._core.options.select.applyTo).each(function () {
                e(this).parent().find(".value").text(e(this).prop("selectedIndex", 0).val()), e(this).parent().find(".option").removeClass("selected")
            })
        })
    }, t.prototype.focus = function () {
        e(this).parent().trigger("mfSelect.open").addClass("focus")
    }, t.prototype.close = function () {
        navigator.userAgent.match(/(iPod|iPhone|iPad)/) || e(this).hasClass("show") && e(this).removeClass("show")
    }, t.prototype.open = function () {
        navigator.userAgent.match(/(iPod|iPhone|iPad)/) || e(this).hasClass("show") || e(this).addClass("show")
    }, t.prototype.select = function (t, i) {
        e(this).find(i.options.applyTo).val(i.value).trigger("change"), e(this).trigger("mfSelect.close")
    }
}(window.jQuery, window, document), function (e) {
    var t = e.fn.rdMailForm.Constructor.Plugins.DatePicker = function (i) {
        this._core = i, this._handlers = {
            "mfDatePicker.close": this.close,
            "mfDatePicker.open": this.open,
            "mfDatePicker.next": this.next,
            "mfDatePicker.prev": this.prev,
            "mfDatePicker.update": this.update,
            "mfDatePicker.refresh": this.refresh,
            "mfDatePicker.pick": this.pick
        }, this._core.options = e.extend(!0, {}, t.Defaults, this._core.options), this.initialize()
    };
    t.Defaults = {
        datepicker: {
            applyTo: 'input[type="date"]',
            "class": "mfDatePicker",
            days: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
            months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
            format: "MM-DD-YYYY",
            prevMonth: "",
            nextMonth: ""
        }
    }, t.prototype.initialize = function () {
        this._core.$element.trigger("mfDatePicker.initialize"), this.create(), this.watch(), this._core.$element.trigger("mfDatePicker.initialized")
    }, t.prototype.create = function () {
        var t = this;
        t._core.$element.find(t._core.options.datepicker.applyTo).each(function () {
            e(this).attr({
                type: navigator.userAgent.match(/(iPod|iPhone|iPad)/) ? "date" : "text",
                "data-type": "date"
            }).after(e("<div/>", {"class": t._core.options.datepicker["class"]}).data("date", new Date))
        }).parent().find("." + t._core.options.datepicker["class"]).each(function () {
            e.proxy(t.update, this, {}, t._core.options.datepicker).call(), e.proxy(t.refresh, this, {}, t._core.options.datepicker).call()
        })
    }, t.prototype.watch = function () {
        var t = this;
        t._core.$element.find("." + t._core.options.datepicker["class"]).on("click", "." + t._core.options.datepicker["class"] + "_next", function () {
            var i = e(this).parents("." + t._core.options.datepicker["class"]);
            i.trigger("mfDatePicker.next"), i.trigger("mfDatePicker.update", t._core.options.datepicker), i.trigger("mfDatePicker.refresh", t._core.options.datepicker)
        }).on("click", "." + t._core.options.datepicker["class"] + "_prev", function () {
            var i = e(this).parents("." + t._core.options.datepicker["class"]);
            i.trigger("mfDatePicker.prev"), i.trigger("mfDatePicker.update", t._core.options.datepicker), i.trigger("mfDatePicker.refresh", t._core.options.datepicker)
        }).on("click", ".dp-day", function () {
            var i = e(this).parents("." + t._core.options.datepicker["class"]);
            i.trigger("mfDatePicker.pick", {
                opt: t._core.options.datepicker,
                day: e(this)
            }), i.parent().find("input").on("blur", t.blur).trigger("blur").trigger("keyup")
        }).on("click", function () {
        }).on(this._handlers).parent().on("click", function (e) {
            return e.preventDefault(), !1
        }).find("input").on("focus", function () {
            e(this).parent().find("." + t._core.options.datepicker["class"]).trigger("mfDatePicker.open")
        }).on("blur", this.blur).on("keydown", function (i) {
            (9 == i.keyCode || i.shiftKey && 9 == i.keyCode) && e(this).on("blur", t.blur)
        }).parents("body").on("mousedown", function (e) {
            var i = t._core.$element.find("." + t._core.options.datepicker["class"]).parent();
            i.length && (i.is(e.target) || 0 !== i.has(e.target).length ? i.find("input").off("blur", t.blur) : i.find("input").on("blur", t.blur).trigger("blur"))
        }), t._core.$element.on("mf.reset", function () {
            e(this).find("." + t._core.options.datepicker["class"]).each(function () {
                e(this).trigger("mfDatePicker.close")
            })
        })
    }, t.prototype.blur = function () {
        e(this).parent().find(".mfDatePicker").trigger("mfDatePicker.close")
    }, t.prototype.close = function () {
        navigator.userAgent.match(/(iPod|iPhone|iPad)/) || e(this).hasClass("open") && e(this).removeClass("open")
    }, t.prototype.open = function () {
        navigator.userAgent.match(/(iPod|iPhone|iPad)/) || e(this).hasClass("open") || e(this).addClass("open")
    }, t.prototype.next = function () {
        var t = e(this), i = t.data("date");
        i = 11 == i.getMonth() ? new Date(i.getFullYear() + 1, 0, 1) : new Date(i.getFullYear(), i.getMonth() + 1, 1), t.data("date", i)
    }, t.prototype.prev = function () {
        var t = e(this), i = t.data("date");
        i = 0 == i.getMonth() ? new Date(i.getFullYear() - 1, 11, 1) : new Date(i.getFullYear(), i.getMonth() - 1, 1), t.data("date", i)
    }, t.prototype.pick = function (t, i) {
        var o = e(this);
        o.data("pickedDate", i.day.addClass("dp-selected").data("date")), o.find(".dp-day").not(i.day).removeClass("dp-selected"), o.parent().find("input").val((o.data("pickedDate").getMonth() + 1 < 10 ? "0" + (o.data("pickedDate").getMonth() + 1) : o.data("pickedDate").getMonth() + 1) + "/" + (o.data("pickedDate").getDate() < 10 ? "0" + o.data("pickedDate").getDate() : o.data("pickedDate").getDate()) + "/" + o.data("pickedDate").getFullYear())
    }, t.prototype.update = function (t, i) {
        var o = e(this), s = e("<div/>", {"class": i["class"] + "_panel"});
        s.append(e("<a/>", {
            "class": i["class"] + "_prev",
            text: i.prevMonth
        })), s.append(e("<a/>", {
            "class": i["class"] + "_next",
            text: i.nextMonth
        })), s.append(e("<div/>", {
            "class": i["class"] + "_title",
            text: i.months[o.data("date").getMonth()] + " " + o.data("date").getFullYear()
        }));
        var n = o.find("." + i["class"] + "_panel");
        n.length ? n.replaceWith(s) : s.appendTo(o)
    }, t.prototype.refresh = function (t, i) {
        for (var o = e(this), s = e("<table/>"), n = e("<tr/>"), a = 0; a < i.days.length; a++)n.append(e("<th/>", {
            "class": "dp-weekday",
            text: i.days[a]
        }));
        s.append(n);
        for (var r = o.data("date"), l = o.data("pickedDate"), c = new Date(r.getFullYear(), r.getMonth() + 1, 0).getDate(), d = new Date(r.getFullYear(), r.getMonth(), 0).getDate(), p = new Date(r.getFullYear(), r.getMonth(), 1).getDay(), f = 1, a = 0; 7 > a; a++) {
            n = e("<tr/>");
            for (var h = 0; 7 > h; h++) {
                var u, m = 7 * a + h + 1, g = e("<td/>", {"class": "dp-day"}), y = new Date;
                if (y.setHours(0), y.setMinutes(0), y.setSeconds(0), y.setMilliseconds(0), 0 == h && m > c + p)break;
                1 > m - p ? (g.text(d + (m - p)).addClass("dp-offset"), u = new Date(r.getFullYear(), r.getMonth() - 1, d + (m - p))) : c + p >= m ? (g.text(m - p), u = new Date(r.getFullYear(), r.getMonth(), m - p)) : (g.text(f).addClass("dp-offset"), u = new Date(r.getFullYear(), r.getMonth() + 1, f++)), u.valueOf() == y.valueOf() && g.addClass("dp-today"), l && u.valueOf() == l.valueOf() && g.addClass("dp-selected"), n.append(g.data("date", u))
            }
            "" != n.html() && s.append(n)
        }
        var v = o.find("table");
        v.length ? v.replaceWith(s) : s.appendTo(o)
    }
}(window.jQuery, window, document), function (e) {
    var t = e.fn.rdMailForm.Constructor.Plugins.Icon = function (i) {
        this._core = i, this._core.options = e.extend(!0, {}, t.Defaults, this._core.options), this.initialize()
    };
    this._handlers = {"mfIcon.change": this.change}, t.Defaults = {
        icon: {
            applyTo: "[data-add-icon]",
            "class": "mfIcon",
            states: {
                ".mfInput": {
                    "mfIcon.default": ["mfInput.blur", "mfInput.idle", "mfInput.reset"],
                    "mfIcon.state-1": ["mfInput.type"],
                    "mfIcon.state-2": ["mfInput.delete"]
                }
            }
        }
    }, t.prototype.initialize = function () {
        this._core.$element.trigger("mfIcon.initialize"), this.create(), this.watch(), this._core.$element.trigger("mfIcon.initialized")
    }, t.prototype.create = function () {
        var t = this;
        t._core.$element.find(t._core.options.icon.applyTo).each(function () {
            var i = e(this);
            i.append(e("<span/>", {"class": t._core.options.icon["class"]}).append(e("<span/>")))
        })
    }, t.prototype.watch = function () {
        var t = this;
        t._core.$element.find("." + t._core.options.icon["class"]).on(t._handlers);
        for (var i in t._core.options.icon.states) {
            var o = t._core.$element.find(i);
            for (var s in t._core.options.icon.states[i])for (var n in t._core.options.icon.states[i][s])o.on(t._core.options.icon.states[i][s][n], {state: s}, function (i) {
                e(this).find("." + t._core.options.icon["class"]).attr("class", i.data.state.replace(".", " "))
            })
        }
    }
}(window.jQuery, window, document), function (e) {
    var t = e.fn.rdMailForm.Constructor.Plugins.Placeholder = function (i) {
        this._core = i, this._core.options = e.extend(!0, {}, t.Defaults, this._core.options), this.initialize()
    };
    this._handlers = {"mfIcon.change": this.change}, t.Defaults = {
        placeholder: {
            applyTo: "[data-add-placeholder]",
            "class": "mfPlaceHolder",
            states: {
                ".mfInput": {
                    "mfPlaceHolder.default": ["mfInput.void", "mfInput.reset"],
                    "mfPlaceHolder.state-1": ["mfInput.fill", "mfInput.focus"]
                }
            }
        }
    }, t.prototype.initialize = function () {
        this._core.$element.trigger("mfPlaceHolder.initialize"), this.create(), this.watch(), this._core.$element.trigger("mfPlaceHolder.initialized")
    }, t.prototype.create = function () {
        var t = this;
        t._core.$element.find(t._core.options.placeholder.applyTo).each(function () {
            var i = e(this);
            i.append(e("<span/>", {
                "class": t._core.options.placeholder["class"],
                text: i.find("[placeholder]").attr("placeholder") ? i.find("[placeholder]").attr("placeholder") : i.find("[data-placeholder]").attr("data-placeholder")
            })).find("[placeholder]").removeAttr("placeholder").removeAttr("data-placeholder")
        })
    }, t.prototype.watch = function () {
        var t = this;
        t._core.$element.find("." + t._core.options.placeholder["class"]).on("click", function () {
            e(this).parent().find("input, textarea").trigger("focus")
        }).on(t._handlers);
        for (var i in t._core.options.icon.states) {
            var o = t._core.$element.find(i);
            for (var s in t._core.options.placeholder.states[i])for (var n in t._core.options.placeholder.states[i][s])o.on(t._core.options.placeholder.states[i][s][n], {state: s}, function (i) {
                e(this).find("." + t._core.options.placeholder["class"]).attr("class", i.data.state.replace(".", " "))
            })
        }
    }
}(window.jQuery, window, document), function (e) {
    var t = e.fn.rdMailForm.Constructor.Plugins.Progress = function (i) {
        this._core = i, this._core.options = e.extend(!0, {}, t.Defaults, this._core.options), this.initialize()
    };
    t.Defaults = {progress: {applyTo: ".mfInfo", "class": "mfProgress"}}, t.prototype.initialize = function () {
        this._core.$element.trigger("mfProgress.initialize"), this.create(), this.watch(), this._core.$element.trigger("mfProgress.initialized")
    }, t.prototype.create = function () {
        var t = this;
        t._core.$element.find(t._core.options.progress.applyTo).each(function () {
            var i = e(this);
            i.addClass(t._core.options.progress["class"]).wrapInner(e("<span/>", {"class": "cnt"})).append(e("<span/>", {"class": "loader"})).append(e("<span/>", {"class": "msg"}))
        })
    }, t.prototype.watch = function () {
        var t = this;
        t._core.$element.on("mf.process", function () {
            e(this).find("." + t._core.options.progress["class"]).removeClass("hide").addClass("sending").find(".msg").text("Loading...")
        }).on("mf.fail", function (i, o) {
            e(this).find("." + t._core.options.progress["class"]).removeClass("sending").addClass("fail").find(".msg").text(o.message), setTimeout(e.proxy(function () {
                e(this).find("." + t._core.options.progress["class"]).removeClass("fail").addClass("hide").find(".msg")
            }, this), 3e3)
        }).on("mf.success", function (i, o) {
            e(this).find("." + t._core.options.progress["class"]).removeClass("sending").addClass("success").find(".msg").text(o.message), setTimeout(e.proxy(function () {
                e(this).find("." + t._core.options.progress["class"]).removeClass("success").addClass("hide").find(".msg")
            }, this), 1500)
        }).on("mf.reset", function () {
            e(this).find("." + t._core.options.progress["class"]).removeClass("sending").removeClass("fail").removeClass("success").find(".msg")
        })
    }
}(window.jQuery, window, document);