var dlpage_ph; var dlpage_key; var fdl_filename, fdl_filesize, fdl_key, fdl_url, fdl_starttime; var dl_import=false; var dl_attr; var dl_node; var fdl_queue_var=false; var fileSize; var dlResumeInfo; var mediaCollectFn; var maxDownloadSize = Math.pow(2, 53); function dlinfo(ph,key,next) { $('.widget-block').addClass('hidden'); if (!is_mobile) { init_start(); } if (dlMethod === FlashIO) { $('.fm-dialog.download-dialog').removeClass('hidden'); $('.fm-dialog.download-dialog').css('left','-1000px'); $('.download-save-your-file').safeHTML(''); } loadingDialog.show(); dlpage_ph = ph; dlpage_key = key; if (is_mobile) { $('.mobile.dl-browser, .mobile.dl-megaapp').addClass('disabled'); } else { watchdog.query('dlsize', 2100, true); } if (dl_res) { dl_g(dl_res); dl_res = false; } else { // Fetch the file information and optionally the download URL api_req({a: 'g', p: ph, 'ad': showAd()}, {callback: tryCatch(dl_g)}); } if (is_mobile) { Soon(function() { $('.top-head div').children().not('.logo').hide(); }); } $(window).rebind('keydown.uikeyevents', function(ev) { if (ev.keyCode === 27) { closeDialog(); } }); } function dl_g(res) { 'use strict'; var isPageRefresh = false; if (Object(fdl_queue_var).lastProgress) { dlprogress.apply(this, fdl_queue_var.lastProgress); isPageRefresh = true; } if (Object(fdl_queue_var).ph) { var gid = dlmanager.getGID(fdl_queue_var); if (dlQueue.isPaused(gid)) { fm_tfspause(gid); $('.download .pause-transfer').removeClass('hidden').addClass('active') .find('span').text(l[1649]); } } loadingDialog.hide(); fdl_queue_var = null; // Hide Register Panel showRegisterSidePane(1); $('.widget-block').addClass('hidden'); if (res === ETOOMANY) { $('.download.top-bar').addClass('global-error not-available-user'); setTransferStatus(0, l[243]); } else if (typeof res === 'number' && res < 0) { if (res === -2) { $('.download.top-bar').addClass('global-error invalid-url'); setTransferStatus(0,l[20198]); } else { $('.download.top-bar').addClass('global-error na-some-reason'); setTransferStatus(0, l[243]); } } else if (res.e === ETEMPUNAVAIL) { $('.download.top-bar').addClass('global-error temporary-na'); setTransferStatus(0, l[1191]); } else if (res.d) { $('.download.top-bar').addClass('global-error na-some-reason'); setTransferStatus(0, l[243]); } else if (res.at) { $('.download .pause-transfer').rebind('click', function() { if (!$(this).hasClass('active')) { fm_tfspause('dl_' + fdl_queue_var.ph); $('.download .pause-transfer').addClass('active'); } else { $('.download .pause-transfer').removeClass('active'); fm_tfsresume('dl_' + fdl_queue_var.ph); } }); var key = dlpage_key; var fdl_file = false; if (key) { var base64key = String(key).trim(); key = base64_to_a32(base64key).slice(0, 8); if (key.length === 8) { dl_attr = res.at; fdl_filesize = res.s; fdl_file = {a: dl_attr}; crypto_procattr(fdl_file, key); } } if (fdl_file.name) { var $pageScrollBlock = $(is_mobile ? '.bottom-page.scroll-block' : '.download.top-bar') .removeClass('video video-theatre-mode resumable'); var filename = M.getSafeName(fdl_file.name) || 'unknown.bin'; var filenameLength = filename.length; var fileExtPos = filename.lastIndexOf('.') > 0 ? filename.lastIndexOf('.') : filenameLength; var fileTitle = filename.substring(0, fileExtPos); var fileExt = filename.substring(fileExtPos).toLowerCase(); var isVideo = is_video(filename); var prevBut = isVideo; var onMaxSizeKnown; dl_node = new MegaNode(Object.assign(fdl_file, { k: key, fa: res.fa, h: dlpage_ph, ph: dlpage_ph, name: filename, s: fdl_filesize, link: dlpage_ph + '!' + dlpage_key })); M.v = [dl_node]; M.d[dlpage_ph] = dl_node; dl_node.shares = {EXP: Object.assign({u: "EXP", r: 0}, dl_node)}; mediaCollectFn = function() { MediaAttribute.setAttribute(dl_node) .then(console.debug.bind(console, 'MediaAttribute')) .catch(console.warn.bind(console, 'MediaAttribute')); }; fdl_queue_var = { id: dlpage_ph, ph: dlpage_ph, key: key, s: res.s, n: filename, size: fdl_filesize, dlkey: dlpage_key, onDownloadProgress: dlprogress, onDownloadComplete: dlcomplete, onDownloadStart: dlstart, onDownloadError: M.dlerror.bind(M), onBeforeDownloadComplete: function() { } }; fileSize = bytesToSize(res.s); var checkMegaSyncDownload = function() { $('.checkdiv.megaapp-download').removeClass('checkboxOff').addClass('checkboxOn'); $('.checkdiv.megaapp-download input').prop('checked', true); $('.download.download-file span').text(l[58]); $('.download.download-file i').removeClass('save resume'); }; var uncheckMegaSyncDownload = function() { $('.checkdiv.megaapp-download').removeClass('checkboxOn').addClass('checkboxOff'); $('.checkdiv.megaapp-download input').prop('checked', false) .closest('.checkbox-bl').removeClass('checked'); var $but = $('.download.download-file span'); if (dlResumeInfo) { if (dlResumeInfo.byteLength === fdl_filesize) { $but.text(l[776]); $('.download.download-file i').removeClass('resume').addClass('save'); } else { $but.text(l[1649]); $('.download.download-file i').removeClass('save').addClass('resume'); } $('.download.info-block .checkbox-bl').css('display', 'none'); } else { $but.text(l[58]); $('.download.download-file i').removeClass('save resume'); } }; var onDownloadReady = function() { uncheckMegaSyncDownload(); dlprogress(-0xbadf, 100, fdl_filesize, fdl_filesize); $pageScrollBlock.addClass('resumable'); $('.download.state-text.resume').addClass('hidden'); $('.download.state-text.save').removeClass('hidden'); $('.download.transfer-buttons a').addClass('hidden'); $('.download.download-file span').text(l[776]); $('.download.download-file i').removeClass('resume').addClass('save'); if (is_mobile) { $('body').addClass('download-complete'); $('.mobile .dl-app-link').removeClass('hidden'); $('.mobile .download-progress span').text(l[776]); $('.mobile.download-speed, .mobile.download-percents').text(''); $('.download-progress').rebind('click', function() { if (fdl_queue_var) { dlPageStartDownload(); } return false; }); } }; $('.download.download-file span').text(l[58]); if (is_mobile) { setMobileAppInfo(); fdl_queue_var.onBeforeDownloadComplete = dlbeforecomplete(filename); $('.mobile.dl-browser, .mobile.dl-megaapp').removeClass('disabled'); $('.mobile.filename').text(str_mtrunc(filename, 40)); $('.mobile.filesize').text(bytesToSize(res.s)); $('.mobile.dl-megaapp').rebind('click', function() { // Start the download in the app mobile.downloadOverlay.redirectToApp($(this)); }); $('img.filetype-img') .attr('src', staticpath + 'images/mobile/extensions/' + fileIcon(dl_node) + '.png'); onMaxSizeKnown = function() { // If UC Browser, show an error message, remove the tap/click handler and show as greyed out if (is_uc_browser) { $('body').addClass('wrong-file'); $('.mobile.dl-browser').addClass('disabled').off('click'); $('.mobile.error-txt.file-unsupported').removeClass('hidden'); return false; } var supported = dlmanager.canSaveToDisk(dl_node); if (dl_node.s > maxDownloadSize || !supported) { $('body').addClass('wrong-file'); $('.mobile.dl-browser').addClass('disabled').off('click'); if (!supported) { $('.mobile.error-txt.file-unsupported').removeClass('hidden'); } else { $('.mobile.error-txt.file-too-large').removeClass('hidden'); } } }; } dlmanager.getMaximumDownloadSize().done(function(size) { maxDownloadSize = size; if (onMaxSizeKnown) { onIdle(onMaxSizeKnown); } var sizeOnDisk = dlmanager.getFileSizeOnDisk(dlpage_ph, filename); dlmanager.getResumeInfo(dlpage_ph, function(aResumeInfo) { dlResumeInfo = aResumeInfo; if (dlResumeInfo) { maxDownloadSize += dlResumeInfo.byteOffset; sizeOnDisk.always(function(size) { var perc = Math.floor(dlResumeInfo.byteOffset * 100 / fdl_filesize); dlResumeInfo.byteLength = size; if (isPageRefresh) { if (d) { console.log('on-page-refresh'); } } else if (size === fdl_filesize) { onIdle(onDownloadReady); } else if (size === dlResumeInfo.byteOffset) { dlprogress(-0xbadf, perc, dlResumeInfo.byteOffset, fdl_filesize); $pageScrollBlock.addClass('resumable'); $('.download.state-text.save').addClass('hidden'); $('.download.state-text.resume').removeClass('hidden'); $('.download.download-file span').text(l[1649]); $('.download.download-file i').removeClass('save').addClass('resume'); if (is_mobile) { var $progress = $('.mobile .download-progress span'); $progress.text(l[1649]).addClass('resume-bttn'); $('.mobile .dl-app-link').removeClass('hidden'); $('.download-progress').rebind('click', function() { $('.download-progress').off('click'); $progress.text(l[5740]).removeClass('resume-bttn'); dlPageStartDownload(); return false; }); } } else { dlResumeInfo = false; dlmanager.remResumeInfo(dlpage_ph); } }); } if (fdl_filesize > maxDownloadSize) { checkMegaSyncDownload(); } else if (localStorage.megaSyncDownloadUnchecked) { uncheckMegaSyncDownload(); } else if (!is_mobile) { megasync.isInstalled(function(err, is) { if (!err && is) { checkMegaSyncDownload(); } else { uncheckMegaSyncDownload(); } }); } }); }); $('.checkdiv.megaapp-download input').change(function() { if ($(this).prop('checked')) { checkMegaSyncDownload(); delete localStorage.megaSyncDownloadUnchecked; } else if (fdl_filesize > maxDownloadSize) { checkMegaSyncDownload(); dlmanager.setBrowserWarningClasses('.download.warning-block'); $(window).trigger('resize'); } else { uncheckMegaSyncDownload(); localStorage.megaSyncDownloadUnchecked = 1; } }); $('.video-share-button, .viewer-button.right.share').rebind('click', function() { $(document).fullScreen(false); $.itemExport = [dlpage_ph]; var exportLink = new mega.Share.ExportLink({ 'showExportLinkDialog': true, 'nodesToProcess': $.itemExport }); exportLink.getExportLink(); return false; }); $('.mid-button.download-file, .big-button.download-file, .mobile.dl-browser') .rebind('click', function() { $('.download.progress-bar').width('0%'); $('.open-in-folder').addClass('hidden'); if ($('.checkdiv.megaapp-download input').prop('checked')) { loadingDialog.show(); megasync.isInstalled(function(err, is) { loadingDialog.hide(); // If 'msd' (MegaSync download) flag is turned on and application is installed if (res.msd !== 0 && (!err || is)) { $('.megasync-overlay').removeClass('downloading'); megasync.download(dlpage_ph, a32_to_base64(base64_to_a32(dlkey).slice(0, 8))); dlPageStartDownload(true); } else { dlmanager.showMEGASyncOverlay(fdl_filesize > maxDownloadSize); } }); } else if (Object(previews[dlpage_ph]).full) { onDownloadReady(); M.saveAs(previews[dlpage_ph].buffer, filename); } else if (dlResumeInfo && dlResumeInfo.byteLength === fdl_filesize) { dlPageStartDownload(); } else { if (!u_type && !is_mobile) { setTimeout(showRegisterSidePane, 1000); } watchdog.query('dling') .always(function(res) { var proceed = true; if (Array.isArray(res)) { res = Array.prototype.concat.apply([], res); proceed = res.indexOf(dlmanager.getGID({ph: dlpage_ph})) < 0; } if (proceed) { dlmanager.getFileSizeOnDisk(dlpage_ph, filename) .always(function(size) { if (size === fdl_filesize) { // another tab finished the download dlResumeInfo = Object.assign({}, dlResumeInfo, {byteLength: size}); onDownloadReady(); } dlPageStartDownload(); }); } else { $('.download.state-text.resume').addClass('hidden'); $('.download.top-bar') .removeClass('download-complete resumable') .addClass('downloading'); // another tab is downloading this setTransferStatus(0, l[18]); } }); } return false; }); $('.mid-button.to-clouddrive, .big-button.to-clouddrive').rebind('click', start_import); $('.share-content-button').rebind('click', function() { copyToClipboard(getBaseUrl() + '#!' + dlpage_ph + '!' + dlpage_key, l[1642]); return false; }); var $fileinfoBlock = $('.download.file-info'); $fileinfoBlock.find('.big-txt').attr('title', filename); $fileinfoBlock.find('.big-txt .filename').text(fileTitle); $fileinfoBlock.find('.big-txt .extension').text(fileExt); $fileinfoBlock.find('.small-txt').text(fileSize); $('.download.bar-filename').text(filename).attr('title', filename); $('.bar-cell .download.bar-filesize').text(fileSize); $('.info-block .block-view-file-type, .download .bar-cell .transfer-filetype-icon') .addClass(fileIcon({ name: filename })); if (dlQueue.isPaused(dlmanager.getGID(fdl_queue_var))) { $('.download.top-bar').addClass('paused-transfer'); $('.download.eta-block .dark-numbers').text(''); $('.download.eta-block .light-txt').text(l[1651]); $('.download.speed-block .dark-numbers').safeHTML('— KB/s'); $('.download.speed-block .light-txt').text(''); } var showPreviewButton = function($infoBlock) { $infoBlock = $infoBlock || $('.download.info-block'); if (is_image(filename) || isVideo) { var $ipb = $infoBlock.find('.img-preview-button'); $ipb.removeClass('hidden') .rebind('click', function() { slideshow(dl_node); if (mediaCollectFn) { onIdle(mediaCollectFn); mediaCollectFn = null; } }); } }; if (res.fa) { var promise = Promise.resolve(); if (isStreamingEnabled() && String(res.fa).indexOf(':8*') > 0) { promise = iniVideoStreamLayout(dl_node, $pageScrollBlock); prevBut = false; } else { // load thumbnail getImage(dl_node).then(function(uri) { var $infoBlock = $('.download.info-block'); $infoBlock.addClass('thumb').find('img').attr('src', uri); showPreviewButton($infoBlock); }); } promise.then(function(ok) { if (!ok) { // not streamable return false; } // Change layout for video $pageScrollBlock.addClass('video'); $fileinfoBlock.find('.big-txt .filename').text(fileTitle); $fileinfoBlock.find('.big-txt .extension').text(fileExt); $('.mobile.filetype-img').addClass('hidden'); $(window).trigger('resize'); }).catch(function(ex) { if (ex) { console.warn(ex); showPreviewButton(); } }); } if (prevBut) { showPreviewButton(); } } else if (is_mobile) { // Load the missing file decryption key dialog for mobile parsepage(pages['mobile']); mobile.decryptionKeyOverlay.show(dlpage_ph, false, key); return false; } else { // Otherwise load the regular file decryption key dialog mKeyDialog(dlpage_ph, false, key) .fail(function() { $('.download.error-text.message').text(l[7427]).removeClass('hidden'); $('.info-block .block-view-file-type').addClass(fileIcon({name:'unknown'})); $('.download.buttons-block, .download.checkbox-bl').addClass('hidden'); $('.file-info .download.info-txt').text('Unknown'); }); } } else { $('.download.top-bar').addClass('na-some-reason'); } if (is_mobile) { $('.mobile.application-txt').safeHTML(l[8950]); if (!fdl_queue_var) { // Show file not found overlay $('#mobile-ui-notFound').removeClass('hidden'); var msg; if (!dlpage_key) { msg = l[7945] + '
' + l[7946]; } else if (res === ETOOMANY) { msg = l[243] + '
' + l[731]; } else if (res.e === ETEMPUNAVAIL) { msg = l[1191] + '
' + l[253]; } else { msg = '
' + l[243]; } $('.mobile.na-file-txt').safeHTML(msg); } else { // Show the download overlay $('#mobile-ui-main').removeClass('hidden'); } } else { // Expand top bar setTimeout(function _expand() { var $topBar = $('.download.top-bar').addClass('expanded'); (function _resizer() { // Set height to top bar if it doesn't fit min height if ($topBar.hasClass('expanded')) { var contentHeight = $topBar.find('.download.main-pad').outerHeight(true); if (contentHeight > $topBar.find('.download-content').outerHeight()) { $topBar.css({ 'height': contentHeight + $topBar.find('.download.bar-table').outerHeight() + $topBar.find('.pages-nav.content-block').height() }); } } $(window).rebind('resize.download-bar', _resizer); })(); // Expand top bar if its clicked $topBar.rebind('click', function(e) { var $target = $(e.target); if ($(this).find('.download-content').height() < 15 && $target.not('.button') && !$target.closest('.button').length && !$target.closest('.top-menu-popup').length) { _expand(); } }); // Collapse/Expand top bar events $('.top-expand-button, .top-expand-txt', $topBar).rebind('click', function() { if ($(this).hasClass('active')) { $topBar.removeClass('expanded initial').css('height', ''); return $(window).unbind('resize.download-bar'); } _expand(); }); // Collapse top bar if user scrolls over it $topBar.rebind('mousewheel.dlpage', function(ev) { var $this = $(this); if (!$this.is('.expanded.floating') || $this.is('.video-theatre-mode')) { return; } var delta = ev.wheelDelta || ev.detail || ev.originalEvent.wheelDelta || ev.originalEvent.detail * 40 || ev.originalEvent.deltaY * 40 || null; if ((delta > 120 || delta < -120) && $this.is('.activated')) { $this.removeClass('expanded initial').css('height', ''); } }); }, 100); } var pf = navigator.platform.toUpperCase(); if (page.substr(-5) == 'linux') sync_switchOS('linux'); else if (pf.indexOf('MAC')>=0) sync_switchOS('mac'); else if (pf.indexOf('LINUX')>=0) sync_switchOS('linux'); else sync_switchOS('windows'); if ($.doFireDownload) { delete $.doFireDownload; dlPageStartDownload(); } } // Show register side panel function showRegisterSidePane(close) { 'use strict'; var $pane = $('.register-side-pane.container'); if (close || !$pane.length) { $pane.removeClass('visible'); return false; } mega.ui.showRegisterDialog({ body: l[20750], $wrapper: $pane, showLogin: true, initFormEvents: true, controls: function() { $('.fm-dialog-close', $pane).rebind('click.registerSidePane', function() { $pane.removeClass('visible'); return false; }); }, showDialog: function() { $pane.addClass('visible'); }, closeDialog: function() { $pane.removeClass('visible'); }, onAccountCreated: function(gotLoggedIn, accountData) { this.closeDialog(); if (!gotLoggedIn) { security.register.cacheRegistrationData(accountData); mega.ui.sendSignupLinkDialog(accountData, true); } } }); } function dlPageStartDownload(isDlWithMegaSync) { 'use strict'; var $downloadPage = $('.download.top-bar'); // Collapse top bar if (!$downloadPage.hasClass('video-theatre-mode')) { $downloadPage.removeClass('expanded initial').css('height', ''); } $('.download .pause-transfer').removeClass('hidden active').find('span').text(l[9112]); $(window).unbind('resize.download-bar'); // Initializing... $downloadPage.addClass('downloading').removeClass('resumable'); $downloadPage.find('.download.state-text').addClass('hidden'); $downloadPage.find('.img-preview-button:visible').addClass('hidden'); $downloadPage.find('.standalone-download-message').removeClass('hidden'); $downloadPage.find('.download.eta-block .dark-numbers').text(''); $downloadPage.find('.download.eta-block .light-txt').text(l[1042] + '\u2026'); $('.download.transfer-buttons', $downloadPage).removeClass('hidden'); $('.download.warning-block').removeClass('visible'); $('.download-state-text').addClass('hidden'); if (isDlWithMegaSync) { $('.download .pause-transfer').addClass('hidden'); $('.download.speed-block .dark-numbers').css('display', 'none'); $('.download.transfer-buttons', $downloadPage).addClass('hidden'); return; } if (is_mobile) { if (!Object(fdl_queue_var).lastProgress) { $('body').addClass('downloading').find('.bar').width('1%'); } } else if (mediaCollectFn) { onIdle(mediaCollectFn); mediaCollectFn = null; } if (ASSERT(fdl_queue_var, 'Cannot start download, fdl_queue_var is not set.')) { dlmanager.isDownloading = true; if (dlResumeInfo) { fdl_queue_var.byteOffset = dlResumeInfo.byteLength; } dl_queue.push(fdl_queue_var); } $.dlhash = getSitePath(); } function getStoreLink() { switch (ua.details.os) { case 'iPad': case 'iPhone': return 'https://itunes.apple.com/app/mega/id706857885'; case 'Windows Phone': return 'zune://navigate/?phoneappID=1b70a4ef-8b9c-4058-adca-3b9ac8cc194a'; case 'Android': return 'https://play.google.com/store/apps/details?id=mega.privacy.android.app&referrer=meganzindexandroid'; } } function setMobileAppInfo() { $('.mobile.download-app').attr('href', getStoreLink()); switch (ua.details.os) { case 'iPad': case 'iPhone': $('.app-info-block').addClass('ios'); break; case 'Windows Phone': $('.app-info-block').addClass('wp'); $('.mobile.dl-browser').addClass('disabled').off('click'); break; case 'Android': $('.app-info-block').addClass('android'); break; } } function closedlpopup() { document.getElementById('download_overlay').style.display='none'; document.getElementById('download_popup').style.left = '-500px'; } function importFile() { 'use strict'; M.importFileLink(dl_import[0], dl_import[1], dl_attr, dl_import[2]); } function dlprogress(fileid, perc, bytesloaded, bytestotal,kbps, dl_queue_num) { var now = Date.now(); var $dowloadWrapper = $('.download.top-bar'); Object(fdl_queue_var).lastProgress = [fileid, perc, bytesloaded, bytestotal, kbps, dl_queue_num]; if (fileid !== -0xbadf) { $dowloadWrapper.removeClass('download-complete').addClass('downloading'); if (!kbps) { return; } } $dowloadWrapper.removeClass('error'); $('.download.speed-block', $dowloadWrapper).removeClass('hidden'); $('.download.eta-block', $dowloadWrapper).removeClass('hidden'); $('.bar-table .progress-block', $dowloadWrapper).removeClass('hidden'); $('.download.error-text', $dowloadWrapper).addClass('hidden'); $('.download.main-transfer-error', $dowloadWrapper).addClass('hidden'); $('.download.overquoata-error', $dowloadWrapper).addClass('hidden'); $('.download.state-text', $dowloadWrapper).addClass('hidden'); $('.see-our-plans, .get-more-bonuses, .create-account-button.inline', $dowloadWrapper).addClass('hidden'); if (dl_queue[dl_queue_num]) { if (!dl_queue[dl_queue_num].starttime) { dl_queue[dl_queue_num].starttime = now - 100; } dl_queue[dl_queue_num].loaded = bytesloaded; } if (!m) { $dowloadWrapper.removeClass('temporary-na'); $('.download.progress-bar', $dowloadWrapper).width(perc + '%'); $('.file-info .download.info-txt.small-txt', $dowloadWrapper) .safeHTML( '' + bytesToSize(bytesloaded) + '' + '