Skip to content

Instantly share code, notes, and snippets.

@Rhilip
Created February 3, 2021 13:37
Show Gist options
  • Save Rhilip/e1b72f5d5974998077805e5c31f1d53d to your computer and use it in GitHub Desktop.
Save Rhilip/e1b72f5d5974998077805e5c31f1d53d to your computer and use it in GitHub Desktop.
download.js from DSM 7.0 beta
/* Copyright (c) 2020 Synology Inc. All rights reserved. */
Ext.namespace("SYNO.SDS.DownloadStation.DLM");
SYNO.SDS.DownloadStation.DLM.Util = {};
Ext.apply(SYNO.SDS.DownloadStation.DLM.Util, {
timeleftCalc: function(c, b, a) {
return (c === 0 ? -1 : Math.floor((b - a) / c))
},
convertTimeLeft: function(f, b) {
var j = 0;
var h = 0;
var a = 0;
var i = 0;
var g = b ? "d" : _DT("download", "download_seed_days");
var d = b ? "h" : _DT("download", "download_seed_hours");
var c = b ? "m" : _DT("download", "download_seed_mins");
var e = b ? "s" : _DT("download", "download_seed_seconds");
if (f < 60) {
return String.format("{0} {1}", f, e)
}
if (f < 3600) {
a = Math.floor(f / 60);
i = f - 60 * a;
return String.format("{0} {1} {2} {3}", a, c, i, e)
}
if (f < 86400) {
h = Math.floor(f / 3600);
a = Math.floor((f - h * 3600) / 60);
return String.format("{0} {1} {2} {3}", h, d, a, c)
}
j = Math.floor(f / 86400);
h = Math.floor((f - j * 86400) / 3600);
a = Math.floor((f - j * 86400 - h * 3600) / 60);
return String.format("{0} {1} {2} {3} {4} {5}", j, g, h, d, a, c)
},
nameRender: function(g, e, a, d, f, b) {
var c = Ext.util.Format.htmlEncode(g);
if (!Ext.isIE) {
e.attr = 'ext:qtip="' + Ext.util.Format.htmlEncode(c) + '"'
}
return c
},
startedtimeRender: function(g, e, b, d, f, c) {
var h = (g === 0) ? "" : SYNO.SDS.DateTimeFormatter(new Date(g * 1000));
var a = Ext.util.Format.htmlEncode(h);
e.attr = 'ext:qtip="' + Ext.util.Format.htmlEncode(a) + '"';
return a
},
waitingtimeRender: function(g, e, a, c, f, b) {
var d = (0 >= g) ? "" : SYNO.SDS.DownloadStation.DLM.Util.convertTimeLeft(g, true);
e.attr = 'ext:qtip="' + Ext.util.Format.htmlEncode(d) + '"';
return d
},
destinationRender: function(g, e, a, d, f, b) {
var c = Ext.util.Format.htmlEncode(g);
e.attr = 'ext:qtip="' + Ext.util.Format.htmlEncode(c) + '"';
return c
},
createSeedTimeStore: function() {
var b = [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 16, 20, 24, 30, 36, 48, 60, 72, 96];
var a = [[0, _T("service", "service_dl_bt_seedopt_ignore")], [90, "90 " + _T("service", "service_dl_bt_seedopt_unit_mins")]];
for (var d = 0; d < b.length; d++) {
a.push([b[d] * 60, b[d] + " " + _T("service", "service_dl_bt_seedopt_unit_hours")])
}
a.push([-1, _T("service", "service_dl_bt_seedopt_forever")]);
a.push([-2, _T("common", "customize")]);
var c = new Ext.data.SimpleStore({
id: 0,
fields: ["value", "display"],
data: a
});
return c
},
sizeRenderer: function(e, c, d) {
var b = 0;
var a = [" B", " KB", " MB", " GB"];
if (!Ext.isNumber(e)) {
return ""
}
if (0 === e) {
return "0 B"
}
while (e >= 1024 && b < 3) {
b += 1;
e /= 1024
}
return Ext.util.Format.htmlEncode(Ext.util.Format.number(e, "0.00") + a[b])
},
isActiveTorrentStatus: function(b) {
var a = SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT;
if ((a.TASK_DOWNLOADING === b) || (a.TASK_PRE_SEEDING === b) || (a.TASK_SEEDING === b) || (a.TASK_HASH_CHECKING === b)) {
return true
}
return false
},
isFinishedStatus: function(b) {
var a = SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT;
if ((a.TASK_FINISHED === b) || (a.TASK_FINISHING === b) || (a.TASK_EXTRACTING === b)) {
return true
}
return false
},
isSeedingStatus: function(b) {
var a = SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT;
if ((a.TASK_PRE_SEEDING === b) || (a.TASK_SEEDING === b)) {
return true
}
return false
},
isUnzipServiceOn: function() {
if (!SYNO.SDS.DownloadStation.blUnzip && !_S("is_admin")) {
return false
}
var a = SYNO.SDS.UserSettings.getProperty("SYNO.SDS.DownloadStation.Application", "unzip_settings");
if (!a || (a.enable_unzip !== "on" && a.enable_unzip !== true)) {
return false
}
return true
},
handleNewUnzipPW: function(e) {
if (e === "") {
return true
} else {
if (e.length > SYNO.SDS.DownloadStation.PW_MAX_LEN) {
this.appWin.getMsgBox().alert(_DT("settings", "unzip_pw"), _DT("error", "unzip_pw_length"));
return false
}
}
e = e.replace(/\r/g, "");
var c = SYNO.SDS.UserSettings.getProperty("SYNO.SDS.DownloadStation.Application", "unzip_settings");
if (!c) {
return false
}
var a = c.passwordPool;
var d;
if (a === "") {
d = []
} else {
try {
d = Ext.util.JSON.decode(a)
} catch (b) {
d = []
}
}
if (d.length >= 30) {
this.appWin.getMsgBox().alert(_DT("settings", "unzip_pw"), _DT("error", "unzip_pw_limit"));
return false
}
if (d.indexOf(e) != -1) {
return true
}
d.push(e);
c.passwordPool = Ext.util.JSON.encode(d);
SYNO.SDS.UserSettings.setProperty("SYNO.SDS.DownloadStation.Application", "unzip_settings", c);
return true
},
showErrorMessages: function(c, b, d, a) {
if (b && b.code) {
c.getMsgBox().alert(c.title, SYNO.SDS.DownloadStation.Utils.getErrorString(b.code), d, a)
} else {
c.getMsgBox().alert(c.title, _DT("common", "commfail"), d, a)
}
},
getLocationDestination: function() {
return SYNO.SDS.DownloadStation.gData.dlm_default_destination
},
setLocationDestination: function(a) {
SYNO.SDS.DownloadStation.gData.dlm_default_destination = a
},
checkLocationDestinationNonEmpty: function(e, b, d, c) {
if (!Ext.isFunction(b)) {
b = Ext.emptyFn
}
if (!Ext.isFunction(d)) {
d = Ext.emptyFn
}
var a = this.getLocationDestination();
if (!Ext.isEmpty(a)) {
b.call(c, a);
return
}
e.sendWebAPI({
api: "SYNO.DownloadStation2.Settings.Location",
method: "get",
version: 1,
callback: function(i, g, h, f) {
if (!i) {
this.showErrorMessages(e, g);
return
}
if (Ext.isEmpty(g.default_destination)) {
d.call(c);
e.mainPanel.alertDestinationEmptyWithLaunchingChooser()
} else {
this.setLocationDestination(g.default_destination);
b.call(c, g.default_destination)
}
},
scope: this
})
}
});
SYNO.SDS.DLFileStationPlugin = {
addTask: function(e) {
var d = [];
var b, a, c = e.length;
for (b = 0; b < c; b++) {
a = e[b].data;
d.push(SYNO.API.EscapeStr(a.file_id))
}
SYNO.SDS.DLFileStationPlugin._getTaskDestination().then(SYNO.SDS.DLFileStationPlugin._addTaskByLocal.bind(this, d))["catch"](SYNO.SDS.DLFileStationPlugin._onAddDownloadTaskDone.bind(this, false, {
code: 406
}))
},
checkPriv: function(b, c) {
if (!SYNO.SDS.StatusNotifier.isAppHasPrivilege("SYNO.SDS.DownloadStation.Application")) {
return false
}
var d = ["torrent", "nzb", "txt"];
var a = Ext.each(c, function(e) {
var f = e.id.split(".").pop();
if (!Ext.isDefined(f)) {
return true
}
if (0 > d.indexOf(f.toLowerCase())) {
return false
}
});
return !Ext.isDefined(a)
},
_onAddDownloadTaskDone: function(g, c, f, b) {
var e = _T("fileaction", "add_to_download_station");
var d = _T("error", "error_error_system");
var a;
if (!g) {
a = c ? c.code : 100;
if (a === 401) {
d = _DT("download", "download_task_quota_reached")
} else {
if (a === 402) {
d = _DT("download", "download_task_dest_deny")
} else {
if (a === 403) {
d = _DT("download", "download_task_dest_not_exist")
} else {
if (a === 406) {
d = _DT("download", "download_task_dest_not_exist")
} else {
if (a === 408) {
d = _DT("error", "error_no_path")
}
}
}
}
}
this.showMsg(e, d)
}
},
_addTaskByLocal: function(b, a) {
SYNO.API.currentManager.requestAPI({
api: "SYNO.DownloadStation2.Task",
method: "create",
version: "2",
params: {
type: "local",
local_path: b.join(","),
destination: a,
create_list: false
},
callback: SYNO.SDS.DLFileStationPlugin._onAddDownloadTaskDone,
scope: this
})
},
_getTaskDestination: function() {
return new Promise(function(c, b) {
var a = SYNO.SDS.DownloadStation.DLM.Util.getLocationDestination();
if (!Ext.isEmpty(a)) {
return c(a)
}
SYNO.API.currentManager.requestAPI({
api: "SYNO.DownloadStation2.Settings.Location",
method: "get",
version: 1,
callback: function(g, e, f, d) {
if (!g || Ext.isEmpty(e.default_destination)) {
return b()
}
return c(e.default_destination)
}
})
}
)
}
};
Ext.namespace("SYNO.SDS.DownloadStation.FileChooser");
Ext.define("SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI", {
extend: "Ext.tree.TreeNodeUI",
statics: {
STATE: 3,
CHECKSTATE: 2,
UNCHECKSTATE: 1,
GRAYSTATE: 0
},
values: [null, false, true],
checkedCls: ["x-checkbox-grayed", null, "x-checkbox-checked"],
checkboxCls: "x-checkbox",
expanded: false,
err: -1,
textField: null,
showTextFieldAlways: false,
initEvents: function() {
SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.superclass.initEvents.apply(this, arguments);
if (this.checkbox) {
Ext.EventManager.on(this.checkbox, "click", this.toggleCheck, this)
}
},
destroy: function() {
if (this.checkbox) {
Ext.EventManager.un(this.checkbox, "click", this.toggleCheck, this)
}
SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.superclass.destroy.apply(this, arguments)
},
getCheckIndex: function(b) {
for (var a = 0; a < this.values.length; a++) {
if (b.getUI() && b.getUI().checkbox && b.getUI().checkbox.checked === this.values[a]) {
return a
}
}
return this.err
},
getTextValue: function(a) {
return a.getUI().textField.value
},
setTextValue: function(b, a) {
b.getUI().textField.value = a
},
clearCheck: function() {
if (true === this.node.disabled) {
return
}
this.onCheckChange(SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.UNCHECKSTATE)
},
onCheckChange: function(a) {
this.checkbox.checked = this.values[a];
this.checkbox.className = this.checkedCls[a];
if (this.node.firstChild) {
this.updateChild(this.node.firstChild, a)
}
if (this.node.parentNode != this.root) {
this.updateParent(this.node.parentNode, a)
}
var b = this.checkbox.checked;
this.node.attributes.checked = b;
this.fireEvent("checkchange", this.node, b)
},
toggleCheck: function() {
if (true === this.node.disabled) {
return
}
var a = this.getCheckIndex(this.node);
a = (a === SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.UNCHECKSTATE) ? SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.CHECKSTATE : SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.UNCHECKSTATE;
this.onCheckChange(a)
},
updateChild: Ext.emptyFn,
updateParent: Ext.emptyFn,
checkchildstate: function(b) {
var a = b.firstChild;
if (!a) {
return this.err
}
while (a) {
if (SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.UNCHECKSTATE !== this.getCheckIndex(a)) {
return SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.GRAYSTATE
}
a = a.nextSibling
}
return SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.UNCHECKSTATE
},
renderElements: function(e, i, h, j) {
this.indentMarkup = e.parentNode ? e.parentNode.ui.getChildIndent() : "";
var f = (undefined === i.inputType) ? "text" : i.inputType;
var b, c = i.href ? i.href : Ext.isGecko ? "" : "#", d = ['<li class="x-tree-node">', '<div ext:tree-node-id="', Ext.util.Format.htmlEncode(e.id), '" class="x-tree-node-el x-tree-node-leaf x-unselectable ', i.cls, '" unselectable="on">', '<span class="x-tree-node-indent">', this.indentMarkup, "</span>", '<img alt="" src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow" />', '<img alt="" src="', i.icon || this.emptyIcon, '" class="x-tree-node-icon', (i.icon ? " x-tree-node-inline-icon" : ""), (i.iconCls ? " " + i.iconCls : ""), '" unselectable="on" />', '<span><img alt="" src="' + this.emptyIcon + '" style="margin:0 2px 0 2px;" class="x-checkbox" /></span>', '<a hidefocus="on" class="x-tree-node-anchor" href="', c, '" tabIndex="1" ', i.hrefTarget ? ' target="' + i.hrefTarget + '"' : "", '><span unselectable="on">', e.text, "</span></a>", '<input style="width:140px;" class="x-form-text x-form-field" type=' + f + "></input>", "</div>", '<ul class="x-tree-node-ct" style="display:none;"></ul>', "</li>"].join("");
if (j !== true && e.nextSibling && (b = e.nextSibling.ui.getEl())) {
this.wrap = Ext.DomHelper.insertHtml("beforeBegin", b, d)
} else {
this.wrap = Ext.DomHelper.insertHtml("beforeEnd", h, d)
}
this.elNode = this.wrap.childNodes[0];
this.ctNode = this.wrap.childNodes[1];
var g = this.elNode.childNodes;
this.indentNode = g[0];
this.ecNode = g[1];
this.iconNode = g[2];
this.checkbox = g[3];
if (i.checked === "checked") {
this.checkbox.checked = this.values[SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.CHECKSTATE];
this.checkbox.className = this.checkedCls[SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.CHECKSTATE]
} else {
if (i.checked === "gray") {
this.checkbox.checked = this.values[SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.GRAYSTATE];
this.checkbox.className = this.checkedCls[SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.GRAYSTATE]
} else {
if (i.checked === "unchecked") {
this.checkbox.checked = this.values[SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.UNCHECKSTATE];
this.checkbox.className = this.checkedCls[SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI.UNCHECKSTATE]
} else {
Ext.fly(this.checkbox).hide()
}
}
}
this.anchor = g[4];
this.textNode = g[4].firstChild;
this.textField = g[5];
if (true !== i.showTextField) {
Ext.fly(this.textField).hide()
}
if (i.textValue) {
this.textField.value = i.textValue
}
this.showTextFieldAlways = i.showTextFieldAlways
},
onClick: function(c) {
if (this.dropping) {
c.stopEvent();
return
}
if (this.fireEvent("beforeclick", this.node, c) !== false) {
var b = c.getTarget("a");
if (!this.disabled && this.node.attributes.href && b) {
this.fireEvent("click", this.node, c);
return
} else {
if (b && c.ctrlKey) {
c.stopEvent()
}
}
c.preventDefault();
if (this.disabled) {
return
}
if (this.node.attributes.singleClickExpand && !this.animating && this.node.isExpandable()) {
this.node.toggle()
}
this.fireEvent("click", this.node, c);
if (true === this.node.attributes.showTextField) {
this.textField.focus()
}
} else {
c.stopEvent()
}
},
onDisableChange: function(a, b) {
this.disabled = b;
if (this.checkbox) {
this.checkbox.disabled = b
}
if (b) {
this.addClass("x-tree-node-disabled")
} else {
this.removeClass("x-tree-node-disabled")
}
if (this.textField) {
if (this.showTextFieldAlways) {
this.textField.disabled = false
} else {
this.textField.disabled = b
}
}
}
});
Ext.define("SYNO.SDS.DownloadStation.FileChooser.Chooser", {
extend: "SYNO.SDS.Utils.FileChooser.Chooser",
initTreeLoader: function(b) {
var a = this.callParent([b]);
a.createNode = function(c, d) {
c = SYNO.SDS.Utils.FileChooser.Utils.ParseTreeNode(c, d);
if (!c.spath) {
c.spath = c.path
}
if ((!b.enumGluster && c.is_gluster) || (!b.enumSnapshot && c.is_snapshot) || (!b.enumC2Share && c.is_c2share) || (!b.enumColdStorage && c.is_cold_storage) || (Ext.isFunction(b.treeFilter) && false === b.treeFilter(this, c))) {
c.cls = (c.cls || "") + (" node_display_none");
c.hideNode = true
}
if (Ext.isDefined(c.children) && Ext.isArray(c.children.files) && c.children.files.length > 0) {
c.expanded = true
}
if ("chooseDir" === b.usage.type && b.usage.multiselect) {
c.uiProvider = SYNO.SDS.DownloadStation.FileChooser.CustTreeNodeUI;
c.checked = b.checkRender ? b.checkRender.apply(b.callbackScope || this, [c]) : "unchecked"
}
return SYNO.API.TreeLoader.prototype.createNode.call(this, c)
}
;
return a
},
onTreeBeforeSelect: function(c, a, b) {
if ("chooseDir" === this.usage.type && this.usage.multiselect) {
return false
}
return this.callParent([c, a, b])
},
applyHandlerWhenChoosingDir: function(b, c) {
if (this.usage.multiselect) {
b = [];
var a = function() {
if ("checked" === this.attributes.checked || true === this.attributes.checked) {
b.push({
path: this.attributes.spath,
fullpath: this.attributes.path
})
}
};
this.tree.root.cascade(a);
this.fireEvent("choose", this, b, c)
} else {
this.callParent([b, c])
}
}
});
Ext.ns("SYNO.SDS.DownloadStation");
function _DT(b, a) {
return _TT("SYNO.SDS.DownloadStation.Application", b, a)
}
SYNO.SDS.DownloadStation.PW_MAX_LEN = 1024;
SYNO.SDS.DownloadStation.Utils = {};
Ext.apply(SYNO.SDS.DownloadStation.Utils, {
TASK_STATUS_INT: {
TASK_WAITING: 1,
TASK_DOWNLOADING: 2,
TASK_PAUSED: 3,
TASK_FINISHING: 4,
TASK_FINISHED: 5,
TASK_HASH_CHECKING: 6,
TASK_PRE_SEEDING: 7,
TASK_SEEDING: 8,
TASK_FILEHOSTING_WAITING: 9,
TASK_EXTRACTING: 10,
TASK_PREPROCESSING: 11,
TASK_PREPROCESSPASS: 12,
TASK_DOWNLOADED: 13,
TASK_POSTPROCESSING: 14,
TASK_CAPTCHA_NEEDED: 15,
TASK_ERROR: 101,
TASK_ERROR_BROKEN_LINK: 102,
TASK_ERROR_DEST_NO_EXIST: 103,
TASK_ERROR_DEST_DENY: 104,
TASK_ERROR_DISK_FULL: 105,
TASK_ERROR_QUOTA_REACHED: 106,
TASK_ERROR_TIMEOUT: 107,
TASK_ERROR_EXCEED_MAX_FS_SIZE: 108,
TASK_ERROR_EXCEED_MAX_TEMP_FS_SIZE: 109,
TASK_ERROR_EXCEED_MAX_DEST_FS_SIZE: 110,
TASK_ERROR_NAME_TOO_LONG_ENCRYPTION: 111,
TASK_ERROR_NAME_TOO_LONG: 112,
TASK_ERROR_TORRENT_DUPLICATE: 113,
TASK_ERROR_FILE_NO_EXIST: 114,
TASK_ERROR_REQUIRED_PREMIUM: 115,
TASK_ERROR_NOT_SUPPORT_TYPE: 116,
TASK_ERROR_FTP_ENCRYPTION_NOT_SUPPORT_TYPE: 117,
TASK_ERROR_EXTRACT_FAIL: 118,
TASK_ERROR_EXTRACT_WRONG_PASSWORD: 119,
TASK_ERROR_EXTRACT_INVALID_ARCHIVE: 120,
TASK_ERROR_EXTRACT_QUOTA_REACHED: 121,
TASK_ERROR_EXTRACT_DISK_FULL: 122,
TASK_ERROR_TORRENT_INVALID: 123,
TASK_ERROR_REQUIRED_ACCOUNT: 124,
TASK_ERROR_TRY_IT_LATER: 125,
TASK_ERROR_ENCRYPTION: 126,
TASK_ERROR_MISSING_PYTHON: 127,
TASK_ERROR_PRIVATE_VIDEO: 128,
TASK_ERROR_EXTRACT_FOLDER_NOT_EXIST: 129,
TASK_ERROR_NZB_MISSING_ARTICLE: 130,
TASK_ERROR_ED2K_LINK_DUPLICATE: 131,
TASK_ERROR_DEST_FILE_DUPLICATE: 132,
TASK_ERROR_PARCHIVE_REPAIR_FAILED: 133,
TASK_ERROR_INVALID_ACCOUNT_PASSWORD: 134
},
getStatusString: function(a) {
switch (a) {
case 1:
case 11:
case 12:
return _DT("download", "download_task_waiting");
case 2:
return _DT("download", "download_task_downloading");
case 3:
return _DT("download", "download_task_paused");
case 4:
case 13:
case 14:
return _DT("download", "download_task_finishing");
case 5:
return _DT("download", "download_task_finished");
case 6:
return _DT("download", "download_task_hash_checking");
case 7:
return _DT("download", "download_task_preseeding");
case 8:
return _DT("download", "download_task_seeding");
case 9:
return _DT("download", "download_task_filehosting_waiting");
case 10:
return _DT("download", "download_task_extracting");
case 15:
return _DT("download", "captcha_needed");
case 102:
return _DT("download", "download_task_broken_link");
case 103:
return _DT("download", "download_task_dest_not_exist");
case 104:
return _DT("download", "download_task_dest_deny");
case 105:
return _DT("download", "download_task_disk_full");
case 106:
return _DT("download", "download_task_quota_reached");
case 107:
return _DT("download", "download_task_timeout");
case 108:
return _DT("download", "download_error_exceed_fs_max_size_short");
case 109:
return _DT("download", "download_error_exceed_temp_fs_max_size_short");
case 110:
return _DT("download", "download_error_exceed_dest_fs_max_size_short");
case 111:
return _DT("error", "error_encryption_long_path");
case 112:
return _DT("error", "error_long_path");
case 113:
return _DT("error", "error_duplicate_torrent");
case 114:
return _DT("download", "download_err_no_file_to_end");
case 115:
return _DT("dlqueue", "premium_account_require_status");
case 116:
return _DT("download", "not_support_type");
case 117:
return _DT("download", "download_ftp_encrption_not_support_type");
case 118:
return _DT("download", "download_error_extract_fail");
case 119:
return _DT("download", "download_error_extract_fail") + "(" + _DT("download", "wrong_password") + ")";
case 120:
return _DT("download", "download_error_extract_fail") + "(" + _DT("download", "invalid_archive") + ")";
case 121:
return _DT("download", "download_error_extract_fail") + "(" + _DT("download", "download_task_quota_reached") + ")";
case 122:
return _DT("download", "download_error_extract_fail") + "(" + _DT("download", "download_task_disk_full") + ")";
case 123:
return _DT("error", "error_invalid_torrent");
case 124:
return _DT("download", "account_require_status");
case 125:
return _DT("download", "download_error_try_it_later");
case 126:
return _DT("dlqueue", "error_task_encryption");
case 127:
return _DT("dlqueue", "error_missing_python");
case 128:
return _DT("dlqueue", "error_private_video");
case 129:
return _DT("download", "download_error_extract_fail") + "(" + _DT("download", "download_error_extract_folder_not_exist") + ")";
case 130:
return _DT("download", "download_err_nzb_missing_article");
case 133:
return _DT("download", "download_error_parchive_repair_failed");
case 134:
return _DT("download", "error_invalid_account_password");
default:
return _DT("download", "download_task_error")
}
},
getStatusCss: function(a) {
switch (a) {
case 1:
case 11:
case 12:
case 15:
return "syno-dl-task-waiting";
case 2:
return "syno-dl-task-downloading";
case 3:
return "syno-dl-task-paused";
case 4:
case 13:
case 14:
return "syno-dl-task-finishing";
case 5:
return "syno-dl-task-finished";
case 6:
return "syno-dl-task-hash-checking";
case 7:
return "syno-dl-task-preseeding";
case 8:
return "syno-dl-task-seeding";
case 10:
return "syno-dl-task-extracting";
case 101:
case 102:
case 103:
case 104:
case 105:
case 106:
case 107:
case 108:
case 109:
case 110:
case 111:
case 112:
case 113:
case 114:
case 115:
case 116:
case 117:
case 118:
case 119:
case 120:
case 121:
case 122:
case 123:
case 124:
case 125:
case 126:
case 127:
case 128:
case 129:
case 130:
case 131:
case 132:
case 133:
case 134:
return "syno-dl-task-error";
default:
return ""
}
},
getTaskStatusStr: function(b) {
var c;
var a = SYNO.SDS.DownloadStation.Utils;
if (a.TASK_STATUS_INT.TASK_EXTRACTING === b.status) {
c = a.getStatusString(b.status) + "(" + b.status_extra.extract_progress + " %)"
} else {
c = a.getStatusString(b.status)
}
return c
},
isTaskErrorStatus: function(a) {
return a >= SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_ERROR
},
canonizeURLPrefix: function(b) {
var c = Ext.util.Format.lowercase(b);
var a = "";
if (c.substr(0, 7) == "http://") {
a = "http://" + b.substr(7)
} else {
if (c.substr(0, 8) == "https://") {
a = "https://" + b.substr(8)
} else {
if (c.substr(0, 6) == "ftp://") {
a = "ftp://" + b.substr(6)
} else {
if (c.substr(0, 7) == "ftps://") {
a = "ftps://" + b.substr(7)
} else {
if (c.substr(0, 7) == "sftp://") {
a = "sftp://" + b.substr(7)
} else {
if (c.substr(0, 10) == "thunder://") {
a = "thunder://" + b.substr(10)
} else {
if (c.substr(0, 11) == "flashget://") {
a = "flashget://" + b.substr(11)
} else {
if (c.substr(0, 7) == "qqdl://") {
a = "qqdl://" + b.substr(7)
} else {
if ("magnet:?" === c.substr(0, 8)) {
a = "magnet:?" + b.substr(8)
}
}
}
}
}
}
}
}
}
return a
},
isMagnetLink: function(b) {
var a = false;
var c = Ext.util.Format.lowercase(b);
if ("magnet:?" === c.substr(0, 8)) {
a = true
}
return a
},
showhideTab: function(b, a, c) {
if (b) {
if (!a) {
b.hideTabStripItem(c);
b.setActiveTab("download")
} else {
b.unhideTabStripItem(c)
}
}
},
addUIComponents: function(d, a, c) {
if (d.uicomponents) {
d.uicomponents[a] = c
} else {
var b = {};
b[a] = c;
b.uicomponents = b;
d.uicomponents = b
}
},
fillArray: function(d, b) {
if (b === 0) {
return []
}
var c = [d];
while (c.length * 2 <= b) {
c = c.concat(c)
}
if (c.length < b) {
c = c.concat(c.slice(0, b - c.length))
}
return c
},
parseJsonData: function(d, b) {
var a;
b = Ext.isEmpty(b) ? false : b;
try {
if (b) {
d = Ext.util.Format.stripTags(d)
}
a = Ext.util.JSON.decode(d)
} catch (c) {
SYNO.Debug("Fail to parse json " + c)
}
return a
},
chooseDestHandler: function(a) {
var b = {
title: _DT("download", "download_list_dest_folder"),
folderToolbar: true,
cls: "syno-dl-win",
usage: {
type: "chooseDir"
},
treeFilter: this.folderRightFilter
};
Ext.apply(b, a);
if (!b.destinationField && (!b.callback || !b.callbackScope)) {
SYNO.Debug("Missing destination field or callback information");
return
}
var c = new SYNO.SDS.DownloadStation.FileChooser.Chooser(b);
if (b.callback && b.callbackScope) {
c.mon(c, "choose", b.callback, b.callbackScope)
} else {
if (b.destinationField) {
c.mon(c, "choose", function(f, e, d) {
var g = e.path.substr(1);
f.destinationField.setValue(g);
f.close()
}, this)
}
}
c.open();
return c
},
folderRightFilter: function(b, a) {
if ((true === _S("is_admin")) || "true" === _S("domainUser")) {
return true
}
if (-1 == a.spath.indexOf("/", 1)) {
if ("RW" === a.right) {
return true
} else {
return false
}
}
if (a.aclRight & SYNO.SDS.Utils.FileChooser.Utils.Mode_Append && a.aclRight & SYNO.SDS.Utils.FileChooser.Utils.Mode_Exec && a.aclRight & SYNO.SDS.Utils.FileChooser.Utils.Mode_Read && a.aclRight & SYNO.SDS.Utils.FileChooser.Utils.Mode_Write) {
return true
} else {
return false
}
},
getLocalizedString: function(b) {
var a = "SYNO.SDS.DownloadStation.Application";
return (Ext.isDefined(SYNO.SDS.UIString) && Ext.isDefined(SYNO.SDS.UIString.GetLocalizedString)) ? SYNO.SDS.UIString.GetLocalizedString(b, a) : SYNO.SDS.Utils.GetLocalizedString(b, a)
},
checkStateValue: function(b, k) {
if (Ext.isEmpty(b)) {
return false
}
var j = {};
var m = [];
var a = [];
Ext.each(k.columns, function(i) {
if (Ext.isDefined(i.id)) {
m.push(i.id)
}
if (Ext.isDefined(i.dataIndex)) {
a.push(i.dataIndex)
}
});
if (Ext.isDefined(b.sort) && Ext.isDefined(b.sort.field) && -1 != a.indexOf(b.sort.field) && Ext.isDefined(b.sort.direction) && ("DESC" === b.sort.direction || "ASC" === b.sort.direction)) {
j.sort = {
field: b.sort.field,
direction: b.sort.direction
}
}
j.columns = [];
var l = b.columns;
for (var g = 0; g < l.length; g++) {
var e = {};
if (!Ext.isDefined(l[g])) {
continue
}
var d = l[g].id;
if (!Ext.isDefined(d)) {
continue
}
var h = m.indexOf(d);
if (-1 == h) {
continue
}
m.splice(h, 1);
e.id = d;
var f = l[g].width;
if (Ext.isDefined(f) && Ext.isNumber(f) && 0 < f) {
e.width = f
}
var c = l[g].hidden;
if (Ext.isDefined(c) && true === c) {
e.hidden = c
}
j.columns.push(e)
}
if (j.columns.length != k.columns.length) {
return false
}
return j
},
fileSize: function(a) {
if (a < 1024) {
return a + " bytes"
} else {
if (a < 1048576) {
return Math.round((a * 100) / 1024) / 100 + " KB"
} else {
if (a < 1073741824) {
return Math.round((a * 100) / 1048576) / 100 + " MB"
} else {
if (a < 1099511627776) {
return Math.round((a * 100) / 1073741824) / 100 + " GB"
} else {
return Math.round((a * 100) / 1099511627776) / 100 + " TB"
}
}
}
}
},
ERROR_CODE: {
SYNODL_ERR_FILE_UPLOAD_FAILED: 400,
SYNODL_ERR_REACH_LIMIT: 401,
SYNODL_ERR_TASK_DEST_DENY: 402,
SYNODL_ERR_TASK_DEST_NOT_EXISTS: 403,
SYNODL_ERR_TASK_NOT_FOUND: 404,
SYNODL_ERR_ACTION_INVALID: 405,
SYNODL_ERR_NO_DEFAULT_DEST: 406,
SYNODL_ERR_SET_TASK_DEST_FAILED: 407,
SYNODL_ERR_FILE_NOT_EXISTS: 408,
SYNODL_ERR_DEMO_NOT_ALLOW: 500,
SYNODL_ERR_REQUEST_PARAMETER_INVALID: 501,
SYNODL_ERR_JSON_PARSE_FAILED: 502,
SYNODL_ERR_FORK_FAILED: 503,
SYNODL_ERR_GET_KV_FAILED: 504,
SYNODL_ERR_SET_KV_FAILED: 505,
SYNODL_ERR_DLINFO_GET_FAILED: 506,
SYNODL_ERR_DLINFO_SET_FAILED: 507,
SYNODL_ERR_ALLOC_HASH_FAILED: 508,
SYNODL_ERR_GET_SECTION_FAILED: 509,
SYNODL_ERR_REMOVE_SECTION_FAILED: 510,
SYNODL_ERR_CURL_INIT_FAILED: 511,
SYNODL_ERR_CONNECT_SERVER_FAILED: 512,
SYNODL_ERR_MAIL_SERVICE_NOT_ENABLED: 513,
SYNODL_ERR_HUP_SCHEDULED_FAILED: 514,
SYNODL_ERR_USER2_SCHEDULED_FAILED: 515,
SYNODL_ERR_CMD_FAILED: 516,
SYNODL_ERR_PORT_CONFLICT: 517,
SYNODL_ERR_FIREWALL_HUP_FAILED: 518,
SYNODL_ERR_NETWORK: 519,
SYNODL_ERR_SYSTEM: 520,
SYNODL_ERR_ACTION_FAILED: 521,
SYNODL_ERR_SHARE_NOT_FOUND: 522,
SYNODL_ERR_QUOTA_REACH: 523,
SYNODL_ERR_NO_PRIVILEGE: 524,
SYNODL_ERR_DATABASE_OPERATION_FAILED: 525,
SYNODL_ERR_TASK_REACH_LIMIT_ALL: 526,
SYNODL_ERR_TASK_REACH_LIMIT_USER: 527,
SYNODL_ERR_EMPTY_PASSWORD: 528,
SYNODL_ERR_USER_NOT_FOUND: 529,
SYNODL_ERR_FILE_LOCK_FAILED: 530,
SYNODL_ERR_PATH_NOT_EXISTS: 531,
SYNODL_ERR_MKDIR_FAILED: 532,
SYNODL_ERR_MKDIR_EXISTS: 533,
SYNODL_ERR_MKDIR_NO_PERMISSION: 534,
SYNODL_ERR_MKDIR_PATH_NOT_EXIST: 535,
SYNODL_ERR_CREATE_DSMTASK_FAILED: 536,
SYNODL_ERR_UNLINK_FAILED: 537,
SYNODL_ERR_KILL_FAILED: 538,
SYNODL_ERR_KILL_TIMEOUT: 539,
SYNODL_ERR_BAD_IP: 540,
SYNODL_ERR_EMPTY_USERNAME: 541,
SYNODL_ERR_EMPTY_PATH: 542,
SYNODL_ERR_VOLUME_CRASHED: 543,
SYNODL_ERR_TASK_NOT_EXISTS: 544,
SYNODL_ERR_EMULE_NOT_IN_SCHEDULE: 545,
SYNODL_ERR_CHOWN_FAILED: 546,
SYNODL_ERR_CHOWN_NO_PERMISSION: 547,
SYNODL_ERR_CHOWN_PATH_NOT_EXIST: 548,
SYNODL_ERR_XUNLEI_OP_FAILED: 1000,
SYNODL_ERR_PGSQL_NOT_RUNNING: 1001,
SYNODL_ERR_STOP_SERVICE_FAILED: 1002,
SYNODL_ERR_START_SERVICE_FAILED: 1003,
SYNODL_ERR_SET_VOLUME_FAILED: 1004,
SYNODL_ERR_MOVE_DATA_FAILED: 1005,
SYNODL_ERR_NO_ENOUGH_SPACE: 1006,
SYNODL_ERR_GET_MEM_FAILED: 1200,
SYNODL_ERR_TMPDIR_NOT_EXISTS: 1201,
SYNODL_ERR_USER_REMOVED: 1202,
SYNODL_ERR_TASK_DEST_INVALID_PATH: 1203,
SYNODL_ERR_TASK_DEST_ACCESS_DENIED: 1204,
SYNODL_ERR_WATCH_FOLDER_INVALID_PATH: 1205,
SYNODL_ERR_WATCH_FOLDER_ACCESS_DENIED: 1206,
SYNODL_ERR_WATCH_FOLDER_CONFLICT: 1207,
SYNODL_ERR_SET_WATCH_FOLDER_FAILED: 1208,
SYNODL_ERR_SET_PORT_FAILED: 1209,
SYNODL_ERR_GET_ORDER_FAILED: 1210,
SYNODL_ERR_MKDIR_USERPLUGIN_FAILED: 1400,
SYNODL_ERR_PLUGIN_EXISTS: 1401,
SYNODL_ERR_PLUGIN_INVALID: 1402,
SYNODL_ERR_UPDATE_BTSEARCH_FAILED: 1403,
SYNODL_ERR_BTSERACH_LOGIN_FAILED: 1404,
SYNODL_ERR_UPDATE_BTSEARCH_SEVER_ERROR: 1405,
SYNODL_ERR_GET_DLVERSION_FAILED: 1406,
SYNODL_ERR_PERFORM_SEARCH_FAILED: 1407,
SYNODL_ERR_BTSERACH_ID_NOT_FOUND: 1408,
SYNODL_ERR_GET_HOSTING_ACCOUNT_FAILED: 1600,
SYNODL_ERR_SET_HOSTING_ACCOUNT_FAILED: 1601,
SYNODL_ERR_SET_HOSTING_ENABLED_FAILED: 1602,
SYNODL_ERR_REMOVE_HOSTING_ACCOUNT_FAILED: 1603,
SYNODL_ERR_VERIFY_ACCOUNT_FAILED: 1604,
SYNODL_ERR_HOSTING_NOT_EXISTS: 1605,
SYNODL_ERR_HOSTING_LOGIN_FAILED: 1606,
SYNODL_ERR_HOSTING_EXISTS: 1607,
SYNODL_ERR_HOSTING_INVALID: 1608,
SYNODL_ERR_UPDATE_HOSTING_SEVER_ERROR: 1609,
SYNODL_ERR_UPDATE_HOSTING_FAILED: 1610,
SYNODL_ERR_METHOD_NOT_SUPPORTED: 1611,
SYNODL_ERR_UNKNOWN_HOST_TYPE: 1612,
SYNODL_ERR_EMPTY_HOSTING_NAME: 1613,
SYNODL_ERR_PYLOAD_REQUEST_FAILED: 1614,
SYNODL_ERR_EMULE_NOT_RUNNING: 1800,
SYNODL_ERR_SHARE_DIR_GET_FAILED: 1801,
SYNODL_ERR_SHARE_DIR_SET_FAILED: 1802,
SYNODL_ERR_EMULE_INIT_FAILED: 1803,
SYNODL_ERR_INCOMING_DIR_GET_FAILED: 1804,
SYNODL_ERR_EMULE_NOT_ENABLED: 1805,
SYNODL_ERR_SET_EMULE_PORT_FAILED: 1806,
SYNODL_ERR_WRONG_URL: 1900,
SYNODL_ERR_BAD_URLS_FOUND: 1901,
SYNODL_ERR_ADD_LINK_ERROR_TITLE: 1902,
SYNODL_ERR_WRONG_FILE_FORMAT: 1903,
SYNODL_ERR_READ_NZB_FAILED: 1904,
SYNODL_ERR_READ_TORRENT_FAILED: 1905,
SYNODL_ERR_ADD_ED2K: 1906,
SYNODL_ERR_SERVER_ERROR: 1907,
SYNODL_ERR_DL_NOT_ENABLED: 1908,
SYNODL_ERR_GET_TMP_FOLDER_FAILED: 1909,
SYNODL_ERR_LIST_NOT_FOUND: 1910,
SYNODL_ERR_RPC_FAILED: 1911,
SYNODL_ERR_SET_UNZIP_PW_FAILED: 1912,
SYNODL_ERR_BT_TASK_INACTIVE: 1913,
SYNODL_ERR_EXCEED_FS_MAX_SIZE: 1914,
SYNODL_ERR_EMULE_DUP_LINK: 1915,
SYNODL_ERR_EMULE_FILE_EXIST: 1916,
SYNODL_ERR_EMULE_NO_DEFAULT_DEST: 1917,
SYNODL_ERR_NO_THUMBNAIL_AVAILABLE: 2200,
SYNODL_ERR_NO_MEDIA_FILE: 2201,
SYNODL_ERR_CAPTCHA_NOT_NEEDED: 2300,
SYNODL_ERR_WRONG_CAPTCHA_CODE: 2301,
SYNODL_ERR_RSS_ID_NOT_EXISTS: 2400,
SYNODL_ERR_RSS_PARAMETER_INVALID: 2401,
SYNODL_ERR_RSS_CREATE_FEED_FAILED: 2402,
SYNODL_ERR_RSS_CREATE_FILTER_FAILED: 2403,
SYNODL_ERR_RSS_DOWNLOAD: 2404,
SYNODL_ERR_RSS_FORMAT: 2405,
SYNODL_ERR_RSS_GET_FEED_FAILED: 2406,
SYNODL_ERR_RSS_UPDATE_FEED_FAILED: 2407,
SYNODL_ERR_RSS_UPDATE_FILTER_FAILED: 2408,
SYNODL_ERR_RSS_REMOVE_OLD_ITEM_FAILED: 2409,
SYNODL_ERR_RSS_UPDATE_ITEM_ALL_NEW_FAILED: 2410,
SYNODL_ERR_RSS_GET_FILTERED_DOWNLOAD_LIST_FAILED: 2411,
SYNODL_ERR_RSS_BAD_FEED_URL: 2412,
SYNODL_ERR_RSS_DELETE_FEED_FAILED: 2413,
SYNODL_ERR_RSS_DELETE_FILTER_FAILED: 2414,
SYNODL_ERR_RSS_DELETE_ITEM_ALL_FAILED: 2415,
SYNODL_ERR_RSS_FILE_EXIST: 2416,
SYNODL_ERR_RSS_GET_FEED_BY_URL: 2417,
SYNODL_ERR_RSS_LIST_ITEM_FAILED: 2418,
SYNODL_ERR_RSS_LIST_FILTER_FAILED: 2419,
SYNODL_ERR_RSS_TEST_FILTER_FAILED: 2420,
SYNODL_ERR_PACKAGE_INFO_GET_FAILED: 2500,
SYNODL_ERR_NZB_FILE_LIST_OPEN_FAILED: 2600,
SYNODL_ERR_NZB_FILE_LIST_READ_FAILED: 2601,
SYNODL_ERR_NZB_FILE_LIST_PARSE_FAILED: 2602,
SYNODL_ERR_EMULE_SEARCH_PERFORM_FAILED: 2700,
SYNODL_ERR_EMULE_SEARCH_STOP_FAILED: 2701,
SYNODL_ERR_EMULE_SEARCH_RESULT_GET_FAILED: 2702,
SYNODL_ERR_EMULE_SEARCH_BUSY: 2703,
SYNODL_ERR_EMULE_ED2K_NOT_CONNECTED: 2704,
SYNODL_ERR_EMULE_KAD_NOT_CONNECTED: 2705,
SYNODL_ERR_EMULE_SERVER_LIST_FAILED: 2800,
SYNODL_ERR_EMULE_SERVER_ADD_FAILED: 2801,
SYNODL_ERR_EMULE_SERVER_DELETE_FAILED: 2802,
SYNODL_ERR_EMULE_SERVER_DUP: 2803,
SYNODL_ERR_EMULE_SERVER_CONNECT_FAILED: 2804,
SYNODL_ERR_EMULE_SERVER_DISCONNECT_FAILED: 2805,
SYNODL_ERR_EMULE_SERVER_GET_STATUS_FAILED: 2806,
SYNODL_ERR_EMULE_SERVER_UPDATE_MET_FAILED: 2807,
SYNODL_ERR_XUNLEI_GET_CAPTCHA_FAILED: 2900,
SYNODL_ERR_XUNLEI_SET_ACCOUNT: 2901
},
getErrorString: function(a) {
switch (a) {
case 401:
return _DT("download", "download_msg_reach_limit");
case 402:
return _DT("download", "download_task_dest_deny");
case 403:
return _DT("download", "download_task_dest_not_exist");
case 502:
return _DT("settings", "fail_connect_server");
case 512:
return _DT("settings", "fail_connect_server");
case 519:
return _DT("download", "download_err_network");
case 521:
return _DT("download", "download_msg_action_failed");
case 522:
return _DT("download", "download_error_share_not_found");
case 523:
return _DT("download", "download_task_quota_reached");
case 531:
return _DT("download", "download_err_no_file_to_end");
case 540:
return _DT("common", "error_badip");
case 543:
return _DT("download", "download_err_tmploc_not_exist");
case 545:
return _DT("download", "download_error_not_in_dl_schedule");
case 1204:
return _DT("download", "download_task_dest_deny");
case 1207:
return _DT("settings", "watch_torrentnzb_conflict");
case 1401:
return _DT("download", "plugin_exist");
case 1402:
return _DT("download", "plugin_invaled");
case 1404:
return _DT("login", "error_cantlogin");
case 1405:
return _DT("settings", "fail_connect_server");
case 1607:
return _DT("download", "filehosting_exist");
case 1608:
return _DT("download", "filehosting_invaled");
case 1800:
return _DT("server", "error_emule_not_running");
case 1803:
return _DT("server", "error_emule_not_running");
case 1900:
return _DT("download", "download_error_wrong_url");
case 1901:
return _DT("download", "download_error_bad_urls_found");
case 1902:
return _DT("download", "download_add_link_error_title");
case 1903:
return _DT("download", "download_error_wrong_file_format");
case 1904:
return _DT("download", "download_err_read_nzb_fail");
case 1905:
return _DT("download", "download_err_read_torrent_fail");
case 1906:
return _DT("download", "download_add_ed2k_error");
case 1907:
return _DT("download", "download_error_server_error");
case 1908:
return _DT("download", "download_dl_not_enabled");
case 1914:
return _DT("download", "download_error_exceed_dest_fs_max_size_short");
case 1915:
return _DT("dlqueue", "error_task_queue_add_dup_file");
case 1916:
return _DT("dlqueue", "error_task_add_dup_file");
case 1917:
return _DT("download", "download_warning_select_share");
case 2401:
return _DT("download", "download_error_invalid_rss");
case 2404:
return _DT("download", "download_error_dl_rss");
case 2405:
return _DT("download", "download_error_invalid_rss");
case 2412:
return _DT("download", "download_error_wrong_rss_urls");
case 2416:
return _DT("download", "download_rss_file_exist");
case 2704:
if (_S("is_admin")) {
return _DT("search", "error_server_not_connected")
} else {
return _DT("search", "error_server_not_connected_normaluser")
}
break;
case 2705:
if (_S("is_admin")) {
return _DT("search", "error_kad_not_connected")
} else {
return _DT("search", "error_kad_not_connected_normaluser")
}
break;
case 2801:
return _DT("server", "error_server_add_new_server_failed");
case 2802:
return _DT("server", "error_server_remove_failed");
case 2803:
return _DT("server", "error_server_add_duplicate");
case 2807:
return _DT("server", "error_server_update_met_failed");
default:
return String.format(_DT("error", "error_unknown_with_code"), a)
}
},
setErrorMask: function(d, b) {
if (543 === d && _S("is_admin")) {
var e = _DT("download", "download_err_tmploc_not_exist_modify");
e = String.format(e, '<a href="#">' + _DT("download", "config") + "</a>");
var a = b.getEl().mask('<span class="syno-grid-tmpcrash">' + e + "</span>");
var c = Ext.DomQuery.selectNode("span.syno-grid-tmpcrash", a.dom.nextSibling);
b.mon(Ext.fly(c), "click", function() {
var f = new SYNO.SDS.DownloadStation.Settings.Window({
defaultActivedFn: "SYNO.SDS.DownloadStation.Settings.GlobalGen",
owner: b.ownerCt.ownerCt.appWin
});
f.open()
}, this)
} else {
b.getEl().mask(SYNO.SDS.DownloadStation.Utils.getErrorString(d))
}
},
isValidExtension: function(d, b) {
var a = 0;
var c = d.toLowerCase();
if (!d.length || !b.length) {
return false
}
a = c.lastIndexOf(b);
if (-1 == a) {
return false
}
if (c.length != (a + b.length)) {
return false
}
return true
},
AddTip: function() {
return Ext.isDefined(SYNO.ux.AddTip) ? SYNO.ux.AddTip.apply(this, arguments) : SYNO.SDS.Utils.AddTip.apply(this, arguments)
},
composeButtonCfg: function(b, a) {
if (Ext.isObject(a)) {
a = [a]
}
a.push(b);
return a
}
});
SYNO.SDS.DownloadStation.gData = {};
Ext.apply(SYNO.SDS.DownloadStation.gData, {
get: function(a) {
return SYNO.SDS.DownloadStation.gData[a]
},
set: function(a, b) {
SYNO.SDS.DownloadStation.gData[a] = b
},
remove: function(a) {
if (SYNO.SDS.DownloadStation.gData[a]) {
delete SYNO.SDS.DownloadStation.gData[a]
}
},
apply: function(a) {
Ext.apply(SYNO.SDS.DownloadStation.gData, a || {})
}
});
Ext.define("SYNO.SDS.DownloadStation.ShowHideCheckGroup", {
extend: "SYNO.ux.Utils.EnableCheckGroup",
setFieldStatus: function(d, g, c, a) {
var f, e, b;
if (g.inputType == "radio") {
f = SYNO.ux.Utils.getRadioGroup(d, g.getName());
for (b = 0; b < f.length; b++) {
if (a) {
e = c ? f[b].hide() : f[b].show()
} else {
e = c ? f[b].show() : f[b].hide()
}
if (Ext.isFunction(f[b].clearInvalid)) {
f[b].clearInvalid()
}
}
} else {
if (a) {
e = c ? g.hide() : g.show()
} else {
e = c ? g.show() : g.hide()
}
if (Ext.isFunction(g.clearInvalid)) {
g.clearInvalid()
}
}
},
checkHandler: function() {
this.callParent(arguments);
this.form.owner.doLayout()
},
enableHandler: function() {
this.callParent(arguments)
}
});
Ext.define("SYNO.SDS.DownloadStation.ToolbarRateItem", {
extend: "Ext.Toolbar.TextItem",
constructor: function(a) {
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
if (!Ext.isObject(a) || !Ext.isString(a.labelText)) {
throw 'Config "labelText" should be given.'
}
this.labelText = a.labelText ? (a.labelText + ": ") : "";
delete a.labelText;
return Ext.apply({
cls: "syno-dl-rate syno-paging-display-text",
text: this.labelText + "N/A"
}, a)
},
updateTextByRate: function(a) {
this.setText(this.labelText + SYNO.SDS.DownloadStation.Utils.fileSize(a) + "/s")
}
});
Ext.ns("SYNO.SDS.DownloadStation");
Ext.define("SYNO.SDS.DownloadStation.ModuleList", {
extend: "SYNO.ux.ModuleList",
defineUIComponents: function(a) {
SYNO.SDS.DownloadStation.Utils.addUIComponents(a, "moduleList", this)
},
constructor: function(b, a) {
this.webapiModuleGet = {
api: "SYNO.DownloadStation2.Package.Module",
method: "get",
version: 2
};
this.defineUIComponents(b);
Ext.apply(this, b.uicomponents || {});
var c = this.fillConfig(b);
this.owner = a;
this.defaultActivedFn = b.defaultActivedFn;
this.callParent([c]);
this.removeClass("syno-ux-modulelist");
this.getSelectionModel().on("selectionchange", this.onModuleListSelect, this);
this.mon(this, "beforecollapsenode", function() {
return false
})
},
fillConfig: function(a) {
this.moduleList = {};
var c = a.folder || a.currentItem.folder;
var b = {
cls: "syno-dl-tree syno-ux-modulelist",
requestMethod: "POST",
dataUrl: a.dataUrl || this.getDataUrl(c),
tbar: a.toolbarConfig,
listeners: {
scope: this,
single: true,
load: function(f) {
if (!this.defaultActivedFn && f.firstChild) {
f.firstChild.on("expand", function(g) {
if (g.firstChild && g.firstChild.attributes.fn) {
this.selectModule(g.firstChild.attributes.fn)
}
}, this)
} else {
this.defaultActivedFn = this.defaultActivedFn || "SYNO.SDS.DownloadStation.Settings.GlobalGen";
var e = function(g) {
if (g.findChild("fn", this.defaultActivedFn)) {
this.selectModule(this.defaultActivedFn)
}
};
for (var d = 0; d < f.childNodes.length; d++) {
f.childNodes[d].on("expand", e, this)
}
}
}
}
};
return b
},
getDataUrl: function(a) {
var b = {
name: a
};
return this.getBaseURL(Ext.apply(this.webapiModuleGet, {
params: b
}))
},
getModule: function(fn) {
var ct = this.owner.moduleCt;
var module = this.moduleList[fn];
if (undefined === module) {
var FnObj;
eval("FnObj = " + fn + ";");
module = new FnObj({
uicomponents: this.uicomponents,
cp: this,
owner: this.owner
});
module.cp = this;
var panel = module.getPanel();
panel.module = module;
panel.itemId = fn;
ct.add(panel);
this.moduleList[fn] = module
}
return module
},
activateModule: function(b, c) {
if (b) {
var a = b.getPanel();
if (a instanceof Ext.TabPanel && Ext.isFunction(a.setActiveTab)) {
a.setActiveTab(0)
}
if (b.activate) {
b.activate(c)
}
this.actived = b
}
},
deactivateModule: function(a) {
if (a) {
if (a.deactivate) {
a.deactivate()
}
}
},
getCurrentModule: function() {
var a = this.owner.moduleCt.layout.activeItem;
if (a) {
return this.getModule(a.itemId)
}
},
startModule: function(b, c) {
var a;
a = this.getModule(b);
if (!a) {
return false
}
this.deactivateModule(this.getCurrentModule());
this.owner.moduleCt.layout.setActiveItem(b);
this.activateModule(a, c)
},
onModuleListSelect: function(a, c) {
var b;
if (!c.leaf) {
return
}
b = c.attributes.fn;
if (b) {
this.startModule(b, c.attributes)
} else {
window.alert("not implemented yet")
}
},
getLocalizedString: function(a) {
return SYNO.SDS.DownloadStation.Utils.getLocalizedString(a)
}
});
Ext.ns("SYNO.SDS.DownloadStation");
Ext.define("SYNO.SDS.DownloadStation.BoxTip", {
extend: "Ext.BoxComponent",
inited: false,
defaultZIndex: 13000,
defaultHeight: 27,
hideDelay: 500,
showDelay: 500,
constructor: function() {
this.callParent([{
renderTo: document.body,
cls: "syno-dl-boxtip",
hidden: true
}]);
this.inited = false;
this.hoverCount = 0
},
createBoxElements: function() {
var b = this.getEl(), a, c;
this.background = b.createChild({
cls: "syno-dl-boxtip-background"
});
a = this.background;
this.backgroundTc = a.createChild({
tag: "div",
cls: "syno-dl-boxtip-background-tc"
});
this.backgroundMl = a.createChild({
tag: "div",
cls: "syno-dl-boxtip-background-ml"
});
this.backgroundMc = a.createChild({
tag: "div",
cls: "syno-dl-boxtip-background-mc"
});
this.backgroundMr = a.createChild({
tag: "div",
cls: "syno-dl-boxtip-background-mr"
});
this.boxMc = b.createChild({
tag: "div",
cls: "syno-dl-boxtip-mc"
});
this.arrow = b.createChild({
tag: "div",
cls: "syno-dl-boxtip-arrow"
});
c = this.boxMc;
this.desc = c.createChild({
tag: "div",
cls: "syno-dl-boxtip-desc"
});
this.inited = true;
this.mon(Ext.get("sds-taskbar"), "click", this.onTaskbarClick, this);
this.mon(Ext.get("sds-taskbar"), "contextmenu", this.onTaskbarClick, this)
},
onTaskbarClick: function() {
this.hideBox(true)
},
showBox: function(a, b) {
if (!this.isEnabled()) {
return
}
this.needShowBox = true;
this.hoverCount += 1;
this.doShowBox.defer(300, this, [a, b, this.hoverCount])
},
doShowBox: function(f, h, e) {
var b, a = 14.25, g, c, d = [0, 0];
if (!f) {
return
}
if (this.hoverCount !== e) {
return
}
if (!this.needShowBox) {
return
}
if (!this.inited) {
this.createBoxElements()
}
this.desc.update(h);
b = this.getEl();
c = this.desc.getTextWidth() + 12;
d[0] = f.getX() + (f.getWidth() / 2) - (c / 2);
d[1] = f.getY() - this.defaultHeight - 7;
g = c / 2 - a;
this.background.setWidth(c);
this.backgroundMl.setWidth(6.25 + g);
this.backgroundMc.setWidth(a);
this.backgroundMr.setWidth(c - 6.25 - a - g);
this.arrow.setLeft(g);
b.setLeftTop(d[0], d[1]);
b.setOpacity(1);
this.show();
this.hoverCount = 0
},
hideBox: function(a) {
if (!this.isEnabled()) {
return
}
this.needShowBox = false;
(function() {
if (this.needShowBox) {
return
}
this.doHideBox(a)
}
).defer((a === true) ? 0 : 300, this)
},
doHideBox: function(b) {
var c;
var a = function() {
if (this.needShowBox) {
return
}
this.hide()
};
this.hoverCount = 0;
if (b === true) {
a.call(this);
return
}
c = this.getEl();
c.shift({
opacity: 0,
duration: 0.2,
scope: this,
callback: a
})
},
isEnabled: function() {
return true
}
});
Ext.ns("SYNO.SDS.DownloadStation");
Ext.define("SYNO.SDS.DownloadStation.TabButton", {
extend: "Ext.Button",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
if (!SYNO.SDS.DownloadStation.boxtip) {
SYNO.SDS.DownloadStation.boxtip = new SYNO.SDS.DownloadStation.BoxTip()
}
this.callParent([a])
},
initButtonEl: function() {
SYNO.SDS.DownloadStation.TabButton.superclass.initButtonEl.apply(this, arguments);
this.mon(this.el, "mouseover", this.onMouseOverHandler, this);
this.mon(this.el, "mouseout", this.onMouseOutHandler, this)
},
onMouseOverHandler: function(a) {
if (SYNO.SDS.DownloadStation.boxtip.isEnabled()) {
this.setTooltip("")
}
SYNO.SDS.DownloadStation.boxtip.showBox(this.el, this.tooltip)
},
onMouseOutHandler: function(a) {
SYNO.SDS.DownloadStation.boxtip.hideBox()
}
});
Ext.ns("SYNO.SDS.DownloadStation");
Ext.define("SYNO.SDS.DownloadStation.BasicActionGroup", {
extend: Ext.isDefined(SYNO.ux.Utils.ActionGroup) ? "SYNO.ux.Utils.ActionGroup" : "SYNO.SDS.Utils.ActionGroup"
});
Ext.define("SYNO.SDS.DownloadStation.ActionGroup", {
extend: "SYNO.SDS.DownloadStation.BasicActionGroup",
setEnableBtns: function(c, b) {
if (!c || (!Ext.isArray(c) && !Ext.isString(c))) {
return
}
var a = Ext.isArray(c) ? c : [c];
Ext.each(a, function(d) {
this[b ? "enable" : "disable"](d)
}, this)
}
});
Ext.ns("SYNO.SDS.DownloadStation");
Ext.define("SYNO.SDS.DownloadStation.GridView", {
extend: "SYNO.ux.FleXcroll.grid.GridView",
updateScroller: function(a) {
var b = this
, f = b.scroller.dom;
if (!b.autoFlexcroll) {
return
}
b.updateScrollbar(f, a);
var g = "0px";
try {
if (f.fleXdata.scroller[0]) {
g = "8px"
}
} catch (d) {
SYNO.Debug("Fail to find fleXdata ")
}
var h = f.getElementsByClassName("x-grid3-body")[0];
if (h.style.marginBottom !== g) {
h.style.marginBottom = g;
b.updateScrollbar(f, a)
}
},
afterRenderUI: function() {
var a = this;
a.callParent(arguments);
if (!a.autoFlexcroll) {
return
}
a.on("flexcroll", a.syncScroll, a, {
buffer: 100
})
},
onColumnWidthUpdated: function(c, a, b) {
var d = this;
d.callParent(arguments);
d.updateScroller()
},
onColumnHiddenUpdated: function(b, d, a) {
var c = this;
c.callParent(arguments);
c.updateScroller()
}
});
Ext.define("SYNO.SDS.DownloadStation.RightPanel", {
extend: "SYNO.ux.Panel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
this.callParent(arguments);
var b = {
uicomponents: this.uicomponents,
owner: this
};
this.panel = this.createPanel(b);
this.actionGroup = this.createActionGroup();
var c = this.panel.getTopToolbar();
if (typeof c !== "undefined") {
c.mon(c, "afterlayout", function(d) {
d.items.each(function(e) {
if (e.ctCls && e.getEl() && e.getEl().parent("td")) {
e.getEl().parent("td").addClass(e.ctCls)
}
})
})
}
this.toolbar = c
},
getPanel: function() {
return this.panel
},
createPanel: function(b) {
var a = new Ext.Panel({
layout: "border",
module: this,
border: false,
header: false,
tbar: this.fillToolbarConfig({}),
items: [this.upperPanel = this.createUpperPanel({
minHeight: 90,
uicomponents: this.uicomponents,
region: "center",
module: this,
border: false,
owner: this
}), this.lowerPanel = this.createLowerPanel({
uicomponents: this.uicomponents,
id: this.lowerPanelId = Ext.id(),
split: true,
height: 250,
floatable: false,
collapsible: true,
cmargins: "0 0 0 0",
animCollapse: false,
border: false,
region: "south",
module: this,
owner: this
})],
listeners: {
scope: this,
resize: function(d, i, f, e, h) {
if (this.lowerPanel && this.lowerPanel.isVisible()) {
var c = this.lowerPanel.getHeight();
var g = c < (f - 100) ? c : (f - 100);
this.lowerPanel.setHeight(g);
d.removeClass("syno-dl-collapse-animate")
}
}
}
});
this.upperPanel.addClass("syno-dl-rightpanel-upper");
this.lowerPanel.addClass("syno-dl-rightpanel-lower");
this.lowerPanel.mon(this.lowerPanel, "beforecollapse", this.onLowerPanelToggle, this);
return a
},
onLowerPanelToggle: function(d) {
var a = d.ownerCt;
var e;
if (!d.bodyCollapsed) {
d.oriHeight = d.getHeight() - 9
}
if (this.upperPanel && this.upperPanel.el) {
e = this.upperPanel.el.child(".hscrollerbar")
}
d.bodyCollapsed = d.bodyCollapsed ? false : true;
var c = d.oriHeight < (a.getHeight() - 100) ? d.oriHeight : (a.getHeight() - 100);
d.setHeight(d.bodyCollapsed ? 25 : c);
a[d.bodyCollapsed ? "addClass" : "removeClass"]("x-body-collapsed");
a.addClass("syno-dl-collapse-animate");
a.removeClass.defer(2000, a, ["syno-dl-collapse-animate"]);
a.doLayout();
if (e) {
e.setDisplayed(false)
}
this.upperPanel.view.layout.defer(300, this.upperPanel.view);
if (e) {
e.setDisplayed.defer(301, e, [true])
}
var b = d.ownerCt.layout.south.getSplitBar();
b.dd[d.bodyCollapsed ? "lock" : "unlock"]();
return false
},
createUpperPanel: function(a) {
return new SYNO.ux.Panel(a)
},
createLowerPanel: function(a) {
return new SYNO.ux.Panel(a)
},
onActivate: function() {},
onDeactivate: function() {},
onTabActivate: function() {},
onTabDeactivate: function() {},
fillToolbarConfig: function(a) {
return Ext.apply({
xtype: "toolbar",
cls: "syno-dl-toolbar",
items: []
}, a)
},
createActionGroup: function(a, c) {
var b = Ext.isDefined(a) ? a : [];
return (true !== c) ? new SYNO.SDS.DownloadStation.BasicActionGroup(b) : new SYNO.SDS.DownloadStation.ActionGroup(b)
},
setToolBar: function() {
var a = this.toolbar;
a.items.each(function(b) {
b.hide()
});
a.removeAll(false);
a.add(this.actionGroup.getArray());
a.items.each(function(b) {
if (Ext.isEmpty(b.initialConfig.hidden) || (true !== b.initialConfig.hidden)) {
b.show()
}
});
a.doLayout()
},
activate: function() {
this.getPanel().items.each(function(a) {
a.fireEvent("activate", a)
}, this);
this.setToolBar();
this.onActivate()
},
deactivate: function() {
this.getPanel().items.each(function(a) {
a.fireEvent("deactivate", a)
}, this);
this.onDeactivate()
},
setStatusBusy: function() {
var a = this.getPanel().getEl();
if (Ext.isObject(a) && !a.isMasked()) {
a.mask(_T("common", "loading"), "x-mask-loading")
}
},
clearStatusBusy: function() {
var a = this.getPanel().getEl();
if (Ext.isObject(a)) {
a.unmask()
}
},
getMsgBox: function() {
return SYNO.SDS.DownloadStation.Window.getMsgBox()
}
});
Ext.ns("SYNO.SDS.DownloadStation");
Ext.define("SYNO.SDS.DownloadStation.PollingTask", {
extend: "Ext.Component",
constructor: function(a) {
this.callParent(arguments);
this.tasks = [];
this.initPollingTask(a);
this.addRunnerListener("beforestart", this.onBeforeStart);
this.taskRunner.start = function(c, b) {
if (this.isDestroyed) {
return
}
if (!c.running) {
if (this.fireEvent("beforestart", c) === false) {
return c
}
SYNO.SDS.TaskMgr.start(c, b)
}
c.running = true;
return c
}
},
initPollingTask: function(a) {
if (a && a.tasks) {
a.tasks.forEach(function(b) {
this.add(b)
}, this)
}
},
addRunnerListener: function(c, a) {
var b = this.getTaskRunner();
this.mon(b, c, a, this)
},
removeRunnerListener: function(c, a) {
var b = this.getTaskRunner();
this.mun(b, c, a, this)
},
add: function(b) {
if (Ext.isArray(b)) {
var a = [];
Ext.each(b, function(d) {
a.push(this.add(d))
}, this);
return a
}
return this.onAdd(b)
},
onAdd: function(b) {
if (b.beforestart && Ext.isFunction(b.beforestart)) {
b.beforestart = Ext.createDelegate(b.beforestart, b.scope)
}
var a;
if (b.url) {
a = this.addAjaxTask(b)
} else {
if (b.api || b.webapi) {
a = this.addWebAPITask(b)
} else {
a = this.addTask(b)
}
}
a.id = b.id || Ext.id();
a.taskCfg = b;
this.tasks.push(a)
},
startAll: function(a) {
if (typeof a === "undefined") {
a = true
}
this.stopAll();
this.tasks.forEach(function(b) {
b.start(a || false)
})
},
stopAll: function() {
this.tasks.forEach(function(a) {
a.stop()
})
},
removeAll: function() {
this.stopAll();
for (var b = 0, c = this.tasks.length; b < c; b++) {
var a = this.tasks.pop();
if (a && a.remove) {
a.remove();
a = null
}
}
this.removeRunnerListener("beforestart", this.onBeforeStart)
},
removeById: function(b) {
if (Ext.isArray(b)) {
var a = [];
Ext.each(b, function(d) {
a.push(this.removeById(d))
}, this);
return a
}
return this.onRemoveById(b)
},
onRemoveById: function(b) {
var a = this.getTaskById(b);
if (a) {
a.stop();
a.remove();
this.tasks.remove(a);
a = null
}
},
getTaskById: function(a) {
return this.tasks.find(function(c, b, d) {
return a == c.id
})
},
stopById: function(b) {
if (Ext.isArray(b)) {
var a = [];
Ext.each(b, function(d) {
a.push(this.stopById(d))
}, this);
return a
}
return this.onStopById(b)
},
onStopById: function(b) {
var a = this.getTaskById(b);
if (a) {
a.stop()
}
},
startById: function(c, b) {
if (Ext.isArray(c)) {
var a = [];
Ext.each(c, function(d) {
a.push(this.startById(d, b))
}, this);
return a
}
return this.onStartById(c, b)
},
onStartById: function(c, a) {
if (typeof a === "undefined") {
a = true
}
var b = this.getTaskById(c);
if (b) {
b.stop();
b.start(a || false)
}
},
onBeforeStart: function(a) {
if (a.taskCfg.beforestart) {
return a.taskCfg.beforestart(a)
}
return true
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.FormPanel", {
extend: "SYNO.SDS.Utils.FormPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.ownerCt = a.owner;
this.addEvents("onSetValues");
var b = Ext.applyIf(this.fillConfig(a), {
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
btnStyle: "blue",
text: _T("common", "apply"),
scope: this,
handler: function() {
this.settingsWin.actionFlag = "APPLY";
this.settingsWin.close()
},
disabled: _S("demo_mode"),
tooltip: _S("demo_mode") ? _JSLIBSTR("uicommon", "error_demo") : undefined
}, {
xtype: "syno_button",
text: _T("common", "cancel"),
scope: this,
handler: function() {
this.settingsWin.actionFlag = "CANCEL";
this.settingsWin.close()
}
})
});
this.callParent([b]);
this.mon(this, "afterlayout", this.enableCheckGroup, this, {
single: true
});
this.defineBehaviors()
},
fillConfig: function(a) {
return a
},
activate: function() {
this.loadForm()
},
loadForm: function() {
if (this.form && this.form.isDirty()) {
return
}
var a = this.gData.get(this.getKeyName());
if (a) {
this.form.setValues(a)
} else {
this.sendWebAPIGetRequest()
}
},
deactivate: function() {
return true
},
getPanel: function() {
return this
},
getAbsoluteURL: function(a) {
return String.format("{0}/{1}", this.jsConfig.jsBaseURL, a)
},
sendAjaxRequest: function(a) {
this.appWin.addAjaxTask(Ext.apply({
single: true
}, a)).start(true)
},
isDirty: function() {
return this.form.isDirty()
},
isValid: function() {
return this.form.isValid()
},
sendWebAPIGetRequest: function() {
var a = this.getWebAPIGetData();
this.setStatusBusy({
text: _T("common", "loading")
});
this.sendWebAPI({
compound: {
stopwhenerror: false,
params: a
},
callback: function(b, f, e, d) {
if (undefined !== f.has_fail && false === f.has_fail) {
this.postReturnData(f.result)
} else {
var c = _DT("common", "error_system");
if (undefined !== f.statusText && "transaction aborted" === f.statusText) {
c = _DT("server", "error_emule_not_running")
} else {
if (undefined !== f.has_fail && true === f.has_fail) {
Ext.each(f.result, function(g, h, i) {
if (!g.success) {
SYNO.Debug("Failed on " + g.api + " " + g.method);
c = SYNO.SDS.DownloadStation.Utils.getErrorString(g.error.code);
return
}
}, this)
}
}
this.settingsWin.getMsgBox().alert("", c)
}
this.clearStatusBusy()
},
scope: this
});
return
},
getWebAPIGetData: function() {
var a = [{
api: this.getWebAPIName(),
method: "get",
version: this.getWebAPIVersion()
}];
return a
},
getWebAPISetData: function() {
var a = {
api: this.getWebAPIName(),
method: "set",
params: this.getWebAPIParam(),
version: this.getWebAPIVersion()
};
return (a.params ? a : undefined)
},
getWebAPIVersion: function() {
return 1
},
postReturnData: function(a) {
this.gData.set(this.getKeyName(), a[0].data);
this.form.setValues(a[0].data)
},
getWebAPIParam: function() {
var a = this.getFields();
var d = {};
var c = true;
for (var b = 0; b < a.length; b++) {
if (this.form.findField(a[b]).isDirty()) {
d[a[b]] = this.form.findField(a[b]).getValue();
c = false
}
}
return c ? undefined : d
},
onSettingsApply: function() {
return true
},
getHelpParam: Ext.emptyFn,
enableCheckGroup: Ext.emptyFn,
defineBehaviors: Ext.emptyFn,
getKeyName: Ext.emptyFn,
getFields: Ext.emptyFn,
getWebAPIName: Ext.emptyFn
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.GlobalGen", {
extend: "SYNO.SDS.DownloadStation.Settings.FormPanel",
fillConfig: function(a) {
var c = new Ext.data.SimpleStore({
fields: ["mount_point", "display", "size_free"],
data: []
});
var b = {
frame: false,
border: false,
trackResetOnLoad: true,
blPython: true,
items: [{
xtype: "syno_fieldset",
title: _DT("common", "displayname"),
items: [{
xtype: "syno_combobox",
name: "download_volume",
fieldLabel: _T("download", "temporary_location"),
store: c,
displayField: "display",
width: 350,
hidden: true,
valueField: "mount_point"
}, {
xtype: "syno_textfield",
name: "download_volume_text",
fieldLabel: _T("download", "temporary_location"),
width: 350
}, {
xtype: "syno_displayfield",
name: "download_volume_warning",
value: "",
hidden: true,
cls: "message_warning"
}]
}, {
xtype: "syno_fieldset",
title: _DT("tree", "node_emule"),
items: [{
xtype: "syno_checkbox",
name: "enable_emule",
boxLabel: _T("download", "title_enable_emule"),
disabled: _S("demo_mode")
}]
}]
};
return Ext.apply(b, a)
},
enableCheckGroup: Ext.emptyFn,
updateVolumeItems: function(c) {
var b = this.form.findField("download_volume").store;
var d = 0;
var a = [];
Ext.each(c, function(g, e, f) {
if (!d) {
d = g.mount_point
}
a.push([g.mount_point, g.display, g.size_free])
}, this);
b.loadData(a)
},
isValid: function() {
return (this.callParent(arguments) && this.verifyVolumeSpaceEnough())
},
verifyVolumeSpaceEnough: function() {
var c, a;
var d = this.getForm().findField("download_volume");
var b = 1073741824;
if (d.isDirty()) {
a = d.getStore();
c = a.findExact("mount_point", d.getValue());
if (b >= parseInt(a.getAt(c).get("size_free"), 10)) {
this.appWin.getMsgBox().alert(_T("tree", "leaf_download"), String.format(_T("download", "volume_no_enough_free_space"), "1 " + _T("common", "size_gb")));
return false
}
}
return true
},
confirmIfVolumeChange: function(c) {
var b = this.getForm().findField("download_volume");
if (b.isDirty() && this.originalHasVolume) {
this.settingsWin.moduleList.selectModule("SYNO.SDS.DownloadStation.Settings.GlobalGen");
var a = String.format(_T("volume", "volume_change_this_warning"), "Download");
this.appWin.getMsgBox().confirm(_T("tree", "leaf_download"), a, function(d, e) {
if (d == "yes") {
c()
}
}, this);
return
}
c()
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.Global"
},
getWebAPIVersion: function() {
return 2
},
getKeyName: function() {
return "global"
},
postReturnData: function(a) {
var b = a[0].data;
this.originalHasVolume = (b.download_volume) ? true : false;
if (!b.volume_list || 1 == b.volume_list.length) {
b.download_volume_text = b.volume_list ? b.volume_list[0].display : "";
this.form.findField("download_volume").setVisible(false);
this.form.findField("download_volume_text").setVisible(true);
this.form.findField("download_volume_text").setDisabled(true)
} else {
this.form.findField("download_volume").setVisible(true);
this.form.findField("download_volume_text").setVisible(false)
}
this.updateVolumeItems(b.volume_list);
delete b.volume_list;
delete b.volume_count;
this.gData.set(this.getKeyName(), b);
this.form.setValues(b)
},
getFields: function() {
var a = ["download_volume", "enable_emule"];
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.GlobalUnzip", {
extend: "SYNO.SDS.DownloadStation.Settings.FormPanel",
fillConfig: function(a) {
this.select_btn = new SYNO.ux.Button({
xtype: "button",
name: "unzip_btn",
text: _T("common", "choose"),
disabled: _S("demo_mode"),
scope: this,
style: "margin-left: 50px;",
handler: function() {
this.utils.chooseDestHandler({
owner: this.owner,
title: _DT("settings", "unzip_extract_to"),
destinationField: this.form.findField("unzip_folder")
})
}
});
this.pwPoolbtn = new SYNO.ux.Button({
xtype: "button",
name: "pw_pool_btn",
text: _DT("settings", "unzip_pwpool_title"),
scope: this,
handler: this.showPWPoolDialog
});
this.current_folder_radio = new SYNO.ux.Radio({
indent: 1,
boxLabel: _DT("settings", "unzip_current_folder"),
name: "unzip_location",
itemId: "current_folder",
inputValue: "current_folder",
checked: true
});
this.select_folder_radio = new SYNO.ux.Radio({
indent: 1,
boxLabel: _DT("settings", "unzip_extract_to"),
name: "unzip_location",
itemId: "select_folder",
inputValue: "select_folder",
listeners: {
check: {
fn: function(f, g) {
if (this.getForm().findField("unzip_folder")) {
this.getForm().findField("unzip_folder").setDisabled(!g);
this.select_btn.setDisabled(!g || _S("demo_mode"))
}
},
scope: this
}
}
});
var d = {
xtype: "syno_fieldset",
title: _DT("settings", "unzip_service_setting"),
items: [{
xtype: "syno_checkbox",
boxLabel: SYNO.SDS.isNSM ? _DT("settings", "unzip_allow_user_northstarplus") : _DT("settings", "unzip_allow_user"),
name: "enable_unzip_service"
}]
};
var e = {
xtype: "syno_fieldset",
itemId: "personal_fieldset",
title: _DT("common", "unzip_title"),
items: [{
xtype: "syno_checkbox",
boxLabel: _DT("settings", "unzip_enable"),
name: "enable_unzip",
listeners: {
check: {
fn: this.enableUnzipFields,
scope: this
}
}
}, this.current_folder_radio, {
xtype: "syno_compositefield",
itemId: "extract_selectfield",
hideLabel: true,
items: [this.select_folder_radio, {
xtype: "syno_textfield",
name: "unzip_folder",
readOnly: true,
allowBlank: false,
width: 160,
style: "margin-left: 50px;"
}, this.select_btn]
}, {
xtype: "syno_checkbox",
boxLabel: _DT("settings", "unzip_create_subfolder"),
name: "create_subfolder"
}, {
xtype: "syno_checkbox",
boxLabel: _DT("settings", "unzip_overwrite"),
name: "unzip_overwrite"
}, {
xtype: "syno_checkbox",
boxLabel: _DT("settings", "unzip_delete_archive"),
name: "delete_archive"
}, {
xtype: "syno_displayfield",
name: "password_desc",
value: _DT("settings", "unzip_pwpool_title") + " - " + _DT("settings", "unzip_pwpool_short_desc")
}, this.pwPoolbtn, {
xtype: "hidden",
name: "passwordPool"
}]
};
var b;
if (this._S("is_admin")) {
b = [d, e]
} else {
b = [e]
}
var c = {
autoScroll: true,
trackResetOnLoad: true,
labelWidth: 200,
border: false,
hideMode: "offsets",
items: b,
listeners: {}
};
Ext.apply(c, a);
return SYNO.LayoutConfig.fill(c)
},
defineBehaviors: function() {
this.enable_service = this.getForm().findField("enable_unzip_service");
this.enable = this.getForm().findField("enable_unzip");
this.unzipFolder = this.getForm().findField("unzip_folder");
this.subfolder = this.getForm().findField("create_subfolder");
this.overwrite = this.getForm().findField("unzip_overwrite");
this.deleteArchive = this.getForm().findField("delete_archive");
this.pwDesc = this.getForm().findField("password_desc")
},
enableUnzipFields: function(c, b) {
this.current_folder_radio.setDisabled(!b);
this.select_folder_radio.setDisabled(!b);
var a = this.select_folder_radio.getValue();
if (this.getForm().findField("unzip_folder")) {
this.getForm().findField("unzip_folder").setDisabled(!b || !a)
}
this.select_btn.setDisabled(!b || !a || _S("demo_mode"));
this.subfolder.setDisabled(!b);
this.overwrite.setDisabled(!b);
this.deleteArchive.setDisabled(!b);
this.pwPoolbtn.setDisabled(!b);
this.pwDesc.setDisabled(!b)
},
showPWPoolDialog: function() {
var a = new SYNO.SDS.DownloadStation.Settings.PasswordPoolDialog({
uicomponents: this.uicomponents,
owner: this.settingsWin,
module: this,
MainDownloadWin: this.appWin,
passwordPool: this.getForm().findField("passwordPool").getValue()
});
a.open()
},
loadForm: function() {
if (this.form && this.form.isDirty()) {
return
}
if (this._S("is_admin")) {
var b = this.gData.get(this.getKeyName());
if (b) {
this.form.setValues(b)
} else {
this.sendWebAPIGetRequest()
}
}
if (!SYNO.SDS.DownloadStation.blUnzip && !_S("is_admin")) {
this.enableUnzipFields(null, false);
return
}
var a = this.appWin.appInstance.getUserSettings("unzip_settings");
if (!a) {
this.enableUnzipFields(null, false);
return
}
this.getForm().loadRecord({
data: a
});
if (!this.enable.getValue()) {
this.enableUnzipFields(null, false)
}
},
onSettingsApply: function() {
var b = this.getForm();
var a = b.getValues();
if (!a.enable_unzip) {
this.enableUnzipFields(null, true);
a = b.getValues();
this.enableUnzipFields(null, false);
a.enable_unzip = "off"
}
if (b.findField("unzip_folder")) {
var c = b.findField("unzip_folder").getValue();
a.unzip_folder = c
}
this.appWin.appInstance.setUserSettings("unzip_settings", a);
return true
},
userSettingIsDirty: function() {
if (!this._S("is_admin")) {
return this.getForm().isDirty()
}
this.enable_service.disable();
var a = this.getForm().isDirty();
this.enable_service.enable();
return a
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.Global"
},
getWebAPIVersion: function() {
return 2
},
getKeyName: function() {
return "unzip"
},
postReturnData: function(a) {
var b = {};
b.enable_unzip_service = a[0].data.enable_unzip_service;
this.gData.set(this.getKeyName(), b);
this.form.setValues(b)
},
getFields: function() {
return (this._S("is_admin") ? ["enable_unzip_service"] : [])
}
});
Ext.define("SYNO.SDS.DownloadStation.Settings.PasswordPoolDialog", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, a || {});
var b = this.fillConfig();
this.callParent([b])
},
fillConfig: function(a) {
var b = {
owner: this.owner,
cls: "syno-dl-win",
width: 470,
height: 424,
minWidth: 400,
minHeight: 250,
constrainHeader: true,
itemId: "passwordPoolDialog",
title: _DT("settings", "unzip_pwpool_title"),
layout: "fit",
items: [this.genPanel()],
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
text: _T("common", "apply"),
scope: this,
btnStyle: "blue",
handler: this.onSave
}, {
text: _T("common", "cancel"),
scope: this,
handler: this.close
})
};
return b
},
genPanel: function() {
var a = {
padding: 0,
itemId: "panel",
border: false,
items: [{
xtype: "syno_displayfield",
value: _DT("settings", "unzip_pwpool_desc"),
style: "height: 10;"
}, {
xtype: "syno_textarea",
hideLabel: true,
itemId: "passwordPool",
autoFlexcroll: true,
value: this.getDisplay(),
width: 400,
height: 130,
anchor: "99% 80%",
hidden: false,
cls: "selectabletext allowDefCtxMenu"
}]
};
return new SYNO.ux.FormPanel(a)
},
getDisplay: function() {
var c;
var a = this.module.getForm().findField("passwordPool").getValue();
if (a && "" !== a) {
c = Ext.util.JSON.decode(a)
} else {
c = []
}
var b = c.join("\n");
return b
},
onSave: function() {
var b = this.get("panel").get("passwordPool");
if (b.isDirty()) {
var a = this.handlePWPoool(b.getValue());
if (!a) {
return
}
this.module.getForm().findField("passwordPool").setValue(a)
}
this.close()
},
handlePWPoool: function(e) {
var d = e.replace(/\r/g, "");
var a = d.split("\n");
var c;
if (a.length > 30) {
this.owner.getMsgBox().alert(_DT("settings", "unzip_pwpool_title"), _DT("error", "unzip_pw_limit"));
return false
}
var f = [];
for (var b = 0; b < a.length; b++) {
c = a[b];
if (c.length >= SYNO.SDS.DownloadStation.PW_MAX_LEN) {
this.owner.getMsgBox().alert(_DT("settings", "unzip_pwpool_title"), _DT("error", "unzip_pw_length"));
return false
}
if (c !== "" && f.indexOf(c) == -1) {
f.push(c)
}
}
d = Ext.util.JSON.encode(f);
return d
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.GlobalNotification", {
extend: "SYNO.ux.Panel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
var b = this.fillConfig(a);
this.callParent([b]);
this.addClass("syno-ux-formpanel")
},
fillConfig: function(a) {
this.notificationPanel = new SYNO.SDS.PersonalNotification.TabPanel({
appWin: a.uicomponents.appWin,
pkgName: "DownloadStation",
mobileDisabled: true,
buttons: false
});
var b = {
layout: "fit",
fbar: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
btnStyle: "blue",
text: _T("common", "apply"),
scope: this,
handler: function() {
a.uicomponents.settingsWin.actionFlag = "APPLY";
a.uicomponents.settingsWin.close()
},
disabled: _S("demo_mode"),
tooltip: _S("demo_mode") ? _JSLIBSTR("uicommon", "error_demo") : undefined
}, {
xtype: "syno_button",
text: _T("common", "cancel"),
scope: this,
handler: function() {
a.uicomponents.settingsWin.actionFlag = "CANCEL";
a.uicomponents.settingsWin.close()
}
}),
items: [this.notificationPanel]
};
Ext.apply(b, a);
return b
},
getPanel: function() {
return this
},
isDirty: function() {
var a = this.notificationPanel.items.items;
for (var b = 0; b < a.length; b++) {
if (a[b].isDirty()) {
return true
}
}
return false
},
isValid: function() {
var a = this.notificationPanel.items.items;
for (var b = 0; b < a.length; b++) {
if (!a[b].isValid()) {
this.notificationPanel.setActiveTab(b);
return false
}
}
return true
},
getWebAPISetData: function() {
return undefined
},
onSettingsApply: function() {
Ext.each(this.notificationPanel.items.items, function(b, a) {
if (b.isDirty()) {
b.action("save")
}
});
return true
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.DLMGen", {
extend: "SYNO.SDS.DownloadStation.Settings.FormPanel",
fillConfig: function(a) {
var d;
var e = parseInt(_D("downloadlimit"), 10);
if (e) {
d = this.createDLLimitStore(e)
} else {
d = this.createDLLimitStore(20)
}
var f, c;
if (true === _S("is_admin")) {
f = {
xtype: "syno_fieldset",
title: _DT("service", "service_dl_start_desc"),
items: [{
xtype: "syno_radio",
boxLabel: _DT("service", "service_dl_now"),
name: "dl_when_type",
itemId: "type_now",
inputValue: "now",
checked: true
}, {
xtype: "syno_radio",
boxLabel: _T("schedule", "schedule_advance"),
name: "dl_when_type",
itemId: "type_schedule",
inputValue: "schedule"
}, {
id: this.btnScheduleId = Ext.id(),
xtype: "syno_button",
text: _T("schedule", "schedule_title"),
handler: this.launchScheduleDialog,
scope: this,
indent: 1
}, {
xtype: "hidden",
name: "schedule"
}, {
xtype: "hidden",
name: "upload_rate"
}, {
xtype: "hidden",
name: "download_rate"
}]
};
c = {
xtype: "syno_fieldset",
title: _DT("service", "service_dl_order"),
labelWidth: 250,
synodefaults: {
width: 160
},
items: [{
xtype: "syno_radio",
boxLabel: _DT("service", "service_dl_order_by_request"),
name: "order",
itemId: "request",
inputValue: "request",
checked: true
}, {
xtype: "syno_radio",
boxLabel: _DT("service", "service_dl_order_by_user"),
name: "order",
itemId: "user",
inputValue: "user",
checked: false
}, {
xtype: "syno_combobox",
name: "max_tasks",
fieldLabel: _DT("service", "service_dl_maximal_tasks"),
store: d,
displayField: "value",
valueField: "value",
triggerAction: "all",
selectOnFocus: true,
editable: false
}, {
xtype: "syno_displayfield",
cls: "synodl-warning-error",
value: _DT("service", "service_dl_hint_many_tasks")
}]
}
}
var b = {
autoScroll: true,
trackResetOnLoad: true,
labelWidth: 200,
border: false,
hideMode: "offsets",
items: [f, c]
};
return Ext.apply(b, a)
},
defineBehaviors: function() {
if (true === _S("is_admin")) {
var a;
a = new SYNO.ux.Utils.EnableCheckGroup(this.form,"type_schedule",[this.btnScheduleId])
}
this.mon(this, "onSetValues", function(b, c) {
this.updateDLLimitStore(c.max_tasks_limit)
}, this)
},
createDLLimitStore: function(c) {
var a = [];
var d = 1;
while (d <= c) {
a.push([d]);
d++
}
var b = new Ext.data.SimpleStore({
id: 0,
fields: ["value"],
data: a
});
return b
},
updateDLLimitStore: function(c) {
var a = this.form.findField("max_tasks");
var b = [];
var d = 1;
while (d <= c) {
b.push([d]);
d++
}
a.store.loadData(b)
},
launchScheduleDialog: function() {
var b = this.getForm();
var a = new SYNO.SDS.DownloadStation.Settings.ScheduleDialog({
owner: this.owner,
limitBtnStr: _DT("download", "bt_limit_speed"),
limitDescStr: _DT("download", "bt_limit_speed_setting"),
noteDescStr: _DT("download", "bt_limit_speed_note"),
scheduleField: b.findField("schedule"),
altUploadField: b.findField("upload_rate"),
altDownloadField: b.findField("download_rate")
});
a.show()
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.Scheduler"
},
getKeyName: function() {
return "schedule"
},
postReturnData: function(a) {
var b;
b = a[0].data;
b.dl_when_type = (b.enable_schedule) ? "schedule" : "now";
delete b.enable_schedule;
this.gData.set(this.getKeyName(), b);
this.form.setValues(b);
this.fireEvent("onSetValues", this, b)
},
getWebAPIParam: function() {
var a = this.getFields();
var c = {};
for (var b = 0; b < a.length; b++) {
if (this.form.findField(a[b]).isDirty()) {
if ("order" === a[b]) {
c.order = (this.form.findField(a[b]).getValue()) ? "request" : "user"
} else {
if ("dl_when_type" === a[b]) {
c.enable_schedule = !this.form.findField(a[b]).getValue()
} else {
if (("upload_rate" === a[b]) || ("download_rate" === a[b])) {
c[a[b]] = parseInt(this.form.findField(a[b]).getValue(), 10)
} else {
c[a[b]] = this.form.findField(a[b]).getValue()
}
}
}
}
}
return c
},
getFields: function() {
var a = ["dl_when_type", "download_rate", "upload_rate", "order", "max_tasks", "schedule"];
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.DLMFolder", {
extend: "SYNO.SDS.DownloadStation.Settings.FormPanel",
fillConfig: function(a) {
var b = {
xtype: "syno_fieldset",
title: _DT("settings", "title_default_dest_folder"),
labelWidth: 250,
items: [{
xtype: "syno_compositefield",
itemId: "destselectfield",
fieldLabel: _DT("download", "download_list_dest_folder"),
defaults: {
hideLabel: true
},
items: [{
xtype: "syno_textfield",
name: "default_destination",
readOnly: true,
allowBlank: false,
width: 160
}, {
xtype: "syno_button",
text: _T("common", "choose"),
disabled: _S("demo_mode"),
scope: this,
handler: function() {
this.utils.chooseDestHandler({
owner: this.owner,
destinationField: this.form.findField("default_destination")
})
}
}]
}]
};
var d = {
xtype: "syno_fieldset",
title: _DT("settings", "watch_torrentnzb_title"),
labelWidth: 250,
itemId: "watchfieldset",
hideMode: "visibility",
items: [{
xtype: "syno_checkbox",
boxLabel: _DT("settings", "watch_torrentnzb_enableload"),
name: "enable_torrent_nzb_watch"
}, {
xtype: "syno_checkbox",
boxLabel: _DT("settings", "watch_torrentnzb_enabledelete"),
indent: 1,
name: "enable_delete_torrent_nzb_watch"
}, {
xtype: "syno_compositefield",
itemId: "watchfolderfield",
indent: 1,
fieldLabel: _DT("settings", "watch_torrentnzb_folder"),
defaults: {
hideLabel: true
},
items: [{
xtype: "syno_textfield",
name: "torrent_nzb_watch_folder",
readOnly: true,
allowBlank: false,
width: 160
}, {
id: this.btnwatchfolder = Ext.id(),
xtype: "syno_button",
text: _T("common", "choose"),
disabled: _S("demo_mode"),
scope: this,
handler: function() {
this.utils.chooseDestHandler({
owner: this.owner,
title: _DT("settings", "watch_torrentnzb_folder"),
destinationField: this.form.findField("torrent_nzb_watch_folder")
})
}
}]
}]
};
var c = {
autoScroll: true,
trackResetOnLoad: true,
labelWidth: 200,
border: false,
hideMode: "offsets",
items: [b, d],
listeners: {
afterlayout: {
fn: function() {
var f, e = ["enable_delete_torrent_nzb_watch", "watchfolderfield"];
if (!_S("demo_mode")) {
e.push(this.btnwatchfolder)
}
f = new SYNO.ux.Utils.EnableCheckGroup(this.getForm(),"enable_torrent_nzb_watch",e)
},
scope: this,
single: true
}
}
};
return Ext.apply(c, a)
},
getWebAPISetData: function() {
var a = this.callParent(arguments);
if (Ext.isDefined(a)) {
SYNO.SDS.DownloadStation.DLM.Util.setLocationDestination(undefined)
}
return a
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.Location"
},
getKeyName: function() {
return "location"
},
getFields: function() {
var a = ["default_destination", "enable_torrent_nzb_watch", "enable_delete_torrent_nzb_watch", "torrent_nzb_watch_folder"];
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.DLMBt", {
extend: "SYNO.SDS.DownloadStation.Settings.FormPanel",
fillConfig: function(a) {
var c = new Ext.data.SimpleStore({
id: 0,
fields: ["value", "display"],
data: [["auto", _DT("service", "service_dl_bt_encrypt_auto")], ["always", _DT("service", "service_dl_bt_encrypt_always")], ["disable", _DT("service", "service_dl_bt_encrypt_disable")]]
});
var b = {
trackResetOnLoad: true,
hideMode: "offsets",
border: false,
autoScroll: true,
items: [{
xtype: "syno_fieldset",
title: _DT("service", "service_dl_bt_network_setting"),
labelWidth: 250,
synodefaults: {
width: 130
},
items: [{
xtype: "syno_numberfield",
name: "tcp_port",
fieldLabel: _DT("settings", "title_tcp_port"),
decimalPrecision: 0,
minValue: 1,
maxValue: 65535,
vtype: "port",
maxlength: 5,
validator: function(d) {
if (SYNO.SDS.Utils.isReservedPort("download", d, d)) {
return _DT("service", "error_dl_port_in_used")
} else {
return true
}
}
}, {
xtype: "syno_compositefield",
fieldLabel: _DT("service", "service_dl_bt_max_upload"),
width: 360,
items: [{
xtype: "syno_numberfield",
name: "max_upload_rate",
width: 130,
allowDecimals: false,
allowNegative: false,
minValue: 0,
maxlength: 6
}, {
xtype: "syno_displayfield",
value: "KB/s " + _DT("service", "service_dl_bt_rate_desc")
}]
}, {
xtype: "syno_compositefield",
fieldLabel: _DT("service", "service_dl_bt_max_download"),
width: 360,
items: [{
xtype: "syno_numberfield",
name: "max_download_rate",
width: 130,
allowDecimals: false,
allowNegative: false,
minValue: 0,
maxlength: 6
}, {
xtype: "syno_displayfield",
value: "KB/s " + _DT("service", "service_dl_bt_rate_desc")
}]
}, {
xtype: "syno_combobox",
fieldLabel: _DT("service", "service_dl_bt_encrypt"),
name: "encrypt",
store: c,
displayField: "display",
valueField: "value",
selectOnFocus: true
}, {
xtype: "syno_numberfield",
fieldLabel: _DT("service", "service_dl_bt_maxpeers"),
name: "max_peer",
minValue: 5,
maxValue: 10000
}, {
xtype: "syno_checkbox",
boxLabel: _DT("service", "service_dl_bt_dht_enable"),
name: "enable_dht"
}, {
xtype: "syno_numberfield",
fieldLabel: _DT("service", "service_dl_bt_dht_port"),
name: "dht_port",
vtype: "port",
decimalPrecision: 0,
minValue: 1,
maxValue: 65535,
indent: 1,
validator: function(d) {
if (SYNO.SDS.Utils.isReservedPort("download", d, d)) {
return _DT("service", "error_dl_port_in_used")
} else {
return true
}
}
}, {
xtype: "syno_checkbox",
boxLabel: _DT("service", "service_dl_bt_port_forwarding_enable"),
name: "enable_port_forwarding"
}]
}, {
xtype: "syno_fieldset",
title: _DT("service", "service_dl_bt_stoptask_opt"),
labelWidth: 250,
synodefaults: {
width: 130
},
items: [{
xtype: "syno_displayfield",
value: _DT("service", "service_dl_bt_stoptask_desc"),
name: "bt_stoptask_desc"
}, {
xtype: "syno_numberfield",
fieldLabel: _DT("service", "service_dl_bt_seeding_ratio"),
name: "seeding_ratio",
allowDecimals: false,
allowNegative: false,
minValue: 0,
maxValue: 2147483647,
maxlength: 10,
value: 0
}, {
xtype: "syno_compositefield",
items: [{
maskRe: /[\d]/,
xtype: "syno_combobox",
width: 200,
maxlength: 3,
fieldLabel: _DT("service", "service_dl_bt_seeding_interval"),
hiddenName: "seeding_interval",
store: SYNO.SDS.DownloadStation.DLM.Util.createSeedTimeStore(),
displayField: "display",
valueField: "value",
selectOnFocus: true,
value: 0,
initQuery: Ext.emptyFn,
setValue: function(e) {
SYNO.ux.ComboBox.prototype.setValue.apply(this, arguments);
var d = this;
var f = (("0" != e) && (-2 == e || -1 == d.store.data.keys.indexOf(e)));
d.setEditable(f);
d.nextSibling().setValue(f ? _T("service", "service_dl_bt_seedopt_unit_hours") : "");
if (-2 == e) {
d.setRawValue()
} else {
if (f && e > 0) {
d.setRawValue(e / 60)
}
}
},
listeners: {
scope: this,
blur: function(d) {
var e = d.getValue();
var f = (-2 == e || -1 == d.store.data.keys.indexOf(e));
if ("" === e || "0" === e) {
d.setValue(0)
} else {
if (f && e > 0) {
d.setValue(e * 60)
}
}
}
},
validator: function(e) {
if (-1 < this.store.findExact("display", e)) {
return true
}
var d = new RegExp("^[0-9]{0,5}$");
return d.test(e)
}
}, {
xtype: "syno_displayfield",
value: "",
isDirty: function() {
return false
}
}]
}, {
xtype: "syno_checkbox",
boxLabel: _DT("service", "service_dl_bt_seeding_auto_remove"),
name: "enable_seeding_auto_remove"
}]
}, {
xtype: "syno_fieldset",
title: _T("photo_viewer", "menu_preview"),
hidden: (true === SYNO.SDS.isNSM),
items: [{
xtype: "syno_checkbox",
boxLabel: _DT("settings", "bt_preview_enable"),
name: "enable_preview"
}]
}],
listeners: {
afterlayout: {
fn: function() {
new SYNO.ux.Utils.EnableCheckGroup(this.getForm(),"enable_dht",["dht_port"]);
var e = this.form.findField("bt_stoptask_desc");
if (Ext.isDefined(e)) {
SYNO.SDS.DownloadStation.Utils.AddTip(e.el, _DT("service", "service_dl_bt_seeding_hint"));
e.disabled = true
}
var d = this.form.findField("enable_port_forwarding");
if (Ext.isDefined(d)) {
SYNO.SDS.DownloadStation.Utils.AddTip(d.el, _DT("service", "service_dl_bt_port_forwarding_hint"))
}
},
scope: this,
single: true
}
}
};
Ext.apply(b, a);
return SYNO.LayoutConfig.fill(b)
},
defineBehaviors: function() {},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.BT"
},
getKeyName: function() {
return "bt"
},
postReturnData: function(a) {
this.gData.set(this.getKeyName(), a[0].data);
this.form.setValues(a[0].data);
this.appWin.tabPanel.enable_bt_preview = a[0].data.enable_preview
},
getFields: function() {
var a = ["tcp_port", "max_upload_rate", "max_download_rate", "encrypt", "max_peer", "enable_dht", "dht_port", "enable_port_forwarding", "seeding_ratio", "seeding_interval", "enable_seeding_auto_remove", "enable_preview"];
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.DLMFTP", {
extend: "SYNO.SDS.DownloadStation.Settings.FormPanel",
fillConfig: function(a) {
var b = {
autoScroll: true,
trackResetOnLoad: true,
labelWidth: 200,
border: false,
hideMode: "offsets",
items: [{
xtype: "syno_fieldset",
title: _DT("service", "service_dl_ftp_setting"),
items: [{
xtype: "syno_checkbox",
name: "enable_ftp_max_conn",
boxLabel: _DT("service", "service_enable_ftpconn")
}, {
xtype: "syno_numberfield",
fieldLabel: _DT("service", "service_ftpmaxconn"),
name: "ftp_max_conn",
minValue: 1,
maxValue: 65535,
allowNegative: false,
allowDecimals: false,
allowBlank: false,
indent: 1
}]
}, {
xtype: "syno_fieldset",
title: _DT("service", "service_dl_ftp_http_setting"),
items: [{
xtype: "syno_compositefield",
width: 400,
fieldLabel: _DT("service", "service_dl_max_download_per_task"),
items: [{
xtype: "syno_numberfield",
name: "ftp_http_max_download_rate",
minValue: 0,
maxlength: 6
}, {
xtype: "syno_displayfield",
value: "KB/s " + _DT("service", "service_dl_bt_rate_desc")
}]
}]
}],
listeners: {
afterlayout: {
fn: function() {
new SYNO.ux.Utils.EnableCheckGroup(this.getForm(),"enable_ftp_max_conn",["ftp_max_conn"])
},
scope: this,
single: true
}
}
};
Ext.apply(b, a);
return SYNO.LayoutConfig.fill(b)
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.FtpHttp"
},
getKeyName: function() {
return "ftp_http"
},
getFields: function() {
var a = ["enable_ftp_max_conn", "ftp_max_conn", "ftp_http_max_download_rate"];
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.DLMNZB", {
extend: "SYNO.SDS.DownloadStation.Settings.FormPanel",
fillConfig: function(a) {
var b = {
autoScroll: true,
trackResetOnLoad: true,
labelWidth: 200,
border: false,
hideMode: "offsets",
items: [{
xtype: "syno_fieldset",
title: _DT("service", "service_dl_nzb_setting"),
items: [{
xtype: "syno_displayfield",
value: _DT("service", "nzb_intro")
}, {
xtype: "syno_textfield",
fieldLabel: _DT("service", "nzb_server"),
name: "server",
vtype: "iporhostname",
maxLength: 4096
}, {
xtype: "syno_numberfield",
fieldLabel: _DT("service", "nzb_server_port"),
name: "port",
vtype: "port",
minValue: 1,
maxValue: 65535
}, {
xtype: "syno_checkbox",
boxLabel: _DT("service", "nzb_enable_ssl"),
name: "enable_encryption"
}, {
xtype: "syno_checkbox",
boxLabel: _DT("service", "nzb_server_need_auth"),
name: "enable_auth"
}, {
xtype: "syno_textfield",
fieldLabel: _DT("service", "nzb_user"),
name: "username",
allowBlank: false,
maxLength: 64,
indent: 1
}, {
xtype: "syno_textfield",
textType: "password",
fieldLabel: _DT("common", "password"),
name: "password",
maxLength: 32,
indent: 1
}, {
xtype: "syno_textfield",
textType: "password_confirm",
fieldLabel: _DT("service", "nzb_pass_confirm"),
name: "password_confirm",
maxlength: 4096,
indent: 1,
validator: (function(d) {
var c = this.form.findField("password").getValue();
if ((c != d) && (c != "12345678" || d != "87654321")) {
return _DT("service", "nzb_confirmpass")
}
return true
}
).createDelegate(this)
}, {
xtype: "syno_displayfield",
value: " "
}, {
xtype: "syno_numberfield",
fieldLabel: _DT("service", "nzb_max_connection"),
name: "conn_per_download",
minValue: 1,
maxValue: 65535,
maxLength: 5
}, {
xtype: "syno_compositefield",
width: 400,
fieldLabel: _DT("service", "service_dl_max_download_per_task"),
items: [{
xtype: "syno_numberfield",
name: "max_download_rate",
minValue: 0,
maxlength: 6
}, {
xtype: "syno_displayfield",
value: "KB/s " + _DT("service", "service_dl_bt_rate_desc")
}]
}, {
xtype: "syno_checkbox",
boxLabel: _DT("settings", "nzb_par2_repair_enable"),
name: "enable_parchive"
}, {
xtype: "syno_checkbox",
boxLabel: _DT("settings", "nzb_par2_remove_enable"),
name: "enable_remove_parfiles",
indent: 1
}]
}],
listeners: {
afterlayout: {
fn: function() {
new SYNO.ux.Utils.EnableCheckGroup(this.getForm(),"enable_auth",["username", "password", "password_confirm"]);
new SYNO.ux.Utils.EnableCheckGroup(this.getForm(),"enable_parchive",["enable_remove_parfiles"])
},
scope: this,
single: true
}
}
};
Ext.apply(b, a);
return SYNO.LayoutConfig.fill(b)
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.Nzb"
},
getKeyName: function() {
return "nzb"
},
postReturnData: function(a) {
var b;
b = a[0].data;
if (b.enable_auth) {
b.password = "12345678";
b.password_confirm = "87654321"
}
this.gData.set(this.getKeyName(), b);
this.form.setValues(b)
},
getFields: function() {
var a = ["server", "port", "enable_encryption", "enable_auth", "username", "password", "conn_per_download", "max_download_rate", "enable_parchive", "enable_remove_parfiles"];
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.DLMRSS", {
extend: "SYNO.SDS.DownloadStation.Settings.FormPanel",
fillConfig: function(a) {
var b = {
autoScroll: true,
trackResetOnLoad: true,
labelWidth: 200,
border: false,
hideMode: "offsets",
items: [{
xtype: "syno_fieldset",
title: _DT("download", "rss_feeds"),
items: [{
xtype: "syno_combobox",
fieldLabel: _DT("download", "update_interval"),
name: "update_interval",
store: this.createUpdateIntervalStore()
}]
}]
};
return Ext.apply(b, a)
},
createUpdateIntervalStore: function() {
var a = [10, 30, 60, 120, 240, 480, 720, 1440];
var b = [];
Ext.each(a, function(e, c, d) {
var g = "";
var f;
if (e < 60) {
g = _DT("service", "service_dl_bt_seedopt_unit_mins");
f = e
} else {
g = _DT("service", "service_dl_bt_seedopt_unit_hours");
f = e / 60
}
b.push([e, String.format("{0} {1}", f, g)])
}, this);
return b
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.Rss"
},
getKeyName: function() {
return "rss"
},
getFields: function() {
var a = ["update_interval"];
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.GridPanel", {
extend: "SYNO.ux.GridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.ownerCt = a.owner;
var b = Ext.applyIf(this.fillConfig(a), {
fbar: {
xtype: "statusbar",
defaultText: "&nbsp;",
statusAlign: "left",
buttonAlign: "left",
items: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
btnStyle: "blue",
text: _T("common", "apply"),
scope: this,
handler: function() {
this.settingsWin.actionFlag = "APPLY";
this.settingsWin.close()
},
disabled: _S("demo_mode"),
tooltip: _S("demo_mode") ? _JSLIBSTR("uicommon", "error_demo") : undefined
}, {
xtype: "syno_button",
text: _T("common", "cancel"),
scope: this,
handler: function() {
this.settingsWin.actionFlag = "CANCEL";
this.settingsWin.close()
}
})
}
});
this.callParent([b]);
this.addClass("syno-ux-formpanel");
this.defineBehaviors()
},
fillConfig: function(a) {
return a
},
activate: function() {
this.loadGrid()
},
isDirty: function() {
return this.getStore().getModifiedRecords().length > 0
},
isValid: function() {
return true
},
deactivate: function() {
return true
},
getPanel: function() {
return this
},
getAbsoluteURL: function(a) {
return String.format("{0}/{1}", this.jsConfig.jsBaseURL, a)
},
setStatus: function(d) {
d = d || {};
var c = this.getFooterToolbar();
if (c && Ext.isFunction(c.setStatus)) {
c.setStatus(d)
}
},
maskAppWin: function() {
var a = this.findWindow();
if (a && Ext.isDefined(a.maskForBusy)) {
a.maskForBusy()
}
},
unmaskAppWin: function() {
var a = this.findWindow();
if (a && Ext.isDefined(a.unmask)) {
a.unmask()
}
},
setStatusBusy: function(b) {
b = b || {};
Ext.applyIf(b, {
text: _T("common", "loading"),
iconCls: "syno-ux-statusbar-loading"
});
this.setStatus(b);
this.maskAppWin()
},
setStatusOK: function(b) {
b = b || {};
Ext.applyIf(b, {
text: _T("common", "setting_applied"),
iconCls: "syno-ux-statusbar-success",
clear: true
});
this.setStatus(b)
},
setStatusError: function(b) {
b = b || {};
Ext.applyIf(b, {
text: _T("common", "error_system"),
iconCls: "syno-ux-statusbar-error"
});
this.setStatus(b)
},
clearStatus: function(c) {
var d = this.getFooterToolbar();
if (d && Ext.isFunction(d.clearStatus)) {
d.clearStatus(c)
}
},
clearStatusBusy: function(a) {
this.clearStatus(a);
this.unmaskAppWin()
},
getWebAPISetData: function() {
return undefined
},
onSettingsApply: function() {
return true
},
getHelpParam: Ext.emptyFn,
enableCheckGroup: Ext.emptyFn,
defineBehaviors: Ext.emptyFn,
updateGrid: Ext.emptyFn,
loadGrid: Ext.emptyFn
});
Ext.ns("SYNO.SDS.DownloadStation.Uploader.HTML5Uploader");
Ext.define("SYNO.SDS.DownloadStation.Uploader.HTMLUploaderTaskMgr", {
extend: "Object",
taskList: Object.create(null),
taskUploadingIndex: 0,
constructor: function(a) {
this.uploader = a.uploader;
SYNO.SDS.DownloadStation.Uploader.HTMLUploaderTaskMgr.superclass.constructor.apply(this, arguments)
},
initTaskData: function() {
this.taskList = Object.create(null);
this.taskUploadingIndex = 0
},
getTaskSize: function() {
return this.taskList ? Object.keys(this.taskList).length : 0
},
getUploadingTaskIndex: function() {
return this.taskUploadingIndex
},
addUploadTask: function(a) {
this.taskList[this.getTaskSize()] = a
},
removeOneTask: function(b) {
var a = this.taskList[b];
if (a) {
if (a.status === "PROCESSING") {
if (this.uploader && this.uploader.conn) {
this.uploader.conn.abort(a.reqId)
}
this.blUploading = false;
if (this.uploader.clearFolderFiles) {
this.uploader.clearFolderFiles(a)
}
this.taskUploadingIndex++;
this.uploader.uploadNext()
}
a.file = null;
a.status = "CANCEL"
}
},
restartOneTask: function(b) {
var a = this.taskList[b];
if (a) {
this.uploader.addFiles([a.file], true, false, a.params, [a.dtItem], a.isDirectory);
this.removeOneTask(b)
}
}
});
Ext.define("SYNO.SDS.DownloadStation.Uploader.HTML5Uploader", {
extend: "Ext.Component",
MAX_POST_FILESIZE: (Ext.isWebKit) ? -1 : ((window.console && window.console.firebug) ? 20971521 : 4294963200),
FileObj: function(a, d, e, b) {
var c = SYNO.Util.copy(d || {});
if (a.lastModifiedDate) {
c = Ext.apply(c, {
mtime: a.lastModifiedDate.getTime()
})
}
return {
id: e,
file: a,
dtItem: b,
name: a.name || a.fileName,
size: a.size || a.fileSize,
progress: 0,
status: "NOT_STARTED",
params: c,
chunkmode: false
}
},
constructor: function(b, a) {
this.initDefData();
this.HTMLUploaderTask = new SYNO.SDS.DownloadStation.Uploader.HTMLUploaderTaskMgr({
uploader: this
});
Ext.apply(this.opts, b);
SYNO.SDS.DownloadStation.Uploader.HTML5Uploader.superclass.constructor.apply(this, arguments);
this.init(a)
},
initDefData: function() {
this.blAppenddata = false;
this.nbExceed = 0;
this.nbWrongType = 0;
this.arrFolder = [];
this.arrExceedFile = [];
this.arrWrongType = [];
this.arrBigFile = [];
this.objErrFiles = {};
this.nbErrFiles = 0;
this.opts = {
bldropBody: false,
instantStart: false,
chunkmode: false,
chunksize: 10485760,
filefiledname: "file",
params: {}
}
},
init: function(a) {
a.container.mon(this, a.opts.listeners);
this.initButtonEl(a.container, a.opts);
this.initDragDropEl(a.container, a.opts);
if (a.files) {
a.container.mon(a.container.owner, "show", function() {
this.dropFiles(a.files);
a.files = null
}, this, {
single: true
})
}
},
onMask: function(a) {
if (this.opts.dropcss) {
a.addClass(this.opts.dropcss)
}
a.addClass("file-drag-over");
a.mask(this.opts.droptext || _T("filetable", "drop_file"))
},
onUnmask: function(a) {
if (this.opts.dropcss) {
a.removeClass(this.opts.dropcss)
}
a.unmask();
a.removeClass("file-drag-over")
},
initButtonEl: function(b, a) {
var d = this;
if (Ext.isFunction(b.getForm)) {
var e = b.getForm().findField(this.opts.filefiledname);
if (e) {
var c = e.el;
if (c && c.is("input[type=file]")) {
this.textEl = b.getForm().findField("MultiText");
this.mon(c, "change", function() {
d.blFolderEabled = false;
d.addFiles.call(d, this.dom.files, true, false, undefined, undefined, false);
var g = this.dom
, f = g.disabled;
g.disabled = true;
g.value = "";
g.disabled = f
})
}
}
}
},
initDragDropEl: function(b, a) {
var c = (b.getXType() === "grid") ? b.getView().scroller : (b.getViewEl ? b.getViewEl() : b.el);
var d = this.opts.bldropBody ? (b.body || c) : c;
if (!d) {
return
}
b.mon(d, "dragover", function(f) {
if (SYNO.SDS.DownloadStation.Uploader.Utils.isDragFile(f.browserEvent)) {
if (!this.isDragMask) {
return
}
f.preventDefault();
f.stopPropagation();
f.browserEvent.dataTransfer.dropEffect = "copy";
this.dragstarttime = new Date().getTime()
}
}, this);
b.mon(Ext.getDoc(), "dragover", function(f) {
if (SYNO.SDS.DownloadStation.Uploader.Utils.isDragFile(f.browserEvent)) {
this.dragstarttime = new Date().getTime();
if (!this.isDragMask) {
if (!b.isVisible() || b.owner && b.owner.maskCnt >= 1 || b.el.isMasked() || (b.owner && b.owner.el.isMasked()) || (b.ownerCt && b.ownerCt && b.ownerCt.el.isMasked()) || (b.ownerCt && b.ownerCt.ownerCt && b.ownerCt.ownerCt.el.isMasked()) || Ext.getBody().hasClass("x-body-masked")) {
return false
}
if (false === this.fireEvent("onBeforeDragEnter", this, b, f)) {
return false
}
this.isDragMask = true;
if (!this.dragPollTask) {
this.dragPollTask = this.addTask({
interval: 300,
run: function() {
if (800 < new Date().getTime() - this.dragstarttime) {
this.onDragEnd(b, d)
}
},
scope: this
})
}
this.dragPollTask.start();
if (false === this.fireEvent("onDragEnter", this, b)) {
return false
}
this.onMask(d);
return
} else {
this.fireEvent("onDragOver", this, b)
}
}
}, this);
b.mon(Ext.getDoc(), "dragend", this.onDragEnd.createDelegate(this, [b, d], true));
b.mon(Ext.getDoc(), "drop", this.onDragEnd.createDelegate(this, [b, d], true));
b.mon(d, "drop", function(g) {
if (SYNO.SDS.DownloadStation.Uploader.Utils.isDragFile(g.browserEvent)) {
this.dragstarttime = undefined;
this.isDragMask = false;
if (false === this.fireEvent("onDrop", this, b)) {
return
}
this.onUnmask(d);
g.stopPropagation();
g.preventDefault();
g.stopEvent();
if (_S("demo_mode")) {
this.fireEvent("onError", this, _JSLIBSTR("uicommon", "error_demo"));
return
}
var f = g.browserEvent.dataTransfer;
if (f && f.files && f.files.length > 0) {
if (f.items && f.items[0] && f.items[0].webkitGetAsEntry) {
this.blFolderEabled = !!this.blFolderEabled && true
} else {
this.blFolderEabled = false
}
this.addFiles.call(this, f.files, false, false, null, f.items)
} else {
this.fireEvent("onError", this, _T("error", "upload_folder_error"))
}
}
}, this)
},
onDragEnd: function() {
if (this.dragPollTask && this.dragPollTask.running) {
this.dragPollTask.stop();
var b = arguments[arguments.length - 1];
var a = arguments[arguments.length - 2];
if (this.isDragMask && b.isMasked()) {
this.onUnmask(b)
}
this.isDragMask = false;
if (false === this.fireEvent("onDragEnd", this, a)) {
return false
}
}
},
initTaskData: function() {
this.HTMLUploaderTask.initTaskData()
},
checkDirectory: function(h, b) {
var c = h.file
, f = null;
if (b && b.getAsEntry) {
f = b.getAsEntry();
if (f) {
return f.isDirectory
}
} else {
if (b && b.webkitGetAsEntry) {
f = b.webkitGetAsEntry();
if (f) {
return f.isDirectory
}
} else {
if (Ext.isGecko) {
try {
var d;
if (!!(File && File.prototype.slice)) {
d = c.slice(0, 1)
} else {
if (!!(File && File.prototype.webkitSlice)) {
d = c.webkitSlice(0, 1)
} else {
if (!!(File && File.prototype.mozSlice)) {
d = c.mozSlice(0, 1)
} else {
return false
}
}
}
if (d && window.FileReader) {
var a = new FileReader();
a.readAsBinaryString(d)
}
} catch (g) {
return true
}
return false
} else {
if (Ext.isSafari) {
return false
}
}
}
}
return (c.size === 0)
},
addFiles: function(v, a, d, s, f, q, h) {
var t, p, o, n, g = [], u = [], m = f ? f : null;
if (!v || 0 === v.length) {
this.fireEvent("onError", this, _DT("download", "download_empty_input_file"));
return
}
if (h) {
this.blForceHtmlUpload = true
} else {
this.blForceHtmlUpload = false
}
if (!this.blAppenddata) {
this.initTaskData()
}
this.nbExceed = 0;
this.nbWrongType = 0;
this.objErrFiles = {};
this.nbErrFiles = 0;
this.arrExceedFile = [];
this.arrWrongType = [];
this.arrBigFile = [];
var e = 0;
var k;
var b = this.getTaskSize();
var c = [];
for (p = 0; p < v.length; p++) {
t = v[p];
n = t.name || t.fileName;
if (u[n] && false !== this.fireEvent("onNameDuplicate")) {
continue
}
var l;
u[n] = true;
if (t instanceof File) {
var r = (m && m[p]) ? m[p] : null;
if (r) {
r = (r.webkitGetAsEntry) ? r.webkitGetAsEntry() : r
}
l = new this.FileObj(t,s,null,r);
if (Ext.isBoolean(q)) {
if (Ext.isModernIE) {
l.isDirectory = (l.file.size === 0)
} else {
l.isDirectory = q
}
} else {
l.isDirectory = false;
if (m) {
for (o = p; o < m.length; o++) {
if (m[o] && m[o].getAsFile && m[o].getAsFile() === t) {
l.isDirectory = this.checkDirectory(l, m[o]);
break
}
}
} else {
l.isDirectory = this.checkDirectory(l)
}
}
c.push(l)
} else {
l = t;
if (s) {
Ext.apply(l.params, s)
}
}
if (false !== this.onSelect(l)) {
if (a) {
k = this.getTaskSize();
l.id = k;
if (false !== this.fireEvent("onSelect", this, l)) {
this.HTMLUploaderTask.addUploadTask(l)
}
} else {
g.push(l.name)
}
e++
}
}
if (false !== d && this.textEl) {
this.setInputFieldValue("")
}
k = this.getTaskSize();
if (a) {
if (this.textEl) {
this.setInputFieldValue(this.getDisplayTextCorrespondingToFileCounts(e))
}
this.onAllSelect(b, k)
} else {
if (e === 0) {
this.onAllSelect(b, k)
} else {
this.fireEvent("onBeforeDropfile", this, g, v, {
fn: this.dropFiles,
files: c,
scope: this
}, this.onAllSelectStr())
}
}
},
getDisplayTextCorrespondingToFileCounts: function(a) {
if (a <= 0) {
return ""
} else {
if (a === 1) {
return this.HTMLUploaderTask.taskList[0].name
} else {
return String.format(_DT("download", "download_files_selected"), a)
}
}
},
dropFiles: function(a, b) {
this.addFiles(a, true, true, b)
},
checkAllowFiletype: function(a) {
var c = this.opts.allowfilters;
if (!c || 0 === c.length) {
return true
}
var b = false;
Ext.each(c, function(d) {
if (SYNO.SDS.DownloadStation.Utils.isValidExtension(a, "." + d)) {
b = true;
return false
}
});
return b
},
onSelect: function(b) {
var a = Ext.util.Format.htmlEncode(b.name);
if (this.opts.limitSize && (b.size > this.opts.limitSize)) {
this.arrBigFile.push(a)
} else {
if (this.opts.limitFiles && ((this.getTaskSize() - this.HTMLUploaderTask.taskUploadingIndex) >= this.opts.limitFiles)) {
this.nbExceed++;
this.arrExceedFile.push(a)
} else {
if (!this.checkAllowFiletype(a)) {
this.nbWrongType++;
this.arrWrongType.push(a)
} else {
if (!this.blFolderEabled && b.isDirectory) {
this.arrFolder.push(a)
} else {
return true
}
}
}
}
return false
},
getTaskSize: function() {
return this.HTMLUploaderTask.getTaskSize()
},
onAllSelectStr: function(c) {
var d = ""
, a = c ? "<br>" : "";
var b = 0;
if (this.nbExceed) {
d += (1 == this.nbExceed) ? _T("common", "common_unselect_file") : _T("common", "common_unselect_files");
d += a;
if (1 < this.nbExceed) {
d = d.replace("_NFILES_", this.nbExceed)
}
this.nbExceed = 0;
this.arrExceedFile = []
}
if (this.arrBigFile && 0 < this.arrBigFile.length) {
d += _T("upload", "upload_exceed_maximum_filesize") + ": " + a;
for (b = 0; (b < this.arrBigFile.length && b < 5); b++) {
d += this.arrBigFile[b] + a
}
if (5 < this.arrBigFile.length) {
d += "..." + a
}
d += a;
this.arrBigFile = []
}
if (!this.blFolderEabled && this.arrFolder && 0 < this.arrFolder.length) {
d += _T("upload", Ext.isMac ? "no_folder_upload_action" : "upload_folder_error") + a;
for (b = 0; (b < this.arrFolder.length && b < 5); b++) {
d += this.arrFolder[b] + a
}
if (5 < this.arrFolder.length) {
d += "..." + a
}
this.arrFolder = []
}
if (this.nbWrongType) {
d += String.format(_T("upload", "wrong_files_format"), this.nbWrongType);
this.nbWrongType = 0;
this.arrWrongType = []
}
return d
},
onAllSelect: function(b, a) {
var c = this.onAllSelectStr(true);
if (c && c !== "") {
this.fireEvent("onError", this, c)
}
this.fireEvent("onAllSelect", this, b, a);
if (this.getTaskSize() && this.opts.instantStart) {
this.uploadNext.createDelegate(this).defer(10)
}
return true
},
onUploadFile: function(c) {
var b;
if (-1 !== this.MAX_POST_FILESIZE && c.size > this.MAX_POST_FILESIZE) {
this.onError(_T("error", "upload_too_large"), c);
return
}
b = this.prepareStartFormdata(c);
if (c.chunkmode) {
var d = this.opts.chunksize;
var a = Math.ceil(c.size / d);
this.onUploadPartailFile(b, c, {
start: 0,
index: 0,
total: a
})
} else {
this.sendArray(b, c)
}
},
prepareStartFormdata: function(d) {
var f;
var c;
if (this.opts.chunkmode || (-1 !== this.MAX_POST_FILESIZE && d.size > this.MAX_POST_FILESIZE)) {
d.chunkmode = true;
var e = "----html5upload-" + new Date().getTime().toString() + Math.floor(Math.random() * 65535).toString();
var a = "";
if (this.opts.params) {
for (c in this.opts.params) {
if (this.opts.params.hasOwnProperty(c)) {
a += "--" + e + '\r\nContent-Disposition: form-data; name="' + c + '"\r\n\r\n';
a += unescape(encodeURIComponent(this.opts.params[c])) + "\r\n"
}
}
}
if (d.params) {
for (c in d.params) {
if (d.params.hasOwnProperty(c)) {
a += "--" + e + '\r\nContent-Disposition: form-data; name="' + c + '"\r\n\r\n';
a += unescape(encodeURIComponent(d.params[c])) + "\r\n"
}
}
}
var b = unescape(encodeURIComponent(d.name));
a += "--" + e + '\r\nContent-Disposition: form-data; name="' + (this.opts.filefiledname || "file") + '"; filename="' + b + '"\r\nContent-Type: application/octet-stream\r\n\r\n';
return {
formdata: a,
boundary: e
}
}
f = new FormData();
if (this.opts.params) {
for (c in this.opts.params) {
if (this.opts.params.hasOwnProperty(c)) {
f.append(c, this.opts.params[c])
}
}
}
if (d.params) {
for (c in d.params) {
if (d.params.hasOwnProperty(c)) {
f.append(c, d.params[c])
}
}
}
return f
},
onUploadPartailFile: function(f, a, d, h) {
d.start = d.index * this.opts.chunksize;
var c = Math.min(this.opts.chunksize, a.size - d.start);
if (a.status !== "PROCESSING") {
return
}
var b;
if (!!(File && File.prototype.slice)) {
if ((1 > d.total) || (d.index === d.total - 1)) {
b = a.file.slice(d.start)
} else {
b = a.file.slice(d.start, d.start + c)
}
} else {
if (!!(File && File.prototype.webkitSlice)) {
if ((1 > d.total) || (d.index === d.total - 1)) {
b = a.file.webkitSlice(d.start)
} else {
b = a.file.webkitSlice(d.start, d.start + c)
}
} else {
if (!!(File && File.prototype.mozSlice)) {
if ((1 > d.total) || (d.index === d.total - 1)) {
b = a.file.mozSlice(d.start)
} else {
b = a.file.mozSlice(d.start, d.start + c)
}
} else {
if (!!(File && File.prototype.slice)) {
b = a.file.slice(d.start, c)
} else {
this.onError({}, a);
return
}
}
}
}
if (window.FileReader) {
var i = this;
var e = new FileReader();
var g = false;
if (!Ext.isFunction(e.readAsBinaryString)) {
g = true
}
e.onload = function(j) {
if (j.target.readyState == FileReader.DONE) {
i.sendArray(f, a, j.target.result, d, h)
}
}
;
e.onerror = function() {
i.onError(_DT("error", "error_privilege_not_enough"), a)
}
;
if (g) {
e.readAsArrayBuffer(b)
} else {
e.readAsBinaryString(b)
}
} else {
this.onError({}, a);
return
}
},
sendArray: function(q, d, g, l, s) {
if ("CANCEL" === d.status) {
return
}
var c = {};
var o = {};
var k;
if (true === d.chunkmode) {
o = {
"Content-Type": "multipart/form-data; boundary=" + q.boundary
};
c = {
"X-TYPE-NAME": "SLICEUPLOAD",
"X-FILE-SIZE": d.size,
"X-FILE-CHUNK-END": (1 > l.total) || (l.index === l.total - 1) ? "true" : "false"
};
if (s) {
Ext.apply(c, {
"X-TMP-FILE": s
})
}
if (window.XMLHttpRequest.prototype.sendAsBinary) {
var r = q.formdata + ("" !== g ? g : "") + "\r\n--" + q.boundary + "--\r\n";
k = r
} else {
if (window.Blob) {
var h = 0
, f = 0
, b = 0;
var a = "\r\n--" + q.boundary + "--\r\n";
var n = q.formdata.length + a.length;
var e;
if (!Ext.isString(g)) {
b = (new Uint8Array(g)).byteLength
} else {
b = g.length
}
n += b;
e = new Uint8Array(n);
for (h = 0; h < q.formdata.length; h++) {
e[h] = q.formdata.charCodeAt(h)
}
if (!Ext.isString(g)) {
e.set(new Uint8Array(g), h)
} else {
for (f = 0; f < g.length; f++) {
e[h + f] = g.charCodeAt(f)
}
}
h += b;
for (f = 0; f < a.length; f++) {
e[h + f] = a.charCodeAt(f)
}
k = e
} else {
var p;
if (window.MSBlobBuilder) {
p = new window.MSBlobBuilder()
} else {
if (window.BlobBuilder) {
p = new window.BlobBuilder()
}
}
p.append(q.formdata);
if ("" !== g) {
p.append(g)
}
p.append("\r\n--" + q.boundary + "--\r\n");
k = p.getBlob();
p = null
}
}
} else {
q.append("size", d.size);
if (d.name) {
q.append(this.opts.filefiledname, d.file, d.name)
} else {
q.append(this.opts.filefiledname, d.file)
}
k = q
}
this.conn = new Ext.data.Connection({
method: "POST",
url: this.url,
defaultHeaders: o,
timeout: null
});
var m = this.conn.request({
headers: c,
html5upload: true,
chunkmode: d.chunkmode,
uploadData: k,
success: this.onSuccess.createDelegate(this, [q, d, l], true),
failure: this.onFail.createDelegate(this, [d], true),
progress: this.onProgress.createDelegate(this, [d, d.chunkmode ? l.start : 0], true)
});
d.reqId = m;
if (d.isSubFile && d.rootObj) {
d.rootObj.reqId = m
}
k = null
},
onProgress: function(d, c, b) {
if (d.lengthComputable) {
c.size = c.size || 0;
var a = Math.min(c.size, b + d.loaded);
this.fireEvent("onProgress", this, c, a, c.size)
}
},
onSuccess: function(b, c, e, g, a) {
var d = SYNO.SDS.DownloadStation.Utils.parseJsonData(b.responseText);
if (d.success) {
if (true === g.chunkmode && a.index < a.total - 1) {
var f = d.tmpfile || d.data.tmpfile;
if (!f || "" === f) {
this.onError({}, g);
return
}
a.index++;
this.onUploadPartailFile(e, g, a, f);
return
}
this.onFinish(d, g)
} else {
this.onError(d, g)
}
},
onFinishFolderTask: function(a, b) {
var c = this.HTMLUploaderTask.taskList[b.id];
b.file = null;
c.finishedFile = (b.isSubFile) ? c.finishedFile + 1 : c.finishedFile;
if (c.status !== "CANCEL") {
this.sendNextFile(b)
}
if (c.finishedFile != c.fileNum) {
return
}
b.rootObj.status = (b.rootObj.errors) ? "FAIL" : "SUCCESS";
this.HTMLUploaderTask.taskUploadingIndex++;
this.HTMLUploaderTask.blUploading = false;
this.fireEvent("onComplete", this, a, b);
this.uploadNext()
},
onFinish: function(a, b) {
if (b.isSubFile || b.isSubFolder) {
this.fireEvent("onCompleteFolderFile", this, a, b);
this.onFinishFolderTask(a, b);
return
}
this.HTMLUploaderTask.taskUploadingIndex++;
this.HTMLUploaderTask.blUploading = false;
b.status = "SUCCESS";
this.fireEvent("onComplete", this, a, b);
b.file = null;
this.uploadNext()
},
onError: function(c, d) {
var b = d.isSubFile
, a = d.isSubFolder;
if (!b && !a) {
this.HTMLUploaderTask.taskUploadingIndex++;
this.HTMLUploaderTask.blUploading = false;
d.status = "FAIL"
}
var e = SYNO.SDS.DownloadStation.Utils.getErrorString(c ? c.error.code : undefined);
if (this.blAppenddata) {
this.fireEvent("onError", this, e)
} else {
this.nbErrFiles++;
if (this.objErrFiles[e]) {
this.objErrFiles[e].push(d)
} else {
this.objErrFiles[e] = [d]
}
}
if (a) {
this.sendNextFile(d);
return
} else {
if (b) {
this.onFinishFolderTask(c, d);
return
}
}
this.uploadNext()
},
onFail: function(a, b, d) {
var c = SYNO.SDS.DownloadStation.Utils.parseJsonData(a.responseText);
this.onError(c, d)
},
onAllDone: function() {
this.setInputFieldValue("");
if (!this.blAppenddata && this.getServerErrorCount() > 0) {
this.fireEvent("onError", this, this.generateIntegratedErrorMsg());
this.objErrFiles = {}
}
this.fireEvent("onAllDone", this)
},
getServerErrorCount: function() {
return this.nbErrFiles
},
generateIntegratedErrorMsg: function() {
var b;
if (this.HTMLUploaderTask.taskUploadingIndex === 1) {
for (b in this.objErrFiles) {
if (this.objErrFiles.hasOwnProperty(b)) {
return b
}
}
}
var d = "", c, a;
d += String.format(_T("download", "download_upload_erro_files"), this.nbErrFiles);
for (b in this.objErrFiles) {
if (this.objErrFiles.hasOwnProperty(b)) {
c = this.objErrFiles[b];
d += "<br>" + b;
for (a = 0; a < c.length; a++) {
d += "<br>" + Ext.util.Format.htmlEncode(c[a].name)
}
}
}
return d
},
uploadNext: function() {
if (true === this.HTMLUploaderTask.blUploading) {
return
}
if (false === this.fireEvent("onBeforeSubmit", this)) {
return
}
var c, a;
var b = this.getTaskSize();
for (a = this.HTMLUploaderTask.taskUploadingIndex; a < b; a++) {
c = this.HTMLUploaderTask.taskList[a];
if (c && c.status === "NOT_STARTED") {
this.HTMLUploaderTask.blUploading = true;
c.status = "PROCESSING";
this.fireEvent("onOpen", this, c);
this.onSendFile(c);
break
}
this.HTMLUploaderTask.taskUploadingIndex++
}
if (a >= b) {
this.onAllDone()
}
},
onSendFile: function(a) {
this.onUploadFile(a)
},
onSubmit: function() {
if (this.HTMLUploaderTask.taskUploadingIndex >= this.getTaskSize()) {
this.fireEvent("onError", this, _DT("download", "download_empty_input_file"));
return
}
this.uploadNext()
},
setInputFieldValue: function(a) {
if (this.textEl && !this.textEl.isDestroyed) {
this.textEl.setValue(a)
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.Uploader.HTMLUploader");
Ext.define("SYNO.SDS.DownloadStation.Uploader.HTMLUploader", {
extend: "SYNO.SDS.DownloadStation.Uploader.HTML5Uploader",
init: function(a) {
a.container.mon(this, a.opts.listeners)
},
onAllSelect: function() {
SYNO.SDS.DownloadStation.Uploader.HTMLUploader.superclass.onAllSelect.apply(this, arguments);
this.initTaskData()
},
onSuccess: function(a, b) {
this.fireEvent("onComplete", a, b.result);
this.fireEvent("onAllDone", this)
},
onFailure: function(a, b) {
this.fireEvent("onError", this, SYNO.SDS.DownloadStation.Utils.getErrorString(b.result.error.code));
this.fireEvent("onAllDone", this)
},
onSubmit: function(a) {
if (false !== this.fireEvent("onBeforeSubmit", this)) {
var b = a.getForm().findField(this.opts.filefiledname).getValue();
if (b === "") {
this.fireEvent("onError", this, _DT("download", "download_empty_input_file"));
return
} else {
if (!this.checkAllowFiletype(b)) {
this.fireEvent("onError", this, _T("download", "download_error_wrong_file_format"));
return
}
}
a.getForm().doAction("apply", {
scope: this,
success: this.onSuccess,
failure: this.onFailure
})
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.Uploader");
SYNO.SDS.DownloadStation.Uploader.Utils = {};
SYNO.SDS.DownloadStation.Uploader.Utils = Ext.apply({
getButtonTemplate: function(a) {
if (SYNO.SDS.DownloadStation.Uploader.Utils.isSupportHTML5Upload()) {
var b = Ext.id();
return {
itemId: "htmlfield",
name: "htmlfield",
synotype: "indent",
xtype: "syno_compositefield",
hideMode: "display",
fieldLabel: _T("download", "download_lbl_input_file"),
defaults: {
hideLabel: true
},
items: [{
xtype: "syno_textfield",
readOnly: true,
name: "MultiText",
width: 205
}, {
xtype: "syno_button",
text: _T("download", "upload_browse"),
handler: function(c, d) {
d.preventDefault();
Ext.fly(b).dom.click()
}
}, Ext.apply({
itemId: "htmlfield",
xtype: "textfield",
hideMode: "display",
inputType: "file",
autoCreate: {
id: b,
tag: "input",
type: "file",
multiple: "multiple",
style: "width:1px;height:1px;z-index:-1;opacity: 0;filter:alpha(opacity=0);"
}
}, a || {})]
}
} else {
return Ext.apply({
itemId: "htmlfield",
name: "htmlfield",
xtype: "syno_filebutton",
fieldLabel: _T("download", "download_lbl_input_file"),
buttonOnly: false,
buttonMargin: 5,
listeners: {
afterrender: function(c) {
this.updateFileInputStyle.defer(500, c)
}
}
}, a || {})
}
}
}, SYNO.SDS.HTML5Utils);
Ext.define("SYNO.SDS.DownloadStation.Uploader.Uploader", {
extend: "Ext.util.Observable",
constructor: function(a) {
Ext.apply(this, a);
this.addEvents("beforedrop");
SYNO.SDS.DownloadStation.Uploader.Uploader.superclass.constructor.call(this, a)
},
init: function(a) {
this.container = a;
this.generateUploadOpts();
a.mon(a, "afterlayout", this.initUploader, this, {
single: true
})
},
generateUploadOpts: function() {
this.opts = Ext.apply({
limitSize: 2147482624,
limitFiles: 100,
startId: "",
url: "",
listeners: this.getUploadListeners()
}, this.getOpts());
this.htmlopts = Ext.apply({
dropcss: "file-drop-curved",
droptext: _DT("filetable", "drop_file"),
instantStart: false,
bldropBody: false,
listeners: {
scope: this,
onBeforeDropfile: this.onBeforeDropfile
}
}, this.getHTML5Opts())
},
getOpts: function() {
return {}
},
getHTML5Opts: function() {
return {}
},
getUploadListeners: function() {
return {
scope: this.container,
onBeforeSubmit: this.onBeforeSubmit,
onAllSelect: this.onAllSelect,
onComplete: this.onComplete,
onAllDone: this.onAllDone,
onError: this.onError,
onErrorStr: this.onErrorStr
}
},
formWebAPIUrl: function(b) {
var a = "webapi/entry.cgi/";
if (Ext.isDefined(b)) {
a += b
}
return a
},
initUploader: function(a) {
if (this.opts.startId) {
var b = Ext.getCmp(this.opts.startId);
if (b) {
a.mon(b, "click", function(c) {
this.onSubmit(a)
}, this)
}
}
if (SYNO.SDS.DownloadStation.Uploader.Utils.isSupportHTML5Upload()) {
this.initHTML5Uploader(a);
this.uploader.on("onApplyWebAPIParamsIntoRequest", this.applyFormDataForHTML5Uploader, this)
} else {
this.initHTMLUploader(a);
this.uploader.on("onApplyWebAPIParamsIntoRequest", this.applyFormDataForHTMLUploader, a)
}
},
initHTML5Uploader: function(a) {
if (!this.uploader) {
this.uploader = new SYNO.SDS.DownloadStation.Uploader.HTML5Uploader(Ext.apply({
limitSize: this.opts.limitSize,
limitFiles: this.opts.limitFiles
}, this.htmlopts || {}),{
container: a,
opts: this.opts,
files: this.files
})
}
},
initHTMLUploader: function(a) {
if (!this.uploader) {
this.uploader = new SYNO.SDS.DownloadStation.Uploader.HTMLUploader(Ext.apply({
limitSize: this.opts.limitSize
}, this.htmlopts || {}),{
container: a,
opts: this.opts
})
}
},
onSubmit: function(a) {
this.uploader.onSubmit(a)
},
applyFormDataForHTML5Uploader: function(b) {
var a = Ext.apply(this.getWebAPIInfoForHTML5Uploader.call(this.container), this.getWebAPIParamsForHTML5Uploader.call(this.container));
Ext.apply(b.opts.params, a)
},
getWebAPIInfoForHTML5Uploader: function() {
return {
api: this.getWebAPIName(),
method: this.getWebAPIMethod(),
version: this.getWebAPIVersion()
}
},
getWebAPIParamsForHTML5Uploader: Ext.emptyFn,
applyFormDataForHTMLUploader: Ext.emptyFn,
onBeforeSubmit: Ext.emptyFn,
onAllSelect: Ext.emptyFn,
onComplete: Ext.emptyFn,
onAllDone: Ext.emptyFn,
onError: Ext.emptyFn,
onErrorStr: Ext.emptyFn,
onBeforeDropfile: function(d, c, b, a) {
if (this.fireEvent("beforedrop", d, b) !== false) {
a.fn.apply(a.scope, [a.files])
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.FileUploader", {
extend: "SYNO.SDS.DownloadStation.Uploader.Uploader",
getOpts: function() {
return {
limitSize: this.container.ADD_MAXSIZE || 104857600,
limitFiles: this.container.ADD_MAXLIMIT || 50,
startId: this.startId
}
},
getHTML5Opts: function() {
return {
url: this.formWebAPIUrl(this.api),
allowfilters: this.container.ALLOWFILTERS,
filefiledname: this.container.FILEFILEDNAME
}
},
onBeforeSubmit: function(a) {
a.fireEvent("onApplyWebAPIParamsIntoRequest", a)
},
onComplete: function(b, a) {
this.module.afterActionHandler();
this.owner.onCloseHandler()
},
onError: function(b, a, c) {
this.owner.setStatusError({
text: a,
clear: true
})
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.DLMFileHosting", {
extend: "SYNO.SDS.DownloadStation.Settings.GridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
var b = this.getConfig(a);
this.callParent([b]);
this.defineBehaviors()
},
getConfig: function(a) {
this.webapiDelete = {
api: "SYNO.DownloadStation2.Settings.FileHosting",
method: "delete",
version: 2
};
this.updateBtnTask = new Ext.util.DelayedTask(this.updateBtn,this);
this.enableColumn = new SYNO.ux.SDS.DownloadStation.Settings.EnableColumn({
header: _DT("common", "enabled"),
dataIndex: "enabled",
enableFastSelectAll: true,
align: "center",
width: 90,
isIgnore: function(f, c) {
var d = c.get("can_be_disabled");
var e = Ext.isEmpty(d) ? true : d;
return !e
},
renderer: function(i, f, d) {
var e = d.get("can_be_disabled");
var h = Ext.isEmpty(e) ? true : e;
var g = (!h ? "disabled-checked" : ("gray" === i ? "grayed" : i ? "checked" : "unchecked"))
, c = (g === "grayed") ? "mixed" : (g === "checked")
, j = (d) ? d.id + "_" + this.dataIndex : Ext.id();
f = f || {};
f.attr = 'aria-labelledby="' + j + '" for="' + j + '"';
return String.format('<div class="syno-ux-grid-enable-column-{0}" aria-label="' + this.orgHeader + '" role="checkbox" aria-checked="{1}" tabIndex="-1" id="{2}"></div>', g, c, j)
}
});
this.store = this.createStore();
this.cm = this.createColModel();
this.sm = this.createSelectionModel();
var b = {
border: false,
enableHdMenu: false,
autoExpandColumn: "description",
tbar: {
defaults: {
xtype: "syno_button",
scope: this
},
items: [{
text: _T("common", "add"),
itemId: "upload",
handler: this.addHandler
}, {
text: _T("common", "alt_edit"),
itemId: "edit",
disabled: true,
handler: this.editHandler
}, {
text: _DT("common", "delete"),
itemId: "delete",
disabled: true,
handler: this.deleteHandler
}, "->", {
xtype: "syno_textfilter",
emptyText: _DT("common", "filter_label_text"),
store: this.store,
localFilter: true,
localFilterField: "displayname"
}]
},
colModel: this.cm,
selModel: this.sm,
store: this.store,
plugins: [this.enableColumn],
listeners: {
scope: this,
rowdblclick: function(c, f, d) {
this.editHandler()
}
}
};
return Ext.apply(b, a)
},
defineBehaviors: function() {
var a = this.getTopToolbar();
this.btnDelete = a.getComponent("delete");
this.btnEdit = a.getComponent("edit")
},
createStore: function() {
var a = new SYNO.API.Store({
api: "SYNO.DownloadStation2.Settings.FileHosting",
method: "list",
version: 2,
autoDestory: true,
autoLoad: true,
appWindow: this,
sortInfo: {
field: "name",
direction: "ASC"
},
reader: new Ext.data.JsonReader({
idProperty: "name",
fields: [{
name: "description",
convert: this.descriptionConverter
}, {
name: "enabled"
}, {
name: "name"
}, {
name: "type"
}, {
name: "displayname"
}, {
name: "version"
}, {
name: "removable"
}, {
name: "username"
}, {
name: "valid"
}, {
name: "auth_needed"
}, {
name: "can_be_disabled"
}, {
name: "experimental"
}]
}),
listeners: {
scope: this,
beforeload: function() {
this.setStatusBusy({
text: _T("common", "loading")
})
},
load: function() {
this.clearStatusBusy()
}
}
});
return a
},
descriptionConverter: function(b, a) {
var c = b;
if (true === a.experimental) {
c = c + " (" + _DT("common", "experimental") + ")"
}
return c
},
descriptionRenderer: function(f, b, d, e, h, g) {
var i = Ext.util.Format.htmlEncode(d.json.description);
var c = '<font ext:qtip="' + Ext.util.Format.htmlEncode(i) + '">' + i + "</font>";
if (true === d.get("experimental")) {
var a = Ext.util.Format.htmlEncode(_DT("common", "experimental"));
c += '<font style="color: #96A0AA" ext:qtip="' + Ext.util.Format.htmlEncode(Ext.util.Format.htmlEncode(_DT("common", "experimental_plugin_desc"))) + '"> (' + a + ")</font>"
}
return c
},
tooltipRenderer: function(f, b, a, g, e, c) {
var d = Ext.util.Format.htmlEncode(f);
b.attr += 'ext:qtip="' + Ext.util.Format.htmlEncode(d) + '"';
return d
},
createColModel: function() {
var a = new Ext.grid.ColumnModel({
defaultSortable: true,
columns: [this.enableColumn, {
header: _T("service", "service_host_name"),
dataIndex: "displayname",
width: 100,
renderer: this.tooltipRenderer,
scope: this
}, {
header: _DT("server", "title_server_desc"),
dataIndex: "description",
id: "description",
renderer: this.descriptionRenderer,
scope: this
}, {
header: _DT("download", "download_auth_user"),
dataIndex: "username",
id: "username",
renderer: this.tooltipRenderer,
scope: this
}, {
header: _DT("service", "service_host_version"),
dataIndex: "version",
width: 100
}]
});
return a
},
createSelectionModel: function() {
var a = new Ext.grid.RowSelectionModel({
listeners: {
scope: this,
selectionchange: function() {
this.updateBtnTask.delay(100)
}
}
});
return a
},
updateBtn: function() {
var c = this.getSelectionModel().getSelections();
var b = false
, a = false;
if (1 === c.length && c[0].get("auth_needed")) {
b = true
}
if (0 < c.length) {
a = true
}
this.btnEdit.setDisabled(!b);
this.btnDelete.setDisabled(!a)
},
addHandler: function() {
var a = new SYNO.SDS.DownloadStation.Settings.AddFileHostingDialog({
owner: this.owner,
module: this
});
a.load()
},
editHandler: function() {
var b = this.getSelectionModel().getSelections();
if (1 !== b.length) {
return
}
if (Ext.isEmpty(b[0].get("auth_needed")) || !b[0].get("auth_needed")) {
return
}
var a = new SYNO.SDS.DownloadStation.Settings.EditFileHostingDialog({
owner: this.owner,
fileHostingGridPanel: this,
uicomponents: this.uicomponents,
hostData: b[0].data
});
a.show()
},
deleteHandler: function() {
var d = this.getSelectionModel().getSelections();
var b = [];
if (0 === d.length) {
return
}
for (var a = 0; a < d.length; a++) {
var c = d[a].data;
if (!c.removable) {
this.owner.getMsgBox().alert(_DT("tree", "leaf_downloadtask"), _DT("download", "user_filehosting_undelete"));
return
}
b.push({
hostname: c.name,
type: c.type
})
}
this.owner.getMsgBox().confirm(_DT("tree", "leaf_downloadtask"), _DT("download", "delete_filehosting_confirm"), function(e) {
if ("yes" !== e) {
return
}
this.setStatusBusy({
text: _T("common", "saving")
});
SYNO.API.Request({
webapi: Ext.apply(this.webapiDelete, {
params: {
host: b
}
}),
callback: function(i, g, h, f) {
this.clearStatusBusy();
if (i) {
this.store.reload();
return
}
this.owner.getMsgBox().alert(_T("tree", "leaf_downloadtask"), _T("error", "error_system_busy"));
this.store.reload()
},
scope: this
})
}, this)
},
isDirty: function() {
var a = this.store.getModifiedRecords();
if (0 === a.length) {
return false
}
return true
},
getPanel: function() {
return this
},
afterActionHandler: function() {
this.store.reload()
},
onSettingsApply: function() {
var a = this.store.getModifiedRecords();
var b = [];
for (var c = 0; c < a.length; c++) {
var d = {
api: "SYNO.DownloadStation2.Settings.FileHosting",
method: "set",
version: 2,
params: {
hostname: a[c].get("name"),
type: a[c].get("type"),
enabled: a[c].get("enabled")
}
};
b.push(d)
}
this.setStatusBusy({
text: _T("common", "saving")
});
this.sendWebAPI({
compound: {
stopwhenerror: false,
params: b
},
callback: function(f, e) {
this.clearStatusBusy();
if (!f || e.has_fail) {
this.owner.getMsgBox().alert(_T("tree", "leaf_downloadtask"), _T("error", "error_system_busy"));
return false
}
return true
},
scope: this
});
return true
}
});
Ext.define("SYNO.SDS.DownloadStation.Settings.EditFileHostingDialog", {
extend: "SYNO.SDS.ModalWindow",
FAKE_PASSWORD: "12345678",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
var b = this.fillConfig(a);
this.callParent([b]);
this.defineBehaviors()
},
fillConfig: function(a) {
this.webapiSet = {
api: "SYNO.DownloadStation2.Settings.FileHosting",
method: "set",
version: 2
};
this.webapiVerify = {
api: "SYNO.DownloadStation2.Settings.FileHosting",
method: "verify",
version: 2
};
var c = this.createForm(a);
var b = {
owner: a.owner,
cls: "syno-dl-win",
width: 510,
height: 180,
minWidth: 100,
minHeight: 120,
collapsible: false,
autoScroll: false,
constrainHeader: true,
monitorResize: true,
layout: "fit",
items: [c],
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
btnStyle: "blue",
text: _DT("common", "ok"),
scope: this,
handler: this.applyHandler,
disabled: _S("demo_mode"),
tooltip: _S("demo_mode") ? _JSLIBSTR("uicommon", "error_demo") : undefined
}, {
xtype: "syno_button",
text: _T("common", "cancel"),
scope: this,
handler: function() {
this.closeHandler(false)
}
}),
listeners: {
scope: this,
beforeshow: this.onBeforeShow,
show: this.onAfterShow
}
};
Ext.apply(b, a);
return b
},
createForm: function(a) {
var c = [{
xtype: "syno_compositefield",
hideLabel: false,
fieldLabel: _DT("download", "download_auth_user"),
width: 300,
items: [{
xtype: "syno_textfield",
name: "username",
width: 157,
tabIndex: 1,
listeners: {
scope: this,
change: this.clearFakePassword
}
}, {
xtype: "syno_button",
text: _DT("settings", "btn_verify_account"),
disabled: _S("demo_mode"),
tooltip: _S("demo_mode") ? _JSLIBSTR("uicommon", "error_demo") : "",
scope: this,
handler: this.VerifyAccountHandler
}]
}, {
xtype: "syno_compositefield",
hideLabel: false,
fieldLabel: _T("common", "password"),
width: 300,
items: [{
xtype: "syno_textfield",
textType: "password",
name: "password",
width: 157,
tabIndex: 2,
listeners: {
scope: this,
focus: this.clearFakePassword
}
}]
}];
var b = {
items: c,
itemId: "editformpanel",
labelAlign: "left",
trackResetOnLoad: true,
border: false,
labelWidth: 161,
padding: 0
};
b = Ext.apply(b, a);
return new SYNO.ux.FormPanel(b)
},
onBeforeShow: function() {
this.setTitle(_DT("common", "alt_edit") + " " + this.hostData.displayname);
if (!Ext.isEmpty(this.hostData.username)) {
this.form.setValues({
username: this.hostData.username,
password: this.FAKE_PASSWORD
})
}
},
onAfterShow: function() {
if (Ext.isEmpty(this.hostData.username)) {
this.form.findField("username").focus(false, 500)
}
},
checkValid: function(a) {
var c = Ext.isEmpty(this.fieldUsername.getValue());
var b = Ext.isEmpty(this.fieldPassword.getValue());
if (!a && c && b) {
this.setStatusError({
text: _DT("download", "download_msg_invalid_user")
});
return false
}
if (!c && b) {
this.setStatusError({
text: _DT("common", "error_empty_password")
});
return false
}
if (c && !b) {
this.setStatusError({
text: _DT("download", "download_msg_invalid_user")
});
return false
}
return true
},
applyHandler: function() {
if (!this.checkValid(true)) {
return
}
if (!this.form.isDirty()) {
this.close();
return
}
this.setStatusBusy({
text: _T("common", "saving")
});
SYNO.API.Request({
webapi: Ext.apply(this.webapiSet, {
params: {
hostname: this.hostData.name,
type: this.hostData.type,
username: this.fieldUsername.getValue(),
password: this.fieldPassword.getValue()
}
}),
callback: function(d, b, c, a) {
this.clearStatusBusy();
if (d) {
this.closeHandler(true);
return
}
this.setStatusError({
text: this.getErrorMessage(b.code)
})
},
scope: this
})
},
getErrorMessage: function(a) {
return _T("error", "error_system_busy")
},
closeHandler: function(a) {
if (a) {
this.fileHostingGridPanel.store.reload()
}
this.close()
},
VerifyAccountHandler: function() {
if (!this.checkValid(false)) {
return
}
var a = {
hostname: this.hostData.name,
type: this.hostData.type,
username: this.fieldUsername.getValue()
};
if (!this.isFakePasswordPresent()) {
a.password = this.fieldPassword.getValue()
}
this.setStatusBusy({
text: _DT("settings", "verifying_account")
});
SYNO.API.Request({
webapi: Ext.apply(this.webapiVerify, {
params: a
}),
callback: function(g, e, f, d) {
this.clearStatusBusy();
var b = _DT("common", "error_system");
var c = "";
if (g && !Ext.isEmpty(e.status)) {
switch (e.status) {
case 0:
b = _DT("login", "error_cantlogin");
break;
case 1:
c = _DT("settings", "verify_free");
break;
case 2:
c = _DT("settings", "verify_premium");
break;
default:
break
}
}
if (!Ext.isEmpty(c)) {
this.setStatusOK({
text: c
})
} else {
this.setStatusError({
text: b
})
}
return
},
scope: this
})
},
defineBehaviors: function() {
this.form = this.get("editformpanel").form;
this.fieldUsername = this.form.findField("username");
this.fieldPassword = this.form.findField("password")
},
isFakePasswordPresent: function() {
return this.FAKE_PASSWORD === this.fieldPassword.originalValue
},
clearFakePassword: function() {
if (this.isFakePasswordPresent()) {
this.fieldPassword.originalValue = "";
this.fieldPassword.setValue("")
}
}
});
Ext.define("SYNO.SDS.DownloadStation.Settings.AddFileHostingDialog", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.submitBtnId = Ext.id();
var b = {
owner: a.owner,
cls: "syno-dl-win",
width: 565,
height: 184,
shadow: true,
minWidth: 100,
minHeight: 100,
collapsible: false,
autoScroll: false,
constrainHeader: true,
plain: true,
monitorResize: true,
title: _DT("settings", "add_filehosting_template"),
layout: "fit",
items: [this.createFormPanel(a)],
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
id: this.submitBtnId,
text: _DT("common", "addto"),
btnStyle: "blue",
disabled: _S("demo_mode"),
tooltip: _S("demo_mode") ? _JSLIBSTR("uicommon", "error_demo") : ""
}, {
text: _T("common", "alt_cancel"),
handler: this.onCloseHandler,
scope: this
}),
keys: [{
key: [10, 13],
fn: this.onSubmit,
scope: this
}, {
key: 27,
fn: this.onCloseHandler,
scope: this
}]
};
Ext.apply(b, a);
return b
},
createFormPanel: function(a) {
return new SYNO.SDS.DownloadStation.Settings.AddFileHostingForm({
owner: this,
module: a.module,
files: a.files,
submitBtnId: this.submitBtnId
})
},
onCloseHandler: function() {
this.close()
},
load: function() {
this.show()
}
});
Ext.define("SYNO.SDS.DownloadStation.Settings.AddFileHostingForm", {
extend: "SYNO.API.Form.FormPanel",
ADD_MAXLIMIT: 1,
ADD_MAXSIZE: 104857600,
FILEFILEDNAME: "plugin",
ALLOWFILTERS: ["host"],
constructor: function(a) {
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
var c = new SYNO.SDS.DownloadStation.Settings.FileUploader({
api: this.getWebAPIName(),
files: a.files,
startId: a.submitBtnId
});
var b = {
api: this.getWebAPIName(),
method: this.getWebAPIMethod(),
version: this.getWebAPIVersion(),
xtype: "syno_formpanel",
fileUpload: true,
itemId: "formpanel",
labelAlign: "left",
trackResetOnLoad: true,
waitMsgTarget: true,
border: false,
labelWidth: 161,
plugins: [c],
items: [SYNO.SDS.DownloadStation.Uploader.Utils.getButtonTemplate({
name: this.FILEFILEDNAME
}), {
xtype: "syno_displayfield",
value: "( eg. filehosting.host)"
}]
};
Ext.apply(b, a);
return b
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.FileHosting"
},
getWebAPIMethod: function() {
return "create"
},
getWebAPIVersion: function() {
return 2
}
});
Ext.define("SYNO.ux.SDS.DownloadStation.Settings.EnableColumn", {
extend: "SYNO.ux.EnableColumn",
onBoxClick: function() {
this.callParent(arguments);
return false
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.DLMBtSearch", {
extend: "SYNO.SDS.DownloadStation.Settings.GridPanel",
fillConfig: function(a) {
this.btntask = new Ext.util.DelayedTask(this.updateBtnStatus,this);
var c = new SYNO.ux.EnableColumn({
align: "center",
header: _DT("common", "enabled"),
dataIndex: "enable",
enableFastSelectAll: true,
width: 90
});
this.updateEnable = true;
this.CheckUpdate = false;
this.store = this.createStore();
var b = {
stripeRows: true,
border: false,
tbar: {
defaults: {
xtype: "syno_button",
scope: this
},
items: [{
text: _T("common", "add"),
itemId: "upload",
handler: function(d) {
this.createHandler()
}
}, {
text: _T("common", "alt_edit"),
itemId: "edit",
disabled: true,
handler: this.editHandler
}, {
text: _DT("common", "delete"),
itemId: "delete",
disabled: true,
handler: this.deleteHandler
}, {
text: _DT("settings", "settings_btn_check_update"),
itemId: "updatecheck",
disabled: _S("demo_mode") ? true : false,
handler: this.CheckUpdateHandler
}, {
text: _DT("download", "filehost_update_all"),
itemId: "updateall",
disabled: true,
handler: this.UpdateAllHandler
}]
},
selModel: new Ext.grid.RowSelectionModel({
singleSelect: false,
listeners: {
scope: this,
selectionchange: function() {
this.btntask.delay(100)
}
}
}),
colModel: new Ext.grid.ColumnModel({
columns: [c, {
header: _T("common", "name"),
dataIndex: "displayname",
width: 120
}, {
header: _DT("server", "title_server_desc"),
dataIndex: "description",
id: "description",
renderer: function(g, e, f) {
var d = Ext.util.Format.htmlEncode(g);
e.attr = 'ext:qtip="' + Ext.util.Format.htmlEncode(d) + '"';
return d
}
}, {
header: _DT("service", "service_host_version"),
dataIndex: "version",
width: 90,
renderer: function(i, f, h, e, g, d) {
if ((h.data.version < h.data.newversion) && this.updatedwlink) {
i = Ext.util.Format.htmlEncode(h.data.version);
i += '<span class="syno-dl-settings-btsearch"';
i += ' ext:qtip="';
i += _DT("settings", "filehosting_update_item");
i += ' "> ';
i += "(" + _DT("download", "rss_update") + ")</span>"
} else {
if ((h.data.version === "add") && this.updatedwlink) {
i = '<span class="syno-dl-settings-btsearch"';
i += ' ext:qtip="' + _T("common", "add") + ' "> ';
i += _T("common", "add") + "</span>"
}
}
return i
}
.createDelegate(this)
}]
}),
plugins: [c],
store: this.store,
autoExpandColumn: "description",
enableHdMenu: false,
listeners: {
scope: this,
afterrender: {
fn: function() {
Ext.get(c.box_id).hide()
},
single: true
},
beforedestroy: function() {
this.btntask.cancel()
},
cellclick: this.UpdatePlugin,
rowdblclick: function(d, g, f) {
if (this._S("is_admin")) {
this.editHandler()
}
}
}
};
if (SYNO.SDS.DownloadStation.Uploader.Utils.isSupportHTML5Upload()) {
b.plugins.push(new SYNO.SDS.DownloadStation.Settings.FileUploader({
listeners: {
scope: this,
beforedrop: this.onBeforeDropFile
}
}))
}
return Ext.apply(b, a)
},
createStore: function() {
var a = new SYNO.API.JsonStore({
api: this.getWebAPIName(),
method: "list",
version: 1,
autoDestroy: true,
autoLoad: true,
appWindow: this,
sortInfo: {
field: "name",
direction: "ASC"
},
idProperty: "name",
fields: ["enable", "name", "displayname", "description", "user", "version", "newversion", "accountsupport"],
root: "plugins",
listeners: {
scope: this,
beforeload: function() {
this.setStatusBusy({
text: _T("common", "loading")
})
},
load: function(b) {
if (true === this.updateEnable) {
this.updateEnable = false;
this.updateEnableColume(b)
}
if (true === this.CheckUpdate) {
this.CheckUpdate = false;
this.CheckUpdateHandler()
}
this.clearStatusBusy()
},
exception: function(e, f, h, d, c, b) {
var g = SYNO.SDS.DownloadStation.Utils.getErrorString((c && c.code) ? c.code : -1);
this.owner.getMsgBox().alert(_T("tree", "leaf_downloadtask"), g);
this.clearStatusBusy()
}
}
});
return a
},
onBeforeDropFile: function(b, a) {
this.createHandler(a);
return false
},
defineBehaviors: function() {
var a = this.getTopToolbar();
this.btnDelete = a.getComponent("delete");
this.btnUpload = a.getComponent("upload");
this.btnEdit = a.getComponent("edit");
this.btnUpdateAll = a.getComponent("updateall");
this.btnUndateCheck = a.getComponent("updatecheck");
if (!_S("is_admin")) {
this.btnDelete.hide();
this.btnUpload.hide();
this.btnEdit.hide();
this.btnUpdateAll.hide();
this.btnUndateCheck.hide()
}
},
updateEnableColume: function(b) {
if (0 === b.getCount()) {
return
}
var a = this.appWin.appInstance.getUserSettings("btsearchplugins") || [];
var d = {};
var f = [];
for (var e = 0; e < b.getCount(); e++) {
var g = b.getAt(e).data;
g.enable = true;
for (var c = 0; c < a.length; c++) {
if (a[c].name === g.name) {
g.enable = (false === a[c].enable) ? false : true;
break
}
}
f.push(g)
}
d.plugins = f;
this.getStore().loadData(d);
return
},
AtLeastOneSelected: function() {
var b = this.store.getRange();
for (var a = 0; a < b.length; a++) {
if (b[a].data.enable === true) {
return true
}
}
return false
},
editHandler: function() {
var a = this.getSelectionModel();
var c = a.getSelections();
if (c.length === 1 && c[0].data.accountsupport) {
var b = new SYNO.SDS.DownloadStation.Settings.EditPluginDialog({
owner: this.owner,
api: this.getWebAPIName(),
pluginName: c[0].data.name,
displayname: c[0].data.displayname,
user: c[0].data.user
});
b.load()
}
},
CheckUpdateHandler: function() {
this.owner.getEl().mask(_DT("settings", "settings_check_updating"));
this.sendWebAPI({
api: this.getWebAPIName(),
method: "update_check",
version: 1,
scope: this,
callback: this.onCheckUpdateDone
})
},
onCheckUpdateDone: function(g, e, c) {
var f, a;
var d = true;
if (this.owner.getEl().isMasked()) {
this.owner.getEl().unmask()
}
if (!g) {
var b = _T("error", "error_system_busy");
if (e && e.code) {
b = SYNO.SDS.DownloadStation.Utils.getErrorString(e.code)
}
this.owner.getMsgBox().alert(_T("tree", "leaf_downloadtask"), b)
} else {
this.updatedwlink = e.downloadlink;
a = this.getStore();
Ext.each(e.searchplugins, function(i, h, j) {
f = a.getById(i.name);
if (f && (f.data.version < i.version)) {
f.data.newversion = i.version;
f.commit();
d = false
} else {
if (!f) {
a.add(new a.recordType({
enable: "",
name: i.name,
displayname: i.name,
version: "add",
description: i.description,
user: "no",
newversion: i.version,
accountsupport: ""
}));
d = false
}
}
});
if (d) {
this.owner.getMsgBox().alert(_DT("settings", "settings_btn_check_update"), _DT("settings", "no_btsearch_update"))
} else {
if (d) {
this.btnUpdateAll.disable()
} else {
this.btnUpdateAll.enable()
}
}
}
this.owner.clearStatus()
},
UpdatePlugin: function(a, i, c, g) {
var f = g.getTarget();
var b = Ext.get(f);
if (f && b && b.is("span[class=syno-dl-settings-btsearch]")) {
var h = a.getStore().getAt(i);
if (("version" === a.getColumnModel().getDataIndex(c)) && (h.data.version < h.data.newversion || "add" === h.data.version)) {
var d = [];
d.push(h.data.name);
this.owner.getEl().mask();
this.sendWebAPI({
api: this.getWebAPIName(),
method: "update",
version: 1,
scope: this,
params: {
plugin_names: d
},
callback: this.UpdatePluginDone
})
}
}
},
UpdatePluginDone: function(d, c, b) {
if (this.owner.getEl().isMasked()) {
this.owner.getEl().unmask()
}
if (!d) {
var a = _T("error", "error_system_busy");
if (c && c.code) {
a = SYNO.SDS.DownloadStation.Utils.getErrorString(c.code)
}
this.owner.getMsgBox().alert(_T("tree", "leaf_downloadtask"), a)
} else {
this.CheckUpdate = true;
this.afterActionHandler()
}
},
UpdateAllHandler: function() {
var d;
var c = [];
var a = this.getStore();
for (var b = 0; b < a.getCount(); b++) {
d = a.getAt(b);
if (d && ((d.data.version < d.data.newversion) || "add" === d.data.version)) {
c.push(d.data.name)
}
}
if (c.length >= 1) {
this.owner.getEl().mask(_DT("download", "updating"));
this.sendWebAPI({
api: this.getWebAPIName(),
method: "update",
version: 1,
scope: this,
params: {
plugin_names: c
},
callback: this.UpdateAllDone
})
}
},
UpdateAllDone: function(d, c, b) {
if (this.owner.getEl().isMasked()) {
this.owner.getEl().unmask()
}
if (!d) {
var a = _T("error", "error_system_busy");
if (c && c.code) {
a = SYNO.SDS.DownloadStation.Utils.getErrorString(c.code)
}
this.owner.getMsgBox().alert(_T("tree", "leaf_downloadtask"), a)
} else {
this.btnUpdateAll.disable();
this.CheckUpdate = true;
this.afterActionHandler()
}
},
createHandler: function(b) {
var a = new SYNO.SDS.DownloadStation.Settings.AddSearchPluginDialog({
owner: this.owner,
module: this,
files: b
});
a.load()
},
deleteHandler: function() {
var a = this.getSelectionModel();
var d = a.getSelections();
var b = [];
if (d.length < 1) {
return
}
for (var c = 0; c < d.length; c++) {
if (d[c].get("user") === true) {
b.push(d[c].get("name"))
}
}
if (b.length !== d.length) {
this.owner.getMsgBox().alert(_DT("tree", "leaf_downloadtask"), _DT("download", "plugin_undelete"));
return
}
this.owner.getMsgBox().confirm(_DT("tree", "leaf_downloadtask"), _DT("download", "delete_plugin_confirm"), function(e) {
if ("yes" == e) {
this.sendWebAPI({
api: this.getWebAPIName(),
method: "delete",
params: {
plugin_names: b
},
version: 1,
scope: this,
callback: function(i, h, g) {
if (!i) {
var f = _DT("common", "error_system");
if (h && h.code) {
f = SYNO.SDS.DownloadStation.Utils.getErrorString(h.code)
}
this.owner.getMsgBox().alert(_T("tree", "leaf_downloadtask"), f)
} else {
this.afterActionHandler()
}
}
})
}
}, this);
return
},
updateBtnStatus: function() {
var a = this.getSelectionModel();
var c = a.getSelections();
if (c.length > 0) {
this.btnDelete.enable()
} else {
this.btnDelete.disable()
}
for (var b = 0; b < c.length; b++) {
if (c[b].get("version") === "add") {
this.btnDelete.disable();
break
}
}
if (_S("is_admin")) {
if (c.length === 1 && c[0].data.accountsupport === true && c[0].get("version") !== "add") {
this.btnEdit.enable()
} else {
this.btnEdit.disable()
}
}
},
reset: function() {
this.getStore().rejectChanges()
},
isDirty: function() {
return this.getStore().getModifiedRecords().length > 0
},
afterActionHandler: function() {
this.updateEnable = true;
this.getStore().reload()
},
onSettingsApply: function() {
if (!this.isValid()) {
return false
}
var a = this.getStore();
var b = [];
a.each(function(c) {
b.push({
enable: c.get("enable"),
name: c.get("name")
})
}, this);
this.appWin.appInstance.setUserSettings("btsearchplugins", b);
this.getStore().commitChanges();
return true
},
isValid: function() {
var a = [];
this.getStore().each(function(b) {
a.push(b.get("enable"))
}, this);
if (-1 === a.indexOf(true)) {
this.settingsWin.getMsgBox().alert("", _DT("download", "select_one_plugin"));
return false
}
return true
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.BTSearch"
}
});
Ext.define("SYNO.SDS.DownloadStation.Settings.EditPluginDialog", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
Ext.apply(this, a || {});
var b = this.fillConfig(a);
this.callParent([b]);
this.defineBehaviors()
},
fillConfig: function(a) {
var b = {
owner: a.owner,
api: a.api,
cls: "syno-dl-win",
width: 510,
height: 180,
minWidth: 100,
minHeight: 120,
collapsible: false,
autoScroll: false,
constrainHeader: true,
monitorResize: true,
title: _DT("common", "alt_edit") + " " + this.displayname,
layout: "fit",
items: [this.initFormConfig()],
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
text: _DT("common", "ok"),
disabled: this._S("demo_mode"),
btnStyle: "blue",
tooltip: this._S("demo_mode") ? _JSLIBSTR("uicommon", "error_demo") : "",
handler: this.Apply,
scope: this
}, {
text: _T("common", "alt_cancel"),
handler: this.onCloseHandler,
scope: this
}),
keys: [{
key: [10, 13],
fn: this.Apply,
scope: this
}, {
key: 27,
fn: this.onCloseHandler,
scope: this
}]
};
Ext.apply(b, a);
return b
},
initFormConfig: function() {
var a = {
xtype: "syno_formpanel",
itemId: "editformpanel",
labelAlign: "left",
trackResetOnLoad: true,
waitMsgTarget: true,
border: false,
padding: 0,
labelWidth: 161,
items: [{
xtype: "syno_compositefield",
hideLabel: false,
fieldLabel: _DT("download", "download_auth_user"),
width: 300,
items: [{
xtype: "syno_textfield",
name: "username",
width: 157,
tabIndex: 1,
listeners: {
scope: this,
change: this.clearFakePassword
}
}, {
xtype: "syno_button",
text: _DT("settings", "btn_verify_account"),
disabled: this._S("demo_mode"),
tooltip: this._S("demo_mode") ? _JSLIBSTR("uicommon", "error_demo") : "",
scope: this,
handler: this.VerifyAccountHandler
}]
}, {
xtype: "syno_compositefield",
hideLabel: false,
fieldLabel: _T("common", "password"),
width: 300,
items: [{
xtype: "syno_textfield",
textType: "password",
name: "password",
enableKeyEvents: true,
width: 157,
tabIndex: 2,
listeners: {
scope: this,
focus: this.clearFakePassword,
change: function() {
this.passwordChanged = true
}
}
}]
}]
};
return a
},
defineBehaviors: function() {
this.form = this.get("editformpanel").form
},
onCloseHandler: function() {
this.close()
},
Apply: function() {
var b;
if (this.form.isDirty() || this.passwordChanged) {
var c = this.form.findField("username").getValue();
var a = this.form.findField("password").getValue();
if (!this.checkValid(c, a, true)) {
return false
}
b = {
plugin_name: this.pluginName,
username: c
};
if (this.passwordChanged) {
b.password = a
}
this.setStatusBusy({
text: _DT("common", "saving")
});
this.sendWebAPI({
api: this.api,
method: "set",
params: b,
version: 1,
scope: this,
callback: function(g, f, e) {
this.clearStatusBusy();
if (!g) {
var d = _DT("common", "error_system");
if (f && f.code) {
d = SYNO.SDS.DownloadStation.Utils.getErrorString(f.code)
}
this.setStatusError({
text: d,
clear: true
})
} else {
this.close()
}
}
})
} else {
this.close()
}
},
load: function() {
this.setStatusBusy({
text: _T("common", "loading")
});
this.sendWebAPI({
api: this.api,
method: "get",
params: {
plugin_name: this.pluginName
},
version: 1,
scope: this,
callback: function(d, b, a) {
this.clearStatusBusy();
if (!d) {
this.setStatusError({
text: _T("common", "forminvalid"),
clear: true
})
} else {
var c = {};
c.data = b;
if (c.data.username) {
c.data.password = "12345678"
}
this.form.loadRecord(c)
}
}
});
this.show()
},
checkValid: function(c, b, a) {
if (!a && !c && !b) {
this.setStatusError({
text: _DT("download", "download_msg_invalid_user"),
clear: true
});
return false
} else {
if (!c && b) {
this.setStatusError({
text: _DT("download", "download_msg_invalid_user"),
clear: true
});
return false
} else {
if (c && !b) {
this.setStatusError({
text: _DT("common", "error_empty_password"),
clear: true
});
return false
}
}
}
return true
},
VerifyAccountHandler: function() {
var c = this.form.findField("username").getValue();
var a = this.form.findField("password").getValue();
if (this.checkValid(c, a, false) === false) {
return false
}
var b = {
plugin_name: this.pluginName,
username: c
};
if (this.passwordChanged) {
b.password = a
}
this.setStatusBusy({
text: _DT("settings", "verifying_account")
});
this.sendWebAPI({
api: this.api,
method: "verify",
params: b,
version: 1,
scope: this,
callback: function(g, f, e) {
this.clearStatusBusy();
if (!g) {
var d = _DT("common", "error_system");
if (f && f.code) {
d = SYNO.SDS.DownloadStation.Utils.getErrorString(f.code)
}
this.setStatusError({
text: d,
clear: true
})
} else {
this.getMsgBox().alert(_DT("common", "alt_edit") + " " + this.displayname, _DT("download", "login_success"))
}
}
})
},
clearFakePassword: function() {
if (Ext.isEmpty(this.form.findField("password").getValue()) || (true === this.passwordChanged)) {
return
}
this.form.findField("password").setValue("");
this.passwordChanged = true
}
});
Ext.define("SYNO.SDS.DownloadStation.Settings.AddSearchPluginDialog", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.submitBtnId = Ext.id();
var b = {
owner: a.owner,
cls: "syno-dl-win",
width: 565,
height: 184,
shadow: true,
minWidth: 100,
minHeight: 100,
collapsible: false,
autoScroll: false,
constrainHeader: true,
plain: true,
monitorResize: true,
title: _DT("download", "search_template"),
layout: "fit",
items: [this.createFormPanel(a)],
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
id: this.submitBtnId,
text: _DT("common", "addto"),
btnStyle: "blue",
disabled: _S("demo_mode"),
tooltip: _S("demo_mode") ? _JSLIBSTR("uicommon", "error_demo") : ""
}, {
text: _T("common", "alt_cancel"),
handler: this.onCloseHandler,
scope: this
}),
keys: [{
key: [10, 13],
fn: this.onSubmit,
scope: this
}, {
key: 27,
fn: this.onCloseHandler,
scope: this
}]
};
Ext.apply(b, a);
return b
},
createFormPanel: function(a) {
return new SYNO.SDS.DownloadStation.Settings.AddSearchPluginForm({
owner: this,
module: a.module,
files: a.files,
submitBtnId: this.submitBtnId
})
},
onCloseHandler: function() {
this.close()
},
load: function() {
this.show()
}
});
Ext.define("SYNO.SDS.DownloadStation.Settings.AddSearchPluginForm", {
extend: "SYNO.API.Form.FormPanel",
ADD_MAXLIMIT: 1,
ADD_MAXSIZE: 104857600,
FILEFILEDNAME: "plugin",
ALLOWFILTERS: ["dlm"],
constructor: function(a) {
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
var c = new SYNO.SDS.DownloadStation.Settings.FileUploader({
api: this.getWebAPIName(),
files: a.files,
startId: a.submitBtnId
});
var b = {
api: this.getWebAPIName(),
method: this.getWebAPIMethod(),
version: this.getWebAPIVersion(),
xtype: "syno_formpanel",
fileUpload: true,
itemId: "formpanel",
labelAlign: "left",
trackResetOnLoad: true,
waitMsgTarget: true,
border: false,
padding: 0,
labelWidth: 161,
plugins: [c],
items: [SYNO.SDS.DownloadStation.Uploader.Utils.getButtonTemplate({
name: this.FILEFILEDNAME
}), {
xtype: "syno_displayfield",
value: "( eg. search.dlm)"
}]
};
Ext.apply(b, a);
return b
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.BTSearch"
},
getWebAPIMethod: function() {
return "create"
},
getWebAPIVersion: function() {
return 1
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.aMuleBasic", {
extend: "SYNO.SDS.DownloadStation.Settings.FormPanel",
isValid: function() {
var e = "";
if (!this.form || !this.form.isValid()) {
e = _T("common", "forminvalid")
}
if (true === this._S("is_admin") && this.form.findField("emule_port_type")) {
if (this.form.findField("emule_port_type").getGroupValue() == "manual_port") {
var a = 0
, d = 0;
var b = this.form.findField("emule_tcp_port");
var c = this.form.findField("emule_udp_port");
a = parseInt(b.getValue(), 10);
d = parseInt(c.getValue(), 10);
if (a == d) {
e = _DT("error", "error_port_conflict")
}
}
}
if (this.form.findField("destination")) {
if ("" === this.form.findField("destination").getValue()) {
e = _DT("download", "download_warning_select_share")
}
}
if ("" !== e) {
this.setStatusError({
text: e,
clear: true
});
return false
}
return true
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.Emule"
},
getKeyName: function() {
return "emule"
},
postReturnData: function(a) {
var b;
b = a[0].data;
b.dl_when_type = (b.enable_schedule) ? "schedule" : "now";
delete b.enable_schedule;
this.gData.set(this.getKeyName(), b);
this.form.setValues(b)
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.aMuleGeneral", {
extend: "SYNO.SDS.DownloadStation.Settings.aMuleBasic",
fillConfig: function(a) {
var b = {
trackResetOnLoad: true,
frame: false,
border: false,
autoScroll: true,
listeners: {
activate: {
single: true,
scope: this,
fn: this.onActivate
}
},
items: [{
xtype: "syno_fieldset",
title: _DT("settings", "title_emule_server_update"),
hideLabels: false,
items: [{
xtype: "syno_checkbox",
boxLabel: _DT("settings", "title_emule_enable_auto_server_update"),
name: "enable_server_update"
}, {
xtype: "syno_checkbox",
boxLabel: _DT("settings", "title_emule_enable_auto_connect_server"),
name: "enable_server_auto_connect"
}]
}, {
xtype: "syno_fieldset",
title: _DT("settings", "title_emule_obfuscation"),
hideLabels: false,
items: [{
xtype: "syno_checkbox",
boxLabel: _DT("settings", "title_emule_enable_obfuscation"),
name: "enable_obfuscation"
}, {
xtype: "syno_checkbox",
indent: 1,
boxLabel: _DT("settings", "title_emule_outgoing_obfuscation"),
name: "enable_outgoing_obfuscation"
}, {
xtype: "syno_checkbox",
indent: 1,
boxLabel: _DT("settings", "title_emule_obfuscation_conn_only"),
name: "enable_obfuscation_only"
}]
}]
};
return Ext.apply(b, a)
},
onActivate: function() {
var b, a = this.getForm();
b = new SYNO.ux.Utils.EnableCheckGroup(a,"enable_obfuscation",["enable_outgoing_obfuscation", "enable_obfuscation_only"])
},
getFields: function() {
var a = ["enable_server_update", "enable_server_auto_connect", "enable_obfuscation", "enable_outgoing_obfuscation", "enable_obfuscation_only"];
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.aMuleConnect", {
extend: "SYNO.SDS.DownloadStation.Settings.aMuleBasic",
fillConfig: function(a) {
var b = {
trackResetOnLoad: true,
frame: false,
border: false,
autoScroll: true,
listeners: {
activate: {
scope: this,
fn: this.onActivate
}
},
items: [{
xtype: "syno_fieldset",
title: _DT("settings", "title_emule_port_setting"),
hideLabels: true,
items: [{
xtype: "syno_radio",
boxLabel: _DT("settings", "title_default_ports"),
name: "port_type",
inputValue: "default_port",
checked: true
}, {
xtype: "syno_radio",
boxLabel: _DT("settings", "title_manual_ports"),
name: "port_type",
inputValue: "manual_port"
}, {
indent: 1,
xtype: "syno_compositefield",
hideLabel: true,
items: [{
xtype: "syno_displayfield",
value: _DT("settings", "title_tcp_port") + _T("common", "colon")
}, {
xtype: "syno_numberfield",
name: "tcp_port",
decimalPrecision: 0,
maxLength: 5,
vtype: "port",
minValue: 1,
maxValue: 65535,
width: 66,
margins: {
top: 0,
right: 40,
bottom: 0,
left: 0
},
allowBlank: false,
validateOnBlur: true,
validationEvent: "blur",
validator: function(c) {
if (SYNO.SDS.Utils.isReservedPort("emule", c, c)) {
return _DT("service", "error_dl_port_in_used")
} else {
return true
}
}
}, {
xtype: "syno_displayfield",
value: _DT("settings", "title_udp_port") + _T("common", "colon")
}, {
xtype: "syno_numberfield",
name: "udp_port",
decimalPrecision: 0,
maxLength: 5,
vtype: "port",
minValue: 1,
maxValue: 65535,
width: 66,
allowBlank: false,
validateOnBlur: true,
validationEvent: "blur",
validator: function(c) {
if (SYNO.SDS.Utils.isReservedPort("emule", c, c)) {
return _DT("service", "error_dl_port_in_used")
} else {
return true
}
}
}]
}]
}, {
xtype: "syno_fieldset",
title: _DT("settings", "title_emule_connection"),
hideLabels: true,
items: [{
xtype: "syno_compositefield",
hideLabels: true,
items: [{
xtype: "syno_displayfield",
value: _DT("settings", "title_emule_max_conn") + _T("common", "colon")
}, {
xtype: "syno_numberfield",
name: "max_conn",
minValue: 100,
maxValue: 500,
allowBlank: false,
allowNegative: false,
allowDecimals: false
}]
}]
}]
};
return Ext.apply(b, a)
},
onActivate: function() {
this.doLayout()
},
isPortFieldDirty: function() {
var a = ["port_type", "tcp_port", "udp_port"];
for (var b = 0; b < a.length; b++) {
if (this.form.findField(a[b]).isDirty()) {
return true
}
}
return false
},
getWebAPIParam: function() {
var a = {};
if (this.isPortFieldDirty()) {
a.port_type = (this.form.findField("port_type").getValue()) ? "default_port" : "manual_port";
a.tcp_port = this.form.findField("tcp_port").getValue();
a.udp_port = this.form.findField("udp_port").getValue()
}
if (this.form.findField("max_conn").isDirty()) {
a.max_conn = this.form.findField("max_conn").getValue()
}
return a
},
getFields: function() {
var a = ["port_type", "tcp_port", "udp_port", "max_conn"];
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.aMuleLocation", {
extend: "SYNO.SDS.DownloadStation.Settings.aMuleBasic",
defineBehaviors: function() {
var a = this.owner.jsConfig.jsBaseURL;
this.sharebaseURL = a + "/../../modules/FileBrowser/";
this.BaseWebfmURL = a + "/../../../webfm/"
},
fillConfig: function(a) {
this.ChooseDefDest = new SYNO.ux.Button({
id: this.btnChooseDefDestId = Ext.id(),
name: "choosedestbtn",
text: _T("common", "choose"),
scope: this,
handler: function() {
this.utils.chooseDestHandler({
owner: this.owner,
destinationField: this.form.findField("default_destination")
})
}
});
var e = {
xtype: "syno_fieldset",
title: _DT("settings", "title_default_dest_folder"),
hideLabels: true,
items: [{
xtype: "syno_compositefield",
hideLabel: true,
fieldLabel: _DT("download", "download_list_dest_folder") + _T("common", "colon"),
items: [{
xtype: "syno_textfield",
name: "default_destination",
width: 160,
readOnly: true,
allowBlank: false,
cls: "selectabletext allowDefCtxMenu"
}, this.ChooseDefDest]
}]
};
var d = {
xtype: "syno_fieldset",
title: _DT("settings", "title_shares_settings"),
id: this.fieldsetShareId = Ext.id(),
hideLabels: true,
items: [{
xtype: "syno_compositefield",
hideLabel: true,
fieldLabel: _DT("settings", "shares_settings_desc") + _T("common", "colon"),
items: [{
xtype: "syno_displayfield",
value: _DT("settings", "shares_settings_desc") + _T("common", "colon")
}, {
xtype: "syno_button",
id: this.btnChooseShareId = Ext.id(),
name: "choosesharebtn",
text: _T("common", "choose"),
scope: this,
handler: this.ChooseShareHandler
}]
}, {
xtype: "syno_textarea",
name: "sharelist",
value: "",
validateOnBlur: true,
validationEvent: "blur",
width: 480,
height: 150,
readOnly: true,
autoScroll: true,
hidden: false,
cls: "selectabletext allowDefCtxMenu"
}]
};
var b;
if (_S("is_admin")) {
b = [e, d]
} else {
b = [e]
}
var c = {
trackResetOnLoad: true,
frame: false,
border: false,
autoScroll: true,
items: b
};
return Ext.apply(c, a)
},
ChooseShareHandler: function() {
this.utils.chooseDestHandler({
owner: this.owner,
folderToolbar: false,
padding: "16px 20px 12px",
usage: {
type: "chooseDir",
multiselect: true
},
callbackScope: this,
checkRender: function(a) {
var b = a.spath && a.spath.substr(1);
if (-1 < this.gData.get("emule_location").shareListArray.indexOf(b)) {
return "checked"
}
return "unchecked"
},
callback: this.onChooseShareHandler
})
},
onChooseShareHandler: function(h) {
var g = false;
var c = this.gData.get("emule_location").shareListArray;
for (var b in h.tree.nodeHash) {
if (h.tree.nodeHash.hasOwnProperty(b)) {
var f = h.tree.nodeHash[b]
, e = true === f.attributes.checked || "checked" === f.attributes.checked
, d = f.attributes.spath && f.attributes.spath.substr(1)
, a = c.indexOf(d);
if (e && d && -1 === a) {
g = true;
c.push(d)
} else {
if (!e && -1 < a) {
g = true;
c.splice(a, 1)
}
}
}
}
if (g) {
c = c.sort();
this.form.findField("sharelist").setValue(c.join("\n"))
}
h.close()
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Settings.Emule.Location"
},
getWebAPIGetData: function() {
var a = [{
api: "SYNO.DownloadStation2.Settings.Emule.Location",
method: "get",
version: 1
}];
if (_S("is_admin")) {
a.push({
api: "SYNO.DownloadStation2.Settings.Emule",
method: "get",
version: 1
})
}
return a
},
getWebAPISetData: function() {
var c = [];
var a = this.form.findField("default_destination");
if (a.isDirty()) {
c.push({
api: "SYNO.DownloadStation2.Settings.Emule.Location",
method: "set",
params: {
default_destination: a.getValue()
},
version: 1
});
SYNO.SDS.DownloadStation.aMule.Utils.setEmuleDestination(undefined)
}
if (_S("is_admin")) {
var d = this.form.findField("sharelist");
if (d.isDirty()) {
var b = this.gData.get("emule_location").shareListArray;
c.push({
api: "SYNO.DownloadStation2.Settings.Emule",
method: "set",
params: {
share_folders: b
},
version: 1
})
}
}
return c
},
getKeyName: function() {
return "emule_location"
},
postReturnData: function(a) {
var b = {};
Ext.each(a, function(c, d, e) {
if (c.success && c.api === "SYNO.DownloadStation2.Settings.Emule.Location") {
b.default_destination = c.data.default_destination
}
if (c.success && _S("is_admin") && (c.api === "SYNO.DownloadStation2.Settings.Emule")) {
b.shareListArray = c.data.share_folders;
b.sharelist = b.shareListArray.join("\n")
}
}, this);
this.gData.set(this.getKeyName(), b);
this.form.setValues(b)
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.aMuleBandwidth", {
extend: "SYNO.SDS.DownloadStation.Settings.aMuleBasic",
fillConfig: function(a) {
var b = {
trackResetOnLoad: true,
frame: false,
border: false,
autoScroll: true,
listeners: {
activate: {
scope: this,
fn: this.onActivate
}
},
items: [{
xtype: "syno_fieldset",
title: _DT("settings", "title_emule_bandwidth"),
hideLabels: true,
items: [{
xtype: "syno_compositefield",
hideLabel: true,
items: [{
xtype: "syno_displayfield",
value: _DT("service", "service_dl_bt_max_upload") + _T("common", "colon")
}, {
xtype: "syno_numberfield",
name: "upload_rate",
allowNegative: false,
decimalPrecision: 0,
minValue: 0,
width: 80,
maxLength: 6,
validateOnBlur: true,
validationEvent: "blur",
allowBlank: false
}, {
xtype: "syno_displayfield",
value: "KB/s " + _DT("service", "service_dl_bt_rate_desc")
}]
}, {
xtype: "syno_compositefield",
hideLabel: true,
items: [{
xtype: "syno_displayfield",
value: _DT("service", "service_dl_bt_max_download") + _T("common", "colon")
}, {
xtype: "syno_numberfield",
name: "download_rate",
allowNegative: false,
decimalPrecision: 0,
minValue: 0,
width: 80,
maxLength: 6,
validateOnBlur: true,
validationEvent: "blur",
allowBlank: false
}, {
xtype: "syno_displayfield",
value: "KB/s " + _DT("service", "service_dl_bt_rate_desc")
}]
}]
}, {
xtype: "syno_fieldset",
title: _DT("service", "service_dl_start_desc"),
items: [{
xtype: "syno_radio",
boxLabel: _DT("service", "service_dl_now"),
name: "dl_when_type",
itemId: "type_now",
inputValue: "now",
checked: true
}, {
xtype: "syno_radio",
boxLabel: _T("schedule", "schedule_advance"),
name: "dl_when_type",
itemId: "type_schedule",
inputValue: "schedule"
}, {
id: this.btnScheduleId = Ext.id(),
xtype: "syno_button",
text: _T("schedule", "schedule_title"),
handler: this.launchScheduleDialog,
scope: this,
indent: 1
}, {
xtype: "hidden",
name: "schedule"
}, {
xtype: "hidden",
name: "schedule_upload_rate"
}, {
xtype: "hidden",
name: "schedule_download_rate"
}]
}]
};
return Ext.apply(b, a)
},
defineBehaviors: function() {
var a;
a = new SYNO.ux.Utils.EnableCheckGroup(this.form,"type_schedule",[this.btnScheduleId])
},
onActivate: Ext.emptyFn,
launchScheduleDialog: function() {
var b = this.getForm();
var a = new SYNO.SDS.DownloadStation.Settings.ScheduleDialog({
owner: this.owner,
scheduleField: b.findField("schedule"),
altUploadField: b.findField("schedule_upload_rate"),
altDownloadField: b.findField("schedule_download_rate")
});
a.show()
},
getWebAPIParam: function() {
var a = this.getFields();
var c = {};
for (var b = 0; b < a.length; b++) {
if (this.form.findField(a[b]).isDirty()) {
if ("dl_when_type" === a[b]) {
c.enable_schedule = !this.form.findField(a[b]).getValue()
} else {
if (("schedule_upload_rate" === a[b]) || ("schedule_download_rate" === a[b])) {
c[a[b]] = parseInt(this.form.findField(a[b]).getValue(), 10)
} else {
c[a[b]] = this.form.findField(a[b]).getValue()
}
}
}
}
return c
},
getFields: function() {
var a = ["upload_rate", "download_rate", "dl_when_type", "schedule", "schedule_upload_rate", "schedule_download_rate"];
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.ScheduleTable", {
extend: "SYNO.ux.ScheduleTable",
constructor: function(a) {
return this.callParent([this.fillConfig(a)])
},
fillConfig: function(a) {
var b = {
buttons: [{
label: _DT("download", "full_speed")
}, {
label: a.limitBtnStr || _DT("download", "limit_speed")
}, {
label: _DT("download", "no_download")
}],
customizeItems: [{
xtype: "syno_fieldset",
labelWidth: 180,
items: [{
xtype: "syno_displayfield",
cls: "syno-dl-textblod",
value: a.limitDescStr || _DT("download", "limit_speed_setting")
}, {
xtype: "syno_compositefield",
width: 400,
indent: 1,
fieldLabel: _DT("service", "service_dl_bt_max_upload"),
items: [{
xtype: "syno_numberfield",
id: this.ulRateId = Ext.id(),
allowDecimals: false,
allowNegative: false,
minValue: 0,
maxlength: 6,
width: 100
}, {
xtype: "syno_displayfield",
value: " KB/s " + _DT("service", "service_dl_bt_rate_desc")
}]
}, {
xtype: "syno_compositefield",
width: 400,
indent: 1,
fieldLabel: _DT("service", "service_dl_bt_max_download"),
items: [{
xtype: "syno_numberfield",
id: this.dlRateId = Ext.id(),
allowDecimals: false,
allowNegative: false,
minValue: 0,
maxlength: 6,
width: 100
}, {
xtype: "syno_displayfield",
value: " KB/s " + _DT("service", "service_dl_bt_rate_desc")
}]
}, {
xtype: "syno_displayfield",
htmlEncode: false,
value: a.noteDescStr ? String.format('<span class="syno-sds-cp-notification-note">{0}{1}&nbsp;</span>{2}', _T("common", "note"), _T("common", "colon"), a.noteDescStr) : "&nbsp;"
}]
}]
};
return Ext.apply(b, a)
},
getSingleBtnConfig: function(b, a) {
var c = {
0: 1,
1: 2,
2: 0
};
return this.callParent([b, c[a]])
},
setUlRate: function(a) {
Ext.getCmp(this.ulRateId).setValue(a)
},
getUlRate: function() {
return Ext.getCmp(this.ulRateId).getValue()
},
setDlRate: function(a) {
Ext.getCmp(this.dlRateId).setValue(a)
},
getDlRate: function() {
return Ext.getCmp(this.dlRateId).getValue()
},
isValid: function() {
return Ext.getCmp(this.ulRateId).isValid() && Ext.getCmp(this.dlRateId).isValid()
},
isDirty: function() {
return Ext.getCmp(this.ulRateId).isDirty() || Ext.getCmp(this.dlRateId).isDirty()
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.ScheduleDialog", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
this.scheduleField = a.scheduleField;
this.altUploadField = a.altUploadField;
this.altDownloadField = a.altDownloadField;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.scheduleTable = new SYNO.SDS.DownloadStation.Settings.ScheduleTable(a);
var b = {
cls: "syno-dl-win",
padding: "16px 20px 0px 20px",
height: 550,
width: 660,
title: _T("schedule", "schedule_title"),
layout: "fit",
items: [this.scheduleTable],
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
text: _T("common", "apply"),
btnStyle: "blue",
scope: this,
handler: this.okHandler
}, {
text: _T("common", "cancel"),
scope: this,
handler: function() {
this.close()
}
})
};
Ext.apply(b, a);
return b
},
okHandler: function() {
var a = this.scheduleTable;
if (!a.isValid()) {
this.setStatusError({
text: _T("common", "forminvalid"),
clear: true
})
} else {
this.scheduleField.setValue(a.getSchedule());
this.altUploadField.setValue(a.getUlRate());
this.altDownloadField.setValue(a.getDlRate());
this.close()
}
},
onShow: function() {
this.scheduleTable.setSchedule(this.scheduleField.getValue());
this.scheduleTable.setUlRate(this.altUploadField.getValue());
this.scheduleTable.setDlRate(this.altDownloadField.getValue())
}
});
Ext.ns("SYNO.SDS.DownloadStation.Settings");
Ext.define("SYNO.SDS.DownloadStation.Settings.Window", {
extend: "SYNO.SDS.ModalWindow",
defaultActivedFnMap: {
"SYNO.SDS.DownloadStation.DLM.Main": this._S("is_admin") ? "SYNO.SDS.DownloadStation.Settings.DLMGen" : "SYNO.SDS.DownloadStation.Settings.DLMFolder",
"SYNO.SDS.DownloadStation.aMule.Main": this._S("is_admin") ? "SYNO.SDS.DownloadStation.Settings.aMuleGeneral" : "SYNO.SDS.DownloadStation.Settings.aMuleLocation"
},
defineUIComponents: function(a) {
var c = SYNO.SDS.DownloadStation.Utils.addUIComponents;
var b = new SYNO.SDS.DownloadStation.PollingTask({
owner: this
});
c(a, "utils", SYNO.SDS.DownloadStation.Utils);
c(a, "gData", SYNO.SDS.DownloadStation.gData);
c(a, "jsConfig", a.owner.jsConfig);
c(a, "settingsWin", this);
c(a, "appWin", a.owner);
c(a, "pollingtask", b)
},
constructor: function(a) {
this.defineUIComponents(a);
Ext.apply(this, a.uicomponents || {});
var b = this.fillConfig(a);
this.callParent([b]);
this.defineBehaviors();
this.applyPostReturnDataHook(a.postReturnDataHook)
},
defineBehaviors: function() {
this.gData.remove("schedule");
this.gData.remove("location");
this.gData.remove("bt");
this.gData.remove("ftp_http");
this.gData.remove("nzb");
this.gData.remove("rss");
this.gData.remove("emule");
this.gData.remove("emule_location");
this.gData.remove("global");
this.gData.remove("unzip");
this.gData.remove("postReturnDataHook")
},
applyPostReturnDataHook: function(a) {
this.gData.postReturnDataHook = {};
Ext.each(a, function(b) {
this.gData.postReturnDataHook[b] = true
}, this)
},
fillConfig: function(b) {
var d = 920;
var a = 520;
var e = this.defaultActivedFnMap[b.defaultActivedFn] || b.defaultActivedFn || "SYNO.SDS.DownloadStation.Settings.GlobalGen";
var c = {
owner: b.owner,
closable: true,
maximizable: true,
fbar: false,
layout: "border",
title: _DT("download", "download_table_heading_setting"),
constrainHeader: true,
cls: "syno-dl-win syno-settings-win",
dsmStyle: "v5",
minWidth: d,
minHeight: a,
boxMinHeight: a,
boxMinWidth: d,
width: d,
height: a,
border: false,
plain: true,
items: [{
xtype: "panel",
bodyStyle: "border: 0px;",
cls: "syno-dl-leftpanel",
region: "west",
layout: {
type: "vbox",
align: "stretch"
},
width: 240,
items: [{
xtype: "panel",
layout: "fit",
border: false,
flex: 1,
items: [this.moduleList = new SYNO.SDS.DownloadStation.ModuleList({
owner: this,
uicomponents: this.uicomponents,
defaultActivedFn: e,
folder: "settings"
},this)]
}]
}, this.moduleCt = new Ext.Panel({
xtype: "syno_panel",
cls: "syno-dl-rightpanel",
layout: "card",
border: false,
frame: false,
hideMode: "offsets",
region: "center"
})],
listeners: {
scope: this,
beforeclose: function() {
var f = this.settingsWin.actionFlag;
this.settingsWin.actionFlag = "";
switch (f) {
case "APPLY":
if (!this.settingsWin.applyHandler()) {
return false
}
break;
case "CLOSE_WITHOUT_SAVING":
break;
default:
if (this.settingsWin.isSettingDirty()) {
this.settingsWin.cancelHandler();
return false
}
break
}
return true
},
close: function(f) {
f.cascade(function(g) {
if (Ext.isDefined(g.onCloseHandler)) {
g.onCloseHandler()
}
})
}
}
};
return c
},
getModule: function(fn, cfg) {
var FnObj;
eval("FnObj = " + fn + ";");
FnObj.prototype.jsConfig = this.jsConfig;
var module = new FnObj(cfg);
return module
},
mergeWebAPI: function(b, c) {
if (Ext.isEmpty(c) || Ext.isEmpty(c.api) || Ext.isEmpty(c.method) || Ext.isEmpty(c.version)) {
return false
}
var a = c.api + "_" + c.method + "_" + c.version;
if (Ext.isDefined(b[a])) {
Ext.apply(b[a].params, c.params)
} else {
b[a] = c
}
return true
},
actionFlag: "CANCEL",
applyForm: function(c) {
var k, a, f;
this.setStatusBusy({
text: _T("common", "saving")
});
for (k in c) {
if (c.hasOwnProperty(k)) {
a = c[k];
if (!a.onSettingsApply()) {
this.clearStatusBusy();
return
}
}
}
var b = {};
for (k in c) {
if (c.hasOwnProperty(k)) {
a = c[k];
var g = a.getWebAPISetData();
if (!Ext.isDefined(g)) {
continue
}
if (k === "SYNO.SDS.DownloadStation.Settings.GlobalGen") {
f = g;
continue
}
if (Ext.isArray(g)) {
for (var e = 0; e < g.length; e++) {
this.mergeWebAPI(b, g[e])
}
} else {
this.mergeWebAPI(b, g)
}
}
}
var h = [];
for (k in b) {
if (b.hasOwnProperty(k)) {
h.push(b[k])
}
}
if (f) {
if (Ext.isArray(f)) {
for (var d = 0; d < f.length; d++) {
h.push(f[d])
}
} else {
h.push(f)
}
}
if (0 === h.length) {
this.clearStatusBusy();
this.settingsWin.close();
return
}
this.sendWebAPI({
compound: {
stopwhenerror: false,
params: h
},
params: {},
scope: this,
callback: function(i, n, m, j) {
var l = false;
this.clearStatusBusy();
Ext.each(n.result, function(o, p, t) {
if (!o.success) {
var s = _DT("common", "error_system");
if (o.error.code) {
s = SYNO.SDS.DownloadStation.Utils.getErrorString(o.error.code)
}
SYNO.Debug("Failed on " + o.api + " " + o.method);
if (1207 === o.error.code) {
var r = c["SYNO.SDS.DownloadStation.Settings.DLMFolder"].form.findField("torrent_nzb_watch_folder").getValue();
s = String.format(s, r)
}
this.settingsWin.getMsgBox().alert("", s);
return
}
if ("SYNO.DownloadStation2.Settings.Global" === o.api) {
var q = m.compound[p].enable_emule;
if (Ext.isDefined(q) && (q != this.gData.get("amule_enabled"))) {
this.gData.set("amule_enabled", q ? 1 : 0);
this.owner.tabPanel.setTabBtnDisabled("aMule", !q)
}
if (o.hasOwnProperty("data")) {
l = true
}
}
}, this);
if (l) {
this.settingsWin.startPolling()
}
}
})
},
applyHandler: function() {
var c, b, d = 0, a = {};
for (c in this.moduleList.moduleList) {
if (this.moduleList.moduleList.hasOwnProperty(c)) {
b = this.moduleList.moduleList[c];
if (b.isDirty()) {
if (!this.settingsWin.verifyIsValid(b, c)) {
return false
}
a[c] = b;
d++
}
}
}
if (0 === d) {
return true
}
if (a.hasOwnProperty("SYNO.SDS.DownloadStation.Settings.GlobalGen")) {
b = a["SYNO.SDS.DownloadStation.Settings.GlobalGen"];
b.confirmIfVolumeChange(function() {
this.settingsWin.applyForm(a)
}
.createDelegate(b));
return true
}
this.settingsWin.applyForm(a);
return true
},
verifyIsValid: function(b, a) {
if (!b.isValid()) {
this.moduleList.selectModule(a);
if (b.setStatusError) {
b.setStatusError({
text: _DT("common", "forminvalid"),
clear: true
})
}
return false
}
return true
},
isSettingDirty: function() {
for (var b in this.moduleList.moduleList) {
if (this.moduleList.moduleList.hasOwnProperty(b)) {
var a = this.moduleList.moduleList[b];
if (a.isDirty()) {
return true
}
}
}
return false
},
cancelHandler: function() {
this.settingsWin.confirmLostChangePromise({
save: function() {
this.settingsWin.actionFlag = "APPLY";
this.settingsWin.close()
},
dontSave: function() {
this.settingsWin.actionFlag = "CLOSE_WITHOUT_SAVING";
this.settingsWin.close()
},
cancel: Ext.emptyFn
}, this)
},
startPolling: function() {
this.settingsWin.getEl().mask(_T("common", "msg_waiting"), "x-mask-loading");
this.pollDeviceId = this.settingsWin.pollReg({
webapi: {
api: "SYNO.DownloadStation2.Settings.Global",
version: 2,
method: "read_progress"
},
interval: 3,
immediate: true,
scope: this,
status_callback: this.settingsWin.pollingCallBack
})
},
pollingCallBack: function(c, b) {
if (!c) {
var a = _T("common", "error_system");
if (b.code) {
a = SYNO.SDS.DownloadStation.Utils.getErrorString(b.code)
}
this.settingsWin.getMsgBox().alert(_T("tree", "node_download"), a, function() {
this.clearStatusBusy()
}, this);
SYNO.Debug("Failed on read_progress webapi");
return
}
if (1 === b.running) {
return
}
this.pollingDone(b)
},
pollingDone: function(a) {
if (this.pollDeviceId) {
this.settingsWin.pollUnreg(this.pollDeviceId);
this.pollDeviceId = null
}
if ("success" === a.result) {
this.unmaskAndClose()
} else {
this.settingsWin.getMsgBox().alert(_T("tree", "node_download"), _DT("common", "error_system"), function() {
this.unmaskAndClose()
}, this)
}
},
unmaskAndClose: function() {
this.settingsWin.getEl().unmask();
this.settingsWin.close()
}
});
Ext.ns("SYNO.SDS.DownloadStation");
Ext.define("SYNO.SDS.DownloadStation.Main", {
extend: "Ext.Panel",
leftPanelWidth: 240,
defineUIComponents: function(a) {
var c = SYNO.SDS.DownloadStation.Utils.addUIComponents;
var b = new SYNO.SDS.DownloadStation.PollingTask({
owner: this
});
c(a, "appWin", a.appWin);
c(a, "jsConfig", a.appWin.jsConfig);
c(a, "mainPanel", this);
c(a, "tabPanel", this.owner);
c(a, "pollingtask", b);
c(a, "utils", SYNO.SDS.DownloadStation.Utils);
c(a, "gData", SYNO.SDS.DownloadStation.gData)
},
constructor: function(c) {
this.owner = c.owner;
this.defineUIComponents(c);
Ext.apply(this, c.uicomponents || {});
var b = c.listItems.indexOf(c.currentItem);
var e = [];
var h = 44;
e.push(this.createSettingsBtn({
flex: 1,
height: h
}));
for (var g = 0; g < c.listItems.length; g++) {
var a = "syno-dl-tab-btn";
if (b == g) {
a += " syno-dl-tab-selected"
}
if ("aMule" === c.listItems[g].folder && !c.enable_emule) {
a += " syno-dl-tab-disabled"
}
var f = new Ext.Button({
index: g,
flex: 1,
height: h,
itemId: c.listItems[g].folder,
iconCls: c.listItems[g].iconCls,
tooltip: this.utils.getLocalizedString(c.listItems[g].text),
fn: c.listItems[g].fn,
cls: a,
handler: this.onTabBtnClick,
scope: this,
uicomponents: c.uicomponents
});
e.push(f)
}
var d = {
border: false,
width: 900,
itemId: c.currentItem.fn,
layout: "border",
cls: "syno-dl-main",
items: [{
xtype: "panel",
bodyStyle: "border: 0px",
cls: "syno-dl-leftpanel",
region: "west",
layout: {
type: "vbox",
align: "stretch"
},
width: this.leftPanelWidth,
items: [{
xtype: "panel",
layout: "fit",
border: false,
flex: 1,
items: [this.moduleList = this.createModuleList(c)]
}, this.btnTabPanel = new SYNO.ux.Panel({
xtype: "panel",
layout: "hbox",
align: "stretch",
border: false,
cls: "syno-dl-button-panel",
items: e
})]
}, this.moduleCt = new Ext.Panel({
xtype: "syno_panel",
cls: "syno-dl-rightpanel",
layout: "card",
border: false,
frame: false,
hideMode: "offsets",
region: "center"
})],
listeners: {
scope: this,
afterrender: function() {},
destroy: function() {},
activate: function() {
var i;
if (!this.moduleList || !this.moduleList.moduleList) {
return
}
for (var j in this.moduleList.moduleList) {
if (this.moduleList.moduleList.hasOwnProperty(j)) {
i = this.moduleList.moduleList[j];
if (i === this.moduleList.actived) {
if (i.activate) {
i.activate()
}
if (i.onTabActivate) {
i.onTabActivate()
}
break
}
}
}
},
deactivate: function() {
var i;
if (!this.moduleList || !this.moduleList.moduleList) {
return
}
for (var j in this.moduleList.moduleList) {
if (this.moduleList.moduleList.hasOwnProperty(j)) {
i = this.moduleList.moduleList[j];
if (i === this.moduleList.actived) {
if (i.deactivate) {
i.deactivate()
}
if (i.onTabDeactivate) {
i.onTabDeactivate()
}
break
}
}
}
}
}
};
this.callParent([Ext.apply(d, c)])
},
onTabBtnClick: function(a, b) {
var c = this.owner;
if (a.el.hasClass("syno-dl-tab-disabled")) {
if (this._S("is_admin") !== true) {
this.appWin.getMsgBox().alert("", _DT("download", "download_emule_not_enabled"));
return
}
this.appWin.getMsgBox().confirm("", _DT("download", "amule_stopped_hint"), function(d) {
if ("yes" === d) {
var e = new SYNO.SDS.DownloadStation.Settings.Window({
defaultActivedFn: "SYNO.SDS.DownloadStation.Settings.GlobalGen",
owner: this.appWin
});
e.open()
}
}, this)
} else {
if (a.index !== c.items.indexOf(this)) {
c.setActiveTab(a.index)
}
}
},
createModuleList: function(a) {
var b = Ext.apply({
toolbarConfig: {
xtype: "toolbar",
cls: "syno-dl-toolbar",
items: [this.getSearchField()]
}
}, a);
return new SYNO.SDS.DownloadStation.ModuleList(b,this)
},
createSettingsBtn: function(a) {
var b = new Ext.Button(Ext.apply({
iconCls: "syno-dl-tab_settings",
tooltip: _DT("tree", "leaf_setting"),
cls: "syno-dl-tab-btn",
handler: this.onSettingsBtnClick,
scope: this
}, a));
return b
},
onSettingsBtnClick: function() {
var a = new SYNO.SDS.DownloadStation.Settings.Window({
defaultActivedFn: this.mainPanel.itemId,
owner: this.appWin
});
a.open()
},
onCloseHandler: function() {
this.pollingtask.removeAll()
},
unmask: function() {
if (this.getEl().isMasked()) {
this.getEl().unmask()
}
},
mask: function(a) {
if (!this.getEl().isMasked()) {
this.getEl().mask(a)
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueAddFileUploader", {
extend: "SYNO.SDS.DownloadStation.Uploader.Uploader",
getOpts: function() {
return {
limitSize: SYNO.SDS.DownloadStation.DLM.QueueBasic.prototype.ADDTASK_MAXSIZE,
limitFiles: SYNO.SDS.DownloadStation.DLM.QueueBasic.prototype.ADDTASK_MAXLIMIT,
startId: this.startId
}
},
getHTML5Opts: function() {
return {
url: this.formWebAPIUrl(this.api),
allowfilters: ["torrent", "nzb", "txt"],
filefiledname: this.container.FILEFILEDNAME
}
},
onBeforeSubmit: function(a) {
if (_S("demo_mode")) {
this.showMsgIfActive(_T("common", "webman_options"), _JSLIBSTR("uicommon", "error_demo"));
return
}
if (this.handleUnzipPW() === false) {
return false
}
if (!this.isAddurlOmissibleOrValid()) {
return false
}
this.appWin.appInstance.setUserSettings("showFileInfo", this.form.findField("create_list").getValue());
if (this.isSetStatusBusy !== true) {
this.isSetStatusBusy = true;
this.owner.setStatusBusy({
text: _T("common", "saving")
})
}
a.fireEvent("onApplyWebAPIParamsIntoRequest", a)
},
getWebAPIParamsForHTML5Uploader: function() {
var b = {
type: this.form.findField("type").getValue(),
file: this.form.findField("file").getValue(),
destination: Ext.encode(this.form.findField("destination_field").getValue()),
create_list: this.form.findField("create_list").getValue()
};
var a = this.getExtractPasswordIfExisted();
if (!Ext.isEmpty(a)) {
b.extract_password = Ext.encode(a)
}
return b
},
applyFormDataForHTMLUploader: function(b) {
this.form.findField("destination").setValue(Ext.encode(this.form.findField("destination_field").getValue()));
var a = this.getExtractPasswordIfExisted();
if (!Ext.isEmpty(a)) {
this.form.findField("extract_password").setValue(Ext.encode(a))
}
},
onComplete: function(b, a) {
this.updateCreateInfo(a.data.list_id)
},
onAllDone: function(a) {
if (this.isSetStatusBusy) {
this.isSetStatusBusy = false;
this.owner.clearStatusBusy();
this.owner.clearStatus()
}
if (this.isAnyUploadError) {
this.owner.clearCreatedLists()
} else {
this.owner.onApplyHandler(true)
}
},
onError: function(a, b, c) {
if (_S("demo_mode")) {
this.showMsgIfActive(_T("common", "webman_options"), _JSLIBSTR("uicommon", "error_demo"));
return
}
if (!this.isVisible() && _DT("download", "download_empty_input_file") === b) {
this.owner.onApplyHandler(false);
return
}
this.isAnyUploadError = true;
if (this instanceof SYNO.SDS.DownloadStation.DLM.QueueAddFile) {
this.setMeActive();
this.showMsgIfActive(_DT("tree", "leaf_downloadtask"), b)
} else {
this.findAppWindow().getMsgBox().alert(_DT("tree", "leaf_downloadtask"), b)
}
},
onErrorStr: function(a, b) {
this.showMsgIfActive(_DT("tree", "leaf_downloadtask"), b)
},
onSubmit: function(a) {
a.isAnyUploadError = false;
this.callParent([a])
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.EditBtFileDialog", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, {
listIds: a.listIds,
destinations: a.destinations,
extractPasswords: a.extractPasswords
});
var b = this.fillConfig(a);
this.callParent([b]);
this.defineBehaviors()
},
defineBehaviors: function() {
this.panel = this.get("formpanel");
this.newform = this.panel.form;
this.grid = this.panel.get("gridpanel");
this.btnBack = this.fbar.get("back");
this.btnNext = this.fbar.get("next")
},
fillConfig: function(a) {
var b = {
owner: this.appWin,
cls: "syno-dl-win syno-dl-add-fileinfo-dailog",
width: 640,
height: 510,
minWidth: 520,
minHeight: 460,
constrainHeader: true,
plain: true,
monitorResize: true,
title: _DT("tree", "leaf_downloadtask"),
layout: "fit",
items: [this.initFormConfig(a)],
fbar: {
cls: "x-statusbar",
defaultText: "&nbsp;",
buttonAlign: "left",
items: this.getFbarItemsCfg()
}
};
Ext.apply(b, a);
return b
},
getFbarItemsCfg: function(b) {
var c, a;
c = [{
itemId: "back",
tooltip: _T("common", "back"),
iconCls: "syno-dlm-tbar-back",
disabled: true,
scope: this,
handler: function() {
this.curIndex--;
this.switchPage()
}
}, {
itemId: "next",
tooltip: _T("common", "next"),
iconCls: "syno-dlm-tbar-next",
disabled: true,
scope: this,
handler: function() {
this.curIndex++;
this.switchPage()
}
}, {
itemId: "page_index",
xtype: "displayfield",
hideLabel: true,
value: "",
style: {
marginLeft: "20px",
fontSize: "10pt"
}
}, "->"];
a = SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
btnStyle: "blue",
xtype: "syno_button",
itemId: "create",
text: _DT("download", "download_btn_new"),
scope: this,
handler: this.onBeforeSubmit
}, {
text: _DT("common", "cancel"),
xtype: "syno_button",
scope: this,
handler: function() {
this.onCloseHandler(false, 0, 0)
}
});
return c.concat(a)
},
updateSwitchPageBtnState: function() {
this.btnNext.setDisabled(this.curIndex === this.listIds.length - 1);
this.btnBack.setDisabled(this.curIndex === 0)
},
switchPage: function() {
this.updateSwitchPageBtnState();
if (this.listData[this.curIndex]) {
this.store.loadData(this.listData[this.curIndex])
} else {
this.store.reload()
}
},
initFormConfig: function(a) {
var b = {
xtype: "syno_formpanel",
itemId: "formpanel",
autoFlexcroll: false,
labelAlign: "left",
trackResetOnLoad: true,
waitMsgTarget: true,
border: false,
labelWidth: 160,
items: [{
xtype: "syno_compositefield",
itemId: "destselectfield",
fieldLabel: _DT("download", "download_list_dest_folder"),
defaults: {
hideLabel: true
},
items: [{
xtype: "syno_textfield",
readOnly: true,
name: "destination",
width: 209
}, {
xtype: "syno_button",
text: _DT("download", "download_btn_change"),
scope: this,
handler: function() {
this.utils.chooseDestHandler({
owner: this.owner,
callback: this.onDestChanged,
callbackScope: this
})
}
}]
}, {
xtype: "syno_displayfield",
width: "auto",
fieldLabel: _DT("download", "download_list_filename"),
name: "name"
}, {
xtype: "syno_displayfield",
width: "auto",
fieldLabel: _DT("download", "download_list_filesize"),
name: "size"
}, {
xtype: "syno_checkbox",
boxLabel: _DT("download", "task_list_create_subfolder"),
checked: true,
name: "subfolder_check",
listeners: {
scope: this,
check: this.onSubfolderChecked
}
}, this.initGridConfig(a)]
};
return b
},
onDestChanged: function(c, b, a) {
var d = b.path.substr(1);
this.newform.findField("destination").setValue(d);
this.destinations[this.curIndex] = d;
c.close()
},
onSubfolderChecked: function(b, c, a) {
this.subfolder[this.curIndex] = c
},
initGridConfig: function(a) {
this.enableColumn = new SYNO.ux.EnableColumn({
align: "center",
dataIndex: "enable",
width: 50,
enableFastSelectAll: true,
isIgnore: this.onCheckEnabled.createDelegate(this)
});
this.colmd = this.createColModel();
this.store = this.createStore();
var b = {
xtype: "syno_gridpanel",
name: "files_grid",
itemId: "gridpanel",
height: 307,
cls: "without-dirty-red-grid",
stripeRows: true,
loadMask: true,
autoExpandColumn: "dl-files",
enableColumnMove: false,
enableColLock: false,
enableColumnHide: false,
enableHdMenu: false,
bbar: this.paging,
selModel: new Ext.grid.RowSelectionModel({
singleSelect: false
}),
colModel: this.colmd,
store: this.store,
plugins: [this.enableColumn]
};
return b
},
createColModel: function() {
var a = new Ext.grid.ColumnModel({
defaultSortable: false,
columns: [this.enableColumn, {
id: "dl-files",
header: _DT("download", "download_list_filename"),
dataIndex: "name",
sortable: true,
renderer: SYNO.SDS.DownloadStation.DLM.Util.nameRender.createDelegate(this)
}, {
header: _DT("download", "download_list_filesize"),
dataIndex: "size",
sortable: true,
width: 120,
renderer: SYNO.SDS.DownloadStation.DLM.Util.sizeRenderer
}]
});
return a
},
createStore: function() {
var a = new SYNO.API.JsonStore({
api: "SYNO.DownloadStation2.Task.List",
method: "get",
version: 2,
autoLoad: true,
autoDestroy: true,
remoteSort: false,
pruneModifiedRecords: false,
appWindow: this,
idProperty: "index",
fields: [{
name: "name",
sortType: "asNaturalUCString"
}, "size", "index", "download_url", {
name: "enable",
mapping: "enable",
defaultValue: true
}],
root: "files",
listeners: {
scope: this,
beforeload: this.onBeforeLoad,
load: this.onLoad,
exception: this.onRequestException
}
});
return a
},
onRequestException: function(d, e, f, c, b, a) {
if (b.code) {
if (!this.grid.getGridEl().isMasked()) {
this.grid.getGridEl().mask(SYNO.SDS.DownloadStation.Utils.getErrorString(b.code))
}
}
},
updateTitle: function() {
var a = (this.listIds.length > 1) ? String.format("({0}/{1})", this.curIndex + 1, this.listIds.length) : "";
this.setTitle(_DT("tree", "leaf_downloadtask") + a)
},
onBeforeLoad: function(a, b) {
this.updateTitle();
if (!this.listIds[this.curIndex]) {
return false
}
b.params.list_id = this.listIds[this.curIndex];
return true
},
onLoad: function(a, c, b) {
if (this.listData[this.curIndex]) {
this.onLoadByData(a)
} else {
this.onLoadByApi(a)
}
},
onLoadByApi: function(a) {
this.listData[this.curIndex] = a.reader.jsonData;
this.updateFormDisplay(a.reader.jsonData);
this.initFilesSelectedState(a);
if (this.grid.getGridEl()) {
this.grid.getGridEl().unmask()
}
},
onLoadByData: function(a) {
this.updateTitle();
this.updateFormDisplay(a.reader.jsonData)
},
updateFormDisplay: function(a) {
this.newform.setValues({
destination: this.destinations[this.curIndex]
});
var b = a.type === "bt";
this.newform.findField("subfolder_check").setVisible(!b);
if (!b) {
this.newform.findField("subfolder_check").setValue(this.subfolder[this.curIndex])
}
this.newform.setValues({
name: a.title
});
this.colmd.setHidden(2, !b);
this.newform.findField("size").setVisible(b);
if (b) {
this.newform.setValues({
size: Ext.util.Format.fileSize(a.size)
})
}
},
initFilesSelectedState: function(a) {
var c = a.reader.jsonData.files;
var b = a.reader.jsonData.selected;
if (Ext.isArray(b)) {
c.forEach(function(e, d) {
e.enable = (-1 !== b.indexOf(e.index))
});
delete a.reader.jsonData.selected
} else {
c.forEach(function(d) {
d.enable = true
})
}
this.updateSelectionByFileInfos(a, c)
},
updateSelectionByFileInfos: function(a, b) {
a.each(function(c, d) {
c.data.enable = b[c.get("index")].enable
});
a.fireEvent("datachanged", this)
},
onBeforeSubmit: function() {
var b = this.getMsgBox().alert.createDelegate(this.getMsgBox(), [_DT("download", "download_btn_downloadstation"), _DT("download", "download_error_rss_no_selection")]);
if (this.isNoFileSelection(this.listData[this.curIndex])) {
b();
return
}
for (var a = 0; a < this.listIds.length; a++) {
if (this.listData[a] && this.isNoFileSelection(this.listData[a])) {
this.curIndex = a;
this.switchPage();
b();
return
}
}
this.onSubmit()
},
onSubmit: function() {
this.getEl().mask(_DT("common", "saving"), "x-mask-loading");
this.requestSuccessCount = 0;
this.requestDoneCount = 0;
for (var a = 0; a < this.listIds.length; a++) {
this.sendWebAPIForSpecificList(a)
}
},
sendWebAPIForSpecificList: function(a) {
var b = {
list_id: this.listIds[a],
destination: this.destinations[a],
create_subfolder: this.subfolder[a]
};
if (!Ext.isEmpty(this.listData[a])) {
b.selected = this.generateAPIParamsSelected(this.listData[a].files)
}
if (!Ext.isEmpty(this.extractPasswords[a])) {
b.extract_password = this.extractPasswords[a]
}
this.downloadPollingStart(b)
},
downloadPollingStart: function(a) {
this.sendWebAPI({
api: "SYNO.DownloadStation2.Task.List.Polling",
method: "download",
version: 2,
params: a,
callback: function(c, b) {
if (true !== c) {
this.onSubmitDone(false, b, a.list_id);
return
}
this.downloadPollingStatus(b.task_id, a.list_id)
},
scope: this
})
},
downloadPollingStatus: function(a, b) {
this.sendWebAPI({
api: "SYNO.DownloadStation2.Task.List.Polling",
method: "download_status",
version: 2,
params: {
task_id: a
},
callback: function(d, c) {
if (true !== d) {
this.downloadPollingDone(a, {
success: false,
error: c
}, b);
return
}
if (!c.finish) {
Ext.defer(function() {
this.downloadPollingStatus(a, b)
}, 1000, this)
} else {
this.downloadPollingDone(a, c, b)
}
},
scope: this
})
},
downloadPollingDone: function(a, b, c) {
this.sendWebAPI({
api: "SYNO.DownloadStation2.Task.List.Polling",
method: "download_stop",
version: 2,
params: {
task_id: a
},
callback: function(e, d) {
if (true !== e) {
this.onSubmitDone(false, d, c);
return
}
this.onSubmitDone(b.success, b.success ? b.data : b.error, c)
},
scope: this
})
},
generateAPIParamsSelected: function(b) {
var a = [];
b.forEach(function(c) {
if (c.enable) {
a.push(c.index)
}
});
return a
},
onSubmitDone: function(b, a, d) {
this.requestDoneCount++;
if (b) {
this.requestSuccessCount++;
var c = this.listIds.indexOf(d);
this.listIds[c] = undefined
} else {
this.getMsgBox().alert(_DT("download", "download_btn_downloadstation"), SYNO.SDS.DownloadStation.Utils.getErrorString(a.code))
}
if (this.requestDoneCount === this.listIds.length) {
this.onAllSubmitDone()
}
},
onAllSubmitDone: function() {
this.getEl().unmask();
if (this.requestSuccessCount === this.listIds.length) {
this.queueGrid.preSelectLastRecord();
this.queueGrid.updateRecords(true);
this.close();
return
}
this.removeCompletedList();
this.curIndex = 0;
this.switchPage()
},
removeCompletedList: function() {
var c = []
, b = []
, d = []
, a = [];
Ext.each(this.listIds, function(e, f) {
if (e) {
c.push(this.listIds[f]);
b.push(this.destinations[f]);
d.push(this.subfolder[f]);
a.push(this.listData[f])
}
}, this);
this.listIds = c;
this.destinations = b;
this.subfolder = d;
this.listData = a
},
onCloseHandler: function() {
var a = [];
Ext.each(this.listIds, function(b) {
a.push({
api: "SYNO.DownloadStation2.Task.List",
method: "delete",
version: 2,
params: {
list_id: b
}
})
});
this.sendWebAPI({
compound: {
stopwhenerror: false,
params: a
},
callback: this.onDeletionDone
});
this.close()
},
onDeletionDone: function(d, a, c, b) {
if (!d || !a.has_fail) {
return
}
Ext.each(a.result, function(e, f) {
if (!e.success) {
SYNO.Debug(String.format("Failed on {0}#{1}, with list_id {2} and error code {3}", e.api, e.method, c.compound[f].list_id, e.error.code))
}
})
},
onCheckEnabled: function(b, a) {
if (b !== "cell" && b !== "all") {
return false
}
a.json.enable = !a.get("enable");
return false
},
load: function() {
this.curIndex = 0;
this.subfolder = this.utils.fillArray(true, this.listIds.length);
this.listData = this.utils.fillArray(undefined, this.listIds.length);
this.updateSwitchPageBtnState();
this.show()
},
isNoFileSelection: function(b) {
var a = Ext.each(b.files, function(c) {
return c.enable !== true
});
return undefined === a
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueAddDialog", {
extend: "SYNO.SDS.ModalWindow",
hideTabHeader: false,
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
var b = this.fillConfig(a);
this.callParent([b]);
this.defineBehaviors(a)
},
defineBehaviors: function(a) {
this.listIds = [];
this.destinations = [];
this.extractPasswords = []
},
fillConfig: function(a) {
a.startButtonId = Ext.id();
var b = {
owner: this.appWin,
cls: "syno-dl-win",
width: 580,
height: 468,
minWidth: 200,
minHeight: 200,
constrainHeader: true,
title: _DT("tree", "leaf_downloadtask"),
layout: "fit",
items: [this.getTabPanel(a)],
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
btnStyle: "blue",
text: _T("common", "apply"),
id: a.startButtonId,
scope: this,
disabled: _S("demo_mode"),
tooltip: _S("demo_mode") ? _JSLIBSTR("uicommon", "error_demo") : undefined
}, {
text: _T("common", "cancel"),
scope: this,
handler: this.close
}),
keys: [{
key: 27,
scope: this,
handler: this.close
}],
listeners: {
scope: this,
close: this.onClose,
beforeclose: this.onBeforeClose
}
};
Ext.apply(b, a);
return b
},
onClose: function() {
this.pollingtask.startById("updateTask", true)
},
onBeforeClose: function() {
if (!Ext.isEmpty(this.listIds)) {
var a = new SYNO.SDS.DownloadStation.DLM.EditBtFileDialog({
uicomponents: this.uicomponents,
listIds: this.listIds,
destinations: this.destinations,
extractPasswords: this.extractPasswords
});
a.load()
}
},
onApplyHandler: function(a) {
this.getTabPanel().applyHandler(a)
},
getTabPanel: function(a) {
if (!this.addTabPanel) {
var d = new SYNO.SDS.DownloadStation.DLM.QueueAddFile({
startButtonId: a.startButtonId,
files: a.files,
owner: this,
uicomponents: this.uicomponents,
itemId: "addfile",
title: _DT("download", "download_lbl_input_file")
});
var c = new SYNO.SDS.DownloadStation.DLM.QueueAddURL({
owner: this,
urls: a.urls,
padding: a.hideTabHeader ? 0 : undefined,
uicomponents: this.uicomponents,
itemId: "addurl",
title: _DT("download", "download_lbl_input_url")
});
var b = {
owner: this,
height: 550,
layoutOnTabChange: true,
activeTab: (a && a.activeTab) ? a.activeTab : 0,
items: [d, c]
};
if (a.hideTabHeader) {
b.headerCfg = {
style: "display:none;"
};
b.bodyCfg = {
padding: 0
}
}
this.addTabPanel = new SYNO.SDS.DownloadStation.DLM.QueueAddTabPanel(b)
}
return this.addTabPanel
},
clearCreatedLists: function() {
this.deleteCreatedLists();
this.listIds = [];
this.destinations = [];
this.extractPasswords = []
},
deleteCreatedLists: function() {
if (this.listIds.length === 0) {
return
}
var a = [];
Ext.each(this.listIds, function(b) {
a.push({
api: "SYNO.DownloadStation2.Task.List",
method: "delete",
version: 2,
params: {
list_id: b
}
})
});
this.sendWebAPI({
compound: {
stopwhenerror: false,
params: a
},
callback: this.onDeletionDone
})
},
onDeletionDone: function(d, a, c, b) {
if (!d || !a.has_fail) {
return
}
Ext.each(a.result, function(e, f) {
if (!e.success) {
SYNO.Debug(String.format("Failed on {0}#{1}, with list_id {2} and error code {3}", e.api, e.method, c.compound[f].list_id, e.error.code))
}
})
}
});
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueAddTabPanel", {
extend: "SYNO.ux.TabPanel",
constructor: function(a) {
var b = {
plain: true,
height: 300,
deferredRender: false,
autoWidth: true,
listeners: {
scope: this,
tabchange: this.onTabchange
}
};
Ext.apply(b, a || {});
this.callParent([b])
},
applyHandler: function(a) {
var c = this.get("addurl"), b;
if (a && c.isEmptyUrl()) {
this.onCreateSuccess();
return
}
b = c.getWebAPICreateData();
if (Ext.isEmpty(b)) {
return
}
this.owner.setStatusBusy({
text: _T("common", "saving")
});
this.sendWebAPI({
webapi: b,
callback: function(f, d, e) {
this.owner.clearStatusBusy();
if (f && d.list_id) {
c.updateCreateInfo(d.list_id);
this.onCreateSuccess()
} else {
c.setMeActive();
this.onCreateFailure(d);
this.owner.clearCreatedLists()
}
},
scope: this
})
},
onCreateSuccess: function(a, b) {
this.owner.setStatusOK();
this.owner.queueGrid.preSelectLastRecord();
this.owner.close()
},
onCreateFailure: function(a) {
if (this.isDestroyed) {
return
}
this.owner.getMsgBox().alert(_T("helptoc", "settings"), SYNO.SDS.DownloadStation.Utils.getErrorString(a.code))
},
onTabchange: function() {
this.owner.clearStatus()
}
});
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon", {
statics: {
getUnzipPWConfig: function() {
if (SYNO.SDS.DownloadStation.DLM.Util.isUnzipServiceOn()) {
return {
xtype: "syno_textfield",
fieldLabel: _DT("settings", "unzip_add_pw"),
name: "extract_password_field",
width: 205
}
} else {
return []
}
},
getExtractPasswordIfExisted: function() {
if (SYNO.SDS.DownloadStation.DLM.Util.isUnzipServiceOn()) {
return this.form.findField("extract_password_field").getValue()
} else {
return ""
}
},
handleUnzipPW: function() {
if (SYNO.SDS.DownloadStation.DLM.Util.isUnzipServiceOn()) {
var a = this.form.findField("extract_password_field").getValue();
return SYNO.SDS.DownloadStation.DLM.Util.handleNewUnzipPW.createDelegate(this, [a])()
}
return true
},
getCreateListFromUserSettings: function() {
if (this.appWin.appInstance.getUserSettings("showFileInfo") === false) {
return false
} else {
return true
}
},
showMsgIfActive: function(d, c, b, a) {
if (this.owner.getTabPanel().activeTab == this) {
this.owner.getMsgBox().alert(d, c, b, a)
}
},
setMeActive: function() {
this.owner.getTabPanel().activate(this)
},
updateCreateInfo: function(b, a) {
if (!this.form.findField("create_list").getValue()) {
return
}
this.owner.listIds = this.owner.listIds.concat(b);
this.owner.destinations = this.owner.destinations.concat(this.utils.fillArray(a, b.length));
var c = this.getExtractPasswordIfExisted();
this.owner.extractPasswords = this.owner.extractPasswords.concat(this.utils.fillArray(c, b.length))
}
}
});
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueAddFile", {
extend: "SYNO.ux.FormPanel",
FILEFILEDNAME: "torrent",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
var c = new SYNO.SDS.DownloadStation.DLM.QueueAddFileUploader({
startId: a.startButtonId,
files: a.files,
api: this.getWebAPIName()
});
var b = {
border: false,
xtype: "form",
fileUpload: true,
frame: false,
trackResetOnLoad: true,
labelWidth: 161,
plugins: [c],
api: this.getWebAPIName(),
method: this.getWebAPIMethod(),
version: this.getWebAPIVersion(),
items: [{
xtype: "syno_compositefield",
itemId: "destselectfield",
fieldLabel: _DT("download", "download_list_dest_folder"),
defaults: {
hideLabel: true
},
items: [{
xtype: "syno_textfield",
name: "destination_field",
readOnly: true,
value: SYNO.SDS.DownloadStation.DLM.Util.getLocationDestination(),
width: 205
}, {
xtype: "syno_button",
text: _T("common", "choose"),
disabled: _S("demo_mode"),
scope: this,
handler: function() {
this.utils.chooseDestHandler({
owner: this.owner,
destinationField: this.form.findField("destination_field")
})
}
}, {
xtype: "hidden",
name: "destination"
}]
}, {
xtype: "hidden",
value: Ext.encode("file"),
name: "type"
}, {
xtype: "hidden",
value: Ext.encode([this.FILEFILEDNAME]),
name: "file"
}, SYNO.SDS.DownloadStation.Uploader.Utils.getButtonTemplate({
name: this.FILEFILEDNAME
}), {
xtype: "syno_displayfield",
value: "( eg. download.torrent, download.nzb, urls.txt )",
hideLabel: false
}, this.getUnzipPWConfig(), this.getHiddenUnzipPWConfig(), {
xtype: "syno_checkbox",
submitValue: false,
boxLabel: _DT("download", "show_file_info_desc"),
name: "create_list",
checked: this.getCreateListFromUserSettings()
}]
};
return Ext.apply(b, a)
},
isAddurlOmissibleOrValid: function() {
var a = this.ownerCt.get("addurl");
if ((a !== this.ownerCt.activeTab) && a.isEmptyUrl()) {
return true
}
return !Ext.isEmpty(a.getWebAPICreateData())
},
getUnzipPWConfig: function() {
return SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.getUnzipPWConfig.call(this)
},
getHiddenUnzipPWConfig: function() {
if (SYNO.SDS.DownloadStation.DLM.Util.isUnzipServiceOn()) {
return {
xtype: "hidden",
value: "",
name: "extract_password"
}
} else {
return []
}
},
getExtractPasswordIfExisted: function() {
return SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.getExtractPasswordIfExisted.call(this)
},
handleUnzipPW: function() {
return SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.handleUnzipPW.call(this)
},
getCreateListFromUserSettings: function() {
return SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.getCreateListFromUserSettings.call(this)
},
showMsgIfActive: function(d, c, b, a) {
SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.showMsgIfActive.call(this, d, c, b, a)
},
setMeActive: function() {
SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.setMeActive.call(this)
},
updateCreateInfo: function(b) {
var a = this.form.findField("destination_field").getValue();
SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.updateCreateInfo.call(this, b, a)
},
getWebAPIName: function() {
return "SYNO.DownloadStation2.Task"
},
getWebAPIMethod: function() {
return "create"
},
getWebAPIVersion: function() {
return 2
}
});
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueAddURL", {
extend: "SYNO.ux.FormPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
var b = this.fillConfig(a);
this.callParent([b]);
this.defineBehaviors();
this.ADDTASK_MAXLIMIT = SYNO.SDS.DownloadStation.DLM.QueueBasic.prototype.ADDTASK_MAXLIMIT
},
fillConfig: function(a) {
var d = a.urls;
var c = "( http://, https://, ftp://, ftps://, sftp://, magnet:, thunder://, flashget://, qqdl://)";
var b = {
border: false,
trackResetOnLoad: true,
height: 430,
labelWidth: 161,
items: [{
xtype: "hidden",
value: "url",
name: "type"
}, {
xtype: "syno_compositefield",
itemId: "destselectfield",
fieldLabel: _DT("download", "download_list_dest_folder"),
defaults: {
hideLabel: true
},
items: [{
xtype: "syno_textfield",
name: "destination",
readOnly: true,
value: SYNO.SDS.DownloadStation.DLM.Util.getLocationDestination(),
width: 205
}, {
xtype: "syno_button",
text: _T("common", "choose"),
disabled: _S("demo_mode"),
scope: this,
handler: function() {
this.utils.chooseDestHandler({
owner: this.owner,
destinationField: this.form.findField("destination")
})
}
}]
}, {
xtype: "syno_textarea",
cls: "selectabletext allowDefCtxMenu",
fieldLabel: _DT("download", "download_lbl_input_url"),
name: "url",
submitValue: false,
autoFlexcroll: true,
value: (d && d.length) ? d.join("\n") : "",
width: 299,
height: 100
}, {
xtype: "syno_displayfield",
value: c,
hideLabel: false
}, {
xtype: "syno_checkbox",
boxLabel: _DT("download", "download_need_auth"),
hideLabel: false,
name: "dlauth"
}, {
xtype: "syno_textfield",
fieldLabel: _DT("download", "download_auth_user"),
labelStyle: "padding-left: 136px; width: 121px;",
name: "username",
allowBlank: false,
validateOnBlur: true,
validationEvent: "blur",
maxlength: 128,
width: 169,
indent: 1
}, {
xtype: "syno_textfield",
fieldLabel: _DT("download", "download_auth_pass"),
labelStyle: "padding-left: 136px; width: 121px;",
name: "password",
inputType: "password",
maxlength: 128,
width: 169,
indent: 1
}, this.getUnzipPWConfig(), {
xtype: "syno_checkbox",
boxLabel: _DT("download", "show_file_info_desc"),
name: "create_list",
checked: this.getCreateListFromUserSettings()
}]
};
return Ext.apply(b, a)
},
defineBehaviors: function() {
new SYNO.ux.Utils.EnableCheckGroup(this.getForm(),"dlauth",["username", "password"]);
new SYNO.SDS.DownloadStation.ShowHideCheckGroup(this.getForm(),"dlauth",["username", "password"]);
this.mon(this, "activate", function(b) {
var a = this.form.findField("url");
a.focus.defer(300, a)
}, this)
},
getWebAPICreateData: function() {
var a = this.getWebAPICreateParams();
if (Ext.isEmpty(a)) {
return
}
return {
api: "SYNO.DownloadStation2.Task",
method: "create",
version: 2,
params: a
}
},
getWebAPICreateParams: function() {
if (!this.form.isValid()) {
return
}
var a = this.getValidURL();
if (false === a) {
return
}
var c = this.form.getValues();
c.url = a;
delete c.dlauth;
if (true === this.form.findField("dlauth").getValue()) {
c.username = encodeURIComponent(c.username);
c.password = encodeURIComponent(c.password)
}
c.create_list = (c.create_list === "true");
if (!this.handleUnzipPW()) {
return
}
var b = this.getExtractPasswordIfExisted();
if (!Ext.isEmpty(b)) {
c.extract_password = b
}
this.appWin.appInstance.setUserSettings("showFileInfo", c.create_list);
return c
},
getValidURL: function() {
var c = false, b = [], d, a;
d = this.form.findField("url").getValue();
d = Ext.util.Format.trim(d);
if ("" === d) {
this.setMeActive();
this.showMsgIfActive(_DT("tree", "leaf_downloadtask"), _DT("download", "download_empty_input_url"));
return false
}
Ext.each(d.split("\n"), function(e) {
e = Ext.util.Format.trim(e);
if (e.length < 1) {
return true
}
a = SYNO.SDS.DownloadStation.Utils.canonizeURLPrefix(e);
if (a) {
b.push(a)
} else {
c = true
}
}, this);
if (b.length < 1) {
this.setMeActive();
this.showMsgIfActive(_DT("tree", "leaf_downloadtask"), _DT("download", "download_error_wrong_url"));
return false
} else {
if (b.length > this.ADDTASK_MAXLIMIT) {
this.setMeActive();
this.showMsgIfActive(_DT("tree", "leaf_downloadtask"), String.format(_DT("dlqueue", "error_task_add_exceed_maxnumber"), this.ADDTASK_MAXLIMIT));
return false
}
}
if (c) {
this.showMsgIfActive(_DT("tree", "leaf_downloadtask"), _DT("download", "download_error_bad_urls_found"))
}
return b
},
isEmptyUrl: function() {
var a = this.form.findField("url").getValue();
a = Ext.util.Format.trim(a);
return "" === a
},
getUnzipPWConfig: function() {
return SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.getUnzipPWConfig.call(this)
},
getExtractPasswordIfExisted: function() {
return SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.getExtractPasswordIfExisted.call(this)
},
handleUnzipPW: function() {
return SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.handleUnzipPW.call(this)
},
getCreateListFromUserSettings: function() {
return SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.getCreateListFromUserSettings.call(this)
},
showMsgIfActive: function(d, c, b, a) {
SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.showMsgIfActive.call(this, d, c, b, a)
},
setMeActive: function() {
SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.setMeActive.call(this)
},
updateCreateInfo: function(b) {
var a = this.form.findField("destination").getValue();
SYNO.SDS.DownloadStation.DLM.QueueAddSubPanleCommon.updateCreateInfo.call(this, b, a)
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueEditBtDialog", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.selections = this.queueGrid.getSelectionModel().getSelections();
this.isSingle = (1 === this.selections.length) ? true : false;
this.isEditActiveTorrent = this.isAllActiveTorrent();
var b = this.fillConfig(a);
this.callParent([b]);
this.mon(this, "afterlayout", this.onAddTip, this, {
single: true
});
this.defineBehaviors()
},
fillConfig: function(a) {
var b = {
owner: this.appWin,
cls: "syno-dl-win",
width: this.isEditActiveTorrent ? 720 : 560,
minWidth: 640,
autoHeight: true,
resizable: false,
title: _DT("tree", "leaf_downloadtask"),
layout: "fit",
items: [this.initFormConfig()],
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
btnStyle: "blue",
text: _T("common", "ok"),
scope: this,
handler: this.saveSetting
}, {
text: _T("common", "cancel"),
scope: this,
handler: this.onCloseHandler
}),
keys: [{
key: [10, 13],
fn: this.saveSetting,
scope: this
}, {
key: 27,
fn: this.onCloseHandler,
scope: this
}]
};
return Ext.apply(b, a)
},
defineBehaviors: function() {
this.settingform = this.get("property").form
},
onAddTip: function() {
var a = this.settingform.findField("stoptask_desc");
if (a) {
SYNO.SDS.DownloadStation.Utils.AddTip(a.getEl(), _DT("service", "service_dl_bt_seeding_hint"));
a.originalValue = a.getValue()
}
},
initFormConfig: function() {
var a = [{
xtype: "syno_compositefield",
itemId: "destinationField",
width: 340,
defaults: {
hideLabel: true
},
fieldLabel: _DT("download", "download_list_dest_folder"),
items: [{
xtype: "syno_textfield",
name: "destination",
width: 200,
readOnly: true
}, {
xtype: "syno_button",
text: _T("common", "choose"),
scope: this,
handler: function() {
this.utils.chooseDestHandler({
owner: this.owner,
destinationField: this.settingform.findField("destination")
})
}
}]
}, {
xtype: "syno_textfield",
fieldLabel: _DT("settings", "unzip_pw"),
itemId: "extract_password",
name: "extract_password"
}];
if (true === this.isEditActiveTorrent) {
a = a.concat([{
xtype: "syno_displayfield",
name: "stoptask_desc",
submitValue: false,
width: 700,
value: _DT("service", "service_dl_bt_stoptask_desc")
}, {
xtype: "syno_numberfield",
indent: 1,
fieldLabel: _DT("service", "service_dl_bt_seeding_ratio"),
name: "seeding_ratio",
allowBlank: true,
allowDecimals: false,
allowNegative: false,
minValue: 0,
maxValue: 2147483647,
maxLength: 10
}, {
xtype: "syno_compositefield",
name: "seeding_interval_compositefield",
indent: 1,
items: [{
maskRe: /[\d]/,
xtype: "syno_combobox",
width: 200,
maxlength: 3,
fieldLabel: _DT("service", "service_dl_bt_seeding_interval"),
name: "seeding_interval",
store: SYNO.SDS.DownloadStation.DLM.Util.createSeedTimeStore(),
displayField: "display",
valueField: "value",
selectOnFocus: true,
value: 0,
initQuery: Ext.emptyFn,
setValue: function(d) {
SYNO.ux.ComboBox.prototype.setValue.apply(this, arguments);
var c = this;
var e = (("0" != d) && (-2 == d || -1 == c.store.data.keys.indexOf(d)));
c.setEditable(e);
c.nextSibling().setValue(e ? _T("service", "service_dl_bt_seedopt_unit_hours") : "");
if (-2 == d) {
c.setRawValue()
} else {
if (e && d > 0) {
c.setRawValue(d / 60)
}
}
},
listeners: {
scope: this,
blur: function(c) {
var d = c.getValue();
var e = (-2 == d || -1 == c.store.data.keys.indexOf(d));
if ("" === d || "0" === d) {
c.setValue(0)
} else {
if (e && d > 0) {
c.setValue(d * 60)
}
}
}
},
validator: function(d) {
if (-1 < this.store.findExact("display", d)) {
return true
}
var c = new RegExp("^[1-9][0-9]{0,4}$");
return c.test(d)
}
}, {
xtype: "syno_displayfield",
value: "",
isDirty: function() {
return false
}
}]
}, {
xtype: "syno_numberfield",
name: "max_upload_rate",
allowBlank: true,
allowDecimals: false,
allowNegative: false,
minValue: 0,
maxLength: 6,
fieldLabel: _DT("service", "service_dl_bt_max_upload") + String.format("[0: {0}]", _DT("common", "default"))
}, {
xtype: "syno_numberfield",
name: "max_download_rate",
allowBlank: true,
allowDecimals: false,
allowNegative: false,
minValue: 0,
maxLength: 6,
fieldLabel: _DT("service", "service_dl_bt_max_download") + String.format("[0: {0}]", _DT("common", "default"))
}, {
xtype: "syno_combobox",
name: "priority",
allowBlank: true,
fieldLabel: _DT("dlqueue", "title_dl_priority"),
store: [["high", _DT("dlqueue", "dl_priority_high")], ["normal", _DT("dlqueue", "dl_priority_normal")], ["low", _DT("dlqueue", "dl_priority_low")]]
}, {
xtype: "syno_numberfield",
name: "max_peers",
allowBlank: true,
allowDecimals: false,
allowNegative: false,
minValue: 5,
maxValue: 10000,
maxLength: 5,
fieldLabel: _DT("service", "service_dl_bt_maxpeers")
}])
}
var b = {
xtype: "form",
padding: "0 0 14px 0",
autoHeight: true,
fileUpload: false,
itemId: "property",
labelAlign: "left",
trackResetOnLoad: true,
waitMsgTarget: true,
border: false,
labelWidth: this.isEditActiveTorrent ? 340 : 180,
layoutConfig: {
trackLabels: true
},
defaults: {
width: 200
},
items: a
};
return b
},
load: function() {
if (SYNO.SDS.DownloadStation.DLM.Util.isUnzipServiceOn()) {
this.setUnzipFieldVisible(true)
} else {
this.setUnzipFieldVisible(false)
}
this.taskIds = [];
Ext.each(this.selections, function(c, a, b) {
this.taskIds.push(c.get("task_id"))
}, this);
if (this.isSingle) {
this.setTitle(_DT("tree", "leaf_downloadtask") + (" - " + this.selections[0].get("filename")));
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task.BT",
method: "get",
params: {
task_id: this.selections[0].get("task_id")
},
version: 2,
scope: this,
callback: function(d, b, c, a) {
this.settingform.setValues(b);
if (false === b.is_active_torrent) {
this.setTorrentFieldsVisible(false);
this.setDstFieldVisible(true)
} else {
if (SYNO.SDS.DownloadStation.DLM.Util.isSeedingStatus(this.selections[0].get("status"))) {
this.setDstFieldVisible(false)
}
}
this.show()
}
})
} else {
this.setTitle(_DT("tree", "leaf_downloadtask"));
this.show()
}
},
onCloseHandler: function(a, c, b) {
this.settingform.reset();
this.close()
},
saveSetting: function() {
if (this.isEditActiveTorrent) {
this.saveTorrentSetting()
} else {
this.saveDestination()
}
},
saveTorrentSetting: function() {
var b, a;
if (!this.settingform.isValid()) {
this.setStatusError({
text: _T("common", "forminvalid"),
clear: true
});
return
}
if (!this.settingform.isDirty()) {
this.onCloseHandler();
return
}
b = {
task_id: this.taskIds
};
a = this._getBTSetFieldValues();
if (this.handlePassword(a) === false) {
return
}
if (0 === Object.keys(a).length) {
this.onCloseHandler();
return
}
Ext.apply(b, a);
this.setStatusBusy({
text: _T("common", "saving")
});
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task.BT",
method: "set",
params: b,
version: 2,
scope: this,
callback: function(f, d, e, c) {
this.clearStatusBusy();
if (!f) {
this.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(d.code))
} else {
this.close()
}
}
})
},
handlePassword: function(c) {
if (SYNO.SDS.DownloadStation.DLM.Util.isUnzipServiceOn()) {
var b = this.settingform.findField("extract_password");
if (b && b.isDirty()) {
var a = b.getValue();
if (false === SYNO.SDS.DownloadStation.DLM.Util.handleNewUnzipPW.createDelegate(this, [a])()) {
return false
}
c.extract_password = a
}
}
return true
},
saveDestination: function() {
var a;
if (!this.settingform.isDirty()) {
this.onCloseHandler()
} else {
a = {
id: this.taskIds,
destination: this.settingform.findField("destination").getValue()
};
if (this.handlePassword(a) === false) {
return false
}
this.setStatusBusy({
text: _T("common", "saving")
});
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task",
method: "edit",
params: a,
version: 2,
scope: this,
callback: function(e, c, d, b) {
this.clearStatusBusy();
if (!e) {
this.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(c.code))
} else {
this.close()
}
}
})
}
return a
},
setTorrentFieldsVisible: function(b) {
var a = this.get("property");
a.items.each(function(e, c, d) {
if (e.itemId !== "destinationField" && e.itemId !== "extract_password") {
e.setVisible(b);
e.setDisabled(!b)
}
}, this)
},
setDstFieldVisible: function(c) {
var a = this.get("property");
var b = a.get("destinationField");
b.setVisible(c);
b.setDisabled(!c)
},
setUnzipFieldVisible: function(c) {
var a = this.get("property");
var b = a.get("extract_password");
b.setVisible(c);
b.setDisabled(!c)
},
isAllActiveTorrent: function() {
var a = true;
console.log("here");
Ext.each(this.selections, function(d, b, c) {
if ("bt" !== d.get("type") || !SYNO.SDS.DownloadStation.DLM.Util.isActiveTorrentStatus(d.get("status"))) {
a = false;
return false
}
}, this);
return a
},
_getBTSetFieldValues: function() {
var c, b;
var a = this.settingform.getFieldValues(true);
if ("undefined" !== typeof a.seeding_interval_compositefield) {
delete a.seeding_interval_compositefield;
a.seeding_interval = this.settingform.findField("seeding_interval").getValue()
}
c = this.settingform.findField("destination");
if (c.isDirty()) {
a.destination = c.getValue()
}
b = ["seeding_ratio", "max_upload_rate", "max_download_rate", "max_peers"];
b.forEach(function(d) {
if ("" === a[d]) {
delete a[d]
}
});
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueActionGroup", {
extend: "SYNO.SDS.DownloadStation.ActionGroup",
stopable: [SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_DOWNLOADING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_WAITING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_FILEHOSTING_WAITING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_SEEDING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_HASH_CHECKING],
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
this.callParent([this.fillConfig(a)])
},
fillConfig: function(a) {
var b = [new Ext.Button({
tooltip: _DT("download", "download_add_from_file"),
iconCls: "syno-dl-a_bt_create",
itemId: "add_file",
scope: this,
handler: function() {
var d = function(e) {
var f = new SYNO.SDS.DownloadStation.DLM.QueueAddDialog({
uicomponents: this.uicomponents,
activeTab: 0
});
f.open()
};
SYNO.SDS.DownloadStation.DLM.Util.checkLocationDestinationNonEmpty(this.owner, d, undefined, this)
}
}), new Ext.Button({
tooltip: _DT("download", "download_add_from_url"),
iconCls: "syno-dl-a_bt_add",
itemId: "add_url",
scope: this,
handler: function() {
var d = function(e) {
var f = new SYNO.SDS.DownloadStation.DLM.QueueAddDialog({
uicomponents: this.uicomponents,
activeTab: 1
});
f.open()
};
SYNO.SDS.DownloadStation.DLM.Util.checkLocationDestinationNonEmpty(this.owner, d, undefined, this)
}
}), new Ext.Button({
tooltip: _DT("download", "download_tip_resume"),
iconCls: "syno-dl-a_bt_resume",
itemId: "resume",
disabled: true,
scope: this,
handler: function() {
this.onStartAction("resume")
}
}), new Ext.Button({
tooltip: _DT("download", "download_tip_stop"),
iconCls: "syno-dl-a_bt_pause",
itemId: "pause",
disabled: true,
scope: this,
handler: function() {
this.onStartAction("pause")
}
}), new Ext.Button({
tooltip: _DT("download", "download_tip_end"),
iconCls: "syno-dl-a_bt_end",
itemId: "end",
disabled: true,
scope: this,
handler: function() {
this.onStartAction("end")
}
}), new Ext.Button({
tooltip: _T("common", "alt_edit"),
iconCls: "syno-dl-a_bt_edit",
itemId: "edit",
disabled: true,
scope: this,
handler: function() {
this.launchTaskEditDialog()
}
}), new Ext.Button({
tooltip: _DT("download", "download_tip_clear"),
iconCls: "syno-dl-a_bt_clear",
itemId: "clear",
disabled: true,
scope: this,
handler: function() {
this.onStartAction("clear")
}
}), new Ext.Button({
tooltip: _DT("download", "download_tip_remove"),
iconCls: "syno-dl-a_bt_delete",
itemId: "delete",
disabled: true,
scope: this,
handler: function() {
this.appWin.getMsgBox().confirm(_DT("tree", "leaf_downloadtask"), _DT("download", "download_cfrm_remove"), function(d, e) {
if (d == "yes") {
this.onStartAction("delete")
}
}, this)
}
})];
var c = new SYNO.ux.Menu({
autoDestroy: true,
items: [{
text: _DT("download", "download_btn_resume_all"),
scope: this,
handler: function() {
this.onStartAction("resume_all")
}
}, {
text: _DT("download", "download_btn_pause_all"),
scope: this,
handler: function() {
this.onStartAction("pause_all")
}
}, {
text: _DT("download", "download_btn_remove_all"),
scope: this,
handler: function() {
this.appWin.getMsgBox().confirm(_DT("tree", "leaf_downloadtask"), _DT("download", "download_remove_all_confirm"), function(d, e) {
if (d === "yes") {
this.onStartAction("delete_all")
}
}, this)
}
}]
});
b.push(new Ext.Button({
tooltip: _DT("common", "action"),
cls: "syno-dl-menu-btn",
iconCls: "syno-dl-a_bt_action",
itemId: "action",
disabled: true,
menu: c
}), "->", {
xtype: "syno_button",
tooltip: _DT("download", "captcha_needed"),
text: "0",
itemId: "captcha",
hidden: true,
cls: "captcha-toolbar",
scope: this,
handler: this.launchCaptchaEnterDialog,
disabled: false
}, new SYNO.ux.TextFilter({
cls: "syno-ux-textfilter-text syno-dl-dlm-filter-icon",
itemId: "filter",
emptyText: _DT("common", "filter_label_text"),
store: this.owner.grid.getStore(),
pageSize: this.owner.grid.getBottomToolbar().pageSize
}));
return b
},
endRequest: function(a) {
this.owner.getMsgBox().show({
title: _DT("tree", "leaf_downloadtask"),
msg: _DT("common", "msg_waiting"),
width: 300,
progress: false
});
this.endPollingStart(a)
},
getTaskIDArray: function(b, c) {
var d = [];
var a = SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT;
c.forEach(function(f) {
var e = f.get("status");
if ("clear" === b && a.TASK_FINISHED !== e) {
return
} else {
if (("pause" === b || "pause_all" === b) && -1 === this.stopable.indexOf(e)) {
return
} else {
if (("resume" === b || "resume_all" === b) && !(a.TASK_FINISHED === e && "bt" === f.get("type")) && !SYNO.SDS.DownloadStation.Utils.isTaskErrorStatus(e) && (a.TASK_PAUSED !== e)) {
return
}
}
}
d.push(f.get("task_id"))
}, this);
return d
},
onStartActionEnd: function() {
var c = false
, a = [];
var b = this._checkEndableSelections();
if ((false === b) || Ext.isEmpty(b)) {
return
}
Ext.each(b, function(d) {
if (!c && SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_SEEDING !== d.get("status")) {
c = true
}
a.push(d.get("task_id"))
});
if (c) {
this.owner.getMsgBox().confirm(_DT("tree", "leaf_downloadtask"), _DT("download", "download_end_warning"), function(d, e) {
if (d == "yes") {
this.endRequest(a)
}
}, this)
} else {
this.endRequest(a)
}
},
onStartAction: function(c) {
var e = ["clear", "delete_all", "pause_all", "resume_all"];
var d = (-1 !== e.indexOf(c));
var f = this.owner.grid.getSelectionModel();
if (!d && false === f.hasSelection()) {
this.owner.getMsgBox().alert(_DT("tree", "leaf_downloadtask"), _DT("download", "download_warning_select_items"));
return
}
if ("end" === c) {
this.onStartActionEnd();
return
}
var a = [];
if (!d) {
var b = f.getSelections();
a = this.getTaskIDArray(c, b);
if (Ext.isEmpty(a)) {
return
}
}
this.onActionRequest(c, a)
},
stopPollingTask: function() {
this.pollingtask.stopById("updateTask");
this.pollingtask.stopById("infoTask");
this.resumeTaskList = [];
var a = ["bt_tracker_poll_task", "bt_peer_poll_task", "QueueInfoFile"];
Ext.each(a, function(b) {
var c = this.pollingtask.getTaskById(b);
if (!Ext.isDefined(c) || !Ext.isDefined(c.running) || !c.running) {
return
}
this.pollingtask.stopById(b);
this.resumeTaskList.push(b)
}, this)
},
resumePollingTask: function() {
this.pollingtask.startById("updateTask");
this.pollingtask.startById("infoTask");
this.pollingtask.startById(this.resumeTaskList, false);
this.resumeTaskList = []
},
onActionRequest: function(c, a) {
this.stopPollingTask();
this.queueGrid.getGridEl().mask();
var b = {
id: a
};
switch (c) {
case "delete":
Ext.apply(b, {
force_complete: false
});
break;
case "clear":
c = "delete_condition";
b = {
type: ["emule"],
type_inverse: true,
status: [SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_FINISHED]
};
break;
case "delete_all":
c = "delete_condition";
b = {
type: ["emule"],
type_inverse: true
};
break;
case "pause_all":
c = "pause_condition";
b = {
type: ["emule"],
type_inverse: true
};
break;
case "resume_all":
c = "resume_condition";
b = {
type: ["emule"],
type_inverse: true
};
break;
default:
}
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task",
method: c,
params: b,
version: 2,
scope: this,
callback: this.onActionDone
})
},
endPollingStart: function(a) {
this.stopPollingTask();
this.queueGrid.getGridEl().mask();
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task.Complete",
method: "start",
version: 1,
params: {
id: a
},
callback: function(e, c, d, b) {
if (true !== e) {
this.onActionDone(false, c, d, b);
return
}
this.endPollingStatus(c.task_id)
},
scope: this
})
},
endPollingStatus: function(a) {
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task.Complete",
method: "status",
version: 1,
params: {
task_id: a
},
callback: function(c, b) {
if (true !== c) {
this.endPollingStop(a, {
success: false,
error: b
});
return
}
if (!b.finish) {
Ext.defer(function() {
this.endPollingStatus(a)
}, 5000, this)
} else {
this.endPollingStop(a, b)
}
},
scope: this
})
},
endPollingStop: function(a, b) {
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task.Complete",
method: "stop",
version: 1,
params: {
task_id: a
},
callback: function(f, d, e, c) {
this.hideMsg();
if (true !== f) {
this.onActionDone(false, d, e, c);
return
}
this.onActionDone(b.success, b.success ? b.data : b.error, e, c)
},
scope: this
})
},
onActionDone: function(e, c, d, b) {
this.queueGrid.getGridEl().unmask();
if (e) {
if ("delete" === b.params.method) {
var a = this.queueGrid;
a.forceSelectIdx = a.store.indexOf(a.selModel.getSelected())
}
} else {
this.appWin.getMsgBox().alert(_DT("tree", "leaf_downloadtask"), SYNO.SDS.DownloadStation.Utils.getErrorString(c.code))
}
this.resumePollingTask()
},
_checkEndableSelections: function() {
var b = this.owner.grid.getSelectionModel();
var e = b.getSelections();
var c = b.grid.StatusNotEndable;
var a = "";
var d = [];
Ext.each(e, function(f) {
if (-1 !== c.indexOf(f.get("status"))) {
a = _DT("download", "download_end_note_finished");
return false
} else {
if (0 === f.get("current_size")) {
a = _DT("download", "download_end_note_no_file");
return false
}
}
d.push(f)
});
if ("" !== a) {
this.owner.getMsgBox().alert(_DT("tree", "leaf_downloadtask"), a);
return false
}
return d
},
updateBtns: function(b) {
this.setEnableBtns(["clear", "action"], 0 !== b.grid.store.getCount());
var a = b.grid.updateBtnStatus();
this.setEnableBtns(["pause"], a.blStop);
this.setEnableBtns(["resume"], a.blResume);
this.setEnableBtns(["end"], a.blEnd);
this.setEnableBtns(["delete"], a.blDelete);
this.setEnableBtns(["edit"], a.blEdit)
},
launchTaskEditDialog: function() {
var a = new SYNO.SDS.DownloadStation.DLM.QueueEditBtDialog({
uicomponents: this.uicomponents
});
a.load()
},
launchCaptchaEnterDialog: function() {
var a = new SYNO.SDS.DownloadStation.DLM.CaptchaEnterDialog({
uicomponents: this.uicomponents
});
a.show()
},
hideMsg: function() {
if (!(this.owner && this.owner.isDestroyed)) {
this.owner.getMsgBox().hide()
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.InfoGeneral", {
extend: "SYNO.ux.FormPanel",
constructor: function(a) {
this.owner = a.owner;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
var b = {
border: false,
frame: false,
defaults: {
xtype: "syno_displayfield"
},
items: [{
fieldLabel: _DT("download", "download_list_filename"),
name: "filename",
cls: "selectabletext allowDefCtxMenu"
}, {
fieldLabel: _DT("download", "download_list_dest_folder"),
name: "destination"
}, {
fieldLabel: _DT("download", "download_list_filesize"),
name: "filesize"
}, {
fieldLabel: _DT("download", "download_list_username"),
name: "username",
hidden: this._S("is_admin") ? false : true
}, {
fieldLabel: _DT("download", "download_list_url"),
name: "url",
cls: "selectabletext allowDefCtxMenu"
}, {
fieldLabel: _DT("download", "download_list_created_time"),
name: "create_time"
}, {
fieldLabel: _DT("download", "download_list_completed_time"),
name: "completed_time"
}, {
fieldLabel: _DT("download", "download_list_expected_waiting_time"),
name: "waiting_seconds"
}, {
fieldLabel: _DT("download", "download_orgtorrent_field"),
name: "orgtorrent",
cls: "allowDefCtxMenu",
htmlEncode: false
}]
};
Ext.apply(b, a);
return b
},
resetForm: function() {
var a = this.getForm();
if (a) {
a.findField("orgtorrent").hide();
a.reset()
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.InfoTransfer", {
extend: "SYNO.ux.FormPanel",
constructor: function(a) {
this.owner = a.owner;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
var b = {
border: false,
frame: false,
defaults: {
xtype: "syno_displayfield"
},
items: [{
fieldLabel: _DT("download", "download_list_status"),
ctCls: "syno-dl-info-table-cell-20",
name: "task_status"
}, {
fieldLabel: _DT("download", "download_list_transfered"),
name: "transfered"
}, {
fieldLabel: _DT("download", "download_list_progress"),
name: "progress"
}, {
fieldLabel: _DT("download", "download_list_speed"),
name: "speed"
}, {
fieldLabel: _DT("download", "download_list_peer"),
name: "totalpeer"
}, {
fieldLabel: _DT("download", "download_list_connected_peers"),
name: "currpeer"
}, {
fieldLabel: _DT("download", "download_list_total_pieces"),
name: "totalpieces"
}, {
fieldLabel: _DT("download", "download_list_downloaded_pieces"),
name: "currpieces"
}, {
fieldLabel: _DT("download", "download_seed_elapsed"),
name: "seed_elapsed"
}, {
fieldLabel: _T("download", "download_seeders") + "/" + _T("download", "download_leechers"),
name: "seeders_leechers"
}, {
fieldLabel: _DT("download", "download_list_started_time"),
name: "start_time"
}, {
fieldLabel: _DT("download", "download_time_left"),
name: "time_left"
}]
};
Ext.apply(b, a);
return b
},
resetForm: function() {
var a = this.getForm();
if (a) {
a.findField("seed_elapsed").hide();
a.findField("seeders_leechers").hide();
a.findField("time_left").show();
a.reset()
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.InfoTracker", {
extend: "SYNO.ux.GridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
this.NUM_REC_PER_PAGE = 50;
this.gStart = 0;
var b = this.fillConfig(a);
this.callParent([b]);
this.createPollingTask()
},
fillConfig: function(a) {
var b = this.createStore();
this.paging = this.createPagingToolbar(b);
this.createActions();
var c = {
border: false,
view: new SYNO.ux.FleXcroll.grid.GridView({
forceFit: true
}),
stripeRows: true,
autoExpandColumn: "url",
enableColumnMove: false,
enableColLock: false,
enableColumnHide: false,
enableHdMenu: false,
enableColumnResize: true,
tbar: {
items: [this.btnAdd, this.btnRemove]
},
bbar: this.paging,
colModel: new Ext.grid.ColumnModel({
columns: [{
id: "url",
header: _DT("download", "download_list_url"),
dataIndex: "url"
}, {
header: _DT("download", "download_list_status"),
dataIndex: "status",
width: 65
}, {
header: _DT("download", "update_in"),
dataIndex: "update",
width: 45,
renderer: this.updateRenderer
}, {
header: _DT("download", "seeds"),
dataIndex: "seeds",
width: 20,
renderer: this.seedPeerRenderer
}, {
header: _DT("download", "download_list_peer"),
dataIndex: "peers",
width: 20,
renderer: this.seedPeerRenderer
}]
}),
selModel: new Ext.grid.RowSelectionModel({
singleSelect: false,
listeners: {
scope: this,
selectionchange: this.onSelectionChange
}
}),
store: b,
listeners: {
scope: this,
activate: this.onActivate,
deactivate: this.onDeactivate,
rowcontextmenu: this.onRowContextMenu
}
};
return Ext.apply(c, a)
},
createPollingTask: function() {
this.pollingtask.add({
id: "bt_tracker_poll_task",
api: "SYNO.DownloadStation2.Task.BT.Tracker",
method: "list",
version: 2,
interval: 10000,
autoJsonDecode: true,
beforestart: this.onBeforePollingTaskStart,
callback: this.updateTrackers,
scope: this
})
},
onBeforePollingTaskStart: function(a) {
a.reqConfig.params = {
task_id: this.getSelectedTaskId(),
offset: this.gStart || 0,
limit: this.NUM_REC_PER_PAGE
}
},
updateTrackers: function(g, e, f, c) {
var b;
if (g && f.task_id === this.getSelectedTaskId() && this.isCountMatched(e)) {
for (var a = 0; a < e.items.length; a++) {
var d = this.store.getAt(a);
if (!d || (d.get("url") != e.items[a].url)) {
b = true;
break
}
d.set("status", e.items[a].status);
d.set("update", e.items[a].update);
d.set("seeds", e.items[a].seeds);
d.set("peers", e.items[a].peers);
d.commit()
}
} else {
b = true
}
if (b) {
this.getStore().reload()
}
},
isCountMatched: function(a) {
return (a.total === this.store.getTotalCount()) && (a.total > 0)
},
createActions: function() {
this.actionAdd = new Ext.Action({
text: _DT("common", "addto"),
itemId: "add",
scope: this,
handler: this.addHandler
});
this.actionRemove = new Ext.Action({
text: _DT("common", "remove"),
itemId: "remove",
scope: this,
handler: this.removeHandler
});
this.btnAdd = new SYNO.ux.Button({
text: _DT("common", "addto"),
itemId: "add",
scope: this,
handler: this.addHandler
});
this.btnRemove = new SYNO.ux.Button({
disabled: true,
text: _DT("common", "remove"),
itemId: "remove",
scope: this,
handler: this.removeHandler
})
},
createStore: function() {
return new SYNO.API.JsonStore({
api: "SYNO.DownloadStation2.Task.BT.Tracker",
appWindow: this.appWin,
method: "list",
version: 2,
root: "items",
fields: ["url", "status", "update", "seeds", "peers"],
autoLoad: false,
baseParams: {
limit: this.NUM_REC_PER_PAGE
},
paramNames: {
start: "offset",
limit: "limit"
},
totalProperty: "total",
listeners: {
scope: this,
beforeload: this.onBeforeLoad,
load: function(a, c, b) {
if (this.getGridEl()) {
this.getGridEl().unmask()
}
this.pollingtask.startById("bt_tracker_poll_task", false);
this.onSelectionChange()
},
exception: function(d, e, f, c, b, a) {
if (!this.getGridEl().isMasked()) {
this.getGridEl().mask(SYNO.SDS.DownloadStation.Utils.getErrorString(b.code))
}
}
}
})
},
createPagingToolbar: function(a) {
return new SYNO.ux.PagingToolbar({
store: a,
pageSize: this.NUM_REC_PER_PAGE,
displayInfo: true
})
},
onBeforeLoad: function(a, b) {
this.pollingtask.stopById("bt_tracker_poll_task");
var c = this.getSelectedTaskId();
if (!c) {
return false
}
b.params.task_id = c;
if ("undefined" !== typeof (b.params.offset)) {
this.gStart = b.params.offset
} else {
this.gStart = 0
}
},
getSelectedTaskId: function() {
var a = this.owner.grid.selModel.getSelected();
if (!a || !a.get("task_id")) {
return undefined
}
return a.get("task_id")
},
onActivate: function() {
this.getStore().reload()
},
onDeactivate: function() {
this.pollingtask.stopById("bt_tracker_poll_task")
},
onSelectionChange: function() {
var a = this.getSelectionModel();
if (0 === a.getCount()) {
this.btnRemove.disable()
} else {
this.btnRemove.enable()
}
},
getContextMenu: function() {
if (!this.contextMenu) {
this.contextMenu = new SYNO.ux.Menu({
items: [this.actionAdd, this.actionRemove],
listeners: {
scope: this,
show: function() {
this.pollingtask.stopById("bt_tracker_poll_task")
},
hide: function() {
this.pollingtask.startById("bt_tracker_poll_task")
}
}
});
this.addManagedComponent(this.contextMenu)
}
return this.contextMenu
},
onRowContextMenu: function(b, d, a) {
var c = b.getSelectionModel();
c.selectRow(d, c.isSelected(d));
this.getContextMenu().showAt(a.getXY());
a.preventDefault()
},
getSelectionUrls: function() {
var a = this.getSelectionModel().getSelections();
var b = [];
Ext.each(a, function(e, c, d) {
b.push(e.get("url"))
}, this);
return b
},
removeTrackers: function(a) {
if (!a || (0 === a.length)) {
return
}
this.pollingtask.stopById("bt_tracker_poll_task");
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task.BT.Tracker",
method: "delete",
params: {
task_id: this.getSelectedTaskId(),
tracker: a
},
version: 2,
scope: this,
callback: function(e, c, d, b) {
this.pollingtask.startById("bt_tracker_poll_task")
}
})
},
addHandler: function() {
var a = new SYNO.SDS.DownloadStation.DLM.AddTrackerDialog({
owner: this.appWin,
task_id: this.getSelectedTaskId()
});
a.mon(a, "close", function() {
this.pollingtask.startById("bt_tracker_poll_task")
}, this);
this.pollingtask.stopById("bt_tracker_poll_task");
a.show()
},
removeHandler: function() {
var a = this.getSelectionUrls();
this.removeTrackers(a)
},
seedPeerRenderer: function(d, b, c) {
var a = Ext.util.Format.htmlEncode(d);
return (d < 0) ? "" : a
},
updateRenderer: function(c, a, b) {
if (c === 0) {
return ""
}
return Ext.util.Format.htmlEncode(SYNO.SDS.DownloadStation.DLM.Util.convertTimeLeft(c, false))
}
});
Ext.define("SYNO.SDS.DownloadStation.DLM.AddTrackerDialog", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
this.owner = a.owner;
this.task_id = a.task_id;
var b = {
owner: a.owner,
cls: "syno-dl-win",
title: _DT("download", "tracker") + " - " + _DT("common", "addto"),
layout: "fit",
width: 360,
height: 320,
items: {
xtype: "syno_formpanel",
padding: "0 0 12px 0",
itemId: "form",
border: false,
height: "196px",
layout: "fit",
items: [{
xtype: "syno_textarea",
cls: "selectabletext allowDefCtxMenu",
hideLabel: true,
name: "tracker",
readOnly: false
}]
},
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
text: _T("common", "ok"),
scope: this,
btnStyle: "blue",
handler: this.addTrackers
}, {
text: _T("common", "cancel"),
scope: this,
handler: this.close
})
};
Ext.apply(b, a);
this.callParent([b]);
this.trackersForm = this.get("form").getForm()
},
addTrackers: function() {
var a, d, b = false;
b = this.trackersForm.isDirty();
if (b) {
d = {
task_id: this.task_id
};
a = this.trackersForm.getValues();
if (a.tracker) {
var c = [];
Ext.each(a.tracker.split(/\s+/), function(h, f, g) {
var e = h.trim();
var i = e.toLowerCase();
if (0 === i.indexOf("http://") || 0 === i.indexOf("https://") || 0 === i.indexOf("udp://")) {
c.push(e)
}
}, this);
if (0 === c.length) {
this.getMsgBox().alert(this.title, _DT("download", "tracker_wrong_url"));
return
}
d.tracker = c
}
this.setStatusBusy({
text: _T("common", "saving")
});
this.sendWebAPI({
api: "SYNO.DownloadStation2.Task.BT.Tracker",
method: "add",
params: d,
version: 2,
scope: this,
callback: function(h, f, g, e) {
this.clearStatusBusy();
if (!h) {
this.getMsgBox().alert(this.title, _T("common", "commfail"))
} else {
this.close()
}
}
})
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.InfoFile", {
extend: "SYNO.ux.GridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
this.NUM_REC_PER_PAGE = 50;
this.gStart = 0;
this.createActions();
var b = this.fillConfig(a);
this.callParent([b]);
this.defineBehaviors()
},
createActions: function() {
var a = new Ext.menu.Menu({
items: [{
text: _DT("dlqueue", "dl_priority_high"),
itemId: "high"
}, {
text: _DT("dlqueue", "dl_priority_normal"),
itemId: "normal"
}, {
text: _DT("dlqueue", "dl_priority_low"),
itemId: "low"
}],
listeners: {
scope: this,
itemclick: this.onPriorityItemClick
}
});
this.actionPriority = new Ext.Action({
text: _DT("dlqueue", "title_dl_priority"),
itemId: "priority",
menu: a
});
this.actionSkip = new Ext.Action({
text: _T("common", "skip"),
itemId: "skip",
scope: this,
handler: this.skipHandler
});
this.actionCopyTo = new Ext.Action({
text: _DT("download", "copy_to"),
itemId: "copy_to",
scope: this,
handler: this.copyToHandler
});
this.btnPriority = new SYNO.ux.Button({
text: _DT("dlqueue", "title_dl_priority"),
itemId: "priority",
disabled: true,
menu: a
});
this.btnSkip = new SYNO.ux.Button({
text: _T("common", "skip"),
itemId: "skip",
disabled: true,
scope: this,
handler: this.skipHandler
});
this.btnCopyTo = new SYNO.ux.Button({
text: _DT("download", "copy_to"),
itemId: "copy_to",
disabled: true,
scope: this,
handler: this.copyToHandler
})
},
fillConfig: function(a) {
this.dsFileList = this.createStore();
this.paging = this.createPagingToolbar(this.dsFileList);
var b = {
border: false,
cls: "without-dirty-red-grid",
view: new SYNO.ux.FleXcroll.grid.GridView({
forceFit: true
}),
stripeRows: true,
autoExpandColumn: "dl-torrent-files",
enableColumnMove: false,
enableColLock: false,
enableColumnHide: false,
enableHdMenu: false,
enableColumnResize: true,
tbar: {
items: [this.btnPriority, this.btnSkip, this.btnCopyTo, "->", this.btnQuery = new SYNO.TextFilter({
itemId: "search",
width: 150,
emptyText: _DT("tree", "leaf_search"),
queryAction: "list_file",
enumAction: "list_file",
pageSize: this.NUM_REC_PER_PAGE,
store: this.dsFileList
})]
},
bbar: this.paging,
selModel: new Ext.grid.RowSelectionModel({
singleSelect: false,
listeners: {
scope: this,
selectionchange: this.onGridSelectionChanged
}
}),
colModel: new Ext.grid.ColumnModel({
defaultSortable: true,
columns: [{
id: "dl-torrent-files",
header: _DT("download", "download_list_filename"),
dataIndex: "name",
renderer: SYNO.SDS.DownloadStation.DLM.Util.nameRender.createDelegate(this)
}, {
header: _DT("download", "download_list_filesize"),
dataIndex: "size",
width: 30,
renderer: SYNO.SDS.DownloadStation.DLM.Util.sizeRenderer
}, {
header: _DT("download", "download_list_completed"),
dataIndex: "size_downloaded",
width: 30,
renderer: SYNO.SDS.DownloadStation.DLM.Util.sizeRenderer
}, {
header: _DT("download", "download_list_progress"),
dataIndex: "progress",
width: 30,
renderer: this.calculateProgressRenderer
}, {
header: _DT("dlqueue", "title_dl_priority"),
dataIndex: "priority",
width: 30,
renderer: this.priorityRenderer
}]
}),
store: this.dsFileList,
listeners: {
scope: this,
rowclick: {
fn: function(d, g, f) {
var c = this.owner.grid.selModel.getSelected().get("status");
if (c !== SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_DOWNLOADING || this.dsFileList.getTotalCount() == 1) {
return
}
if (f && !f.hasModifier()) {
d.getSelectionModel().selectRow(g)
}
}
},
rowcontextmenu: this.onRowContextMenu,
activate: this.onActivate,
deactivate: this.onDeactivate
}
};
Ext.apply(b, a);
return SYNO.LayoutConfig.fill(b)
},
createStore: function() {
return new SYNO.API.JsonStore({
api: "SYNO.DownloadStation2.Task.BT.File",
appWindow: this.appWin,
method: "list",
version: 2,
root: "items",
autoDestroy: true,
fields: ["index", "name", "size", "size_downloaded", "progress", "priority", "wanted"],
remoteSort: true,
baseParams: {
limit: this.NUM_REC_PER_PAGE
},
totalProperty: "total",
paramNames: {
start: "offset",
limit: "limit",
sort: "sort_by",
dir: "order"
},
sortInfo: {
field: "name",
direction: "ASC"
},
pruneModifiedRecords: false,
listeners: {
scope: this,
beforeload: this.onBeforeLoad,
load: function() {
if (this.getGridEl()) {
this.getGridEl().unmask()
}
this.onGridSelectionChanged();
this.pollingtask.startById("QueueInfoFile", false)
},
exception: function(d, e, f, c, b, a) {
this.onGridSelectionChanged();
if (!this.getGridEl().isMasked()) {
this.getGridEl().mask(SYNO.SDS.DownloadStation.Utils.getErrorString(b.code))
}
}
}
})
},
onGridSelectionChanged: function() {
this.btnPriority.enable();
this.btnSkip.enable();
var a = this.getSelectionModel();
var b = false;
if (a.getCount() === 0) {
this.btnPriority.disable();
this.btnSkip.disable();
b = true
}
a.selections.each(function(c) {
if (c.data.size_downloaded !== c.data.size) {
b = true
}
}, this);
this.btnCopyTo.setDisabled(b);
this.actionCopyTo.setDisabled(b)
},
defineBehaviors: function() {
this.btnPriority = this.getTopToolbar().get("priority");
this.btnSkip = this.getTopToolbar().get("skip");
this.btnCopyTo = this.getTopToolbar().get("copy_to");
this.createPollingTask()
},
createPagingToolbar: function(a) {
return new SYNO.ux.PagingToolbar({
store: a,
pageSize: this.NUM_REC_PER_PAGE,
displayInfo: true
})
},
getTorrentFileSelection: function(c) {
var a = [];
for (var b = 0; b < c.length; b++) {
a.push({
name: c[b].get("name")
})
}
return a
},
onBeforeLoad: function(a, b) {
var c = this.getSelectedTaskId();
if (!c) {
return false
}
this.pollingtask.stopById("QueueInfoFile");
b.params.task_id = c;
if ("undefined" !== typeof (b.params.offset)) {
this.gStart = b.params.offset
} else {
this.gStart = 0
}
},
getSelectedTaskId: function() {
var a = this.owner.grid.selModel.getSelected();
if (!a || !a.get("task_id")) {
return undefined
}
return a.get("task_id")
},
createPollingTask: function() {
this.pollingtask.add({
id: "QueueInfoFile",
api: "SYNO.DownloadStation2.Task.BT.File",
method: "list",
version: 2,
interval: 5000,
autoJsonDecode: true,
beforestart: this.onBeforePollingTaskStart,
callback: this.updateTasks,
scope: this
})
},
onBeforePollingTaskStart: function(a) {
a.reqConfig.params = {
task_id: this.getSelectedTaskId(),
offset: this.gStart || 0,
limit: this.NUM_REC_PER_PAGE,
sort_by: this.getStore().sortInfo.field,
order: this.getStore().sortInfo.direction,
query: this.btnQuery.getValue()
}
},
updateTasks: function(g, e, f, c) {
var b;
if (g && f.task_id === this.getSelectedTaskId() && (e.total === this.store.getTotalCount() && e.total > 0)) {
if (this.getGridEl()) {
this.getGridEl().unmask()
}
for (var a = 0; a < e.items.length; a++) {
var d = this.store.getAt(a);
if (!d || (d.get("index") != e.items[a].index)) {
b = true;
break
}
d.set("name", e.items[a].name);
d.set("size", e.items[a].size);
d.set("size_downloaded", e.items[a].size_downloaded);
d.set("priority", e.items[a].priority);
d.set("wanted", e.items[a].wanted);
d.commit()
}
} else {
b = true
}
if (b) {
this.getStore().reload()
}
},
isExpectedTask: function(a) {
return a.success && a.task_id === this.getSelectedTaskId()
},
onActivate: function() {
this.pollingtask.startById("QueueInfoFile", true)
},
onDeactivate: function() {
this.pollingtask.stopById("QueueInfoFile")
},
getContextMenu: function() {
if (!this.contextMenu) {
this.contextMenu = new SYNO.ux.Menu({
items: [this.actionPriority, this.actionSkip, this.actionCopyTo],
listeners: {
scope: this,
show: function() {
this.pollingtask.stopById("QueueInfoFile")
},
hide: function() {
this.pollingtask.startById("QueueInfoFile", true)
}
}
});
this.addManagedComponent(this.contextMenu)
}
return this.contextMenu
},
onRowContextMenu: function(b, d, a) {
var c = b.getSelectionModel();
c.selectRow(d, c.isSelected(d));
this.getContextMenu().showAt(a.getXY());
a.preventDefault()
},
getSelectionIndexes: function() {
var b = this.getSelectionModel().getSelections();
var a = [];
Ext.each(b, function(e, c, d) {
a.push(e.get("index"))
}, this);
return a
},
skipHandler: function() {
var a = {
task_id: this.getSelectedTaskId(),
index: this.getSelectionIndexes(),
wanted: false
};
this.setFiles(a)
},
copyToHandler: function() {
this.utils.chooseDestHandler({
owner: this.appWin,
callback: function(c, b, a) {
if (b) {
this.applyCopyTo(b.path.substr(1))
}
c.close()
},
callbackScope: this
})
},
applyCopyTo: function(a) {
this.mask(_T("common", "saving"));
this.pollingtask.stopById("QueueInfoFile");
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task.BT.File",
method: "copy",
version: 2,
params: {
task_id: this.getSelectedTaskId(),
index: this.getSelectionIndexes(),
destination: a
},
scope: this,
callback: function(g, d, f, c) {
this.unmask();
var e = _T("common", "commfail");
var b = [];
if (g) {
this.selModel.selections.each(function(h) {
b.push(h.data.name)
}, this);
e = String.format(_T("filebrowser", "filebrowser_copy_completed"), b.join(", "))
} else {
if (d.code) {
e = SYNO.SDS.DownloadStation.Utils.getErrorString(d.code)
} else {
if (d.copy_failed && 0 < d.copy_failed.length) {
e = String.format(_T("filebrowser", "filebrowser_copy_failed"), d.copy_failed.join(", "), "")
}
}
}
this.appWin.getMsgBox().alert("", e);
this.pollingtask.startById("QueueInfoFile", true)
}
})
},
onPriorityItemClick: function(b, a) {
var c = {
task_id: this.getSelectedTaskId(),
index: this.getSelectionIndexes(),
priority: b.itemId
};
this.setFiles(c)
},
setFiles: function(a) {
if (!a.index || (0 === a.index.length)) {
return
}
this.pollingtask.stopById("QueueInfoFile");
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task.BT.File",
method: "set",
version: 2,
params: a,
scope: this,
callback: function(e, c, d, b) {
this.pollingtask.startById("QueueInfoFile", true)
}
})
},
calculateProgressRenderer: function(f, d, e) {
var c = e.get("size");
var a = e.get("size_downloaded");
var b;
if (0 === c) {
b = 1
} else {
b = a / c
}
if (1 > b && 0.9994 < b) {
b = 0.9994
}
return Ext.util.Format.htmlEncode(Ext.util.Format.number((b * 100), "0.0") + " %")
},
priorityRenderer: function(d, b, c) {
var a = c.get("wanted");
if (!a) {
return _T("common", "skip")
}
if ("normal" === d) {
return _DT("dlqueue", "dl_priority_normal")
} else {
if ("high" === d) {
return _DT("dlqueue", "dl_priority_high")
} else {
if ("low" === d) {
return _DT("dlqueue", "dl_priority_low")
}
}
}
return ""
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.InfoPreview", {
extend: "SYNO.ux.Panel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.webapiGet = {
api: "SYNO.DownloadStation2.Thumbnail",
method: "get",
version: 2
};
this.webapiDownload = {
api: "SYNO.DownloadStation2.Thumbnail",
method: "download",
version: 2
};
this.previewIndex = -1;
this.tpl = new Ext.XTemplate('<tpl for=".">','<div class="thumb-wrap">','<div class="thumb">',"{[this.getImgHtml(values)]}","</div>",'<span class="thumb-filename" ext:qtip="{[this.getToolTip(values.name)]}">{name}</span>',"</div>","</tpl>",{
compile: true,
disableFormat: true,
getImgHtml: this.getImgHtml.createDelegate(this),
getToolTip: this.getToolTip
});
this.videoStore = this.getStore();
this.photoStore = this.getStore();
this.videoDataView = this.getVideoDataView(this.videoStore);
this.photoDataView = this.getPhotoDataView(this.photoStore);
var b = {
cls: "preview-panel",
autoFlexcroll: true,
items: [{
xtype: "syno_fieldset",
title: _T("mediaservice", "class_video"),
itemId: "video_fieldset",
hidden: true,
items: [this.videoDataView]
}, {
xtype: "syno_fieldset",
title: _T("mediaservice", "class_photo"),
itemId: "photo_fieldset",
hidden: true,
items: [this.photoDataView]
}],
listeners: {
scope: this,
activate: this.onActivate,
deactivate: this.onDeactivate
}
};
Ext.apply(b, a);
return b
},
getStore: function() {
return new Ext.data.JsonStore({
fields: ["name", "url", "show_first_url"]
})
},
getVideoDataView: function(a) {
return new SYNO.ux.FleXcroll.DataView({
store: a,
tpl: this.tpl,
autoHeight: true,
autoFlexcroll: false,
trackOver: true,
itemSelector: "div.thumb",
listeners: {
scope: this,
click: this.onClick,
mouseleave: this.onMouseLeave
}
})
},
getPhotoDataView: function(a) {
return new SYNO.ux.FleXcroll.DataView({
store: a,
tpl: this.tpl,
autoHeight: true,
autoFlexcroll: false,
itemSelector: "div.thumb"
})
},
onClick: function(d, a, b, c) {
if (0 <= this.previewIndex) {
if (this.previewIndex == a) {
this.stopPreview(d, a);
return
}
this.stopPreview(d, this.previewIndex)
}
this.startPreview(d, a, b)
},
onMouseLeave: function(d, a, b, c) {
d.overClass = "synodl-thumbnail-mouse-over"
},
startPreview: function(c, b) {
this.previewIndex = b;
var a = c.store.getRange(b, b)[0].data;
a.show_first_url = false;
c.tpl.override(c.getNode(b), a);
c.overClass = undefined;
c.refresh();
this.pollingtask.add({
id: "change_thumbnail_task",
interval: 1000,
run: this.changeShowedImage,
args: [b],
scope: this
});
this.pollingtask.startById("change_thumbnail_task", false)
},
stopPreview: function(c, b) {
this.previewIndex = -1;
var a = c.store.getRange(b, b)[0].data;
a.show_first_url = true;
c.tpl.override(c.getNode(b), a);
c.refresh();
this.pollingtask.stopById("change_thumbnail_task");
this.resetShowedImage(b)
},
changeShowedImage: function(c) {
var b = this.videoDataView.getNodes();
var d = b[c];
if (!Ext.isDefined(d)) {
return
}
var a = d.getElementsByClassName("show-thumbnail")[0];
a.classList.remove("show-thumbnail");
var e = a.nextSibling;
if (null === e) {
e = d.getElementsByTagName("img")[0]
}
e.classList.add("show-thumbnail")
},
resetShowedImage: function(c) {
var b = this.videoDataView.getNodes();
var d = b[c];
if (!Ext.isDefined(d)) {
return
}
var a = d.getElementsByClassName("show-thumbnail")[0];
a.classList.remove("show-thumbnail");
var e = d.getElementsByTagName("img")[0];
e.classList.add("show-thumbnail")
},
getToolTip: function(a) {
return Ext.util.Format.htmlEncode(a)
},
getImgHtml: function(b) {
var c = "";
var a = [];
if (b.show_first_url) {
a = [b.url[0]];
if (1 < b.url.length) {
c += '<div class="cover-play"></div>'
}
} else {
a = b.url;
c += '<div class="cover-stop"></div>'
}
Ext.each(a, function(e, d) {
if (0 === d) {
c += '<img src="' + e + '" class="show-thumbnail">'
} else {
c += '<img src="' + e + '" class="">'
}
}, this);
return c
},
onActivate: function() {
this.el.unmask();
this.getAvailbleThumbnail()
},
onDeactivate: function() {
this.pollingtask.stopById("change_thumbnail_task");
if (0 <= this.previewIndex) {
this.stopPreview(this.videoDataView, this.previewIndex)
}
},
getAvailbleThumbnail: function() {
var a = this.getTaskId();
if (false === a) {
this.setErrorMessage(null);
return
}
SYNO.API.Request({
webapi: Ext.apply(this.webapiGet, {
params: {
id: a
}
}),
callback: function(e, c, d, b) {
if (!e) {
this.setErrorMessage(c.code);
return
}
this.setThumbnail(c)
},
scope: this
})
},
getTaskId: function() {
var a = this.owner.grid.selModel.getSelected();
if (!Ext.isDefined(a) || !Ext.isDefined(a.get("task_id"))) {
return false
}
return a.get("task_id")
},
resetPreviewPanel: function() {
this.videoData = [];
this.photoData = [];
this.videoStore.loadData(this.videoData);
this.photoStore.loadData(this.photoData)
},
setErrorMessage: function(a) {
this.resetPreviewPanel();
this.showHideFieldSet();
this.el.mask(this.getErrorMessageByCode(a))
},
getThumbnailURL: function(a) {
return this.getBaseURL(Ext.apply(this.webapiDownload, {
params: {
thumbnail_id: a
}
}))
},
getExtension: function(a) {
return a.split(".").pop()
},
isPhoto: function(a) {
var c = this.getExtension(a);
if (!Ext.isDefined(c)) {
return false
}
var b = ["jpg", "jpeg", "jpe", "bmp", "png", "tif", "tiff", "gif", "arw", "srf", "sr2", "dcr", "k25", "kdc", "cr2", "crw", "nef", "mrw", "ptx", "pef", "raf", "3fr", "erf", "mef", "mos", "orf", "rw2", "dng", "x3f", "raw"];
return (b.indexOf(c.toLowerCase()) > -1)
},
getFileName: function(a) {
return a.split("/").pop()
},
showHideFieldSet: function() {
var b = (0 === this.videoData.length);
var a = (0 === this.photoData.length);
this.getComponent("video_fieldset").setVisible(!b);
this.getComponent("photo_fieldset").setVisible(!a)
},
setThumbnail: function(a) {
if (!Ext.isDefined(a) || !Ext.isArray(a) || 0 >= a.length) {
this.setErrorMessage(null);
return
}
this.videoData = [];
this.photoData = [];
Ext.each(a, function(d, c) {
var b = {};
b.name = this.getFileName(d.file_name);
b.show_first_url = true;
b.url = [];
Ext.each(d.thumbnail_list, function(f, e) {
b.url.push(this.getThumbnailURL(f.thumbnail_id))
}, this);
if (this.isPhoto(b.name)) {
this.photoData.push(b)
} else {
this.videoData.push(b)
}
}, this);
this.videoStore.loadData(this.videoData);
this.photoStore.loadData(this.photoData);
this.showHideFieldSet()
},
getErrorMessageByCode: function(b) {
var a = _DT("common", "error_system");
switch (b) {
case 2200:
a = _DT("download", "preview_image_not_ready");
break;
case 2201:
a = _DT("download", "task_not_support_preview");
break;
default:
}
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.InfoPeer", {
extend: "SYNO.ux.GridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
this.NUM_REC_PER_PAGE = 50;
var b = this.createStore();
this.paging = this.createPagingToolbar(b);
var c = {
border: false,
view: new SYNO.ux.FleXcroll.grid.GridView({
forceFit: true
}),
stripeRows: true,
autoExpandColumn: "ip",
enableColumnMove: false,
enableColLock: false,
enableColumnHide: false,
enableHdMenu: false,
enableColumnResize: true,
bbar: this.paging,
colModel: new Ext.grid.ColumnModel({
columns: [{
id: "ip",
header: _DT("download", "peer_ip"),
dataIndex: "ip"
}, {
header: _DT("download", "peer_client"),
dataIndex: "client",
width: 60
}, {
header: _DT("download", "download_list_progress"),
dataIndex: "progress",
width: 30,
renderer: this.progressRenderer
}, {
header: _DT("download", "download_list_upload_rate"),
dataIndex: "speed_upload",
width: 40,
renderer: this.rateRenderer
}, {
header: _DT("download", "download_list_down_rate"),
dataIndex: "speed_download",
width: 40,
renderer: this.rateRenderer
}]
}),
store: b,
listeners: {
scope: this,
activate: this.onActivate,
deactivate: this.onDeactivate
}
};
Ext.apply(c, a);
this.callParent([c]);
this.createPollingTask()
},
createStore: function(a) {
return new SYNO.API.JsonStore({
api: "SYNO.DownloadStation2.Task.BT.Peer",
appWindow: this.appWin,
method: "list",
version: 2,
root: "items",
baseParams: {
limit: this.NUM_REC_PER_PAGE
},
paramNames: {
start: "offset",
limit: "limit"
},
totalProperty: "total",
fields: ["ip", "client", "progress", "speed_upload", "speed_download"],
listeners: {
scope: this,
beforeload: this.onBeforeLoad,
load: function(b, d, c) {
if (this.getGridEl() && this.getGridEl().isMasked()) {
this.getGridEl().unmask()
}
},
exception: function(e, f, g, d, c, b) {
if (!this.getGridEl().isMasked()) {
this.getGridEl().mask(SYNO.SDS.DownloadStation.Utils.getErrorString(c.code))
}
}
}
})
},
createPagingToolbar: function(a) {
return new SYNO.ux.PagingToolbar({
store: a,
pageSize: this.NUM_REC_PER_PAGE,
displayInfo: true
})
},
createPollingTask: function() {
this.pollingtask.add({
id: "bt_peer_poll_task",
interval: 5000,
scope: this,
run: function() {
this.getStore().reload()
}
})
},
onActivate: function() {
this.pollingtask.startById("bt_peer_poll_task")
},
onDeactivate: function() {
this.pollingtask.stopById("bt_peer_poll_task")
},
onBeforeLoad: function(a, b) {
var c = this.getSelectedTaskId();
if (!c) {
return false
}
b.params.task_id = c
},
getSelectedTaskId: function() {
var a = this.owner.grid.selModel.getSelected();
if (!a || !a.get("task_id")) {
return undefined
}
return a.get("task_id")
},
progressRenderer: function(c, a, b) {
c *= 100;
return Ext.util.Format.htmlEncode(Ext.util.Format.number(c, "0.0") + "%")
},
rateRenderer: function(d, a, c) {
var b = Ext.util.Format.number(d / 1024, "0.0") + " KB/s";
return (d > 0) ? Ext.util.Format.htmlEncode(b) : ""
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.InfoNZBFile", {
extend: "SYNO.ux.GridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
this.NUM_REC_PER_PAGE = 50;
this.gStart = 0;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.dsFileList = this.createStore();
this.paging = this.createPagingToolbar(this.dsFileList);
var b = {
border: false,
cls: "without-dirty-red-grid",
stripeRows: true,
loadMask: true,
autoExpandColumn: "filename",
enableColumnMove: false,
enableColLock: false,
enableColumnHide: false,
bbar: this.paging,
view: new SYNO.ux.FleXcroll.grid.GridView({
forceFit: true
}),
selModel: new Ext.grid.RowSelectionModel({
singleSelect: false
}),
colModel: new Ext.grid.ColumnModel({
defaultSortable: false,
columns: [{
id: "filename",
header: _DT("download", "download_list_filename"),
dataIndex: "name",
renderer: SYNO.SDS.DownloadStation.DLM.Util.nameRender.createDelegate(this)
}, {
header: _DT("download", "download_list_filesize"),
dataIndex: "size",
width: 100,
renderer: SYNO.SDS.DownloadStation.Utils.fileSize
}]
}),
store: this.dsFileList,
listeners: {
scope: this,
activate: this.onActivate,
deactivate: this.onDeactivate
}
};
Ext.apply(b, a);
return SYNO.LayoutConfig.fill(b)
},
createStore: function() {
return new SYNO.API.JsonStore({
api: "SYNO.DownloadStation2.Task.NZB.File",
method: "list",
appWindow: this.appWin,
version: 1,
root: "items",
autoDestroy: true,
fields: ["name", "size"],
autoLoad: true,
remoteSort: false,
baseParams: {
limit: this.NUM_REC_PER_PAGE
},
totalProperty: "total",
pruneModifiedRecords: false,
paramNames: {
start: "offset",
limit: "limit"
},
listeners: {
scope: this,
beforeload: this.onBeforeLoad,
load: function() {
if (this.getGridEl()) {
this.getGridEl().unmask()
}
this.dsFileListLoaded = true
},
exception: function(d, e, f, c, b, a) {
if (!this.getGridEl().isMasked()) {
this.getGridEl().mask(SYNO.SDS.DownloadStation.Utils.getErrorString(b.code))
}
}
}
})
},
createPagingToolbar: function(a) {
return new SYNO.ux.PagingToolbar({
store: a,
pageSize: this.NUM_REC_PER_PAGE,
displayInfo: true
})
},
onActivate: function() {
if (!this.dsFileListLoaded) {
this.dsFileList.load({
waitMsg: _DT("common", "loading")
})
}
},
onDeactivate: function() {
this.dsFileList.removeAll();
this.dsFileListLoaded = false
},
onBeforeLoad: function(a, b) {
var d = this.owner.grid.selModel.getSelected();
if (!d || !d.get("task_id")) {
return false
}
var c = d.get("task_id");
b.params.task_id = c;
if ("undefined" !== typeof (b.params.offset)) {
this.gStart = b.params.offset
} else {
this.gStart = 0
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.InfoLog", {
extend: "SYNO.ux.FormPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
var b = this.fillConfig(a);
this.callParent([b]);
this.defineBehaviors()
},
fillConfig: function(a) {
var b = {
border: false,
layout: "fit",
bodyStyle: "padding: 10px 20px 10px 20px;",
tbar: {
items: [{
xtype: "syno_button",
text: _T("common", "refresh"),
handler: this.load,
scope: this
}]
},
items: [{
xtype: "syno_textarea",
hideLabel: true,
name: "nzblog",
autoCreate: {
tag: "textarea",
autocomplete: "off",
wrap: "off"
},
readOnly: true,
cls: "selectabletext allowDefCtxMenu"
}],
listeners: {
scope: this,
activate: this.onActivate
}
};
return Ext.apply(b, a)
},
defineBehaviors: function() {
this.nzblogform = this.form
},
getTaskId: function() {
var a = this.owner.grid.selModel.getSelected();
if (!a || !a.get("task_id")) {
return 0
}
return a.get("task_id")
},
load: function() {
this.sendWebAPI({
api: "SYNO.DownloadStation2.Task.NZB.Log",
method: "get",
params: {
task_id: this.getTaskId()
},
version: 1,
scope: this,
callback: function(e, c, d, a) {
if (!e) {
this.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(c.code))
} else {
var b = this.nzblogform.findField("nzblog");
b.setValue(c.nzblog)
}
}
})
},
onActivate: function() {
if (this.nzblogform.findField("nzblog").getValue("nzblog").length === 0) {
this.load()
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueInfoPanel", {
extend: "SYNO.ux.TabPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.webapiDownloadTorrent = {
api: "SYNO.DownloadStation2.Task.Source",
method: "download",
version: 2
};
this.infoGeneral = new SYNO.SDS.DownloadStation.DLM.InfoGeneral({
owner: this.owner,
itemId: "info",
title: _DT("download", "download_table_heading_general")
});
this.infoTransfer = new SYNO.SDS.DownloadStation.DLM.InfoTransfer({
owner: this.owner,
itemId: "transfer",
title: _DT("download", "download_table_heading_transfer")
});
this.infoTracker = new SYNO.SDS.DownloadStation.DLM.InfoTracker({
uicomponents: this.uicomponents,
owner: this.owner,
itemId: "tracker",
title: _DT("download", "tracker")
});
this.infoPeer = new SYNO.SDS.DownloadStation.DLM.InfoPeer({
uicomponents: this.uicomponents,
owner: this.owner,
itemId: "peer",
title: _DT("download", "download_list_peer")
});
this.infoFile = new SYNO.SDS.DownloadStation.DLM.InfoFile({
uicomponents: this.uicomponents,
owner: this.owner,
itemId: "file",
title: _DT("download", "download_table_heading_file")
});
this.infoPreview = new SYNO.SDS.DownloadStation.DLM.InfoPreview({
uicomponents: this.uicomponents,
owner: this.owner,
itemId: "preview",
title: _T("photo_viewer", "menu_preview")
});
this.infoNZBFile = new SYNO.SDS.DownloadStation.DLM.InfoNZBFile({
uicomponents: this.uicomponents,
owner: this.owner,
itemId: "nzb_file",
title: _DT("download", "download_table_heading_file")
});
this.infoLog = new SYNO.SDS.DownloadStation.DLM.InfoLog({
uicomponents: this.uicomponents,
owner: this.owner,
itemId: "log",
title: _DT("download", "nzblog_title")
});
var b = {
border: false,
cls: "syno-dl-infotab",
collapsed: this.appWin.appInstance.getUserSettings("downloadinfo") === true ? true : false,
activeTab: 0,
items: [this.infoGeneral, this.infoTransfer, this.infoTracker, this.infoPeer, this.infoFile, this.infoPreview, this.infoNZBFile, this.infoLog],
listeners: {
scope: this,
beforecollapse: this.onRecordCollapse,
afterrender: {
fn: this.onAfterRender,
scope: this,
single: true
}
}
};
return Ext.apply(b, a)
},
onAfterRender: function() {
this.resetForm();
this.items.each(function(b) {
Ext.get(b.tabEl).on("click", function() {
var c = this.moduleList.actived;
if (c.lowerPanel.bodyCollapsed) {
c.onLowerPanelToggle(c.lowerPanel)
}
}, this)
}, this);
this.pollingtask.add({
id: "infoTask",
interval: 5000,
api: "SYNO.DownloadStation2.Task",
version: 2,
autoJsonDecode: true,
method: "get",
single: false,
callback: this.onUpdateForm,
scope: this,
beforestart: function(b) {
var c = this.owner.grid.selModel.getSelected();
this.taskID = c && c.get("task_id");
var d = {
id: [this.taskID],
additional: ["detail", "transfer"]
};
b.reqConfig.params = d
}
});
var a = this.owner.grid.getSelectionModel();
this.mon(a, "rowSelectionChanged", function(b) {
if (1 !== b.getCount()) {
this.pollingtask.stopById("infoTask");
this.resetForm();
this.setActiveTab(0);
return
}
this.load(b.getSelected())
}, this)
},
onRecordCollapse: function(a) {
var b = ("undefined" === typeof a.bodyCollapsed) ? true : !a.bodyCollapsed;
this.appWin.appInstance.setUserSettings("downloadinfo", b)
},
updateGeneralForm: function(e) {
var c = this.infoGeneral.getForm(), g, k = {};
k.filename = e.title;
k.destination = e.additional.detail.destination;
k.filesize = (0 === e.size) ? _DT("download", "download_status_unknown") : SYNO.SDS.DownloadStation.Utils.fileSize(e.size);
k.username = e.username;
k.url = e.additional.detail.uri;
g = (0 !== e.additional.detail.created_time) ? SYNO.SDS.DateTimeFormatter(new Date(e.additional.detail.created_time * 1000)) : _DT("download", "download_status_not_available");
k.create_time = g;
g = (0 !== e.additional.detail.completed_time) ? SYNO.SDS.DateTimeFormatter(new Date(e.additional.detail.completed_time * 1000)) : _DT("download", "download_status_not_available");
k.completed_time = g;
var l = (0 === e.additional.detail.waiting_seconds) ? "" : SYNO.SDS.DownloadStation.DLM.Util.convertTimeLeft(e.waiting_seconds, false);
g = ("" === l) ? _DT("download", "download_status_not_available") : l;
k.waiting_seconds = g;
c.setValues(k);
if ("bt" === e.type) {
var h = c.findField("orgtorrent");
var d = c.findField("url").getValue();
if (!h.isVisible() && !SYNO.SDS.DownloadStation.Utils.isMagnetLink(d)) {
var a = e.title + ".torrent";
var i = e.id;
var b = this.getBaseURL(Ext.apply(this.webapiDownloadTorrent, {
params: {
id: i,
t: (new Date()).getTime()
}
}), true, a);
var j = Ext.util.Format.htmlEncode(b);
var f = String.format('<a target="_blank" href="{0}">{1}</a>', j, _DT("download", "download_orgtorrent_desc"));
h.setRawValue(f);
h.show()
}
}
},
updateTransferForm: function(e) {
var a = this.infoTransfer.getForm(), f, j = {}, i = SYNO.SDS.DownloadStation.Utils;
j.task_status = i.getTaskStatusStr(e);
var h = SYNO.SDS.DownloadStation.Utils.fileSize(e.additional.transfer.size_downloaded);
if ("bt" === e.type) {
h = SYNO.SDS.DownloadStation.Utils.fileSize(e.additional.transfer.size_uploaded) + " / " + h;
var g = (0 === e.additional.transfer.size_downloaded) ? 0 : Ext.util.Format.number(100 * e.additional.transfer.size_uploaded / e.additional.transfer.size_downloaded, "0.0");
h = h + " (" + g + "%)"
}
j.transfered = h;
if ((i.TASK_STATUS_INT.TASK_DOWNLOADING || 0 !== e.additional.transfer.size_downloaded) && 0 < e.size) {
j.progress = Ext.util.Format.number(100 * e.additional.transfer.size_downloaded / e.size, "0.0") + "%"
} else {
j.progress = _DT("download", "download_status_unknown")
}
var c = _DT("download", "download_status_not_available");
if (SYNO.SDS.DownloadStation.DLM.Util.isActiveTorrentStatus(e.status)) {
if ("bt" === e.type && e.additional.detail.total_pieces > 0) {
c = SYNO.SDS.DownloadStation.Utils.fileSize(e.additional.transfer.speed_upload) + "/s / " + SYNO.SDS.DownloadStation.Utils.fileSize(e.additional.transfer.speed_download) + "/s"
} else {
if ("bt" !== e.type) {
c = SYNO.SDS.DownloadStation.Utils.fileSize(e.additional.transfer.speed_download) + "/s"
}
}
}
j.speed = c;
j.totalpeer = (0 === e.additional.detail.total_peers) ? _DT("download", "download_status_not_available") : e.additional.detail.total_peers;
j.currpeer = (0 === e.additional.detail.connected_peers) ? _DT("download", "download_status_not_available") : e.additional.detail.connected_peers;
j.totalpieces = e.additional.detail.total_pieces + " x 2MB";
j.currpieces = e.additional.transfer.downloaded_pieces;
f = (0 !== e.additional.detail.started_time) ? SYNO.SDS.DateTimeFormatter(new Date(e.additional.detail.started_time * 1000)) : _DT("download", "download_status_not_available");
j.start_time = f;
var d = SYNO.SDS.DownloadStation.DLM.Util.timeleftCalc(e.additional.transfer.speed_download, e.size, e.additional.transfer.size_downloaded);
var b = (d == -1) ? _DT("download", "download_status_not_available") : SYNO.SDS.DownloadStation.DLM.Util.convertTimeLeft(d, false);
j.time_left = b;
j.seed_elapsed = e.additional.detail.seed_elapsed;
a.setValues(j);
if ("bt" === e.type) {
a.findField("seed_elapsed").show();
if (e.additional.detail.seed_elapsed > 0) {
a.findField("time_left").hide();
a.findField("seed_elapsed").setValue(this.convertSeedElapsed(e.additional.detail.seed_elapsed))
}
if (SYNO.SDS.DownloadStation.DLM.Util.isActiveTorrentStatus(e.status)) {
var k = e.additional.detail.connected_seeders + "/" + e.additional.detail.connected_leechers;
a.findField("seeders_leechers").setValue(k);
a.findField("seeders_leechers").show()
}
}
},
onUpdateForm: function(e, c, d, a) {
this.unmask();
if (!this.infoTransfer) {
return
}
if (!e) {
return
} else {
if (c.code) {
this.appWin.getMsgBox().alert("", SYNO.SDS.DownloadStation.Utils.getErrorString(c.code));
return
}
}
if (!this.taskID || d.id[0] != this.taskID) {
return
}
this.checkUpdateData(c.task[0]);
var b = c.task[0];
this.isTorrentTask = ("bt" === b.type);
this.updateGeneralForm(b);
this.updateTransferForm(b);
this.doLayout()
},
resetForm: function() {
this.hideTabStripItem("tracker");
this.hideTabStripItem("peer");
this.hideTabStripItem("file");
this.hideTabStripItem("preview");
this.hideTabStripItem("nzb_file");
this.hideTabStripItem("log");
this.infoGeneral.resetForm();
this.infoTransfer.resetForm();
this.infoLog.nzblogform.findField("nzblog").reset()
},
load: function(a) {
this.pollingtask.stopById("infoTask");
this.resetForm();
this.mask(_DT("common", "loading"));
this.pollingtask.startById("infoTask");
this.infoNZBFile.dsFileListLoaded = false;
if ("nzb" === a.get("type")) {
if (this.getActiveTab() !== this.infoNZBFile && this.getActiveTab() !== this.infoTransfer && this.getActiveTab() !== this.infoLog && this.getActiveTab() !== this.infoGeneral) {
this.setActiveTab(0)
}
this.unhideNZBTabs();
if (Ext.isDefined(this.getActiveTab().onDeactivate)) {
this.getActiveTab().onDeactivate()
}
if (Ext.isDefined(this.getActiveTab().onActivate)) {
this.getActiveTab().onActivate()
}
} else {
if ("bt" === a.get("type")) {
if (this.getActiveTab() !== this.infoGeneral && this.getActiveTab() !== this.infoTransfer && this.getActiveTab() !== this.infoTracker && this.getActiveTab() !== this.infoPeer && this.getActiveTab() !== this.infoFile && this.getActiveTab() !== this.infoPreview) {
this.setActiveTab(0)
}
if (SYNO.SDS.DownloadStation.DLM.Util.isActiveTorrentStatus(a.get("status"))) {
this.unhideTorrentTabs()
} else {
if (this.getActiveTab() === this.infoTracker || this.getActiveTab() === this.infoPeer || this.getActiveTab() === this.infoFile || this.getActiveTab() === this.infoPreview) {
this.setActiveTab(0)
}
}
if (Ext.isDefined(this.getActiveTab().onDeactivate)) {
this.getActiveTab().onDeactivate()
}
if (Ext.isDefined(this.getActiveTab().onActivate)) {
this.getActiveTab().onActivate()
}
} else {
if (this.getActiveTab() !== this.infoGeneral && this.getActiveTab() !== this.infoTransfer) {
this.setActiveTab(0)
}
}
}
},
checkUpdateData: function(e) {
var d = this.lastData
, c = false
, b = false
, a = SYNO.SDS.DownloadStation.DLM.Util;
this.lastData = e;
if (!d || !e) {
return
}
c = a.isActiveTorrentStatus(e.status);
b = a.isActiveTorrentStatus(d.status);
if ("bt" !== d.type && "bt" === e.type && c) {
this.unhideTorrentTabs()
}
if ("nzb" !== d.type && "nzb" === e.type) {
this.unhideNZBTabs()
}
if ("bt" === e.type && (d.status !== e.status)) {
if (b && !c) {
this.hideTorrentTabs();
if (this.getActiveTab() !== this.infoGeneral) {
this.setActiveTab("info")
}
} else {
if (!b && c) {
this.unhideTorrentTabs()
}
}
}
},
convertSeedElapsed: function(b) {
var d = 0;
var a = 0;
var c = 0;
if (b < 3600) {
return Math.floor(b / 60) + " " + _DT("download", "download_seed_mins")
}
if (b < 86400) {
a = Math.floor(b / 3600);
c = Math.floor((b - a * 3600) / 60);
return String.format("{0} {1} {2} {3}", a, _DT("download", "download_seed_hours"), c, _DT("download", "download_seed_mins"))
}
d = Math.floor(b / 86400);
a = Math.floor((b - d * 86400) / 3600);
c = Math.floor((b - d * 86400 - a * 3600) / 60);
return String.format("{0} {1} {2} {3} {4} {5}", d, _DT("download", "download_seed_days"), a, _DT("download", "download_seed_hours"), c, _DT("download", "download_seed_mins"))
},
unhideNZBTabs: function() {
this.unhideTabStripItem("nzb_file");
this.unhideTabStripItem("log")
},
hideTorrentTabs: function() {
this.hideTabStripItem("tracker");
this.hideTabStripItem("peer");
this.hideTabStripItem("file");
this.hideTabStripItem("preview")
},
unhideTorrentTabs: function() {
this.unhideTabStripItem("tracker");
this.unhideTabStripItem("peer");
this.unhideTabStripItem("file");
if (this.appWin.tabPanel.enable_bt_preview) {
this.unhideTabStripItem("preview")
} else {
if (this.getActiveTab() === this.infoPreview) {
this.setActiveTab(0)
}
}
},
unmask: function() {
if (this.getEl().isMasked()) {
this.getEl().unmask()
}
},
mask: function(a) {
if (!this.getEl().isMasked()) {
this.getEl().mask(a)
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.CaptchaEnterDialog", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.webapiList = {
api: "SYNO.DownloadStation2.Captcha",
method: "list",
version: 2
};
this.webapiSet = {
api: "SYNO.DownloadStation2.Captcha",
method: "set",
version: 2
};
this.webapiDownload = {
api: "SYNO.DownloadStation2.Captcha",
method: "download",
version: 2
};
this.webapiGet = {
api: "SYNO.DownloadStation2.Task",
method: "get",
version: 2
};
this.formPanel = this.createForm(a);
this.submitButton = this.formPanel.getFooterToolbar().getComponent("submit");
var b = {
owner: this.appWin,
width: 640,
height: 437,
resizable: false,
title: _DT("download", "require_captcha"),
useStatusBar: false,
layout: "fit",
cls: "syno-dl-captcha-win download-captcha-formpanel",
items: [this.formPanel]
};
Ext.apply(b, a);
return b
},
createForm: function(a) {
this.statusImageClass = "";
this.statusImage = new SYNO.ux.Button({
cls: "status-image",
disabled: true,
value: ""
});
var b = {
hidden: true,
blSubmitted: false,
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
itemId: "submit",
btnStyle: "blue",
text: _DT("common", "submit"),
scope: this,
handler: this.onSubmit,
disabled: _S("demo_mode"),
tooltip: _S("demo_mode") ? _JSLIBSTR("uicommon", "error_demo") : undefined
}, {
xtype: "syno_button",
text: _T("common", "cancel"),
scope: this,
handler: this.close
}),
items: [{
xtype: "syno_displayfield",
name: "task_id",
hidden: true
}, {
xtype: "syno_displayfield",
name: "filename",
fieldLabel: _DT("download", "download_list_filename"),
cls: "captcha-info",
value: ""
}, {
xtype: "syno_displayfield",
name: "url",
fieldLabel: _DT("download", "download_list_url"),
cls: "captcha-info",
value: ""
}, {
xtype: "syno_displayfield",
name: "image",
hideLabel: true,
ctCls: "captcha-image-field",
value: "",
htmlEncode: false
}, {
xtype: "syno_displayfield",
hideLabel: true,
value: _DT("download", "enter_captcha") + ":"
}, {
xtype: "syno_compositefield",
hideLabel: true,
items: [{
xtype: "syno_textfield",
name: "captcha_code",
allowBlank: false
}, this.statusImage]
}, {
xtype: "syno_displayfield",
name: "message",
hideLabel: true,
cls: "captcha-error-message",
value: ""
}]
};
b = Ext.apply(b, a);
return new SYNO.ux.FormPanel(b)
},
onShow: function() {
if (Ext.isEmpty(this.taskId)) {
this.listCaptchaTask()
} else {
this.getTaskInfo(this.taskId)
}
},
onSubmit: function() {
var a = this.formPanel.getForm();
if (!a.blSubmitted) {
if (!a.isValid()) {
return
}
a.blSubmitted = true;
this.setCaptchaResult(a.findField("task_id").getValue(), a.findField("captcha_code").getValue())
} else {
a.blSubmitted = false;
this.listCaptchaTask()
}
},
getCaptchaImageURL: function(a) {
return this.getBaseURL(Ext.apply(this.webapiDownload, {
params: {
task_id: a,
t: (new Date()).getTime()
}
}))
},
getImgHtml: function(a) {
return '<img class="captcha" src="' + a + '">'
},
getTaskInfo: function(a) {
this.getEl().mask(_DT("common", "loading"), "x-mask-loading");
SYNO.API.Request({
webapi: Ext.apply(this.webapiGet, {
params: {
id: [a],
additional: ["detail"]
}
}),
callback: function(e, c, d, b) {
this.getEl().unmask();
if (!e) {
this.close();
return
}
this.getTaskInfoCallback(c)
},
scope: this
})
},
getTaskInfoCallback: function(c) {
var b = {};
var a;
if (Ext.isEmpty(c.task) || Ext.isEmpty(c.task[0])) {
this.close();
return
}
a = c.task[0];
b.taskId = a.id;
b.filename = a.title;
b.url = a.additional.detail.uri;
this.setTaskInfo(b)
},
setStatusImageClass: function(a) {
this.statusImage.removeClass(this.statusImageClass);
this.statusImage.addClass(a);
this.statusImageClass = a
},
setTaskInfo: function(b) {
var d = this.formPanel.getForm();
if (!Ext.isEmpty(b.taskId)) {
d.findField("task_id").setValue(b.taskId);
var a = this.getCaptchaImageURL(b.taskId);
d.findField("image").setValue(this.getImgHtml(a))
}
if (!Ext.isEmpty(b.filename)) {
d.findField("filename").setValue(b.filename)
}
if (!Ext.isEmpty(b.url)) {
d.findField("url").setValue(b.url)
}
if (!Ext.isEmpty(b.message)) {
d.findField("message").setValue(b.message)
} else {
d.findField("message").setValue("")
}
var c;
if (d.blSubmitted) {
c = b.success ? _DT("download", "next_one") : _T("common", "skip");
if (b.success) {
this.setStatusImageClass("status-success")
} else {
this.setStatusImageClass("status-error")
}
} else {
c = _DT("common", "submit");
d.findField("captcha_code").reset();
this.setStatusImageClass("")
}
this.submitButton.setText(c);
this.formPanel.setVisible(true)
},
listCaptchaTask: function() {
this.getEl().mask(_DT("common", "loading"), "x-mask-loading");
SYNO.API.Request({
webapi: this.webapiList,
callback: function(d, b, c, a) {
this.getEl().unmask();
if (!d) {
this.close();
return
}
this.listCaptchaTaskCallback(b)
},
scope: this
})
},
listCaptchaTaskCallback: function(b) {
var a = b.task_ids;
if (!Array.isArray(a) || 0 === a.length) {
this.close();
return
}
this.getTaskInfo(a[0])
},
setCaptchaResult: function(a, b) {
this.setStatusImageClass("status-loading");
this.submitButton.setDisabled(true);
SYNO.API.Request({
webapi: Ext.apply(this.webapiSet, {
params: {
task_id: a,
code: b
}
}),
callback: function(f, d, e, c) {
this.setStatusImageClass("");
this.submitButton.setDisabled(false);
this.setCaptchaResultCallback(f, d)
},
scope: this
})
},
setCaptchaResultCallback: function(c, b) {
var a = {};
if (!c) {
a.message = this.getErrorMessage(b.code);
a.success = false
} else {
a.success = true
}
this.setTaskInfo(a);
if (c) {
this.onSubmit()
}
},
getErrorMessage: function(b) {
var a = _DT("common", "error_system");
switch (b) {
case 2301:
a = _DT("download", "download_error_wrong_captcha");
break;
default:
break
}
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueGridPanel", {
extend: "SYNO.ux.GridPanel",
statics: {
COLUMN_ID: {
TASK_ID: "task_id",
FILENAME: "filename",
TOTAL_SIZE: "total_size",
CURRENT_SIZE: "current_size",
TOTAL_UPLOAD: "total_upload",
PROGRESS: "progress",
UPLOAD_RATE: "upload_rate",
CURRENT_RATE: "current_rate",
TIMELEFT: "timeleft",
STATUS: "status",
DESTINATION: "destination",
STARTED_TIME: "started_time",
COMPLETED_TIME: "completed_time",
WAITING_SECONDS: "waiting_seconds",
USERNAME: "username"
}
},
StatusNotEndable: [SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_FINISHED, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_FINISHING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_HASH_CHECKING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_PRE_SEEDING],
StatusFinished: [SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_FINISHED, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_PRE_SEEDING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_SEEDING],
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
this.owner.updateConcreteConfig(this);
this.NUM_REC_PER_PAGE = 25;
this.gStart = 0;
this.jsConfig = a.owner.jsConfig;
this.webapiTaskList = {
api: "SYNO.DownloadStation2.Task",
method: "list",
version: 2
};
this.webapiCaptchaList = {
api: "SYNO.DownloadStation2.Captcha",
method: "list",
version: 2
};
this.webapiTotalStatistic = {
api: "SYNO.DownloadStation2.Task.Statistic",
method: "get",
version: 1,
params: {
type: ["emule"],
type_inverse: true
}
};
this.stateManager = new SYNO.SDS.DownloadStation.DLM.QueueGridPanelStateManager({
owner: this
});
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(b) {
var a = this.initColumnModel();
var d = this.createSelectionModel();
this.store = this.createStore();
this.paging = this.createPagingToolbar();
var c = {
ds: this.store,
bbar: this.paging,
selModel: d,
minHeight: 90,
stripeRows: true,
colModel: a,
view: new SYNO.SDS.DownloadStation.GridView(),
stateful: true,
stateEvents: ["columnmove", "columnresize", "sortchange"],
initState: function() {
this.stateManager.initState()
},
saveState: function() {
this.stateManager.saveState()
},
listeners: {
scope: this,
rowcontextmenu: function(f, j, h) {
var i = f.getSelectionModel();
if (!i.isSelected(j)) {
i.selectRow(j)
}
this.gridCtxMenu.showAt(h.getXY());
h.preventDefault()
},
rowdblclick: this.onRowDblClick,
afterlayout: {
fn: function() {
this.fieldFilter = this.owner.actionGroup.get("filter");
this.gridCtxMenu = this.createCtxMenu();
this.addManagedComponent(this.gridCtxMenu);
this.pollingtask.add({
id: "updateTask",
interval: 5000,
webapi: {
api: "SYNO.Entry.Request",
version: 1,
method: "request",
compound: {
stopwhenerror: false
}
},
single: false,
callback: this.onUpdateRecordsTask,
beforestart: this.onBeforeStart,
scope: this
});
this.pollingtask.add({
id: "updateStatistic",
interval: 5000,
webapi: this.webapiTotalStatistic,
single: false,
callback: this.onUpdateTotalStatistic,
scope: this
})
},
scope: this,
single: true
}
}
};
return Ext.apply(c, b)
},
createCtxMenu: function() {
var a = [];
var c = [{
itemId: "resume",
text: _DT("download", "download_btn_resume"),
iconCls: ""
}, {
itemId: "pause",
text: _DT("download", "download_btn_stop"),
iconCls: ""
}, {
itemId: "end",
text: _DT("download", "download_btn_end"),
iconCls: ""
}, {
itemId: "delete",
text: _DT("download", "download_btn_remove"),
iconCls: ""
}, {
itemId: "edit",
text: _DT("common", "alt_edit"),
iconCls: ""
}];
for (var b = 0; b < c.length; b++) {
var d = this.owner.actionGroup.get(c[b].itemId).initialConfig;
a.push(Ext.apply(d, c[b]))
}
a.push({
itemId: "open",
iconCls: "",
text: _T("fbbrower", "open_folder"),
handler: this.onOpenContainingFolder,
scope: this
});
var e = new SYNO.ux.Menu({
cls: "syno-dlm-menu",
items: a,
listeners: {
scope: this,
beforeshow: function(g) {
var f = this.updateBtnStatus();
g.get("pause").setDisabled(!f.blStop);
g.get("resume").setDisabled(!f.blResume);
g.get("end").setDisabled(!f.blEnd);
g.get("delete").setDisabled(!f.blDelete);
g.get("edit").setDisabled(!f.blEdit);
g.get("open").setDisabled(!f.blOpen)
}
}
});
return e
},
onRowDblClick: function() {
var b = this.getSelectionModel().getSelections();
var c = b.length;
var a;
if (0 === c || 1 < c) {
return
}
a = b[0];
if (SYNO.SDS.DownloadStation.DLM.Util.isFinishedStatus(a.get("status"))) {
return
}
this.owner.actionGroup.launchTaskEditDialog()
},
updateBtnStatus: function() {
var f = false
, k = false
, h = false
, l = false
, g = false
, a = false;
var c = this.getSelectionModel();
var j = SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT;
if (c.hasSelection()) {
l = true;
a = true;
var b = c.getSelections();
var d = "";
var e;
if ((-1 !== this.StatusFinished.indexOf(b[0].get("status"))) && "" !== b[0].get("destination")) {
g = true
}
for (e = 0; e < b.length; e++) {
d = b[e].get("status");
if (d === j.TASK_FINISHED && ("bt" === b[e].get("type")) || SYNO.SDS.DownloadStation.Utils.isTaskErrorStatus(d)) {
f = true
} else {
if (d === j.TASK_PAUSED) {
f = true;
h = true
} else {
if (d === j.TASK_WAITING || d === j.TASK_DOWNLOADING || d === j.TASK_FILEHOSTING_WAITING || d === j.TASK_SEEDING) {
k = true;
h = true
} else {
if (d === j.TASK_HASH_CHECKING || d === j.TASK_PRE_SEEDING) {
k = true
}
}
}
}
if (SYNO.SDS.DownloadStation.DLM.Util.isFinishedStatus(d)) {
l = false
}
}
}
return {
blResume: f,
blStop: k,
blEnd: h,
blEdit: l,
blDelete: a,
blOpen: g
}
},
createSelectionModel: function() {
var a = new Ext.grid.RowSelectionModel({
singleSelect: false,
listeners: {
selectionchange: {
scope: this,
fn: this.gridSelectionChange
}
}
});
a.addEvents({
rowSelectionChanged: true
});
return a
},
gridSelectionChange: function(a) {
if (!this.gridSelectionChangeTask) {
this.gridSelectionChangeTask = new Ext.util.DelayedTask(function() {
a.fireEvent("rowSelectionChanged", a)
}
,a)
}
this.gridSelectionChangeTask.delay(300)
},
initColumnModel: function() {
var a = this.self.COLUMN_ID;
var b = [{
id: a.FILENAME,
header: _DT("download", "download_list_filename"),
width: 180,
dataIndex: "filename",
renderer: SYNO.SDS.DownloadStation.Renderers.fileNameWithStatusRenderer
}, {
header: _DT("download", "download_list_filesize"),
dataIndex: "total_size",
id: a.TOTAL_SIZE,
width: 80,
renderer: SYNO.SDS.DownloadStation.Renderers.SizeRenderer
}, {
header: _DT("download", "download_list_completed"),
dataIndex: "current_size",
id: a.CURRENT_SIZE,
width: 80,
renderer: SYNO.SDS.DownloadStation.Renderers.SizeRenderer
}, {
header: _DT("download", "download_list_uploaded"),
dataIndex: "total_upload",
id: a.TOTAL_UPLOAD,
width: 65,
renderer: SYNO.SDS.DownloadStation.Renderers.SizeRenderer
}, {
header: _DT("download", "download_list_progress"),
dataIndex: "progress",
id: a.PROGRESS,
width: 65,
renderer: SYNO.SDS.DownloadStation.Renderers.ProgressRenderer
}, {
header: _DT("download", "download_list_upload_rate"),
dataIndex: "upload_rate",
id: a.UPLOAD_RATE,
width: 68,
renderer: SYNO.SDS.DownloadStation.Renderers.RateRenderer
}, {
header: _DT("download", "download_list_down_rate"),
dataIndex: "current_rate",
id: a.CURRENT_RATE,
width: 68,
renderer: SYNO.SDS.DownloadStation.Renderers.RateRenderer
}, {
id: a.TIMELEFT,
header: _DT("download", "download_time_left"),
dataIndex: "timeleft",
width: 80,
renderer: function(d) {
var c = (d == -1) ? "" : SYNO.SDS.DownloadStation.DLM.Util.convertTimeLeft(d, true);
return Ext.util.Format.htmlEncode(c)
}
}, {
id: a.STATUS,
header: _DT("download", "download_list_status"),
dataIndex: "status",
width: 70,
renderer: SYNO.SDS.DownloadStation.Renderers.StatusRenderer,
listeners: {
scope: this,
click: function(f, d, h, g) {
var c = this.store.getAt(h);
if (SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_CAPTCHA_NEEDED === c.get("status")) {
this.launchCaptchaEnterDialog(c.get("task_id"))
}
}
}
}, {
id: a.DESTINATION,
header: _DT("download", "download_list_dest_folder"),
dataIndex: "destination",
width: 90,
renderer: SYNO.SDS.DownloadStation.DLM.Util.destinationRender.createDelegate(this)
}, {
id: a.STARTED_TIME,
header: _DT("download", "download_list_started_time"),
dataIndex: "started_time",
renderer: SYNO.SDS.DownloadStation.DLM.Util.startedtimeRender.createDelegate(this)
}, {
id: a.COMPLETED_TIME,
header: _DT("download", "download_list_completed_time"),
dataIndex: "completed_time",
renderer: SYNO.SDS.DownloadStation.DLM.Util.startedtimeRender.createDelegate(this)
}, {
id: a.WAITING_SECONDS,
header: _DT("download", "download_list_expected_waiting_time"),
dataIndex: "waiting_seconds",
renderer: SYNO.SDS.DownloadStation.DLM.Util.waitingtimeRender.createDelegate(this)
}];
if ((true === _S("is_admin")) && !_S("diskless")) {
b.push({
id: a.USERNAME,
header: _DT("download", "download_list_username"),
dataIndex: "username"
})
}
return new Ext.grid.ColumnModel({
defaults: {
sortable: true,
width: 100
},
columns: b
})
},
createStore: function() {
var a = [{
name: "task_id",
mapping: "id"
}, {
name: "filename",
mapping: "title"
}, {
name: "total_size",
mapping: "size"
}, {
name: "current_size",
convert: function(d, c) {
return c.additional.transfer.size_downloaded
}
}, {
name: "total_upload",
convert: function(d, c) {
return c.additional.transfer.size_uploaded
}
}, {
name: "progress",
convert: function(d, c) {
return (0 === c.size) ? 0 : (c.additional.transfer.size_downloaded / c.size) * 100
}
}, {
name: "current_rate",
convert: function(d, c) {
return c.additional.transfer.speed_download
}
}, {
name: "upload_rate",
convert: function(d, c) {
return c.additional.transfer.speed_upload
}
}, {
name: "username",
mapping: "username"
}, {
name: "status",
mapping: "status"
}, {
name: "status_extra",
mapping: "status_extra"
}, {
name: "timeleft",
convert: function(d, c) {
return SYNO.SDS.DownloadStation.DLM.Util.timeleftCalc(c.additional.transfer.speed_download, c.size, c.additional.transfer.size_downloaded)
}
}, {
name: "type",
mapping: "type"
}, {
name: "destination",
convert: function(d, c) {
return c.additional.detail.destination
}
}, {
name: "started_time",
convert: function(d, c) {
return c.additional.detail.started_time
}
}, {
name: "completed_time",
convert: function(d, c) {
return c.additional.detail.completed_time
}
}, {
name: "waiting_seconds",
convert: function(d, c) {
return c.additional.detail.waiting_seconds
}
}];
var b = new SYNO.API.JsonStore({
api: this.webapiTaskList.api,
method: this.webapiTaskList.method,
version: this.webapiTaskList.version,
baseParams: {
type: ["emule"],
type_inverse: true,
limit: this.NUM_REC_PER_PAGE,
additional: ["detail", "transfer"]
},
pruneModifiedRecords: true,
appWindow: this,
autoLoad: false,
root: "task",
totalProperty: "total",
remoteSort: true,
fields: a,
sortInfo: {
field: this.self.COLUMN_ID.TASK_ID,
direction: "ASC"
},
paramNames: {
start: "offset",
limit: "limit",
sort: "sort_by",
dir: "order"
},
listeners: {
scope: this,
beforeload: this.beforeloadStore,
load: this.onLoadStore,
loadexception: this.onStoreLoadException
}
});
this.addManagedComponent(b);
return b
},
onStoreLoadException: function(b, c, a) {
this.owner.clearStatusBusy();
this.onLoadStoreError(a.code)
},
getSortParam: function() {
var a = this.getStore().getSortState().field;
switch (a) {
case "source":
return "connected_peers";
case "waiting_seconds":
return "waiting_until_time";
default:
return a
}
},
getLoadParams: function() {
var b = {
offset: this.gStart || 0,
limit: this.NUM_REC_PER_PAGE,
sort_by: this.getSortParam(),
order: this.getStore().getSortState().direction,
additional: ["detail", "transfer"],
type: ["emule"],
type_inverse: true
};
if ("undefined" !== typeof (this.filterStatus)) {
b.status = this.filterStatus
}
if ("undefined" !== typeof (this.filterInverse)) {
b.status_inverse = this.filterInverse
}
var a = this.fieldFilter.getValue();
if (a) {
b.keyword = a
}
return b
},
beforeloadStore: function(b, c) {
var a;
this.pollingtask.stopById("updateTask");
if ("undefined" !== typeof (c.params.offset)) {
this.gStart = c.params.offset
} else {
this.gStart = 0
}
a = this.fieldFilter.getValue();
if (!Ext.isEmpty(a)) {
b.baseParams.keyword = a
} else {
delete b.baseParams.keyword
}
b.baseParams.status = this.filterStatus;
b.baseParams.status_inverse = this.filterInverse;
this.owner.setStatusBusy();
this.pollingtask.startById("updateStatistic")
},
onLoadStore: function(a, d, b) {
this.owner.clearStatusBusy();
if (this.getStore().getTotalCount() <= this.gStart && 0 < this.gStart) {
var c = Math.ceil((this.getStore().getTotalCount() - this.NUM_REC_PER_PAGE) / this.NUM_REC_PER_PAGE);
this.getStore().load({
params: {
offset: (c * this.NUM_REC_PER_PAGE),
limit: this.NUM_REC_PER_PAGE
}
});
this.forceSelectIdx = -1;
return
}
this.pollingtask.startById("updateTask", false);
return this.onFirstSelectRow()
},
onFirstSelectRow: function() {
if (this.getStore().getCount() < 1) {
this.owner.info.resetForm()
} else {
if (this.forceSelectIdx && 0 < this.forceSelectIdx) {
this.selModel.selectRow(this.forceSelectIdx);
this.getView().focusRow(this.forceSelectIdx);
this.forceSelectIdx = -1;
return false
} else {
if (!this.getSelectionModel().hasSelection()) {
this.getSelectionModel().selectFirstRow()
}
}
}
},
onLoadStoreError: function(a) {
SYNO.SDS.DownloadStation.Utils.setErrorMask(a, this.owner.panel);
this.pollingtask.startById("updateTask", false)
},
isSameParams: function(b) {
var a = this.fieldFilter.getValue();
return (typeof b !== "undefined" && b.sort_by === this.getSortParam() && b.order === this.getStore().getSortState().direction && b.status === this.filterStatus && b.status_inverse === this.filterInverse && b.offset === this.gStart && (!a || b.keyword === a) && (!b.keyword || b.keyword === a))
},
createPagingToolbar: function() {
this.itemTotalDownRate = new SYNO.SDS.DownloadStation.ToolbarRateItem({
labelText: "DL"
});
this.itemTotalUpRate = new SYNO.SDS.DownloadStation.ToolbarRateItem({
labelText: "UL"
});
return new SYNO.ux.PagingToolbar({
store: this.store,
pageSize: this.NUM_REC_PER_PAGE,
displayInfo: true,
items: [this.itemTotalDownRate, "-", this.itemTotalUpRate, "-"]
})
},
updateTotalRate: function(a) {
this.itemTotalDownRate.updateTextByRate(a.download_rate);
this.itemTotalUpRate.updateTextByRate(a.upload_rate)
},
updateRecords: function(a) {
this.pollingtask.startById("updateTask", a)
},
updateCaptchaNumber: function(a) {
var d = false;
var c = "0";
var b = this.owner.toolbar.find("itemId", "captcha")[0];
if (!Ext.isDefined(b)) {
return
}
if (!Ext.isEmpty(a) && 0 < a) {
d = true;
c = a.toString()
}
b.setVisible(d);
b.setText(c)
},
getSelectedTaskIds: function() {
var a = [];
Ext.iterate(this.getSelectionModel().getSelections(), function(b) {
a.push(b.get("task_id"))
}, this);
return a
},
onUpdateRecordsTask: function(e, a, u, k) {
if (!this.getStore()) {
return
}
if (!e) {
return
}
if (a.has_fail) {
var f;
Ext.each(a.result, function(j, i) {
if (false === j.success) {
f = j.error.code
}
}, this);
this.onLoadStoreError(f);
return
}
this.unmask();
this.owner.panel.el.unmask();
for (var p = 0; p < a.result.length; p++) {
var h = a.result[p];
if (this.webapiCaptchaList.api === h.api) {
this.updateCaptchaNumber(h.data.task_ids.length)
} else {
if (this.webapiTotalStatistic.api === h.api) {
this.updateTotalRate(h.data)
} else {
if (this.webapiTaskList.api === h.api) {
if (!this.isSameParams(u.compound[p])) {
this.pollingtask.startById("updateTask");
return
}
this.unmask();
var m = false;
var l = false;
var c = this.getStore();
var s = this.getSelectionModel();
if (h.data.total != c.getTotalCount()) {
m = true
} else {
var b = [];
var o = false;
var d = [];
var q = c.reader.readRecords(h.data).records;
b = this.getSelectedTaskIds();
if (1 === b.length) {
o = true;
s.suspendEvents(false)
}
for (var n = 0; n < q.length; n++) {
var r = q[n];
var g = r.id;
var v = c.getById(g);
if (v) {
var t = c.getAt(n);
if (-1 !== b.indexOf(g)) {
d.push(g)
}
l |= ((v.data.status !== r.data.status) && -1 !== b.indexOf(g));
Ext.apply(v.data, r.data);
v.commit();
if (b.length < 2 && t && r.id != t.get("task_id")) {
c.remove(v);
c.insert(n, v)
}
} else {
c.removeAt(n);
c.insert(n, new Ext.data.Record(r.data,r.id))
}
}
if (true === o) {
if (1 === d.length) {
s.selectRecords([c.getById(d[0])])
}
s.resumeEvents()
}
}
if (m) {
this.getStore().reload()
} else {
if (l) {
this.getSelectionModel().fireEvent("rowSelectionChanged", this.getSelectionModel())
}
}
this.onFirstSelectRow()
}
}
}
}
},
onUpdateTotalStatistic: function(d, b, c, a) {
this.pollingtask.stopById("updateStatistic");
if (!d) {
this.onLoadStoreError(b.code);
return
}
this.updateTotalRate(b)
},
launchCaptchaEnterDialog: function(b) {
var a = new SYNO.SDS.DownloadStation.DLM.CaptchaEnterDialog({
uicomponents: this.uicomponents,
taskId: b
});
a.show()
},
onBeforeStart: function(a) {
a.taskCfg.webapi.compound.params = [Ext.apply(this.webapiTaskList, {
params: this.getLoadParams()
}), this.webapiCaptchaList, this.webapiTotalStatistic]
},
onOpenContainingFolder: function() {
var b = this.getSelectionModel().getSelected();
if (-1 === this.StatusFinished.indexOf(b.get("status"))) {
return
}
var a = b.get("destination");
if (a === "") {
this.owner.getMsgBox().alert(_T("fbbrower", "open_folder"), _T("error", "error_dest_no_path"));
return
}
if (true === this._S("is_admin") && (a === "home" || a.substr(0, 5) === "home/")) {
if (b.get("username") !== _S("user")) {
a = (a.length > 4) ? "/" + a.substr(5) : "";
a = "homes/" + b.get("username") + a
}
}
SYNO.SDS.AppLaunch("SYNO.SDS.App.FileStation3.Instance", {
openfile: "/" + a + "/" + b.get("filename")
})
},
addQuickURL: function(a) {
var b = function(c) {
var d = {
type: "url",
url: [a],
destination: c,
create_list: false
};
this.getGridEl().mask(_DT("common", "saving"));
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task",
method: "create",
params: d,
version: 2,
scope: this,
callback: function(h, f, g, e) {
this.owner.clearStatusBusy();
if (!h) {
this.appWin.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(f.code))
} else {
this.preSelectLastRecord();
this.updateRecords(true)
}
}
})
};
SYNO.SDS.DownloadStation.DLM.Util.checkLocationDestinationNonEmpty(this, b, undefined, this)
},
preSelectLastRecord: function() {
if (this.store.sortInfo && (this.self.COLUMN_ID.TASK_ID === this.store.sortInfo.field) && ("ASC" === this.store.sortInfo.direction)) {
var a = Math.floor(this.store.getTotalCount() / this.NUM_REC_PER_PAGE);
this.gStart = a * this.NUM_REC_PER_PAGE;
this.forceSelectIdx = (this.store.getTotalCount() % this.NUM_REC_PER_PAGE)
}
},
unmask: function() {
if (this.getGridEl().isMasked()) {
this.getGridEl().unmask()
}
},
mask: function(a) {
if (!this.getGridEl().isMasked()) {
this.getGridEl().mask(a)
}
},
getDefaultHiddenColumns: function() {
throw "Should be a overwritten function."
},
updateCurrentState: function() {
this.stateManager.updateCurrentState();
this._refitColumns()
},
_refitColumns: function() {
this.getColumnModel().totalWidth = null;
this.getView().fitColumns()
}
});
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueGridPanelStateManager", {
extend: "Object",
constructor: function(a) {
Ext.apply(this, a || {});
this.callParent([a])
},
initState: function() {
this._migradeOldState();
this._updateCurrentState()
},
saveState: function() {
var a, b;
a = this.owner.getState();
b = this._cloneSeparatedState(a);
if (false !== b) {
this._setUserCommonState(b.common);
this._setUserCategoryState(b.category)
}
},
updateCurrentState: function() {
this._updateCurrentState()
},
_getUserSettings: function(a) {
return this.owner.appWin.appInstance.getUserSettings(a)
},
_setUserSettings: function(a, b) {
return this.owner.appWin.appInstance.setUserSettings(a, b)
},
_getUserCommonState: function() {
var a = this.owner.owner.getGridCommonStateKey();
return this._getUserSettings(a)
},
_setUserCommonState: function(b) {
var a = this.owner.owner.getGridCommonStateKey();
return this._setUserSettings(a, b)
},
_getUserCategoryState: function() {
var a = this.owner.gridCategoryStateKey;
return this._getUserSettings(a)
},
_setUserCategoryState: function(b) {
var a = this.owner.gridCategoryStateKey;
return this._setUserSettings(a, b)
},
_checkStateValue: function(a) {
return SYNO.SDS.DownloadStation.Utils.checkStateValue(a, this.owner.colModel)
},
_migradeOldState: function() {
var a, b;
a = this._getUserSettings("dlmqueuegridstates");
if (Ext.isEmpty(a)) {
return
}
this._setUserSettings("dlmqueuegridstates", undefined);
b = this._cloneSeparatedState(a);
if (false !== b) {
this._setUserCommonState(b.common);
this._setUserCategoryState(b.category)
}
},
_updateCurrentState: function() {
var c, a, b;
c = this._getUserCommonState();
if (Ext.isEmpty(c)) {
c = this.owner.getState()
}
a = this._getUserCategoryState();
if (Ext.isEmpty(a)) {
a = {
hiddenColumns: this.owner.getDefaultHiddenColumns()
}
}
b = this._cloneAndMergeStates(c, a);
if (false === b) {
return
}
this._applyState(b)
},
_cloneAndMergeStates: function(d, b) {
var c;
var a = this._checkStateValue(d);
if (false === a) {
return false
}
if (Ext.isDefined(b.sort)) {
a.sort = {
field: b.sort.field,
direction: b.sort.direction
}
} else {
a.sort = {
field: this.owner.self.COLUMN_ID.TASK_ID,
direction: "ASC"
}
}
c = b.hiddenColumns;
if (!Ext.isEmpty(c) && Ext.isArray(c)) {
a.columns.forEach(function(e) {
if (-1 !== c.indexOf(e.id)) {
e.hidden = true
} else {
if (undefined !== e.hidden) {
delete e.hidden
}
}
})
}
return a
},
_applyState: function(a) {
if (a) {
if (this.owner.fireEvent("beforestaterestore", this.owner, a) !== false) {
this.owner.applyState(Ext.apply({}, a));
this.owner.fireEvent("staterestore", this.owner, a)
}
}
},
_cloneSeparatedState: function(c) {
var a = {
hiddenColumns: []
};
var b = this._checkStateValue(c);
if (false === b) {
return false
}
if (Ext.isDefined(b.sort)) {
a.sort = b.sort;
delete b.sort
}
b.columns.forEach(function(d) {
if (undefined !== d.hidden) {
if (true === d.hidden) {
a.hiddenColumns.push(d.id)
}
delete d.hidden
}
});
return {
common: b,
category: a
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueBasic", {
extend: "SYNO.SDS.DownloadStation.RightPanel",
ADDTASK_MAXLIMIT: 50,
ADDTASK_MAXSIZE: 104857600,
NUM_REC_PER_PAGE: 25,
GRID_STATE_CATEGORY_ID: "default",
constructor: function(a) {
this.callParent(arguments)
},
createPanel: function() {
var a = this.cp;
if (!a.QueuePanel) {
a.QueuePanel = this.callParent(arguments)
}
return a.QueuePanel
},
createActionGroup: function() {
var a = this.cp;
if (!a.QueueActionGroup) {
this.actionGroup = new SYNO.SDS.DownloadStation.DLM.QueueActionGroup({
uicomponents: this.uicomponents,
owner: this.panel.module
});
a.QueueActionGroup = this.actionGroup;
this.grid.mon(this.grid.getSelectionModel(), "rowSelectionChanged", this.actionGroup.updateBtns, this.actionGroup)
}
return a.QueueActionGroup
},
createUpperPanel: function(a) {
this.grid = new SYNO.SDS.DownloadStation.DLM.QueueGridPanel(a);
this.utils.addUIComponents(this, "queueGrid", this.grid);
return this.grid
},
createLowerPanel: function(a) {
Ext.apply(a, {
owner: this
});
this.info = new SYNO.SDS.DownloadStation.DLM.QueueInfoPanel(a);
return this.info
},
onTabDeactivate: function() {
if (this.pollingtask) {
this.pollingtask.stopAll()
}
},
onActivate: function() {
this.upperPanel = this.panel.items.get(0);
this.lowerPanel = this.panel.items.get(1);
this.updateConcreteConfig(this.upperPanel);
this.upperPanel.updateCurrentState();
this.upperPanel.gStart = 0;
this.upperPanel.getStore().reload()
},
onDeactivate: function() {
if (this.pollingtask) {
this.pollingtask.stopAll()
}
},
updateConcreteConfig: function(a) {
a.filterStatus = this.filterStatus;
a.filterInverse = this.filterInverse;
a.gridCategoryStateKey = this.getGridCategoryStateKey();
a.getDefaultHiddenColumns = this.getDefaultHiddenColumns
},
getGridCommonStateKey: function() {
return "dlm_queue_grid_state_common"
},
getGridCategoryStateKey: function() {
return "dlm_queue_grid_state_" + this.GRID_STATE_CATEGORY_ID
},
getDefaultHiddenColumns: function() {
var a = SYNO.SDS.DownloadStation.DLM.QueueGridPanel.COLUMN_ID;
return [a.TOTAL_UPLOAD, a.TIMELEFT, a.STARTED_TIME, a.COMPLETED_TIME, a.WAITING_SECONDS, a.USERNAME]
}
});
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueAll", {
extend: "SYNO.SDS.DownloadStation.DLM.QueueBasic",
filterStatus: undefined,
filterInverse: undefined
});
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueDownloading", {
extend: "SYNO.SDS.DownloadStation.DLM.QueueBasic",
filterStatus: [SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_DOWNLOADING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_HASH_CHECKING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_FINISHING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_DOWNLOADED, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_POSTPROCESSING],
filterInverse: false,
GRID_STATE_CATEGORY_ID: "downloading",
getDefaultHiddenColumns: function() {
var a = SYNO.SDS.DownloadStation.DLM.QueueGridPanel.COLUMN_ID;
return [a.TOTAL_UPLOAD, a.UPLOAD_RATE, a.COMPLETED_TIME, a.WAITING_SECONDS, a.USERNAME]
}
});
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueFinished", {
extend: "SYNO.SDS.DownloadStation.DLM.QueueBasic",
filterStatus: [SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_PRE_SEEDING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_SEEDING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_FINISHED],
filterInverse: false,
GRID_STATE_CATEGORY_ID: "finished",
getDefaultHiddenColumns: function() {
var a = SYNO.SDS.DownloadStation.DLM.QueueGridPanel.COLUMN_ID;
return [a.CURRENT_SIZE, a.PROGRESS, a.CURRENT_RATE, a.TIMELEFT, a.STARTED_TIME, a.WAITING_SECONDS, a.USERNAME]
}
});
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueActive", {
extend: "SYNO.SDS.DownloadStation.DLM.QueueBasic",
filterStatus: [SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_DOWNLOADING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_HASH_CHECKING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_PRE_SEEDING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_SEEDING],
filterInverse: false,
GRID_STATE_CATEGORY_ID: "active",
getDefaultHiddenColumns: function() {
var a = SYNO.SDS.DownloadStation.DLM.QueueGridPanel.COLUMN_ID;
return [a.COMPLETED_TIME, a.WAITING_SECONDS, a.USERNAME]
}
});
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueInactive", {
extend: "SYNO.SDS.DownloadStation.DLM.QueueBasic",
filterStatus: [SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_DOWNLOADING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_HASH_CHECKING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_PRE_SEEDING, SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_SEEDING],
filterInverse: true,
GRID_STATE_CATEGORY_ID: "inactive",
getDefaultHiddenColumns: function() {
var a = SYNO.SDS.DownloadStation.DLM.QueueGridPanel.COLUMN_ID;
return [a.TOTAL_UPLOAD, a.UPLOAD_RATE, a.CURRENT_RATE, a.TIMELEFT, a.STARTED_TIME, a.COMPLETED_TIME, a.USERNAME]
}
});
Ext.define("SYNO.SDS.DownloadStation.DLM.QueueStopped", {
extend: "SYNO.SDS.DownloadStation.DLM.QueueBasic",
filterStatus: [SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_PAUSED],
filterInverse: false,
GRID_STATE_CATEGORY_ID: "paused",
getDefaultHiddenColumns: function() {
var a = SYNO.SDS.DownloadStation.DLM.QueueGridPanel.COLUMN_ID;
return [a.TOTAL_UPLOAD, a.UPLOAD_RATE, a.CURRENT_RATE, a.TIMELEFT, a.STATUS, a.STARTED_TIME, a.COMPLETED_TIME, a.WAITING_SECONDS, a.USERNAME]
}
});
Ext.ns("SYNO.SDS.DownloadStation");
Ext.define("SYNO.SDS.DownloadStation.SearchGridPanel", {
extend: "SYNO.ux.GridPanel",
constructor: function(a) {
Ext.applyIf(this, a.uicomponents || {});
this.callParent(arguments)
},
getSelectedRows: function() {
var n = this.getView().getRows();
var g = Ext.getBody().createChild({
tag: "div",
cls: "download_dup_row",
style: "z-index: 99999; position:absolute"
});
var j = this.getColumnModel();
var h = [];
var a = this.getView();
var f = true;
if (Ext.isEmpty(j)) {
return null
}
Ext.each(j.columns, function(i) {
h.push("x-grid3-col-" + i.id)
});
for (var e = 0; e < n.length; ++e) {
var m = n.item(e);
if (!Ext.fly(m).hasClass(a.selectedRowClass)) {
continue
}
if (f) {
g.setLeft(Ext.fly(m).getLeft());
g.setTop(Ext.fly(m).getTop())
}
var l = [];
var k, d, c;
for (k = 0; k < h.length; k++) {
d = Ext.fly(m).child("div[class=x-grid3-cell-inner " + h[k] + " x-unselectable]");
c = d.getWidth();
l.push(c)
}
var b = Ext.fly(m.cloneNode(true));
b.removeClass(a.selectedRowClass);
b.removeClass("x-grid3-row-over");
g.appendChild(b.dom);
for (k = 0; k < h.length; k++) {
d = b.child("div[class=x-grid3-cell-inner " + h[k] + " x-unselectable]");
c = l[k];
if (d && c > 0) {
d.setWidth(c)
}
}
f = false
}
if (true === f) {
return null
}
return g
},
animateRows: function() {
var d = this.getSelectedRows();
if (!d) {
return
}
var b = this.moduleList;
var a = {
x: d.getLeft(),
y: d.getTop()
};
var c = {
x: b.getEl().getLeft(),
y: b.getEl().getTop()
};
var e = [{
toPos: {
x: a.x,
y: a.y - 13
},
toScale: 1,
duration: 0.65,
opacity: 1,
origin: "50% 50%"
}, {
toPos: {
x: c.x,
y: c.y + 20
},
toScale: 0.2,
duration: 0.55,
opacity: 0.8,
origin: "0% 0%"
}, {
toPos: {
x: c.x,
y: c.y + 20
},
toScale: 0,
duration: 0.3,
opacity: 0,
origin: "0% 0%"
}];
var f = "-webkit-transform-origin: {5}; -moz-transform-origin: {5}; -o-transform-origin: {5}; ";
f += "-webkit-transition-property: left top -webkit-transform opacity;";
f += "-moz-transition-property: left top -moz-transform opacity;";
f += "-o-transition-property: left top -o-transform opacity;";
f += "z-index: 99999; position: absolute; left: {0}px; top: {1}px; opacity: {4};";
f += "-webkit-transform: scale({2}); -moz-transform: scale({2}); -o-transform: scale({2}); -ms-transform: scale({2});";
f += "-webkit-transition-duration: {3}; -moz-transition-duration: {3}; -o-transition-duration: {3}; -ms-transition-duration: {3};";
d.dom.style.cssText = String.format(f, a.x, a.y, 1, "0s", 1, "50% 50%");
d.frameIdx = 0;
d.animTo = function(h) {
if (!h) {
return
}
if (Ext.isIE) {
if (h.toScale != 1) {
d.animScale(h.duration * 1000, h.toScale)
}
this.shift({
x: h.toPos.x,
y: h.toPos.y,
easing: "easeOut",
duration: h.duration,
opacity: h.opacity,
scope: this,
callback: this.endTransition
})
} else {
var g = String.format(f, h.toPos.x, h.toPos.y, h.toScale, h.duration + "s", h.opacity, h.origin);
this.dom.style.cssText = g;
this.endTransition.defer(h.duration * 1000)
}
}
.createDelegate(d);
d.endTransition = function(g) {
if (d.frameIdx++ >= e.length - 1) {
try {
document.body.removeChild(d.dom)
} catch (h) {}
return
}
d.animTo(e[d.frameIdx])
}
;
if (Ext.isIE) {
d.animScale = function(h, g, i) {
if (this.timer) {
window.clearInterval(this.timer)
}
this.framerate = 25;
this.from = this.currentScale ? this.currentScale : 1;
this.to = g;
this.currentScale = g;
this.from_to = this.to - this.from;
this.duration = h;
this.frameCount = 0;
this.endFrame = Math.ceil(this.duration / 1000 * this.framerate);
this.stepperframe = this.from_to / this.endFrame;
this.currentVal = this.from;
this.interval = 1 / this.framerate;
this._tick = function() {
var j = String.format("progid:DXImageTransform.Microsoft.Matrix(M11={0}, M12=0, M21=0, M22={0}, SizingMethod='auto expand')", (this.currentVal += this.stepperframe));
this.setStyle("-ms-filter", j);
this.setStyle("filter", j);
if (this.frameCount++ > this.endFrame) {
window.clearInterval(this.timer);
if (i) {
i()
}
}
}
.createDelegate(this);
this.timer = window.setInterval(this._tick, this.interval * 1000)
}
.createDelegate(d)
}
d.animTo(e[0])
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.SearchGridPanel", {
extend: "SYNO.SDS.DownloadStation.SearchGridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
this.keyword = a.keyword;
this.maxRequestTimes = 120;
this.itemsPerPage = a.owner.itemsPerPage;
this.callParent([this.fillConfig(a)])
},
fillConfig: function(a) {
this.webapiCompound = {
api: "SYNO.Entry.Request",
method: "request",
version: 1
};
this.webapiStart = {
api: "SYNO.DownloadStation2.BTSearch",
method: "start",
version: 1
};
this.webapiStop = {
api: "SYNO.DownloadStation2.BTSearch",
method: "stop",
version: 1
};
this.webapiList = {
api: "SYNO.DownloadStation2.BTSearch",
method: "list",
version: 1
};
this.webapiListCategory = {
api: "SYNO.DownloadStation2.BTSearch",
method: "list_category",
version: 1
};
this.store = this.createStore();
var b = {
title: Ext.util.Format.htmlEncode(this.keyword),
tabTip: Ext.util.Format.htmlEncode(this.keyword),
store: this.store,
colModel: this.createColModel(),
bbar: this.createBottombar(),
selModel: new Ext.grid.RowSelectionModel({
singleSelect: false
}),
viewConfig: {
trackResetOnLoad: false
},
closable: true,
loadMask: true,
stripeRows: true,
border: false,
enableColumnMove: true,
stateful: true,
stateEvents: ["columnmove", "columnresize", "sortchange"],
initState: (function() {
var d = this.appWin.appInstance.getUserSettings("dlmsearchgridstates");
var c = SYNO.SDS.DownloadStation.Utils.checkStateValue(d, this.colModel);
if (c) {
if (this.fireEvent("beforestaterestore", this, c) !== false) {
this.applyState(Ext.apply({}, c));
this.fireEvent("staterestore", this, c)
}
}
}
).createDelegate(this),
saveState: (function() {
var c = this.getState();
this.appWin.appInstance.setUserSettings("dlmsearchgridstates", c)
}
).createDelegate(this),
listeners: {
scope: this,
afterlayout: {
single: true,
fn: function() {
this.gridCtxMenu = this.createCtxMenu();
this.addManagedComponent(this.gridCtxMenu);
this.sendSearchRequest()
}
},
beforeclose: this.onBeforeClose,
celldblclick: {
scope: this.owner,
fn: this.owner.beforeDownloadSelected
},
rowcontextmenu: function(c, h, d) {
d.preventDefault();
var f = c.getSelectionModel();
if (!f.isSelected(h)) {
f.selectRow(h)
}
if (f.getCount() > 1) {
this.gridCtxMenu.getComponent("mitem_extlink").disable()
} else {
this.gridCtxMenu.getComponent("mitem_extlink").enable()
}
this.gridCtxMenu.showAt(d.getXY())
},
activate: function(i) {
if ("" === this.keyword) {
return
}
var h = i.getGridEl();
var d = this.owner.actionGroup.get("filter");
var f = this.owner.actionGroup.get("search_category");
var c = this.categories || [];
var g = this.categoryVal || "_allcat_";
if (h.isMasked()) {
h.child(".ext-el-mask-msg").center(h)
}
d.store = this.getStore();
if (this.filterWord) {
d.setValue(this.filterWord);
d.trigger.show()
}
this.loadCategoryStore(c);
f.setValue(g);
f.mon(f, "select", this.onCategoreySelect, this)
},
deactivate: function(e) {
if ("" === this.keyword) {
return
}
var c = this.owner.actionGroup.get("filter");
var d = this.owner.actionGroup.get("search_category");
this.filterWord = c.getValue();
c.reset();
this.categoryVal = d.getValue();
d.mun(d, "select", this.onCategoreySelect, this);
d.getStore().loadData([["_allcat_", _DT("download", "download_allcategory")]], false);
d.setValue("_allcat_")
}
}
};
return Ext.apply(b, a)
},
createCtxMenu: function() {
var a = [];
var c = [{
itemId: "downloadnow",
text: _DT("download", "download_now"),
style: "",
iconCls: ""
}, {
itemId: "downloadto",
text: _DT("download", "download_to"),
iconCls: ""
}];
for (var b = 0; b < c.length; b++) {
var d = this.owner.actionGroup.get(c[b].itemId).initialConfig;
a.push(Ext.apply(d, c[b]))
}
a.push({
text: _DT("download", "open_extenallink"),
handler: this.openTorrentLink,
itemId: "mitem_extlink",
scope: this
});
var e = new SYNO.ux.Menu({
cls: "syno-dlm-menu",
items: a,
listeners: {
scope: this,
beforeshow: function(g) {
var f = this.owner.updateBtnStatus();
g.get("downloadnow").setDisabled(!f.blAdd);
g.get("downloadto").setDisabled(!f.blAdd)
}
}
});
return e
},
openTorrentLink: function() {
var a = this.getSelectionModel().getSelected();
if (a) {
window.open(a.get("page"))
}
},
createBottombar: function() {
this.txtSearching = new Ext.Toolbar.TextItem("");
var a = new SYNO.ux.PagingToolbar({
store: this.store,
displayInfo: true,
pageSize: this.itemsPerPage,
refreshText: _DT("download", "download_btn_refresh"),
items: this.txtSearching,
autoDestroy: true
});
return a
},
createColModel: function() {
var a = new Ext.grid.ColumnModel({
columns: [{
id: "title",
header: _DT("download", "download_list_filename"),
dataIndex: "title",
width: 260,
renderer: SYNO.SDS.DownloadStation.DLM.Util.nameRender.createDelegate(this)
}, {
id: "size",
header: _DT("download", "download_list_filesize"),
dataIndex: "size",
width: 105,
renderer: SYNO.SDS.DownloadStation.Renderers.SizeRenderer
}, {
id: "date",
header: _T("time", "time_time"),
dataIndex: "date",
width: 155,
renderer: function(g, e, b, d, f, c) {
return SYNO.SDS.DateTimeFormatter(new Date(g), {
type: "date"
})
}
}, {
id: "seeds",
header: _DT("download", "seeds"),
dataIndex: "seeds",
width: 85,
renderer: function(c) {
var b = Ext.util.Format.htmlEncode(c);
return ((c < 0) ? _DT("download", "download_status_unknown") : b)
}
}, {
id: "peers",
width: 85,
header: _DT("download", "download_list_peer"),
dataIndex: "peers",
renderer: function(c) {
var b = Ext.util.Format.htmlEncode(c);
return ((c < 0) ? _DT("download", "download_status_unknown") : b)
}
}, {
id: "provider",
header: _DT("download", "download_search_provider"),
dataIndex: "provider",
hidden: true,
width: 120
}],
defaults: {
sortable: true,
menuDisabled: false,
align: "left"
}
});
return a
},
createStore: function() {
var a = [{
name: "title"
}, {
name: "size"
}, {
name: "date"
}, {
name: "seeds"
}, {
name: "peers"
}, {
name: "provider"
}, {
name: "dlurl"
}, {
name: "page"
}];
var b = new SYNO.API.JsonStore({
api: this.webapiList.api,
method: this.webapiList.method,
version: this.webapiList.version,
pruneModifiedRecords: true,
appWindow: this,
autoLoad: false,
root: "results",
idProperty: "result_id",
totalProperty: "total",
remoteSort: true,
fields: a,
sortInfo: {
field: "seeds",
direction: "DESC"
},
paramNames: {
start: "offset",
limit: "limit",
sort: "sort_by",
dir: "order"
},
listeners: {
scope: this,
beforeload: this.onBeforeStoreLoad,
load: this.onStoreLoad,
exception: function(d, e, f, c, g) {
this.showErrorMessage(g.code)
}
}
});
this.addManagedComponent(b);
return b
},
getCategoryValue: function() {
var a = this.owner.actionGroup.get("search_category").getValue();
if (!Ext.isEmpty(a) && "_allcat_" !== a) {
return a
}
return undefined
},
getFilterValue: function() {
var a = this.owner.actionGroup.get("filter").getValue();
if (!Ext.isEmpty(a)) {
return a
}
return undefined
},
onBeforeStoreLoad: function(a, b) {
if ("" === this.title) {
return false
}
this.pollingtask.stopById(this.searchTaskID);
if (Ext.isDefined(this.gridStartPosition)) {
this.gridStartPosition = b.params.start
} else {
this.gridStartPosition = 0
}
b.params.id = this.searchTaskID;
var d = this.getCategoryValue();
if (Ext.isDefined(d)) {
b.params.categories = [d]
} else {
delete b.params.categories
}
var c = this.getFilterValue();
if (Ext.isDefined(c)) {
b.params.keyword = c
} else {
delete b.params.keyword
}
},
onStoreLoad: function() {
this.updateGridElMaskByRecords();
this.pollingtask.startById(this.searchTaskID, false)
},
updateGridElMaskByRecords: function() {
if (this.isDestroyed || this.stillRunning) {
return
}
if (0 === this.getStore().getCount()) {
this.getGridEl().mask(_DT("search", "no_match_search_item"))
} else {
this.getGridEl().unmask()
}
},
onBeforeClose: function(a) {
a.fireEvent("deactivate", a);
this.stopSearch(true);
this.onCloseHandler()
},
onCloseHandler: function() {
if (this.searchTaskID) {
this.cleanResult()
}
},
getDisabledPlugins: function() {
var a = this.appWin.appInstance.getUserSettings("btsearchplugins") || [];
var c = [];
for (var b = 0; b < a.length; b++) {
if (a[b].enable === false) {
c.push(a[b].name)
}
}
return c
},
sendSearchRequest: function() {
if (!this.keyword || "" === this.keyword) {
return
}
if (this.searchTaskID) {
this.pollingtask.removeById(this.searchTaskID);
this.pollingtask.removeById("btsearchingtext" + this.searchTaskID)
}
var b = {
action: "search",
keyword: this.keyword
};
var a = this.getDisabledPlugins();
if (!Ext.isEmpty(a)) {
Ext.apply(b, {
plugins: a,
plugin_inverse: true
})
}
if (this.getGridEl().isMasked()) {
this.getGridEl().unmask()
}
if (!this.getEl().isMasked()) {
this.getEl().mask(_DT("search", "title_searching"), "x-mask-loading")
}
this.txtSearching.getEl().update(_DT("common", "searching"));
SYNO.API.Request({
webapi: Ext.apply(this.webapiStart, {
params: b
}),
callback: function(f, d, e, c) {
if (!f) {
this.showErrorMessage(d.code);
if (!this.txtSearching.isDestroyed) {
this.txtSearching.getEl().update("")
}
return
}
this.searchTaskID = d.id;
if (this.isDestroyed) {
this.stopSearch(true);
this.cleanResult()
} else {
this.startSearch()
}
},
scope: this
})
},
stopSearch: function(a) {
if (this.searchTaskID) {
this.pollingtask.removeById(this.searchTaskID);
this.pollingtask.removeById("btsearchingtext" + this.searchTaskID)
}
if (this.getEl().isMasked()) {
this.getEl().unmask()
}
this.stillRunning = false;
this.updateGridElMaskByRecords();
if (!this.txtSearching.isDestroyed) {
this.txtSearching.getEl().update("")
}
},
startSearch: function(b) {
this.stillRunning = true;
this.requestTimes = 0;
var c = {
id: this.searchTaskID
};
var a = {
stopwhenerror: false,
params: [Ext.apply(this.webapiList, {
params: c
}), Ext.apply(this.webapiListCategory, {
params: c
})]
};
this.pollingtask.add([{
id: this.searchTaskID,
interval: 5000,
webapi: Ext.apply(this.webapiCompound, {
compound: a
}),
single: false,
autoJsonDecode: true,
beforestart: this.beforeSearchPolling,
callback: this.updateBySearchPolling,
scope: this
}, {
id: "btsearchingtext" + this.searchTaskID,
interval: 1000,
scope: this,
run: function() {
if (this.txtSearching.isDestroyed) {
return
}
var e = this.txtSearching.getEl();
var f = _DT("search", "title_searching")
, d = e.dom.innerHTML.replace(f, "").indexOf("&nbsp;")
, h = this.utils.fillArray("&nbsp;", 3);
for (var g = 0; g <= d; g++) {
h[g] = "."
}
e.update(f + h.join(""))
}
}]);
this.pollingtask.getTaskById(this.searchTaskID).interval = 2000;
this.pollingtask.startById(this.searchTaskID, false);
this.pollingtask.startById("btsearchingtext" + this.searchTaskID)
},
beforeSearchPolling: function(a) {
if (this.isDestroyed || !this.searchTaskID) {
return false
}
var e = {
sort_by: this.store.sortInfo.field,
order: this.store.sortInfo.direction,
offset: Ext.isDefined(this.gridStartPosition) ? this.gridStartPosition : 0,
limit: this.itemsPerPage,
id: this.searchTaskID
};
var d = this.getCategoryValue();
if (Ext.isDefined(d)) {
Ext.apply(e, {
categories: [d]
})
}
var c = this.getFilterValue();
if (!Ext.isEmpty(c)) {
Ext.apply(e, {
keyword: c
})
}
for (var b = 0; b < a.taskCfg.webapi.compound.params.length; b++) {
var f = a.taskCfg.webapi.compound.params[b];
if (this.webapiList.api === f.api && this.webapiList.method === f.method) {
f.params = e
}
}
},
updateBySearchPolling: function(g, e, f, c) {
if (this.isDestroyed || !this.searchTaskID) {
return false
}
var a;
var b;
if (e.has_fail) {
var d;
Ext.iterate(e.result, function(i, h) {
if (!i.success && Ext.isDefined(i.error.code)) {
d = i.error.code
}
}, this);
this.stopSearch();
this.showErrorMessage(d);
return
}
Ext.iterate(e.result, function(i, h) {
if (this.webapiList.api === i.api && this.webapiList.method == i.method) {
a = i
} else {
if (this.webapiListCategory.api === i.api && this.webapiListCategory.method == i.method) {
b = i
}
}
}, this);
if (g) {
this.updateByResponse(a, b);
this.updateGridElMaskByRecords()
}
this.requestTimes = this.requestTimes ? (this.requestTimes + 1) : 1;
if (false === a.data.is_running || this.requestTimes >= this.maxRequestTimes) {
this.stopSearch()
}
},
updateByResponse: function(a, b) {
if (!Ext.isEmpty(b.data.categories)) {
this.loadCategoryStore(b.data.categories)
}
if (a.data.total > 0 && this.getEl().isMasked()) {
this.getEl().unmask()
}
if (this.store.getTotalCount() != a.data.total) {
this.updateGrid(a.data)
}
},
updateGrid: function(a) {
this.store.loadData(a, false);
this.ensureLastSelectionVisible()
},
ensureLastSelectionVisible: function() {
var a, b, c;
a = this.getSelectionModel().getSelections();
if (Ext.isEmpty(a)) {
return
}
b = a[a.length - 1];
c = this.store.indexOf(b);
this.getView().ensureVisible(c)
},
loadCategoryStore: function(b) {
var d = this.owner.actionGroup.get("search_category");
var a = [["_allcat_", _DT("download", "download_allcategory")]];
for (var c = 0; c < b.length; c++) {
a.push([b[c], b[c]])
}
this.categories = b;
d.getStore().loadData(a, false)
},
cleanResult: function() {
SYNO.API.Request({
webapi: Ext.apply(this.webapiStop, {
params: {
id: this.searchTaskID
}
}),
callback: function(d, b, c, a) {
if (!d) {
SYNO.Debug("Failed to stop task " + b.code);
return
}
},
scope: this
})
},
onCategoreySelect: function() {
var a = {
start: 0,
limit: this.itemsPerPage
};
this.store.load({
params: a
})
},
showErrorMessage: function(a) {
if (this.getEl().isMasked()) {
this.getEl().unmask()
}
this.getGridEl().mask(SYNO.SDS.DownloadStation.Utils.getErrorString(a))
}
});
Ext.ns("SYNO.SDS.DownloadStation");
Ext.define("SYNO.SDS.DownloadStation.SearchTabPanel", {
extend: "SYNO.ux.TabPanel",
createScrollers: function() {
this.callParent(arguments);
this.scrollLeft.insertFirst({
cls: "x-tab-strip x-tab-strip-top"
});
this.scrollRight.insertFirst({
cls: "x-tab-strip x-tab-strip-top"
})
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.Search", {
extend: "SYNO.SDS.DownloadStation.RightPanel",
MAXTABCOUNT: 5,
constructor: function(a) {
this.itemsPerPage = 50;
this.callParent(arguments);
this.webapiAddTask = {
api: "SYNO.DownloadStation2.Task",
method: "create",
version: 2
}
},
createPanel: function() {
this.tabPanel = new SYNO.SDS.DownloadStation.SearchTabPanel({
enableTabScroll: true,
items: [],
cls: "syno-dl-searchpanel",
listeners: {
scope: this,
add: this.updateHeaderVisible,
remove: this.updateHeaderVisible
}
});
return new SYNO.ux.Panel({
tbar: this.fillToolbarConfig(),
layout: "fit",
items: [this.tabPanel]
})
},
onActivate: function() {
this.updateHeaderVisible()
},
createActionGroup: function() {
var a = [];
a.push(new Ext.Button({
tooltip: _DT("download", "download_now"),
disabled: true,
iconCls: "syno-dl-a_bt_download",
itemId: "downloadnow",
handler: this.beforeDownloadSelected,
scope: this
}), new Ext.Button({
tooltip: _DT("download", "download_to"),
disabled: true,
iconCls: "syno-dl-a_bt_download_to",
itemId: "downloadto",
handler: this.downloadSelectedTo,
scope: this
}), "->", new SYNO.ux.ComboBox({
ctCls: "syno-dl-search-category",
itemId: "search_category",
store: new Ext.data.ArrayStore({
autoDestroy: true,
idIndex: 0,
fields: ["value", "display"],
data: [["_allcat_", _DT("download", "download_allcategory")]]
}),
tplHtmlEncode: true,
displayField: "display",
valueField: "value",
editable: false,
triggerAction: "all",
value: "_allcat_",
resizable: false,
mode: "local"
}), new SYNO.ux.TextFilter({
cls: "syno-ux-textfilter-text syno-dl-dlm-filter-icon",
itemId: "filter",
emptyText: _DT("common", "filter_label_text"),
store: null
}));
return this.callParent([a, true])
},
beforeDownloadSelected: function() {
if (this.panel.getEl().isMasked()) {
return
}
SYNO.SDS.DownloadStation.DLM.Util.checkLocationDestinationNonEmpty(this, this.downloadSelected, undefined, this)
},
downloadSelected: function(a) {
var d = this.tabPanel.getActiveTab();
var b = d.getSelectionModel().getSelections();
var c = [];
var e = false;
Ext.each(b, function(i) {
var h;
var g = Ext.util.Format.trim(i.get("dlurl"));
if (1 > g.length) {
return true
}
h = SYNO.SDS.DownloadStation.Utils.canonizeURLPrefix(g);
if (h) {
c.push(h)
} else {
e = true
}
}, this);
if (e) {
this.appWin.getMsgBox().alert(this.title, _DT("download", "download_error_bad_urls_found"));
if (0 === c.length) {
return
}
}
if (!Ext.isDefined(a)) {
SYNO.Debug("destination does not exists");
return
}
var f = {
type: "url",
url: c,
destination: a,
create_list: false
};
this.mask(_DT("common", "saving"));
SYNO.API.Request({
webapi: Ext.apply(this.webapiAddTask, {
params: f
}),
callback: function(l, i, k, h) {
this.unmask();
this.tabPanel.getActiveTab().unmask();
if (!l) {
var j = SYNO.SDS.DownloadStation.Utils.getErrorString(i.code);
this.appWin.getMsgBox().alert(this.title, j);
return
}
var g = this.tabPanel.getActiveTab();
g.animateRows.defer(200, g)
},
scope: this
})
},
downloadSelectedTo: function() {
if (this.panel.getEl().isMasked()) {
return
}
var a = function(b) {
var c = this.tabPanel.getActiveTab().getSelectionModel().getSelections();
var e = [];
for (var d = 0; d < c.length; d++) {
e.push(c[d].get("dlurl"))
}
this.mainPanel.launchTaskDialog(1, null, e, true)
};
SYNO.SDS.DownloadStation.DLM.Util.checkLocationDestinationNonEmpty(this, a, undefined, this)
},
createSearchTab: function(a) {
a = Ext.util.Format.trim(a);
for (var c = 0; c < this.tabPanel.items.items.length; c++) {
if (a && a === this.tabPanel.items.get(c).title) {
this.tabPanel.setActiveTab(c);
return
}
}
if (this.tabPanel.items.items.length >= this.MAXTABCOUNT) {
this.appWin.getMsgBox().alert("", String.format(_DT("search", "search_tab_reach_limit"), this.MAXTABCOUNT));
return
}
var b = {
uicomponents: this.uicomponents,
owner: this,
keyword: a,
cls: !a ? "syno-dl-no-padding-grid" : ""
};
var d = new SYNO.SDS.DownloadStation.DLM.SearchGridPanel(b);
this.tabPanel.add(d);
this.tabPanel.setActiveTab(d);
this.mon(this.tabPanel.getActiveTab().getSelectionModel(), "selectionchange", this.updateBtns, this)
},
updateHeaderVisible: function() {
var a = true;
var c = this.tabPanel.items.items.length;
if (0 === c) {
a = false;
this.createSearchTab("")
} else {
if (1 === c) {
a = ("" === this.tabPanel.items.items[0].title) ? false : true
} else {
this.tabPanel.items.each(function(d) {
if ("" === d.title) {
this.tabPanel.remove(d)
}
}, this)
}
}
this.tabPanel.header.setVisibilityMode(Ext.Element.DISPLAY).setVisible(a);
var b = Math.max(0, this.tabPanel.lastSize.height - this.tabPanel.getFrameHeight());
this.tabPanel.body.setHeight(b);
this.tabPanel.doLayout()
},
getDisabledPlugins: function() {
var a = this.owner.appInstance.getUserSettings("btsearchplugins") || [];
var c = [];
for (var b = 0; b < a.length; b++) {
if (a[b].enable === false) {
c.push(a[b].name)
}
}
return c.join(",")
},
updateBtnStatus: function() {
var a = this.tabPanel.getActiveTab().getSelectionModel().hasSelection() && !this.tabPanel.getActiveTab().getEl().isMasked() && !this.panel.getEl().isMasked();
return {
blAdd: a
}
},
updateBtns: function() {
this.actionGroup.setEnableBtns(["downloadnow", "downloadto"], this.updateBtnStatus().blAdd)
},
mask: function() {
this.panel.getEl().mask.apply(this.panel.getEl(), arguments);
this.updateBtns()
},
unmask: function() {
if (this.panel.getEl().isMasked()) {
this.panel.getEl().unmask()
}
this.updateBtns()
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.RSSGridPanel", {
extend: "SYNO.ux.GridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, a || {});
this.itemsPerPage = 50;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.api = "SYNO.DownloadStation2.RSS.Feed";
this.store = this.createStore();
var b = {
store: this.store,
colModel: this.createColModel(),
bbar: this.createBottombar(),
view: this.createGridView(),
selModel: this.createSelectionModel(),
loadMask: true,
stripeRows: true,
border: false,
enableColumnMove: true,
stateful: true,
enableHdMenu: false,
stateEvents: ["columnmove", "columnresize", "sortchange"],
height: 500,
layout: "fit",
initState: (function() {
var d = this.appWin.appInstance.getUserSettings("dlmrssgridstates");
var c = SYNO.SDS.DownloadStation.Utils.checkStateValue(d, this.colModel);
if (c) {
if (this.fireEvent("beforestaterestore", this, c) !== false) {
this.applyState(Ext.apply({}, c));
this.fireEvent("staterestore", this, c)
}
}
}
).createDelegate(this),
saveState: (function() {
var c = this.getState();
this.appWin.appInstance.setUserSettings("dlmrssgridstates", c)
}
).createDelegate(this),
scope: this,
listeners: {
scope: this,
afterrender: {
scope: this,
fn: this.onAfterRender,
single: true
},
rowcontextmenu: function(c, g, d) {
d.preventDefault();
var f = c.getSelectionModel();
if (!f.isSelected(g)) {
f.selectRow(g)
}
this.gridCtxMenu.showAt(d.getXY())
}
}
};
return Ext.apply(b, a)
},
onAfterRender: function() {
this.gridCtxMenu = this.createCtxMenu();
this.addManagedComponent(this.gridCtxMenu)
},
createCtxMenu: function() {
var h = new SYNO.ux.Menu();
var f = this.owner.actionGroup.list;
var b = ["edit", "remove", "update"];
for (var g = 0; g < f.length; g++) {
if (-1 !== b.indexOf(f[g].initialConfig.itemId)) {
var e = f[g].initialConfig;
e.text = e.tooltip;
e.iconCls = "";
h.addMenuItem(e)
}
}
var d = h.items.get("edit");
var c = h.items.get("remove");
var a = h.items.get("update");
this.owner.setMonDisabled(d, c, a);
return h
},
createStore: function() {
return new SYNO.API.JsonStore({
api: this.api,
method: "list",
appWindow: this.appWin,
version: 1,
baseParams: {
limit: this.itemsPerPage
},
autoLoad: false,
root: "items",
fields: ["id", "title", "url", "last_update", "is_updating", "username"],
paramNames: {
start: "offset",
limit: "limit"
},
listeners: {
scope: this,
beforeload: this.onBeforeStoreLoad,
load: this.onStoreLoad
}
})
},
onBeforeStoreLoad: function(a, b) {
if ("undefined" != typeof (b.params.offset)) {
this.gridStartPosition = b.params.offset
} else {
this.gridStartPosition = 0
}
this.pollingtask.stopById("RSSGrid")
},
onStoreLoad: function(c, a, d) {
if (this.store.getTotalCount() <= this.gridStartPosition && this.gridStartPosition > 0) {
var f = Math.ceil((this.store.getTotalCount() - this.itemsPerPage) / this.itemsPerPage);
this.store.load({
params: {
offset: (f * this.itemsPerPage),
limit: this.itemsPerPage
}
});
return
}
var b = this.store.data.items;
var e;
for (e = 0; e < b.length; e++) {
if (b[e].json.is_updating) {
break
}
}
if (e === b.length) {
this.pollingtask.stopById("RSSGrid")
} else {
this.pollingtask.startById("RSSGrid", false)
}
},
createColModel: function() {
var a = new Ext.grid.ColumnModel({
columns: [{
header: _T("common", "name"),
id: "title",
width: 135,
dataIndex: "title"
}, {
id: "url",
header: _DT("download", "download_list_url"),
width: 220,
dataIndex: "url"
}, {
id: "last_update",
header: _DT("download", "rss_last_update"),
width: 160,
dataIndex: "last_update",
renderer: function(f, e, b, g, d, c) {
if (b.get("is_updating")) {
return _DT("download", "updating")
} else {
return Ext.util.Format.htmlEncode(SYNO.SDS.DateTimeFormatter(new Date(f * 1000)))
}
}
}, {
id: "username",
header: _DT("download", "download_list_username"),
width: 100,
hidden: !_S("is_admin"),
dataIndex: "username"
}]
});
return a
},
createBottombar: function() {
var a = new SYNO.ux.PagingToolbar({
store: this.store,
displayInfo: true,
pageSize: this.itemsPerPage,
refreshText: _DT("download", "download_btn_refresh")
});
return a
},
createGridView: function() {
return new SYNO.ux.FleXcroll.grid.GridView()
},
createSelectionModel: function() {
var a = new Ext.grid.RowSelectionModel({
singleSelect: false,
listeners: {
selectionchange: {
scope: this,
fn: this.gridSelectionChange
}
}
});
a.addEvents({
rowSelectionChanged: true
});
return a
},
gridSelectionChange: function(a) {
if (!this.gridSelectionChangeTask) {
this.gridSelectionChangeTask = new Ext.util.DelayedTask(function(b) {
a.fireEvent("rowSelectionChanged", a)
}
,a)
}
this.gridSelectionChangeTask.delay(300)
},
onBeforeGridPollingStart: function(a) {
a.reqConfig.params = this.getLoadParams()
},
getLoadParams: function() {
var a = {
offset: this.gridStartPosition || 0,
limit: this.itemsPerPage
};
return a
},
onUpdateRecordsTask: function(l, i, e, a) {
var c = false;
var d = false;
var f = false;
if (!l || !this.getStore()) {
return
}
if (this.store.getTotalCount() != i.total || 0 >= i.total) {
c = true
} else {
for (var g = 0; g < i.items.length; g++) {
var k = this.store.getById(i.items[g].id);
var h = this.store.getAt(g);
if (!k || !h || i.items[g].id != h.get("id")) {
c = true;
break
}
d |= ((k.data.is_updating !== i.items[g].is_updating) && (this.getSelectionModel().isSelected(k)));
f |= i.items[g].is_updating;
k.set("title", i.items[g].title);
k.set("url", i.items[g].url);
k.set("last_update", i.items[g].last_update);
k.set("is_updating", i.items[g].is_updating);
k.set("username", i.items[g].username);
k.commit()
}
}
if (c) {
this.store.reload();
return
}
if (d) {
var b = this.getSelectionModel();
b.fireEvent("rowSelectionChanged", b)
}
if (!f) {
this.pollingtask.stopById("RSSGrid")
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.RSSItemList", {
extend: "SYNO.ux.GridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, a || {});
this.itemsPerPage = 50;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.store = this.createStore();
var b = {
store: this.store,
colModel: this.createColModel(),
tbar: this.createTopbar(),
bbar: this.createBottombar(),
view: this.createGridView(),
selModel: this.createSelectionModel(),
loadMask: true,
stripeRows: true,
border: false,
enableColumnMove: true,
enableHdMenu: false,
autoExpandColumn: "title",
listeners: {
scope: this,
afterrender: {
scope: this,
fn: this.onAfterRender,
single: true
},
rowcontextmenu: function(c, g, d) {
d.preventDefault();
var f = c.getSelectionModel();
if (!f.isSelected(g)) {
f.selectRow(g)
}
this.gridCtxMenu.showAt(d.getXY())
},
rowdblclick: {
scope: this,
fn: this.beforeActionDownload
}
}
};
return Ext.apply(b, a)
},
onAfterRender: function() {
this.gridCtxMenu = this.createCtxMenu();
this.addManagedComponent(this.gridCtxMenu)
},
createCtxMenu: function() {
var f = new SYNO.ux.Menu();
var d = this.topToolbar.initialConfig.items;
var a = ["download", "downloadto"];
for (var e = 0; e < d.length; e++) {
if (!d[e].initialConfig) {
continue
}
if (-1 !== a.indexOf(d[e].initialConfig.itemId)) {
var c = d[e].initialConfig;
c.disabled = false;
f.addMenuItem(c)
}
}
f.addMenuItem({
itemId: "external",
text: _DT("download", "open_extenallink"),
scope: this,
handler: this.actionExternalHandler
});
var b = f.get("external");
b.mon(this.getSelectionModel(), "selectionchange", function(g) {
if (1 === g.getCount() && g.getSelected().get("link")) {
b.enable()
} else {
b.disable()
}
}, b);
return f
},
actionExternalHandler: function() {
var a = this.getSelectionModel().getSelections();
if (0 === a.length || !a[0].get("link")) {
return
}
window.open(a[0].get("link"), "_blank")
},
createStore: function() {
return new SYNO.API.JsonStore({
api: "SYNO.DownloadStation2.RSS.Item",
method: "list",
appWindow: this.appWin,
version: 1,
baseParams: {
limit: this.itemsPerPage
},
autoLoad: false,
root: "items",
totalProperty: "total",
fields: ["id", "feed_id", "title", "url", "link", "date", "size", "is_new"],
paramNames: {
start: "offset",
limit: "limit"
},
listeners: {
scope: this,
beforeload: this.onBeforeStoreLoad,
load: this.onStoreLoad
}
})
},
onBeforeStoreLoad: function(a, b) {
var c = this.owner.upperPanel.getSelectionModel().getSelections();
if (1 !== c.length) {
return false
}
b.params.feed_id = c[0].id
},
onStoreLoad: function(b, a, c) {
if (0 < b.getTotalCount()) {
this.btnClear.enable()
} else {
this.btnClear.disable()
}
},
createColModel: function() {
var a = new Ext.grid.ColumnModel({
columns: [{
id: "title",
header: _T("common", "name"),
dataIndex: "title"
}, {
id: "size",
header: _DT("download", "download_list_filesize"),
dataIndex: "size",
width: 100,
renderer: function(c) {
var b = parseInt(c, 10);
return SYNO.SDS.DownloadStation.DLM.Util.sizeRenderer(b)
}
}, {
id: "date",
header: _T("time", "time_time"),
dataIndex: "date",
width: 180,
renderer: function(b) {
return Ext.util.Format.htmlEncode(SYNO.SDS.DateTimeFormatter(new Date(b * 1000)))
}
}]
});
return a
},
createTopbar: function() {
this.btnDownload = new Ext.Action({
itemId: "download",
text: _DT("download", "download_subject"),
disabled: true,
scope: this,
handler: this.beforeActionDownload
});
this.btnDownloadTo = new Ext.Action({
itemId: "downloadto",
text: _DT("download", "download_to"),
disabled: true,
scope: this,
handler: this.beforeActionDownloadTo
});
this.btnClear = new Ext.Action({
itemId: "clear",
text: _DT("common", "clean"),
disabled: true,
scope: this,
handler: this.actionClear
});
this.filter = new SYNO.ux.TextFilter({
itemId: "search",
width: 170,
emptyText: _DT("common", "filter_label_text"),
cls: "syno-ux-textfilter-text syno-dl-dlm-filter-icon",
queryAction: "rss_item_list",
queryParam: "keyword",
enumAction: "rss_item_list",
pageSize: this.itemsPerPage,
store: this.store
});
var a = {
cls: "syno-dl-toolbar",
items: [this.btnDownload, this.btnDownloadTo, this.btnClear, "->", this.filter]
};
return new SYNO.ux.Toolbar(a)
},
beforeActionDownload: function() {
var a = this.getSelectionUrls();
if (!a || 0 === a.length) {
return
}
SYNO.SDS.DownloadStation.DLM.Util.checkLocationDestinationNonEmpty(this, this.actionDownload, undefined, this)
},
actionDownload: function(a) {
var b = {
type: "url",
url: this.getSelectionUrls(),
destination: a,
create_list: false
};
this.owner.setStatusBusy(_DT("common"), "saving");
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task",
method: "create",
params: b,
version: 2,
scope: this,
callback: function(f, d, e, c) {
this.owner.clearStatusBusy();
if (!f) {
this.appWin.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(d.code))
}
}
})
},
getSelectionUrls: function() {
var a = this.getSelectionModel().getSelections();
var b = [];
Ext.each(a, function(e, c, d) {
b.push(e.get("url"))
}, this);
return b
},
beforeActionDownloadTo: function() {
if (0 === this.getSelectionModel().getSelections().length) {
return
}
SYNO.SDS.DownloadStation.DLM.Util.checkLocationDestinationNonEmpty(this, this.actionDownloadTo, undefined, this)
},
actionDownloadTo: function(a) {
var d = this.getSelectionModel().getSelections();
var c = [];
for (var b = 0; b < d.length; b++) {
c.push(d[b].get("url"))
}
this.mainPanel.launchTaskDialog(1, null, c, true)
},
actionClear: function() {
var a = this.owner.upperPanel.getSelectionModel().getSelections();
if (!a || 1 !== a.length) {
return
}
this.filter.reset();
this.owner.setStatusBusy(_DT("common"), "saving");
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.RSS.Item",
method: "clear",
params: {
feed_id: a[0].id
},
version: 1,
scope: this,
callback: function(e, c, d, b) {
this.owner.clearStatusBusy();
if (!e) {
this.appWin.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(c.code))
}
this.store.load()
}
})
},
createBottombar: function() {
var a = new SYNO.ux.PagingToolbar({
store: this.store,
displayInfo: true,
pageSize: this.itemsPerPage,
refreshText: _DT("download", "download_btn_refresh")
});
return a
},
createGridView: function() {
return new SYNO.ux.FleXcroll.grid.GridView()
},
createSelectionModel: function() {
var a = new Ext.grid.RowSelectionModel({
singleSelect: false,
listeners: {
selectionchange: {
scope: this,
fn: this.gridSelectionChange
}
}
});
return a
},
gridSelectionChange: function() {
var a = this.getSelectionModel().getCount();
if (0 === a) {
this.btnDownload.disable();
this.btnDownloadTo.disable()
} else {
this.btnDownload.enable();
this.btnDownloadTo.enable()
}
},
resetGridPanel: function() {
this.btnDownload.disable();
this.btnDownloadTo.disable();
this.btnClear.disable();
this.store.removeAll()
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.RSSFilterList", {
extend: "SYNO.ux.GridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, a || {});
this.itemsPerPage = 50;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.store = this.createStore();
var b = {
store: this.store,
colModel: this.createColModel(),
tbar: this.createTopbar(),
bbar: this.createBottombar(),
view: this.createGridView(),
selModel: this.createSelectionModel(),
loadMask: true,
stripeRows: true,
border: false,
enableColumnMove: true,
autoExpandColumn: "name",
enableHdMenu: false,
listeners: {
scope: this,
afterrender: {
scope: this,
fn: this.onAfterRender,
single: true
},
rowcontextmenu: function(c, g, d) {
d.preventDefault();
var f = c.getSelectionModel();
if (!f.isSelected(g)) {
f.selectRow(g)
}
this.gridCtxMenu.showAt(d.getXY())
},
rowdblclick: {
scope: this,
fn: this.actionEdit
}
}
};
return Ext.apply(b, a)
},
onAfterRender: function() {
this.gridCtxMenu = this.createCtxMenu();
this.addManagedComponent(this.gridCtxMenu)
},
createCtxMenu: function() {
var e = new SYNO.ux.Menu();
var c = this.topToolbar.initialConfig.items;
var a = ["edit", "delete"];
for (var d = 0; d < c.length; d++) {
if (-1 !== a.indexOf(c[d].initialConfig.itemId)) {
var b = c[d].initialConfig;
b.disabled = false;
e.addMenuItem(b)
}
}
return e
},
createStore: function() {
var a = new SYNO.API.JsonStore({
api: "SYNO.DownloadStation2.RSS.Filter",
method: "list",
appWindow: this.appWin,
version: 1,
baseParams: {
limit: this.itemsPerPage,
sort_by: "name"
},
autoLoad: false,
root: "items",
totalProperty: "total",
fields: ["id", "feed_id", "name", "match", "not_match", "destination", "enable", "is_regex"],
paramNames: {
start: "offset",
limit: "limit"
},
listeners: {
scope: this,
beforeload: this.onBeforeStoreLoad,
load: this.onStoreLoad
}
});
return a
},
onBeforeStoreLoad: function(a, b) {
var c = this.owner.upperPanel.getSelectionModel().getSelections();
if (1 !== c.length) {
return false
}
b.params.feed_id = c[0].id;
if ("undefined" != typeof (b.params.offset)) {
this.gridStartPosition = b.params.offset
} else {
this.gridStartPosition = 0
}
},
onStoreLoad: function(b, a, c) {
if (this.store.getTotalCount() <= this.gridStartPosition && this.gridStartPosition > 0) {
var d = Math.ceil((this.store.getTotalCount() - this.itemsPerPage) / this.itemsPerPage);
this.store.load({
params: {
offset: (d * this.itemsPerPage),
limit: this.itemsPerPage
}
});
return
}
this.btnAdd.enable()
},
createColModel: function() {
var a = new Ext.grid.ColumnModel({
columns: [{
id: "name",
header: _T("common", "name"),
dataIndex: "name"
}]
});
return a
},
createTopbar: function() {
this.btnAdd = new Ext.Action({
itemId: "add",
text: _DT("common", "addto"),
disabled: true,
scope: this,
handler: this.actionAdd
});
this.btnEdit = new Ext.Action({
itemId: "edit",
text: _DT("common", "alt_edit"),
disabled: true,
scope: this,
handler: this.actionEdit
});
this.btnDelete = new Ext.Action({
itemId: "delete",
text: _DT("common", "delete"),
disabled: true,
scope: this,
handler: this.actionDelete
});
var a = {
items: [this.btnAdd, this.btnEdit, this.btnDelete]
};
return new SYNO.ux.Toolbar(a)
},
actionAdd: function() {
var c = this.owner.upperPanel.getSelectionModel().getSelections();
if (1 !== c.length || !c[0] || !c[0].id) {
return
}
var a = {
uicomponents: this.uicomponents,
store: this.store,
feedId: c[0].id
};
var b = new SYNO.SDS.DownloadStation.DLM.RSSAddFilterDialog(a);
b.open()
},
actionEdit: function() {
var d = this.owner.upperPanel.getSelectionModel().getSelections();
if (1 !== d.length || !d[0] || !d[0].id) {
return
}
var a = {
uicomponents: this.uicomponents,
store: this.store
};
var b = this.getSelectionModel().getSelections();
if (1 !== b.length || !b[0]) {
return
} else {
a.record = b[0]
}
var c = new SYNO.SDS.DownloadStation.DLM.RSSAddFilterDialog(a);
c.open()
},
actionDelete: function() {
var b = this.getSelectionModel().getSelections();
if (!b || 0 >= b.length) {
return
}
var a = [];
Ext.each(b, function(e, c, d) {
a.push(e.get("id"))
}, this);
this.owner.getMsgBox().confirm(_DT("download", "rss_feeds"), _DT("common", "remove_cfrmrmv"), function(c, d) {
if (c !== "yes") {
return
}
this.owner.setStatusBusy();
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.RSS.Filter",
method: "delete",
params: {
id: a
},
version: 1,
scope: this,
callback: function(h, f, g, e) {
this.owner.clearStatusBusy();
if (!h) {
this.appWin.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(f.code));
return
}
this.getStore().reload()
}
})
}, this)
},
createBottombar: function() {
var a = new SYNO.ux.PagingToolbar({
store: this.store,
displayInfo: true,
pageSize: this.itemsPerPage,
refreshText: _DT("download", "download_btn_refresh")
});
return a
},
createGridView: function() {
return new SYNO.ux.FleXcroll.grid.GridView()
},
createSelectionModel: function() {
var a = new Ext.grid.RowSelectionModel({
singleSelect: false,
listeners: {
selectionchange: {
scope: this,
fn: this.gridSelectionChange
}
}
});
return a
},
gridSelectionChange: function() {
var a = this.getSelectionModel().getCount();
if (0 === a) {
this.btnEdit.disable();
this.btnDelete.disable()
} else {
if (1 === a) {
this.btnEdit.enable();
this.btnDelete.enable()
} else {
this.btnEdit.disable();
this.btnDelete.enable()
}
}
},
resetGridPanel: function() {
this.btnAdd.disable();
this.btnEdit.disable();
this.btnDelete.disable();
this.store.removeAll()
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.RSSAddFilterDialog", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, a || {});
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.formPanel = this.createForm(a);
var b = {
title: (this.record) ? _DT("common", "alt_edit") : _DT("common", "addto"),
owner: this.appWin,
cls: "syno-dl-win",
resizable: false,
width: 540,
height: 315,
layout: "fit",
items: this.formPanel,
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
btnStyle: "blue",
text: _DT("common", "alt_apply"),
scope: this,
handler: this.applyHandler
}, {
xtype: "syno_button",
text: _DT("common", "close"),
scope: this,
handler: this.closeHandler
})
};
return Ext.apply(b, a)
},
createForm: function(a) {
var b = {
trackResetOnLoad: false,
bodyStyle: "padding: 0",
keys: [{
key: [10, 13],
fn: this.applyHandler,
scope: this
}, {
key: 27,
fn: this.closeHandler,
scope: this
}],
items: [{
xtype: "syno_textfield",
itemId: "name",
name: "name",
allowBlank: false,
hideLabel: false,
fieldLabel: _DT("server", "title_server_name")
}, {
xtype: "syno_textfield",
itemId: "match",
name: "match",
hideLabel: false,
fieldLabel: _DT("download", "rss_filter_match")
}, {
xtype: "syno_textfield",
itemId: "not_match",
name: "not_match",
hideLabel: false,
fieldLabel: _DT("download", "rss_filter_not_match")
}, {
xtype: "syno_compositefield",
hideLabel: false,
fieldLabel: _DT("download", "download_list_dest_folder"),
items: [{
xtype: "syno_textfield",
name: "destination",
readOnly: true,
width: 200,
allowBlank: false
}, {
xtype: "syno_button",
text: _T("common", "choose"),
scope: this,
handler: function() {
this.utils.chooseDestHandler({
owner: this,
destinationField: this.formPanel.form.findField("destination")
})
}
}]
}, {
xtype: "syno_checkbox",
itemId: "is_regex",
name: "is_regex",
boxLabel: _DT("download", "rss_parse_regex")
}, {
xtype: "syno_button",
text: _DT("download", "test_filter"),
scope: this,
handler: this.onLaunchTestingTool
}]
};
return new SYNO.ux.FormPanel(b)
},
applyHandler: function() {
if (!this.formPanel.form.isValid()) {
this.getMsgBox().alert(this.title, _T("common", "forminvalid"));
return
}
if (!this.formPanel.form.isDirty()) {
this.close();
return
}
var b = {};
var a;
b.feed_id = this.feedId;
if (this.record) {
a = "set";
b.id = this.record.get("id")
} else {
a = "add";
if (!Ext.isDefined(this.feedId)) {
return
}
b.feed_id = this.feedId
}
Ext.apply(b, this.formPanel.form.getValues());
b.is_regex = this.formPanel.form.findField("is_regex").getValue();
this.setStatusBusy({
text: _T("common", "saving")
});
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.RSS.Filter",
method: a,
params: b,
version: 1,
scope: this,
callback: function(f, d, e, c) {
this.clearStatusBusy();
if (!f) {
this.appWin.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(d.code));
return
}
this.store.reload();
this.close()
}
})
},
closeHandler: function() {
this.close()
},
onLaunchTestingTool: function() {
var a = new SYNO.SDS.DownloadStation.DLM.RSSAddFilterTestingTool({
owner: this,
uicomponents: this.uicomponents
});
a.open()
},
onShow: function() {
this.formPanel.form.trackResetOnLoad = true;
if (this.record) {
this.formPanel.form.setValues(this.record.data)
} else {
var a = function(b) {
this.formPanel.form.findField("destination").setValue(b)
};
SYNO.SDS.DownloadStation.DLM.Util.checkLocationDestinationNonEmpty(this, a, this.closeHandler, this)
}
this.formPanel.form.trackResetOnLoad = false
}
});
Ext.define("SYNO.SDS.DownloadStation.DLM.RSSAddFilterTestingTool", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, a || {});
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.formPanel = this.createForm(a);
var b = {
title: _DT("download", "test_filter"),
owner: a.owner,
cls: "syno-dl-win",
resizable: false,
width: 450,
height: 290,
border: false,
layout: "fit",
items: this.formPanel,
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
btnStyle: "blue",
text: _T("common", "save"),
scope: this,
handler: this.saveHandler
}, {
xtype: "syno_button",
text: _DT("common", "cancel"),
scope: this,
handler: this.closeHandler
})
};
return Ext.apply(b, a)
},
createForm: function() {
var a = {
padding: 0,
trackResetOnLoad: true,
keys: [{
key: [10, 13],
fn: this.saveHandler,
scope: this
}, {
key: 27,
fn: this.closeHandler,
scope: this
}],
items: [{
xtype: "syno_textfield",
itemId: "test_string",
name: "test_string",
hideLabel: false,
fieldLabel: _DT("download", "rss_filter_test_title"),
emptyText: _DT("download", "rss_filter_test_title"),
allowBlank: false
}, {
xtype: "syno_textfield",
itemId: "match",
name: "match",
hideLabel: false,
fieldLabel: _DT("download", "rss_filter_match")
}, {
xtype: "syno_textfield",
itemId: "not_match",
name: "not_match",
hideLabel: false,
fieldLabel: _DT("download", "rss_filter_not_match")
}, {
xtype: "syno_checkbox",
itemId: "is_regex",
name: "is_regex",
boxLabel: _DT("download", "rss_parse_regex")
}, {
xtype: "syno_button",
text: _DT("download", "test_filter"),
scope: this,
handler: this.onTest
}]
};
return new SYNO.ux.FormPanel(a)
},
onTest: function() {
if (!this.formPanel.form.isValid()) {
this.setStatusError({
text: _DT("error", "error_bad_field"),
clear: true
});
return
}
var a = {};
Ext.apply(a, this.formPanel.form.getValues());
a.is_regex = this.formPanel.form.findField("is_regex").getValue();
this.setStatusBusy({
text: _T("common", "loading")
});
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.RSS.Filter",
method: "test",
params: a,
version: 1,
scope: this,
callback: this.onTestDone
})
},
onTestDone: function(d, b, c, a) {
this.clearStatusBusy();
if (!d) {
this.appWin.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(b.code));
return
}
if (b.matched) {
this.setStatusOK({
text: _DT("download", "rss_filter_matched"),
clear: true
})
} else {
this.setStatusError({
text: _DT("download", "rss_fileter_not_match"),
clear: true
})
}
},
onShow: function() {
this.formPanel.form.setValues(this.owner.formPanel.form.getValues())
},
saveHandler: function() {
this.owner.formPanel.form.setValues(this.formPanel.form.getValues());
this.close()
},
closeHandler: function() {
this.close()
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.RSSInfoTabPanel", {
extend: "SYNO.ux.TabPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.itemList = new SYNO.SDS.DownloadStation.DLM.RSSItemList({
owner: this.owner,
uicomponents: a.uicomponents,
title: _DT("download", "rss_feeds")
});
this.filterList = new SYNO.SDS.DownloadStation.DLM.RSSFilterList({
owner: this.owner,
uicomponents: a.uicomponents,
title: _DT("download", "rss_auto_download")
});
var b = {
border: false,
cls: "syno-dl-infotab",
activeTab: 0,
deferredRender: false,
collapsed: false,
items: [this.itemList, this.filterList],
listeners: {
scope: this,
afterrender: {
fn: this.onAfterRender,
scope: this,
single: true
}
}
};
return Ext.apply(b, a)
},
onAfterRender: function() {
var a = this.owner.upperPanel.getSelectionModel();
this.mon(a, "rowSelectionChanged", function(b) {
if (1 !== b.getCount()) {
if (this.el.isMasked()) {
this.el.unmask()
}
this.resetInfoTabPanel();
return
}
this.load(b.getSelections())
}, this)
},
load: function(a) {
this.resetInfoTabPanel();
this.itemList.store.reload();
this.filterList.store.reload()
},
resetInfoTabPanel: function() {
this.itemList.resetGridPanel();
this.filterList.resetGridPanel()
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.RSSAddDialog", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
var b = this.fillConfig(a);
this.store = a.store;
this.callParent([b]);
var c = ["desttext"];
if (!_S("demo_mode")) {
c.push(this.dstChooseBtnId)
}
new SYNO.ux.Utils.EnableCheckGroup(this.formPanel.getForm(),"dl_all",c)
},
fillConfig: function(a) {
this.formPanel = this.createForm(a);
var b = {
owner: this.appWin,
cls: "syno-dl-win",
resizable: false,
title: _DT("common", "addto"),
width: 530,
height: 264,
border: false,
layout: "fit",
items: this.formPanel,
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
btnStyle: "blue",
text: _DT("common", "addto"),
disabled: _S("demo_mode"),
scope: this,
handler: this.addRss
}, {
xtype: "syno_button",
text: _DT("common", "close"),
scope: this,
handler: this.close
}),
keys: [{
key: 27,
scope: this,
handler: this.close
}]
};
Ext.apply(b, a);
return b
},
onShow: function() {
this.formPanel.getForm().findField("url").focus(false, 500);
var a = function(b) {
this.formPanel.getForm().findField("desttext").setValue(b)
};
SYNO.SDS.DownloadStation.DLM.Util.checkLocationDestinationNonEmpty(this, a, this.close, this)
},
createForm: function(a) {
var b = {
trackResetOnLoad: true,
bodyStyle: "padding: 0",
frame: false,
border: false,
method: "POST",
items: [{
xtype: "syno_displayfield",
value: _DT("download", "download_lbl_input_rss_url") + _T("common", "colon")
}, {
xtype: "syno_textfield",
name: "url",
itemId: "url",
hideLabel: true,
width: 450
}, {
xtype: "syno_checkbox",
name: "dl_all",
itemId: "dl_all",
boxLabel: _DT("download", "rss_dl_all")
}, {
xtype: "syno_compositefield",
indent: 1,
hideLabel: false,
itemId: "destselectfield",
fieldLabel: _DT("download", "download_list_dest_folder"),
autoFlexcroll: false,
items: [{
xtype: "syno_textfield",
name: "desttext",
readOnly: true,
width: 205
}, {
xtype: "syno_button",
id: this.dstChooseBtnId = Ext.id(),
text: _T("common", "choose"),
disabled: _S("demo_mode"),
scope: this,
handler: function() {
this.utils.chooseDestHandler({
owner: this,
destinationField: this.formPanel.form.findField("desttext")
})
}
}]
}]
};
b = Ext.apply(b, a);
return new SYNO.ux.FormPanel(b)
},
addRss: function() {
var c = {};
var b = this.formPanel.getForm();
var a = b.findField("url").getValue();
a = a.trim();
b.findField("url").setValue(a);
if (b.findField("dl_all").getValue()) {
c.enable_auto_download = true;
c.destination = b.findField("desttext").getValue();
if ("" === c.destination) {
this.getMsgBox().alert(this.title, _T("common", "forminvalid"));
return
}
}
if (!b.isValid()) {
this.getMsgBox().alert(this.title, _T("common", "forminvalid"));
return
}
this.setStatusBusy({
text: _DT("common", "saving")
});
c.url = b.findField("url").getValue();
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.RSS.Feed",
method: "add",
params: c,
version: 1,
scope: this,
callback: this.addRssDone
})
},
addRssDone: function(d, b, c, a) {
this.clearStatusBusy();
if (!d) {
this.appWin.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(b.code));
return
}
this.store.reload();
this.close()
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.RSSEditDialog", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, a || {});
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.formPanel = this.createForm(a);
var b = {
title: _T("common", "alt_edit"),
owner: this.appWin,
cls: "syno-dl-win",
dsmStyle: "v5",
resizable: false,
width: 500,
height: 264,
border: false,
layout: "fit",
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
btnStyle: "blue",
text: _DT("common", "alt_apply"),
scope: this,
handler: this.applyHandler
}, {
xtype: "syno_button",
text: _DT("common", "close"),
scope: this,
handler: this.close
}),
items: this.formPanel
};
return Ext.apply(b, a)
},
onShow: function() {
this.formPanel.getForm().findField("title").focus(true, 500)
},
createForm: function(a) {
var b = {
trackResetOnLoad: true,
bodyStyle: "padding: 0",
items: [{
xtype: "syno_displayfield",
value: _DT("download", "rss_name") + _T("common", "colon")
}, {
xtype: "syno_textfield",
itemId: "title",
name: "title",
allowBlank: false,
hideLabel: true,
width: 460,
value: this.record.get("title")
}, {
xtype: "syno_displayfield",
value: _DT("download", "rss_url") + _T("common", "colon")
}, {
xtype: "syno_textfield",
itemId: "url",
name: "url",
allowBlank: false,
hideLabel: true,
width: 460,
value: this.record.get("url")
}]
};
b = Ext.apply(b, a);
return new SYNO.ux.FormPanel(b)
},
applyHandler: function() {
var a = this.formPanel.getForm();
if (!a.isValid()) {
this.getMsgBox().alert(this.title, _T("common", "forminvalid"));
return
}
if (!a.isDirty()) {
this.close();
return
}
this.setStatusBusy();
var b = {
id: this.record.get("id")
};
Ext.apply(b, a.getValues());
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.RSS.Feed",
method: "set",
params: b,
version: 1,
scope: this,
callback: function(f, d, e, c) {
this.clearStatusBusy();
if (!f) {
this.appWin.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(d.code));
return
}
this.store.reload();
this.close()
}
})
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.RSS", {
extend: "SYNO.SDS.DownloadStation.RightPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
this.callParent(arguments);
this.createPollingTask()
},
createUpperPanel: function(a) {
return new SYNO.SDS.DownloadStation.DLM.RSSGridPanel(a)
},
createLowerPanel: function(a) {
return new SYNO.SDS.DownloadStation.DLM.RSSInfoTabPanel(a)
},
createPollingTask: function() {
this.pollingtask.add({
id: "RSSGrid",
interval: 5000,
api: this.upperPanel.api,
method: "list",
version: 1,
autoJsonDecode: true,
beforestart: this.upperPanel.onBeforeGridPollingStart,
callback: this.upperPanel.onUpdateRecordsTask,
scope: this.upperPanel
})
},
createActionGroup: function() {
var c, b, a;
var d = [new Ext.Button({
tooltip: _DT("common", "addto"),
iconCls: "syno-dl-a_bt_create",
itemId: "create",
scope: this,
handler: this.actionCreate
}), c = new Ext.Button({
tooltip: _DT("common", "alt_edit"),
iconCls: "syno-dl-a_bt_edit",
disabled: true,
itemId: "edit",
scope: this,
handler: this.actionEdit
}), a = new Ext.Button({
tooltip: _DT("download", "rss_update"),
iconCls: "syno-dl-a_bt_update",
disabled: true,
itemId: "update",
scope: this,
handler: this.actionUpdate
}), new Ext.Button({
tooltip: _DT("download", "rss_update_all"),
iconCls: "syno-dl-a_bt_update_all",
itemId: "update_all",
scope: this,
handler: this.actionUpdateAll
}), b = new Ext.Button({
tooltip: _DT("download", "download_tip_remove"),
iconCls: "syno-dl-a_bt_delete",
disabled: true,
itemId: "remove",
scope: this,
handler: this.actionRemove
})];
this.setMonDisabled(c, b, a);
return this.callParent([d, false])
},
setMonDisabled: function(c, b, a) {
c.mon(this.upperPanel.getSelectionModel(), "rowSelectionChanged", function(e) {
var d = e.getSelections();
if (1 !== d.length) {
this.setDisabled(true);
return
} else {
if (false !== d[0].data.is_updating) {
this.setDisabled(true);
return
}
}
this.setDisabled(false)
}, c);
b.mon(this.upperPanel.getSelectionModel(), "rowSelectionChanged", function(e) {
var d = e.getSelections();
if (0 === d.length) {
this.setDisabled(true);
return
}
this.setDisabled(false)
}, b);
a.mon(this.upperPanel.getSelectionModel(), "rowSelectionChanged", function(f) {
var e = f.getSelections();
if (0 === e.length) {
this.setDisabled(true);
return
}
for (var d = 0; d < e.length; d++) {
if (false === e[d].data.is_updating) {
break
}
}
this.setDisabled((d === e.length) ? true : false)
}, a)
},
actionCreate: function() {
var a = {
uicomponents: this.uicomponents,
store: this.upperPanel.store
};
var b = new SYNO.SDS.DownloadStation.DLM.RSSAddDialog(a);
b.open()
},
actionEdit: function() {
var a = {
uicomponents: this.uicomponents,
store: this.upperPanel.store,
record: this.upperPanel.getSelectionModel().getSelected()
};
var b = new SYNO.SDS.DownloadStation.DLM.RSSEditDialog(a);
b.open()
},
actionRemove: function() {
var b = {};
var a = this.getSelectedTaskIDArray();
if (0 === a) {
return
}
b.id = a;
this.getMsgBox().confirm(_DT("download", "rss_feeds"), _DT("common", "remove_cfrmrmv"), function(c, d) {
if ("yes" === c) {
this.sendRequest("delete", b)
}
}, this)
},
actionUpdate: function() {
var b = {};
var a = this.getSelectedTaskIDArray();
if (0 === a) {
return
}
b.id = a;
this.sendRequest("update", b)
},
actionUpdateAll: function() {
this.sendRequest("updateall")
},
getSelectedTaskIDArray: function() {
var c = this.upperPanel.getSelectionModel().getSelections();
var a = [];
for (var b = 0; b < c.length; b++) {
a[b] = c[b].get("id")
}
return a
},
sendRequest: function(a, b) {
this.pollingtask.stopById("RSSGrid");
if (!this.upperPanel.getEl().isMasked()) {
this.upperPanel.getEl().mask(_DT("common", "loading"), "x-mask-loading")
}
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.RSS.Feed",
method: a,
params: b,
version: 1,
scope: this,
callback: this.requestDone
})
},
requestDone: function(d, b, c, a) {
this.upperPanel.getEl().unmask();
this.pollingtask.startById("RSSGrid");
if (!d) {
this.appWin.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(b.code));
return
}
this.upperPanel.store.reload()
},
onActivate: function() {
if (this.panel.getEl().isMasked()) {
this.panel.getEl().unmask()
}
if (0 === this.upperPanel.store.getCount()) {
this.upperPanel.store.reload()
} else {
this.pollingtask.startById("RSSGrid", false)
}
},
onDeactivate: function() {
this.pollingtask.stopById("RSSGrid")
}
});
Ext.ns("SYNO.SDS.DownloadStation.DLM");
Ext.define("SYNO.SDS.DownloadStation.DLM.Main", {
extend: "SYNO.SDS.DownloadStation.Main",
constructor: function(a) {
var b = this.fillConfig(a);
this.owner = a.owner;
this.callParent([b]);
this.webapiLocationGet = {
api: "SYNO.DownloadStation2.Settings.Location",
method: "get",
version: 1
};
this.webapiLocationSet = {
api: "SYNO.DownloadStation2.Settings.Location",
method: "set",
version: 1
};
this.getSettings()
},
fillConfig: function(a) {
var b = {};
if (SYNO.SDS.DownloadStation.Uploader.Utils.isSupportHTML5Upload()) {
b.plugins = [new SYNO.SDS.DownloadStation.DLM.QueueAddFileUploader({
listeners: {
scope: this,
beforedrop: this.onBeforeDropFile
}
})]
}
return Ext.apply(b, a)
},
onBeforeDropFile: function(b, a) {
this.launchTaskDialog(0, a);
return false
},
launchTaskDialog: function(b, c, e, a) {
var d = function(f) {
var g = new SYNO.SDS.DownloadStation.DLM.QueueAddDialog({
uicomponents: this.uicomponents,
files: c,
urls: e,
hideTabHeader: a,
activeTab: b
});
g.open()
};
SYNO.SDS.DownloadStation.DLM.Util.checkLocationDestinationNonEmpty(this, d, undefined, this)
},
createSearchCategoryStore: function() {
var a = new Ext.data.ArrayStore({
autoDestroy: true,
idIndex: 0,
fields: ["value", "display"],
data: [["_allcat_", _DT("download", "download_allcategory")]]
});
return a
},
getSearchField: function() {
if (!this.gSearch) {
this.gSearch = new SYNO.TextFilter({
ctCls: "syno-textfilter syno-dl-toolbar-dlm-search",
itemId: "global_search",
emptyText: _DT("download", "quickurl_hint"),
enableKeyEvents: true,
width: 215,
listeners: {
scope: this,
keypress: function(d, b) {
if (b.getKey() == Ext.EventObject.ENTER) {
var c = d.getValue().trim();
if (c) {
var a = SYNO.SDS.DownloadStation.Utils.canonizeURLPrefix(c);
if (a) {
this.moduleList.selectModule("SYNO.SDS.DownloadStation.DLM.QueueAll");
this.uicomponents.queueGrid.addQuickURL(a);
d.reset()
} else {
this.moduleList.selectModule("SYNO.SDS.DownloadStation.DLM.Search");
this.moduleList.actived.createSearchTab(c);
d.focus()
}
}
}
}
}
})
}
return this.gSearch
},
getSettings: function() {
SYNO.API.Request({
webapi: this.webapiLocationGet,
callback: this.onGetSettings,
scope: this
})
},
onGetSettings: function(d, b, c, a) {
if (!d) {
SYNO.Debug("Failed on " + c.api + " " + c.method);
return
}
SYNO.SDS.DownloadStation.DLM.Util.setLocationDestination(b.default_destination);
if (Ext.isEmpty(b.default_destination) && this.appWin.isVisible()) {
this.alertDestinationEmptyWithLaunchingChooser()
}
},
alertDestinationEmptyWithLaunchingChooser: function() {
this.appWin.getMsgBox().alert(this.owner.title, _DT("download", "download_warning_select_share"), function(a, b) {
if (a == "ok") {
this.launchDownloadShareChooser()
}
}, this)
},
launchDownloadShareChooser: function() {
this.utils.chooseDestHandler({
owner: this.appWin,
callback: function(c, b, a) {
if (b) {
this.applyShare(b.path.substr(1))
}
c.close()
},
callbackScope: this
})
},
applyShare: function(a) {
this.mask(_T("common", "saving"));
SYNO.API.Request({
webapi: Ext.apply(this.webapiLocationSet, {
params: {
default_destination: a
}
}),
callback: this.onApplyShareDone,
scope: this
})
},
onApplyShareDone: function(d, b, c, a) {
this.unmask();
if (!d) {
this.appWin.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(b.code));
return
}
SYNO.SDS.DownloadStation.DLM.Util.setLocationDestination(c.default_destination)
}
});
Ext.namespace("SYNO.SDS.DownloadStation.aMule");
SYNO.SDS.DownloadStation.aMule.Utils = {};
Ext.apply(SYNO.SDS.DownloadStation.aMule.Utils, {
generalColTipRenderer: function(g, e, a, d, f, b) {
var c = Ext.util.Format.htmlEncode(g);
e.attr = 'ext:qtip="' + Ext.util.Format.htmlEncode(c) + '"';
return c
},
isValidED2KLink: function(b, g) {
var f;
try {
f = decodeURI(Ext.util.Format.trim(g)).toLowerCase()
} catch (d) {
SYNO.Debug("Fail to decodeURL " + d);
return false
}
var c, a;
if (f.length < 1) {
return false
}
if (f.substr(0, 7) != "ed2k://") {
return false
}
if (b == "server") {
c = new RegExp(/ed2k:\/\/\|(server[^\|]*)\|([^\|]*)\|((\d+)\|)?\//);
a = f.match(c);
if (!a) {
return false
}
} else {
if (b == "file") {
if (f.substr(8, 4) != "file") {
return false
} else {
if (f.match(/\|/g).length < 5) {
return false
}
}
c = new RegExp(/ed2k:\/\/\|file\|(.*)\|(\d+)\|/);
a = f.match(c);
if (!a || (0 < a.length && "0" === a[2])) {
return false
}
} else {
return false
}
}
return true
},
isValidMetLink: function(c) {
var a = 0;
var b = Ext.util.Format.trim(c).toLowerCase();
if (b.length < 1) {
return false
}
if (b.substr(0, 7) != "http://" && b.substr(0, 8) != "https://") {
return false
}
if ((a = b.lastIndexOf(".")) == -1) {
return false
}
if (b.substr(a + 1, 4) != "met" && b.substr(a + 1, 4) != "met?") {
return false
}
return true
},
serverColRenderer: function(g, e, a, d, f, b) {
var c = Ext.util.Format.htmlEncode(g);
if (a.data.CONNECTED) {
return "<font color=#057FEB>" + c + "</font>"
} else {
return c
}
},
serverColTipRenderer: function(g, e, a, d, f, b) {
var c = Ext.util.Format.htmlEncode(g);
e.attr = 'ext:qtip="' + Ext.util.Format.htmlEncode(c) + '"';
if (a.data.CONNECTED) {
return "<font color=#057FEB>" + c + "</font>"
} else {
return c
}
},
serverColUnitRenderer: function(b, f, d, h, a, g) {
var i = b;
var c = parseFloat(b);
if (c >= 1000000) {
i = (c / 1000000).toFixed(2) + "M"
} else {
if (c >= 1000) {
i = (c / 1000).toFixed(2) + "k"
}
}
var e = Ext.util.Format.htmlEncode(i);
if (d.data.CONNECTED) {
return "<font color=#057FEB>" + e + "</font>"
} else {
return e
}
},
getSearchFileTypeDS: function() {
var a = new Ext.data.ArrayStore({
fields: ["value", "display"],
data: [["any", _DT("search", "title_file_type_any")], ["audio", _DT("search", "title_file_type_audio")], ["video", _DT("search", "title_file_type_video")], ["image", _DT("search", "title_file_type_pic")], ["doc", _DT("search", "title_file_type_doc")], ["prog", _DT("search", "title_file_type_program")], ["archive", _DT("search", "title_file_type_archive")], ["iso", _DT("search", "title_file_type_image")]],
autoDestroy: true
});
return a
},
getSearchTypeDS: function() {
var a = new Ext.data.ArrayStore({
fields: ["value", "display"],
data: [["local", _DT("search", "title_method_local")], ["global", _DT("search", "title_method_global")], ["kad", _DT("search", "title_method_kad")]],
autoDestroy: true
});
return a
},
searchColTipRenderer: function(g, e, a, d, f, b) {
var c = Ext.util.Format.htmlEncode(g);
e.attr = 'ext:qtip="' + Ext.util.Format.htmlEncode(c) + '"';
if (a.data.file_has_downloaded === true) {
return "<font color=#E64040>" + c + "</font>"
} else {
if (parseInt(a.data.source, 10) >= 50) {
return "<font color=#057FEB>" + c + "</font>"
} else {
return c
}
}
},
searchColSourceRenderer: function(h, e, a, d, g, b) {
var f = h;
if (0 !== a.get("completed_source")) {
f = f + " (" + a.get("completed_source") + ")"
}
var c = Ext.util.Format.htmlEncode(f);
if (a.data.file_has_downloaded === true) {
return "<font color=#E64040>" + c + "</font>"
} else {
if (parseInt(a.data.source, 10) >= 50) {
return "<font color=#057FEB>" + c + "</font>"
} else {
return c
}
}
},
searchColSizeRenderer: function(g, f, a, h, d, b) {
var e = SYNO.SDS.DownloadStation.Utils.fileSize(g);
var c = Ext.util.Format.htmlEncode(e);
if (a.data.file_has_downloaded === true) {
return "<font color=#E64040>" + c + "</font>"
} else {
if (parseInt(a.data.source, 10) >= 50) {
return "<font color=#057FEB>" + c + "</font>"
} else {
return c
}
}
},
IsKadSearchKeywordValid: function(d) {
var c = d.split(/[ ()\[\]{}<>,._!?:;\\\/-]+/);
var b, a;
for (b = 0,
a = c.length; b < a; b++) {
if (c[b].length >= 3) {
return true
}
}
return false
},
getPriorityDS: function(b) {
var a = "";
switch (b) {
case "low":
a = _DT("dlqueue", "dl_priority_low");
break;
case "normal":
a = _DT("dlqueue", "dl_priority_normal");
break;
case "high":
a = _DT("dlqueue", "dl_priority_high");
break;
default:
a = _DT("dlqueue", "dl_priority_auto");
break
}
return a
},
showErrorMessages: function(c, b, d, a) {
if (b && b.errno && b.errno.section && b.errno.key) {
c.getMsgBox().alert(c.title, _DT(b.errno.section, b.errno.key), d, a)
} else {
if (b && b.code) {
c.getMsgBox().alert(c.title, SYNO.SDS.DownloadStation.Utils.getErrorString(b.code), d, a)
} else {
c.getMsgBox().alert(c.title, _DT("common", "commfail"), d, a)
}
}
},
timeRender: function(e) {
var d = false
, b = false
, a = false;
var f = "";
var c = parseFloat(e);
if (c < 1) {
return _DT("download", "download_status_unknown")
}
if (c >= (60 * 60 * 24)) {
f += Math.floor(c / (60 * 60 * 24)) + " " + _DT("ulqueue", "time_day");
c = c % (60 * 60 * 24);
d = true
}
if (c >= (60 * 60)) {
f += Math.floor(c / (60 * 60)) + ":";
c = e % (60 * 60);
b = true
}
if (c >= 60) {
if (Math.floor(c / 60) < 10 && (b || d)) {
f += "0"
}
f += Math.floor(c / 60) + ":";
a = true
}
if (c % 60 < 10 && (b || d || a)) {
f += "0"
}
f += c % 60;
if (b) {
f += " " + _DT("ulqueue", "time_hour")
} else {
if (a) {
f += " " + _DT("ulqueue", "time_min")
} else {
f += " " + _DT("ulqueue", "time_sec")
}
}
return Ext.util.Format.htmlEncode(f)
},
getEmuleDestination: function() {
return SYNO.SDS.DownloadStation.gData.emule_default_destination
},
setEmuleDestination: function(a) {
SYNO.SDS.DownloadStation.gData.emule_default_destination = a
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.DownloadGridPanel", {
extend: "SYNO.ux.GridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, a || {});
this.itemsPerPage = 50;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.DLStore = this.createStore();
var b = {
store: this.DLStore,
colModel: this.createColModel(),
bbar: this.createBottombar(),
view: this.createGridView(),
selModel: this.createSelectionModel(),
loadMask: true,
stripeRows: true,
border: false,
enableColumnMove: true,
stateful: true,
stateEvents: ["columnmove", "columnresize", "sortchange"],
initState: (function() {
var d = this.appWin.appInstance.getUserSettings("amuledlqueuegridstates");
var c = SYNO.SDS.DownloadStation.Utils.checkStateValue(d, this.colModel);
if (c) {
if (this.fireEvent("beforestaterestore", this, c) !== false) {
this.applyState(Ext.apply({}, c));
this.fireEvent("staterestore", this, c)
}
}
}
).createDelegate(this),
saveState: (function() {
var c = this.getState();
this.appWin.appInstance.setUserSettings("amuledlqueuegridstates", c)
}
).createDelegate(this),
height: 500,
layout: "fit",
scope: this,
listeners: {
scope: this,
afterrender: {
scope: this,
fn: this.onAfterRender,
single: true
},
rowcontextmenu: function(c, g, d) {
d.preventDefault();
var f = c.getSelectionModel();
if (!f.isSelected(g)) {
f.selectRow(g)
}
this.gridCtxMenu.showAt(d.getXY())
},
rowdblclick: {
scope: this.owner,
fn: this.owner.actionEdit
}
}
};
return Ext.apply(b, a)
},
createStore: function() {
var a = [{
name: "task_id",
mapping: "id"
}, {
name: "file_id",
convert: function(d, c) {
return c.additional.detail.hash
}
}, {
name: "filename",
mapping: "title"
}, {
name: "total_size",
mapping: "size"
}, {
name: "current_size",
convert: function(d, c) {
return c.additional.transfer.size_downloaded
}
}, {
name: "progress",
convert: function(d, c) {
return (0 === c.size) ? 0 : (c.additional.transfer.size_downloaded / c.size) * 100
}
}, {
name: "current_rate",
convert: function(d, c) {
return c.additional.transfer.speed_download
}
}, {
name: "connected_peers",
convert: function(d, c) {
return c.additional.detail.connected_peers + "(" + c.additional.detail.total_peers + ")"
}
}, {
name: "status"
}, {
name: "username"
}, {
name: "destination",
convert: function(d, c) {
return c.additional.detail.destination
}
}, {
name: "priority",
convert: function(d, c) {
return c.additional.detail.priority
}
}, {
name: "status_extra"
}];
var b = new SYNO.API.JsonStore({
api: "SYNO.DownloadStation2.Task",
method: "list",
version: 2,
autoDestory: true,
autoLoad: false,
appWindow: this,
sortInfo: {
field: "filename",
direction: "ASC"
},
remoteSort: true,
idProperty: "id",
fields: a,
root: "task",
totalProperty: "total",
baseParams: {
type: ["emule"],
limit: this.itemsPerPage,
additional: ["detail", "transfer"]
},
paramNames: {
start: "offset",
limit: "limit",
sort: "sort_by",
dir: "order"
},
listeners: {
scope: this,
beforeload: this.onBeforeStoreLoad,
load: this.onStoreLoad,
loadexception: this.onStoreLoadException
}
});
this.addManagedComponent(b);
return b
},
onStoreLoadException: function(b, c, a) {
this.owner.apiErrorHandler(a.code);
this.pollingtask.startById("DownloadGrid", false)
},
createColModel: function() {
var a = new Ext.grid.ColumnModel({
columns: [{
id: "filename",
header: _DT("download", "download_list_filename"),
dataIndex: "filename",
width: 150,
renderer: SYNO.SDS.DownloadStation.Renderers.fileNameWithStatusRenderer
}, {
id: "total_size",
header: _DT("download", "download_list_filesize"),
dataIndex: "total_size",
width: 70,
renderer: SYNO.SDS.DownloadStation.Renderers.SizeRenderer
}, {
id: "current_size",
header: _DT("download", "download_list_completed"),
dataIndex: "current_size",
width: 80,
renderer: SYNO.SDS.DownloadStation.Renderers.SizeRenderer
}, {
id: "progress",
header: _DT("download", "download_list_progress"),
dataIndex: "progress",
width: 80,
renderer: SYNO.SDS.DownloadStation.Renderers.ProgressRenderer
}, {
id: "current_rate",
header: _DT("download", "download_list_speed"),
dataIndex: "current_rate",
width: 70,
hidden: true,
renderer: SYNO.SDS.DownloadStation.Renderers.RateRenderer
}, {
id: "connected_peers",
header: _DT("dlqueue", "title_dl_source"),
dataIndex: "connected_peers",
width: 60,
hidden: true
}, {
id: "status",
header: _DT("download", "download_list_status"),
dataIndex: "status",
width: 80,
hidden: true,
renderer: SYNO.SDS.DownloadStation.Renderers.StatusRenderer
}, {
id: "username",
header: _DT("download", "download_list_username"),
dataIndex: "username",
width: 80,
hidden: true
}, {
id: "priority",
header: _DT("dlqueue", "title_dl_priority"),
dataIndex: "priority",
width: 80,
hidden: true,
renderer: this.getPriorityRender
}],
defaults: {
sortable: true
}
});
return a
},
getSortParam: function() {
return this.DLStore.getSortState().field
},
getPriorityRender: function(f, d, a, c, e, b) {
return Ext.util.Format.htmlEncode(SYNO.SDS.DownloadStation.aMule.Utils.getPriorityDS(f))
},
createBottombar: function() {
this.itemTotalDownRate = new SYNO.SDS.DownloadStation.ToolbarRateItem({
labelText: "DL"
});
var a = new SYNO.ux.PagingToolbar({
store: this.DLStore,
displayInfo: true,
pageSize: this.itemsPerPage,
refreshText: _DT("download", "download_btn_refresh"),
itemCls: "syno-dl-gridpanel-bbaritem",
items: [this.itemTotalDownRate, "-"],
autoDestroy: true
});
return a
},
createGridView: function() {
return new SYNO.SDS.DownloadStation.GridView()
},
createSelectionModel: function() {
var a = new Ext.grid.RowSelectionModel({
singleSelect: false,
listeners: {
selectionchange: {
scope: this,
fn: this.gridSelectionChange
}
}
});
a.addEvents({
rowSelectionChanged: true
});
return a
},
gridSelectionChange: function(a) {
if (!this.gridSelectionChangeTask) {
this.gridSelectionChangeTask = new Ext.util.DelayedTask(function(b) {
a.fireEvent("rowSelectionChanged", a)
}
,a)
}
this.gridSelectionChangeTask.delay(300)
},
onAfterRender: function() {
this.gridCtxMenu = this.createCtxMenu();
this.addManagedComponent(this.gridCtxMenu)
},
createCtxMenu: function() {
var e = new SYNO.ux.Menu();
var c = this.owner.actionGroup.list;
var a = ["dl_resume", "dl_stop", "dl_remove", "dl_edit"];
for (var d = 0; d < c.length; d++) {
if (-1 !== a.indexOf(c[d].initialConfig.itemId)) {
var b = c[d].initialConfig;
b.text = b.tooltip;
b.iconCls = "";
e.addMenuItem(b)
}
}
e.addMenuItem({
itemId: "open",
text: _T("fbbrower", "open_folder"),
handler: this.actionOpenContainingFolder,
scope: this
});
e.items.items.forEach(function(f) {
if ("open" === f.itemId) {
f.mon(this.getSelectionModel(), "rowSelectionChanged", function(h) {
var g = true;
if (1 === h.getCount() && SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_FINISHED === h.getSelections()[0].get("status")) {
g = false
}
this.setDisabled(g)
}, f);
return
}
this.owner.setMonDisabledByStatus(f)
}, this);
return e
},
actionOpenContainingFolder: function() {
var b = this.getSelectionModel().getSelected();
if (SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_FINISHED !== b.get("status")) {
return
}
var a = b.get("destination");
if ("" === a) {
this.getMsgBox().alert(_T("fbbrower", "open_folder"), _T("error", "error_dest_no_path"));
return
}
if (true === _S("is_admin") && (a === "home" || a.substr(0, 5) === "home/")) {
if (b.get("username") !== _S("user")) {
a = (a.length > 4) ? "/" + a.substr(5) : "";
a = "homes/" + b.get("username") + a
}
}
SYNO.SDS.AppLaunch("SYNO.SDS.App.FileStation3.Instance", {
openfile: "/" + a + "/" + b.get("filename")
})
},
onBeforeStoreLoad: function(a, b) {
if (!this.isVisible()) {
return false
}
if ("undefined" !== typeof (b.params.offset)) {
this.gridStartPosition = b.params.offset
} else {
this.gridStartPosition = 0
}
this.pollingtask.stopById("DownloadGrid");
this.pollingtask.startById("DownloadStatistic")
},
onStoreLoad: function(b, a, c) {
if (this.DLStore.getTotalCount() <= this.gridStartPosition && this.gridStartPosition > 0) {
var d = Math.ceil((this.DLStore.getTotalCount() - this.itemsPerPage) / this.itemsPerPage);
this.DLStore.load({
params: {
offset: (d * this.itemsPerPage),
limit: this.itemsPerPage
}
});
return
}
if (0 < this.DLStore.getTotalCount()) {
this.owner.actionGroup.enable("dl_clear")
} else {
this.owner.actionGroup.disable("dl_clear")
}
this.pollingtask.startById("DownloadGrid", false)
},
updateDownloadRate: function(a) {
this.itemTotalDownRate.updateTextByRate(a)
},
updateGridByCommit: function(f) {
var a = this.getSelectedTaskIds();
var k = [];
var b = false;
var d = this.DLStore.reader.readRecords(f).records;
for (var e = 0; e < d.length; e++) {
var c = d[e];
var i = this.DLStore.getById(c.id);
if (!i) {
this.DLStore.removeAt(e);
this.DLStore.insert(e, new Ext.data.Record(c.data,c.id));
continue
}
var h = this.DLStore.getAt(e);
if (-1 !== a.indexOf(c.id)) {
k.push(i);
b |= (i.data.status !== c.data.status)
}
Ext.apply(i.data, c.data);
i.commit();
if (a.length < 2 && h && c.id != h.get("task_id")) {
this.DLStore.remove(i);
this.DLStore.insert(e, i)
}
}
this.updateSelections(a, k);
if (b) {
var g = this.getSelectionModel();
g.fireEvent("rowSelectionChanged", g)
}
},
getSelectedTaskIds: function() {
var a = [];
Ext.iterate(this.getSelectionModel().getSelections(), function(b) {
a.push(b.get("task_id"))
}, this);
return a
},
updateSelections: function(c, a) {
var b = this.getSelectionModel();
if (1 === c.length && 1 === a.length) {
b.suspendEvents(false);
b.selectRecords([a[0]]);
b.resumeEvents()
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.CreateTaskWindow", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.webapiDestinationGet = {
api: "SYNO.DownloadStation2.Settings.Emule.Location",
method: "get",
version: 1
};
this.webapiTaskCreate = {
api: "SYNO.DownloadStation2.Task",
method: "create",
version: 2
};
var b = this.fillConfig(a);
this.ADDTASK_MAXLIMIT = 50;
this.callParent([b])
},
fillConfig: function(a) {
this.formPanel = new SYNO.SDS.DownloadStation.aMule.CreateTaskForm({
owner: this
});
var b = {
owner: a.owner,
cls: "syno-dl-win",
dsmStyle: "v5",
resizable: false,
title: _DT("download", "download_cap_new_download"),
width: 580,
height: 462,
layout: "fit",
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
btnStyle: "blue",
text: _DT("download", "download_btn_new"),
scope: this,
handler: this.addTask
}, {
xtype: "syno_button",
text: _DT("common", "close"),
scope: this,
handler: this.close
}),
items: this.formPanel
};
return Ext.apply(b, a)
},
onShow: function() {
var b = SYNO.SDS.DownloadStation.aMule.Utils;
this.formPanel.getForm().findField("url").focus(false, 500);
var a = b.getEmuleDestination();
if (!Ext.isEmpty(a)) {
this.formPanel.getForm().findField("destination_display").setValue(a);
return
}
this.setStatusBusy({
text: _T("common", "loading")
});
this.sendWebAPI({
webapi: this.webapiDestinationGet,
scope: this,
callback: function(e, d, c) {
if (!e) {
b.showErrorMessages(this, d, function() {
this.close()
}, this);
return
}
b.setEmuleDestination(d.default_destination);
if (Ext.isEmpty(d.default_destination)) {
this.mainPanel.alertDestinationEmptyWithLaunchingChooser(this, this.close, this);
return
}
this.formPanel.getForm().findField("destination_display").setValue(d.default_destination);
this.clearStatusBusy()
}
})
},
addTask: function() {
var a = this.formPanel.getForm();
var b = !a.findField("url").disabled;
if (b) {
this.addTaskByUrl(a)
} else {
this.addTaskByFile(a)
}
},
addTaskByUrl: function(b) {
var c = this.formValidUrl(b.findField("url"));
if (Ext.isEmpty(c)) {
return
}
var a = b.findField("extract_password_display").getValue();
if (false === SYNO.SDS.DownloadStation.DLM.Util.handleNewUnzipPW.createDelegate(this, [a])()) {
return
}
var d = {
type: Ext.decode(b.findField("type").getValue()),
destination: b.findField("destination_display").getValue(),
url: c,
create_list: Ext.decode(b.findField("create_list").getValue())
};
if (!Ext.isEmpty(a)) {
d.extract_password = a
}
this.setStatusBusy({
text: _DT("common", "saving")
});
this.sendWebAPI({
webapi: Ext.apply(this.webapiTaskCreate, {
params: d
}),
scope: this,
callback: this.addTaskDone
})
},
formValidUrl: function(g) {
var e = g.getValue();
e = Ext.util.Format.trim(e);
g.setValue(e);
if (0 === e.length) {
this.getMsgBox().alert(this.title, _DT("server", "error_server_empty_link"));
return
}
var b = [];
var f = e.split("\n");
var d = false;
for (var c = 0; c < f.length; c++) {
if (0 === Ext.util.Format.trim(f[c]).length) {
continue
}
if (!SYNO.SDS.DownloadStation.aMule.Utils.isValidED2KLink("file", f[c])) {
d = true;
continue
}
b.push("ed2k://" + f[c].substr(7))
}
if (0 === b.length) {
this.getMsgBox().alert(this.title, _DT("server", "error_server_invalid_link"));
return
}
if (b.length > this.ADDTASK_MAXLIMIT) {
this.getMsgBox().alert(this.title, _DT("dlqueue", "error_task_add_exceed_maxnumber").replace("{0}", this.ADDTASK_MAXLIMIT));
return
}
if (d) {
this.getMsgBox().alert(this.title, _DT("server", "error_invalid_link_found"))
}
var a = b.join("");
a = a.replace(/\r/g, "");
a = a.replace(/\n/g, "");
g.setValue(a);
return b
},
addTaskByFile: function(a) {
var d = this.formPanel.FILEFILEDNAME;
var c = a.findField(d).getValue();
if (c === "") {
this.getMsgBox().alert(this.title, _DT("download", "download_empty_input_file"));
return
} else {
if (!SYNO.SDS.DownloadStation.Utils.isValidExtension(c, ".txt")) {
var b = _DT("download", "download_error_wrong_file_extension");
b = b.replace("%1", ".txt");
this.getMsgBox().alert(this.title, b);
return
}
}
a.doAction("apply")
},
addTaskDone: function(c, b) {
this.clearStatusBusy();
if (!c) {
switch (b.code) {
case this.utils.ERROR_CODE.SYNODL_ERR_REACH_LIMIT:
SYNO.SDS.DownloadStation.aMule.Utils.showErrorMessages(this, b);
return;
case this.utils.ERROR_CODE.SYNODL_ERR_EMULE_FILE_EXIST:
case this.utils.ERROR_CODE.SYNODL_ERR_EMULE_DUP_LINK:
case this.utils.TASK_ERROR_EXCEED_MAX_TEMP_FS_SIZE:
var a = _DT("download", "download_add_link_error_title") + _DT("common", "colon") + "<br />" + this.utils.getErrorString(b.code);
this.getMsgBox().alert(this.title, a, this.close, this);
return;
default:
SYNO.SDS.DownloadStation.aMule.Utils.showErrorMessages(this, b, this.close, this);
return
}
}
this.close()
}
});
Ext.define("SYNO.SDS.DownloadStation.aMule.CreateTaskForm", {
extend: "SYNO.ux.FormPanel",
FILEFILEDNAME: "emule",
constructor: function(a) {
this.owner = a.owner;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
var b = {
bodyStyle: "padding: 0",
frame: false,
border: false,
fileUpload: true,
api: this.owner.webapiTaskCreate.api,
method: this.owner.webapiTaskCreate.method,
version: this.owner.webapiTaskCreate.version,
url: "webapi/entry.cgi/" + this.owner.webapiTaskCreate.api,
listeners: {
beforeaction: {
scope: this.owner,
fn: this.onBeforeAction
},
actioncomplete: {
scope: this.owner,
fn: this.onActionComplete
},
actionfailed: {
scope: this.owner,
fn: this.onActionFailed
}
},
items: [{
xtype: "hidden",
value: Ext.encode("url"),
name: "type"
}, {
xtype: "hidden",
value: Ext.encode([this.FILEFILEDNAME]),
name: "file"
}, {
xtype: "hidden",
value: false,
name: "create_list"
}, {
xtype: "syno_compositefield",
hideLabel: false,
fieldLabel: _DT("download", "download_list_dest_folder"),
autoFlexcroll: false,
items: [{
xtype: "syno_textfield",
name: "destination_display",
readOnly: true,
width: 201
}, {
xtype: "syno_button",
text: _T("common", "choose"),
scope: this,
handler: function() {
this.owner.utils.chooseDestHandler({
owner: this.owner,
destinationField: this.form.findField("destination_display")
})
}
}, {
xtype: "hidden",
name: "destination"
}]
}, {
xtype: "syno_compositefield",
hideLabel: false,
fieldLabel: _DT("settings", "unzip_pw"),
hidden: !SYNO.SDS.DownloadStation.DLM.Util.isUnzipServiceOn(),
items: [{
xtype: "syno_textfield",
name: "extract_password_display",
width: 201
}, {
xtype: "hidden",
name: "extract_password"
}]
}, {
xtype: "syno_compositefield",
hideLabel: true,
items: [{
xtype: "syno_radio",
width: 180,
boxLabel: _DT("download", "download_lbl_input_file") + _T("common", "colon"),
name: "type_radio",
inputValue: "file"
}, {
xtype: "syno_filebutton",
hideLabel: true,
buttonOnly: false,
name: this.FILEFILEDNAME,
disabled: true
}]
}, {
xtype: "syno_compositefield",
hideLabel: true,
items: [{
xtype: "syno_displayfield",
width: 180,
value: ""
}, {
xtype: "syno_displayfield",
value: "( eg. emule.txt )"
}]
}, {
xtype: "syno_compositefield",
hideLabel: true,
items: [{
xtype: "syno_radio",
checked: true,
width: 180,
boxLabel: _DT("download", "download_lbl_input_url") + _T("common", "colon"),
name: "type_radio",
inputValue: "url",
listeners: {
check: {
fn: function(c, e) {
var d = Ext.encode(e ? "url" : "file");
this.form.findField("type").setValue(d);
this.form.findField(this.FILEFILEDNAME).setDisabled(e);
this.form.findField("url").setDisabled(!e)
},
scope: this
}
}
}, {
xtype: "syno_textarea",
fieldLabel: _DT("download", "download_list_url"),
name: "url",
validateOnBlur: true,
validationEvent: "blur",
width: 285,
height: 175,
cls: "selectabletext allowDefCtxMenu"
}]
}, {
xtype: "syno_compositefield",
hideLabel: true,
items: [{
xtype: "syno_displayfield",
width: 180,
value: ""
}, {
xtype: "syno_displayfield",
width: 410,
value: "( eg. ed2k://|file|<filename>|<filesize>|<file hash>|/ )"
}]
}]
};
b = Ext.apply(b, a);
return b
},
createForm: function() {
var a = Ext.applyIf({
appWindow: this,
listeners: {}
}, this.initialConfig);
return new SYNO.API.Form.BasicForm(null,a)
},
onBeforeAction: function(c, d) {
if ("submit" !== d.type) {
return
}
var b = c.findField("extract_password_display").getValue();
if (false === SYNO.SDS.DownloadStation.DLM.Util.handleNewUnzipPW.createDelegate(this, [b])()) {
return false
}
c.findField("extract_password").setValue(Ext.encode(b));
var a = Ext.encode(c.findField("destination_display").getValue());
c.findField("destination").setValue(a);
this.setStatusBusy({
text: _DT("common", "saving")
})
},
onActionComplete: function(a, b) {
this.addTaskDone(b.result.success, b.result.data)
},
onActionFailed: function(a, b) {
this.addTaskDone(b.result.success, b.result.error)
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.EditTaskWindow", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, a || {});
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.formPanel = this.createForm(a);
var c = _DT("common", "alt_edit") + ((this.selections.length > 1) ? ": batch" : "");
var b = {
owner: a.owner,
cls: "syno-dl-win",
dsmStyle: "v5",
resizable: false,
title: c,
width: 500,
height: 210,
layout: "fit",
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
btnStyle: "blue",
text: _DT("common", "ok"),
scope: this,
handler: this.applyHandler
}, {
xtype: "syno_button",
text: _DT("common", "cancel"),
scope: this,
handler: this.close
}),
items: this.formPanel
};
return Ext.apply(b, a)
},
onShow: function() {
this.setStatusBusy({
text: _T("common", "loading")
});
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task",
method: "get",
params: {
id: [this.selections[0].get("task_id")],
additional: ["detail"]
},
version: 2,
scope: this,
callback: function(e, c, d, a) {
var b = {};
this.clearStatusBusy();
if (!e) {
SYNO.SDS.DownloadStation.aMule.Utils.showErrorMessages(this, c, function() {
this.close()
}, this);
return
}
b.priority = c.task[0].additional.detail.priority;
b.destination = c.task[0].additional.detail.destination;
b.unzipPW = c.task[0].additional.detail.extract_password;
this.formPanel.getForm().setValues(b)
}
})
},
createForm: function(a) {
var b = {
trackResetOnLoad: true,
items: [{
xtype: "syno_compositefield",
hideLabel: false,
fieldLabel: _DT("dlqueue", "title_dl_priority"),
items: [{
xtype: "syno_combobox",
name: "priority",
store: this.getPriorityDS(),
displayField: "display",
valueField: "value",
triggerAction: "all",
mode: "local",
value: "auto",
editable: false,
width: 160
}]
}, {
xtype: "syno_compositefield",
hideLabel: false,
fieldLabel: _DT("download", "download_list_dest_folder"),
items: [{
xtype: "syno_textfield",
name: "destination",
width: 160,
readOnly: true,
cls: "selectabletext allowDefCtxMenu"
}, {
xtype: "syno_button",
name: "choosedestbtn",
text: _T("common", "choose"),
scope: this,
handler: function() {
this.utils.chooseDestHandler({
owner: this,
destinationField: this.formPanel.form.findField("destination")
})
}
}]
}, {
xtype: "syno_compositefield",
hideLabel: false,
fieldLabel: _DT("settings", "unzip_pw"),
hidden: !SYNO.SDS.DownloadStation.DLM.Util.isUnzipServiceOn(),
items: [{
xtype: "syno_textfield",
name: "unzipPW",
width: 160
}]
}]
};
b = Ext.apply(b, a);
return new SYNO.ux.FormPanel(b)
},
applyHandler: function() {
var b = [];
var e = "";
var a = "";
for (var c = 0; c < this.selections.length; c++) {
b[c] = this.selections[c].get("task_id")
}
e = this.formPanel.getForm().findField("priority").getValue();
a = this.formPanel.getForm().findField("destination").getValue();
if (!e || !a) {
this.getMsgBox().alert(this.title, _DT("error", "error_bad_field"));
return
}
var g = {
id: b,
priority: e,
destination: a
};
if (SYNO.SDS.DownloadStation.DLM.Util.isUnzipServiceOn()) {
var f = this.formPanel.getForm().findField("unzipPW");
if (f && f.isDirty()) {
var d = f.getValue();
if (false === SYNO.SDS.DownloadStation.DLM.Util.handleNewUnzipPW.createDelegate(this, [d])()) {
return false
}
g.extract_password = d
}
}
this.setStatusBusy({
text: _T("common", "loading")
});
this.appWin.sendWebAPI({
api: "SYNO.DownloadStation2.Task",
method: "edit",
params: g,
version: 2,
scope: this,
callback: this.afterApply
})
},
afterApply: function(d, b, c, a) {
this.clearStatusBusy();
if (!d) {
SYNO.SDS.DownloadStation.aMule.Utils.showErrorMessages(this, b);
return
}
this.close()
},
getPriorityDS: function() {
var a = new Ext.data.ArrayStore({
fields: ["value", "display"],
data: [["low", _DT("dlqueue", "dl_priority_low")], ["normal", _DT("dlqueue", "dl_priority_normal")], ["high", _DT("dlqueue", "dl_priority_high")], ["auto", _DT("dlqueue", "dl_priority_auto")]],
autoDestroy: true
});
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.DownloadInfoTabPanel", {
extend: "SYNO.ux.TabPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.infoGeneral = this.createInfoGeneral(a);
this.infoTransfer = this.createInfoTransfer(a);
var b = {
border: false,
cls: "syno-dl-infotab",
activeTab: 0,
deferredRender: true,
collapsed: this.appWin.appInstance.getUserSettings("amuledlinfo") === true ? true : false,
items: [this.infoGeneral, this.infoTransfer],
listeners: {
scope: this,
afterrender: {
fn: this.onAfterRender,
scope: this,
single: true
},
beforecollapse: this.onRecordCollapse
}
};
return Ext.apply(b, a)
},
onAfterRender: function() {
this.items.each(function(b) {
Ext.get(b.tabEl).on("click", function() {
var c = this.moduleList.actived;
if (c.lowerPanel.bodyCollapsed) {
c.onLowerPanelToggle(c.lowerPanel)
}
}, this)
}, this);
this.createPollingTask();
var a = this.owner.upperPanel.getSelectionModel();
this.mon(a, "rowSelectionChanged", function(b) {
if (1 !== b.getCount()) {
this.pollingtask.stopById("DownloadInfo");
if (this.el.isMasked()) {
this.el.unmask()
}
this.resetForm();
return
}
this.load(b.getSelections())
}, this)
},
onRecordCollapse: function(a) {
var b = ("undefined" === typeof a.bodyCollapsed) ? true : !a.bodyCollapsed;
this.appWin.appInstance.setUserSettings("amuledlinfo", b)
},
load: function(a) {
this.resetForm();
this.getEl().mask(_DT("common", "loading"));
this.pollingtask.stopById("DownloadInfo");
this.pollingtask.startById("DownloadInfo")
},
resetForm: function() {
this.infoGeneral.getForm().reset();
this.infoTransfer.getForm().reset()
},
createInfoGeneral: function(a) {
var b = (true === _S("is_admin")) ? true : false;
var c = {
itemId: "general",
title: _DT("download", "download_table_heading_general"),
border: false,
frame: false,
defaults: {
xtype: "syno_displayfield"
},
items: [{
fieldLabel: _DT("download", "download_list_filename"),
name: "filename",
cls: "selectabletext allowDefCtxMenu"
}, {
fieldLabel: _DT("server", "title_server_link"),
name: "link",
cls: "selectabletext allowDefCtxMenu"
}, {
fieldLabel: _DT("dlqueue", "title_file_hash"),
name: "hash"
}, {
fieldLabel: _DT("download", "download_list_filesize"),
name: "filesize",
hidden: this._S("is_admin") ? false : true
}, {
fieldLabel: _DT("dlqueue", "title_dl_priority"),
name: "priority"
}, {
fieldLabel: _DT("download", "download_list_username"),
name: "username",
hidden: b ? false : true
}, {
fieldLabel: _DT("download", "download_list_dest_folder"),
name: "destination",
cls: "selectabletext allowDefCtxMenu"
}]
};
return new SYNO.ux.FormPanel(c)
},
createInfoTransfer: function() {
var a = {
itemId: "transfer",
title: _DT("download", "download_table_heading_transfer"),
border: false,
frame: false,
defaults: {
xtype: "syno_displayfield"
},
items: [{
fieldLabel: _DT("download", "download_list_status"),
name: "status"
}, {
fieldLabel: _DT("dlqueue", "title_dl_source"),
name: "source"
}, {
fieldLabel: _DT("dlqueue", "title_dl_transferred"),
name: "transferred"
}, {
fieldLabel: _DT("download", "download_list_completed"),
name: "completed"
}, {
fieldLabel: _DT("dlqueue", "title_dl_remaining"),
name: "remain"
}, {
fieldLabel: _DT("download", "download_list_progress"),
name: "progress"
}, {
fieldLabel: _DT("download", "download_list_speed"),
name: "speed"
}, {
fieldLabel: _DT("dlqueue", "title_dl_last_seen"),
name: "lastseen"
}]
};
return new SYNO.ux.FormPanel(a)
},
createPollingTask: function() {
this.pollingtask.add({
id: "DownloadInfo",
interval: 5000,
api: "SYNO.DownloadStation2.Task",
autoJsonDecode: true,
method: "get",
single: false,
version: 2,
callback: this.onUpdateForm,
scope: this,
beforestart: function(b) {
var c = this.owner.upperPanel.getSelectionModel().getSelected();
if (!Ext.isDefined(c)) {
return false
}
var a = [];
a.push(c && c.get("task_id"));
var d = {
id: a,
additional: ["detail", "transfer"]
};
b.reqConfig.params = d
}
})
},
onUpdateForm: function(e, d, c) {
this.getEl().unmask();
if (!e) {
return
}
var a = d.task[0];
var b = {};
b.filename = a.title;
b.link = a.additional.detail.uri;
b.hash = a.additional.detail.hash;
b.filesize = SYNO.SDS.DownloadStation.Utils.fileSize(a.size);
b.priority = SYNO.SDS.DownloadStation.aMule.Utils.getPriorityDS(a.additional.detail.priority);
b.username = a.username;
b.destination = a.additional.detail.destination;
b.status = SYNO.SDS.DownloadStation.Utils.getTaskStatusStr(a);
b.source = a.additional.detail.connected_peers + "(" + a.additional.detail.total_peers + ")";
b.transferred = SYNO.SDS.DownloadStation.Utils.fileSize(a.additional.transfer.size_uploaded);
b.completed = SYNO.SDS.DownloadStation.Utils.fileSize(a.additional.transfer.size_downloaded);
b.remain = SYNO.SDS.DownloadStation.Utils.fileSize(a.size - a.additional.transfer.size_downloaded);
b.progress = SYNO.SDS.DownloadStation.Renderers.ProgressRenderer((a.additional.transfer.size_downloaded / a.size) * 100);
b.speed = (0 === a.additional.transfer.speed_download) ? _DT("download", "download_status_unknown") : SYNO.SDS.DownloadStation.Utils.fileSize(a.additional.transfer.speed_download) + "/s";
b.lastseen = SYNO.SDS.DateTimeFormatter(new Date(a.additional.detail.last_seen_complete * 1000));
Ext.each(this.items.items, function(h, f, g) {
if (h.getForm) {
h.getForm().setValues(b)
}
}, this);
if (0 === d.task.length) {
this.pollingtask.stopById("DownloadInfo")
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.Download", {
extend: "SYNO.SDS.DownloadStation.RightPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
this.webapiEmuleLocation = {
api: "SYNO.DownloadStation2.Settings.Emule.Location",
method: "get",
version: 1
};
this.webapiTaskList = {
api: "SYNO.DownloadStation2.Task",
method: "list",
version: 2
};
this.webapiDownloadStatistic = {
api: "SYNO.DownloadStation2.Task.Statistic",
method: "get",
version: 1,
params: {
type: ["emule"]
}
};
this.callParent(arguments);
this.createPollingTask()
},
createUpperPanel: function(a) {
return new SYNO.SDS.DownloadStation.aMule.DownloadGridPanel(a)
},
createLowerPanel: function(a) {
return new SYNO.SDS.DownloadStation.aMule.DownloadInfoTabPanel(a)
},
createActionGroup: function() {
var a = [new Ext.Button({
tooltip: _DT("download", "download_btn_new"),
iconCls: "syno-dl-a_bt_create",
itemId: "dl_create",
scope: this,
handler: this.actionCreate
}), new Ext.Button({
tooltip: _DT("download", "download_tip_resume"),
iconCls: "syno-dl-a_bt_resume",
itemId: "dl_resume",
disabled: true,
scope: this,
handler: this.actionResume
}), new Ext.Button({
tooltip: _DT("download", "download_tip_stop"),
iconCls: "syno-dl-a_bt_pause",
itemId: "dl_stop",
disabled: true,
scope: this,
handler: this.actionPause
}), new Ext.Button({
tooltip: _DT("common", "alt_edit"),
iconCls: "syno-dl-a_bt_edit",
disabled: true,
itemId: "dl_edit",
scope: this,
handler: this.actionEdit
}), new Ext.Button({
tooltip: _DT("download", "download_tip_clear"),
iconCls: "syno-dl-a_bt_clear",
disabled: true,
itemId: "dl_clear",
scope: this,
handler: this.actionClear
}), new Ext.Button({
tooltip: _DT("download", "download_tip_remove"),
iconCls: "syno-dl-a_bt_delete",
disabled: true,
itemId: "dl_remove",
scope: this,
handler: this.actionRemove
})];
a.forEach(function(b) {
this.setMonDisabledByStatus(b)
}, this);
return this.callParent([a, false])
},
statusArray: function() {
var a = SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT;
return {
dl_resume: {
status: [a.TASK_ERROR, a.TASK_ERROR_BROKEN_LINK, a.TASK_ERROR_DEST_NO_EXIST, a.TASK_ERROR_DEST_DENY, a.TASK_ERROR_DISK_FULL, a.TASK_ERROR_QUOTA_REACHED, a.TASK_ERROR_TIMEOUT, a.TASK_PAUSED, a.TASK_ERROR_EXCEED_MAX_FS_SIZE, a.TASK_ERROR_EXCEED_MAX_TEMP_FS_SIZE, a.TASK_ERROR_EXCEED_MAX_DEST_FS_SIZE, a.TASK_ERROR_NAME_TOO_LONG_ENCRYPTION, a.TASK_ERROR_NAME_TOO_LONG, a.TASK_ERROR_QUOTA_REACHED],
disabled: false
},
dl_stop: {
status: [a.TASK_WAITING, a.TASK_DOWNLOADING, a.TASK_HASH_CHECKING],
disabled: false
},
dl_remove: {
status: [],
disabled: true
},
dl_edit: {
status: [a.TASK_FINISHING, a.TASK_FINISHED],
disabled: true
}
}
},
setMonDisabledByStatus: function(b) {
var a = this.statusArray()[b.itemId];
if (!Ext.isDefined(a) || !Ext.isDefined(a.status) || !Ext.isDefined(a.disabled)) {
return
}
var d = a.status;
var c = a.disabled;
b.mon(this.upperPanel.getSelectionModel(), "rowSelectionChanged", function(g) {
var f = g.getSelections();
if (0 === f.length) {
this.setDisabled(true);
return
}
for (var e = 0; e < f.length; e++) {
if (-1 !== d.indexOf(f[e].get("status"))) {
break
}
}
this.setDisabled((e === f.length) ? !c : c)
}, b)
},
actionCreate: function() {
var a = {
owner: this.appWin,
uicomponents: this.uicomponents
};
var b = new SYNO.SDS.DownloadStation.aMule.CreateTaskWindow(a);
b.open()
},
actionResume: function() {
this.sendRequest("resume", this.getSelectedTaskIDArray())
},
actionPause: function() {
this.sendRequest("pause", this.getSelectedTaskIDArray())
},
actionRemove: function() {
this.getMsgBox().confirm(_DT("tree", "leaf_dlqueue"), _DT("download", "download_cfrm_remove"), function(a, b) {
if (a == "yes") {
this.sendRequest("delete", this.getSelectedTaskIDArray());
this.upperPanel.DLStore.reload()
}
}, this)
},
actionEdit: function() {
var b = SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT;
var f = this.upperPanel.getSelectionModel().getSelections();
var a = false;
for (var d = 0; d < f.length; d++) {
if (f[d].get("status") !== b.TASK_FINISHED && f[d].get("status") !== b.TASK_FINISHING) {
a = true
}
}
if (false === a) {
return
}
var c = {
owner: this.appWin,
selections: f,
uicomponents: this.uicomponents
};
var e = new SYNO.SDS.DownloadStation.aMule.EditTaskWindow(c);
e.open()
},
actionClear: function() {
this.sendRequest("clear", [])
},
getSelectedTaskIDArray: function() {
var c = this.upperPanel.getSelectionModel().getSelections();
var a = [];
for (var b = 0; b < c.length; b++) {
a[b] = c[b].get("task_id")
}
return a
},
sendRequest: function(b, c) {
this.pollingtask.stopById("DownloadGrid");
var a = {};
a.id = c;
if ("delete" === b) {
a.force_complete = false
}
if ("clear" === b) {
b = "delete_condition";
a = {
type: ["emule"],
type_inverse: false,
status: [SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT.TASK_FINISHED],
status_inverse: false
}
}
if (!this.upperPanel.getEl().isMasked()) {
this.upperPanel.getEl().mask(_DT("common", "loading"), "x-mask-loading")
}
this.sendWebAPI({
api: "SYNO.DownloadStation2.Task",
method: b,
params: a,
version: 2,
scope: this,
callback: this.requestDone
})
},
requestDone: function(c, b, a) {
this.upperPanel.getEl().unmask();
if (!c) {
SYNO.SDS.DownloadStation.aMule.Utils.showErrorMessages(this, b)
}
this.pollingtask.startById("DownloadGrid")
},
checkDestSettings: function() {
if (!this.owner.isVisible()) {
return
}
if (this.onceCheckedDestSettings) {
return
}
this.onceCheckedDestSettings = true;
this.setStatusBusy({
text: _T("common", "loading")
});
this.sendWebAPI({
webapi: this.webapiEmuleLocation,
callback: this.onCheckSettings,
scope: this
})
},
onCheckSettings: function(e, b, d, a) {
this.clearStatusBusy();
var c = SYNO.SDS.DownloadStation.aMule.Utils;
if (!e) {
c.showErrorMessages(this, b);
return
}
c.setEmuleDestination(b.default_destination);
if (Ext.isEmpty(b.default_destination)) {
this.mainPanel.alertDestinationEmptyWithLaunchingChooser(this.appWin)
}
},
onActivate: function() {
if (this.panel.getEl().isMasked()) {
this.panel.getEl().unmask()
}
this.checkDestSettings();
if (0 === this.upperPanel.store.getCount()) {
this.upperPanel.DLStore.load({
params: {
start: 0,
limit: this.upperPanel.itemsPerPage
}
})
} else {
this.pollingtask.startById("DownloadGrid", true);
this.pollingtask.startById("DownloadInfo", true)
}
},
onDeactivate: function() {
this.pollingtask.stopById("DownloadGrid");
this.pollingtask.stopById("DownloadInfo")
},
createPollingTask: function() {
this.pollingtask.add({
id: "DownloadGrid",
interval: 5000,
webapi: {
api: "SYNO.Entry.Request",
version: 1,
method: "request",
compound: {
stopwhenerror: false
}
},
single: false,
autoJsonDecode: true,
beforestart: this.onBeforeGridPollingStart,
callback: this.updateGrid,
scope: this
});
this.pollingtask.add({
id: "DownloadStatistic",
interval: 5000,
webapi: this.webapiDownloadStatistic,
single: false,
callback: this.updateDownloadStatistic,
scope: this
})
},
getGridPollingParams: function() {
return {
sort_by: this.upperPanel.getSortParam(),
order: this.upperPanel.DLStore.getSortState().direction,
offset: this.upperPanel.gridStartPosition || 0,
limit: this.upperPanel.itemsPerPage,
additional: ["detail", "transfer"],
type: ["emule"]
}
},
onBeforeGridPollingStart: function(a) {
a.taskCfg.webapi.compound.params = [Ext.apply(this.webapiTaskList, {
params: this.getGridPollingParams()
}), this.webapiDownloadStatistic]
},
updateGrid: function(f, d, e, c) {
if (!d.has_fail) {
if (this.panel.getEl().isMasked()) {
this.panel.getEl().unmask()
}
this.actionGroup.enable("global_search");
this.actionGroup.enable("dl_create")
}
for (var b = 0; b < d.result.length; b++) {
var a = d.result[b];
if (!a.success) {
this.apiErrorHandler(a.error.code);
return
}
if (this.webapiTaskList.api === a.api) {
if (this.upperPanel.DLStore.getTotalCount() != a.data.total) {
this.upperPanel.DLStore.reload()
} else {
if (0 < a.data.total) {
this.upperPanel.updateGridByCommit(a.data)
}
}
if (this.upperPanel.DLStore.getTotalCount() > 0) {
this.actionGroup.enable("dl_clear")
} else {
this.actionGroup.disable("dl_clear")
}
} else {
if (this.webapiDownloadStatistic.api === a.api) {
this.upperPanel.updateDownloadRate(a.data.download_rate)
}
}
}
},
apiErrorHandler: function(a) {
SYNO.SDS.DownloadStation.Utils.setErrorMask(a, this.panel);
this.upperPanel.selModel.clearSelections();
this.actionGroup.disableAll()
},
updateDownloadStatistic: function(d, b, c, a) {
this.pollingtask.stopById("DownloadStatistic");
if (!d) {
this.apiErrorHandler(b.code);
return
}
this.upperPanel.updateDownloadRate(b.download_rate)
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.UploadGridPanel", {
extend: "SYNO.ux.GridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, a || {});
this.itemsPerPage = 50;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.store = this.createStore();
var b = {
store: this.store,
cls: "syno-dl-no-padding-grid",
colModel: this.createColModel(),
bbar: this.createBottombar(),
view: this.createGridView(),
selModel: this.createSelectionModel(),
loadMask: true,
stripeRows: true,
border: false,
enableColumnMove: true,
stateful: true,
stateEvents: ["columnmove", "columnresize", "sortchange"],
initState: (function() {
var d = this.appWin.appInstance.getUserSettings("amuleulqueuegridstates");
var c = SYNO.SDS.DownloadStation.Utils.checkStateValue(d, this.colModel);
if (c) {
if (this.fireEvent("beforestaterestore", this, c) !== false) {
this.applyState(Ext.apply({}, c));
this.fireEvent("staterestore", this, c)
}
}
}
).createDelegate(this),
saveState: (function() {
var c = this.getState();
this.appWin.appInstance.setUserSettings("amuleulqueuegridstates", c)
}
).createDelegate(this),
height: 500,
layout: "fit"
};
return Ext.apply(b, a)
},
createStore: function() {
var a = [{
name: "client_name"
}, {
name: "file_name"
}, {
name: "upload_speed"
}, {
name: "size_uploaded"
}, {
name: "wait_time"
}, {
name: "upload_time"
}];
var b = new SYNO.API.JsonStore({
api: "SYNO.DownloadStation2.Task.eMule",
method: "list_upload",
version: 1,
pruneModifiedRecords: true,
appWindow: this,
autoLoad: false,
root: "task",
totalProperty: "total",
remoteSort: true,
fields: a,
sortInfo: {
field: "id",
direction: "ASC"
},
paramNames: {
start: "offset",
limit: "limit",
sort: "sort_by",
dir: "order"
},
listeners: {
scope: this,
beforeload: this.onBeforeStoreLoad,
load: this.onStoreLoad,
loadexception: this.onStoreLoadException
}
});
this.addManagedComponent(b);
return b
},
onBeforeStoreLoad: function() {
this.pollingtask.stopById("UploadGrid");
this.pollingtask.startById("UploadStatistic")
},
onStoreLoad: function() {
if (this.store.getTotalCount() <= this.gridStartPosition && this.gridStartPosition > 0) {
var a = Math.ceil((this.store.getTotalCount() - this.itemsPerPage) / this.itemsPerPage);
this.store.load({
params: {
start: (a * this.itemsPerPage),
limit: this.itemsPerPage
}
});
return
}
this.pollingtask.startById("UploadGrid", false)
},
onStoreLoadException: function(b, c, a) {
this.owner.errorHandler(a.code);
this.pollingtask.startById("UploadGrid", false)
},
createColModel: function() {
var a = new Ext.grid.ColumnModel({
columns: [{
id: "client_name",
header: _DT("download", "download_list_username"),
dataIndex: "client_name",
width: 135,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.generalColTipRenderer
}, {
id: "file_name",
header: _DT("download", "download_list_filename"),
dataIndex: "file_name",
renderer: SYNO.SDS.DownloadStation.aMule.Utils.generalColTipRenderer
}, {
id: "size_uploaded",
header: _DT("dlqueue", "title_dl_transferred"),
dataIndex: "size_uploaded",
width: 100,
renderer: SYNO.SDS.DownloadStation.Renderers.SizeRenderer
}, {
id: "upload_speed",
header: _DT("download", "download_list_speed"),
dataIndex: "upload_speed",
width: 85,
renderer: function(f, e, b, g, d, c) {
if (0 === f) {
return ("upload_rate" === e.id) ? "" : "0.00 KB/s"
}
return SYNO.SDS.DownloadStation.Renderers.SizeRenderer(f, e, b, g, d, c) + "/s"
}
}, {
id: "wait_time",
header: _DT("ulqueue", "title_time_waited"),
dataIndex: "wait_time",
width: 100,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.timeRender
}, {
id: "upload_time",
header: _DT("ulqueue", "title_time_upload"),
dataIndex: "upload_time",
width: 100,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.timeRender
}],
defaults: {
sortable: true
}
});
return a
},
createBottombar: function() {
this.itemTotalUpRate = new SYNO.SDS.DownloadStation.ToolbarRateItem({
labelText: "UL"
});
var a = new SYNO.ux.PagingToolbar({
store: this.store,
displayInfo: true,
pageSize: this.itemsPerPage,
refreshText: _DT("download", "download_btn_refresh"),
items: [this.itemTotalUpRate, "-"],
autoDestroy: true
});
return a
},
updateUploadRate: function(a) {
this.itemTotalUpRate.updateTextByRate(a)
},
createGridView: function() {
return new SYNO.SDS.DownloadStation.GridView()
},
createSelectionModel: function() {
var a = new Ext.grid.RowSelectionModel({
singleSelect: false
});
return a
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.Upload", {
extend: "SYNO.SDS.DownloadStation.RightPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.webapiUpload = {
api: "SYNO.DownloadStation2.Task.eMule",
method: "list_upload",
version: 1
};
this.webapiStatistic = {
api: "SYNO.DownloadStation2.Task.Statistic",
method: "get",
version: 1
};
this.createPollingTask();
this.callParent(arguments)
},
createPanel: function(a) {
var b = Ext.apply({
tbar: this.fillToolbarConfig()
}, a);
return new SYNO.SDS.DownloadStation.aMule.UploadGridPanel(b)
},
createActionGroup: function() {
var a = [];
a.push(new Ext.Button({
tooltip: _DT("download", "download_btn_refresh"),
iconCls: "syno-dl-a_bt_refresh",
itemId: "refresh",
scope: this,
handler: this.actionRefresh
}));
return this.callParent([a, false])
},
actionRefresh: function() {
this.panel.store.reload()
},
onActivate: function() {
if (this.panel.getEl().isMasked()) {
this.panel.getEl().unmask()
}
if (0 === this.getPanel().store.getCount()) {
this.panel.store.load({
params: {
start: 0,
limit: this.panel.itemsPerPage
}
})
} else {
this.pollingtask.startById("UploadGrid", true)
}
},
onDeactivate: function() {
this.pollingtask.stopById("UploadGrid");
this.pollingtask.stopById("UploadStatistic")
},
createPollingTask: function() {
this.pollingtask.add({
id: "UploadGrid",
interval: 5000,
webapi: {
api: "SYNO.Entry.Request",
version: 1,
method: "request",
compound: {
stopwhenerror: false
}
},
single: false,
beforestart: this.onBeforeGridPollingStart,
callback: this.updateGrid,
scope: this
});
this.pollingtask.add({
id: "UploadStatistic",
interval: 5000,
webapi: Ext.apply(this.webapiStatistic, {
params: {
type: ["emule"],
type_inverse: false
}
}),
single: false,
callback: this.updateStatistic,
scope: this
})
},
updateStatistic: function(d, b, c, a) {
this.pollingtask.stopById("UploadStatistic");
if (!d) {
return
}
this.panel.updateUploadRate(b.upload_rate)
},
onBeforeGridPollingStart: function(a) {
a.taskCfg.webapi.compound.params = [Ext.apply(this.webapiStatistic, {
params: {
type: ["emule"],
type_inverse: false
}
}), Ext.apply(this.webapiUpload, {
params: this.getGridPollingParams()
})]
},
updateGrid: function(g, e, f, c) {
if (!g) {
this.errorHandler(e.error.code);
return
}
if (e.has_fail) {
var d;
Ext.each(e.result, function(i, h) {
if (false === i.success) {
d = i.error.code
}
}, this);
this.errorHandler(d);
return
}
if (this.panel.getEl().isMasked()) {
this.panel.getEl().unmask()
}
this.actionGroup.enableAll();
var b;
var a;
Ext.each(e.result, function(i, h) {
if (i.api === this.webapiUpload.api) {
b = i.data
} else {
if (i.api === this.webapiStatistic.api) {
a = i.data
}
}
}, this);
if (Ext.isDefined(b)) {
this.updateStore(b)
}
if (Ext.isDefined(a)) {
this.panel.updateUploadRate(a.upload_rate)
}
},
updateStore: function(c) {
var b = c.task;
if (this.panel.store.getCount() != b.length) {
this.panel.store.loadData(c, false)
} else {
if (0 < b.length) {
for (var a = 0; a < b.length; a++) {
var d = this.panel.store.getAt(a);
d.data.client_name = b[a].client_name;
d.data.file_name = b[a].file_name;
d.data.size_uploaded = b[a].size_uploaded;
d.data.wait_time = b[a].wait_time;
d.data.upload_time = b[a].upload_time;
d.data.upload_speed = b[a].upload_speed;
d.commit()
}
}
}
},
getGridPollingParams: function() {
return {
sort_by: this.panel.getStore().getSortState().field,
order: this.panel.getStore().getSortState().direction,
offset: this.panel.getStore().lastOptions.params.offset || 0,
limit: this.panel.itemsPerPage
}
},
errorHandler: function(a) {
SYNO.SDS.DownloadStation.Utils.setErrorMask(a, this.panel);
this.panel.selModel.clearSelections();
this.actionGroup.disableAll()
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.ServerGridPanel", {
extend: "SYNO.ux.GridPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, a || {});
this.itemsPerPage = 50;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.webapiList = {
api: "SYNO.DownloadStation2.eMule.Server",
method: "list",
version: 1
};
this.store = this.createStore();
var b = {
scope: this,
store: this.store,
cls: "syno-dl-no-padding-grid",
colModel: this.createColModel(),
bbar: this.createBottombar(),
view: this.createGridView(),
selModel: this.createSelectionModel(),
loadMask: true,
stripeRows: true,
border: false,
enableColumnMove: true,
stateful: true,
stateEvents: ["columnmove", "columnresize", "sortchange"],
initState: (function() {
var d = this.appWin.appInstance.getUserSettings("amuleservergridstates");
var c = SYNO.SDS.DownloadStation.Utils.checkStateValue(d, this.colModel);
if (c) {
if (this.fireEvent("beforestaterestore", this, c) !== false) {
this.applyState(Ext.apply({}, c));
this.fireEvent("staterestore", this, c)
}
}
}
).createDelegate(this),
saveState: (function() {
var c = this.getState();
this.appWin.appInstance.setUserSettings("amuleservergridstates", c)
}
).createDelegate(this),
height: 500,
layout: "fit",
listeners: {
celldblclick: {
scope: this.owner,
fn: function(f, g, d) {
var c = this.panel.store.getAt(g);
this.connectServerByIP(c)
}
}
}
};
return Ext.apply(b, a)
},
createStore: function() {
var a = [{
name: "id"
}, {
name: "ip"
}, {
name: "port"
}, {
name: "name"
}, {
name: "description"
}, {
name: "ping"
}, {
name: "user_count"
}, {
name: "user_max"
}, {
name: "file_count"
}];
var b = new SYNO.API.JsonStore({
api: this.webapiList.api,
method: this.webapiList.method,
version: this.webapiList.version,
pruneModifiedRecords: true,
appWindow: this,
autoLoad: false,
root: "results",
totalProperty: "total",
remoteSort: true,
fields: a,
sortInfo: {
field: "user",
direction: "DESC"
},
paramNames: {
start: "offset",
limit: "limit",
sort: "sort_by",
dir: "order"
},
listeners: {
scope: this,
beforeload: this.onBeforeStoreLoad,
load: this.onStoreLoad,
loadexception: this.onStoreLoadException
}
});
this.addManagedComponent(b);
return b
},
createColModel: function() {
var a = new Ext.grid.ColumnModel({
columns: [{
id: "ip",
header: _DT("server", "title_server_ip_address"),
dataIndex: "ip",
width: 120,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.serverColRenderer
}, {
id: "name",
header: _DT("server", "title_server_name"),
dataIndex: "name",
width: 180,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.serverColTipRenderer
}, {
id: "description",
header: _DT("server", "title_server_desc"),
dataIndex: "description",
renderer: SYNO.SDS.DownloadStation.aMule.Utils.serverColTipRenderer
}, {
id: "port",
header: _DT("server", "title_server_port"),
dataIndex: "port",
width: 60,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.serverColRenderer
}, {
id: "ping",
header: _DT("server", "title_server_ping"),
dataIndex: "ping",
width: 60,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.serverColRenderer
}, {
id: "user_count",
header: _DT("server", "title_server_user_count"),
dataIndex: "user_count",
width: 80,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.serverColUnitRenderer
}, {
id: "user_max",
header: _DT("server", "title_server_max_user"),
dataIndex: "user_max",
width: 80,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.serverColUnitRenderer
}, {
id: "file_count",
header: _DT("server", "title_server_file_count"),
dataIndex: "file_count",
width: 80,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.serverColUnitRenderer
}],
defaults: {
sortable: true
}
});
return a
},
createBottombar: function() {
return new SYNO.ux.Panel({
height: "50",
layoutConfig: {
type: "vbox",
align: "stretch"
},
items: [this.createConnectBar(), this.createPageBar()]
})
},
createConnectBar: function() {
this.txtED2KConn = new Ext.Toolbar.TextItem("<b>ED2K: </b>");
this.txtKadConn = new Ext.Toolbar.TextItem("<b>Kad: </b>");
var a = new Ext.Toolbar({
items: [this.txtED2KConn, "-", this.txtKadConn]
});
return a
},
createPageBar: function() {
var a = new SYNO.ux.PagingToolbar({
store: this.store,
displayInfo: true,
pageSize: this.itemsPerPage,
refreshText: _DT("download", "download_btn_refresh"),
autoDestroy: true
});
return a
},
createGridView: function() {
return new SYNO.SDS.DownloadStation.GridView()
},
createSelectionModel: function() {
var a = new Ext.grid.RowSelectionModel({
singleSelect: false,
listeners: {
selectionchange: {
scope: this,
fn: this.gridSelectionChange
}
}
});
a.addEvents({
rowSelectionChanged: true
});
return a
},
gridSelectionChange: function(a) {
if (!this.gridSelectionChangeTask) {
this.gridSelectionChangeTask = new Ext.util.DelayedTask(function() {
a.fireEvent("rowSelectionChanged", a)
}
,a)
}
this.gridSelectionChangeTask.delay(300)
},
onBeforeStoreLoad: function(a, b) {
if ("undefined" != typeof (b.params.start)) {
this.gridStartPosition = b.params.start
} else {
this.gridStartPosition = 0
}
this.pollingtask.stopById("ServerGrid");
this.pollingtask.startById("UploadServerStatus")
},
onStoreLoad: function(b, a, c) {
if (this.store.getTotalCount() <= this.gridStartPosition && this.gridStartPosition > 0) {
var d = Math.ceil((this.store.getTotalCount() - this.itemsPerPage) / this.itemsPerPage);
this.store.load({
params: {
start: (d * this.itemsPerPage),
limit: this.itemsPerPage
}
});
return
}
this.pollingtask.startById("ServerGrid", false)
},
onStoreLoadException: function(b, c, a) {
this.owner.errorHandler(a.code);
this.pollingtask.startById("ServerGrid", false)
},
applyColorToString: function(b, a) {
switch (a) {
case "red":
return "<font color=#E64040>" + b + "</font>";
case "green":
return "<font color=#009E05>" + b + "</font>";
default:
return b
}
},
updateStatusED2K: function(b) {
var c = this.txtED2KConn.getEl();
var a = "<b>ED2K:</b> ";
if ("connected" === b.status) {
a += this.applyColorToString(_DT("server", "title_server_connected"), "green") + " [" + b.server_name + " [" + b.server_id + "] ";
if (b.is_high_id === true) {
a += " (" + _DT("server", "title_peer_high_id") + ")"
} else {
a += " " + this.applyColorToString("(" + _DT("server", "title_peer_low_id") + ")", "red")
}
a += "]";
this.highLightServer(b.server_id, true)
} else {
if ("connecting" == b.status) {
a += _DT("server", "title_server_connecting")
} else {
a += this.applyColorToString(_DT("server", "title_server_not_connected"), "red")
}
}
c.update(a)
},
updateStatusKad: function(c) {
var b = this.txtKadConn.getEl();
var a = "<b>Kad:</b> ";
if ("connected" === c.status) {
a += this.applyColorToString(_DT("server", "title_server_connected"), "green");
if (c.firewalled) {
a += " " + this.applyColorToString("(" + _DT("server", "title_kad_firewall") + ")", "red")
}
} else {
if ("connecting" == c.status) {
a += _DT("server", "title_server_connecting")
} else {
a += this.applyColorToString(_DT("server", "title_server_not_connected"), "red")
}
}
b.update(a)
},
updateConnectionStatus: function(b) {
var c = b.ED2K;
var a = b.Kad;
this.owner.gDataED2K = c;
this.owner.gDataKad = a;
if (0 === this.store.getTotalCount()) {
this.owner.actionGroup.disable("connection")
} else {
this.owner.actionGroup.enable("connection")
}
if ("not connected" !== c.status || "not connected" !== a.status) {
this.owner.actionGroup.enable("disconnect")
} else {
this.owner.actionGroup.disable("disconnect")
}
this.updateStatusED2K(c);
this.updateStatusKad(a)
},
highLightServer: function(c, a) {
var b = this.store.getById(c);
if (b) {
b.set("CONNECTED", a);
this.store.commitChanges()
}
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.AddServerWindow", {
extend: "SYNO.SDS.ModalWindow",
constructor: function(a) {
var b = this.fillConfig(a);
this.store = a.store;
this.callParent([b])
},
fillConfig: function(a) {
this.formPanel = this.createForm(a);
this.webapiAdd = {
api: "SYNO.DownloadStation2.eMule.Server",
method: "add",
version: 1
};
var b = {
owner: a.owner,
cls: "syno-dl-win",
dsmStyle: "v5",
resizable: false,
title: _DT("server", "title_add_new_server"),
width: 488,
height: 383,
layout: "fit",
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
btnStyle: "blue",
text: _DT("common", "addto"),
scope: this,
handler: this.addServer
}, {
xtype: "syno_button",
text: _DT("common", "close"),
scope: this,
handler: this.close
}),
items: this.formPanel
};
return Ext.apply(b, a)
},
createForm: function(a) {
var b = {
trackResetOnLoad: true,
bodyStyle: "padding: 0",
frame: false,
border: false,
method: "POST",
listeners: {
afterlayout: {
single: true,
scope: this,
fn: this.onAfterLayout
}
},
items: [{
xtype: "syno_radio",
boxLabel: _DT("server", "title_server_ip"),
name: "add_type",
inputValue: "IP",
checked: true
}, {
xtype: "syno_compositefield",
indent: 1,
hideLabel: true,
items: [{
xtype: "syno_displayfield",
value: _DT("server", "title_server_ip_address") + _T("common", "colon")
}, {
xtype: "syno_textfield",
name: "IP",
value: "",
validateOnBlur: true,
validationEvent: "blur",
width: 120,
maxLength: 15,
vtype: "ip"
}, {
xtype: "syno_displayfield",
value: _DT("server", "title_server_port") + _T("common", "colon"),
indent: 1
}, {
xtype: "syno_numberfield",
indent: 1,
name: "port",
value: "",
validateOnBlur: true,
validationEvent: "blur",
width: 80,
maxLength: 5,
vtype: "port"
}]
}, {
xtype: "syno_radio",
boxLabel: _DT("server", "title_server_link"),
name: "add_type",
inputValue: "ED2KLINK",
checked: false
}, {
xtype: "syno_textfield",
hideLabel: true,
indent: 1,
name: "link",
value: "",
maxlength: 4096,
width: 400
}, {
xtype: "syno_displayfield",
indent: 1,
value: "( eg. ed2k://|server|<IP>|<port>|/ )"
}, {
xtype: "syno_radio",
boxLabel: _DT("server", "title_server_met_link"),
name: "add_type",
inputValue: "METURL",
checked: false
}, {
xtype: "syno_textfield",
hideLabel: true,
indent: 1,
name: "meturl",
value: "",
maxlength: 4096,
width: 400
}, {
xtype: "syno_displayfield",
indent: 1,
value: "( eg. http://www.synology.com/server.met)"
}]
};
b = Ext.apply(b, a);
return new SYNO.ux.FormPanel(b)
},
onAfterLayout: function() {
var a = this.formPanel.getForm();
new SYNO.ux.Utils.EnableRadioGroup(a,"add_type",{
IP: ["IP", "port"],
ED2KLINK: ["link"],
METURL: ["meturl"]
})
},
addServer: function() {
var c = this.formPanel.getForm();
var e = c.findField("add_type").getGroupValue();
var g = {};
if ("IP" === e) {
var f = c.findField("IP").getValue();
var b = c.findField("port").getValue();
f = Ext.util.Format.trim(f);
c.findField("IP").setValue(f);
if ("" === f) {
this.getMsgBox().alert(_DT("tree", "leaf_server"), _DT("server", "error_server_empty_ip"));
return
} else {
if ("" === b) {
this.getMsgBox().alert(_DT("tree", "leaf_server"), _DT("server", "error_server_empty_port"));
return
} else {
if (!c.findField("IP").isValid() || !c.findField("port").isValid()) {
this.getMsgBox().alert(_DT("tree", "leaf_server"), _DT("common", "forminvalid"));
return
}
}
}
g = {
type: "ip",
ip: f,
port: b
}
} else {
if ("ED2KLINK" === e) {
var d = c.findField("link").getValue();
d = Ext.util.Format.trim(d);
c.findField("link").setValue(d);
if ("" === d) {
this.getMsgBox().alert(_DT("tree", "leaf_server"), _DT("server", "error_server_empty_link"));
return
} else {
if (!SYNO.SDS.DownloadStation.aMule.Utils.isValidED2KLink("server", d)) {
this.getMsgBox().alert(_DT("tree", "leaf_server"), _DT("server", "error_server_invalid_link"));
return
}
}
g = {
type: "ed2k_link",
ed2k_link: d
}
} else {
if ("METURL" === e) {
var a = c.findField("meturl").getValue();
a = Ext.util.Format.trim(a);
c.findField("meturl").setValue(a);
if ("" === a) {
this.getMsgBox().alert(_DT("tree", "leaf_server"), _DT("download", "download_empty_input_url"));
return
} else {
if (!SYNO.SDS.DownloadStation.aMule.Utils.isValidMetLink(a)) {
this.getMsgBox().alert(_DT("tree", "leaf_server"), _DT("server", "error_server_invalid_met_url"));
return
}
}
g = {
type: "met_link",
met_link: a
}
}
}
}
this.doAddServer(g)
},
doAddServer: function(a) {
this.setStatusBusy({
text: _DT("common", "saving")
});
SYNO.API.Request({
webapi: Ext.apply(this.webapiAdd, {
params: a
}),
callback: this.addServerDone,
scope: this
})
},
addServerDone: function(d, b, c, a) {
this.clearStatusBusy();
if (!d) {
SYNO.SDS.DownloadStation.aMule.Utils.showErrorMessages(this, b);
return
}
this.store.reload();
this.close()
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.Server", {
extend: "SYNO.SDS.DownloadStation.RightPanel",
constructor: function(a) {
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
this.webapiList = {
api: "SYNO.DownloadStation2.eMule.Server",
method: "list",
version: 1
};
this.webapiGetStatus = {
api: "SYNO.DownloadStation2.eMule.Server",
method: "get_status",
version: 1
};
this.webapiDelete = {
api: "SYNO.DownloadStation2.eMule.Server",
method: "delete",
version: 1
};
this.webapiConnect = {
api: "SYNO.DownloadStation2.eMule.Server",
method: "connect",
version: 1
};
this.webapiConnectKad = {
api: "SYNO.DownloadStation2.eMule.Server",
method: "connect_kad",
version: 1
};
this.webapiDisconnect = {
api: "SYNO.DownloadStation2.eMule.Server",
method: "disconnect",
version: 1
};
this.createPollingTask();
this.callParent(arguments)
},
createPanel: function(a) {
var b = Ext.apply({
tbar: this.fillToolbarConfig()
}, a);
return new SYNO.SDS.DownloadStation.aMule.ServerGridPanel(b)
},
createActionGroup: function() {
var c, b;
var a = [new Ext.Button({
tooltip: _DT("server", "title_add_new_server"),
iconCls: "syno-dl-a_bt_create",
itemId: "create",
scope: this,
handler: this.actionCreate
}), b = new Ext.Button({
tooltip: _DT("server", "tooltip_server_connecting"),
iconCls: "syno-dl-a_bt_connect",
itemId: "connect",
scope: this,
handler: this.actionConnect
}), new Ext.Button({
tooltip: _DT("server", "tooltip_server_disconnect"),
iconCls: "syno-dl-a_bt_disconnect",
itemId: "disconnect",
scope: this,
handler: this.actionDisconnect
}), c = new Ext.Button({
tooltip: _DT("server", "tooltip_server_delete"),
iconCls: "syno-dl-a_bt_delete",
disabled: true,
itemId: "remove",
scope: this,
handler: this.actionRemove
})];
c.mon(this.panel.getSelectionModel(), "rowSelectionChanged", function(e) {
var d = true;
if (e.getCount() >= 1) {
d = false
}
this.setDisabled(d)
}, c);
b.mon(this.panel.getSelectionModel(), "rowSelectionChanged", function(e) {
var d = true;
if (1 === e.getCount()) {
d = false
}
this.setDisabled(d)
}, b);
return this.callParent([a, false])
},
onActivate: function() {
if (this.panel.getEl().isMasked()) {
this.panel.getEl().unmask()
}
this.panel.store.load({
params: {
start: 0,
limit: this.panel.itemsPerPage
}
})
},
onDeactivate: function() {
this.pollingtask.stopById("ServerGrid")
},
createPollingTask: function() {
this.pollingtask.add({
id: "ServerGrid",
interval: 5000,
webapi: {
api: "SYNO.Entry.Request",
version: 1,
method: "request",
compound: {
stopwhenerror: false
}
},
single: false,
beforestart: this.onBeforeGridPollingStart,
callback: this.updateGrid,
scope: this
});
this.pollingtask.add({
id: "UploadServerStatus",
interval: 5000,
webapi: this.webapiGetStatus,
single: false,
callback: this.updateServerStatus,
scope: this
})
},
updateServerStatus: function(d, b, c, a) {
this.pollingtask.stopById("UploadServerStatus");
if (!d) {
this.errorHandler(b.code);
return
}
this.panel.updateConnectionStatus(b)
},
onBeforeGridPollingStart: function(a) {
a.taskCfg.webapi.compound.params = [this.webapiGetStatus, Ext.apply(this.webapiList, {
params: this.getGridPollingParams()
})]
},
getGridPollingParams: function() {
return {
sort_by: this.panel.store.sortInfo.field,
order: this.panel.store.sortInfo.direction,
start: this.panel.gridStartPosition,
limit: this.panel.itemsPerPage
}
},
updateGrid: function(g, e, f, c) {
if (!g) {
this.errorHandler(e.error.code);
return
}
if (e.has_fail) {
var d;
Ext.each(e.result, function(i, h) {
if (false === i.success) {
d = i.error.code
}
}, this);
this.errorHandler(d);
return
}
if (this.panel.getEl().isMasked()) {
this.panel.getEl().unmask()
}
this.actionGroup.enable("global_search");
this.actionGroup.enable("create");
this.actionGroup.enable("connect");
var b;
var a;
Ext.each(e.result, function(i, h) {
if (i.method === this.webapiList.method) {
b = i.data
} else {
if (i.method === this.webapiGetStatus.method) {
a = i.data
}
}
}, this);
if (Ext.isDefined(b)) {
this.updateStore(b)
}
if (Ext.isDefined(a)) {
this.panel.updateConnectionStatus(a)
}
},
updateStore: function(c) {
var e = false;
var b = c.results;
if (this.panel.store.getCount() != b.length) {
e = true
} else {
if (0 < b.length) {
for (var a = 0; a < b.length; a++) {
var d = this.panel.store.getAt(a);
if (!d) {
e = true;
break
}
d.data.id = b[a].id;
d.data.ip = b[a].ip;
d.data.port = b[a].port;
d.data.name = b[a].name;
d.data.description = b[a].description;
d.data.ping = b[a].ping;
d.data.user_count = b[a].user_count;
d.data.user_max = b[a].user_max;
d.data.file_count = b[a].file_count;
d.commit()
}
}
}
if (e) {
this.panel.store.loadData(c, false)
}
},
actionCreate: function() {
var a = {
owner: this.appWin,
store: this.panel.store
};
var b = new SYNO.SDS.DownloadStation.aMule.AddServerWindow(a);
b.open()
},
actionRemove: function() {
if (!this.panel.getSelectionModel().hasSelection()) {
this.getMsgBox().alert(_DT("tree", "leaf_server"), _DT("download", "download_warning_select_items"));
return
}
var a = this.panel.getSelectionModel().getSelections();
this.getMsgBox().confirm(_DT("tree", "leaf_server"), _DT("server", "title_server_delete_cfrm"), function(b, c) {
if (b == "yes") {
this.deleteServer(a)
}
}, this)
},
deleteServer: function(b) {
var a = [];
for (var c = 0; c < b.length; c++) {
a.push(b[c].id)
}
this.sendRequest(Ext.apply(this.webapiDelete, {
params: {
id: a
}
}))
},
actionConnect: function() {
if (this.panel.getSelectionModel().hasSelection()) {
this.connectServerByIP(this.panel.getSelectionModel().getSelected())
} else {
this.connectServer()
}
},
connectServerByIP: function(a) {
var b = {
api: "SYNO.Entry.Request",
version: 1,
method: "request",
compound: {
stopwhenerror: false,
params: [Ext.apply(this.webapiConnect, {
params: {
id: a.get("id")
}
}), this.webapiConnectKad]
}
};
this.sendRequest(b)
},
connectServer: function() {
if (0 >= this.panel.store.getTotalCount()) {
return
}
this.sendRequest(this.webapiConnect)
},
actionDisconnect: function() {
if ("connected" == this.gDataED2K.status || "connected" == this.gDataKad.status || "connecting" == this.gDataED2K.status || "connecting" == this.gDataKad.status) {
this.disconnectServer()
}
},
disconnectServer: function() {
this.sendRequest(Ext.apply(this.webapiDisconnect, {
params: {
type: "all"
}
}))
},
sendRequest: function(a) {
this.pollingtask.stopById("ServerGrid");
this.setStatusBusy({
text: _DT("common", "loading")
});
SYNO.API.Request({
webapi: a,
callback: this.requestDone,
scope: this
})
},
requestDone: function(e, b, d, a) {
this.clearStatusBusy();
if (!e) {
SYNO.SDS.DownloadStation.aMule.Utils.showErrorMessages(this, b)
}
if (Ext.isDefined(b) && b.has_fail) {
var c;
Ext.each(b.result, function(g, f) {
if (false === g.success) {
c = g.error
}
}, this);
SYNO.SDS.DownloadStation.aMule.Utils.showErrorMessages(this, c)
}
this.panel.store.reload()
},
errorHandler: function(a) {
SYNO.SDS.DownloadStation.Utils.setErrorMask(a, this.panel);
this.panel.selModel.clearSelections();
this.actionGroup.disableAll()
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.SearchGridPanel", {
extend: "SYNO.ux.GridPanel",
constructor: function(a, c) {
this.requestParams = c;
this.maxRequestTimes = 5;
Ext.apply(this, a.uicomponents || {});
Ext.apply(this, a || {});
this.itemsPerPage = 50;
var b = this.fillConfig(a);
this.callParent([b])
},
fillConfig: function(a) {
this.webapiStart = {
api: "SYNO.DownloadStation2.eMule.Search",
method: "start",
version: 1
};
this.webapiStop = {
api: "SYNO.DownloadStation2.eMule.Search",
method: "stop",
version: 1
};
this.webapiList = {
api: "SYNO.DownloadStation2.eMule.Search",
method: "list",
version: 1
};
this.store = this.createStore();
var b = {
store: this.store,
colModel: this.createColModel(),
bbar: this.createBottombar(),
view: this.createGridView(),
selModel: this.createSelectionModel(),
loadMask: true,
stripeRows: true,
border: false,
enableColumnMove: true,
stateful: true,
stateEvents: ["columnmove", "columnresize", "sortchange"],
initState: (function() {
var d = this.appWin.appInstance.getUserSettings("amulesearchgridstates");
var c = SYNO.SDS.DownloadStation.Utils.checkStateValue(d, this.colModel);
if (c) {
if (this.fireEvent("beforestaterestore", this, c) !== false) {
this.applyState(Ext.apply({}, c));
this.fireEvent("staterestore", this, c)
}
}
}
).createDelegate(this),
saveState: (function() {
var c = this.getState();
this.appWin.appInstance.setUserSettings("amulesearchgridstates", c)
}
).createDelegate(this),
listeners: {
afterlayout: {
single: true,
scope: this,
fn: function() {
this.sendSearchRequest()
}
},
beforeclose: {
scope: this,
fn: this.onBeforeClose
},
celldblclick: {
scope: this.owner,
fn: this.owner.actionDownload
},
activate: function(d) {
var c = d.getEl();
if (c.isMasked()) {
c.child(".ext-el-mask-msg").center(c)
}
}
}
};
return Ext.apply(b, a)
},
createStore: function() {
this.gridStartPosition = 0;
var a = [{
name: "file_id"
}, {
name: "filename"
}, {
name: "file_size"
}, {
name: "source"
}, {
name: "completed_source"
}, {
name: "file_type"
}, {
name: "file_has_downloaded"
}];
var b = new SYNO.API.JsonStore({
api: this.webapiList.api,
method: this.webapiList.method,
version: this.webapiList.version,
pruneModifiedRecords: true,
appWindow: this,
autoLoad: false,
root: "results",
totalProperty: "total",
remoteSort: true,
fields: a,
sortInfo: {
field: "source",
direction: "DESC"
},
paramNames: {
start: "offset",
limit: "limit",
sort: "sort_by",
dir: "order"
},
listeners: {
scope: this,
beforeload: this.onBeforeStoreLoad,
load: this.onStoreLoad,
loadexception: this.onStoreLoadException
}
});
this.addManagedComponent(b);
return b
},
onBeforeStoreLoad: function(a, b) {
if (!this.requestParams || "" === this.requestParams) {
return false
}
this.pollingtask.stopById("search-" + this.requestParams.id)
},
onStoreLoad: function(b, a, c) {
this.pollingtask.startById("search-" + this.requestParams.id, false)
},
onStoreLoadException: function(b, c, a) {
this.errorHandler(a.code)
},
onBeforeClose: function() {
var a = this.requestParams.id;
if (0 === a) {
this.pollingtask.removeById("search-request" + this.requestParams.keyword)
} else {
if (0 < a) {
this.pollingtask.removeById("search-" + a);
this.stopSearch(a)
}
}
},
stopSearch: function(b) {
var a = {};
if (Ext.isDefined(b)) {
a.id = b
} else {
a.id = 0
}
SYNO.API.Request({
webapi: Ext.apply(this.webapiStop, {
params: a
}),
callback: function(f, d, e, c) {
if (!f) {
SYNO.Debug("Failed to stop search " + d.code);
return
}
},
scope: this
})
},
createColModel: function() {
var a = new Ext.grid.ColumnModel({
columns: [{
id: "filename",
dataIndex: "filename",
header: _DT("download", "download_list_filename"),
width: 275,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.searchColTipRenderer
}, {
id: "file_size",
dataIndex: "file_size",
header: _DT("download", "download_list_filesize"),
width: 120,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.searchColSizeRenderer
}, {
id: "source",
dataIndex: "source",
header: _DT("dlqueue", "title_dl_source"),
width: 100,
renderer: SYNO.SDS.DownloadStation.aMule.Utils.searchColSourceRenderer
}, {
id: "file_type",
dataIndex: "file_type",
header: _DT("search", "title_file_type"),
width: 120,
renderer: this.fileTypeRender
}],
defaults: {
sortable: true
}
});
return a
},
fileTypeRender: function(h, f, a, e, g, b) {
var c = _DT("search", "title_file_type_any");
switch (h) {
case "audio":
c = _DT("search", "title_file_type_audio");
break;
case "video":
c = _DT("search", "title_file_type_video");
break;
case "image":
c = _DT("search", "title_file_type_pic");
break;
case "doc":
c = _DT("search", "title_file_type_doc");
break;
case "prog":
c = _DT("search", "title_file_type_program");
break;
case "archive":
c = _DT("search", "title_file_type_archive");
break;
case "iso":
c = _DT("search", "title_file_type_image");
break;
default:
c = _DT("search", "title_file_type_any")
}
var d = Ext.util.Format.htmlEncode(c);
if (a.data.file_has_downloaded === true) {
d = "<font color=#E64040>" + d + "</font>"
} else {
if (parseInt(a.data.source, 10) >= 50) {
d = "<font color=#057FEB>" + d + "</font>"
}
}
return d
},
createBottombar: function() {
this.txtSearching = new Ext.Toolbar.TextItem("");
var a = new SYNO.ux.PagingToolbar({
store: this.store,
displayInfo: true,
pageSize: this.itemsPerPage,
refreshText: _DT("download", "download_btn_refresh"),
items: this.txtSearching,
autoDestroy: true
});
return a
},
createGridView: function() {
return new SYNO.SDS.DownloadStation.GridView()
},
createSelectionModel: function() {
var a = new Ext.grid.RowSelectionModel({
singleSelect: false
});
return a
},
sendSearchRequest: function(b) {
var a;
if (!this.requestParams || "" === this.requestParams) {
return
}
if (Ext.isObject(b)) {
a = b
} else {
a = this.requestParams
}
this.pollingtask.add({
id: "search-request" + this.requestParams.keyword,
interval: 5000,
webapi: Ext.apply(this.webapiStart, {
params: a
}),
single: false,
beforestart: this.beforeRequest,
callback: this.requestDone,
scope: this
});
this.pollingtask.startById("search-request" + this.requestParams.keyword)
},
beforeRequest: function() {
if (this.requestParams && this.requestParams.id && 0 < this.requestParams.id) {
this.pollingtask.removeById("search-" + this.requestParams.id)
}
if (this.getEl().isMasked()) {
this.getEl().unmask()
}
this.getEl().mask(_DT("search", "title_searching"), "x-mask-loading")
},
requestDone: function(d, b, c, a) {
if (this.isDestroyed || !this.store) {
return
}
if (!this.store) {
if (d && b.id) {
this.stopSearch(b.id)
}
return
}
if (!d) {
if (2703 === b.code) {
return
}
this.pollingtask.removeById("search-request" + this.requestParams.keyword);
this.errorHandler(b.code);
return
}
this.pollingtask.removeById("search-request" + this.requestParams.keyword);
this.requestParams.id = b.id;
this.store.baseParams.id = b.id;
this.createPollingTask(b);
this.pollingtask.startById.defer(3000, this.pollingtask, ["search-" + b.id]);
this.updateSearchingTextTask.start()
},
createPollingTask: function(a) {
this.pollingtask.add({
id: "search-" + a.id,
interval: 5000,
webapi: this.webapiList,
single: false,
autoJsonDecode: true,
beforestart: this.onBeforeGridPollingStart,
callback: this.updateGrid,
scope: this
});
this.updateSearchingTextTask = this.addTask({
id: "updateSearchingTextTask",
interval: 1000,
scope: this,
run: this.updateSearchingText
})
},
onBeforeGridPollingStart: function(a) {
if (this.isDestroyed || !this.store) {
return false
}
a.taskCfg.webapi.params = {
sort_by: this.store.sortInfo.field,
order: this.store.sortInfo.direction,
offset: this.gridStartPosition,
limit: this.itemsPerPage,
id: this.requestParams.id
}
},
updateGrid: function(e, c, d, b) {
if (this.isDestroyed || !this.store) {
return
}
if (!e) {
this.errorHandler(c.code);
return
}
var a = this.txtSearching.getEl();
if (Ext.isDefined(this.requestTimes)) {
this.requestTimes = 1
}
if (c.search_done || (this.requestTimes >= this.maxRequestTimes)) {
this.requestTimes = 1;
this.pollingtask.removeById("search-" + d.id);
this.updateSearchingTextTask.stop();
if (this.getEl().isMasked()) {
this.getEl().unmask()
}
if (c.total < 1) {
this.getEl().mask(_DT("search", "no_match_search_item"))
}
a.update("")
} else {
this.requestTimes++
}
if (c.total > 0 && this.getEl().isMasked()) {
this.getEl().unmask()
}
if (this.store.getTotalCount() != c.total) {
this.store.loadData(c, false)
}
},
updateSearchingText: function() {
var a = this.txtSearching.getEl();
if ("undefined" === typeof (this.gDotCount)) {
this.gDotCount = -1
}
switch (this.gDotCount) {
case 0:
a.update(_DT("search", "title_searching") + ".&nbsp;&nbsp;");
this.gDotCount++;
break;
case 1:
a.update(_DT("search", "title_searching") + "..&nbsp;");
this.gDotCount++;
break;
case 2:
a.update(_DT("search", "title_searching") + "...");
this.gDotCount++;
break;
default:
a.update(_DT("search", "title_searching") + "&nbsp;&nbsp;&nbsp;");
this.gDotCount = 0;
break
}
},
errorHandler: function(a) {
SYNO.SDS.DownloadStation.Utils.setErrorMask(a, this)
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.AdvancedSearchPanel", {
extend: "SYNO.ux.FormPanel",
fieldWidth: 217,
constructor: function(a) {
Ext.apply(this, a || {});
var b = this.fillConfig(a);
this.callParent([b]);
this.keywordField = this.getForm().findField("keyword")
},
fillConfig: function(a) {
var b = {
cls: "syno-amule-search-panel",
width: 450,
autoFlexcroll: false,
buttons: SYNO.SDS.DownloadStation.Utils.composeButtonCfg({
xtype: "syno_button",
btnStyle: "blue",
text: _DT("tree", "leaf_search"),
scope: this,
handler: this.onSearch
}, [{
xtype: "syno_button",
text: _DT("common", "reset"),
scope: this,
handler: this.onReset
}, {
xtype: "syno_button",
text: _DT("common", "close"),
minWidth: 80,
scope: this,
handler: this.onClose
}]),
items: [{
xtype: "syno_fieldset",
padding: 0,
items: [{
xtype: "syno_textfield",
hideLabel: false,
fieldLabel: _DT("search", "title_keyword"),
name: "keyword",
allowBlank: false,
validator: function(d) {
if (0 === Ext.util.Format.trim(d).length) {
return _DT("search", "error_search_key_empty")
}
var c = this.nextSibling().nextSibling().getValue();
if ("kad" === c && !SYNO.SDS.DownloadStation.aMule.Utils.IsKadSearchKeywordValid(d)) {
return _DT("search", "error_search_key_too_short")
}
return true
},
value: "",
listeners: {
single: true,
scope: this,
render: function() {
this.keywordField.getEl().on("keypress", function(c, d) {
if (c.getKey() == Ext.EventObject.ENTER) {
this.onSearch()
}
}, this)
}
}
}, {
xtype: "syno_combobox",
hideLabel: false,
name: "filetype",
fieldLabel: _DT("search", "title_file_type"),
store: SYNO.SDS.DownloadStation.aMule.Utils.getSearchFileTypeDS(),
listClass: "x-menu syno-ux-combobox-list",
value: "any",
valueField: "value",
displayField: "display",
mode: "local",
triggerAction: "all",
editable: false
}, {
xtype: "syno_combobox",
hideLabel: false,
name: "type",
fieldLabel: _DT("search", "title_search_method"),
store: SYNO.SDS.DownloadStation.aMule.Utils.getSearchTypeDS(),
listClass: "x-menu syno-ux-combobox-list",
value: "local",
valueField: "value",
displayField: "display",
mode: "local",
triggerAction: "all",
editable: false,
listeners: {
scope: this,
select: function() {
this.keywordField.validate()
}
}
}, {
xtype: "syno_numberfield",
hideLabel: false,
fieldLabel: _DT("search", "title_search_min_size"),
name: "min_size",
maxLength: 6,
allowBlank: true,
allowDecimals: false,
allowNegative: false
}, {
xtype: "syno_numberfield",
hideLabel: false,
fieldLabel: _DT("search", "title_search_max_size"),
name: "max_size",
maxLength: 6,
allowBlank: true,
allowDecimals: false,
allowNegative: false
}, {
xtype: "syno_numberfield",
hideLabel: false,
fieldLabel: _DT("search", "title_min_source"),
name: "avil",
maxLength: 5,
allowBlank: true,
allowDecimals: false,
allowNegative: false
}, {
xtype: "syno_textfield",
hideLabel: false,
fieldLabel: _DT("search", "title_extension"),
name: "extension",
maxLength: 4096
}, {
xtype: "syno_displayfield",
hideLabel: false,
fieldLabel: "",
value: "(eg. avi, jpg, iso)"
}]
}]
};
return Ext.apply(b, a)
},
onSearch: function() {
var e, f, j;
var a = this.getForm();
e = this.keywordField.getValue();
e = Ext.util.Format.trim(e);
this.keywordField.setValue(e);
if (!a.isValid()) {
return
}
f = a.findField("type").getValue();
j = a.findField("filetype").getValue();
var c = {
keyword: e,
search_type: f,
file_type: j
};
var g = a.findField("min_size");
if (g.isDirty()) {
Ext.apply(c, {
file_size_min: g.getValue()
})
}
var d = a.findField("max_size");
if (d.isDirty()) {
Ext.apply(c, {
file_size_max: d.getValue()
})
}
var i = a.findField("avil");
if (i.isDirty()) {
Ext.apply(c, {
source_num_min: i.getValue()
})
}
var b = a.findField("extension");
if (b.isDirty()) {
var h = Ext.util.Format.trim(b.getValue());
if (!Ext.isEmpty(h)) {
Ext.apply(c, {
file_extension: h
})
}
}
this.owner.setValue(e);
this.owner.owner.actionSearch(c);
this.onClose()
},
onReset: function() {
this.keywordField.originalValue = "";
this.form.reset();
this.keywordField.focus()
},
onClose: function() {
this.owner.hideMenu()
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.Search", {
extend: "SYNO.SDS.DownloadStation.RightPanel",
constructor: function(a) {
this.cfg = a;
Ext.apply(this, a.uicomponents || {});
this.owner = a.owner;
this.webapiDownload = {
api: "SYNO.DownloadStation2.eMule.Search",
method: "download",
version: 1
};
this.maxTabNumber = 5;
this.callParent(arguments)
},
createPanel: function(a) {
var b = {
enableTabScroll: true,
items: [],
cls: "syno-dl-searchpanel",
listeners: {
scope: this,
add: this.showHideTabPanel,
remove: this.showHideTabPanel
}
};
this.tabPanel = new SYNO.SDS.DownloadStation.SearchTabPanel(Ext.apply(b, a));
return new SYNO.ux.Panel({
tbar: this.fillToolbarConfig(),
layout: "fit",
items: [this.tabPanel]
})
},
showHideTabPanel: function() {
var a = true;
var c = this.tabPanel.items.items.length;
if (0 === c) {
a = false;
this.createSearchTab("")
} else {
if (1 === c) {
a = ("" === this.tabPanel.items.items[0].requestParams) ? false : true
} else {
this.tabPanel.items.each(function(d) {
if ("" === d.requestParams) {
this.tabPanel.remove(d)
}
}, this)
}
}
this.tabPanel.header.setVisibilityMode(Ext.Element.DISPLAY).setVisible(a);
var b = Math.max(0, this.tabPanel.lastSize.height - this.tabPanel.getFrameHeight());
this.tabPanel.body.setHeight(b);
this.tabPanel.doLayout()
},
onActivate: function() {
this.showHideTabPanel();
if (this.panel.getEl().isMasked()) {
this.panel.getEl().unmask()
}
},
createSearchTab: function(d) {
var c = this.findSameSearchParams(d);
if (false !== c) {
this.tabPanel.setActiveTab(c);
this.tabPanel.getActiveTab().sendSearchRequest(d);
return
}
if (this.tabPanel.items.items.length >= this.maxTabNumber) {
this.getMsgBox().alert(this.searchtitle, String.format(_DT("search", "search_tab_reach_limit"), this.maxTabNumber));
return
}
var a = {
uicomponents: this.uicomponents,
owner: this,
title: Ext.util.Format.htmlEncode(d.keyword),
tabTip: Ext.util.Format.htmlEncode(d.keyword),
cls: !d.keyword ? "syno-dl-no-padding-grid" : "",
closable: true
};
var b = new SYNO.SDS.DownloadStation.aMule.SearchGridPanel(a,d);
this.tabPanel.add(b);
this.tabPanel.setActiveTab(b);
this.downloadButton.mon(this.tabPanel.getActiveTab().getSelectionModel(), "selectionchange", this.updateBtn, this)
},
createActionGroup: function() {
var a = [];
a.push(this.downloadButton = new Ext.Button({
tooltip: _DT("search", "tooltip_download_file"),
iconCls: "syno-dl-a_bt_download",
itemId: "download",
disabled: true,
scope: this,
handler: this.actionDownload
}));
this.mainPanel.gSearch.mon(this.tabPanel, "tabchange", this.updateBtn, this);
return this.callParent([a, false])
},
updateBtn: function() {
var b = true;
var a = this.tabPanel.getActiveTab();
if (a) {
if (a.getSelectionModel().hasSelection()) {
b = false
}
}
if (!b) {
this.actionGroup.enable("download")
} else {
this.actionGroup.disable("download")
}
},
actionSearch: function(a) {
if (Ext.isEmpty(a)) {
this.getMsgBox().alert(this.searchtitle, _DT("search", "error_syste"));
return
}
a.keyword = Ext.util.Format.trim(a.keyword);
if (Ext.isEmpty(a.keyword)) {
this.getMsgBox().alert(this.searchtitle, _DT("search", "error_search_key_empty"));
return
}
if ("kad" === a.searchType && !SYNO.SDS.DownloadStation.aMule.Utils.IsKadSearchKeywordValid(a.keyword)) {
this.getMsgBox().alert(this.searchtitle, _DT("search", "error_search_key_too_short"));
return
}
this.createSearchTab(a)
},
findSameSearchParams: function(d) {
var c = this.tabPanel.items.items;
var a;
for (var b = 0; b < c.length; b++) {
a = c[b].requestParams;
if (a.keyword === d.keyword) {
return b
}
}
return false
},
actionDownload: function() {
var e = this.tabPanel.getActiveTab().getSelectionModel();
var b;
var c = [];
if (false === e.hasSelection()) {
this.getMsgBox().alert(this.searchtitle, _DT("download", "download_warning_select_items"));
return
}
b = e.getSelections();
for (var a = 0; a < b.length; a++) {
c.push(b[a].get("file_id"))
}
var d = {
file_id: c
};
this.setStatusBusy(_DT("common", "loading"));
SYNO.API.Request({
webapi: Ext.apply(this.webapiDownload, {
params: d
}),
callback: this.onDownloadDone,
scope: this
})
},
onDownloadDone: function(e, b, d, a) {
this.clearStatusBusy();
if (!e) {
if (1917 === b.code) {
this.appWin.getMsgBox().alert(this.title, _DT("download", "download_warning_select_share"), function() {
var f = new SYNO.SDS.DownloadStation.Settings.Window({
defaultActivedFn: "SYNO.SDS.DownloadStation.Settings.aMuleLocation",
owner: this.appWin
});
f.open()
}, this);
return
}
var c = _DT("download", "download_add_link_error_title") + _DT("common", "colon");
c = c + "<br />" + SYNO.SDS.DownloadStation.Utils.getErrorString(b.code);
this.getMsgBox().alert(this.title, c)
}
this.tabPanel.getActiveTab().store.reload()
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.Main", {
extend: "SYNO.SDS.DownloadStation.Main",
constructor: function(a) {
this.owner = a.owner;
this.callParent([a])
},
getSearchField: function() {
if (!this.gSearch) {
this.gSearch = new SYNO.SDS.DownloadStation.aMule.SearchField({
itemId: "global_search",
owner: this,
width: 215,
listeners: {
scope: this,
keypress: function(b, a) {
if (a.getKey() == Ext.EventObject.ENTER) {
this.onSearchFieldEnter(b)
}
}
}
})
}
return this.gSearch
},
onSearchFieldEnter: function(e) {
var c = e.getValue().trim();
if (!c) {
return
}
var a = "";
var d = Ext.util.Format.trim(c).toLowerCase();
var f = d.split(" ");
for (var b = 0; b < f.length; b++) {
if (Ext.util.Format.trim(f[b]).length < 1) {
continue
}
if (SYNO.SDS.DownloadStation.aMule.Utils.isValidED2KLink("file", f[b])) {
a = "ed2k://" + f[b].substr(7);
break
}
}
if (a) {
this.checkDestSettingsBeforeAddTaskByURL(a, e, this.moduleCt.items.get(0).module.upperPanel.DLStore)
} else {
e.syncToAdvSearchPanel();
e.getAdvSearchPanel().onSearch();
e.focus()
}
},
actionSearch: function(a) {
this.moduleList.selectModule("SYNO.SDS.DownloadStation.aMule.Search");
this.moduleList.actived.actionSearch(a)
},
checkDestSettingsBeforeAddTaskByURL: function(c, d, b) {
var e = SYNO.SDS.DownloadStation.aMule.Utils;
var a = e.getEmuleDestination();
if (!Ext.isEmpty(a)) {
this.addTaskByURL(c, a, d, b);
return
}
this.setStatusBusy({
text: _T("common", "loading")
});
this.sendWebAPI({
api: "SYNO.DownloadStation2.Settings.Emule.Location",
method: "get",
version: 1,
scope: this,
callback: function(g, f) {
this.clearStatusBusy();
if (!g) {
e.showErrorMessages(this.appWin, f);
return
}
e.setEmuleDestination(f.default_destination);
if (Ext.isEmpty(f.default_destination)) {
this.alertDestinationEmptyWithLaunchingChooser(this.appWin);
return
}
this.addTaskByURL(c, f.default_destination, d, b)
}
})
},
addTaskByURL: function(c, b, d, a) {
this.sendWebAPI({
api: "SYNO.DownloadStation2.Task",
method: "create",
version: 2,
params: {
type: "url",
url: [c],
destination: b,
create_list: false
},
scope: this,
callback: function(f, e) {
if (!f) {
SYNO.SDS.DownloadStation.aMule.Utils.showErrorMessages(this.appWin, e);
return
}
a.reload();
d.reset()
}
})
},
alertDestinationEmptyWithLaunchingChooser: function(b, c, a) {
b.getMsgBox().alert(_DT("tree", "node_emule"), _DT("download", "download_warning_select_share"), function() {
if (Ext.isFunction(c)) {
c.call(a)
}
this.launchEmuleShareChooser()
}, this)
},
launchEmuleShareChooser: function() {
this.utils.chooseDestHandler({
owner: this.appWin,
callback: function(c, b, a) {
if (b) {
this.applyEmuleShare(b.path.substr(1))
}
c.close()
},
callbackScope: this
})
},
applyEmuleShare: function(a) {
this.mask(_T("common", "saving"));
this.sendWebAPI({
api: "SYNO.DownloadStation2.Settings.Emule.Location",
method: "set",
version: 1,
params: {
default_destination: a
},
callback: this.onApplyEmuleShareDone,
scope: this
})
},
onApplyEmuleShareDone: function(d, b, c, a) {
this.unmask();
if (!d) {
this.appWin.getMsgBox().alert(this.title, SYNO.SDS.DownloadStation.Utils.getErrorString(b.code));
return
}
SYNO.SDS.DownloadStation.aMule.Utils.setEmuleDestination(c.default_destination)
}
});
Ext.ns("SYNO.SDS.DownloadStation");
Ext.define("SYNO.SDS.DownloadStation.Application", {
extend: "SYNO.SDS.AppInstance",
appWindowName: "SYNO.SDS.DownloadStation.MainWindow"
});
var jsDebug = Ext.urlDecode(document.URL.split("?")[1]).jsDebug;
Ext.define("SYNO.SDS.DownloadStation.MainWindow", {
extend: "SYNO.SDS.AppWindow",
constructor: function(a) {
SYNO.SDS.DownloadStation.Window = this;
this.webapiCompound = {
api: "SYNO.Entry.Request",
method: "request",
version: 1,
compound: {
stopwhenerror: false
}
};
this.webapiModuleList = {
api: "SYNO.DownloadStation2.Package.Module",
method: "list",
version: 2
};
this.webapiServiceGet = {
api: "SYNO.DownloadStation2.Package.Service",
method: "get",
version: 2
};
this.appInstance = a.appInstance;
var b = this.fillConfig(a);
this.callParent([b]);
this.setStatusBusy();
this.CheckServiceEnable()
},
fillConfig: function(b) {
var d = 830;
var a = 510;
var c = {
layout: "fit",
cls: "syno-dl-win",
dsmStyle: "v5",
minWidth: d,
minHeight: a,
boxMinHeight: a,
boxMinWidth: d,
width: 980,
height: 580,
html: "",
border: false,
plain: true,
listeners: {
scope: this,
show: function() {
if (this.tabPanel) {
this.tabPanel.activeTab.fireEvent("activate")
}
},
hide: function() {
if (this.tabPanel) {
this.tabPanel.items.each(function(e) {
e.fireEvent("deactivate")
})
}
},
close: function(e) {
e.cascade(function(f) {
if (Ext.isDefined(f.onCloseHandler)) {
f.onCloseHandler()
}
})
}
}
};
Ext.apply(c, b);
return c
},
delayConstructor: function(a, d) {
if (this.isDestroyed) {
return
}
if (!this.rendered) {
this.delayConstructor.defer(10, this, arguments);
return
}
this.clearStatusBusy();
if (!a || !a.listItems || !a.listItems.length || 0 === a.listItems.length) {
return
}
a.appWin = this;
a.owner = this;
this.tabPanel = new SYNO.SDS.DownloadStation.DownloadTab(a);
a.owner = this.tabPanel;
SYNO.SDS.DownloadStation.gData.amule_enabled = a.enable_emule || false;
if (!jsDebug) {
for (var c = 0; c < a.listItems.length; c++) {
a.currentItem = a.listItems[c];
var b = this.getModule(a.listItems[c].fn, a);
this.tabPanel.add(b)
}
} else {
a.currentItem = a.listItems[0];
a.folder = "dlm";
this.tabPanel.add(new SYNO.SDS.DownloadStation.DLM.Main(a));
a.folder = "aMule";
a.currentItem = a.listItems[1];
this.tabPanel.add(new SYNO.SDS.DownloadStation.aMule.Main(a))
}
this.removeAll();
this.add(this.tabPanel);
this.doLayout()
},
CheckServiceEnable: function() {
var a = [this.webapiModuleList, this.webapiServiceGet];
SYNO.API.Request({
webapi: Ext.apply(this.webapiCompound, {
compound: {
params: a
}
}),
callback: this.onCheckServiceEnable,
scope: this
})
},
onCheckServiceEnable: function(g, d, f, c) {
if (!g) {
this.CheckServiceEnable.defer(5000, this);
return
}
if (d.has_fail) {
this.CheckServiceEnable.defer(5000, this);
return
}
var b;
var e;
Ext.each(d.result, function(i, h) {
if (i.api === this.webapiModuleList.api) {
b = i.data
} else {
if (i.api === this.webapiServiceGet.api) {
e = i.data
}
}
}, this);
this.setServiceData(e);
var a = b;
Ext.apply(a, e);
this.delayConstructor(a)
},
setServiceData: function(a) {
SYNO.SDS.DownloadStation.blUnzip = a.enable_unzip
},
getModule: function(fn, cfg) {
var FnObj;
eval("FnObj = " + fn + ";");
FnObj.prototype.jsConfig = this.jsConfig;
var module = new FnObj(cfg);
return module
}
});
Ext.define("SYNO.SDS.DownloadStation.DownloadTab", {
extend: "SYNO.SDS.Utils.TabPanel",
constructor: function(a) {
this.owner = a.owner;
this.appWin = a.appWin;
var b = {
cls: "syno-dlm-tabpanel",
deferredRender: false,
activeTab: 0,
border: false,
headerCfg: {
style: "display:none;"
},
defaults: {
hideMode: "offsets"
},
listeners: {
scope: this,
tabchange: this.onTabChange
},
items: []
};
Ext.apply(b, a);
this.callParent([b])
},
onTmpCrashSettingClick: function() {
if (!_S("is_admin")) {
return
}
var a = new SYNO.SDS.DownloadStation.Settings.Window({
defaultActivedFn: "SYNO.SDS.DownloadStation.Settings.GlobalGen",
owner: this.appWin
});
a.open()
},
onTabChange: function(d, b) {
if (!Ext.isDefined(b.btnTabPanel)) {
return
}
var a = SYNO.SDS.DownloadStation.gData.get("amule_enabled") || false;
var c;
if (Ext.isDefined(c = b.btnTabPanel.get("aMule"))) {
c[!a ? "addClass" : "removeClass"]("syno-dl-tab-disabled")
}
},
setTabBtnDisabled: function(d, c) {
for (var b = 0; b < this.listItems.length; b++) {
var a = this.get(b).btnTabPanel.get(d);
if (!a) {
continue
}
if (c && this.items.indexOf(this.activeTab) == a.index) {
this.setActiveTab(0)
}
a[c ? "addClass" : "removeClass"]("syno-dl-tab-disabled")
}
}
});
Ext.ns("SYNO.SDS.DownloadStation");
SYNO.SDS.DownloadStation.Renderers = {};
Ext.apply(SYNO.SDS.DownloadStation.Renderers, {
SizeRenderer: function(e, d, a, f, c, b) {
if (0 === e) {
return ("total_upload" === d.id) ? "" : _DT("download", "download_status_unknown")
}
return SYNO.SDS.DownloadStation.Utils.fileSize(e)
},
RateRenderer: function(f, e, a, g, d, b) {
var c = SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT;
if (c.TASK_DOWNLOADING !== a.get("status") && c.TASK_SEEDING !== a.get("status")) {
return ""
}
if (c.TASK_SEEDING === a.get("status") && "current_rate" === e.id) {
return ""
}
if (0 === f) {
return "0.00 KB/s"
}
return SYNO.SDS.DownloadStation.Renderers.SizeRenderer(f, e, a, g, d, b) + "/s"
},
ProgressRenderer: function(e, d, a, f, c, b) {
if (0 === e) {
return _DT("download", "download_status_unknown")
}
return Ext.util.Format.number(e, "0.0") + "%"
},
StatusRenderer: function(a, e, c, g, i, h) {
var f = SYNO.SDS.DownloadStation.Utils.TASK_STATUS_INT;
var b = SYNO.SDS.DownloadStation.Utils.getTaskStatusStr(c.data);
var d = Ext.util.Format.htmlEncode(b);
e.attr = 'ext:qtip="' + Ext.util.Format.htmlEncode(d) + '"';
if (SYNO.SDS.DownloadStation.Utils.isTaskErrorStatus(a)) {
e.attr += 'style="color:#E64040;"'
} else {
if (f.TASK_CAPTCHA_NEEDED === a) {
e.attr += 'style="color:#E64040; cursor:pointer; cursor:hand;"'
} else {
if (f.TASK_FINISHED === a) {
e.attr += 'style="color:#009E05;"'
} else {
if (f.TASK_FINISHING === a || f.TASK_DOWNLOADING === a || f.TASK_SEEDING === a) {
e.attr += 'style="color:#057FEB;"'
} else {
if (f.TASK_WAITING === a) {
e.attr += 'style="color:#F58414;"'
}
}
}
}
}
return d
},
fileNameWithStatusRenderer: function(g, e, a, d, f, b) {
var c = Ext.util.Format.htmlEncode(g);
e.attr = 'ext:qtip="' + Ext.util.Format.htmlEncode(c) + '"';
e.css += " " + SYNO.SDS.DownloadStation.Utils.getStatusCss(a.data.status);
return c
}
});
Ext.ns("SYNO.SDS.DownloadStation.aMule");
Ext.define("SYNO.SDS.DownloadStation.aMule.SearchField", {
extend: "SYNO.ux.SearchField",
constructor: function(a) {
this.callParent([this.fillConfig(a || {})])
},
fillConfig: function(a) {
var b = {
ctCls: "syno-ux-textfilter syno-dl-toolbar-amule-search",
emptyText: _DT("download", "quickurl_hint"),
enableKeyEvents: true
};
Ext.apply(b, a);
return b
},
onRender: function(b, a) {
this.doc = Ext.isIE ? Ext.getBody() : Ext.getDoc();
Ext.form.TriggerField.superclass.onRender.call(this, b, a);
this.wrap = this.el.wrap({
tag: "div",
cls: "x-form-field-wrap x-form-field-trigger-wrap",
style: "display:block;width:100%;border-collapse:collapse;table-layout: fixed;margin-right: 1px;",
cn: [{
tag: "div",
cls: "x-form-field-wrap-center-img",
style: "display:inline-block;vertical-align:top;"
}]
});
this.inputWrap = this.el.wrap({
tag: "div",
style: "display:inline-block;vertical-align:top; width: unset",
cls: "syno-dl-amule-search-input-box"
});
this.trigger = this.inputWrap.createChild(this.triggerConfig || {
tag: "img",
src: Ext.BLANK_IMAGE_URL,
alt: "",
cls: "x-form-trigger " + this.triggerClass,
style: "display:inline-block;vertical-align:top;"
});
this.searchtriggerfocusEl = this.wrap.createChild({
tag: "button",
cls: "syno-search-condition-focus-el",
"aria-label": _JSLIBSTR("uicommon", "advanced_search")
});
this.initTrigger();
this.searchtrigger = this.wrap.child(".x-form-field-wrap-center-img");
this.mon(this.searchtrigger, "click", this.onSearchTriggerClick, this);
this.mon(this.searchtriggerfocusEl, "click", this.onSearchTriggerClick, this);
if (!this.width) {
this.wrap.setWidth(this.el.getWidth() + this.trigger.getWidth())
}
this.resizeEl = this.positionEl = this.wrap;
this.el.setWidth(this.el.getWidth() - this.trigger.getWidth());
this.container.addClass("syno-ux-searchfield")
},
getAdvSearchPanel: function() {
if (!this.advSearchPanel) {
this.advSearchPanel = new SYNO.SDS.DownloadStation.aMule.AdvancedSearchPanel({
owner: this
})
}
return this.advSearchPanel
},
getMenu: function() {
if (!this.menu) {
this.menu = new SYNO.ux.Menu({
cls: "syno-dl-amule-search-menu",
items: this.getAdvSearchPanel()
});
this.menu.on("beforeshow", function() {
this.syncToAdvSearchPanel()
}, this);
this.menu.on("show", function() {
this.advSearchPanel.keywordField.clearInvalid();
this.advSearchPanel.keywordField.focus()
}, this)
}
return this.menu
},
syncToAdvSearchPanel: function() {
var a = this.advSearchPanel.keywordField;
a.setValue(this.getValue())
},
hideMenu: function() {
this.menu.hide()
},
reset: function() {
this.callParent()
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment