function getUrlVars() { "use strict"; var vars = {}; window.location.href.replace(/[?]+([^=&]+)=([^]*)/gi, function (m, key, value) { vars[key] = decodeURIComponent(value); }); return vars; } function make_uri(uri, options) { "use strict"; var ops = {}; $.extend(ops, getUrlVars()); if (options !== null) { $.extend(ops, options); } var str = $.map(ops, function (val, index) { return index + "=" + encodeURIComponent(val).toLowerCase(); }).join("&"); return (str === "") ? uri : uri + "?" + str; } function reload(extra) { "use strict"; window.location.search = make_uri ("", extra); } function update_url(extra) { var ops = {}; $.extend(ops, getUrlVars ()); if (extra !== null) { $.extend(ops, extra); } window.location.hash = $.map(ops, function (val, index) { return val ? (index + "=" + encodeURIComponent(val)) : null; }).join("&"); } function initSingleSelector(selector_id, property, dataSet, update_handler) { var values = {}; var result = []; var value, key; for (var i = 0; i < dataSet.length; i++) { var element = dataSet[i][property]; if (element instanceof Array) { for (key in element) if (key) { values[element[key]] = element[key]; } } else { values[element] = element; } } for (value in values) if (value) { result.push({"id": value, "text": value}); } $("#" + selector_id). val (getUrlVars()[property]). on("select2-selecting", function (e) { var options = {}; options[property] = e.val; update_url (options); update_handler (); }). on("select2-removed", function (e) { var options = {}; options[property] = ''; update_url (options); update_handler (); }). select2({data: result, allowClear: true}); } function filterData (tableData, filters) { var filteredData = []; var key, column; for (var i = 0; i < tableData.length; i++) { var row = tableData[i]; var filtered = true; for (column in filters) { if (column in row) { if (row[column] instanceof Array) { filtered = false; for (key in row[column]) if (filters[column] == row[column][key]) { filtered = true; } } else { if (filters[column] != row[column]) { filtered = false; } } } if (filtered == false) { break; } } if (filtered) { filteredData.push(row); } } return filteredData; } function populate_table (table_id, table_column_names, tableData) { var tableColumns = []; for (var i = 0; i < table_column_names.length; i++) { tableColumns.push({"mData": table_column_names[i]}); for (var j = 0; j < tableData.length; j++) { if (!(table_column_names[i] in tableData[j])) { tableData[j][table_column_names[i]] = ""; } } } if (table_id) { $("#" + table_id).dataTable({ "aLengthMenu": [ [5, 10, 25, 50, -1], [5, 10, 25, 50, "All"] ], "bDestroy": true, "iDisplayLength": -1, "bAutoWidth": false, "bPaginate": true, "pagingType": "full_numbers", "aaData": tableData, "aoColumns": tableColumns }); } } function showInfoDialog (tab, info) { $("#info-container").empty(); $("#" + tab + "-info").tmpl(info).appendTo("#info-container"); $("#info-dialog").dialog("open"); $("button").focus (); } function showInfoPage (tab, info) { $("#info-content").empty(); $("#" + tab + "-info").tmpl(info).appendTo("#info-content"); $( ".content" ).hide (); $( "#info-page" ).show (); update_url ({ tab : tab, asset : info.name}); $(".value").replaceWith (function(idx, element) { return element.replace (/https?:\/\/[^ \t\n\r]+/gi, '$&'); }); } function setupInfoHandler (tab, element_id, info) { info.name_html = "" + info.name + ""; $("#" + tab + "-table").on("click", "#" + tab + "-" + element_id, function (event) { event.preventDefault(); event.stopPropagation(); showInfoPage (tab, info); }); } var assets = { assets: [] }; var glance_images = { assets: [] }; function show_glance_images () { populate_table ("glance-images-table", ["name_html", "description", "service.disk_format", "license"], filterData (glance_images.assets, getUrlVars ())); } var heat_templates = { assets: [] }; function show_heat_templates () { populate_table ("heat-templates-table", ["name_html", "description", "release_html", "service.format"], filterData (heat_templates.assets, getUrlVars ())); } var murano_apps = { assets: [] }; function show_murano_apps () { populate_table ("murano-apps-table", ["name_html", "description", "release_html", "service.format"], filterData (murano_apps.assets, getUrlVars ())); } var tosca_templates = { assets: [] }; function show_tosca_templates () { populate_table ("tosca-templates-table", ["name_html", "description", "release_html", "service.template_format"], filterData (tosca_templates.assets, getUrlVars ())); } function initTabs () { $( "ul.nav > li > a" ).on("click", function (event) { event.preventDefault (); }); $( "ul.nav > li" ).not(":last-child").on("click", function (event) { update_url ({ tab : this.children[0].hash.substring (1), asset: "" }); }); $( "ul.nav > li:last-child").on("click", function (event) { window.open('https://wiki.openstack.org/wiki/App-Catalog#How_to_contribute', '_blank'); }); } function show_asset (tab, tableData) { var options = getUrlVars (); if ((tab == options.tab) && ("asset" in options)) { for (var i = 0; i < tableData.length; ++i) { if (tableData[i].name == options.asset) { showInfoPage (tab, tableData[i]); } } } } var recent_apps = []; function build_recently_added () { assets.assets.sort(function(a,b) { return new Date(b.last_modified) - new Date(a.last_modified); }); sorted_assets = assets.assets.slice(0,15); sorted_assets.sort( function() { return 0.5 - Math.random(); }); for (var i = 0; i < 5; i++) { var iconurl, fittedname, divclass, hreftab; if (typeof (sorted_assets[i].icon) === 'undefined') { iconurl = "static/images/openstack-icon.png"; } else { iconurl = sorted_assets[i].icon.url; } if (sorted_assets[i].name.length > 15) { fittedname = sorted_assets[i].name.slice(0,13) + "..."; } else { fittedname = sorted_assets[i].name; } if (sorted_assets[i].service.type == 'glance') { divclass = "glance"; hreftab = "#tab=glance-images&asset="; } else if (sorted_assets[i].service.type == 'heat') { divclass = "heat"; hreftab = "#tab=heat-templates&asset="; } else if ((sorted_assets[i].service.type == 'murano') || (sorted_assets[i].service.type == 'bundle')) { divclass = "murano"; hreftab = "#tab=murano-apps&asset="; }else if (sorted_assets[i].service.type == 'tosca') { divclass = "tosca"; hreftab = "#tab=tosca-templates&asset="; } $('.featured').append( $('