-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathjquery.elect.min.js
13 lines (13 loc) · 4.11 KB
/
jquery.elect.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
/*
jquery.elect.js
Javascript-replaced select elements
Copyright 2011 Noah Burney
*/
(function(d){if(!d.election)d.election=[];var g,h=function(){return new g.init(arguments)};g=h.prototype={opts:{copy_classes:true,copy_ids:true},init:function(a){a=Array.prototype.slice.call(a);this.el=d(a.shift());d.extend(this.opts,a[0]||{});if(typeof this.el[0].elect==="undefined"){a="elect-0";for(var b=1;d("#"+a).length;b++)a=a.replace(/-\d{1,}$/g,"-"+b);this.el.wrap('<div class="elect-container" id="'+a+'"></div>').hide();this.fokus=d('<input id="'+a+'-fokus" type="text" />').css({display:"block",
position:"absolute",left:"-3000px"}).insertAfter(this.el);this.con=d("#"+a);this.opts.copy_classes&&this.con.addClass(this.el[0].className);this.span=d('<span class="elect-element"></span>').appendTo(this.con);this.ul=d('<ul class="elect-options"></ul>').appendTo(this.con);this.val=d('<span class="elect-value"></span>').appendTo(this.span);this.con.css("position","relative");this.ul.css({position:"absolute","z-index":"33333"});this.optionize();var e=this;this.span.mousedown(function(){e.fokus.focus();
e.toggle();return false});this.span.mouseup(function(){return false});d("input, select, textarea, button").not(this.fokus).focus(function(c){e.blur(c)});this.fokus.focus(function(c){e.focus(c)});d(document).mouseup(function(){e.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 a=this;this.ul.empty();this.el.children("option").each(function(e){var c=d(this);c={classes:c[0].className,name:c.attr("name"),
id:c.attr("id"),value:c.val(),content:c.html()};var f=d('<li class="elect-option'+(e==0?" first":"")+(c.classes&&a.opts.copy_classes?" "+c.classes:"")+'"'+(c.name?' name="'+c.name+'"':"")+(c.id&&a.opts.copy_ids?' id="elect-'+c.id+'"':"")+(c.value?' value="'+c.value+'"':"")+">"+c.content+"</li>");a.ul.append(f);a.opts.push(c);f.mouseup(function(){a.change(e);a.close()});f.hover(function(){d(this).addClass("hover")},function(){d(this).removeClass("hover")})});var b=0;this.el.children("option").each(function(e,
c){if(d(c).attr("selected"))b=e});this.change(b);this.close();this.searchString=""},focus:function(a){for(var b=0,e=d.election.length;b<e;b++)d.election[b]!==this&&d.election[b].blur(a);this.span.addClass("focused");this.con.removeClass("invalid");this.clearsearch()},blur:function(){this.span.removeClass("focused");this.close()},focused:function(){return this.span.hasClass("focused")},keyup:function(a){a=a.keyCode;switch(a){case 9:break;case 40:this.next();break;case 38:this.prev();break;case 13:this.change(this.selected);
break;default:var b=this;clearTimeout(this.cleartime);this.cleartime=setTimeout(function(){b.clearsearch.apply(b)},1200);this.searchString+=String.fromCharCode(a);this.search()}},clearsearch:function(){this.searchString=""},search:function(){for(var a=this.searchString.toLowerCase(),b=0,e=this.opts.length;b<e;b++)if((this.opts[b].content||"").toLowerCase().substr(0,a.length).match(a)){this.change(b);break}},toggle:function(){this.ul.toggle()},close:function(){this.ul.hide();this.ul.children("li").removeClass("hover")},
next:function(){var a=this.selected;a+1<this.opts.length&&a++;this.change(a)},prev:function(){var a=this.selected;a-1>=0&&a--;this.change(a)},change:function(a){this.select(a);this.el.children("option").removeAttr("selected").eq(this.selected).attr("selected","selected");this.el.change()},select:function(a){var b=this.ul.children("li").eq(a);if(b){this.selected=a;this.ul.children("li").removeClass("selected");b.addClass("selected").addClass(this.opts[a].classes);this.val.attr("value",this.opts[a].value).html(this.opts[a].content);
return this}}};g.init.prototype=g;d(document).keyup(function(a){var b,e=false,c,f;c=0;for(f=d.election.length;c<f;c++)if(b=d.election[c],b.focused()){e=true;break}(b=e?b:null)&&b.keyup(a)});d.fn.elect=function(){var a=Array.prototype.slice.call(arguments);return this.each(function(b){a.unshift(this);d.election.push(h.apply(null,a));this.elect.con.css("z-index",1E3-b).closest("tr").css("z-index",1E3-b);d(this).hasClass("invalid")&&this.elect.span.addClass("invalid")})}})(jQuery);