/*
*  Author: Noah Burney
*  jQuery.elect.min.js
*  Elect Plugin for jQuery
*/

(function($){if(!$.election){$.election=[]}var htmlTag=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,eee,Elect=function(){return new eee.init(arguments)};eee=Elect.prototype={opts:{copy_classes:true,copy_ids:true},init:function(a){var args=Array.prototype.slice.call(a);this.el=$(args.shift());$.extend(this.opts,args[0]||{});if(typeof this.el[0].elect=='undefined'){var id='elect-0';for(i=1;$('#'+id).size();i++){id=id.replace(/-\d{1,}$/g,'-'+i)}this.el.wrap('<div class="elect-container" id="'+id+'"></div>').hide();this.fokus=$('<input id="'+id+'-fokus" type="text" />').css({'display':'block','position':'absolute','left':'-3000px'}).insertAfter(this.el);this.con=$('#'+id);if(this.opts.copy_classes)this.con.addClass(this.el[0].className);this.span=$('<span class="elect-element"></span>').appendTo(this.con);this.ul=$('<ul class="elect-options"></ul>').appendTo(this.con);this.val=$('<span class="elect-value"></span>').appendTo(this.span);this.con.css('position','relative');this.ul.css({'position':'absolute','z-index':'33333'});this.optionize();var kore=this;this.span.mousedown(function(e){e.preventDefault();e.stopPropagation();kore.toggle(e);kore.focus(e)});this.span.mouseup(function(e){e.preventDefault();e.stopPropagation();return false});$('input, select, textarea, button').focus(function(e){kore.blur(e)});this.fokus.focus(function(e){kore.focus(e)});$(document).mouseup(function(e){kore.blur()});this.el[0].elect=this;return this}else{this.el[0].elect.optionize();return this.el[0].elect}},optionize:function(){this.selected=0;this.opts=[];var kore=this;this.ul.empty();this.el.children('option').each(function(i,tem){var item=$(this),n=i;var opt={classes:item[0].className,name:item.attr('name'),id:item.attr('id'),value:item.val(),content:item.html()};var li=$('<li class="elect-option'+((i==0)?' first':'')+((opt.classes&&kore.opts.copy_classes)?' '+opt.classes:'')+'"'+(opt.name?' name="'+opt.name+'"':'')+((opt.id&&kore.opts.copy_ids)?' id="elect-'+opt.id+'"':'')+(opt.value?' value="'+opt.value+'"':'')+'>'+opt.content+'</li>');kore.ul.append(li);kore.opts.push(opt);li.mouseup(function(e){kore.change(n);kore.close()});li.hover(function(){$(this).addClass('hover')},function(){$(this).removeClass('hover')})});var select_n=0;this.el.children('option').each(function(i,tem){if($(tem).attr('selected'))select_n=i});this.select(select_n);this.close();this.searchString=''},focus:function(e){for(i=0;i<$.election.length;i++){if($.election[i]!=this)$.election[i].blur(e)}this.span.addClass('focused')},blur:function(){this.span.removeClass('focused');this.close()},focused:function(){return this.span.hasClass('focused')},keyup:function(e){var code=e.keyCode;if(code==40)this.next();else if(code==38)this.prev();else if(code==13)this.change(this.selected);else{if(this.cleartime)clearTimeout(this.cleartime);var kore=this;this.cleartime=setTimeout(function(){kore.clearsearch.apply(kore)},1200);this.searchString+=String.fromCharCode(code);this.search()}},clearsearch:function(){this.searchString=''},search:function(){var el,found=false,str=this.searchString.toLowerCase();for(i=0;i<this.opts.length;i++){var val=this.opts[i].content||'';val=val.toLowerCase().substr(0,str.length);if(val.match(str)){this.select(i);break}}},toggle:function(e){e.stopPropagation();this.ul.toggle()},close:function(){this.ul.hide();this.ul.children('li').removeClass('hover')},next:function(){var num=this.selected;if(num+1<this.opts.length)num++;this.select(num)},prev:function(){var num=this.selected;if(num-1>=0)num--;this.select(num)},change:function(num){this.select(num);var next=this.con.next('input, textarea, select, button');if(next.size())next[0].focus();this.el.children('option').removeAttr('selected');this.el.children('option:eq('+this.selected+')').attr('selected','selected')},select:function(num){var l=$(this.ul.children('li').get(num));if(!l)return;this.selected=num;this.ul.children('li').removeClass('selected');l.addClass('selected').addClass(this.opts[num].classes);this.val.attr('value',this.opts[num].value).html(this.opts[num].content);return this}};eee.init.prototype=eee;var activeElect=function(){var e,found=false;for(i=0;i<$.election.length;i++){if(e=$.election[i],e.focused()){found=true;break}}return found?e:null};var electKeyUp=function(e){var el=activeElect();if(el)el.keyup(e)};$(document).keyup(electKeyUp);$.fn.elect=function(){var args=Array.prototype.slice.call(arguments);this.each(function(){var a=args;a.unshift(this);$.election.push(Elect.apply(null,args))});return this}})(jQuery);
