PageSourceSearch

https://thehotelemma.com/wp-content/themes/emma/assets/js/fancySelect.js?ver=1.0.1

js thehotelemma.com collected 2026-09-25 14:03:36 UTC 6,770 bytes, 206 lines download raw bytes

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.