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