"use strict";
let EXPORTED_SYMBOLS = ["Addon"];
var Cu = Components.utils;
Cu.import("resource://gre/modules/Services.jsm");
let Addon = {
showPage: function(document, db, query) {
document.body.className += " gutter addon-details";
let data = this.loadData(db, query);
document.title = data.name + " :: Classic Add-ons Archive";
let template = this.template;
template = this.processTemplate(template, data);
let contfrag = document.createRange().createContextualFragment(template);
let frag = contfrag.firstElementChild;
let page = document.getElementById("page");
page.appendChild(frag);
},
loadData: function(db, query) {
let col;
if (/^\d+$/.test(query)) {
col = "addon_id";
} else {
col = "slug";
}
let data = {};
let dbQuery = db.createStatement("SELECT COUNT(*) as count FROM addons INNER JOIN versions ON addons.addon_id = versions.addon_id WHERE addons." + col + " = :query");
dbQuery.params.query = query;
dbQuery.executeStep();
data.count = dbQuery.row.count;
dbQuery.finalize();
dbQuery = db.createStatement("SELECT addons.addon_id AS addon_id, addons.name AS name, slug, is_experimental, users, reviews, rating, summary, description, homepage, dev_comments, support_email, support_url, r1, r2, r3, r4, r5, version, release_notes, is_restart_required, versions.url AS url, min, max, size, created, licenses.name AS lic_name, licenses.url AS lic_url, eulas.rowid AS eula, policies.rowid AS policy, icon FROM addons INNER JOIN versions ON addons.addon_id = versions.addon_id LEFT JOIN licenses ON licenses.license_id = versions.license_id LEFT JOIN eulas ON eulas.addon_id = addons.addon_id LEFT JOIN policies ON policies.addon_id = addons.addon_id LEFT JOIN icons ON addons.addon_id = icons.addon_id WHERE addons." + col + " = :query ORDER BY versions.created DESC, versions.version DESC LIMIT 1");
dbQuery.params.query = query;
dbQuery.executeStep();
let id = dbQuery.row.addon_id;
data.reviews = new Intl.NumberFormat("en-US").format(dbQuery.row.reviews);
data.rating = Math.round(dbQuery.row.rating);
data.users = new Intl.NumberFormat("en-US").format(dbQuery.row.users);
if (dbQuery.row.icon) {
data.icon_url = "chrome://ca-archive/skin/icons/" + dbQuery.row.icon + ".png";
} else {
data.icon_url = "chrome://ca-archive/skin/icons/" + Math.trunc(dbQuery.row.addon_id/1000) + "/" + dbQuery.row.addon_id + ".png";
}
data.name = dbQuery.row.name;
data.slug = dbQuery.row.slug;
data.amo = "https://addons.mozilla.org/addon/" + data.slug + "/";
data.wbm = "http://web.archive.org/web/*/https://addons.mozilla.org/en-US/firefox/addon/" + data.slug + "/";
data.summary = dbQuery.row.summary.replace(/(?:\r\n|\r|\n)/g, "
").replace("$", "$");
if (dbQuery.row.homepage) {
data.homepage = '
Add-on home page';
} else {
data.homepage = "";
}
if (dbQuery.row.support_url) {
data.support_url = 'Support site';
} else {
data.support_url = "";
}
let experiment = "", warning = "";
if (dbQuery.row.is_experimental) {
experiment = 'caution';
warning = 'This add-on has been preliminarily reviewed or marked as experimental by its developers.
';
}
data.experiment = experiment;
data.warning = warning;
if (dbQuery.row.support_email) {
data.support_email = 'Support E-mail';
} else {
data.support_email = "";
}
data.description = dbQuery.row.description.replace(/(?:\r\n|\r|\n)/g, "
").replace("$", "$");
if (data.description == "") {
data.description = data.summary;
}
if (dbQuery.row.dev_comments != "") {
data.dev_comments = this.devcomm.replace("%DEVCOMM%", dbQuery.row.dev_comments.replace(/(?:\r\n|\r|\n)/g, "
").replace("$", "$"));
} else {
data.dev_comments = "";
}
data.version = dbQuery.row.version;
data.release_notes = dbQuery.row.release_notes.replace(/(?:\r\n|\r|\n)/g, "
").replace("$", "$");
data.restart = "";
if (dbQuery.row.is_restart_required == false) {
data.restart = ' No Restart';
}
data.min = dbQuery.row.min;
data.max = dbQuery.row.max;
let appver;
if (Services.appinfo.name == "Pale Moon") {
appver = "27.9";
} else if (Services.appinfo.name != "SeaMonkey") {
appver = Services.appinfo.version;
}
data.downurl = "https://ca-archive.biz.tm/storage/" + Math.trunc(dbQuery.row.addon_id/1000) + "/" + dbQuery.row.addon_id + "/" + dbQuery.row.url.replace(/^\d+\/(.*)/,"$1") + "?origin=caa&action=";
if (appver && Services.vc.compare(dbQuery.row.min, appver) <= 0 && Services.vc.compare(appver, dbQuery.row.max) <= 0) {
data.compat = "add";
data.action = "Install Now";
data.downurl += "install";
} else {
data.compat = "download";
data.action = "Download";
data.downurl += "download";
}
let created = new Date(dbQuery.row.created*1000);
data.created = created.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
let nBytes = dbQuery.row.size;
for (let aMultiples = ["KiB", "MiB", "GiB"], nMultiple = 0, nApprox = nBytes / 1024;
nApprox > 1; nApprox /= 1024, nMultiple++) {
data.size = nApprox.toFixed(1) + " " + aMultiples[nMultiple];
};
if (dbQuery.row.lic_url !== null) {
let lic_url, target;
if (dbQuery.row.lic_url != "") {
lic_url = dbQuery.row.lic_url;
target = 'target="_blank"';
} else {
lic_url = "caa:addon/" + data.slug + "/license/" + data.version;
target = '';
}
data.license = 'Released under ' + dbQuery.row.lic_name + '';
} else {
data.license = "";
}
if (dbQuery.row.eula) {
data.eula = 'End-User License Agreement';
} else {
data.eula = "";
}
if (dbQuery.row.policy) {
data.policy = 'Privacy Policy';
} else {
data.policy = "";
}
let grating = dbQuery.row.r1 + dbQuery.row.r2 + dbQuery.row.r3 + dbQuery.row.r4 + dbQuery.row.r5;
if (grating > 0) {
let item = this.grating;
item = item.replace("%R1%", dbQuery.row.r1);
item = item.replace("%R2%", dbQuery.row.r2);
item = item.replace("%R3%", dbQuery.row.r3);
item = item.replace("%R4%", dbQuery.row.r4);
item = item.replace("%R5%", dbQuery.row.r5);
item = item.replace("%R1P%", Math.round(dbQuery.row.r1/grating*100));
item = item.replace("%R2P%", Math.round(dbQuery.row.r2/grating*100));
item = item.replace("%R3P%", Math.round(dbQuery.row.r3/grating*100));
item = item.replace("%R4P%", Math.round(dbQuery.row.r4/grating*100));
item = item.replace("%R5P%", Math.round(dbQuery.row.r5/grating*100));
data.grating = item;
} else {
data.grating = "";
}
dbQuery.finalize();
dbQuery = db.createStatement("SELECT tag_name FROM tags WHERE addon_id = :addon_id ORDER BY tag_name");
dbQuery.params.addon_id = id;
let tags = [];
while (dbQuery.executeStep()) {
tags.push(dbQuery.row.tag_name);
}
if (tags.length > 0) {
data.tags = '";
} else {
data.tags = "";
}
dbQuery.finalize();
dbQuery = db.createStatement("SELECT cat_name FROM categories WHERE addon_id = :addon_id ORDER BY cat_name");
dbQuery.params.addon_id = id;
let categories = [];
while (dbQuery.executeStep()) {
categories.push(dbQuery.row.cat_name);
}
if (categories.length > 0) {
let cat_names = { "alerts-updates": "Alerts & Updates", "appearance": "Appearance", "bookmarks": "Bookmarks", "download-management": "Download Management", "feeds-news-blogging": "Feeds, News & Blogging", "games-entertainment": "Games & Entertainment", "language-support": "Language Support", "photos-music-videos": "Photos, Music & Videos", "privacy-security": "Privacy & Security", "search-tools": "Search Tools", "shopping": "Shopping", "social-communication": "Social & Communication", "tabs": "Tabs", "web-development": "Web Development", "other": "Other"};
data.categories = "Related Categories
";
} else {
data.categories = "";
}
dbQuery.finalize();
dbQuery = db.createStatement("SELECT name, slug FROM authors_addons INNER JOIN authors ON authors_addons.author_id = authors.author_id WHERE addon_id = :addon_id ORDER BY name");
dbQuery.params.addon_id = id;
data.authors = 'by ';
while (dbQuery.executeStep()) {
data.authors += '' + dbQuery.row.name + ', ';
}
data.authors = data.authors.slice(0, -2);
data.authors += '
';
dbQuery.finalize();
return data;
},
processTemplate: function(template, data) {
template = template.replace("%REVIEWS%", data.reviews);
template = template.replace("%GRATING%", data.grating);
template = template.replace(/%RATING%/g, data.rating);
template = template.replace("%USERS%", data.users);
template = template.replace("%ICON%", data.icon_url);
template = template.replace(/%NAME%/g, data.name);
template = template.replace(/%SLUG%/g, data.slug);
template = template.replace(/%VERSION%/g, data.version);
template = template.replace("%RESTART%", data.restart);
template = template.replace("%AUTHORS%", data.authors);
template = template.replace("%SUMMARY%", data.summary);
template = template.replace("%EXPERIMENT%", data.experiment);
template = template.replace("%COMPAT%", data.compat);
template = template.replace("%ACTION%", data.action);
template = template.replace("%WARNING%", data.warning);
template = template.replace("%DOWNURL%", data.downurl);
template = template.replace("%PRIVACY%", data.policy);
template = template.replace("%EULA%", data.eula);
template = template.replace("%HOME%", data.homepage);
template = template.replace("%SUPPORT%", data.support_url);
template = template.replace("%EMAIL%", data.support_email);
template = template.replace("%LICENSE%", data.license);
template = template.replace("%ABOUT%", data.description);
template = template.replace(/%RELDATE%/g, data.created);
template = template.replace("%SIZE%", data.size);
template = template.replace(/%COMPATV%/g, "Firefox " + data.min + " - " + data.max);
template = template.replace("%RELNOTE%", data.release_notes);
template = template.replace("%DEVCOMM%", data.dev_comments);
template = template.replace("%CATEGORIES%", data.categories);
template = template.replace("%TAGS%", data.tags);
template = template.replace(/%COUNT%/g, data.count);
template = template.replace(/%AMO%/g, data.amo);
template = template.replace(/%WBM%/g, data.wbm);
return template;
},
template: `
`,
grating: `
- Rated 5 out of 5 stars
%R5%
- Rated 4 out of 5 stars
%R4%
- Rated 3 out of 5 stars
%R3%
- Rated 2 out of 5 stars
%R2%
- Rated 1 out of 5 stars
%R1%
`,
devcomm: `
`
};