1// Generated by CoffeeScript 1.4.0 2(function() { 3 var $; 4 5 $ = window.jQuery || window.Zepto || window.$; 6 7 $.fn.fancySelect = function(opts) { 8 var isiOS, settings; 9 if (opts == null) { 10 opts = {}; 11 } 12 settings = $.extend({ 13 forceiOS: false, 14 includeBlank: false, 15 optionTemplate: function(optionEl) { 16 return optionEl.text(); 17 }, 18 triggerTemplate: function(optionEl) { 19 return optionEl.text(); 20 } 21 }, opts); 22 isiOS = !!navigator.userAgent.match(/iP(hone|od|ad)/i); 23 return this.each(function() { 24 var copyOptionsToList, disabled, options, sel, trigger, updateTriggerText, wrapper; 25 sel = $(this); 26 if (sel.hasClass('fancified') || sel[0].tagName !== 'SELECT') { 27 return; 28 } 29 sel.addClass('fancified'); 30 sel.css({ 31 width: 1, 32 height: 1, 33 display: 'block', 34 position: 'absolute', 35 top: 0, 36 left: 0, 37 opacity: 0 38 }); 39 sel.wrap('<div class="fancy-select">'); 40 wrapper = sel.parent(); 41 if (sel.data('class')) { 42 wrapper.addClass(sel.data('class')); 43 } 44 wrapper.append('<div class="trigger">'); 45 if (!(isiOS && !settings.forceiOS)) { 46 wrapper.append('<ul class="options">'); 47 } 48 trigger = wrapper.find('.trigger'); 49 options = wrapper.find('.options'); 50 disabled = sel.prop('disabled'); 51 if (disabled) { 52 wrapper.addClass('disabled'); 53 } 54 updateTriggerText = function() { 55 var triggerHtml; 56 triggerHtml = settings.triggerTemplate(sel.find(':selected')); 57 return trigger.html(triggerHtml); 58 }; 59 sel.on('blur.fs', function() { 60 if (trigger.hasClass('open')) { 61 return setTimeout(function() { 62 return trigger.trigger('close.fs'); 63 }, 120); 64 } 65 }); 66 trigger.on('close.fs', function() { 67 trigger.removeClass('open'); 68 return options.removeClass('open'); 69 }); 70 trigger.on('click.fs', function() { 71 var offParent, parent; 72 if (!disabled) { 73 trigger.toggleClass('open'); 74 if (isiOS && !settings.forceiOS) { 75 if (trigger.hasClass('open')) { 76 return sel.focus(); 77 } 78 } else { 79 if (trigger.hasClass('open')) { 80 parent = trigger.parent(); 81 offParent = parent.offsetParent(); 82 if ((parent.offset().top + parent.outerHeight() + options.outerHeight() + 20) > $(window).height() + $(window).scrollTop()) { 83 options.addClass('overflowing'); 84 } else { 85 options.removeClass('overflowing'); 86 } 87 } 88 options.toggleClass('open'); 89 if (!isiOS) { 90 return sel.focus(); 91 } 92 } 93 } 94 }); 95 sel.on('enable', function() { 96 sel.prop('disabled', false); 97 wrapper.removeClass('disabled'); 98 disabled = false; 99 return copyOptionsToList(); 100 }); 101 sel.on('disable', function() { 102 sel.prop('disabled', true); 103 wrapper.addClass('disabled'); 104 return disabled = true; 105 }); 106 sel.on('change.fs', function(e) { 107 if (e.originalEvent && e.originalEvent.isTrusted) { 108 return e.stopPropagation(); 109 } else { 110 return updateTriggerText(); 111 } 112 }); 113 sel.on('keydown', function(e) { 114 var hovered, newHovered, w; 115 w = e.which; 116 hovered = options.find('.hover'); 117 hovered.removeClass('hover'); 118 if (!options.hasClass('open')) { 119 if (w === 13 || w === 32 || w === 38 || w === 40) { 120 e.preventDefault(); 121 return trigger.trigger('click.fs'); 122 } 123 } else { 124 if (w === 38) { 125 e.preventDefault(); 126 if (hovered.length && hovered.index() > 0) { 127 hovered.prev().addClass('hover'); 128 } else { 129 options.find('li:last-child').addClass('hover'); 130 } 131 } else if (w === 40) { 132 e.preventDefault(); 133 if (hovered.length && hovered.index() < options.find('li').length - 1) { 134 hovered.next().addClass('hover'); 135 } else { 136 options.find('li:first-child').addClass('hover'); 137 } 138 } else if (w === 27) { 139 e.preventDefault(); 140 trigger.trigger('click.fs'); 141 } else if (w === 13 || w === 32) { 142 e.preventDefault(); 143 hovered.trigger('click.fs'); 144 } else if (w === 9) { 145 if (trigger.hasClass('open')) { 146 trigger.trigger('close.fs'); 147 } 148 } 149 newHovered = options.find('.hover'); 150 if (newHovered.length) { 151 options.scrollTop(0); 152 return options.scrollTop(newHovered.position().top - 12); 153 } 154 } 155 }); 156 options.on('click.fs', 'li', function(e) { 157 var clicked; 158 clicked = $(this); 159 sel.val(clicked.data('raw-value')); 160 if (!isiOS) { 161 sel.trigger('blur.fs').trigger('focus.fs'); 162 } 163 options.find('.selected').removeClass('selected'); 164 clicked.addClass('selected'); 165 trigger.addClass('selected'); 166 return sel.val(clicked.data('raw-value')).trigger('change.fs').trigger('blur.fs').trigger('focus.fs'); 167 }); 168 options.on('mouseenter.fs', 'li', function() { 169 var hovered, nowHovered; 170 nowHovered = $(this); 171 hovered = options.find('.hover'); 172 hovered.removeClass('hover'); 173 return nowHovered.addClass('hover'); 174 }); 175 options.on('mouseleave.fs', 'li', function() { 176 return options.find('.hover').removeClass('hover'); 177 }); 178 copyOptionsToList = function() { 179 var selOpts; 180 updateTriggerText();
181 if (isiOS && !settings.forceiOS) { 182 return; 183 } 184 selOpts = sel.find('option'); 185 return sel.find('option').each(function(i, opt) { 186 var optHtml; 187 opt = $(opt); 188 if (!opt.prop('disabled') && (opt.val() || settings.includeBlank)) { 189 optHtml = settings.optionTemplate(opt); 190 if (opt.prop('selected')) { 191 return options.append("<li data-raw-value=\"" + (opt.val()) + "\" class=\"selected\">" + optHtml + "</li>"); 192 } else { 193 return options.append("<li data-raw-value=\"" + (opt.val()) + "\">" + optHtml + "</li>"); 194 } 195 } 196 }); 197 }; 198 sel.on('update.fs', function() { 199 wrapper.find('.options').empty(); 200 return copyOptionsToList(); 201 }); 202 return copyOptionsToList(); 203 }); 204 }; 205 206}).call(this);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.