/*
* Plugin name: Redsand Jquery Custom Select-box UI
* Author: phannhuthan
* Uri: http://redsand.vn
* Version: 4.2
* Last modify: 10/17/2014
*/
;(function($) {
$.fn.rsSelectBox = function(options, value, trigger) {
if (options == "value") {
if (value != undefined) {
this.filter('.rs-selectbox-hidden').each(function(){
if($(this).val() != value){
if(trigger || trigger == undefined){
$(this).val(value).trigger('change');
}
else{
$(this).val(value);
$(this).parent().trigger('change');
}
}
});
return this;
}
return this.val();
}
options = $.extend({
titleAsDefault: true,
height: 200,
width: null,
change: false,
uiId: "",
selectedTemplate: function(item) {
var icon = "";
if (item.attr('data-icon')) {
icon = '
';
}
return icon + item.text();
},
itemTemplate: function(item) {
var icon = "";
if (item.attr('data-icon')) {
icon = '
';
}
return '' + icon + item.text() + '';
},
afterInit: false,
afterShow: false,
beforeShow: false
}, options);
this.filter('select:not([multiple])').each(function() {
var slto = $(this);
var sltn, sltt, sltv, slti, opts, items, index;
if(!slto.parent().is('.rs-selectbox')){
sltn = '
';
slto.wrap(sltn);
}
sltn = slto.parent();
if(sltn.find('.rs-select-inner').length == 0){
slti = '';
slti += '
';
slti += '
';
slti += '
';
slti += '
';
slti += '
';
slti += '
';
slto.before(slti);
}
sltt = sltn.find('.rs-select-selected');
sltv = sltn.find('.rs-select-value');
opts = sltn.find('.rs-select-options');
if(options.width){
sltn.width(options.width);
}
if(options.uiId){
sltn.attr('id', options.uiId);
}
sltn.attr('title', slto.attr('title'));
opts.empty().css('overflow', 'auto');
opts.css('max-height', options.height);
slto.removeClass('rs-selectbox').addClass('rs-selectbox-hidden');
slto.find('option').each(function() {
opts.append(options.itemTemplate($(this)));
});
items = opts.children();
if (options.titleAsDefault && (slto.find('option').length == 0 || slto.attr('title') && slto.find('option[selected]').length == 0 && slto.find('option:selected').index() == 0)) {
sltv.html(slto.attr('title'));
} else {
index = slto.find('option:selected').index();
items.eq(index).addClass('active');
sltv.html(options.selectedTemplate(slto.find('option:selected'))).data('index', index);
}
sltn.toggleClass('has-value', sltv.data('index') == slto.find('option:selected').index() && slto.val() != "");
if (slto.is(':disabled')){
sltn.addClass('disabled');
}
sltn.toggleClass('has-scrollbar', opts.show().scrollTop(1).scrollTop() > 0);
opts.scrollTop(0).hide();
items.unbind('click.rs-selectbox').bind('click.rs-selectbox', function() {
if (!slto.is(':disabled')) {
var opt = slto.find('option').eq($(this).index());
if (!$(this).is('.active')) {
slto.val(opt.val()).trigger('change');
}
slto.trigger('click');
}
});
slto.unbind('change.rs-selectbox').bind('change.rs-selectbox', function(){
sltn.trigger('change');
if (typeof options.change == 'function') options.change.call(slto, val, sltn, slto);
});
sltn.unbind('change.rs-selectbox').bind('change.rs-selectbox',function(){
var val = slto.val();
var opt = slto.find(':selected');
sltn.toggleClass('has-value', val != "");
opts.find('.rs-select-item.active').removeClass('active');
opts.find('.rs-select-item').eq(opt.index()).addClass('active');
sltv.html(options.selectedTemplate(opt));
opts.slideUp(200);
sltn.removeClass('expanded');
});
slto.unbind('focus.rs-selectbox').bind('focus.rs-selectbox', function() {
if (!slto.is(':disabled')) {
if (options.beforeShow) {
options.beforeShow(sltn, slto);
}
opts.slideDown(200, function() {
if (options.afterShow && opts.is(':visible')) {
options.afterShow(sltn, slto);
}
});
sltn.addClass('focus expanded');
}
});
slto.unbind('blur.rs-selectbox').bind('blur.rs-selectbox', function() {
sltn.removeClass('focus');
});
sltt.add(options.trigger).unbind('click.rs-selectbox').bind('click.rs-selectbox', function() {
if (!slto.is(':disabled')) {
if (sltn.is('.expanded')) {
opts.slideUp(200);
sltn.removeClass('expanded');
} else {
slto.trigger('focus');
}
slto.trigger('click');
}
});
$(document).unbind('click.rs-selectbox').bind('click.rs-selectbox', function(event) {
if (!$(event.target).is('.rs-select-hidden') && !$(event.target).is(options.trigger)) {
$('.rs-selectbox').not($(event.target).parents('.rs-selectbox')).removeClass('focus expanded').find('.rs-select-options').slideUp(200);
}
});
$(document).unbind('keydown.rs-selectbox').bind('keydown.rs-selectbox', function(event) {
if ($('.rs-selectbox.focus').length > 0) {
if(event.which == 40 || event.which == 38 || event.which == 13){
var items = $('.rs-selectbox.focus').find('.rs-select-options').children();
var sp = items.filter('.active').removeClass('active');
if (event.which == 40) {
sp = sp.next().size() ? sp.next() : items.first();
}
if (event.which == 38) {
sp = sp.prev().size() ? sp.prev() : items.last();
}
if (event.which == 13) {
sp.trigger('click');
}
sp.addClass('active');
$('.rs-selectbox.focus').find('.rs-select-value').text(sp.text());
event.preventDefault();
}
if(event.which == 9){
$('.rs-selectbox.focus').removeClass('focus expanded').find('.rs-select-options').slideUp(200);
}
}
});
if (options.afterInit) options.afterInit(sltn, slto);
});
this.filter('.rs-selectbox').each(function() {
$(this).find('select').rsSelectBox(options);
});
return this;
}
}(jQuery));