PageSourceSearch

https://www.st-julien.ca/includes/scripts/calendar.js?v=28

js st-julien.ca collected 2026-10-02 10:10:07 UTC 25,169 bytes, 622 lines download raw bytes

1if (uts == undefined)
2    var uts = {};
3if (uts.apps == undefined)
4    uts.apps = {};
5if (uts.apps.calendar == undefined)
6    uts.apps.calendar = {};
7
8uts.apps.calendar.currentDate = new Date();
9
10uts.apps.calendar.render = function(){
11
12    document.write("<div id='cal-" + uts.apps.calendar.id + "'></div>");
13    
14    if (uts.apps.calendar.size == "big")
15    {
16        $("#cal-" + uts.apps.calendar.id).append($('<div>')
17            .addClass("uts-calendar-legend")
18        );
19        uts.apps.calendar.renderCategories();
20    }
21
22    if (uts.apps.calendar.size != "list")
23    {
24        $("#cal-" + uts.apps.calendar.id).append($('<div>')
25            .addClass("uts-calendar-selector")
26        );
27        $("#cal-" + uts.apps.calendar.id).append($('<div>')
28            .addClass("uts-calendar-weekdays")
29        );
30        $("#cal-" + uts.apps.calendar.id).append($('<div>')
31            .addClass("uts-calendar")
32        );
33        if (uts.apps.calendar.size == "small") {
34            $("#cal-" + uts.apps.calendar.id + " .uts-calendar").addClass("uts-calendar-small");
35            $("#cal-" + uts.apps.calendar.id + " .uts-calendar-selector").addClass("uts-calendar-selector-small");
36            $("#cal-" + uts.apps.calendar.id + " .uts-calendar-weekdays").addClass("uts-calendar-weekdays-small");
37        }
38
39        uts.apps.calendar.renderNavLinks();
40        uts.apps.calendar.renderDayNames();
41        uts.apps.calendar.renderCalendar();
42        uts.apps.calendar.renderEvents();
43    }
44    else
45    {
46        $("#cal-" + uts.apps.calendar.id).append($('<div>')
47            .addClass("uts-calendar-list")
48        );
49
50        uts.apps.calendar.renderEventsList();
51    }
52};
53
54uts.apps.calendar.renderCategories = function(){
55    $(uts.apps.calendar.categories).each(function(){
56        $("#cal-" + uts.apps.calendar.id + " .uts-calendar-legend").append($('<div>')
57            .addClass("uts-calendar-legend-category")
58            .addClass("selected")
59            .text($(this)[0].name)
60            .prop('id', $(this)[0].id)
61            .css('backgroundColor', '#' + $(this)[0].color)
62            .css('color', uts.apps.calendar.getFontColor('#' + $(this)[0].color))
63            .on('click', function(){
64                if ($(this).hasClass('selected')){
65                    $('.uts-calendar-event-' + $(this).prop('id')).hide();
66                    $(this).removeClass('selected')
67                } else {
68                    $('.uts-calendar-event-' + $(this).prop('id')).show();
69                    $(this).addClass('selected')
70                }
71            })
72        );
73    });
74};
75
76uts.apps.calendar.renderDayNames = function(){
77    
78    $("#cal-" + uts.apps.calendar.id + " .uts-calendar-weekdays *").remove();
79    
80    $("#cal-" + uts.apps.calendar.id + " .uts-calendar-weekdays").append($('<table>')
81        .css('width', '100%')
82        .append($('<tr>'))
83    );
84    
85    for (var i=0; i<=6; i++){
86        if (uts.apps.calendar.size != "small"){
87            $("#cal-" + uts.apps.calendar.id + " .uts-calendar-weekdays table tr").append($('<td>')
88                .css('width', '14.3%')
89                .text(uts.apps.calendar.weekdays[i])
90            );
91        } else {
92            $("#cal-" + uts.apps.calendar.id + " .uts-calendar-weekdays table tr").append($('<td>')
93                .css('width', '14.3%')
94                .text(uts.apps.calendar.weekdays[i].substr(0, 2))
95            );
96        }
97    }
98};
99
100uts.apps.calendar.renderCalendar = function(){
101
102    $("#cal-" + uts.apps.calendar.id + " .uts-calendar *").remove();
103    $("#cal-" + uts.apps.calendar.id + " .uts-calendar").append($('<table>')
104        .css('width', '100%')
105    );
106    
107    var today = uts.apps.calendar.cloneDate(uts.apps.calendar.currentDate);
108    var date = uts.apps.calendar.cloneDate(uts.apps.calendar.currentDate);
109    
110    date = uts.apps.calendar.getPreviousMonth(date);
111    date = uts.apps.calendar.getNextMonth(date);
112    
113    while (date.getDay() != 0)
114        date = uts.apps.calendar.addDays(date, -1);
115    
116    for (var i=1; i<=6; i++){
117        $("#cal-" + uts.apps.calendar.id + " .uts-calendar table").append($('<tr>')
118            .css('width', '16.7%')
119        );
120        for (var j=1; j<=7; j++){
121            $("#cal-" + uts.apps.calendar.id + " .uts-calendar table tr:last-child").append($('<td>')
122                .css('width', '14.3%')
123                .append($('<label>')
124                    .text(date.getDate().toString())
125                ).attr('id', 'uts-calendar-day-' + uts.apps.calendar.formatDate(date))
126                .addClass('uts-calendar-day')
127            );
128            if (uts.apps.calendar.isWeekDay(date))
129                $("#cal-" + uts.apps.calendar.id + " .uts-calendar table tr:last-child td:last-child").addClass('uts-calendar-day-weekend');
130            if (date.getMonth() != today.getMonth())
131                $("#cal-" + uts.apps.calendar.id + " .uts-calendar table tr:last-child td:last-child").addClass('uts-calendar-day-other-month');
132            date = uts.apps.calendar.getNextDay(date);
133        }
134    }
135    
136    uts.apps.calendar.setHeights();
137};
138
139uts.apps.calendar.setHeights = function(){
140    $("#cal-" + uts.apps.calendar.id + " .uts-calendar table").css('height', $("#cal-" + uts.apps.calendar.id + " .uts-calendar table").width());
141    $("#cal-" + uts.apps.calendar.id + " .uts-calendar table tr td").each(function(){
142        $(this).css('height', $(this).width())
143    });
144};
145
146uts.apps.calendar.renderNavLinks = function(){
147
148    $("#cal-" + uts.apps.calendar.id + " .uts-calendar-selector *").remove();
149    
150    if (uts.apps.calendar.size == "small"){
151        $("#cal-" + uts.apps.calendar.id + " .uts-calendar-selector").append($('<table>')
152            .css('width', '100%')
153            .append($('<tr>')
154                .append($('<td width="33%">')
155                    .append($('<a>')
156                        .text("<")
157                        .on('click', function(){
158                            uts.apps.calendar.currentDate = uts.apps.calendar.getPreviousMonth(uts.apps.calendar.currentDate);
159                            uts.apps.calendar.renderCalendar();
160                            uts.apps.calendar.renderNavLinks();
161                            uts.apps.calendar.renderEvents();
162                        })
163                    )
164                ).append($('<td width="33%">')
165                    .append($('<select>')
166                        .addClass('uts-calendar-selector-month')
167                    ).append($('<select>')
168                        .addClass('uts-calendar-selector-year')
169                    )
170                ).append($('<td width="33%">')
171                    .append($('<a>')
172                        .text(">")
173                        .on('click', function(){
174                            uts.apps.calendar.currentDate = uts.apps.calendar.getNextMonth(uts.apps.calendar.currentDate);
175                            uts.apps.calendar.renderCalendar();
176                            uts.apps.calendar.renderNavLinks();
177                            uts.apps.calendar.renderEvents();
178                        })
179                    )
180                )
181            )
182        );
183    } else {
184        $("#cal-" + uts.apps.calendar.id + " .uts-calendar-selector").append($('<table>')
185            .css('width', '100%')
186            .append($('<tr>')
187                .append($('<td width="33%">')
188                    .append($('<a>')
189                        .text(uts.apps.calendar.getMonthName(uts.apps.calendar.getPreviousMonth(uts.apps.calendar.currentDate)))
190                        .on('click', function(){
191                            uts.apps.calendar.currentDate = uts.apps.calendar.getPreviousMonth(uts.apps.calendar.currentDate);
192                            uts.apps.calendar.renderCalendar();
193                            uts.apps.calendar.renderNavLinks();
194                            uts.apps.calendar.renderEvents();
195                        })
196                    )
197                ).append($('<td width="33%">')
198                    .append($('<select>')
199                        .addClass('uts-calendar-selector-month')
200                    ).append($('<select>')
201                        .addClass('uts-calendar-selector-year')
202                    )
203                ).append($('<td width="33%">')
204                    .append($('<a>')
205                        .text(uts.apps.calendar.getMonthName(uts.apps.calendar.getNextMonth(uts.apps.calendar.currentDate)))
206                        .on('click', function(){
207                            uts.apps.calendar.currentDate = uts.apps.calendar.getNextMonth(uts.apps.calendar.currentDate);
208                            uts.apps.calendar.renderCalendar();
209                            uts.apps.calendar.renderNavLinks();
210                            uts.apps.calendar.renderEvents();
211                        })
212                    )
213                )
214            )
215        );
216    }
217    
218    for (var i=0; i<uts.apps.calendar.months.length; i++){
219        $("#cal-" + uts.apps.calendar.id + " .uts-calendar-selector .uts-calendar-selector-month").append($('<option>')
220            .text(uts.apps.calendar.months[i])
221            .val(i)
222        );
223    }
224    
225    for (var i=uts.apps.calendar.minyear; i<=uts.apps.calendar.maxyear; i++){
226        $("#cal-" + uts.apps.calendar.id + " .uts-calendar-selector .uts-calendar-selector-year").append($('<option>')
227            .text(i)
228            .val(i)
229        );
230    }
231    
232    if (uts.apps.calendar.getPreviousMonth(uts.apps.calendar.currentDate).getFullYear() < uts.apps.calendar.minyear)
233        $("#cal-" + uts.apps.calendar.id + " .uts-calendar-selector td:eq(0) *").remove();
234        
235    if (uts.apps.calendar.getNextMonth(uts.apps.calendar.currentDate).getFullYear() > uts.apps.calendar.maxyear)
236        $("#cal-" + uts.apps.calendar.id + " .uts-calendar-selector td:eq(2) *").remove();
237    
238    $("#cal-" + uts.apps.calendar.id + " .uts-calendar-selector .uts-calendar-selector-month").val(uts.apps.calendar.currentDate.getMonth());
239    $("#cal-" + uts.apps.calendar.id + " .uts-calendar-selector .uts-calendar-selector-year").val(uts.apps.calendar.currentDate.getFullYear());
240    
241    $("#cal-" + uts.apps.calendar.id + " .uts-calendar-selector .uts-calendar-selector-month").on('change', function(){
242        uts.apps.calendar.currentDate = new Date(uts.apps.calendar.currentDate.getFullYear(), $(this).val(), 1, 0, 0, 0, 0);
243        uts.apps.calendar.renderCalendar();
244        uts.apps.calendar.renderNavLinks();
245        uts.apps.calendar.renderEvents();
246    });
247    
248    $("#cal-" + uts.apps.calendar.id + " .uts-calendar-selector .uts-calendar-selector-year").on('change', function(){
249        uts.apps.calendar.currentDate = new Date($(this).val(), uts.apps.calendar.currentDate.getMonth(), 1, 0, 0, 0, 0);
250        uts.apps.calendar.renderCalendar();
251        uts.apps.calendar.renderNavLinks();
252        uts.apps.calendar.renderEvents();
253    });
254};
255
256uts.apps.calendar.renderEvents = function(){
257    $(uts.apps.calendar.events).each(function(){
258        var d = $(this)[0].date;
259        if ($("#uts-calendar-day-" + uts.apps.calendar.formatDate(d)).size() > 0){
260            if (!$("#uts-calendar-day-" + uts.apps.calendar.formatDate(d)).hasClass('uts-calendar-day-other-month')){
261                if (uts.apps.calendar.size == "small"){
262                    $("#uts-calendar-day-" + uts.apps.calendar.formatDate(d)).addClass('uts-calendar-day-hasevent');
263                    var eventText = "<b>" + uts.apps.calendar.truncate($(this)[0].name, 20) + "</b> (" + $(this)[0].startTime + "-" + $(this)[0].endTime + ")<br /><p>" + uts.apps.calendar.truncate($(this)[0].description, 80) + "</p>";
264                    if ($(this)[0].startTime == "00:00" || $(this)[0].endTime == "00:00")
265                        eventText = "<b>" + uts.apps.calendar.truncate($(this)[0].name, 20) + "</b><br /><p>" + uts.apps.calendar.truncate($(this)[0].description, 80) + "</p>";
266                    if ($("#uts-calendar-day-" + uts.apps.calendar.formatDate(d)).attr('title') != undefined)
267                        $("#uts-calendar-day-" + uts.apps.calendar.formatDate(d)).attr('title', $("#uts-calendar-day-" + uts.apps.calendar.formatDate(d)).attr('title') + "<br/>" + eventText);
268                    else
269                        $("#uts-calendar-day-" + uts.apps.calendar.formatDate(d)).attr('title', eventText);
270                } else {
271                    $("#uts-calendar-day-" + uts.apps.calendar.formatDate(d)).append($('<div>')
272                        .addClass("uts-calendar-event")
273                        .addClass("uts-calendar-event-" + $(this)[0].categoryId)
274                        .text(uts.apps.calendar.getEventText($(this)[0].name, $(this)[0].startTime))
275                        .prop('name', $(this)[0].name)
276                        .prop('description', $(this)[0].description)
277                        .prop('date', $(this)[0].date)
278                        .prop('startTime', $(this)[0].startTime)
279                        .prop('endTime', $(this)[0].endTime)
280                        .css('backgroundColor', '#' + $(this)[0].categoryColor)
281                        .css('cursor', 'pointer')
282                        .css('color', uts.apps.calendar.getFontColor('#' + $(this)[0].categoryColor))
283                        .on('click', function () {
284                            if ($(this).prop('startTime') == "00:00" && $(this).prop('endTime') == "00:00")
285                                alert($(this).prop('name') + "\n\n" + $(this).prop('description') + "\n\n" + uts.apps.calendar.formatDate($(this).prop('date')));
286                            else if ($(this).prop('endTime') == "00:00")
287                                alert($(this).prop('name') + "\n\n" + $(this).prop('description') + "\n\n" + uts.apps.calendar.formatDate($(this).prop('date')) + " (" + $(this).prop('startTime') + ")");
288                            else
289                                alert($(this).prop('name') + "\n\n" + $(this).prop('description') + "\n\n" + uts.apps.calendar.formatDate($(this).prop('date')) + " (" + $(this).prop('startTime') + " - " + $(this).prop('endTime') + ")");
290                        })
291                    );
292                }
293            }
294        }
295    });
296    
297    if (uts.apps.calendar.size == "small"){
298        $('.uts-calendar-day-hasevent').each(function(){
299            $(this).tipsy({gravity: 'e', fade: true, html: true, opacity: 1});
300        });
301    }
302};
303
304uts.apps.calendar.renderEventsList = function ()
305{
306    var lastMonth = "";
307
308    $(uts.apps.calendar.events).each(function ()
309    {
310        var d = $(this)[0].date;
311        var name = $(this)[0].name;
312        var description = $(this)[0].description;
313        var startTime = $(this)[0].startTime;
314        var endTime = $(this)[0].endTime;
315        var currentMonth = uts.apps.calendar.getMonthName(d);
316        var eventTime = startTime + " - " + endTime;
317
318        if (endTime == "00:00")
319            eventTime = startTime;
320
321        if (startTime == "00:00" && endTime == "00:00")
322            eventTime = "";
323
324        if (lastMonth != currentMonth)
325        {
326            $("#cal-" + uts.apps.calendar.id + " .uts-calendar-list").append($('<div>')
327                .addClass("uts-calendar-list-month")
328                .text(currentMonth)
329            );
330        }
331
332        $("#cal-" + uts.apps.calendar.id + " .uts-calendar-list").append($('<div>')
333            .addClass("uts-calendar-list-day")
334            .append($('<label>')
335                .addClass('uts-calendar-list-day-date')
336                .text(uts.apps.calendar.formatDateHuman(d))
337            ).append($('<label>')
338                .addClass('uts-calendar-list-day-time')
339                .text(eventTime)
340            ).append($('<label>')
341                .addClass('uts-calendar-list-day-name')
342                .text(name)
343            ).append($('<label>')
344                .addClass('uts-calendar-list-day-description')
345                .html(description.replace(/\n/g, '<br />'))
346            )
347        );
348
349        lastMonth = currentMonth;
350    });
351};
352
353uts.apps.calendar.cloneDate = function(date){
354    return new Date(date.getTime());
355};
356
357uts.apps.calendar.getMonthName = function(date){
358    var year = date.getFullYear();
359    var month = uts.apps.calendar.months[date.getMonth()];
360    return month + " " + year;
361};
362
363uts.apps.calendar.getPreviousMonth = function(date){
364    var d = uts.apps.calendar.cloneDate(date);
365    d.setDate(1);
366    d.setMonth(d.getMonth() - 1);
367    return d;
368};
369
370uts.apps.calendar.getNextMonth = function(date){
371    var d = uts.apps.calendar.cloneDate(date);
372    d.setDate(1);
373    d.setMonth(d.getMonth() + 1);
374    return d;
375};
376
377uts.apps.calendar.getNextDay = function(date){
378    var d = uts.apps.calendar.cloneDate(date);
379    d.setDate(d.getDate() + 1);
380    return d;
381};
382
383uts.apps.calendar.addDays = function(date, days){
384    var d = uts.apps.calendar.cloneDate(date);
385    d.setDate(d.getDate() + days);
386    return d;
387};
388
389uts.apps.calendar.isWeekDay = function(date){
390    var day = date.getDay();
391    if (day == 0 || day == 6)
392        return true;
393    return false;
394};
395
396uts.apps.calendar.formatDate = function(date){
397    var yyyy = date.getFullYear().toString();
398    var MM = (date.getMonth() + 1).toString();
399    var dd = date.getDate().toString();
400    return yyyy + "-" + MM + "-" + dd;
401};
402
403uts.apps.calendar.formatDateHuman = function (date) {
404    var yyyy = date.getFullYear().toString();
405    var MM = uts.apps.calendar.getMonthName(date);
406    var dd = date.getDate().toString();
407    return dd + " " + MM;
408};
409
410uts.apps.calendar.getFontColor = function(backColor){
411    var r = parseInt(backColor.substr(1, 2), 16);
412    var g = parseInt(backColor.substr(3, 2), 16);
413    var b = parseInt(backColor.substr(5, 2), 16);
414    var yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;
415    return (yiq >= 139) ? '#000000' : '#ffffff';
416};
417
418uts.apps.calendar.truncate = function(text, maxLength){
419    if (text.length > maxLength)
420        return text.substr(0, maxLength) + "...";
421    return text;
422};
423
424uts.apps.calendar.getEventText = function(text, startTime){
425    if (startTime == "00:00")
426        return uts.apps.calendar.truncate(text, 20);
427    return uts.apps.calendar.truncate(text, 20) + " (" + startTime + ")";
428};
429
430$(document).ready(function(){
431    uts.apps.calendar.setHeights();
432});
433
434(function($){
435    
436    function fixTitle($ele) {
437        if ($ele.attr('title') || typeof($ele.attr('original-title')) != 'string') {
438            $ele.attr('original-title', $ele.attr('title') || '').removeAttr('title');
439        }
440    }
441    
442    function Tipsy(element, options) {
443        this.$element = $(element);
444        this.options = options;
445        this.enabled = true;
446        fixTitle(this.$element);
447    }
448    
449    Tipsy.prototype = {
450        show: function() {
451            var title = this.getTitle();
452            if (title && this.enabled) {
453                var $tip = this.tip();
454                
455                $tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);
456                $tip[0].className = 'tipsy';
457                $tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).appendTo(document.body);
458                
459                var pos = $.extend({}, this.$element.offset(), {
460                    width: this.$element[0].offsetWidth,
461                    height: this.$element[0].offsetHeight
462                });
463                
464                var actualWidth = $tip[0].offsetWidth, actualHeight = $tip[0].offsetHeight;
465                var gravity = (typeof this.options.gravity == 'function')
466                                ? this.options.gravity.call(this.$element[0])
467                                : this.options.gravity;
468                
469                var tp;
470                switch (gravity.charAt(0)) {
471                    case 'n':
472                        tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
473                        break;
474                    case 's':
475                        tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
476                        break;
477                    case 'e':
478                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
479                        break;
480                    case 'w':
481                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
482                        break;
483                }
484                
485                if (gravity.length == 2) {
486                    if (gravity.charAt(1) == 'w') {
487                        tp.left = pos.left + pos.width / 2 - 15;
488                    } else {
489                        tp.left = pos.left + pos.width / 2 - actualWidth + 15;
490                    }
491                }
492                
493                $tip.css(tp).addClass('tipsy-' + gravity);
494                
495                if (this.options.fade) {
496                    $tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity});
497                } else {
498                    $tip.css({visibility: 'visible', opacity: this.options.opacity});
499                }
500            }
501        },
502        
503        hide: function() {
504            if (this.options.fade) {
505                this.tip().stop().fadeOut(function() { $(this).remove(); });
506            } else {
507                this.tip().remove();
508            }
509        },
510        
511        getTitle: function() {
512            var title, $e = this.$element, o = this.options;
513            fixTitle($e);
514            var title, o = this.options;
515            if (typeof o.title == 'string') {
516                title = $e.attr(o.title == 'title' ? 'original-title' : o.title);
517            } else if (typeof o.title == 'function') {
518                title = o.title.call($e[0]);
519            }
520            title = ('' + title).replace(/(^\s*|\s*$)/, "");
521            return title || o.fallback;
522        },
523        
524        tip: function() {
525            if (!this.$tip) {
526                this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"/></div>');
527            }
528            return this.$tip;
529        },
530        
531        validate: function() {
532            if (!this.$element[0].parentNode) {
533                this.hide();
534                this.$element = null;
535                this.options = null;
536            }
537        },
538        
539        enable: function() { this.enabled = true; },
540        disable: function() { this.enabled = false; },
541        toggleEnabled: function() { this.enabled = !this.enabled; }
542    };
543    
544    $.fn.tipsy = function(options) {
545        
546        if (options === true) {
547            return this.data('tipsy');
548        } else if (typeof options == 'string') {
549            return this.data('tipsy')[options]();
550        }
551        
552        options = $.extend({}, $.fn.tipsy.defaults, options);
553        
554        function get(ele) {
555            var tipsy = $.data(ele, 'tipsy');
556            if (!tipsy) {
557                tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
558                $.data(ele, 'tipsy', tipsy);
559            }
560            return tipsy;
561        }
562        
563        function enter() {
564            var tipsy = get(this);
565            tipsy.hoverState = 'in';
566            if (options.delayIn == 0) {
567                tipsy.show();
568            } else {
569                setTimeout(function() { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);
570            }
571        };
572        
573        function leave() {
574            var tipsy = get(this);
575            tipsy.hoverState = 'out';
576            if (options.delayOut == 0) {
577                tipsy.hide();
578            } else {
579                setTimeout(function() { if (tipsy.hoverState == 'out') tipsy.hide(); }, options.delayOut);
580            }
581        };
582        
583        if (!options.live) this.each(function() { get(this); });
584        
585        if (options.trigger != 'manual') {
586            var binder   = options.live ? 'live' : 'bind',
587                eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus',
588                eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';
589            this[binder](eventIn, enter)[binder](eventOut, leave);
590        }
591        
592        return this;
593        
594    };
595    
596    $.fn.tipsy.defaults = {
597        delayIn: 0,
598        delayOut: 0,
599        fade: false,
600        fallback: '',
601        gravity: 'n',
602        html: false,
603        live: false,
604        offset: 0,
605        opacity: 0.8,
606        title: 'title',
607        trigger: 'hover'
608    };
609    
610    $.fn.tipsy.elementOptions = function(ele, options) {
611        return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
612    };
613    
614    $.fn.tipsy.autoNS = function() {
615        return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
616    };
617    
618    $.fn.tipsy.autoWE = function() {
619        return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
620    };
621    
622})(jQuery);

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.