/* * jQuery selectbox plugin * * Copyright (c) 2007 Sadri Sahraoui (brainfault.com) * Licensed under the GPL license and MIT: * http://www.opensource.org/licenses/GPL-license.php * http://www.opensource.org/licenses/mit-license.php * * The code is inspired from Autocomplete plugin (http://www.dyve.net/jquery/?autocomplete) * * Revision: $Id$ * Version: 0.6 * * Changelog : * Version 0.6 * - Fix IE scrolling problem * Version 0.5 * - separate css style for current selected element and hover element which solve the highlight issue * Version 0.4 * - Fix width when the select is in a hidden div @Pawel Maziarz * - Add a unique id for generated li to avoid conflict with other selects and empty values @Pawel Maziarz * * - optgroup support added by ecomplexx GmbH */ jQuery.fn.extend({selectbox:function(options){return this.each(function(){new jQuery.SelectBox(this,options);});}});if(!window.console){var console={log:function(msg){}}} jQuery.SelectBox=function(selectobj,options){var opt=options||{};opt.inputClass=opt.inputClass||"selectbox";opt.containerClass=opt.containerClass||"selectbox-wrapper";opt.hoverClass=opt.hoverClass||"current";opt.currentClass=opt.selectedClass||"selected" opt.debug=opt.debug||false;var elm_id=selectobj.id;var active=0;var inFocus=false;var hasfocus=0;var $select=$(selectobj);var $container=setupContainer(opt);var $input=setupInput(opt);$select.hide().before($input).before($container);init();$input.click(function(){if(!inFocus){$container.toggle();}}).focus(function(){if($container.not(':visible')){inFocus=true;$container.show();}}).keydown(function(event){switch(event.keyCode){case 38:event.preventDefault();moveSelect(-1);break;case 40:event.preventDefault();moveSelect(1);break;case 13:event.preventDefault();$('li.'+opt.hoverClass).trigger('click');break;case 27:hideMe();break;}}).blur(function(){if($container.is(':visible')&&hasfocus>0){if(opt.debug)console.log('container visible and has focus')}else{if($.browser.msie||$.browser.safari){if(document.activeElement.getAttribute('id').indexOf('_container')==-1){hideMe();}else{$input.focus();}}else{hideMe();}}});function hideMe(){hasfocus=0;$container.hide();} function init(){$container.append(getSelectOptions($input.attr('id'))).hide();var width=$input.css('width');$container.width(width);} function setupContainer(options){var container=document.createElement("div");$container=$(container);$container.attr('id',elm_id+'_container');$container.addClass(options.containerClass);return $container;} function setupInput(options){var input=document.createElement("input");var $input=$(input);$input.attr("id",elm_id+"_input");$input.attr("type","text");$input.addClass(options.inputClass);$input.attr("autocomplete","off");$input.attr("readonly","readonly");$input.attr("tabIndex",$select.attr("tabindex"));return $input;} function moveSelect(step){var lis=$("li",$container);if(!lis||lis.length==0)return false;active+=step;if(active<0){active=lis.size();}else if(active>lis.size()){active=0;} scroll(lis,active);lis.removeClass(opt.hoverClass);$(lis[active]).addClass(opt.hoverClass);} function scroll(list,active){var el=$(list[active]).get(0);var list=$container.get(0);if(el.offsetTop+el.offsetHeight>list.scrollTop+list.clientHeight){list.scrollTop=el.offsetTop+el.offsetHeight-list.clientHeight;}else if(el.offsetTop