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.