PageSourceSearch

https://www.lannoopublishers.com/sites/all/modules/contrib/gd_infinite_scroll/js/gd_infinite_scroll.js?tkukhp

js lannoopublishers.com collected 2026-09-25 18:39:14 UTC 8,633 bytes, 261 lines download raw bytes

1// $Id:
2
3(function ($) {
4Drupal.behaviors.gd_infinite_scroll = {
5  /**
6   * Callback document loaded.
7   */
8  attach:function() {
9    // Make sure that autopager plugin is loaded.
10    var gd_settings = Drupal.settings.gd_infinite_scroll;
11    if (typeof gd_settings == 'object') {
12      for (var key in gd_settings) {
13        var $content_selector  = $(gd_settings[key].content_selector).not('.gd-infinite-scroll-initialized');
14        if ($content_selector[0]) {
15          $content_selector.addClass('gd-infinite-scroll-initialized');
16          this.init_gd_infinite_scroll(key, gd_settings[key]);
17        }
18      }
19    }
20    
21  },
22  
23  /**
24   * This functions initialize the autopager.
25   */
26  init_gd_infinite_scroll: function(autopager_id, settings) {
27    var content_selector  = settings.content_selector;
28    var items_selector    = settings.content_selector + ' ' + settings.items_selector;
29    var pager_selector    = settings.pager_selector;
30    var next_selector     = settings.next_selector;
31    var img_location      = settings.content_selector;
32    var img_path          = settings.img_path;
33    var load_more         = settings.load_more;
34    var load_more_markup  = settings.load_more_markup;
35    var ajax_pager         = settings.ajax_pager;
36    var img               = '<div class="gd_infinite_scroll-ajax-loader"><img src="' + img_path + '" alt="' + Drupal.t('Loading') + '..."></div>';
37    var $this = this;
38    if (!$(content_selector)[0]) {
39      return;
40    }
41    
42    var autoloading = true;
43    var load_more_button = $('<a></a>');
44    if (load_more) {
45      autoloading = false;
46      load_more_button = $(load_more_markup);
47    }
48    if (ajax_pager) {
49      // Ajax pager
50      autoloading = false;
51      $(pager_selector + ' a').not('.gd-infinite-scroll-ajax-initialized').click(function(e) {
52        var href = $(this).attr('href');
53        $(pager_selector + ' a').not(this).removeClass('active');
54        $(pager_selector + ' li').removeClass('pager-current');
55        $(this).addClass('active').parent().addClass('pager-current');
56        $.get(href, function (data) {
57          var nextPage = $('<div/>').append(data.replace(/<script(.|\s)*?\/script>/g, "")),
58            nextContent = nextPage.find(content_selector);
59          $(content_selector).replaceWith(nextContent).addClass('gd-infinite-scroll-initialized');
60          Drupal.attachBehaviors($(content_selector)[0]);
61        });
62        e.preventDefault();
63      }).addClass('gd-infinite-scroll-ajax-initialized');
64    }
65    else {
66      // Autopager
67      $(pager_selector).hide();
68  
69      this.autopager(
70        autopager_id,
71        {
72          autoLoad: autoloading,
73          appendTo: content_selector,
74          content: items_selector,
75          link: next_selector,
76          page: 0,
77          start: function() {
78            $(img_location).after(img);
79          },
80          load: function(current, next) {
81            $(content_selector).next('div.gd_infinite_scroll-ajax-loader').remove();
82            Drupal.attachBehaviors(this);
83            if (load_more && !next.url) {
84              load_more_button.hide();
85            }
86          }
87        }
88      );
89    }
90    if (!load_more && !ajax_pager && $(items_selector)[0]) {
91      // Trigger autoload if content height is less than doc height already
92      var prev_content_height = $(content_selector).height();
93      do {
94        var last = $(items_selector).filter(':last');
95        if(last.offset().top + last.height() < $(document).scrollTop() + $(window).height()) {
96          last = $(items_selector).filter(':last');
97          $this.load(autopager_id);
98        }
99        else {
100          break;
101        }
102      }
103      while ($(content_selector).height() > prev_content_height);
104    }            
105    else if ($(next_selector)[0] && load_more) {
106      load_more_button.addClass('gd-infinite-scroll-load-more')
107      .appendTo($(img_location).parent())
108      .click(function(e) {
109        // do load
110        $this.load(autopager_id);
111        e.preventDefault();
112      });
113    }
114  },
115  state: {},
116  _optionsDefault: {
117    autoLoad: true,
118    page: 1,
119    content: '.content',
120    link: 'a[rel=next]',
121    insertBefore: null, 
122    appendTo: null, 
123    start: function() {},
124    load: function() {},
125    disabled: false
126  },
127  setState: function(autopager_id, values) {
128    for (var key in values) { 
129      this.state[autopager_id][key] = values[key]; 
130    }
131  },
132  autopager: function(autopager_id, options) {
133    var _options = $.extend({}, this._optionsDefault, options);
134    var _content = $(_options.content).filter(':last');
135    if (_content.length) {
136      if (!_options.insertBefore && !_options.appendTo) {
137        var insertBefore = _content.next();
138        if (insertBefore.length) {
139          this.setOption('insertBefore', insertBefore);
140        } 
141        else {
142          this.setOption('appendTo', _content.parent());
143        }
144      }
145    }
146    this.state[autopager_id] = {
147      content: _content,
148      active: false,
149      options: {},
150    },
151    this.option(autopager_id, _options);
152    this.setUrl(autopager_id);
153  },
154  loadOnScroll: function(autopager_id, e) {
155    var content = this.state[autopager_id]['content'];
156    if (content.offset().top < $(document).scrollTop() + $(window).height()) {
157      this.load(autopager_id);
158    }
159  },
160  load: function(autopager_id) {
161    if (this.state[autopager_id]['active'] || 
162        !this.state[autopager_id]['nextUrl'] || 
163        this.option(autopager_id, 'disabled')) {
164      return;
165    }
166    this.setState(autopager_id, {active: true});
167   
168    var fn = this.option(autopager_id, 'start'); 
169    fn(this.currentHash(autopager_id), this.nextHash(autopager_id));
170    $.get(this.state[autopager_id]['nextUrl'], this.insertContent.bind(this, autopager_id));
171    return this;
172  },
173  insertContent: function(autopager_id, res) {
174    var _options = this.state[autopager_id]['options'],
175      nextPage = $('<div/>').append(res.replace(/<script(.|\s)*?\/script>/g, "")),
176      nextContent = nextPage.find(_options.content); 
177
178    this.setOption(autopager_id, 'page', _options.page + 1);
179    this.setUrl(autopager_id, nextPage);
180    if (nextContent.length) {
181      if (_options.insertBefore) {
182        nextContent.insertBefore(_options.insertBefore);
183      } else {
184        nextContent.appendTo(_options.appendTo);
185      }
186      _options.load.call(nextContent.get(), this.currentHash(autopager_id), this.nextHash(autopager_id));
187      this.state[autopager_id]['content'] = nextContent.filter(':last');
188    }
189    this.state[autopager_id]['active'] = false;
190  },
191  currentHash: function(autopager_id) {
192    var _options = this.state[autopager_id]['options'];
193    return {
194      page: _options.page,
195      url: this.state[autopager_id]['currentUrl']
196    };
197  },
198  nextHash: function(autopager_id) {
199    var _options = this.state[autopager_id]['options'];
200    return {
201      page: _options.page + 1,
202      url: this.state[autopager_id]['nextUrl']
203    };
204  },
205  setUrl: function(autopager_id, context) {
206    var values = {};
207    values.currentUrl = this.state[autopager_id]['nextUrl'] || window.location.href;
208    values.nextUrl = $(this.option(autopager_id, 'link'), context).attr('href');
209    this.setState(autopager_id, values);
210  },
211  option: function(autopager_id, key, value) {
212    var _options = key;
213    var $this = this;
214    if (typeof key === "string") {
215      if (value === undefined) {
216        return this.state[autopager_id]['options'][key];
217      }
218      _options = {};
219      _options[key] = value;
220    }
221 
222    $.each(_options, function(key, value) {
223      $this.setOption(autopager_id, key, value);
224    });
225    return this;
226  },
227  setOption: function(autopager_id, key, value) {
228    switch (key) {
229      case 'autoLoad':
230        if (value && !this.state[autopager_id]['options']['autoLoad']) {
231          $(window).scroll(this.loadOnScroll.bind(this, autopager_id));
232        } else if (!value && this.state[autopager_id]['options']['autoLoad']) {
233          $(window).unbind('scroll', this.loadOnScroll);
234        }
235        break;
236      case 'insertBefore':
237        if (value) {
238          this.state[autopager_id]['options']['appendTo'] = null;
239        }
240        break
241      case 'appendTo':
242        if (value) {
243          this.state[autopager_id]['options']['insertBefore'] = null;
244        }
245        break
246    }
247    this.state[autopager_id]['options'][key] = value;
248  },
249
250  enable: function(autopager_id) {
251    this.setOption(autopager_id, 'disabled', false);
252    return this;
253  },
254
255  disable: function(autopager_id) {
256    this.setOption(autopager_id, 'disabled', true);
257    return this;
258  }
259}
260
261})(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.