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