epgd.pages.records = {
render: function () {
if (!(epgd.login.rights & epgd.rights.umRecordings) == epgd.rights.umRecordings) return epgd.utils.popup(epgd.tr.error.forbidden, { title: epgd.tr.error.error });
if (!epgd.profile.recordSubFolderSort)
epgd.profile.recordSubFolderSort = 1;
$('#menu_records').addClass("menu-active");
var tr = epgd.tr.pages.records;
if (!this.$bar) {
this.$bar = $('
VDR - ' + v.name + ': ' + v.videodir + ' - ' + parseInt(v.videofree / 1000, 10) + ' GB ' + tr.available + ' / ' + parseInt(v.videototal / 1000, 10) + ' GB
';
}
if (!$('#dragdrop').parent().length) //.append(html)
return false;
epgd.$con.find('#records').before(html);
html = '';
for (i in recs) {
rec = recs[i];
t = vdrs[rec.vdruuid] || tree;
paths = rec.path.split('/');
paths.pop();
for (p = 0; p < paths.length; p++) {
key = paths[p].replace(/_/g, ' ');
t = t.f[key] || (t.f[key] = { f: {}, r: [] });
}
t.r.push(rec);
}
function checkTree(t) {
var hasContent = false,
subFolder, subTree;
t.cnt = 0;
for (subFolder in t.f) {
subTree = t.f[subFolder];
if (subTree.r.length == 1)
t.r.push(subTree.r.pop());
checkTree(subTree);
if (checkTree(subTree)) {
hasContent = true;
t.cnt += subTree.cnt;
} else
delete t.f[subFolder];
}
if (!hasContent)
delete t.f;
t.cnt += t.r.length;
return hasContent || t.r.length > 0;
}
function renderTree(t) {
Object.keys(t.f).sort().forEach(function (subFolder) {
var subTree = t.f[subFolder],
i;
html += subFolder ? '(' + (subTree.cnt) + ')' + subFolder + '
' : '
';
subTree.f && renderTree(subTree);
if (subTree.r.length) {
for (i in subTree.r) {
rec = subTree.r[i];
rec.tit = ((rec.name != subFolder ? rec.name : '')
+ (subFolder != rec.title && (rec.title != rec.name) ? '
' + rec.title : '')
+ (rec.shorttext && (rec.shorttext != rec.name) ? '
' + rec.shorttext + '' : '')) || subFolder;
rec.html = '
'
+ '' + epgd.utils.formatDateTime(rec.starttime) + '' + parseInt(rec.duration / 60, 10) + min + ''
+ rec.tit
+ '
';
};
subTree.r.sort(sortFunc);
for (i in subTree.r) { html += subTree.r[i].html; }
}
html += '
';
});
}
p = {};
if (checkTree(tree))
p[tr.commonRecFolder] = tree;
for (vdr in vdrs) {
t = vdrs[vdr];
if (checkTree(t)) {
p['VDR - ' + epgd.vdrs.list[vdr].name] = t;
}
}
renderTree({ f: p });
$divs = epgd.$con.find('#records').html(html);
if (!$divs.length)
return false;
$divs = $divs.click(epgd.pages.records.action).find('>div');
if ($divs.length == 1)
$divs.first().toggleClass('open');
epgd.pages.records.$menu = $('').hide().appendTo(epgd.$con);
$('#dragdrop').change();
epgd.pages.records.curSearch.$recs = null;
epgd.utils.loader.close();
});
},true);
},
search: function (searchValue) {
var cs = this.curSearch,
sLength,
$recs,
pattern,
fromStart = cs.fromStart.checked,
toEnd = cs.toEnd.checked;
if (!cs.$recs)
cs.$recs= epgd.$con.find('#records .rec,h4');
if (typeof searchValue == "string")
cs.searchValue = searchValue.replace(//g, '>');
pattern = (fromStart ? '>' + cs.searchValue : cs.searchValue).toLowerCase() + (toEnd ? '<' : '');
if (pattern == cs.pattern)
return;
sLength = cs.searchValue.length;
$recs = cs.$recs;
if (cs.hits.length) {
$(cs.hits).each(function () {
this.innerHTML = this.innerHTML.replace(/
([^<]+)<\/mark>/gi, '$1');
}).parents('.tmp-open').removeClass('tmp-open');
if (pattern.indexOf(cs.pattern) == 0)
$recs = $(cs.hits);
else
cs.cur = 0;
cs.hits = [];
} else
cs.cur = 0;
cs.pattern = pattern;
if (sLength > 2) {
$recs.each(function () {
var pos = this.innerHTML.toLowerCase().indexOf(pattern);
if (pos > 0) {
cs.hits.push(this)
$(this).parents('.folder').addClass('tmp-open');
do {
if (fromStart)
pos++;
this.innerHTML = this.innerHTML.slice(0, pos) + "" + cs.searchValue + "" + this.innerHTML.slice(pos + sLength);
} while ((pos = this.innerHTML.toLowerCase().indexOf(pattern, pos + 13)) > 0) // "" = 13 Zeichen
}
});
cs.$count.text(cs.hits.length).parent().show();
this.searchMove(0);
} else
cs.$count.parent().hide();
},
searchMove: function (dir) {
this.curSearch.cur += dir;
var n = this.curSearch.hits[this.curSearch.cur];
if (!n) {
this.curSearch.cur = dir < 0 ? this.curSearch.hits.length - 1 : 0;
n = this.curSearch.hits[this.curSearch.cur];
}
if (n) {
n.scrollIntoView(false);
$(n).css({ 'background-color': 'green' });
window.setTimeout(function () { $(n).css({ 'background-color': '' }); },1500);
}
},
action: function (ev) {
var elem = ev.target; // aktueller Sortiebutton, bzw. inital jquery-elment
if (elem.nodeName == 'MARK')
elem = elem.parentNode;
if (elem.nodeName == 'M') {
epgd.pages.records.$menu.show().position({
my: "left top",
at: "left bottom",
of: elem
}).find('a').removeClass('ui-state-highlight');
epgd.pages.records.$menu.find('a[data-sort=' + (elem.curSort || epgd.profile.recordSubFolderSort) +']').addClass('ui-state-highlight');
$(document).one('click.recmenu', function (ev) {
if (ev.target.nodeName == 'A') {
var t = ev.target.parentNode.getAttribute('data-type');
if (t ){
elem.curSort= ev.target.getAttribute('data-sort');
epgd.pages.records.sort(elem.parentNode.parentNode, elem.curSort);
}
}
epgd.pages.records.$menu.hide();
$(document).unbind('.recmenu');
}).bind("keyup.recmenu", function (e) {
if (e.keyCode == 27)
$(document).trigger("click.recmenu");
});
return false;
}
if (elem.nodeName == 'I' || elem.nodeName == 'SPAN')
elem = elem.parentNode;
if (elem.nodeName == 'B') {
elem = elem.parentNode;
if (!elem.recDetail)
elem.recDetail = new epgd.recordDetail(elem);
epgd.utils.loader.process(function () {
elem.recDetail.render();
});
} else if (elem.nodeName == 'H4') {
elem = elem.parentNode;
if (elem.nodeName == 'DIV' && elem.className.indexOf('folder') >= 0) {
if (elem.className.indexOf('open') == -1) {
if ($(window).width() < 500) {
$(elem).siblings('.open').removeClass('open');
document.body.scrollTop = $(elem).offset().top - 35;
}
$(elem).addClass('open');
} else
$(elem).removeClass('open');
}
} else
$(elem).closest('.rec').toggleClass('selected');
},
dd: function (enable) {
var $records = $("#records"),
$recs = $records.find('.rec').has('.ui-draggable');
if (enable && $recs.length == 0) {
$records.find("h4").droppable(this.__dropSettings);
$recs.end().draggable({
cancle: "b",
revert: "invalid",
distance: 15,
helper: function () {
return $(this).clone().css("display", "block");
},
appendTo: 'body',
cursor: 'pointer',
cursorAt: { left: -15, top: 5 },
start: function (ev, ui) {
$(document).trigger("click.recmenu");
$(document.body).addClass('dd-open');
document.body.style.paddingTop = epgd.pages.records.$bar.height() + 'px';
document.body.scrollTop -= ev.pageY - $(ev.delegateTarget).closest('.folder').offset().top;
/*$(document).bind("keyup.dd", [this], function (ev) {
if (ev.keyCode == 27)
$.ui.ddmanager.dragStop($(ev.data[0]).draggable("instance"), ev); //$(ev.data[0]).draggable("cancel");
}); */
},
stop: function (ev, ui) {
// $(document).unbind(".dd");
$(document.body).removeClass('dd-open');
epgd.$menu.checkMenuSize();
}
});
} else if ($recs.length){
$recs.draggable(enable ? "enable" : "disable");
}
},
__dropSettings: {
accept: ".rec",
hoverClass: "ui-state-hover",
tolerance: 'pointer',
drop: function (ev, ui) {
console.log("Dropped!", ev, ui);
var $elem = $(ev.target),
path = '';
do {
path = $elem.text().replace(/^\(.*\)/,'') + '/' + path;
$elem = $elem.parent();
} while (($elem = $elem.prevAll('h4')).length);
epgd.pages.records.move(ui.draggable.context, path.slice(path.indexOf('/', 2) + 1).replace(/ /g, '_'),ev.target.parentNode)
return false;
}
},
update: function () {
epgd.ajax({ url: epgd.login.url + "data/updaterecordings" }, function (data) {
epgd.utils.topInfo(epgd.tr.pages.records.refreshMessage.replace('$sec$', 5), { autoClose: 5000 });
$(window).trigger("epgd_close.records");
window.setTimeout(function () { epgd.pages.records.render(); }, 5000);
});
},
move: function (elem, path, folder) {
var curPath = elem.getAttribute('data-path').split('/'),
name = curPath.pop(), // 2016-08-21.11.18.59-0.rec entfernen
i,
endPos= 0;
curPath = curPath.join('/') + '/';
for (i = 0; i < Math.min(path.length, curPath.length) && path[i] == curPath[i]; i++) {
if (path[i] == '/')
endPos= i;
}
curPath = window.prompt(epgd.tr.pages.records.moveMessage.replace("$src$", curPath), path.concat(curPath.slice(endPos)).replace(/\/{2,}/g, '/').replace(/\/$/, ''));
if (curPath) {
epgd.ajax({ url: epgd.login.url + 'data/renamerecording?starttime=' + elem.getAttribute('data-start') + '&md5path=' + elem.getAttribute('data-md5') + '&owner=' + elem.getAttribute('data-owner') + '&name=' + curPath.replace(/\//g, '~'), async: true }, function (data) {
data = data.result;
if (data && data.state == 200) {
var $elem = $(elem),
$counter = $elem.prevAll('h4').find('span'),
$folder= $(folder),
newPath = curPath.split('/'), i;
$elem.attr('data-path', curPath + '/' + name);
$elem.attr('data-md5', "").draggable("disable").addClass("ui-state-disabled");
newPath.shift(); //erster Ordner ist ja == folder
$elem.parents('.folder:not(:last)').find('>h4>span').each(function () {
this.innerHTML = '(' + (parseInt(this.innerHTML.slice(1, -1), 10) - 1) + ')';
});
$counter = $folder.find('span');
$counter.text('(' + (parseInt($counter.text().slice(1, -1), 10) + 1) + ')');
for (i = 0; i < newPath.length; i++) {
if ($folder.find('>.folder>h4').each(function () {
if (this.lastChild.nodeValue == newPath[i]) {
$folder = $(this.parentNode);
$counter = $folder.find('span');
$counter.text('(' + (parseInt($counter.text().slice(1, -1), 10) + 1) + ')');
return true;
} else
return false;
}).length == 0) {
for (; i < newPath.length; i++) {
$folder = $('(1)' + newPath[i] + '
').droppable(epgd.pages.records.__dropSettings).wrap('