var fedmenu = function(options) { $(document).ready(function() {
var defaults = {
'url': 'https://apps.fedoraproject.org/js/data.js',
'mimeType': undefined, // Only needed for local development
'context': document, // Alternatively, parent.document for iframes.
'position': 'bottom-left',
'user': null,
'package': null,
};
// Our options object is called 'o' for shorthand
var o = $.extend({}, defaults, options || {});
// Also, hang on to the selector context with a shorthand 'c'
var c = o['context'];
var buttons = "";
if (o.user !== null) buttons += '
';
if (o.package !== null) buttons += '
';
buttons += '
';
var script = $("script[src$='fedmenu.js']").attr('src');
var base = script.slice(0, -13);
// Add a section if one doesn't exist.
// https://github.com/fedora-infra/fedmenu/issues/6
if ($('head', c).length == 0) $('html', c).append('');
$('head', c).append('');
$('body', c).append(
'
' +
buttons + '
');
$('body', c).append('');
var imgurl;
if (o.user !== null) {
imgurl = libravatar.url(o.user);
$('#fedmenu-user-button .img', c).css('background-image', 'url("' + imgurl + '")');
}
if (o.package !== null) {
/* This icon is not always going to exist, so we should put in an
* apache rule that redirects to a default icon if this file
* isn't there. */
imgurl = 'https://apps.fedoraproject.org/packages/images/icons/' + o.package + '.png';
$('#fedmenu-package-button .img', c).css('background-image', 'url("' + imgurl + '")');
}
// Define three functions used to generate the content of the menu panes
var make_main_content_html = function(i, node) {
var html = "
" +
node.name + "
";
$.each(node.children, function(j, leaf) {
html = html +
"
");
}
$("#fedmenu-main-content", c).append(html);
};
var make_user_content_html = function(i, node) {
var html = "
" +
node.name + "
";
var found = false;
$.each(node.children, function(j, leaf) {
if (leaf.data.user_url !== undefined) {
found = true;
var url = leaf.data.user_url.replace('{user}', o.user);
html = html +
"
";
}
});
if (found) {
if ($('#fedmenu-user-content').length == 0) {
$('body', c).append('');
$('#fedmenu-user-content', c).append("❌");
$('#fedmenu-user-content', c).append("
View " + o.user + " in other apps
");
}
html = html + "
";
$("#fedmenu-user-content", c).append(html);
}
};
var make_package_content_html = function(i, node) {
var html = "
" +
node.name + "
";
var found = false;
$.each(node.children, function(j, leaf) {
if (leaf.data.package_url !== undefined) {
found = true;
var url = leaf.data.package_url.replace('{package}', o.package);
html = html +
"
");
}
$("#fedmenu-package-content", c).append(html);
}
};
// A handy lookup for those functions we just defined.
var content_makers = {
'main': make_main_content_html,
'user': make_user_content_html,
'package': make_package_content_html,
};
var normalize = function(url) {
return url.slice(url.indexOf('://') + 3).replace(/\/$/, "");
}
// Figure out the current site that we're on, if possible, and return the
// data we have on it from the json we loaded.
var get_current_site = function() {
var found = null;
var ours = normalize(window.location.toString());
$.each(master_data, function(i, node) {
$.each(node.children, function(j, leaf) {
var theirs = normalize(leaf.data.url);
if (ours.indexOf(theirs) === 0) found = leaf;
})
});
return found;
}
// Try to construct a little footer for the menus.
var add_footer_links = function() {
var site = get_current_site();
var content = "";
if (site != null && site.data.bugs_url != undefined && site.data.source_url != undefined) {
content = content + "Problems with " + site.name +
"? Please file bugs or check out the source.";
}
content = content + " Powered by fedmenu.";
$(".fedmenu-content").append("
" + content + "
");
}
$.ajax({
url: o.url,
mimeType: o.mimeType,
dataType: 'script',
cache: true,
error: function(err) {
console.log('Error getting ' + o.url);
console.log(err);
},
success: function(script) {
// Save this for later...
master_data = json.children;
},
});
var selector = function(t) {
return "#fedmenu-wrapper," +
"#fedmenu-" + t + "-button," +
"#fedmenu-" + t + "-content";
};
var activate = function(t) {
$.each(master_data, content_makers[t]);
$(".fedmenu-exit", c).click(function() {deactivate(t);});
add_footer_links();
setTimeout(function() {$(selector(t), c).addClass('fedmenu-active');}, 50);
};
var deactivate = function(t) {
$(selector(t), c).removeClass('fedmenu-active');
$('.fedmenu-content', c).remove(); // destroy content.
};
var click_factory = function(t) { return function() {
if ($(this).hasClass('fedmenu-active')) {
deactivate(t);
} else {
// Deactivate any others that may be active before starting anew.
deactivate('main'); deactivate('user'); deactivate('package');
activate(t);
}
};};
$("#fedmenu-main-button", c).click(click_factory('main'));
$("#fedmenu-user-button", c).click(click_factory('user'));
$("#fedmenu-package-button", c).click(click_factory('package'));
$("#fedmenu-wrapper,.fedmenu-exit", c).click(function() {
deactivate('main');
deactivate('user');
deactivate('package');
});
$(document).keydown(function(event) {
if (event.key == 'Escape' || event.key == 'Esc'){
deactivate('main');
deactivate('user');
deactivate('package');
}
});
}); };