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 = $('
' + '' + epgd.pages.help.getIcon('recRefresh') + '   ' + epgd.tr.pages.search.search + epgd.pages.help.getIcon('recSearch') + '' + '' + '' + '' + '' + '0' + '' + '   ' + tr.ddLabel + epgd.pages.help.getIcon('recDD') + '
' +''); this.$trash = this.$bar.find('.i-trash'); this.curSearch = { pattern: '', searchValue: '', hits: $(), cur: 0, $count: this.$bar.find('#rSCnt') , fromStart: this.$bar.find('#rSVal').prev('button')[0] , toEnd: this.$bar.find('#rSVal').next('button')[0] } } this.$bar.insertAfter(epgd.$menu); this.$trash.droppable({ accept: ".rec", hoverClass: "ui-state-hover", tolerance: "pointer", drop: function (ev, ui) { var elem = ui.helper.context; epgd.utils.confirm(epgd.tr.pages.records.deleteMessage.replace("$src$", elem.getAttribute('data-path')), function (ok) { ok && epgd.pages.records.del(elem); }); return false; } }).click(function () { var $recs = $("#records").find('.rec.selected'); $recs.length && epgd.utils.confirm(epgd.tr.confirmDelete + ($recs.length > 1 ? '
' + $recs.length + epgd.tr.entries : ''), function (ok) { ok && $recs.each(function () { epgd.pages.records.del(this); }); }); }); epgd.pages.help.initButtons(this.$bar); epgd.$menu.checkMenuSize(); $(window).bind("epgd_close.records", function () { epgd.pages.records.$bar.remove(); epgd.$menu.checkMenuSize(); $(window).unbind(".records"); }); epgd.$con.html('
'); epgd.utils.loader.process(function () { epgd.ajax({ url: epgd.login.url + "data/recordings", cache: false }, function (data) { var recs = data.recordings, rec, key, paths, t, p, i, tree = { f: {}, r: [] }, vdrs = {}, vdr, v, html = '', min = ' ' + epgd.tr.minutes, $divs, sortFunc = epgd.profile.recordSubFolderSort == 6 ? function (a, b) { return a.starttime > b.starttime ? -1 : 1 } : epgd.profile.recordSubFolderSort == 5 ? function (a, b) { return a.starttime > b.starttime ? 1 : -1 } : epgd.profile.recordSubFolderSort == 4 ? function (a, b) { return a.path > b.path ? -1 : 1 } : epgd.profile.recordSubFolderSort == 3 ? function (a, b) { return a.path > b.path ? 1 : -1 } : epgd.profile.recordSubFolderSort == 2 ? function (a, b) { return a.tit > b.tit ? -1 : 1 } : function (a, b) { return a.tit > b.tit ? 1 : -1 }; for (vdr in epgd.vdrs.list) { v = epgd.vdrs.list[vdr]; if (!v.usecommonrecfolder) vdrs[vdr] = { f: {}, r: [] }; html += '
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('
').parent().appendTo($folder); } }; } $elem.appendTo($folder); epgd.pages.records.sort(folder); epgd.utils.topInfo(epgd.tr.dataSaved); epgd.pages.records.__updateRec(elem); } else { epgd.utils.topInfo(data.message, { isError: 1 }); return false; } }); } return !!curPath; }, __updateRec: function (elem, cnt) { epgd.ajax({ url: epgd.login.url + 'data/recording?starttime=' + elem.getAttribute('data-start') + '&path=' + elem.getAttribute('data-path') + '&owner=' + elem.getAttribute('data-owner') + '&'+cnt, async: true }, function (data) { $(elem).attr('data-md5', data.recording.md5path).draggable("enable").removeClass("ui-state-disabled"); }, function (jqxhr, e) { if (!cnt) cnt = 0; else if (cnt >= 5) return epgd.utils.popup(epgd.tr.pages.records.notFoundMessage, { title: epgd.tr.error.error }); window.setTimeout(epgd.pages.records.__updateRec, 3000,elem,++cnt); return true; }); }, del: function (elem) { epgd.ajax({ url: epgd.login.url + 'data/deleterecording?starttime=' + elem.getAttribute('data-start') + '&md5path=' + elem.getAttribute('data-md5') + '&owner=' + elem.getAttribute('data-owner'), async: true }, function (data) { data = data.result; if (data && data.state == 200) { epgd.utils.topInfo(elem.getAttribute('data-path') + '
' + epgd.tr.dataSaved); $(elem).parents('.folder:not(:last)').find('>h4>span').each(function () { this.innerHTML = '(' + (parseInt(this.innerHTML.slice(1, -1), 10) - 1) + ')'; }); $(elem).remove(); } else epgd.utils.topInfo(elem.getAttribute('data-path') + '
' + data.message, { isError: 1 }); }); }, sort: function (con, sort) { var $elems = $(con).find('>div.rec'), dir = sort % 2 ? 1 : -1, t; if (!sort) sort = $(">h4>m", con)[0].curSort || epgd.profile.recordSubFolderSort; if (sort < 3) $elems.sort(function (a, b) { return a.lastChild.innerHTML > b.lastChild.innerHTML ? dir : -dir }).appendTo(con); else{ t= sort < 5 ? 'data-path' : 'data-start'; $elems.sort(function (a, b) { return a.getAttribute(t) > b.getAttribute(t) ? dir : -dir }).appendTo(con); } $(con).find('>div.folder').each(function () { epgd.pages.records.sort(this, sort); }); } }; /* $.widget("ui.draggable", $.ui.draggable, { _mouseStart: function (ev) { if (this.options.beforeStart && this.options.beforeStart(ev) === false) return false; return this._super(ev); } }); */