/**
*	Hyjack Select v1.1.2 plugin for jQuery v1.4.4+ 
*	Copyright (c) 2011 Brant Wills
*	August 31, 2010
*/
(function (a) { var g = 0; version = "v1.1.2"; hyjackable = "select"; a.hyjack_select = { update: function (d) { if (d) { a(".hjsel_container").each(function () { if (a(this).data("hyjack.container") === a(d).data("hyjacked.index")) { a(this).hide(); return false } }); a(d).data("is.hyjacked", false).hyjack_select() } else a.hyjack_select.update_all() }, update_all: function () { a(".hjsel_container").hide(); a(":input").filter(hyjackable).each(function () { a(this).data("is.hyjacked") && a(this).data("is.hyjacked", false).hyjack_select() }) }, dispose: function (d) { if (d) { a(".hjsel_container").each(function () { if (a(this).data("hyjack.container") === a(d).data("hyjacked.index")) { a(this).hide(); return false } }); a(d).data("is.hyjacked", false).show() } else a.hyjack_select.dispose_All() }, dispose_All: function () { a(".hjsel_container").each(function () { a(this).data("hyjack.container") && a(this).hide() }); a(":input").filter(hyjackable).each(function () { a(this).data("is.hyjacked", false).show() }) } }; a.fn.hyjack_select = function (d) { function o(b, c) { p(c); q(a(b), c); m(c); c.select.append(c.txtbox).append(c.ddCancel).append(c.ddImage); c.container.append(c.select).append(c.options); a(document).bind("click", function (e) { if (a(e.target).data("hyjack.ddImage") === c.ddImage.data("hyjack.ddImage")) c.options.toggle(); else if (a(e.target).data("hyjack.ddCancel") === c.ddCancel.data("hyjack.ddCancel")) n(c); else a(e.target).data("hyjack.txtbox") === c.txtbox.data("hyjack.txtbox") || a(e.target).parents().data("hyjack.container") === c.container.data("hyjack.container") ? c.options.show() : i(c); d.restrictSearch && c.txtbox.val(h(a("option:selected", c.selector).text())); k(c) }); a(window).load(function () { m(c) }); return c.container } function h(b) { return a("<div/>").html(b).text() } function r(b) { return a("<div/>").text(b).html() } function s() { switch (d.filter.toLowerCase()) { case "first": a.expr[":"].hj_contains_first = function (b, c, e) { return jQuery(b).text().toUpperCase().indexOf(e[3].toUpperCase()) == 0 }; break; case "words": a.expr[":"].hj_contains_words = function (b, c, e) { b = jQuery(b).text().toUpperCase(); c = e[3].toUpperCase(); var f = c.split(/\s+/); if (f.length == 1) return b.indexOf(c) >= 0; for (c = 0; e = f[c]; c++) if (b.indexOf(e) < 0) return false; return true }; break; default: d.filter = "like"; a.expr[":"].hj_contains_like = function (b, c, e) { return jQuery(b).text().toUpperCase().indexOf(e[3].toUpperCase()) >= 0 } } } function t(b, c) { switch (c.keyCode) { case 37: break; case 39: break; case 16: break; case 17: break; case 18: break; case 19: break; case 20: break; case 33: break; case 34: break; case 35: break; case 36: break; case 45: break; case 9: break; case 13: l(a(".hjsel_options_hover", b.options), b); k(b); i(b); b.selector.change(); break; case 38: if (a(".hjsel_noitems", b.options).length) break; $dir = a(".hjsel_options_hover", b.options).prev(); if (b.options.is(":visible")) for (; !$dir.is(":visible"); ) $dir = $dir.prev().attr("val") ? $dir.prev() : a("li", b.options).last(); l($dir, b); break; case 40: if (a(".hjsel_noitems", b.options).length) break; $dir = a(".hjsel_options_hover", b.options).next(); if (b.options.is(":visible")) for (; !$dir.is(":visible"); ) $dir = $dir.next().attr("val") ? $dir.next() : a("li", b.options).first(); l($dir, b); break; case 27: i(b); break; default: var e = 0, f = 0; a("li", b.options).remove(".hjsel_noitems").removeClass("hjsel_options_hover").hide(); a("li:hj_contains_" + d.filter + '("' + b.txtbox.val() + '")', b.options).show(); a("li", b.options).each(function () { a(this).is(":hidden") && e++; f++ }); e == f && b.options.append(a("<li/>").append(d.emptyMessage).addClass("hjsel_noitems")); b.options.scrollTop(0).show() } } function l(b, c) { if (b != null) { c.txtbox.val(h(b.text())); c.selector.val(b.attr("val")) } a("li", c.options).each(function (e, f) { a(f).removeClass("hjsel_options_hover"); c.selector.val() == a(f).attr("val") && a(f).addClass("hjsel_options_hover") }) } function n(b) { a(".hjsel_options").hide(); b.txtbox.val("").focus(); b.options.show() } function k(b) { a("li", b.options).show(); a(".hjsel_noitems", b.options).remove() } function i(b) { b.options.hide(); b.txtbox.val() === "" && b.txtbox.val(h(a("option:selected", b.selector).text())) } function p(b) { b.txtbox.bind("click", function () { n(b) }).bind("keydown", function (c) { c.keyCode == 9 && i(b) }).bind("keyup", function (c) { t(b, c) }).val(h(a("option:selected", b.selector).text())) } function m(b) { b.txtbox.width(b.selector.width() - (b.ddImage.attr("width") + b.ddCancel.attr("width") + d.offset)); b.options.width(b.selector.width()); b.container.width(b.selector.width()) } function q(b, c) { var e = a("<ul/>"); a("option", b).each(function (f, j) { e.append(a("<li/>").attr("val", a(j).val()).append(r(a(j).text())).bind("mouseenter", function () { a("li", e).removeClass("hjsel_options_hover"); a(this).addClass("hjsel_options_hover"); c.txtbox.focus() }).bind("click", function () { a(this).addClass("hjsel_options_hover"); c.txtbox.focus().val(h(a(j).text())); c.selector.val(a(j).val()).change(); k(c) })) }); c.options.append(e) } try { d = jQuery.extend({ ddImage: "/Themes/Default/Scripts/combobox/arrow_down.png", ddCancel: "cancel.png", ddImageClass: "hjsel_ddImage", ddCancelClass: "hjsel_ddCancel", emptyMessage: "No Items to Display", offset: 15, filter: "like", restrictSearch: false }, d); return this.filter(hyjackable).each(function () { if (!a(this).data("is.hyjacked")) if (a(this).attr("disabled")) a(this).show(); else if (a("option", this).length) { g++; s(); a(this).attr("autocomplete", "off").data("is.hyjacked", true).data("hyjacked.index", g); hj = { selector: a(this), container: a("<div/>").data("hyjack.container", g).addClass("hjsel_container"), select: a("<div/>").data("hyjack.select", g).addClass("hjsel_select"), options: a("<div/>").data("hyjack.options", g).addClass("hjsel_options"), txtbox: a('<input type="text"/>').data("hyjack.txtbox", g).addClass("hjsel_txtbox"), ddImage: a("<img/>").data("hyjack.ddImage", g).addClass(d.ddImageClass).attr("src", d.ddImage), ddCancel: a("<img/>").data("hyjack.ddCancel", g).addClass(d.ddCancelClass).attr("src", d.ddCancel) }; return a(this).hide().before(o(this, hj)) } else a(this).show() }) } catch (u) { alert("Hyjack Select " + version + " Error:\n" + u.description) } } })(jQuery);
