This file is indexed.

/usr/share/drupal6/modules/views/js/tabs.js is in drupal6-mod-views 2.16-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
/**
 * @file tabs.js
 * jQuery UI Tabs (Tabs 3)
 *
 * This is nothing more than the pure jquery UI tabs implementation.
 * It has been implemented under the Drupal.Views.Tabs namespace to
 * avoid conflicts with alternatve versions of jquery, jquery UI.
 */

Drupal.Views = Drupal.Views || {};

Drupal.Views.Tabs = function(el, options) {

  this.source = el;

  this.options = $.extend({

    // basic setup
    initial: 0,
    event: 'click',
    disabled: [],
    // TODO bookmarkable: $.ajaxHistory ? true : false,
    unselected: false,
    toggle: options.unselected ? true : false,

    // Ajax
    spinner: 'Loading…',
    cache: false,
    hashPrefix: 'tab-',

    // animations
    /*fxFade: null,
    fxSlide: null,
    fxShow: null,
    fxHide: null,*/
    fxSpeed: 'normal',
    /*fxShowSpeed: null,
    fxHideSpeed: null,*/

    // callbacks
    add: function() {},
    remove: function() {},
    enable: function() {},
    disable: function() {},
    click: function() {},
    hide: function() {},
    show: function() {},
    load: function() {},

    // CSS classes
    navClass: 'ui-tabs-nav',
    selectedClass: 'ui-tabs-selected',
    disabledClass: 'ui-tabs-disabled',
    containerClass: 'ui-tabs-container',
    hideClass: 'ui-tabs-hide',
    loadingClass: 'ui-tabs-loading'

  }, options);

  this.tabify(true);

  // save instance for later
  var uuid = 'instance-' + Drupal.Views.Tabs.prototype.count++;
  Drupal.Views.Tabs.instances[uuid] = this;
  this.source.data('UI_TABS_UUID', uuid);

};

// static
Drupal.Views.Tabs.instances = {};

$.extend(Drupal.Views.Tabs.prototype, {
  animating: false,
  count: 0,
  tabify: function(init) {

    this.$tabs = $('a:first-child', this.source);
    this.$containers = $([]);

    var self = this, o = this.options;

    this.$tabs.each(function(i, a) {
      // inline tab
      if (a.hash && a.hash.replace('#', '')) { // safari 2 reports '#' for an empty hash
        self.$containers = self.$containers.add(a.hash);
      }
      // remote tab
      else {
        var id = a.title && a.title.replace(/\s/g, '_') || o.hashPrefix + (self.count + 1) + '-' + (i + 1), url = a.href;
        a.href = '#' + id;
        a.url = url;
        self.$containers = self.$containers.add(
          $('#' + id)[0] || $('<div id="' + id + '" class="' + o.containerClass + '"></div>')
            .insertAfter( self.$containers[i - 1] || self.source )
        );
      }
    });

    if (init) {

      // Try to retrieve initial tab from fragment identifier in url if present,
      // otherwise try to find selected class attribute on <li>.
      this.$tabs.each(function(i, a) {
        if (location.hash) {
          if (a.hash == location.hash) {
            o.initial = i;
            // prevent page scroll to fragment
            //if (($.browser.msie || $.browser.opera) && !o.remote) {
            if ($.browser.msie || $.browser.opera) {
              var $toShow = $(location.hash), toShowId = $toShow.attr('id');
              $toShow.attr('id', '');
              setTimeout(function() {
                $toShow.attr('id', toShowId); // restore id
              }, 500);
            }
            scrollTo(0, 0);
            return false; // break
          }
        } else if ( $(a).parents('li:eq(0)').is('li.' + o.selectedClass) ) {
          o.initial = i;
          return false; // break
        }
      });

      // attach necessary classes for styling if not present
      $(this.source).is('.' + o.navClass) || $(this.source).addClass(o.navClass);
      this.$containers.each(function() {
        var $this = $(this);
        $this.is('.' + o.containerClass) || $this.addClass(o.containerClass);
      });

      // highlight tab accordingly
      var $lis = $('li', this.source);
      this.$containers.addClass(o.hideClass);
      $lis.removeClass(o.selectedClass);
      if (!o.unselected) {
        this.$containers.slice(o.initial, o.initial + 1).show();
        $lis.slice(o.initial, o.initial + 1).addClass(o.selectedClass);
      }

      // trigger load of initial tab is remote tab
      if (this.$tabs[o.initial].url) {
        this.load(o.initial + 1, this.$tabs[o.initial].url);
        if (o.cache) {
          this.$tabs[o.initial].url = null; // if loaded once do not load them again
        }
      }

      // disabled tabs
      for (var i = 0, position; position = o.disabled[i]; i++) {
        this.disable(position);
      }

    }

    // setup animations
    var showAnim = {}, hideAnim = {}, showSpeed = o.fxShowSpeed || o.fxSpeed,
      hideSpeed = o.fxHideSpeed || o.fxSpeed;
    if (o.fxSlide || o.fxFade) {
      if (o.fxSlide) {
        showAnim['height'] = 'show';
        hideAnim['height'] = 'hide';
      }
      if (o.fxFade) {
        showAnim['opacity'] = 'show';
        hideAnim['opacity'] = 'hide';
      }
    } else {
      if (o.fxShow) {
        showAnim = o.fxShow;
      } else { // use some kind of animation to prevent browser scrolling to the tab
        showAnim['min-width'] = 0; // avoid opacity, causes flicker in Firefox
        showSpeed = 1; // as little as 1 is sufficient
      }
      if (o.fxHide) {
        hideAnim = o.fxHide;
      } else { // use some kind of animation to prevent browser scrolling to the tab
        hideAnim['min-width'] = 0; // avoid opacity, causes flicker in Firefox
        hideSpeed = 1; // as little as 1 is sufficient
      }
    }

    // callbacks
    var click = o.click, hide = o.hide, show = o.show;

    // reset some styles to maintain print style sheets etc.
    var resetCSS = { display: '', overflow: '', height: '' };
    if (!$.browser.msie) { // not in IE to prevent ClearType font issue
      resetCSS['opacity'] = '';
    }

    // hide a tab, animation prevents browser scrolling to fragment
    function hideTab(clicked, $hide, $show) {
      $hide.animate(hideAnim, hideSpeed, function() { //
        $hide.addClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc.
        hide(clicked, $show, $hide[0]);
        if ($show) {
          showTab(clicked, $hide, $show);
        }
      });
    }

    // show a tab, animation prevents browser scrolling to fragment
    function showTab(clicked, $hide, $show) {
      // show next tab
      if (!(o.fxSlide || o.fxFade || o.fxShow)) {
        $show.css('display', 'block'); // prevent occasionally occuring flicker in Firefox cause by gap between showing and hiding the tab containers
      }
      $show.animate(showAnim, showSpeed, function() {
        $show.removeClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc.
        if ($.browser.msie) {
          $hide[0].style.filter = '';
          $show[0].style.filter = '';
        }
        show(clicked, $show[0], $hide[0]);
        self.animating = false;
      });

    }

    // switch a tab
    function switchTab(clicked, $hide, $show) {
      /*if (o.bookmarkable && trueClick) { // add to history only if true click occured, not a triggered click
        $.ajaxHistory.update(clicked.hash);
      }*/
      $(clicked).parents('li:eq(0)').addClass(o.selectedClass)
        .siblings().removeClass(o.selectedClass);
      hideTab(clicked, $hide, $show);
    }

    // tab click handler
    function tabClick(e) {

      //var trueClick = e.clientX; // add to history only if true click occured, not a triggered click
      var $li = $(this).parents('li:eq(0)'), $hide = self.$containers.filter(':visible'), $show = $(this.hash);

      // if tab may be closed
      if (o.toggle && !$li.is('.' + o.disabledClass) && !self.animating) {
        if ($li.is('.' + o.selectedClass)) {
          $li.removeClass(o.selectedClass);
          hideTab(this, $hide);
          this.blur();
          return false;
        } else if (!$hide.length) {
          $li.addClass(o.selectedClass);
          showTab(this, $hide, $show);
          this.blur();
          return false;
        }
      }

      // If tab is already selected or disabled, animation is still running or click callback
      // returns false stop here.
      // Check if click handler returns false last so that it is not executed for a disabled tab!
      if ($li.is('.' + o.selectedClass + ', .' + o.disabledClass)
        || self.animating || click(this, $show[0], $hide[0]) === false) {
        this.blur();
        return false;
      }

      self.animating = true;

      // show new tab
      if ($show.length) {

        // prevent scrollbar scrolling to 0 and than back in IE7, happens only if bookmarking/history is enabled
        /*if ($.browser.msie && o.bookmarkable) {
          var showId = this.hash.replace('#', '');
          $show.attr('id', '');
          setTimeout(function() {
            $show.attr('id', showId); // restore id
          }, 0);
        }*/

        if (this.url) { // remote tab
          var a = this;
          self.load(self.$tabs.index(this) + 1, this.url, function() {
            switchTab(a, $hide, $show);
          });
          if (o.cache) {
            this.url = null; // if loaded once do not load them again
          }
        } else {
          switchTab(this, $hide, $show);
        }

        // Set scrollbar to saved position - need to use timeout with 0 to prevent browser scroll to target of hash
        /*var scrollX = window.pageXOffset || document.documentElement && document.documentElement.scrollLeft || document.body.scrollLeft || 0;
        var scrollY = window.pageYOffset || document.documentElement && document.documentElement.scrollTop || document.body.scrollTop || 0;
        setTimeout(function() {
          scrollTo(scrollX, scrollY);
        }, 0);*/

      } else {
        throw Drupal.t('jQuery UI Tabs: Mismatching fragment identifier.');
      }

      this.blur(); // prevent IE from keeping other link focussed when using the back button

      //return o.bookmarkable && !!trueClick; // convert trueClick == undefined to Boolean required in IE
      return false;

    }

    // attach click event, avoid duplicates from former tabifying
    this.$tabs.unbind(o.event, tabClick).bind(o.event, tabClick);

  },
  add: function(url, text, position) {
    if (url && text) {
      var o = this.options;
      position = position || this.$tabs.length; // append by default
      if (position >= this.$tabs.length) {
        var method = 'insertAfter';
        position = this.$tabs.length;
      } else {
        var method = 'insertBefore';
      }
      if (url.indexOf('#') == 0) { // ajax container is created by tabify automatically
        var $container = $(url);
        // try to find an existing element before creating a new one
        ($container.length && $container || $('<div id="' + url.replace('#', '') + '" class="' + o.containerClass + ' ' + o.hideClass + '"></div>'))
          [method](this.$containers[position - 1]);
      }
      $('<li><a href="' + url + '"><span>' + text + '</span></a></li>')
        [method](this.$tabs.slice(position - 1, position).parents('li:eq(0)'));
      this.tabify();
      o.add(this.$tabs[position - 1], this.$containers[position - 1]); // callback
    } else {
      throw Drupal.t('jQuery UI Tabs: Not enough arguments to add tab.');
    }
  },
  remove: function(position) {
    if (position && position.constructor == Number) {
      this.$tabs.slice(position - 1, position).parents('li:eq(0)').remove();
      this.$containers.slice(position - 1, position).remove();
      this.tabify();
    }
    this.options.remove(); // callback
  },
  enable: function(position) {
    var $li = this.$tabs.slice(position - 1, position).parents('li:eq(0)'), o = this.options;
    $li.removeClass(o.disabledClass);
    if ($.browser.safari) { // fix disappearing tab after enabling in Safari... TODO check Safari 3
      $li.animate({ opacity: 1 }, 1, function() {
        $li.css({ opacity: '' });
      });
    }
    o.enable(this.$tabs[position - 1], this.$containers[position - 1]); // callback
  },
  disable: function(position) {
    var $li = this.$tabs.slice(position - 1, position).parents('li:eq(0)'), o = this.options;
    if ($.browser.safari) { // fix opacity of tab after disabling in Safari... TODO check Safari 3
      $li.animate({ opacity: 0 }, 1, function() {
          $li.css({ opacity: '' });
      });
    }
    $li.addClass(this.options.disabledClass);
    o.disable(this.$tabs[position - 1], this.$containers[position - 1]); // callback
  },
  click: function(position) {
    this.$tabs.slice(position - 1, position).trigger('click');
  },
  load: function(position, url, callback) {
    var self = this,
      o = this.options,
      $a = this.$tabs.slice(position - 1, position).addClass(o.loadingClass),
      $span = $('span', $a),
      text = $span.html();

    // shift arguments
    if (url && url.constructor == Function) {
      callback = url;
    }

    // set new URL
    if (url) {
      $a[0].url = url;
    }

    // load
    if (o.spinner) {
      $span.html('<em>' + o.spinner + '</em>');
    }
    setTimeout(function() { // timeout is again required in IE, "wait" for id being restored
      $($a[0].hash).load(url, function() {
        if (o.spinner) {
          $span.html(text);
        }
        $a.removeClass(o.loadingClass);
        // This callback is needed because the switch has to take place after loading
        // has completed.
        if (callback && callback.constructor == Function) {
          callback();
        }
        o.load(self.$tabs[position - 1], self.$containers[position - 1]); // callback
      });
    }, 0);
  }
});