$.fn.multiselect = function(op) {
var selecter = $(this);
var settings = {
width : selecter.outerWidth() - 2,
options : {
values : null,
texts : null
},
selected : {
values : null,
texts : null
},
nondeletable : {
values : null
},
target : '',
callback : function() {
}
};
settings = $.extend(settings, op);
var optionValues = settings.options.values ? settings.options.values.split(',') : new Array();
var optionTexts = settings.options.texts ? settings.options.texts.split(',') : new Array();
var selectedValues = settings.selected.values ? settings.selected.values.split(',') : new Array();
var selectedTexts = settings.selected.texts ? settings.selected.texts.split(',') : new Array();
var nonDeletableValues = settings.nondeletable.values ? settings.nondeletable.values.split(',') : new Array();
var map = {};
$.each(optionValues, function(i, value) {
map[value] = optionTexts[i];
});
$.each(selectedValues, function(i, value) {
map[value] = selectedTexts[i];
if (contains(nonDeletableValues, value)) {
selecter.append('
' + map[value] + '');
} else {
selecter.append('' + map[value] + '');
}
});
// selecter
// .append('');
selecter.append('');
updateValue();
var menuId = 'menu_' + parseInt(Math.random() * 1000);
var menuContent = '';
selecter.menu({
width : settings.width,
height : settings.height,
maxHeight : settings.maxHeight,
content : menuContent,
init : function() {
$.each(selectedValues, function(i, value) {
$('#' + menuId).find('li[val=' + value + ']').hide();
});
$('#' + menuId + ' li').click(function() {
var text = $(this).text();
var value = $(this).attr('val');
var ie8FixChar = $.browser.msie && $.browser.version < 9 ? '' : '';
selecter.children('.multiselect-clear').before('' + ie8FixChar + '' + text + '');
$(this).hide();
updateMenuPosition();
updateValue();
});
}
});
/*
* 事件绑定
*
*/
selecter.add('.menu').on('selectstart', function() {
return false;
});
// selecter.focus(function() {
// selecter.find(':text').focus();
// }).click(function() {
// selecter.find(':text').focus();
// });
selecter.delegate('.multiselect-remove', 'click', function(event) {
var menu = $(this).parent().parent();
$('.menu:not(#' + menu.attr('id') + '_menu)').hide();
var value = $(this).next().attr('val');
$('#' + menuId).find('li[val=' + value + ']').show();
$(this).parent().hide(50, function() {
$(this).remove();
updateMenuPosition();
updateValue();
});
event.stopPropagation();
}).delegate('.multiselect-remove', 'mousedown', function(event) {
event.stopPropagation();
});
function updateMenuPosition() {
var top = selecter.offset().top + selecter.outerHeight() + 1;
var bottom = $('#' + selecter.attr('id') + '_menu').css('bottom');
if (bottom == 'auto') {
$('#' + selecter.attr('id') + '_menu').css('top', top + 'px');
} else {
$('#' + selecter.attr('id') + '_menu').css('bottom', bottom);
}
}
function updateValue() {
var returnArray = new Array();
selecter.find('.multiselect-selected').each(function() {
returnArray.push($(this).attr('val'));
});
$('#' + settings.target).val(returnArray.join(','));
settings.callback();
}
function contains(arr, str) {
var i = arr.length;
while (i--) {
if (arr[i] === str) {
return true;
}
}
return false;
}
};