AlkantarClanX12
Current Path : /home/thanudqk/128shen.com/wp-content/plugins/wp-file-manager/lib/js/commands/ |
Current File : //home/thanudqk/128shen.com/wp-content/plugins/wp-file-manager/lib/js/commands/download.js |
/** * @class elFinder command "download". * Download selected files. * Only for new api * * @author Dmitry (dio) Levashov, dio@std42.ru **/ elFinder.prototype.commands.zipdl = function() {}; elFinder.prototype.commands.download = function() { "use strict"; var self = this, fm = this.fm, czipdl = null, zipOn = false, mixed = false, dlntf = false, cpath = window.location.pathname || '/', filter = function(hashes, inExec) { var volumeid, mixedCmd; if (czipdl !== null) { if (fm.searchStatus.state > 1) { mixed = fm.searchStatus.mixed; } else if (fm.leafRoots[fm.cwd().hash]) { volumeid = fm.cwd().volumeid; jQuery.each(hashes, function(i, h) { if (h.indexOf(volumeid) !== 0) { mixed = true; return false; } }); } zipOn = (fm.isCommandEnabled('zipdl', hashes[0])); } if (mixed) { mixedCmd = czipdl? 'zipdl' : 'download'; hashes = jQuery.grep(hashes, function(h) { var f = fm.file(h), res = (! f || (! czipdl && f.mime === 'directory') || ! fm.isCommandEnabled(mixedCmd, h))? false : true; if (f && inExec && ! res) { fm.cwdHash2Elm(f.hash).trigger('unselect'); } return res; }); if (! hashes.length) { return []; } } else { if (!fm.isCommandEnabled('download', hashes[0])) { return []; } } return jQuery.grep(self.files(hashes), function(f) { var res = (! f.read || (! zipOn && f.mime == 'directory')) ? false : true; if (inExec && ! res) { fm.cwdHash2Elm(f.hash).trigger('unselect'); } return res; }); }; this.linkedCmds = ['zipdl']; this.shortcuts = [{ pattern : 'shift+enter' }]; this.getstate = function(select) { var sel = this.hashes(select), cnt = sel.length, maxReq = this.options.maxRequests || 10, mixed = false, croot = ''; if (cnt < 1) { return -1; } cnt = filter(sel).length; return (cnt && (zipOn || (cnt <= maxReq && ((!fm.UA.IE && !fm.UA.Mobile) || cnt == 1))) ? 0 : -1); }; fm.bind('contextmenu', function(e){ var fm = self.fm, helper = null, targets, file, link, getExtra = function(file) { var link = file.url || fm.url(file.hash); return { icon: 'link', node: jQuery('<a></a>') .attr({href: link, target: '_blank', title: fm.i18n('link')}) .text(file.name) .on('mousedown click touchstart touchmove touchend contextmenu', function(e){ e.stopPropagation(); }) .on('dragstart', function(e) { var dt = e.dataTransfer || e.originalEvent.dataTransfer || null; helper = null; if (dt) { var icon = function(f) { var mime = f.mime, i, tmb = fm.tmb(f); i = '<div class="elfinder-cwd-icon '+fm.mime2class(mime)+' ui-corner-all"></div>'; if (tmb) { i = jQuery(i).addClass(tmb.className).css('background-image', "url('"+tmb.url+"')").get(0).outerHTML; } return i; }; dt.effectAllowed = 'copyLink'; if (dt.setDragImage) { helper = jQuery('<div class="elfinder-drag-helper html5-native">').append(icon(file)).appendTo(jQuery(document.body)); dt.setDragImage(helper.get(0), 50, 47); } if (!fm.UA.IE) { dt.setData('elfinderfrom', window.location.href + file.phash); dt.setData('elfinderfrom:' + dt.getData('elfinderfrom'), ''); } } }) .on('dragend', function(e) { helper && helper.remove(); }) }; }; self.extra = null; if (e.data) { targets = e.data.targets || []; if (targets.length === 1 && (file = fm.file(targets[0])) && file.mime !== 'directory') { if (file.url != '1') { self.extra = getExtra(file); } else { // Get URL ondemand var node; self.extra = { icon: 'link', node: jQuery('<a></a>') .attr({href: '#', title: fm.i18n('getLink'), draggable: 'false'}) .text(file.name) .on('click touchstart', function(e){ if (e.type === 'touchstart' && e.originalEvent.touches.length > 1) { return; } var parent = node.parent(); e.stopPropagation(); e.preventDefault(); parent.removeClass('ui-state-disabled').addClass('elfinder-button-icon-spinner'); fm.request({ data : {cmd : 'url', target : file.hash}, preventDefault : true }) .always(function(data) { parent.removeClass('elfinder-button-icon-spinner'); if (data.url) { var rfile = fm.file(file.hash); rfile.url = data.url; node.replaceWith(getExtra(file).node); } else { parent.addClass('ui-state-disabled'); } }); }) }; node = self.extra.node; node.ready(function(){ requestAnimationFrame(function(){ node.parent().addClass('ui-state-disabled').css('pointer-events', 'auto'); }); }); } } } }).one('open', function() { if (fm.api >= 2.1012) { czipdl = fm.getCommand('zipdl'); } dlntf = fm.cookieEnabled && fm.api > 2.1038 && !fm.isCORS; }); this.exec = function(select) { var hashes = this.hashes(select), fm = this.fm, base = fm.options.url, files = filter(hashes, true), dfrd = jQuery.Deferred(), iframes = '', cdata = '', targets = {}, i, url, linkdl = false, getTask = function(hashes) { return function() { var dfd = jQuery.Deferred(), root = fm.file(fm.root(hashes[0])), single = (hashes.length === 1), volName = root? (root.i18 || root.name) : null, dir, dlName, phash; if (single) { if (dir = fm.file(hashes[0])) { dlName = (dir.i18 || dir.name); } } else { jQuery.each(hashes, function() { var d = fm.file(this); if (d && (!phash || phash === d.phash)) { phash = d.phash; } else { phash = null; return false; } }); if (phash && (dir = fm.file(phash))) { dlName = (dir.i18 || dir.name) + '-' + hashes.length; } } if (dlName) { volName = dlName; } volName && (volName = ' (' + volName + ')'); fm.request({ data : {cmd : 'zipdl', targets : hashes}, notify : {type : 'zipdl', cnt : 1, hideCnt : true, msg : fm.i18n('ntfzipdl') + volName}, cancel : true, eachCancel : true, preventDefault : true }).done(function(e) { var zipdl, dialog, btn = {}, dllink, form, iframe, m, uniq = 'dlw' + (+new Date()), zipdlFn = function(url) { dllink = jQuery('<a></a>') .attr('href', url) .attr('download', fm.escape(dlName)) .on('click', function() { dfd.resolve(); dialog && dialog.elfinderdialog('destroy'); }); if (linkdl) { dllink.attr('target', '_blank') .append('<span class="elfinder-button-icon elfinder-button-icon-download"></span>'+fm.escape(dlName)); btn[fm.i18n('btnCancel')] = function() { dialog.elfinderdialog('destroy'); }; dialog = self.fmDialog(dllink, { title: fm.i18n('link'), buttons: btn, width: '200px', destroyOnClose: true, close: function() { (dfd.state() !== 'resolved') && dfd.resolve(); } }); } else { click(dllink.hide().appendTo('body').get(0)); dllink.remove(); } }; if (e.error) { fm.error(e.error); dfd.resolve(); } else if (e.zipdl) { zipdl = e.zipdl; if (dlName) { m = fm.splitFileExtention(zipdl.name || ''); dlName += m[1]? ('.' + m[1]) : '.zip'; } else { dlName = zipdl.name; } if (html5dl || linkdl) { url = fm.options.url + (fm.options.url.indexOf('?') === -1 ? '?' : '&') + 'cmd=zipdl&download=1'; jQuery.each([hashes[0], zipdl.file, dlName, zipdl.mime], function(key, val) { url += '&targets%5B%5D='+encodeURIComponent(val); }); jQuery.each(fm.customData, function(key, val) { url += '&'+encodeURIComponent(key)+'='+encodeURIComponent(val); }); url += '&'+encodeURIComponent(dlName); if (fm.hasParrotHeaders()) { fm.getBinaryByUrl({url: url}, function(blob) { if (blob instanceof Blob) { url = (window.URL || window.webkitURL).createObjectURL(blob); zipdlFn(url); } else { fm.error(['errUploadTransfer', fm.i18n('kindZIP')]); } }); } else { zipdlFn(url); } } else { form = jQuery('<form action="'+fm.options.url+'" method="post" target="'+uniq+'" style="display:none"></form>') .append('<input type="hidden" name="cmd" value="zipdl"/>') .append('<input type="hidden" name="download" value="1"/>'); jQuery.each([hashes[0], zipdl.file, dlName, zipdl.mime], function(key, val) { form.append('<input type="hidden" name="targets[]" value="'+fm.escape(val)+'"/>'); }); jQuery.each(fm.customData, function(key, val) { form.append('<input type="hidden" name="'+key+'" value="'+fm.escape(val)+'"/>'); }); form.attr('target', uniq).appendTo('body'); iframe = jQuery('<iframe style="display:none" name="'+uniq+'">') .appendTo('body') .ready(function() { form.submit().remove(); dfd.resolve(); setTimeout(function() { iframe.remove(); }, 20000); // give 20 sec file to be saved }); } } }).fail(function(error) { error && fm.error(error); dfd.resolve(); }); return dfd.promise(); }; }, // use MouseEvent to click element for Safari etc click = function(a) { var clickEv; if (typeof MouseEvent === 'function') { clickEv = new MouseEvent('click'); } else { clickEv = document.createEvent('MouseEvents'); clickEv.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); } fm.pauseUnloadCheck(true); a.dispatchEvent(clickEv); }, checkCookie = function(id) { var name = 'elfdl' + id, parts; parts = document.cookie.split(name + "="); if (parts.length === 2) { ntftm && clearTimeout(ntftm); document.cookie = name + '=; path=' + cpath + '; max-age=0'; closeNotify(); } else { setTimeout(function() { checkCookie(id); }, 200); } }, closeNotify = function() { if (fm.ui.notify.children('.elfinder-notify-download').length) { fm.notify({ type : 'download', cnt : -1 }); } }, reqids = [], link, html5dl, fileCnt, clickEv, cid, ntftm, reqid, getUrlDfrd, urls; if (!files.length) { return dfrd.reject(); } fileCnt = jQuery.grep(files, function(f) { return f.mime === 'directory'? false : true; }).length; link = jQuery('<a>').hide().appendTo('body'); html5dl = (typeof link.get(0).download === 'string'); if (zipOn && (fileCnt !== files.length || fileCnt >= (this.options.minFilesZipdl || 1))) { link.remove(); linkdl = (!html5dl && fm.UA.Mobile); if (mixed) { targets = {}; jQuery.each(files, function(i, f) { var p = f.hash.split('_', 2); if (! targets[p[0]]) { targets[p[0]] = [ f.hash ]; } else { targets[p[0]].push(f.hash); } }); if (!linkdl && fm.UA.Mobile && Object.keys(targets).length > 1) { linkdl = true; } } else { targets = [ jQuery.map(files, function(f) { return f.hash; }) ]; } dfrd = fm.sequence(jQuery.map(targets, function(t) { return getTask(t); })).always( function() { fm.trigger('download', {files : files}); } ); return dfrd; } else { reqids = []; getUrlDfrd = jQuery.Deferred().done(function(urls) { for (i = 0; i < urls.length; i++) { url = urls[i]; if (dlntf && url.substr(0, fm.options.url.length) === fm.options.url) { reqid = fm.getRequestId(); reqids.push(reqid); url += '&cpath=' + cpath + '&reqid=' + reqid; ntftm = setTimeout(function() { fm.notify({ type : 'download', cnt : 1, cancel : (fm.UA.IE || fm.UA.Edge)? void(0) : function() { if (reqids.length) { jQuery.each(reqids, function() { fm.request({ data: { cmd: 'abort', id: this }, preventDefault: true }); }); } reqids = []; } }); }, fm.notifyDelay); checkCookie(reqid); } if (html5dl) { click(link.attr('href', url) .attr('download', fm.escape(files[i].name)) .get(0) ); } else { if (fm.UA.Mobile) { setTimeout(function(){ if (! window.open(url)) { fm.error('errPopup'); ntftm && cleaerTimeout(ntftm); closeNotify(); } }, 100); } else { iframes += '<iframe class="downloader" id="downloader-' + files[i].hash+'" style="display:none" src="'+url+'"></iframe>'; } } } link.remove(); jQuery(iframes) .appendTo('body') .ready(function() { setTimeout(function() { jQuery(iframes).each(function() { jQuery('#' + jQuery(this).attr('id')).remove(); }); }, 20000 + (10000 * i)); // give 20 sec + 10 sec for each file to be saved }); fm.trigger('download', {files : files}); dfrd.resolve(); }); fileCnt = files.length; urls = []; for (i = 0; i < files.length; i++) { fm.openUrl(files[i].hash, true, function(v) { v && urls.push(v); if (--fileCnt < 1) { getUrlDfrd.resolve(urls); } }); } return dfrd; } }; };