
if (typeof jQuery === "undefined") {
    throw new Error("jquery-confirm requires jQuery");
}
var jconfirm, Jconfirm;
(function ($, window) {
    $.fn.confirm = function (options, option2) {
        if (typeof options === "undefined") {
            options = {};
        }
        if (typeof options === "string") {
            options = {content: options, title: (option2) ? option2 : false};
        }
        $(this).each(function () {
            var $this = $(this);
            if ($this.attr("jc-attached")) {
                console.warn("jConfirm has already been attached to this element ", $this[0]);
                return;
            }
            $this.on("click", function (e) {
                e.preventDefault();
                var jcOption = $.extend({}, options);
                if ($this.attr("data-title")) {
                    jcOption.title = $this.attr("data-title");
                }
                if ($this.attr("data-content")) {
                    jcOption.content = $this.attr("data-content");
                }
                if (typeof jcOption.buttons == "undefined") {
                    jcOption.buttons = {};
                }
                jcOption["$target"] = $this;
                if ($this.attr("href") && Object.keys(jcOption.buttons).length == 0) {
                    var buttons = $.extend(true, {}, jconfirm.pluginDefaults.defaultButtons, (jconfirm.defaults || {}).defaultButtons || {});
                    var firstBtn = Object.keys(buttons)[0];
                    jcOption.buttons = buttons;
                    jcOption.buttons[firstBtn].action = function () {
                        location.href = $this.attr("href");
                    };
                }
                jcOption.closeIcon = false;
                var instance = $.confirm(jcOption);
            });
            $this.attr("jc-attached", true);
        });
        return $(this);
    };
    $.confirm = function (options, option2) {
        if (typeof options === "undefined") {
            options = {};
        }
        if (typeof options === "string") {
            options = {content: options, title: (option2) ? option2 : false};
        }
        var putDefaultButtons = !(options.buttons == false);
        if (typeof options.buttons != "object") {
            options.buttons = {};
        }
        if (Object.keys(options.buttons).length == 0 && putDefaultButtons) {
            var buttons = $.extend(true, {}, jconfirm.pluginDefaults.defaultButtons, (jconfirm.defaults || {}).defaultButtons || {});
            options.buttons = buttons;
        }
        return jconfirm(options);
    };
    $.alert = function (options, option2) {
        if (typeof options === "undefined") {
            options = {};
        }
        if (typeof options === "string") {
            options = {content: options, title: (option2) ? option2 : false};
        }
        var putDefaultButtons = !(options.buttons == false);
        if (typeof options.buttons != "object") {
            options.buttons = {};
        }
        if (Object.keys(options.buttons).length == 0 && putDefaultButtons) {
            var buttons = $.extend(true, {}, jconfirm.pluginDefaults.defaultButtons, (jconfirm.defaults || {}).defaultButtons || {});
            var firstBtn = Object.keys(buttons)[0];
            options.buttons[firstBtn] = buttons[firstBtn];
        }
        return jconfirm(options);
    };
    $.dialog = function (options, option2) {
        if (typeof options === "undefined") {
            options = {};
        }
        if (typeof options === "string") {
            options = {
                content: options, title: (option2) ? option2 : false, closeIcon: function () {
                }
            };
        }
        options.buttons = {};
        if (typeof options.closeIcon == "undefined") {
            options.closeIcon = function () {
            };
        }
        options.confirmKeys = [13];
        return jconfirm(options);
    };
    jconfirm = function (options) {
        if (typeof options === "undefined") {
            options = {};
        }
        var pluginOptions = $.extend(true, {}, jconfirm.pluginDefaults);
        if (jconfirm.defaults) {
            pluginOptions = $.extend(true, pluginOptions, jconfirm.defaults);
        }
        pluginOptions = $.extend(true, {}, pluginOptions, options);
        var instance = new Jconfirm(pluginOptions);
        jconfirm.instances.push(instance);
        return instance;
    };
    Jconfirm = function (options) {
        $.extend(this, options);
        this._init();
    };
    Jconfirm.prototype = {
        _init: function () {
            var that = this;
            if (!jconfirm.instances.length) {
                jconfirm.lastFocused = $("body").find(":focus");
            }
            this._id = Math.round(Math.random() * 99999);
            this.contentParsed = $(document.createElement("div"));
            if (!this.lazyOpen) {
                setTimeout(function () {
                    that.open();
                }, 0);
            }
        },
        _buildHTML: function () {
            var that = this;
            this._parseAnimation(this.animation, "o");
            this._parseAnimation(this.closeAnimation, "c");
            this._parseBgDismissAnimation(this.backgroundDismissAnimation);
            this._parseColumnClass(this.columnClass);
            this._parseTheme(this.theme);
            this._parseType(this.type);
            var template = $(this.template);
            template.find(".jconfirm-box").addClass(this.animationParsed).addClass(this.backgroundDismissAnimationParsed).addClass(this.typeParsed);
            if (this.typeAnimated) {
                template.find(".jconfirm-box").addClass("jconfirm-type-animated");
            }
            if (this.useBootstrap) {
                template.find(".jc-bs3-row").addClass(this.bootstrapClasses.row);
                template.find(".jc-bs3-row").addClass("justify-content-md-center justify-content-sm-center justify-content-xs-center justify-content-lg-center");
                template.find(".jconfirm-box-container").addClass(this.columnClassParsed);
                if (this.containerFluid) {
                    template.find(".jc-bs3-container").addClass(this.bootstrapClasses.containerFluid);
                } else {
                    template.find(".jc-bs3-container").addClass(this.bootstrapClasses.container);
                }
            } else {
                template.find(".jconfirm-box").css("width", this.boxWidth);
            }
            if (this.titleClass) {
                template.find(".jconfirm-title-c").addClass(this.titleClass);
            }
            template.addClass(this.themeParsed);
            var ariaLabel = "jconfirm-box" + this._id;
            template.find(".jconfirm-box").attr("aria-labelledby", ariaLabel).attr("tabindex", -1);
            template.find(".jconfirm-content").attr("id", ariaLabel);
            if (this.bgOpacity !== null) {
                template.find(".jconfirm-bg").css("opacity", this.bgOpacity);
            }
            if (this.rtl) {
                template.addClass("jconfirm-rtl");
            }
            this.$el = template.appendTo(this.container);
            this.$jconfirmBoxContainer = this.$el.find(".jconfirm-box-container");
            this.$jconfirmBox = this.$body = this.$el.find(".jconfirm-box");
            this.$jconfirmBg = this.$el.find(".jconfirm-bg");
            this.$title = this.$el.find(".jconfirm-title");
            this.$titleContainer = this.$el.find(".jconfirm-title-c");
            this.$content = this.$el.find("div.jconfirm-content");
            this.$contentPane = this.$el.find(".jconfirm-content-pane");
            this.$icon = this.$el.find(".jconfirm-icon-c");
            this.$closeIcon = this.$el.find(".jconfirm-closeIcon");
            this.$holder = this.$el.find(".jconfirm-holder");
            this.$btnc = this.$el.find(".jconfirm-buttons");
            this.$scrollPane = this.$el.find(".jconfirm-scrollpane");
            that.setStartingPoint();
            this._contentReady = $.Deferred();
            this._modalReady = $.Deferred();
            this.$holder.css({"padding-top": this.offsetTop, "padding-bottom": this.offsetBottom,});
            this.setTitle();
            this.setIcon();
            this._setButtons();
            this._parseContent();
            this.initDraggable();
            if (this.isAjax) {
                this.showLoading(false);
            }
            $.when(this._contentReady, this._modalReady).then(function () {
                if (that.isAjaxLoading) {
                    setTimeout(function () {
                        that.isAjaxLoading = false;
                        that.setContent();
                        that.setTitle();
                        that.setIcon();
                        setTimeout(function () {
                            that.hideLoading(false);
                            that._updateContentMaxHeight();
                        }, 100);
                        if (typeof that.onContentReady === "function") {
                            that.onContentReady();
                        }
                    }, 50);
                } else {
                    that._updateContentMaxHeight();
                    that.setTitle();
                    that.setIcon();
                    if (typeof that.onContentReady === "function") {
                        that.onContentReady();
                    }
                }
                if (that.autoClose) {
                    that._startCountDown();
                }
            });
            this._watchContent();
            if (this.animation === "none") {
                this.animationSpeed = 1;
                this.animationBounce = 1;
            }
            this.$body.css(this._getCSS(this.animationSpeed, this.animationBounce));
            this.$contentPane.css(this._getCSS(this.animationSpeed, 1));
            this.$jconfirmBg.css(this._getCSS(this.animationSpeed, 1));
            this.$jconfirmBoxContainer.css(this._getCSS(this.animationSpeed, 1));
        },
        _typePrefix: "jconfirm-type-",
        typeParsed: "",
        _parseType: function (type) {
            this.typeParsed = this._typePrefix + type;
        },
        setType: function (type) {
            var oldClass = this.typeParsed;
            this._parseType(type);
            this.$jconfirmBox.removeClass(oldClass).addClass(this.typeParsed);
        },
        themeParsed: "",
        _themePrefix: "jconfirm-",
        setTheme: function (theme) {
            var previous = this.theme;
            this.theme = theme || this.theme;
            this._parseTheme(this.theme);
            if (previous) {
                this.$el.removeClass(previous);
            }
            this.$el.addClass(this.themeParsed);
            this.theme = theme;
        },
        _parseTheme: function (theme) {
            var that = this;
            theme = theme.split(",");
            $.each(theme, function (k, a) {
                if (a.indexOf(that._themePrefix) === -1) {
                    theme[k] = that._themePrefix + $.trim(a);
                }
            });
            this.themeParsed = theme.join(" ").toLowerCase();
        },
        backgroundDismissAnimationParsed: "",
        _bgDismissPrefix: "jconfirm-hilight-",
        _parseBgDismissAnimation: function (bgDismissAnimation) {
            var animation = bgDismissAnimation.split(",");
            var that = this;
            $.each(animation, function (k, a) {
                if (a.indexOf(that._bgDismissPrefix) === -1) {
                    animation[k] = that._bgDismissPrefix + $.trim(a);
                }
            });
            this.backgroundDismissAnimationParsed = animation.join(" ").toLowerCase();
        },
        animationParsed: "",
        closeAnimationParsed: "",
        _animationPrefix: "jconfirm-animation-",
        setAnimation: function (animation) {
            this.animation = animation || this.animation;
            this._parseAnimation(this.animation, "o");
        },
        _parseAnimation: function (animation, which) {
            which = which || "o";
            var animations = animation.split(",");
            var that = this;
            $.each(animations, function (k, a) {
                if (a.indexOf(that._animationPrefix) === -1) {
                    animations[k] = that._animationPrefix + $.trim(a);
                }
            });
            var a_string = animations.join(" ").toLowerCase();
            if (which === "o") {
                this.animationParsed = a_string;
            } else {
                this.closeAnimationParsed = a_string;
            }
            return a_string;
        },
        setCloseAnimation: function (closeAnimation) {
            this.closeAnimation = closeAnimation || this.closeAnimation;
            this._parseAnimation(this.closeAnimation, "c");
        },
        setAnimationSpeed: function (speed) {
            this.animationSpeed = speed || this.animationSpeed;
        },
        columnClassParsed: "",
        setColumnClass: function (colClass) {
            if (!this.useBootstrap) {
                console.warn("cannot set columnClass, useBootstrap is set to false");
                return;
            }
            this.columnClass = colClass || this.columnClass;
            this._parseColumnClass(this.columnClass);
            this.$jconfirmBoxContainer.addClass(this.columnClassParsed);
        },
        _updateContentMaxHeight: function () {
            var height = $(window).height() - (this.$jconfirmBox.outerHeight() - this.$contentPane.outerHeight()) - (this.offsetTop + this.offsetBottom);
            this.$contentPane.css({"max-height": height + "px"});
        },
        setBoxWidth: function (width) {
            if (this.useBootstrap) {
                console.warn("cannot set boxWidth, useBootstrap is set to true");
                return;
            }
            this.boxWidth = width;
            this.$jconfirmBox.css("width", width);
        },
        _parseColumnClass: function (colClass) {
            colClass = colClass.toLowerCase();
            var p;
            switch (colClass) {
                case"xl":
                case"xlarge":
                    p = "col-md-12";
                    break;
                case"l":
                case"large":
                    p = "col-md-8 col-md-offset-2";
                    break;
                case"m":
                case"medium":
                    p = "col-md-6 col-md-offset-3";
                    break;
                case"s":
                case"small":
                    p = "col-md-4 col-md-offset-4";
                    break;
                case"xs":
                case"xsmall":
                    p = "col-md-2 col-md-offset-5";
                    break;
                default:
                    p = colClass;
            }
            this.columnClassParsed = p;
        },
        initDraggable: function () {
            var that = this;
            var $t = this.$titleContainer;
            this.resetDrag();
            if (this.draggable) {
                $t.on("mousedown", function (e) {
                    $t.addClass("jconfirm-hand");
                    that.mouseX = e.clientX;
                    that.mouseY = e.clientY;
                    that.isDrag = true;
                });
                $(window).on("mousemove." + this._id, function (e) {
                    if (that.isDrag) {
                        that.movingX = e.clientX - that.mouseX + that.initialX;
                        that.movingY = e.clientY - that.mouseY + that.initialY;
                        that.setDrag();
                    }
                });
                $(window).on("mouseup." + this._id, function () {
                    $t.removeClass("jconfirm-hand");
                    if (that.isDrag) {
                        that.isDrag = false;
                        that.initialX = that.movingX;
                        that.initialY = that.movingY;
                    }
                });
            }
        },
        resetDrag: function () {
            this.isDrag = false;
            this.initialX = 0;
            this.initialY = 0;
            this.movingX = 0;
            this.movingY = 0;
            this.mouseX = 0;
            this.mouseY = 0;
            this.$jconfirmBoxContainer.css("transform", "translate(" + 0 + "px, " + 0 + "px)");
        },
        setDrag: function () {
            if (!this.draggable) {
                return;
            }
            this.alignMiddle = false;
            var boxWidth = this.$jconfirmBox.outerWidth();
            var boxHeight = this.$jconfirmBox.outerHeight();
            var windowWidth = $(window).width();
            var windowHeight = $(window).height();
            var that = this;
            var dragUpdate = 1;
            if (that.movingX % dragUpdate === 0 || that.movingY % dragUpdate === 0) {
                if (that.dragWindowBorder) {
                    var leftDistance = (windowWidth / 2) - boxWidth / 2;
                    var topDistance = (windowHeight / 2) - boxHeight / 2;
                    topDistance -= that.dragWindowGap;
                    leftDistance -= that.dragWindowGap;
                    if (leftDistance + that.movingX < 0) {
                        that.movingX = -leftDistance;
                    } else {
                        if (leftDistance - that.movingX < 0) {
                            that.movingX = leftDistance;
                        }
                    }
                    if (topDistance + that.movingY < 0) {
                        that.movingY = -topDistance;
                    } else {
                        if (topDistance - that.movingY < 0) {
                            that.movingY = topDistance;
                        }
                    }
                }
                that.$jconfirmBoxContainer.css("transform", "translate(" + that.movingX + "px, " + that.movingY + "px)");
            }
        },
        _scrollTop: function () {
            if (typeof pageYOffset !== "undefined") {
                return pageYOffset;
            } else {
                var B = document.body;
                var D = document.documentElement;
                D = (D.clientHeight) ? D : B;
                return D.scrollTop;
            }
        },
        _watchContent: function () {
            var that = this;
            if (this._timer) {
                clearInterval(this._timer);
            }
            var prevContentHeight = 0;
            this._timer = setInterval(function () {
                if (that.smoothContent) {
                    var contentHeight = that.$content.outerHeight() || 0;
                    if (contentHeight !== prevContentHeight) {
                        that.$contentPane.css({height: contentHeight}).scrollTop(0);
                        prevContentHeight = contentHeight;
                    }
                    var wh = $(window).height();
                    var total = that.offsetTop + that.offsetBottom + that.$jconfirmBox.height() - that.$contentPane.height() + that.$content.height();
                    if (total < wh) {
                        that.$contentPane.addClass("no-scroll");
                    } else {
                        that.$contentPane.removeClass("no-scroll");
                    }
                }
            }, this.watchInterval);
        },
        _overflowClass: "jconfirm-overflow",
        _hilightAnimating: false,
        highlight: function () {
            this.hiLightModal();
        },
        hiLightModal: function () {
            var that = this;
            if (this._hilightAnimating) {
                return;
            }
            that.$body.addClass("hilight");
            var duration = parseFloat(that.$body.css("animation-duration")) || 2;
            this._hilightAnimating = true;
            setTimeout(function () {
                that._hilightAnimating = false;
                that.$body.removeClass("hilight");
            }, duration * 1000);
        },
        _bindEvents: function () {
            var that = this;
            this.boxClicked = false;
            this.$scrollPane.click(function (e) {
                if (!that.boxClicked) {
                    var buttonName = false;
                    var shouldClose = false;
                    var str;
                    if (typeof that.backgroundDismiss == "function") {
                        str = that.backgroundDismiss();
                    } else {
                        str = that.backgroundDismiss;
                    }
                    if (typeof str == "string" && typeof that.buttons[str] != "undefined") {
                        buttonName = str;
                        shouldClose = false;
                    } else {
                        if (typeof str == "undefined" || !!(str) == true) {
                            shouldClose = true;
                        } else {
                            shouldClose = false;
                        }
                    }
                    if (buttonName) {
                        var btnResponse = that.buttons[buttonName].action.apply(that);
                        shouldClose = (typeof btnResponse == "undefined") || !!(btnResponse);
                    }
                    if (shouldClose) {
                        that.close();
                    } else {
                        that.hiLightModal();
                    }
                }
                that.boxClicked = false;
            });
            this.$jconfirmBox.click(function (e) {
                that.boxClicked = true;
            });
            var isKeyDown = false;
            $(window).on("jcKeyDown." + that._id, function (e) {
                if (!isKeyDown) {
                    isKeyDown = true;
                }
            });
            $(window).on("keyup." + that._id, function (e) {
                if (isKeyDown) {
                    that.reactOnKey(e);
                    isKeyDown = false;
                }
            });
            $(window).on("resize." + this._id, function () {
                that._updateContentMaxHeight();
                setTimeout(function () {
                    that.resetDrag();
                }, 100);
            });
        },
        _cubic_bezier: "0.36, 0.55, 0.19",
        _getCSS: function (speed, bounce) {
            return {
                "-webkit-transition-duration": speed / 1000 + "s",
                "transition-duration": speed / 1000 + "s",
                "-webkit-transition-timing-function": "cubic-bezier(" + this._cubic_bezier + ", " + bounce + ")",
                "transition-timing-function": "cubic-bezier(" + this._cubic_bezier + ", " + bounce + ")"
            };
        },
        _setButtons: function () {
            var that = this;
            var total_buttons = 0;
            if (typeof this.buttons !== "object") {
                this.buttons = {};
            }
            $.each(this.buttons, function (key, button) {
                total_buttons += 1;
                if (typeof button === "function") {
                    that.buttons[key] = button = {action: button};
                }
                that.buttons[key].text = button.text || key;
                that.buttons[key].btnClass = button.btnClass || "btn-default";
                that.buttons[key].action = button.action || function () {
                };
                that.buttons[key].keys = button.keys || [];
                that.buttons[key].isHidden = button.isHidden || false;
                that.buttons[key].isDisabled = button.isDisabled || false;
                $.each(that.buttons[key].keys, function (i, a) {
                    that.buttons[key].keys[i] = a.toLowerCase();
                });
                var button_element = $('<button type="button" class="btn"></button>').html(that.buttons[key].text).addClass(that.buttons[key].btnClass).prop("disabled", that.buttons[key].isDisabled).css("display", that.buttons[key].isHidden ? "none" : "").click(function (e) {
                    e.preventDefault();
                    var res = that.buttons[key].action.apply(that, [that.buttons[key]]);
                    that.onAction.apply(that, [key, that.buttons[key]]);
                    that._stopCountDown();
                    if (typeof res === "undefined" || res) {
                        that.close();
                    }
                });
                that.buttons[key].el = button_element;
                that.buttons[key].setText = function (text) {
                    button_element.html(text);
                };
                that.buttons[key].addClass = function (className) {
                    button_element.addClass(className);
                };
                that.buttons[key].removeClass = function (className) {
                    button_element.removeClass(className);
                };
                that.buttons[key].disable = function () {
                    that.buttons[key].isDisabled = true;
                    button_element.prop("disabled", true);
                };
                that.buttons[key].enable = function () {
                    that.buttons[key].isDisabled = false;
                    button_element.prop("disabled", false);
                };
                that.buttons[key].show = function () {
                    that.buttons[key].isHidden = false;
                    button_element.css("display", "");
                };
                that.buttons[key].hide = function () {
                    that.buttons[key].isHidden = true;
                    button_element.css("display", "none");
                };
                that["$_" + key] = that["$$" + key] = button_element;
                that.$btnc.append(button_element);
            });
            if (total_buttons === 0) {
                this.$btnc.hide();
            }
            if (this.closeIcon === null && total_buttons === 0) {
                this.closeIcon = true;
            }
            if (this.closeIcon) {
                if (this.closeIconClass) {
                    var closeHtml = '<i class="' + this.closeIconClass + '"></i>';
                    this.$closeIcon.html(closeHtml);
                }
                this.$closeIcon.click(function (e) {
                    e.preventDefault();
                    var buttonName = false;
                    var shouldClose = false;
                    var str;
                    if (typeof that.closeIcon == "function") {
                        str = that.closeIcon();
                    } else {
                        str = that.closeIcon;
                    }
                    if (typeof str == "string" && typeof that.buttons[str] != "undefined") {
                        buttonName = str;
                        shouldClose = false;
                    } else {
                        if (typeof str == "undefined" || !!(str) == true) {
                            shouldClose = true;
                        } else {
                            shouldClose = false;
                        }
                    }
                    if (buttonName) {
                        var btnResponse = that.buttons[buttonName].action.apply(that);
                        shouldClose = (typeof btnResponse == "undefined") || !!(btnResponse);
                    }
                    if (shouldClose) {
                        that.close();
                    }
                });
                this.$closeIcon.show();
            } else {
                this.$closeIcon.hide();
            }
        },
        setTitle: function (string, force) {
            force = force || false;
            if (typeof string !== "undefined") {
                if (typeof string == "string") {
                    this.title = string;
                } else {
                    if (typeof string == "function") {
                        if (typeof string.promise == "function") {
                            console.error("Promise was returned from title function, this is not supported.");
                        }
                        var response = string();
                        if (typeof response == "string") {
                            this.title = response;
                        } else {
                            this.title = false;
                        }
                    } else {
                        this.title = false;
                    }
                }
            }
            if (this.isAjaxLoading && !force) {
                return;
            }
            this.$title.html(this.title || "");
            this.updateTitleContainer();
        },
        setIcon: function (iconClass, force) {
            force = force || false;
            if (typeof iconClass !== "undefined") {
                if (typeof iconClass == "string") {
                    this.icon = iconClass;
                } else {
                    if (typeof iconClass === "function") {
                        var response = iconClass();
                        if (typeof response == "string") {
                            this.icon = response;
                        } else {
                            this.icon = false;
                        }
                    } else {
                        this.icon = false;
                    }
                }
            }
            if (this.isAjaxLoading && !force) {
                return;
            }
            this.$icon.html(this.icon ? '<i class="' + this.icon + '"></i>' : "");
            this.updateTitleContainer();
        },
        updateTitleContainer: function () {
            if (!this.title && !this.icon) {
                this.$titleContainer.hide();
            } else {
                this.$titleContainer.show();
            }
        },
        setContentPrepend: function (content, force) {
            if (!content) {
                return;
            }
            this.contentParsed.prepend(content);
        },
        setContentAppend: function (content) {
            if (!content) {
                return;
            }
            this.contentParsed.append(content);
        },
        setContent: function (content, force) {
            force = !!force;
            var that = this;
            if (content) {
                this.contentParsed.html("").append(content);
            }
            if (this.isAjaxLoading && !force) {
                return;
            }
            this.$content.html("");
            this.$content.append(this.contentParsed);
            setTimeout(function () {
                that.$body.find("input[autofocus]:visible:first").focus();
            }, 100);
        },
        loadingSpinner: false,
        showLoading: function (disableButtons) {
            this.loadingSpinner = true;
            this.$jconfirmBox.addClass("loading");
            if (disableButtons) {
                this.$btnc.find("button").prop("disabled", true);
            }
        },
        hideLoading: function (enableButtons) {
            this.loadingSpinner = false;
            this.$jconfirmBox.removeClass("loading");
            if (enableButtons) {
                this.$btnc.find("button").prop("disabled", false);
            }
        },
        ajaxResponse: false,
        contentParsed: "",
        isAjax: false,
        isAjaxLoading: false,
        _parseContent: function () {
            var that = this;
            var e = "&nbsp;";
            if (typeof this.content == "function") {
                var res = this.content.apply(this);
                if (typeof res == "string") {
                    this.content = res;
                } else {
                    if (typeof res == "object" && typeof res.always == "function") {
                        this.isAjax = true;
                        this.isAjaxLoading = true;
                        res.always(function (data, status, xhr) {
                            that.ajaxResponse = {data: data, status: status, xhr: xhr};
                            that._contentReady.resolve(data, status, xhr);
                            if (typeof that.contentLoaded == "function") {
                                that.contentLoaded(data, status, xhr);
                            }
                        });
                        this.content = e;
                    } else {
                        this.content = e;
                    }
                }
            }
            if (typeof this.content == "string" && this.content.substr(0, 4).toLowerCase() === "url:") {
                this.isAjax = true;
                this.isAjaxLoading = true;
                var u = this.content.substring(4, this.content.length);
                $.get(u).done(function (html) {
                    that.contentParsed.html(html);
                }).always(function (data, status, xhr) {
                    that.ajaxResponse = {data: data, status: status, xhr: xhr};
                    that._contentReady.resolve(data, status, xhr);
                    if (typeof that.contentLoaded == "function") {
                        that.contentLoaded(data, status, xhr);
                    }
                });
            }
            if (!this.content) {
                this.content = e;
            }
            if (!this.isAjax) {
                this.contentParsed.html(this.content);
                this.setContent();
                that._contentReady.resolve();
            }
        },
        _stopCountDown: function () {
            clearInterval(this.autoCloseInterval);
            if (this.$cd) {
                this.$cd.remove();
            }
        },
        _startCountDown: function () {
            var that = this;
            var opt = this.autoClose.split("|");
            if (opt.length !== 2) {
                console.error("Invalid option for autoClose. example 'close|10000'");
                return false;
            }
            var button_key = opt[0];
            var time = parseInt(opt[1]);
            if (typeof this.buttons[button_key] === "undefined") {
                console.error("Invalid button key '" + button_key + "' for autoClose");
                return false;
            }
            var seconds = Math.ceil(time / 1000);
            this.$cd = $('<span class="countdown"> (' + seconds + ")</span>").appendTo(this["$_" + button_key]);
            this.autoCloseInterval = setInterval(function () {
                that.$cd.html(" (" + (seconds -= 1) + ") ");
                if (seconds <= 0) {
                    that["$$" + button_key].trigger("click");
                    that._stopCountDown();
                }
            }, 1000);
        },
        _getKey: function (key) {
            switch (key) {
                case 192:
                    return "tilde";
                case 13:
                    return "enter";
                case 16:
                    return "shift";
                case 9:
                    return "tab";
                case 20:
                    return "capslock";
                case 17:
                    return "ctrl";
                case 91:
                    return "win";
                case 18:
                    return "alt";
                case 27:
                    return "esc";
                case 32:
                    return "space";
            }
            var initial = String.fromCharCode(key);
            if (/^[A-z0-9]+$/.test(initial)) {
                return initial.toLowerCase();
            } else {
                return false;
            }
        },
        reactOnKey: function (e) {
            var that = this;
            var a = $(".jconfirm");
            if (a.eq(a.length - 1)[0] !== this.$el[0]) {
                return false;
            }
            var key = e.which;
            if (this.$content.find(":input").is(":focus") && /13|32/.test(key)) {
                return false;
            }
            var keyChar = this._getKey(key);
            if (keyChar === "esc" && this.escapeKey) {
                if (this.escapeKey === true) {
                    this.$scrollPane.trigger("click");
                } else {
                    if (typeof this.escapeKey === "string" || typeof this.escapeKey === "function") {
                        var buttonKey;
                        if (typeof this.escapeKey === "function") {
                            buttonKey = this.escapeKey();
                        } else {
                            buttonKey = this.escapeKey;
                        }
                        if (buttonKey) {
                            if (typeof this.buttons[buttonKey] === "undefined") {
                                console.warn("Invalid escapeKey, no buttons found with key " + buttonKey);
                            } else {
                                this["$_" + buttonKey].trigger("click");
                            }
                        }
                    }
                }
            }
            $.each(this.buttons, function (key, button) {
                if (button.keys.indexOf(keyChar) != -1) {
                    that["$_" + key].trigger("click");
                }
            });
        },
        setDialogCenter: function () {
            console.info("setDialogCenter is deprecated, dialogs are centered with CSS3 tables");
        },
        _unwatchContent: function () {
            clearInterval(this._timer);
        },
        close: function (onClosePayload) {
            var that = this;
            if (typeof this.onClose === "function") {
                this.onClose(onClosePayload);
            }
            this._unwatchContent();
            $(window).unbind("resize." + this._id);
            $(window).unbind("keyup." + this._id);
            $(window).unbind("jcKeyDown." + this._id);
            if (this.draggable) {
                $(window).unbind("mousemove." + this._id);
                $(window).unbind("mouseup." + this._id);
                this.$titleContainer.unbind("mousedown");
            }
            that.$el.removeClass(that.loadedClass);
            $("body").removeClass("jconfirm-no-scroll-" + that._id);
            that.$jconfirmBoxContainer.removeClass("jconfirm-no-transition");
            setTimeout(function () {
                that.$body.addClass(that.closeAnimationParsed);
                that.$jconfirmBg.addClass("jconfirm-bg-h");
                var closeTimer = (that.closeAnimation === "none") ? 1 : that.animationSpeed;
                setTimeout(function () {
                    that.$el.remove();
                    var l = jconfirm.instances;
                    var i = jconfirm.instances.length - 1;
                    for (i; i >= 0; i--) {
                        if (jconfirm.instances[i]._id === that._id) {
                            jconfirm.instances.splice(i, 1);
                        }
                    }
                    if (!jconfirm.instances.length) {
                        if (that.scrollToPreviousElement && jconfirm.lastFocused && jconfirm.lastFocused.length && $.contains(document, jconfirm.lastFocused[0])) {
                            var $lf = jconfirm.lastFocused;
                            if (that.scrollToPreviousElementAnimate) {
                                var st = $(window).scrollTop();
                                var ot = jconfirm.lastFocused.offset().top;
                                var wh = $(window).height();
                                if (!(ot > st && ot < (st + wh))) {
                                    var scrollTo = (ot - Math.round((wh / 3)));
                                    $("html, body").animate({scrollTop: scrollTo}, that.animationSpeed, "swing", function () {
                                        $lf.focus();
                                    });
                                } else {
                                    $lf.focus();
                                }
                            } else {
                                $lf.focus();
                            }
                            jconfirm.lastFocused = false;
                        }
                    }
                    if (typeof that.onDestroy === "function") {
                        that.onDestroy();
                    }
                }, closeTimer * 0.4);
            }, 50);
            return true;
        },
        open: function () {
            if (this.isOpen()) {
                return false;
            }
            this._buildHTML();
            this._bindEvents();
            this._open();
            return true;
        },
        setStartingPoint: function () {
            var el = false;
            if (this.animateFromElement !== true && this.animateFromElement) {
                el = this.animateFromElement;
                jconfirm.lastClicked = false;
            } else {
                if (jconfirm.lastClicked && this.animateFromElement === true) {
                    el = jconfirm.lastClicked;
                    jconfirm.lastClicked = false;
                } else {
                    return false;
                }
            }
            if (!el) {
                return false;
            }
            var offset = el.offset();
            var iTop = el.outerHeight() / 2;
            var iLeft = el.outerWidth() / 2;
            iTop -= this.$jconfirmBox.outerHeight() / 2;
            iLeft -= this.$jconfirmBox.outerWidth() / 2;
            var sourceTop = offset.top + iTop;
            sourceTop = sourceTop - this._scrollTop();
            var sourceLeft = offset.left + iLeft;
            var wh = $(window).height() / 2;
            var ww = $(window).width() / 2;
            var targetH = wh - this.$jconfirmBox.outerHeight() / 2;
            var targetW = ww - this.$jconfirmBox.outerWidth() / 2;
            sourceTop -= targetH;
            sourceLeft -= targetW;
            if (Math.abs(sourceTop) > wh || Math.abs(sourceLeft) > ww) {
                return false;
            }
            this.$jconfirmBoxContainer.css("transform", "translate(" + sourceLeft + "px, " + sourceTop + "px)");
        },
        _open: function () {
            var that = this;
            if (typeof that.onOpenBefore === "function") {
                that.onOpenBefore();
            }
            this.$body.removeClass(this.animationParsed);
            this.$jconfirmBg.removeClass("jconfirm-bg-h");
            this.$body.focus();
            that.$jconfirmBoxContainer.css("transform", "translate(" + 0 + "px, " + 0 + "px)");
            setTimeout(function () {
                that.$body.css(that._getCSS(that.animationSpeed, 1));
                that.$body.css({"transition-property": that.$body.css("transition-property") + ", margin"});
                that.$jconfirmBoxContainer.addClass("jconfirm-no-transition");
                that._modalReady.resolve();
                if (typeof that.onOpen === "function") {
                    that.onOpen();
                }
                that.$el.addClass(that.loadedClass);
            }, this.animationSpeed);
        },
        loadedClass: "jconfirm-open",
        isClosed: function () {
            return !this.$el || this.$el.css("display") === "";
        },
        isOpen: function () {
            return !this.isClosed();
        },
        toggle: function () {
            if (!this.isOpen()) {
                this.open();
            } else {
                this.close();
            }
        }
    };
    jconfirm.instances = [];
    jconfirm.lastFocused = false;
    jconfirm.pluginDefaults = {
        template: '<div class="jconfirm"><div class="jconfirm-bg jconfirm-bg-h"></div><div class="jconfirm-scrollpane"><div class="jconfirm-row"><div class="jconfirm-cell"><div class="jconfirm-holder"><div class="jc-bs3-container"><div class="jc-bs3-row"><div class="jconfirm-box-container jconfirm-animated"><div class="jconfirm-box" role="dialog" aria-labelledby="labelled" tabindex="-1"><div class="jconfirm-closeIcon">&times;</div><div class="jconfirm-title-c"><span class="jconfirm-icon-c"></span><span class="jconfirm-title"></span></div><div class="jconfirm-content-pane"><div class="jconfirm-content"></div></div><div class="jconfirm-buttons"></div><div class="jconfirm-clear"></div></div></div></div></div></div></div></div></div></div>',
        title: "Hello",
        titleClass: "",
        type: "default",
        typeAnimated: true,
        draggable: true,
        dragWindowGap: 15,
        dragWindowBorder: true,
        animateFromElement: true,
        alignMiddle: true,
        smoothContent: true,
        content: "Are you sure to continue?",
        buttons: {},
        defaultButtons: {
            ok: {
                action: function () {
                }
            }, close: {
                action: function () {
                }
            }
        },
        contentLoaded: function () {
        },
        icon: "",
        lazyOpen: false,
        bgOpacity: null,
        theme: "light",
        animation: "scale",
        closeAnimation: "scale",
        animationSpeed: 400,
        animationBounce: 1,
        escapeKey: true,
        rtl: false,
        container: "body",
        containerFluid: false,
        backgroundDismiss: false,
        backgroundDismissAnimation: "shake",
        autoClose: false,
        closeIcon: null,
        closeIconClass: false,
        watchInterval: 100,
        columnClass: "col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1",
        boxWidth: "50%",
        scrollToPreviousElement: true,
        scrollToPreviousElementAnimate: true,
        useBootstrap: true,
        offsetTop: 40,
        offsetBottom: 40,
        bootstrapClasses: {container: "container", containerFluid: "container-fluid", row: "row"},
        onContentReady: function () {
        },
        onOpenBefore: function () {
        },
        onOpen: function () {
        },
        onClose: function () {
        },
        onDestroy: function () {
        },
        onAction: function () {
        }
    };
    var keyDown = false;
    $(window).on("keydown", function (e) {
        if (!keyDown) {
            var $target = $(e.target);
            var pass = false;
            if ($target.closest(".jconfirm-box").length) {
                pass = true;
            }
            if (pass) {
                $(window).trigger("jcKeyDown");
            }
            keyDown = true;
        }
    });
    $(window).on("keyup", function () {
        keyDown = false;
    });
    jconfirm.lastClicked = false;
    $(document).on("mousedown", "button, a", function () {
        jconfirm.lastClicked = $(this);
    });
})(jQuery, window);
