(function ($) {
$(document).ready(function () {
/* MSIE6 Flickering Image Fix */
try {
doc.execCommand('BackgroundImageCache', false, true);
} catch (e) {}
$('select').Selectbox();
});
var MSIE = jQuery.browser.msie ? parseInt(jQuery.browser.version) : false;
$.fn.Selectbox = function (options) {
var settings = $.extend({
visible: 10
}, options),
all_selects = this;
function hideAll() {
all_selects.each(function () {
this.close();
});
}
$('body').bind('click', function () {
hideAll();
});
return this.each(function () {
if (this.generated) {
return;
}
var self = this,
old_selectbox = $(this),
select_width = parseInt(old_selectbox.width()),
old_options = old_selectbox.find('option'),
selected_index = self.selectedIndex,
wrapper,
value_holder,
new_selectbox_string = ['
'],
new_selectbox,
blocker,
new_options;
self.close = function () {
if (new_selectbox.is(':visible')) {
new_selectbox.slideUp(100, function () {
wrapper.removeClass('selectbox-open').css('z-index', '');
});
}
};
self.reGen = function () {
if (self.generated) {
old_options = old_selectbox.find('option');
selected_index = self.selectedIndex;
new_selectbox.empty();
new_selectbox_string = [''];
for (var i = 0, len = old_options.length; i < len; i++) {
new_selectbox_string.push('- ');
new_selectbox_string.push(old_options[i].text);
new_selectbox_string.push('
');
}
new_selectbox_string.push('
');
new_selectbox.append(new_selectbox_string.join(''));
old_selectbox = $(self);
select_width = parseInt(old_selectbox.width());
new_options = new_selectbox.find('li');
$(new_options[selected_index]).attr('selected', true).addClass('selected');
value_holder.text(old_options[selected_index].text);
value_holder.css('width', select_width + 'px');
new_selectbox.css('width', (wrapper.outerWidth() - 2) + 'px');
optionBinder();
setScroll();
if (self.disabled) {
wrapper.addClass('selectbox-disabled');
} else {
wrapper.removeClass('selectbox-disabled');
}
} else {
generateNewSelectbox();
}
};
function generateNewSelectbox() {
if (self.generated) {
self.reGen();
} else {
var opt_len = old_options.length,
i;
old_selectbox.wrap('');
wrapper = old_selectbox.parent('div.selectbox-wrap');
if (self.disabled) {
wrapper.addClass('selectbox-disabled');
}
for (i = 0; i < opt_len; i++) {
new_selectbox_string.push('- ');
new_selectbox_string.push(old_options[i].text);
new_selectbox_string.push('
');
}
new_selectbox_string.push('
');
wrapper.append('' + old_options[selected_index].text + '');
wrapper.append(new_selectbox_string.join(''));
value_holder = wrapper.find('a.value-holder');
value_holder.css('width', select_width + 'px');
value_holder.css('margin-right', '20px');
new_selectbox = wrapper.find('.new-selectbox');
new_selectbox.css('width', (wrapper.outerWidth() - 2) + 'px');
if (MSIE && (MSIE < 7)) {
if (new_selectbox.is('div')) {
new_selectbox.prepend('');
blocker = wrapper.find('iframe.blocker');
}
}
new_options = new_selectbox.find('li');
$(new_options[selected_index]).addClass('selected');
setScroll();
if (blocker && blocker.length) {
blocker.css('height', new_selectbox.outerHeight());
}
valueHolderBinder();
optionBinder();
self.newSelect = new_selectbox;
self.generated = true;
}
}
function setScroll() {
if (new_options.length < settings.visible) {
return;
}
var item_height = parseInt(new_options.css('line-height')),
visible_height = item_height * settings.visible;
new_selectbox.css('height', visible_height + 'px');
}
function select(obj) {
var index = new_options.index(obj);
new_options.removeClass('selected');
obj.addClass('selected');
old_options.attr('selected', false);
$(old_options[index]).attr('selected', true);
value_holder.text(obj.text());
old_selectbox.change();
}
function valueHolderBinder() {
value_holder
.bind('mouseenter', function () {
if (!self.disabled) {
wrapper.addClass('selectbox-hover');
}
})
.bind('mouseleave', function () {
if (!self.disabled) {
wrapper.removeClass('selectbox-hover');
}
})
.bind('click', function (e) {
e.stopPropagation();
e.preventDefault();
if (self.disabled) {
return;
}
if (new_selectbox.css('display') === 'none') {
hideAll();
}
if (new_selectbox.is(':visible')) {
new_selectbox.slideUp(100, function () {
wrapper.removeClass('selectbox-open').css('z-index', '');
});
} else {
wrapper.addClass('selectbox-open').css('z-index', '100');
new_selectbox.slideDown(100);
}
})
.bind('keydown', function (e) {
if (self.disabled) {
return;
}
var selected = new_options.filter('.selected');
if (e.keyCode === 40) { // Down Arrow
e.preventDefault();
if (selected.next().length) {
select(selected.next());
}
} else if (e.keyCode === 38) { // Up Arrow
e.preventDefault();
if (selected.prev().length) {
select(selected.prev());
}
} else if (e.keyCode === 9) {
new_selectbox.slideUp(100);
wrapper.css('z-index', '');
}
});
}
function optionBinder() {
new_options.bind('click', function () {
select($(this));
new_selectbox.slideUp(100);
wrapper.css('z-index', '');
// value_holder.focus();
});
new_options.hover(function () {
new_options.removeClass('selected');
new_options.removeClass('hover');
$(this).addClass('hover');
});
}
generateNewSelectbox();
});
};
}(jQuery));