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