-
Notifications
You must be signed in to change notification settings - Fork 3
/
jquery-selectify.min.js
12 lines (12 loc) · 5.71 KB
/
jquery-selectify.min.js
1
2
3
4
5
6
7
8
9
10
11
12
/*
* File: jquery-selectify.js
* Version: 0.2
* Author: Vincent Keizer (www.vicreative.nl)
* Info: www.vicreative.nl/projects/selectify
*
* Copyright 2012-2013 Vincent Keizer, all rights reserved.
*
* Dual licensed under the MIT or GPL Version 2 licenses.
*
*/
(function (n) { var r = { checkText: function (n, t) { n.data("selectify").text == t && (n.data("selectify").text = "") } }, t = { activate: function (t) { n(this).addClass("focus").unbind("keydown").keydown(function (i) { var e, u, o, s, h, f, c; switch (i.which) { case 40: return u = n(this).find(".option.hover"), u.length || (u = n(this).find(".option.active")), e = u.next(), e.length || (e = n(this).find(".option:first")), n(this).trigger("select", e), i.preventDefault(), !1; case 38: return u = n(this).find(".option.hover"), u.length || (u = n(this).find(".option.active")), o = u.prev(), o.length || (o = n(this).find(".option:last")), n(this).trigger("select", o), i.preventDefault(), !1; case 13: n(this).trigger("close"); break; case 9: n(this).trigger("removefocus"); break; default: if (s = t.data.select.data("selectify"), h = String.fromCharCode(i.which), !h) { s.text = ""; break } f = s.text || "", f = f + h.toLowerCase(), s.text = f, setTimeout(function () { r.checkText(t.data.select, f) }, 1e3), c = n(this).find(".option[data-text^='" + f + "']:first"), c.length && n(this).trigger("select", c) } }) }, focus: function (t) { (target = t.originalEvent ? t.originalEvent.explicitOriginalTarget || t.originalEvent.srcElement : null, n(this).hasClass("focus") && n(this).hasClass("open")) || (n(this).hasClass("open") || target != null && t.data.select.has(n(target)) || n(this).trigger("open"), n(this).trigger("activate")) }, blur: function (i) { var r = n(this); i.data && i.data.select && (r = i.data.select), r.hasClass("open") && (r.removeClass("focus").trigger("close").unbind("keydown"), n(document).unbind("click", t.blur)) }, open: function (i) { return !n(this).hasClass("open"), n(document).click({ select: n(this) }, t.blur), i.preventDefault(), n(this).find(".options").slideDown("fast", function () { n(this).parents(".selectify").addClass("open"), n(this).trigger("scrollTo", n(this).children(".option.active")) }), !1 }, close: function () { n(this).hasClass("open"), n(this).removeClass("open").find(".options").slideUp() }, scroll: function (t, i) { if (i && typeof i == "object" && n(i).length) { var u = n(i), f = n(this).find(".options").scrollTop(), r = u.position().top + f, e = n(this).find(".options").height(); r < f ? n(this).find(".options").scrollTop(r) : r + u.outerHeight() >= f + e && n(this).find(".options").scrollTop(r - (e - u.outerHeight())) } }, select: function (t, i) { if (i) { if (typeof i == "string") { n(this).find(".option[data-id='" + i + "']:not(.active)").click(); return } if (typeof i == "object") { var r = n(i), u = r.attr("data-id"); t.data.select.val(u), n(this).find(".selected").attr("data-id", u).text(r.text()), n(this).find(".option.active").removeClass("active"), r.addClass("active"), n(this).find(".option.hover").removeClass("hover"), n(this).trigger("scrollTo", r), t.data.select.change() } } }, change: function () { n(this).data("selectify").selectify.trigger("select", n(this).val()) } }, i = { init: function (i) { var r = n.extend({ maxItems: 10 }, i); return n(this).each(function () { var i = n(this), s = i.data("selectify"), e; if (!s) { var f = n("<div />", { "class": "selectify", tabindex: "0" }).bind("focus", { select: i }, t.focus).bind("removefocus", t.blur).bind("close", t.close).bind("open", t.open).bind("scrollTo", t.scroll).bind("activate", { select: i }, t.activate).bind("select", { select: i }, t.select), u = n("<div />", { "class": "options" }), h = n("<div />", { "class": "selected", "data-id": i.children(":selected").val(), text: i.children(":selected").text() }), c = n("<div />", { "class": "header", click: function () { n(this).parent().hasClass("open") && n(this).parent().hasClass("focus") ? n(this).trigger("close") : n(this).parent().hasClass("focus") ? n(this).trigger("open") : n(this).trigger("activate") }, mouseover: function () { n(this).addClass("hover") }, mouseout: function () { n(this).removeClass("hover") } }), o = n("<div />", { "class": "icon" }); i.children().each(function () { var t = n("<div />", { "class": "option", "data-id": n(this).val(), "data-text": n(this).text().toLowerCase(), text: n(this).text(), click: function () { n(this).trigger("select", this).trigger("close") }, mouseover: function () { n(this).siblings().removeClass("hover"), n(this).addClass("hover") }, mouseout: function () { n(this).removeClass("hover") } }); u.append(t) }), f.append(c.append(h).append(o)).append(u), i.before(f), e = u.outerWidth() + o.outerWidth(), u.width(e), f.width(e), u.css("max-height", r.maxItems * u.children().outerHeight()).hide(), i.data("selectify", { target: i, selectify: f, text: "" }).change(t.change).hide() } }) }, destroy: function () { return this.each(function () { var i = n(this), r = i.data("selectify"); r && (n(window).unbind(".selectify"), r.selectify.remove(), i.removeData("selectify").unbind("change", t.change).show()) }) }, open: function () { return this.each(function () { var t = n(this).data("selectify"); t && t.selectify.focus() }) }, close: function () { return this.each(function () { var t = n(this).data("selectify"); t && t.selectify.trigger("removefocus") }) }, update: function (t) { return this.each(function () { var i = n(this).data("selectify"); i && i.selectify.trigger("select", t) }) } }; n.fn.selectify = function (t) { var r = t; if (i[r]) return i[r].apply(this, Array.prototype.slice.call(arguments, 1)); if (typeof r != "object" && r) n.error("Method " + r + " does not exist on jQuery.selectify"); else return i.init.apply(this, arguments) } })(jQuery);