(function($){
$.fn.columnav = function(options) {
var settings = $.extend({
column_class: 'column',
link_class: 'column-push',
selected_link_class: 'selected',
on_push: function(){},
on_pop: function(){},
process_data: function(data){return data;}
}, options );
var new_column = function(el, root) {
var $el = $(el).css({
display: 'inline-block',
verticalAlign: 'top',
whiteSpace: 'normal',
listStyle: 'none'
});
$('.'+settings.link_class, $el)
.on('click.columnav', function(e,cb) {
if (!root.busy) {
root.busy = true;
$('.'+settings.link_class, $el).removeClass(settings.selected_link_class);
var $this = $(this).addClass(settings.selected_link_class);
var removable = $this.parents('.'+settings.column_class).nextAll();
if (removable.length === 0) {
root.trigger('getandpush.columnav',[$this.attr('href'),cb]);
} else {
root.trigger('pop.columnav',[removable,function(cb_info) {
root.trigger('getandpush.columnav',[$this.attr('href'),cb]);
}]);
}
}
e.preventDefault();
});
};
return this.each(function(){
var root = $(this).css({
overflow: 'scroll',
whiteSpace: 'nowrap'
});
root.busy = false;
root.on('push.columnav', function(e,data,cb) {
var $data = $("
"+data+"");
async function push_callback_stack() {
await root.append($data);
await new_column($data, root);
var cb_object = {event:e,column:$data,container:root,settings:settings};
await settings.on_push(cb_object);
if (typeof cb == 'function') await cb(cb_object);
root.busy = false;
root.find('> li:last-child').get(0).scrollIntoView({
behavior: 'smooth', inline: 'start'
});
}
push_callback_stack();
});
root.on('getandpush.columnav', function(e,url,cb) {
$.get(url, function(data) {
root.trigger('push.columnav',[settings.process_data(data),function(cb_object) {
cb_object.column.data('href',url);
if (typeof cb == 'function') cb(cb_object);
}]);
});
});
root.on('pop.columnav', function(e,removable,cb) {
removable = removable || root.find('> li:last-child');
removable.css({visibility:'hidden'})
.animate({width:0},function(){
// Trick to make sure it runs only once
// not for each column removed
if (removable.filter(':animated').length === 0) {
removable.remove();
var cb_object = {event:e,container:root,settings:settings}
settings.on_pop(cb_object);
if (typeof cb == 'function') cb(cb_object);
}
});
});
root.children().each(function() {
new_column(this, root);
});
});
};
}(jQuery));