(function() { jQuery(window).on('load', function() { datasetIDs = getDatasetIDs(); datasetIDs.every(function(dom) { console.log(new SlidingDataset(dom)); return true; }); }); function getDatasetIDs() { var moduleWrappers = jQuery('.sliding-dataset_wrapper'); return jQuery.map(moduleWrappers, function(div) { return jQuery(div); }); } function fixHeight(sliding_ds) { var datasets = sliding_ds.dom.find(".sliding-dataset_dataset-wrapper").children("div.sliding-dataset_ds"); var max_height = 0; for(var i = 0; i < datasets.length; i++) { var current_ds = jQuery(datasets[i]); var original_display = current_ds.css("display"); current_ds.show(); var height = current_ds.height() + parseInt(current_ds.css("padding-top"), 10) + parseInt(current_ds.css("padding-bottom"), 10); if(height > max_height) { max_height = height; } current_ds.css("display", original_display); } sliding_ds.dom.find(".sliding-dataset_dataset-wrapper").height(max_height); } function SlidingDataset(dom) { var sliding_ds = this; this.id = dom.data("id"); this.currentDataset = 1; this.datasetCount = dom.find(".sliding-dataset_dataset-wrapper").children("div.sliding-dataset_ds").length; this.num_display_ds = dom.data("num-display-ds"); this.auto_advance_seconds = parseFloat(dom.data("auto-advance-seconds")); this.dom = dom; this.timeout = null; fixHeight(this); dom.find(".sliding-dataset_previous").click(function() { sliding_ds.previous(); }); dom.find(".sliding-dataset_next").click(function() { sliding_ds.next(); }); this.lock = false; if(!Number.isNaN(this.auto_advance_seconds) && this.auto_advance_seconds > 0) { this.timeout = setTimeout(() => this.next(), this.auto_advance_seconds * 1000); } } SlidingDataset.prototype.previous = function() { if(!this.lock) { if(this.timeout !== null) { clearTimeout(this.timeout); this.timeout = setTimeout(() => this.next(), this.auto_advance_seconds * 1000); } var sliding_ds = this; this.lock = true; var newLeftDataset = ((this.currentDataset - 2) % this.datasetCount + this.datasetCount) % this.datasetCount; const container = this.dom.find(".sliding-dataset_dataset-wrapper"); var datasets = container.children("div.sliding-dataset_ds"); // Copy new Left Dataset var newLeftDS = datasets[newLeftDataset].cloneNode(true); newLeftDS = jQuery(newLeftDS); container.prepend(newLeftDS); var children = container.children("div.sliding-dataset_ds"); children.css("position", "absolute"); children.removeClass("sliding-dataset_left sliding-dataset_center sliding-dataset_right"); children.addClass("sliding-dataset_moving"); var num_display_ds = this.num_display_ds; const actually_displayed_ds = Math.round(container.width() / children.width()); const firstChildLeft = children.position().left; const relativeChildLeft = firstChildLeft / container.width(); for(i = 0; i <= num_display_ds; i++) { const child = jQuery(children[i]); child.css("left", (100*relativeChildLeft + (i-1)*(100/actually_displayed_ds))+"%"); if(i == 0) { child.removeClass("sliding-dataset_hidden").show(); } var completion_function = function(idx) { return function() { var my_child = jQuery(this); my_child.removeClass("sliding-dataset_moving").css("position", "").css("left", ""); if(idx == 0) { my_child.addClass("sliding-dataset_left"); } if(idx == num_display_ds-1) { my_child.addClass("sliding-dataset_right"); } if(idx < num_display_ds-1 && idx > 0) { my_child.addClass("sliding-dataset_center"); } if(idx == num_display_ds) { my_child.hide().addClass("sliding-dataset_hidden"); jQuery(datasets[newLeftDataset]).remove(); sliding_ds.lock = false; // has to be set once, so do it on the largest index } }; }; child.animate({"left": (100*relativeChildLeft + i*(100/actually_displayed_ds))+"%"}, 1000, completion_function(i)); } } } SlidingDataset.prototype.next = function() { if(!this.lock) { if(this.timeout !== null) { clearTimeout(this.timeout); this.timeout = setTimeout(() => this.next(), this.auto_advance_seconds * 1000); } var sliding_ds = this; this.lock = true; const container = this.dom.find(".sliding-dataset_dataset-wrapper"); var datasets = container.children("div.sliding-dataset_ds"); // Copy new Left Dataset var newRightDS = datasets[0].cloneNode(true); newRightDS = jQuery(newRightDS); newRightDS.removeClass("sliding-dataset_left sliding-dataset_center sliding-dataset_right"); newRightDS.addClass("sliding-dataset_hidden"); newRightDS.hide(); container.append(newRightDS) var children = container.children("div.sliding-dataset_ds"); children.css("position", "absolute"); children.removeClass("sliding-dataset_left sliding-dataset_center sliding-dataset_right"); children.addClass("sliding-dataset_moving"); var num_display_ds = this.num_display_ds; const firstChildLeft = children.position().left; const relativeChildLeft = firstChildLeft / container.width(); const actually_displayed_ds = Math.round(container.width() / children.width()); for(i = 0; i <= num_display_ds; i++) { child = jQuery(children[i]); child.css("left", (100*relativeChildLeft + i*(100/actually_displayed_ds))+"%"); if(i == num_display_ds) { child.removeClass("sliding-dataset_hidden").show(); } var completion_function = function(idx) { return function() { var my_child = jQuery(this); my_child.removeClass("sliding-dataset_moving").css("position", "").css("left", ""); if(idx == 0) { my_child.hide().remove(); } if(idx == 1) { my_child.addClass("sliding-dataset_left"); } if(idx == num_display_ds) { my_child.addClass("sliding-dataset_right"); sliding_ds.lock = false; // has to be set once, so do it on the largest index } if(idx < num_display_ds && idx > 1) { my_child.addClass("sliding-dataset_center"); } }; }; child.animate({"left": (100*relativeChildLeft + (i-1)*(100/actually_displayed_ds))+"%"}, 1000, completion_function(i)); } } }; })();