/**
 *  jQuery fontIconPicker - v2.0.0
 *
 *  An icon picker built on top of font icons and jQuery
 *
 *  http://codeb.it/fontIconPicker
 *
 *  Made by Alessandro Benoit & Swashata
 *  Under MIT License
 *
 * {@link https://github.com/micc83/fontIconPicker}
 */
!(function (a) {
    "use strict";
    function c(c, d) {
        (this.element = a(c)),
            (this.settings = a.extend({}, b, d)),
            this.settings.emptyIcon && this.settings.iconsPerPage--,
            (this.iconPicker = a("<div/>", {
                class: "icons-selector",
                style: "position: relative",
                html:
                    '<div class="selector"><span class="selected-icon"><i class="fa-times-circle-o"></i></span><span class="selector-button"><i class="fip-icon-down-dir"></i></span></div><div class="selector-popup" style="display: none;">' +
                    (this.settings.hasSearch ? '<div class="selector-search"><input type="text" name="" value="" placeholder="Search icon" class="icons-search-input"/><i class="fip-icon-search"></i></div>' : "") +
                    '<div class="selector-category">' +
                    '<select name="" class="icon-category-select" style="display: none">' +
                    "</select>" +
                    "</div>" +
                    '<div class="fip-icons-container"></div>' +
                    '<div class="selector-footer" style="display:none;">' +
                    '<span class="selector-pages">1/2</span>' +
                    '<span class="selector-arrows">' +
                    '<span class="selector-arrow-left" style="display:none;">' +
                    '<i class="fip-icon-left-dir"></i>' +
                    "</span>" +
                    '<span class="selector-arrow-right">' +
                    '<i class="fip-icon-right-dir"></i>' +
                    "</span>" +
                    "</span>" +
                    "</div>" +
                    "</div>",
            })),
            (this.iconContainer = this.iconPicker.find(".fip-icons-container")),
            (this.searchIcon = this.iconPicker.find(".selector-search i")),
            (this.iconsSearched = []),
            (this.isSearch = !1),
            (this.totalPage = 1),
            (this.currentPage = 1),
            (this.currentIcon = !1),
            (this.iconsCount = 0),
            (this.open = !1),
            (this.searchValues = []),
            (this.availableCategoriesSearch = []),
            (this.triggerEvent = null),
            (this.backupSource = []),
            (this.backupSearch = []),
            (this.isCategorized = !1),
            (this.selectCategory = this.iconPicker.find(".icon-category-select")),
            (this.selectedCategory = !1),
            (this.availableCategories = []),
            (this.unCategorizedKey = null),
            this.init();
    }
    var b = {
        theme: "fip-grey",
        source: !1,
        emptyIcon: !0,
        emptyIconValue: "",
        iconsPerPage: 20,
        hasSearch: !0,
        searchSource: !1,
        useAttribute: !1,
        attributeName: "data-icon",
        convertToHex: !0,
        allCategoryText: "From all categories",
        unCategorizedText: "Uncategorized",
    };
    (c.prototype = {
        init: function () {
            this.iconPicker.addClass(this.settings.theme), this.iconPicker.css({ left: -9999 }).appendTo("body");
            var b = this.iconPicker.outerHeight(),
                c = this.iconPicker.outerWidth();
            if (
                (this.iconPicker.css({ left: "" }),
                this.element.before(this.iconPicker),
                this.element.css({
                    visibility: "hidden",
                    top: 0,
                    position: "relative",
                    zIndex: "-1",
                    left: "-" + c + "px",
                    display: "inline-block",
                    height: b + "px",
                    width: c + "px",
                    padding: "0",
                    margin: "0 -" + c + "px 0 0",
                    border: "0 none",
                    verticalAlign: "top",
                }),
                !this.element.is("select"))
            ) {
                var d = (function () {
                        for (var a = 3, b = document.createElement("div"), c = b.all || []; (b.innerHTML = "<!--[if gt IE " + ++a + "]><br><![endif]-->"), c[0]; );
                        return a > 4 ? a : !a;
                    })(),
                    e = document.createElement("div");
                this.triggerEvent = 9 !== d && "oninput" in e ? ["input", "keyup"] : ["keyup"];
            }
            !this.settings.source && this.element.is("select")
                ? ((this.settings.source = []),
                  (this.settings.searchSource = []),
                  this.element.find("optgroup").length
                      ? ((this.isCategorized = !0),
                        this.element.find("optgroup").each(
                            a.proxy(function (b, c) {
                                var d = this.availableCategories.length,
                                    e = a("<option />");
                                e.attr("value", d),
                                    e.html(a(c).attr("label")),
                                    this.selectCategory.append(e),
                                    (this.availableCategories[d] = []),
                                    (this.availableCategoriesSearch[d] = []),
                                    a(c)
                                        .find("option")
                                        .each(
                                            a.proxy(function (b, c) {
                                                var e = a(c).val(),
                                                    f = a(c).html();
                                                e && e !== this.settings.emptyIconValue && (this.settings.source.push(e), this.availableCategories[d].push(e), this.searchValues.push(f), this.availableCategoriesSearch[d].push(f));
                                            }, this)
                                        );
                            }, this)
                        ),
                        this.element.find("> option").length &&
                            this.element.find("> option").each(
                                a.proxy(function (b, c) {
                                    var d = a(c).val(),
                                        e = a(c).html();
                                    return d && "" !== d && d != this.settings.emptyIconValue
                                        ? (null === this.unCategorizedKey &&
                                              ((this.unCategorizedKey = this.availableCategories.length),
                                              (this.availableCategories[this.unCategorizedKey] = []),
                                              (this.availableCategoriesSearch[this.unCategorizedKey] = []),
                                              a("<option />").attr("value", this.unCategorizedKey).html(this.settings.unCategorizedText).appendTo(this.selectCategory)),
                                          this.settings.source.push(d),
                                          this.availableCategories[this.unCategorizedKey].push(d),
                                          this.searchValues.push(e),
                                          this.availableCategoriesSearch[this.unCategorizedKey].push(e),
                                          void 0)
                                        : !0;
                                }, this)
                            ))
                      : this.element.find("option").each(
                            a.proxy(function (b, c) {
                                var d = a(c).val(),
                                    e = a(c).html();
                                d && (this.settings.source.push(d), this.searchValues.push(e));
                            }, this)
                        ),
                  (this.backupSource = this.settings.source.slice(0)),
                  (this.backupSearch = this.searchValues.slice(0)),
                  this.loadCategories())
                : this.initSourceIndex(),
                this.loadIcons(),
                this.selectCategory.on(
                    "change keyup",
                    a.proxy(function (b) {
                        if (this.isCategorized === !1) return !1;
                        var c = a(b.currentTarget),
                            d = c.val();
                        if ("all" === c.val()) (this.settings.source = this.backupSource), (this.searchValues = this.backupSearch);
                        else {
                            var e = parseInt(d, 10);
                            this.availableCategories[e] && ((this.settings.source = this.availableCategories[e]), (this.searchValues = this.availableCategoriesSearch[e]));
                        }
                        this.resetSearch(), this.loadIcons();
                    }, this)
                ),
                this.iconPicker.find(".selector-button").click(
                    a.proxy(function () {
                        this.toggleIconSelector();
                    }, this)
                ),
                this.iconPicker.find(".selector-arrow-right").click(
                    a.proxy(function (b) {
                        this.currentPage < this.totalPage && (this.iconPicker.find(".selector-arrow-left").show(), (this.currentPage = this.currentPage + 1), this.renderIconContainer()),
                            this.currentPage === this.totalPage && a(b.currentTarget).hide();
                    }, this)
                ),
                this.iconPicker.find(".selector-arrow-left").click(
                    a.proxy(function (b) {
                        this.currentPage > 1 && (this.iconPicker.find(".selector-arrow-right").show(), (this.currentPage = this.currentPage - 1), this.renderIconContainer()), 1 === this.currentPage && a(b.currentTarget).hide();
                    }, this)
                ),
                this.iconPicker.find(".icons-search-input").keyup(
                    a.proxy(function (b) {
                        var c = a(b.currentTarget).val();
                        return "" === c
                            ? (this.resetSearch(), void 0)
                            : (this.searchIcon.removeClass("fip-icon-search"),
                              this.searchIcon.addClass("fip-icon-cancel"),
                              (this.isSearch = !0),
                              (this.currentPage = 1),
                              (this.iconsSearched = []),
                              a.grep(
                                  this.searchValues,
                                  a.proxy(function (a, b) {
                                      return a.toLowerCase().search(c.toLowerCase()) >= 0 ? ((this.iconsSearched[this.iconsSearched.length] = this.settings.source[b]), !0) : void 0;
                                  }, this)
                              ),
                              this.renderIconContainer(),
                              void 0);
                    }, this)
                ),
                this.iconPicker.find(".selector-search").on(
                    "click",
                    ".fip-icon-cancel",
                    a.proxy(function () {
                        this.iconPicker.find(".icons-search-input").focus(), this.resetSearch();
                    }, this)
                ),
                this.iconContainer.on(
                    "click",
                    ".fip-box",
                    a.proxy(function (b) {
                        this.setSelectedIcon(a(b.currentTarget).find("i").attr("data-fip-value")), this.toggleIconSelector();
                    }, this)
                ),
                this.iconPicker.click(function (a) {
                    return a.stopPropagation(), !1;
                }),
                a("html").click(
                    a.proxy(function () {
                        this.open && this.toggleIconSelector();
                    }, this)
                );
        },
        initSourceIndex: function () {
            if ("object" == typeof this.settings.source) {
                if (a.isArray(this.settings.source))
                    (this.isCategorized = !1),
                        this.selectCategory.html("").hide(),
                        (this.settings.source = a.map(this.settings.source, function (a) {
                            return "function" == typeof a.toString ? a.toString() : a;
                        })),
                        (this.searchValues = a.isArray(this.settings.searchSource)
                            ? a.map(this.settings.searchSource, function (a) {
                                  return "function" == typeof a.toString ? a.toString() : a;
                              })
                            : this.settings.source.slice(0));
                else {
                    var b = a.extend(!0, {}, this.settings.source);
                    (this.settings.source = []),
                        (this.searchValues = []),
                        (this.availableCategoriesSearch = []),
                        (this.selectedCategory = !1),
                        (this.availableCategories = []),
                        (this.unCategorizedKey = null),
                        (this.isCategorized = !0),
                        this.selectCategory.html("");
                    for (var c in b) {
                        var d = this.availableCategories.length,
                            e = a("<option />");
                        e.attr("value", d), e.html(c), this.selectCategory.append(e), (this.availableCategories[d] = []), (this.availableCategoriesSearch[d] = []);
                        for (var f in b[c]) {
                            var g = b[c][f],
                                h = this.settings.searchSource && this.settings.searchSource[c] && this.settings.searchSource[c][f] ? this.settings.searchSource[c][f] : g;
                            "function" == typeof g.toString && (g = g.toString()),
                                g && g !== this.settings.emptyIconValue && (this.settings.source.push(g), this.availableCategories[d].push(g), this.searchValues.push(h), this.availableCategoriesSearch[d].push(h));
                        }
                    }
                }
                (this.backupSource = this.settings.source.slice(0)), (this.backupSearch = this.searchValues.slice(0)), this.loadCategories();
            }
        },
        loadCategories: function () {
            this.isCategorized !== !1 && (a('<option value="all">' + this.settings.allCategoryText + "</option>").prependTo(this.selectCategory), this.selectCategory.show().val("all").trigger("change"));
        },
        loadIcons: function () {
            this.iconContainer.html('<i class="fip-icon-spin3 animate-spin loading"></i>'), this.settings.source instanceof Array && this.renderIconContainer();
        },
        renderIconContainer: function () {
            var b,
                c = [];
            if (
                ((c = this.isSearch ? this.iconsSearched : this.settings.source),
                (this.iconsCount = c.length),
                (this.totalPage = Math.ceil(this.iconsCount / this.settings.iconsPerPage)),
                this.totalPage > 1 ? this.iconPicker.find(".selector-footer").show() : this.iconPicker.find(".selector-footer").hide(),
                this.iconPicker.find(".selector-pages").html(this.currentPage + "/" + this.totalPage + " <em>(" + this.iconsCount + ")</em>"),
                (b = (this.currentPage - 1) * this.settings.iconsPerPage),
                this.settings.emptyIcon)
            )
                this.iconContainer.html('<span class="fip-box"><i class="fa fa-times-circle-o" data-fip-value="fa-times-circle-o"></i></span>');
            else {
                if (c.length < 1) return this.iconContainer.html('<span class="icons-picker-error"><i class="fa fa-times-circle-o" data-fip-value="fa-times-circle-o"></i></span>'), void 0;
                this.iconContainer.html("");
            }
            c = c.slice(b, b + this.settings.iconsPerPage);
            for (var e, d = 0; (e = c[d++]); ) {
                var f = e;
                a.grep(
                    this.settings.source,
                    a.proxy(function (a, b) {
                        return a === e ? ((f = this.searchValues[b]), !0) : !1;
                    }, this)
                ),
                    a("<span/>", {
                        html:
                            '<i data-fip-value="' +
                            e +
                            '" ' +
                            (this.settings.useAttribute ? this.settings.attributeName + '="' + (this.settings.convertToHex ? "&#x" + parseInt(e, 10).toString(16) + ";" : e) + '"' : 'class="fa ' + e + '"') +
                            "></i>",
                        class: "fip-box",
                        title: f,
                    }).appendTo(this.iconContainer);
            }
            this.settings.emptyIcon || (this.element.val() && -1 !== a.inArray(this.element.val(), this.settings.source))
                ? -1 === a.inArray(this.element.val(), this.settings.source)
                    ? this.setSelectedIcon()
                    : this.setSelectedIcon(this.element.val())
                : this.setSelectedIcon(c[0]);
        },
        setHighlightedIcon: function () {
            this.iconContainer.find(".current-icon").removeClass("current-icon"),
                this.currentIcon &&
                    this.iconContainer
                        .find('[data-fip-value="' + this.currentIcon + '"]')
                        .parent("span")
                        .addClass("current-icon");
        },
        setSelectedIcon: function (a) {
            if (
                ("fa-times-circle-o" === a && (a = ""),
                this.settings.useAttribute
                    ? a
                        ? this.iconPicker.find(".selected-icon").html("<i " + this.settings.attributeName + '="' + (this.settings.convertToHex ? "&#x" + parseInt(a, 10).toString(16) + ";" : a) + '"></i>')
                        : this.iconPicker.find(".selected-icon").html('<i class="fa-times-circle-o"></i>')
                    : this.iconPicker.find(".selected-icon").html('<i class="fa ' + (a || "fa-times-circle-o") + '"></i>'),
                this.element.val("" === a ? this.settings.emptyIconValue : a).trigger("change"),
                null !== this.triggerEvent)
            )
                for (var b in this.triggerEvent) this.element.trigger(this.triggerEvent[b]);
            (this.currentIcon = a), this.setHighlightedIcon();
        },
        toggleIconSelector: function () {
            (this.open = this.open ? 0 : 1),
                this.iconPicker.find(".selector-popup").slideToggle(300),
                this.iconPicker.find(".selector-button i").toggleClass("fip-icon-down-dir"),
                this.iconPicker.find(".selector-button i").toggleClass("fip-icon-up-dir"),
                this.open && this.iconPicker.find(".icons-search-input").focus().select();
        },
        resetSearch: function () {
            this.iconPicker.find(".icons-search-input").val(""),
                this.searchIcon.removeClass("fip-icon-cancel"),
                this.searchIcon.addClass("fip-icon-search"),
                this.iconPicker.find(".selector-arrow-left").hide(),
                (this.currentPage = 1),
                (this.isSearch = !1),
                this.renderIconContainer(),
                this.totalPage > 1 && this.iconPicker.find(".selector-arrow-right").show();
        },
    }),
        (a.fn.fontIconPicker = function (b) {
            return (
                this.each(function () {
                    a.data(this, "fontIconPicker") || a.data(this, "fontIconPicker", new c(this, b));
                }),
                (this.setIcons = a.proxy(function (b, c) {
                    void 0 === b && (b = !1),
                        void 0 === c && (c = !1),
                        this.each(function () {
                            (a.data(this, "fontIconPicker").settings.source = b),
                                (a.data(this, "fontIconPicker").settings.searchSource = c),
                                a.data(this, "fontIconPicker").initSourceIndex(),
                                a.data(this, "fontIconPicker").resetSearch(),
                                a.data(this, "fontIconPicker").loadIcons();
                        });
                }, this)),
                (this.destroyPicker = a.proxy(function () {
                    this.each(function () {
                        a.data(this, "fontIconPicker") &&
                            (a.data(this, "fontIconPicker").iconPicker.remove(),
                            a.data(this, "fontIconPicker").element.css({ visibility: "", top: "", position: "", zIndex: "", left: "", display: "", height: "", width: "", padding: "", margin: "", border: "", verticalAlign: "" }),
                            a.removeData(this, "fontIconPicker"));
                    });
                }, this)),
                (this.refreshPicker = a.proxy(function (d) {
                    d || (d = b),
                        this.destroyPicker(),
                        this.each(function () {
                            a.data(this, "fontIconPicker") || a.data(this, "fontIconPicker", new c(this, d));
                        });
                }, this)),
                this
            );
        });
})(jQuery);
