// // marketplacesInject.js // // Created by David Rowe on 12 Nov 2016. // Copyright 2016 High Fidelity, Inc. // // Injected into marketplace Web pages. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // (function () { // Event bridge messages. var CLARA_IO_DOWNLOAD = "CLARA.IO DOWNLOAD"; var GOTO_DIRECTORY = "GOTO_DIRECTORY"; var QUERY_CAN_WRITE_ASSETS = "QUERY_CAN_WRITE_ASSETS"; var CAN_WRITE_ASSETS = "CAN_WRITE_ASSETS"; var WARN_USER_NO_PERMISSIONS = "WARN_USER_NO_PERMISSIONS"; var canWriteAssets = false; function injectCommonCode(isDirectoryPage) { // Supporting styles from marketplaces.css. // Glyph font family, size, and spacing adjusted because HiFi-Glyphs cannot be used cross-domain. $("head").append( '' ); // Supporting styles from edit-style.css. // Font family, size, and position adjusted because Raleway-Bold cannot be used cross-domain. $("head").append( '' ); // Footer. var isInitialHiFiPage = location.href === "https://metaverse.highfidelity.com/marketplace?"; $("body").append( '
' + (!isInitialHiFiPage ? '' : '') + (isInitialHiFiPage ? '🛈 See also other marketplaces.' : '') + (!isDirectoryPage ? '' : '') + (isDirectoryPage ? '🛈 Select a marketplace to explore.' : '') + '
' ); // Footer actions. $("#back-button").on("click", function () { window.history.back(); }); $("#all-markets").on("click", function () { EventBridge.emitWebEvent(GOTO_DIRECTORY); }); } function injectDirectoryCode() { // Remove e-mail hyperlink. var letUsKnow = $("#letUsKnow"); letUsKnow.replaceWith(letUsKnow.html()); // Add button links. $('#exploreClaraMarketplace').on('click', function () { window.location = "https://clara.io/library?gameCheck=true&public=true" }); $('#exploreHifiMarketplace').on('click', function () { window.location = "http://www.highfidelity.com/marketplace" }); } function injectHiFiCode() { // Nothing to do. } function updateClaraCode() { // Have to repeatedly update Clara page because its content can change dynamically without location.href changing. // Clara library page. if (location.href.indexOf("clara.io/library") !== -1) { // Make entries navigate to "Image" view instead of default "Real Time" view. var elements = $("a.thumbnail"); for (var i = 0, length = elements.length; i < length; i++) { var value = elements[i].getAttribute("href"); if (value.slice(-6) !== "/image") { elements[i].setAttribute("href", value + "/image"); } } } // Clara item page. if (location.href.indexOf("clara.io/view/") !== -1) { // Make site navigation links retain gameCheck etc. parameters. var element = $("a[href^=\'/library\']")[0]; var parameters = "?gameCheck=true&public=true"; var href = element.getAttribute("href"); if (href.slice(-parameters.length) !== parameters) { element.setAttribute("href", href + parameters); } // Replace download options with a single, "Download to High Fidelity" option. var buttons = $("a.embed-button").parent("div"); if (buttons.length > 0) { var downloadFBX = buttons.find("a[data-extension=\'fbx\']")[0]; downloadFBX.addEventListener("click", startAutoDownload); var firstButton = buttons.children(":first-child")[0]; buttons[0].insertBefore(downloadFBX, firstButton); downloadFBX.setAttribute("class", "btn btn-primary download"); downloadFBX.innerHTML = " Download to High Fidelity"; buttons.children(":nth-child(2), .btn-group , .embed-button").each(function () { this.remove(); }); } // Automatic download to High Fidelity. var downloadTimer; function startAutoDownload(event) { if (!canWriteAssets) { console.log("Clara.io FBX file download cancelled because no permissions to write to Asset Server"); EventBridge.emitWebEvent(WARN_USER_NO_PERMISSIONS); event.stopPropagation(); } window.scrollTo(0, 0); // Scroll to top ready for history.back(). if (!downloadTimer) { downloadTimer = setInterval(autoDownload, 1000); } } function autoDownload() { if ($("div.download-body").length !== 0) { var downloadButton = $("div.download-body a.download-file"); if (downloadButton.length > 0) { clearInterval(downloadTimer); downloadTimer = null; var href = downloadButton[0].href; EventBridge.emitWebEvent(CLARA_IO_DOWNLOAD + " " + href); console.log("Clara.io FBX file download initiated for " + href); $("a.btn.cancel").click(); history.back(); // Remove history item created by clicking "download". }; } else if ($("div#view-signup_login_dialog").length === 0) { // Don't stop checking for button if user is asked to log in. clearInterval(downloadTimer); downloadTimer = null; } } } } function injectClaraCode() { // Make space for marketplaces footer in Clara pages. $("head").append( '' ); // Condense space. $("head").append( '' ); // Update code injected per page displayed. var updateClaraCodeInterval = undefined; updateClaraCode(); updateClaraCodeInterval = setInterval(function () { updateClaraCode(); }, 1000); window.addEventListener("unload", function () { clearInterval(updateClaraCodeInterval); updateClaraCodeInterval = undefined; }); EventBridge.emitWebEvent(QUERY_CAN_WRITE_ASSETS); } function onLoad() { EventBridge.scriptEventReceived.connect(function (message) { if (message.slice(0, CAN_WRITE_ASSETS.length) === CAN_WRITE_ASSETS) { canWriteAssets = message.slice(-4) === "true"; } }); var DIRECTORY = 0; var HIFI = 1; var CLARA = 2; var pageType = DIRECTORY; if (location.href.indexOf("highfidelity.com/") !== -1) { pageType = HIFI; } if (location.href.indexOf("clara.io/") !== -1) { pageType = CLARA; } injectCommonCode(pageType === DIRECTORY); switch (pageType) { case DIRECTORY: injectDirectoryCode(); break; case HIFI: injectHiFiCode(); break; case CLARA: injectClaraCode(); break; } } // Load / unload. window.addEventListener("load", onLoad); // More robust to Web site issues than using $(document).ready(). }());