diff options
Diffstat (limited to 'http/src/js')
-rw-r--r-- | http/src/js/1_main.js | 714 | ||||
-rw-r--r-- | http/src/js/5_timerDialog.js | 640 | ||||
-rw-r--r-- | http/src/js/channels.js | 46 | ||||
-rw-r--r-- | http/src/js/epgd | 3 | ||||
-rw-r--r-- | http/src/js/eventDetail.js | 523 | ||||
-rw-r--r-- | http/src/js/pages.editChannels.js | 313 | ||||
-rw-r--r-- | http/src/js/pages.editUser.js | 96 | ||||
-rw-r--r-- | http/src/js/pages.help.js | 49 | ||||
-rw-r--r-- | http/src/js/pages.login.js | 114 | ||||
-rw-r--r-- | http/src/js/pages.magazine.js | 413 | ||||
-rw-r--r-- | http/src/js/pages.now.js | 135 | ||||
-rw-r--r-- | http/src/js/pages.profile.js | 251 | ||||
-rw-r--r-- | http/src/js/pages.records.js | 453 | ||||
-rw-r--r-- | http/src/js/pages.timer.js | 743 | ||||
-rw-r--r-- | http/src/js/vdr.js | 57 |
15 files changed, 4550 insertions, 0 deletions
diff --git a/http/src/js/1_main.js b/http/src/js/1_main.js new file mode 100644 index 0000000..3a8251a --- /dev/null +++ b/http/src/js/1_main.js @@ -0,0 +1,714 @@ + +epgd.profile = { + needLogin: -1, + channelLogoPath: "data/channellogo", + eventImgPath: "data/eventimg", + movieMediaPath: "data/moviemedia", + serieImgPath: "data/seriesmedia", + movieActorPath: "http://www.themoviedb.org/person/", + serieSeasonPath: "http://www.thetvdb.com/?tab=seasonall&id=", + constabelEditPath: "https://www.eplists.de/eplist.cgi?action=edit&back=&file=", + constabelLinkPath: "https://www.eplists.de/eplist.cgi?action=show_form_redir&linkname=", + minEventTime: 0, + maxEventTime: 0, + logoShowName: 0 +}; +epgd.userProfile_defaults = { + defaultVDRuuid: '', + constabelLoginPath: false, + pickerFirstDay: '6', + quickTimes: '', + startWithSched: 0, + startPage: "menu_options", + namingModeSerie: "0", + namingModeSearchSerie: "0", + namingModeMovie: "0", + namingModeSearchMovie: "0", + namingModeSerieTemplate: "", + namingModeSearchSerieTemplate: "", + namingModeMovieTemplate: "", + namingModeSearchMovieTemplate: "", + chFormat: "", + timerDefaultVDRuuid: '', + searchAdv: "0", + mailReceiver: "", + messageMailTypes: "", + magazinePan: 10, + magazinePanDelay: 400, + maxListEntries: 100, + ratings: "", + recordSubFolderSort: 1 +}; +epgd.profile_load = function (doNotCache) { + var profile = $.extend(epgd.profile, epgd.userProfile_defaults); + epgd.ajax({ url: epgd.login.url + "data/parameters", async: false, cache: false, dataType: "json" },function (data) { + var p,i,k, + oldVal, now, + changes = {}; + for (i in data.parameters) { + p = data.parameters[i]; + oldVal = profile[p.name]; + if (oldVal != undefined && oldVal != p.value) { + profile[p.name] = p.type === 0 ? parseInt(p.value, 10) : p.value; + changes[p.name] = oldVal; + if (p.name.indexOf('logo') == 0) + epgd.channels.isDirty = true; + } + } + if (epgd.utils.timeOffset == null) {
+ epgd.utils.timeOffset = (data.timezone - new Date().getTimezoneOffset() * 60) * 1000;
+ now = epgd.utils.now();
+ epgd.$dtPicker.datetimepicker('setDate', new Date(now.setMinutes(parseInt(now.getMinutes() / 15, 10) * 15)));
+ } + if (!profile.minEventTime) { + now = epgd.utils.now(); + profile.minEventTime = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0).getTime() / 1000; + changes["minEventTime"] = 0; + } + if (!profile.maxEventTime) { + profile.maxEventTime = profile.minEventTime + 8 * 24 * 60 * 60 - 60; + changes["maxEventTime"] = 0; + } + for (k in changes) { + $(window).trigger("profile_updated", changes); + break; + } + epgd.channels.isDirty && epgd.channels.load(); + }); +} + +epgd.pages = {}; + +epgd.login = { + user: '', + session: '', + rights:-1, + url: '' +} +epgd.rights = { // userMask + umConfig: 2, + umConfigEdit: 4 + 2, + umConfigUsers: 8, + umTimer: 64, + umTimerEdit: 128 + 64, + umSearchTimer: 256 + 64, + umSearchTimerEdit: 512 + 256 + 128 + 64, + umFsk: 4096, + umRecordings: 32768, + umRecordingsEdit: 65536 + 32768 +} +epgd.utils = { + timeOffset: null, + now: function () {return new Date(new Date().getTime() - this.timeOffset);}, + date: function (unixTime) { return new Date(unixTime * 1000 - this.timeOffset); }, + unixTime: function (date) { return date ? parseInt((date.getTime() + this.timeOffset) / 1000, 10) : 0; }, + formatTime: function (unixTime) { + var d = new Date(unixTime * 1000 - this.timeOffset); + return new String(100 + d.getHours()).slice(1) + ':' + new String(100 + d.getMinutes()).slice(1); + }, + formatDateTime: function (unixTime, dateFormat) { + var d = new Date(unixTime * 1000 - this.timeOffset); + return $.datepicker.formatDate((dateFormat || epgd.tr.dateTimePicker.dateFormat), d) + ' ' + new String(100 + d.getHours()).slice(1) + ':' + new String(100 + d.getMinutes()).slice(1); + }, + formatDate: function (unixTime, dateFormat) { + var d = new Date(unixTime * 1000 - this.timeOffset); + return $.datepicker.formatDate((dateFormat || epgd.tr.dateTimePicker.dateFormat), d); + }, + popup: function (txt, options) { + var $w = $(window), + $dlg; + options = $.extend({ + autoOpen: true, + dialogClass: 'popup', + show: { + effect: "blind", + duration: 1000 + }, + hide: { + effect: "explode", + duration: 1000 + }, + width: 400, + height:200, + maxWidth: $w.width() * 0.8, + maxHeight: $w.height() * 0.7,
+ }, options); + $dlg = $('<div class="epgPopUp"><p>' + txt + '</p></div>').dialog(options); + options.autoClose && window.setTimeout(function () { $dlg.dialog('close').dialog('destroy'); }, options.autoClose); + return $dlg; + }, + confirm: function (message, callback) { + var o = { + modal: true, + buttons: {} + }; + o.buttons[epgd.tr.yes]= function () { $(this).dialog('close'); callback(true);}; + o.buttons[epgd.tr.no]= function () { $(this).dialog('close'); callback(false);}; + this.popup(message, o); + }, + topInfo: function (txt, options) { + var isError = options && options.isError, + $info, + dura; + options = $.extend({ + autoClose: isError ? 0 : 3000, + className: "ui-state-" + (isError ? 'error' : 'highlight') + },options); + dura = (options.autoClose || 3000) / 2; + $info = $('<div class="topInfo ui-corner-all ' + options.className + '">' + txt + + '<button onclick="$(this).parent().remove();" class="iAsButton i-cancel" title="' + epgd.tr.close + + '"></button></div>') + .appendTo(epgd.$menu) + .animate({ 'opacity': 0.4 }, dura, function () { $info.animate({ 'opacity': 1 }, dura); }); + options.autoClose && window.setTimeout(function () { $info.remove() }, options.autoClose); + }, + sendMail: function (subject, body, mimetype, receiver) { + epgd.ajax({ + url: epgd.login.url + 'data/sendmail', + type: 'post', + data: JSON.stringify({ "receiver": (receiver || epgd.profile.mailReceiver), "subject": subject, "body": body, "mimetype": mimetype }) + }, function (data) { + data = data.result; + if (data && data.state == 200) + epgd.utils.topInfo(epgd.tr.dataSend); + else + epgd.utils.topInfo(data.message, { isError: 1 }); + epgd.profile_load(); + }); + }, + loader: { + $win: $('<div style="position:absolute;z-index:9999;width:100%;height:100%;position:fixed;left:0px;top:0px;background:url(images/loader.png) no-repeat 50% 50%"></div>'), + cnt: 0, + process: function (actionFunc, doNotRemove) { + var loader = this; + this.cnt++; + this.$win.appendTo(document.body).stop().animate({ opacity: 0.7}, { + always: function () { + try{ + actionFunc(); + } catch (e) { + epgd.utils.log((e.message || 'common error') + '\n' + (e.stack || ''),0); + loader.close(); + } + !doNotRemove && loader.close(); + } + }, 200); + }, + close: function () { + if (this.cnt > 0) { + this.cnt--; + this.cnt == 0 && this.$win.remove(); + } + } + }, + addAutoComplete: function (inputSelector, options) { + var $sel = $(inputSelector), + cn = $sel[0].className, + w = $sel[0].style.width || ""; + $(inputSelector).autocomplete($.extend({ + minLength: 0, + multiselect: false, + create: function (event, ui) { // based on http://jsfiddle.net/mekwall/sgxKJ/ + var inst = $(this).autocomplete('instance'), + o = inst.options, + fontSize, kc; + + inst.selectedItems = {}; + if (o.multiselect) {
+ inst.multiselect = $("<div></div>") + .addClass("ui-autocomplete-multiselect ui-state-default ui-widget " + cn) + .css("width", w) + .insertBefore(inst.element) + .append(inst.element) + .bind("click.autocomplete", function () {
+ inst.element.focus();
+ }); + inst.menu.element.css({ "height": "300px", "overflow-y": "auto" }); + fontSize = parseInt(inst.element.css("fontSize") || 10, 10); + function autoSize(e) { + // Hackish autosizing + var $this = $(this); + $this.width(1).width(this.scrollWidth + fontSize - 1);
+ }; + kc = $.ui.keyCode; + inst.element.bind({
+ "keydown.autocomplete": function (e) {
+ if ((this.value === "") && (e.keyCode == kc.BACKSPACE)) {
+ var prev = inst.element.prev(); + delete inst.selectedItems[prev.text()]; + prev.remove();
+ }
+ }, + // TODO: Implement outline of container + "focus.autocomplete blur.autocomplete": function () {
+ inst.multiselect.toggleClass("ui-state-active");
+ }, + "keypress.autocomplete change.autocomplete focus.autocomplete blur.autocomplete": autoSize
+ }).trigger("change"); + o.select = o.select || function (e, ui) {
+ if (!inst.selectedItems[ui.item.label]) {
+ $("<div></div>") + .addClass("ui-autocomplete-multiselect-item") + .text(ui.item.label) + .append( + $("<span></span>") + .addClass("ui-icon ui-icon-close") + .click(function () {
+ var item = $(this).parent(); + delete inst.selectedItems[item.text()]; + item.remove();
+ }) + ) + .insertBefore(inst.element); + inst.selectedItems[ui.item.label] = ui.item;
+ } + inst._value(""); + return false;
+ }
+ } else {
+ o.select = o.select || function (e, ui) {
+ inst.selectedItems[0] = ui.item;
+ inst._value(ui.item.label);
+ return false;
+ }
+ }; + } + }, options)).focus(function () { + $(this).autocomplete("search", ""); + });/*.bind("keydown", function (event) { + if (event.keyCode === $.ui.keyCode.TAB && + $(this).autocomplete("instance").menu.active) { + event.preventDefault(); + } + });*/ + }, + getAutoCompleteValues: function (inputSelector, quot) { + quot = quot || ''; + var values = '', + del= ',' + quot, + ac,key; + try { + ac = $(inputSelector).autocomplete("instance").selectedItems; + for (key in ac) + values += del + ac[key].value + quot; + } catch (e) { } + return values.slice(1); + }, + setAutoCompleteValues: function (inputSelector, values ) { + var ac = $(inputSelector).autocomplete("instance"), + item,i, + matcher; + ac.multiselect && ac.multiselect.find(">div").remove(); + ac.selectedItems = {}; + if (values) { + for (i = 0; i < values.length; i++) { + item = null; + matcher = new RegExp($.ui.autocomplete.escapeRegex(values[i]), "i"); + $.each(ac.options.source, function () { + if (matcher.test(this.value || this.label || this)) + return !(item = this); + }); + if (item) + ac._trigger("select", null, { item: item.label ? item : {label:item,value:item} }); + } + } + }, + addPlaceholders: function (inputSelector, key, placeholders) {
+ var input = $(inputSelector)[0],
+ html = '<ul class="placeholders ui-menu ui-widget ui-widget-content">',
+ p;
+ for (p in placeholders) + html += '<li class="ui-menu-item"><b>' + p + '</b>' + placeholders[p] + '</li>'; + input.$placeholders = $(html + '</ul>').hide().insertAfter(input).click(function (ev) {
+ var placeholder = ev.target.nodeName == 'B' ? $(ev.target).text() : ev.target.nodeName == 'LI' ? $(ev.target.firstChild).text() : null,
+ cursorPos = $(input).prop('selectionStart'),
+ v = $(input).val();
+ if (placeholder) {
+ $(input).val(v.substring(0, cursorPos) + placeholder + v.substring(cursorPos, v.length)).focus();
+ cursorPos += placeholder.length;
+ if (input.setSelectionRange) {
+ input.setSelectionRange(cursorPos, cursorPos);
+ }
+ else if (input.createTextRange) {
+ v = input.createTextRange();
+ v.collapse(true);
+ v.moveEnd('character', cursorPos);
+ v.moveStart('character', cursorPos);
+ v.select();
+ }
+ }
+ $(this).hide();
+ });
+ $(input).keydown(function (ev) {
+ if (ev.key == key) {
+ $(document).one("click", function () { input.$placeholders.hide(); })
+ input.blur();
+ return !input.$placeholders.show().position({
+ my: "left top",
+ at: "left bottom",
+ of: input
+ });
+ }
+ });
+ }, + inherits : function (childClass, parentClass) { + var tempClass = function () { }; + tempClass.prototype = parentClass.prototype; + childClass.prototype = new tempClass(); + childClass.prototype.constructor = childClass; + childClass.base = parentClass.prototype; + return childClass; + }, + log: function (message, level) { + console.log("error:" + message); + try { + $.ajax({ url: "data/log", type: 'get', async: true, cache: false, data: "level=" + (level || 0) + "&message=" + escape(message) }); + } catch (e) {} + } +}; + +epgd.init = function () { + + epgd.$con = $('<div id="content"></div>').appendTo(document.body); + + $.datepicker.setDefaults(epgd.tr.dateTimePicker); + $.datepicker.setDefaults({ + showOtherMonths: true, + selectOtherMonths: true, + }); + $.timepicker.setDefaults(epgd.tr.dateTimePicker); + $.timepicker.setDefaults({ + timeInput: true, + controlType: { + create: function (tp_inst, obj, unit, val, min, max, step) { + if (unit == 'hour') { + if (!tp_inst.inst.settings.timeOnly) + $('#ui-datepicker-div').width(($(window).width() > 500 ? 430 : 230)+ "px"); + $('<span><u>0</u><u>2</u><u>4</u><u>6</u><u>8</u><u>10</u><br /><u>12</u><u>14</u><u>16</u><u>18</u><u>20</u><u>22</u><span>') + .appendTo(obj).bind("click", { tp_inst: tp_inst, obj: obj, unit:unit }, $.timepicker.quicklink); + } else if (unit == 'minute') { + $('<span><u>0</u><u>15</u><u>30</u><u>45</u><span>') + .appendTo(obj).bind("click", { tp_inst: tp_inst, obj: obj, unit:unit }, $.timepicker.quicklink); + } else if (unit == 'second' && epgd.profile.quickTimes) { + obj.closest('dl').find('.ui_tpicker_time').removeClass() + .bind("click", { tp_inst: tp_inst, obj:obj, unit: 'time' }, $.timepicker.quicklink).html('<i><u title="' + epgd.profile.quickTimes.replace(/[^=~]+=@[a-z]+/gi, '').replace(/~{2,}/g, '~').replace(/=!?/g, '">').replace(/~/g, '</u></i><i><u title="') + '</u></i>'); + if (tp_inst.inst.settings.alwaysSetTime)
+ epgd.pages.help.initButtons(tp_inst.inst.dpDiv.find('.ui-datepicker-buttonpane').append(epgd.pages.help.getButton('datepicker'))); + else
+ $('<button class="iAsButton i-cancel" role="button">' + epgd.tr.clear + '</button>').appendTo(tp_inst.inst.dpDiv.find('.ui-datepicker-buttonpane')).click(function () {
+ tp_inst.$input.val(''); + $.datepicker._hideDatepicker();
+ }); + return obj; + } else + return obj; + + $('<input class="ui-timepicker-input" value="' + val + '" style="width:20px">') + .prependTo(obj) + .spinner({ + min: min, + max: max, + step: step, + change: function (e, ui) { // key events + // don't call if api was used and not key press + if (e.originalEvent !== undefined) + tp_inst._onTimeChange(); + tp_inst._onSelectHandler(); + }, + spin: function (e, ui) { // spin events + tp_inst.control.value(tp_inst, obj, unit, ui.value); + tp_inst._onTimeChange(); + tp_inst._onSelectHandler(); + } + }); + return obj; + }, + options: function (tp_inst, obj, unit, opts, val) { + if (typeof (opts) == 'string' && val !== undefined) + return obj.find('.ui-timepicker-input').spinner(opts, val); + return obj.find('.ui-timepicker-input').spinner(opts); + }, + value: function (tp_inst, obj, unit, val) { + try { + if (val !== undefined) + return obj.find('.ui-timepicker-input').spinner('value', val); + return obj.find('.ui-timepicker-input').spinner('value'); + } catch (e) { + return false; + } + } + } + }); + + + epgd.$menu = $('<nav id="menu-top"><ul id="ui-menu-top"><li id="menu_login"><a href="#menu_login">' + epgd.tr.pages.login.label + '</a></li></ul></nav>').appendTo(document.body).find('ul').hide(); + epgd.$menu.$maxBut = $('<span class="maxi i-menu" />').insertBefore(epgd.$menu).click(function () { + epgd.$menu.parent().toggleClass('open'); + }); + epgd.$menu.checkMenuSize = function (ev, callback) { + if (window.wrm_i) { // interval aktiv?
+ if (window.wrm_w == $(window).width()) { //Breite vom vorherigen Aufruf und aktuelle Breite gleich?
+ window.clearInterval(window.wrm_i);
+ delete window.wrm_i;
+ epgd.$menu.parent().removeClass('mini').width(window.wrm_w).offset({ 'left': $(window).scrollLeft() });
+ epgd.$menu.checkMenuSize(null, callback);
+ } else
+ window.wrm_w = $(window).width();
+ return;
+ }
+ if (ev) {
+ window.wrm_w = $(window).width();
+ if (!window.wrm_i) // Interval setzen, um sicher zu sein, dass die Breite jetzt stimmt
+ window.wrm_i = window.setInterval(epgd.$menu.checkMenuSize, 200,null,callback);
+ } else {
+ if (epgd.$menu.height() > 40)
+ epgd.$menu.parent().addClass('mini');
+ window.setTimeout(function () {
+ document.body.style.paddingTop = (epgd.$menu.parent().height() + 10) + "px";
+ callback && window.setTimeout(callback,200);
+ }, 200);
+ } + }; + //epgd.$menu.show().checkMenuSize(); + $(window).bind("resize", epgd.$menu.checkMenuSize); + epgd.$dtPicker = $('<input type="text" id="selDate" readonly style="z-index:199;position:relative" />').appendTo(document.body).hide().bind("click",function () { $(this).datepicker("show"); return false; }); + epgd.$dtPicker.datetimepicker({
+ beforeShow: function () {
+ this.$overlay = $("<div />").addClass("ui-widget-overlay ui-front").appendTo(document.body);
+ }, + onClose: function () {
+ this.$overlay.remove(); + $(window).trigger('datepicker');
+ },
+ calendarStart: function() { + var d= new Date(epgd.profile.minEventTime * 1000) + leadDays = (d.getDay() - parseInt(epgd.profile.pickerFirstDay, 10) + 7) % 7; + d.setHours(12, 0); + d.setDate(d.getDate() - leadDays); + return d; + }
+ }); + + epgd.$menu.menu({ + position: { at: "left bottom" }, + select: function (event, ui) { + var id = ui.item.attr('id'); + if (!id || id.indexOf('menu_') != 0 || (event.originalEvent && event.originalEvent.target.nodeName != 'A' && event.originalEvent.target.nodeName != 'LI')) + return false; + $(window).trigger("epgd_close"); + epgd.$menu.parent().removeClass('open'); + $(".menu-active", this).removeClass("menu-active"); + $(document.body).append(epgd.$dtPicker.hide()); + epgd.$menu.checkMenuSize(null,function () {
+ try {
+ ui.item.addClass("menu-active").parent().parent('.ui-menu-item').addClass("menu-active"); + epgd.pages[id.slice(5)].render();
+ } catch (e) {
+ epgd.utils.popup(epgd.tr.error.common, { title: epgd.tr.error.error });
+ epgd.utils.log((e.message || 'common error') + '\n' + (e.stack || ''), 2);
+ }
+ }); + } + }); + $(window).bind("epgd_close", function () { + $('.epgPopUp').dialog('destroy'); + }).bind("profile_updated", function (e,changes) { + if (changes["minEventTime"] != undefined) + epgd.$dtPicker.datetimepicker("option", {"minDateTime": new Date((epgd.profile.minEventTime= parseInt(epgd.profile.minEventTime,10)) * 1000), "minDate": new Date(epgd.profile.minEventTime * 1000)}); + if (changes["maxEventTime"] != undefined) + epgd.$dtPicker.datetimepicker("option", {"maxDateTime": new Date((epgd.profile.maxEventTime= parseInt(epgd.profile.maxEventTime,10)) * 1000), "maxDate": new Date(epgd.profile.maxEventTime * 1000)}); + if (changes["pickerFirstDay"] != undefined) + epgd.$dtPicker.datetimepicker("option", { "firstDay": epgd.profile.pickerFirstDay }); + if (changes["defaultVDRuuid"] != undefined) { + $('#menu_vdrs > select').val(epgd.profile.defaultVDRuuid); + } + if (changes["quickTimes"] != undefined) {
+ epgd.pages.magazine.initQT();
+ } + if (changes["needLogin"] != undefined) { + epgd.pages.login.doLogin(); + } + }).bind("login_changed", function (e, oldLogin) { + epgd.$menu.html('').hide(); + epgd.$con.html(''); + if (epgd.login.rights) { + epgd.$menu.append('<li id="menu_now"><a href="#menu_now">' + epgd.tr.menu.now + '</a></li>'); + epgd.$menu.append('<li id="menu_magazine"><a href="#menu_magazine">' + epgd.tr.menu.magazine + '</a></li>'); + (epgd.login.rights & epgd.rights.umTimer) == epgd.rights.umTimer && epgd.$menu.append('<li><a>' + epgd.tr.menu.timer + '</a><ul>' + + '<li id="menu_timerList"><a href="#menu_timerList">' + epgd.tr.pages.timer.timerList + '</a></li>' + + ((epgd.login.rights & epgd.rights.umSearchTimer) == epgd.rights.umSearchTimer ? '<li id="menu_searchTimerList"><a href="#menu_searchTimerList">' + epgd.tr.pages.timer.searchTimerList + '</a></li>' : '') + + '<li id="menu_timersDone"><a href="#menu_timersDone">' + epgd.tr.pages.timer.timersDone + '</a></li>' + + '<li id="menu_timerListDone"><a href="#menu_timerListDone">' + epgd.tr.pages.timer.timerListDone + '</a></li>' + + '<li id="menu_timerJobList"><a href="#menu_timerJobList">' + epgd.tr.pages.timer.timerJobList + '</a></li>' + + '<li id="menu_messageList"><a href="#menu_messageList">' + epgd.tr.pages.timer.messageList + '</a></li>' + + '</ul></li>'); + (epgd.login.rights & epgd.rights.umRecordings) == epgd.rights.umRecordings && epgd.$menu.append('<li id="menu_records"><a href="#menu_records">' + epgd.tr.menu.records + '</a></li>'); + epgd.$menu.append('<li id="menu_search"><a href="#menu_search">' + epgd.tr.menu.search + '</a></li>'); + epgd.$menu.append('<li><a>' + epgd.tr.menu.options + '</a><ul>' + + '<li id="menu_profile"><a href="#menu_profile">' + epgd.tr.pages.options.profile + '</a></li>' + + ((epgd.login.rights & epgd.rights.umConfigEdit) == epgd.rights.umConfigEdit ? '<li id="menu_editChannels"><a href="#menu_editChannels">' + epgd.tr.pages.options.editChannels + '</a></li>' : '') + + ((epgd.login.rights & epgd.rights.umConfigUsers) == epgd.rights.umConfigUsers ? '<li id="menu_editUser"><a href="#menu_editUser">' + epgd.tr.pages.options.editUser + '</a></li>' : '') + + '</ul></li>'); + epgd.$menu.append('<li id="menu_help"><a href="#menu_help">' + epgd.tr.menu.help + '</a></li>'); + epgd.$menu.append('<li id="menu_vdrs"><a href="#menu_vdrs">VDR</a><select></select></li>'); + } + epgd.profile.needLogin == "1" && epgd.$menu.append('<li id="menu_login"><a href="#menu_login">' + + (epgd.login.session ? epgd.login.user + ' ' + epgd.tr.pages.login.logout : epgd.tr.pages.login.label ) + + '</a></li>'); + if (epgd.login.user != oldLogin.user) { + epgd.profile_load(); + epgd.channels.isDirty = true; + epgd.vdrs.list = null; + } + epgd.channels.load(); + epgd.vdrs.load(); + epgd.$menu.show().menu("refresh"); + epgd.$menu.menu("select", { target: $(epgd.login.rights ? (location.hash || '#' + epgd.profile.startPage || '#menu_profile') : '#menu_login') });//.concat('=' + epgd.profile.startPage + '=').match(/(menu_[^=]+)/)[1] }); + + }).bind("vdrs_load", function () { + html = ''; + for (var uuid in epgd.vdrs.list) { + html += '<option value="' + uuid + '"' + (uuid == epgd.vdrs.current.uuid ? 'selected' : '') + '>' + epgd.vdrs.list[uuid].name + '</option>'; + } + $('<select>' + html + '</select>').replaceAll('#menu_vdrs > select').show().change(function () { + epgd.vdrs.current = epgd.vdrs.get(this[this.selectedIndex].value); + }).mousedown(function (ev) { + ev.stopPropagation(); + return true; + }).click(function (ev) { + return false; + }); + }).bind("unload", function () { + if (epgd.login.session) + epgd.pages.login.doLogin('logout'); + }); + + epgd.pages.now.init(); + epgd.pages.magazine.init(); + epgd.profile_load(); + if (epgd.profile.needLogin == -1) { + epgd.profile.needLogin = 0; + epgd.pages.login.doLogin(); + } + window.setInterval(epgd.profile_load, 3600000); // ca. jede Stunde neu abfragen + // window.setTimeout(function () { $(window).trigger('resize'); }); +} +window.onerror = function (msg, url, line, col, error) {
+ // Note that col & error are new to the HTML 5 spec and may not be
+ // supported in every browser. It worked for me in Chrome.
+ var extra = !col ? '' : '\ncolumn: ' + col;
+ extra += !error ? '' : '\nerror: ' + error.stack;
+ try{
+ epgd.utils.log(msg + "\nline: " + line + extra, 2);
+ } catch(e){}
+ return true;
+}; + +$.widget("custom.catcomplete", $.ui.autocomplete, { + _create: function () { + this._super(); + this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)"); + }, + _renderMenu: function (ul, items) { + var that = this, + currentCategory = ""; + $.each(items, function (index, item) { + var li; + if (item.category != currentCategory) { + ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>"); + currentCategory = item.category; + } + li = that._renderItemData(ul, item); + if (item.category) { + li.attr("aria-label", item.category + " : " + item.label); + } + }); + } +}); +$.datepicker._gotoToday = function (id) {
+ var inst = this._getInst($(id)[0]), + now = epgd.utils.now(); + this._base_gotoToday(id); + this._setTime(inst, now); + this._setDate(inst, now);
+ this._hideDatepicker();
+}; +$.timepicker.quicklink = function (ev) {
+ var target = ev.target.nodeName == 'I' ? ev.target.firstChild : ev.target, + tp_inst, + val = null, + d = false; + try {
+ tp_inst = ev.data.tp_inst || $.datepicker._getInst(epgd.$dtPicker[0]).settings.timepicker;
+ } catch (e) {
+ epgd.utils.log((e.message || 'common error') + '\n' + (e.stack || ''), 2);
+ return false;
+ } + if (target.nodeName == 'U') {
+ if (ev.data.unit == "time")
+ val = $.datepicker.parseTime(tp_inst._defaults.timeFormat, target.innerHTML, tp_inst._defaults);
+ else if (ev.data.unit == "hour")
+ val = { hour: parseInt(target.innerHTML, 10), minute: tp_inst.minute };
+
+ if (val) {
+ if (val.hour < tp_inst.hour - 1) + d = true;
+ else {
+ tp_inst.control.value(tp_inst, tp_inst.hour_slider, "hour", val.hour); + tp_inst._onTimeChange(); + if (tp_inst.hour != val.hour) + d = true;
+ } + if (d) {
+ d = new Date(tp_inst.inst.selectedYear, tp_inst.inst.selectedMonth, tp_inst.inst.selectedDay + 1, val.hour, val.minute); + $.datepicker._setDate(tp_inst.inst, d); + $.datepicker._setTime(tp_inst.inst, d); + $.datepicker._updateDatepicker(tp_inst.inst);
+ } else + tp_inst.control.value(tp_inst, tp_inst.minute_slider, "minute", val.minute);
+ } else + tp_inst.control.value(tp_inst, ev.data.obj, ev.data.unit, parseInt(target.innerHTML, 10)); + tp_inst._onTimeChange(); + tp_inst._onSelectHandler(); + if (ev.target.nodeName == 'I') + $.datepicker._hideDatepicker();
+ }
+} + +epgd.ajax = function (options, success, error) { + var settings = $.extend({ dataType: 'json', contentType: "application/json; charset=utf-8" }, options); + return $.ajax(settings).fail(function (jqxhr, e) { + epgd.utils.loader.close(); + if (jqxhr.status == 401) { + epgd.pages.login.doLogin(null,null,function () { + if (epgd.login.rights) { + settings.url = settings.url.replace(/sid[^\/]+\//, epgd.login.url); + $.ajax(settings).done(success).fail(function () { + epgd.utils.popup(epgd.tr.error.forbidden, { title: epgd.tr.error.error }); + }); + } else + epgd.utils.popup(epgd.tr.error.forbidden, { title: epgd.tr.error.error }); + }); + } + else if (jqxhr.status == 403) { + epgd.utils.popup(epgd.tr.error.forbidden, { title: epgd.tr.error.error }); + } else if (jqxhr.status == 501){
+ epgd.utils.popup(epgd.tr.error.notImplemented, { title: epgd.tr.error.error });
+ } else { + if (error && error.call(this, jqxhr, e)) + return; + //if (jqxhr.status == 409) { + var mess = ''; + try {
+ if (jqxhr.responseJSON) + mess = jqxhr.responseJSON.result.message;
+ } catch (e) {
+ mess = ''; + epgd.utils.log((e.message || 'common error') + '\n' + (e.stack || '') + '\n options:' + JSON.stringify(options) + '\n jqhr:' + JSON.stringify(jqxhr), 3);
+ } + epgd.utils.popup(mess || jqxhr.responseText || epgd.tr.error.serverNotResponse, { title: epgd.tr.error.error }); +// } else + //epgd.utils.popup(epgd.tr.error.serverNotResponse, { title: epgd.tr.error.error }); + } + }).done(success); +}; diff --git a/http/src/js/5_timerDialog.js b/http/src/js/5_timerDialog.js new file mode 100644 index 0000000..704f31e --- /dev/null +++ b/http/src/js/5_timerDialog.js @@ -0,0 +1,640 @@ +// Timer Dialoge - Basis Klasse +epgd.timerDialogBase = function (options) {
+ this.$win = null;
+ this.list = null;
+ if ( options )
+ this.options= $.extend({}, this.options, options);
+} +epgd.timerDialogBase.prototype = {
+ options: {
+ id: "baseDialog", + modal: true, + draggable: true, + resizable: true, + autoOpen: false, + width: 'auto', + maxHeight: $(window).height(), + close: function () {
+ this.list.dialog.form.reset(); + $(this.list.dialog.form).next().remove(); + //allFields.removeClass("ui-state-error"); + },
+ buttons: [{
+ text: epgd.tr.del, + icons: { primary: "ui-icon-trash" }, + id: 'tBDel', + click: function () {
+ $(this).dialog("close"); + this.list.del(this.list.dialog.form.tID.value);
+ }
+ }, {
+ text: epgd.tr.cancel, + icons: { primary: "ui-icon-close" }, + click: function () {
+ $(this).dialog("close");
+ }
+ }, {
+ text: epgd.tr.save, + icons: { primary: "ui-icon-disk" }, + click: function () { this.list.dialog.save() }
+ }]
+ }, + save: function (data, url, failFunc, succFunc) { + this.list.save(data || this.getData(), url, failFunc, succFunc) && !this.options.embed && this.$win.dialog("close"); + }, + showError: function (msg, field) {
+ epgd.utils.popup((field && field.id ? '<b>' + $('label[for="' + field.id + '"]').text() + '</b>' : '') + '<div>' + msg + '</div>', { autoClose: 3000 }); + field && field.focus(); + return false;
+ },
+ loadFolder: function () {
+ var dialog = this; + epgd.ajax({ url: epgd.login.url + "data/recordingdirs" }, function (data) {
+ if (data.recordingdirs.length) {
+ var folder = [], + vdrs = epgd.vdrs.list, + vdr; + $.each(data.recordingdirs, function (id, f) {
+ vdr = vdrs[f.vdruuid]; + folder.push({ value: f.directory, category: vdr ? vdr.name : '-' });
+ }); + $(dialog.form.tFolder).catcomplete("option", "source", folder);
+ }
+ });
+ },
+ close: function () {
+ if (this.$win) + this.$win.dialog("close");
+ },
+ create: function () {
+ var o = this.options, + tr = epgd.tr.pages.timerList, + week = '', + i; + for (i = 1; i < epgd.tr.dateTimePicker.dayNamesShort.length; i++) + week += '<input name="tWeek" type="checkbox" />' + epgd.tr.dateTimePicker.dayNamesShort[i]; + week += '<input name="tWeek" type="checkbox" />' + epgd.tr.dateTimePicker.dayNamesShort[0]; + this.$win = $('<div id="' + o.id + '" class="searchDialog"><form>' + + '<div class="colBlock">' + + '<div><label> </label><select id="tType"><option value="R">' + epgd.tr.pages.eventDetail.record + '</option><option value="V">' + epgd.tr.pages.eventDetail.ch_switch + '</option></select></div>' + + '<div><label for="tSName">' + epgd.tr.pages.search.searchName + '</label><input type="text" id="tSName" /></div>' + +'<div><label for="tInactive">' + tr.inactive + '</label><input type="checkbox" id="tInactive" /></div>' + + '</div><div class="ui-corner-all week">' + week + '</div>' + + '<div class="onlyTypeR"><label for="tNameMode">' + tr.namingMode + epgd.pages.help.getIcon('sTNameMode') + '</label><br /><select id="tNameMode"><option>' + tr.namingModes.join('</option><option>') + '</option></select></div>' + + '<div class="onlyTypeR"><label for="tTemplate">' + tr.template + '</label><input class="full" id="tTemplate" type="text" value="" /></div>' + + '<div class="onlyTypeR"><label for="tFolder">' + tr.folder + '</label><input class="full" type="text" id="tFolder" /></div>' + + '<div class="colBlock">' + + '<div class="noTypeS"><label for="tVdr">VDR</label><select id="tVdr"><option value="">Auto</option>' + $('#menu_vdrs').find('select').html() + '</select></div>' + + '<div class="onlyTypeR"><label for="tPrio">' + tr.prio + '</label><input type="number" placeholder="..." min="0" max="99" id="tPrio" style="width:40px" /></div>' + + '<div class="onlyTypeR"><label for="tLife">' + tr.lifetime + '</label><input type="number" placeholder="..." min="0" max="99" style="width:40px" id="tLife"/></div>' + + '<div class="onlyTypeR"><label for="tVPS">' + 'VPS' + '</label><input type="checkbox" id="tVPS" /></div>' + + '</div>' + + '<input type="hidden" id="tID" /><br clear="all" />' + + '</form></div>');//.dialog(o);//.dialog("option", "buttons", o.buttons); + !o.embed && this.$win.appendTo(document.body).dialog(o); + this.$win[0].list = this.list; + this.form = this.$win.find('form')[0]; + $(this.form.tFolder).catcomplete({
+ minLength: 0, + maxHeight: 300
+ }).focus(function () {
+ $(this).catcomplete("search", "");
+ }); + $(this.form.tType).change(function () {
+ if (this.selectedIndex < 0) + this.selectedIndex = 0;
+ this.form.className = this.form.className.replace(/ ?type./, '') + ' type' + this[this.selectedIndex].value;
+ // $('.onlyTypeR', this.form).toggle(this[this.selectedIndex].value == 'R');
+ // $('#tSName').parent().toggle(this[this.selectedIndex].value == 'S');
+ // $('#tRepeat,#tChFormat').parent().toggle(this[this.selectedIndex].value != 'S');
+ }); + $(this.form.tNameMode).change(function () {
+ this.form.tTemplate.parentNode.style.display = (this.selectedIndex == 6) ? 'block': 'none';
+ }); + epgd.utils.addPlaceholders(this.form.tTemplate, '%', tr.templateFields); + this.loadFolder();
+ },
+ render : function (t) {
+ t = t || {}; + if (!this.$win) + this.create(); + !this.options.embed && this.$win.dialog('open').dialog('moveToTop'); + var form = this.form, + d, i; + form.tSName.focus(); + if (t.id) {
+ form.tID.value = t.id; + this.$win.parent().find('#tBDel').show(); + this.$win.parent().find('#tBToggle').hide();
+ } else {
+ form.tID.value = ''; + this.$win.parent().find('#tBDel').hide(); + this.$win.parent().find('#tBToggle').show();
+ } + $(form.tType).val(t.type || 'R').change(); + $(form.tVdr).val(t.vdruuid || epgd.profile.timerDefaultVDRuuid); + d = t.weekdays || 0; + for (i = 0, f = 1; i < form.tWeek.length; i++, f *= 2) + form.tWeek[i].checked = (d & f); + form.tPrio.value = t.priority || ''; + form.tLife.value = t.lifetime || ''; + form.tVPS.checked = t.vps == 1; + form.tInactive.checked = t.active === 0; + form.tFolder.value = t.directory || ''; + form.tSName.value = t.name || '';
+ epgd.pages.help.initButtons(this.$win);
+ this.resize();
+ },
+ resize: function () {
+ /*var dlgOpt = this.$win.dialog("instance").options;
+ dlgOpt.position.my = "center top";
+ dlgOpt.position.at = "center top"; */
+ this.$win.dialog("option", "maxHeight", $(window).height());
+ } + };
+ +// Timerdialog - Klasse +epgd.timerDialog = epgd.utils.inherits(function () {
+ epgd.timerDialogBase.call(this,{
+ id: 'timerDialog', + title: epgd.tr.pages.timer.timerList + ' ' + epgd.tr.edit, + buttons: [{
+ text: epgd.tr.pages.timer.searchTimerList, + icons: { primary: "ui-icon-transferthick-e-w" }, + id: "tBToggle", + click: function () {
+ var t = this.list.dialog.getData(true); + if (t) {
+ $(this).dialog("close"); + //t.channelid && (t.channelids = t.channelid); + if (t.title) {
+ t.expression = t.title;
+ t.searchfields = 1;
+ } + epgd.pages.searchTimerList.dialog.render(t);
+ }
+ }
+ }].concat(epgd.timerDialog.base.options.buttons)
+ });
+}, epgd.timerDialogBase); +epgd.timerDialog.prototype.create = function () {
+ epgd.timerDialog.base.create.call(this); + + var tr = epgd.tr.pages.timerList, + form = this.form; + + $(form).prepend('<input type="hidden" id="tEvID" /><div id="tTitle"></div>'); + $(form.tWeek[0]).parent().before('<div><label for="tStart">' + tr.recordTime + '</label>' + + '<br /><span id="tEvTime"></span> <input type="text" id="tStart" style="width:165px" /> - <input type="text" id="tEnd" style="width:40px" /></div>'); + $(form.tNameMode).after(' <span id="tFile"></span>'); + $(form.tFolder).parent().after('<div><label for="tChannels">' + epgd.tr.channel + + '</label><input id="tChannel" type="text" class="full"/></div>'); + $(this.form.tStart).datetimepicker({
+ minDateTime: epgd.utils.now(),
+ }); + $(this.form.tEnd).timepicker({ + // minDateTime: epgd.utils.now() + }); + epgd.utils.addAutoComplete(form.tChannel, { source: epgd.channels.autoCompleteData }); + form.tFile = $(form).find('#tFile')[0]; + form.tEvTime = $(form).find('#tEvTime')[0]; + form.tTitle = $(form).find('#tTitle').click(function () {
+ if (form.tEvID.value) {
+ epgd.utils.loader.process(function () {
+ new epgd.eventDetail(form.tEvID.value).render();
+ });
+ }
+ })[0];
+}; +epgd.timerDialog.prototype.render = function (t) {
+ t = t || {}; + epgd.timerDialog.base.render.call(this, t); + var form = this.form, + d; + + form.tFile.innerHTML = t.file || '...'; + form.tEvID.value = t.eventid || ''; + epgd.utils.setAutoCompleteValues(form.tChannel, t.channelid ? [t.channelid] : null); + form.tTitle.innerHTML = t.title || ''; + form.tEvTime.innerHTML = t.evStartTime ? epgd.utils.formatDateTime(t.evStartTime) + ' - ' + epgd.utils.formatTime(t.evStartTime + t.evDuration) : ''; + + $([form.tStart, form.tEnd]).datetimepicker("option", "disabled", !!t.eventid); + if (t.day || !t.evStartTime) {
+ if (t.starttime) + d = epgd.utils.date((t.day + parseInt(t.starttime / 100, 10) * 60 * 60 + (t.starttime % 100) * 60)); + else if (t.day) + d = epgd.utils.date(t.day); + else + d = epgd.utils.now(); + $(form.tStart).datetimepicker('setDate', d); + $(form.tStart).datetimepicker('setTime', d); + if (t.endtime) + d = epgd.utils.date((t.day + parseInt(t.endtime / 100, 10) * 60 * 60 + (t.endtime % 100) * 60)); + else + d = new Date(d.getTime() + 2 * 60 * 60000); + $(form.tEnd).datetimepicker('setTime', d);
+ } else {
+ $([form.tStart, form.tEnd]).val('...');
+ } + //form.tNameMode.defaultIndex = parseInt(t.category == 'Serie' ? epgd.profile.namingModeSerie : epgd.profile.namingModeMovie, 10); + form.tNameMode.selectedIndex = typeof t.namingmode == "undefined" ? parseInt(t.category == 'Serie' ? epgd.profile.namingModeSerie : epgd.profile.namingModeMovie, 10) : t.namingmode;
+ form.tTemplate.value = t.template || (t.category == 'Serie' ? epgd.profile.namingModeSerieTemplate : epgd.profile.namingModeMovieTemplate);
+ $(form.tNameMode).change();
+}; +epgd.timerDialog.prototype.getData = function (dontValid) {
+ var form = this.form, + d, i, + data = {}; + if (form.tEvID.value) data.eventid = parseInt(form.tEvID.value, 10); + data.active = form.tInactive.checked ? 0 : 1; + if (form.tID.value) data.id = parseInt(form.tID.value, 10); + if (form.tStart.value && form.tStart.value != '...') {
+ d = $(form.tStart).datepicker('getDate'); + data.starttime = d.getHours() * 100 + d.getMinutes(); + d.setHours(0); + d.setMinutes(0); + data.day = parseInt(d.getTime() / 1000, 10); + data.endtime = parseInt(form.tEnd.value.replace(':', ''), 10);
+ } else if (!data.eventid && !dontValid) + return this.showError(epgd.tr.error.emptyField.replace("$field$", epgd.tr.pages.timerList.recordTime), form.tStart); + data.weekdays = 0; + for (i = 0, f = 1; i < form.tWeek.length; i++, f *= 2) + if (form.tWeek[i].checked) + data.weekdays += f; + data.vps = form.tVPS.checked ? 1 : 0; + if (form.tPrio.value) data.priority = parseInt(form.tPrio.value, 10); + if (form.tLife.value) data.lifetime = parseInt(form.tLife.value, 10); + //if (form.t) data.childlock = form.t; + data.channelid = epgd.utils.getAutoCompleteValues(form.tChannel); + if (!data.channelid && !dontValid) + return this.showError(epgd.tr.error.emptyField.replace("$field$", epgd.tr.channel), form.tChannel); + /*data.file = form.tFile.value; + if (form.tFolder.value) + data.file = form.tFolder.value + '~' + data.file; + */ + d = $(form.tVdr).val(); + if (d) data.vdruuid = d; + //if (!dontValid || form.tNameMode.defaultIndex != form.tNameMode.selectedIndex) + data.namingmode = form.tNameMode.selectedIndex; + data.template = form.tTemplate.value; + data.type = $(form.tType).val(); + if (data.type == 'V' && !d && !dontValid) + return this.showError(epgd.tr.error.emptyField.replace("$field$", "VDR"), form.tVdr); + data.directory = form.tFolder.value; + data.title = form.tTitle.innerHTML || ''; + data.name = form.tSName.value; + return data;
+} +// Suchtimerdialog - Klasse +epgd.searchTimerDialog = epgd.utils.inherits(function (options) { + this.searchResultList = null; + epgd.timerDialogBase.call(this,$.extend({},{
+ id: 'searchTimerDialog', + width: 530, + title: epgd.tr.pages.timer.searchTimerList + ' ' + epgd.tr.edit, + buttons: [{
+ text: epgd.tr.pages.timer.timerList, + icons: { primary: "ui-icon-transferthick-e-w" }, + id: "tBToggle", + click: function () {
+ var t = this.list.dialog.getData(true); + if (t) {
+ $(this).dialog("close"); + t.channelids && (t.channelid = t.channelids.split(',')[0]); + t.expression && (t.title = t.expression); + epgd.pages.timerList.dialog.render(t);
+ }
+ }
+ }, {
+ text: epgd.tr.test, + click: function () {
+ this.list.dialog.search();
+ }
+ }].concat(epgd.searchTimerDialog.base.options.buttons, {
+ text: epgd.tr.copy, + icons: { primary: "ui-icon-copy" }, + id: "tBCopy", + click: function (ev) {
+ $(ev.currentTarget).hide();
+ this.list.dialog.form.tID.value = '';
+ this.list.dialog.form.tSName.value += ' copy';
+ this.list.dialog.form.tSName.select();
+ }
+ })
+ },options)); +}, epgd.timerDialogBase); +epgd.searchTimerDialog.prototype.search = function ($con, searchData) {
+ if (!this.searchResultList)
+ this.searchResultList = new epgd.searchResultList(null);//,this);
+ if (!this.searchResultList.$con || ($con && $con[0] != this.searchResultList.$con[0]))
+ this.searchResultList.render($con || ($('<div style="border-top:1px solid #ccc"></div>').insertAfter(this.form)));
+ else
+ this.searchResultList.$con.find('tbody').empty();
+ if (!this.searchResultList.$con.parent().length) {
+ this.searchResultList.$con.insertAfter(this.form);
+ this.searchResultList.init();
+ }
+ this.searchResultList.update(searchData || this.getData());
+ this.searchResultList.$con[0].scrollIntoView(true);
+} +epgd.searchTimerDialog.prototype.create = function () {
+ epgd.searchTimerDialog.base.create.call(this); + + var tr = epgd.tr.pages.timerList, + trS = epgd.tr.pages.search, + sModes = '', + form = this.form, + key; + + for (key in trS.searchModes) + sModes += '<option value="' + (parseInt(key, 10) + 1) + '">' + trS.searchModes[key] + '</option>'; + if (!epgd.categories) {
+ epgd.categories = []; + epgd.ajax({ url: 'data/categories', async: false }, function (data) { epgd.categories = data.categories; });
+ } + if (!epgd.genres) {
+ epgd.genres = []; + epgd.ajax({ url: 'data/genres', async: false }, function (data) { epgd.genres = data.genres; });
+ } + + $(form.tSName).parent().parent().after('<div><label for="tExpr">' + trS.searchExpression + epgd.pages.help.getIcon('sExpr') + '</label> <input type="text" id="tExpr" style="width:300px" /></div>' + + '<div class="full"><select id="tSMode" style="width:auto">' + sModes + '</select>' + + ' <input type="checkbox" id="tCaseSens" /> <label for="tCaseSens">' + + trS.caseSensitive + '</label></div>' + + '<div class="ui-corner-all week">' + [""].concat(trS.searchFields).join('<input type="checkbox" name="tSFields" />') + '</div>' + + '<div><label for="tAdv"><input type="checkbox" id="tAdv" /> ' + epgd.tr.advanced + epgd.pages.help.getIcon('sTAdv') + '</label><div class="ui-corner-all week">' + + '<span>' + tr.episode + '</span><input type="text" id="tSFEpisode" style="width:200px" /> ' + + '<span>' + epgd.tr.pages.eventDetail.season + '</span><input type="text" id="tSFSeason" style="width:40px" /> ' + + '<span>' + epgd.tr.pages.eventDetail.part + '</span><input type="text" id="tSFSPart" style="width:40px" /> ' + + '<br /><span>' + epgd.tr.pages.eventDetail.category + '</span><input type="text" id="tSFCat" style="width:300px" /> ' + + '<br /><span>' + epgd.tr.pages.eventDetail.genre + '</span><input type="text" id="tSFGenre" style="width:300px" /> ' + + '<br /><input type="checkbox" name="tSFTip" value="GoldTipp" />GoldTipp<input type="checkbox" name="tSFTip" value="TagesTipp" />TagesTipp<input type="checkbox" name="tSFTip" value="TopTipp" />TopTipp' + + '<br /><span>' + epgd.tr.pages.eventDetail.year + '</span><input type="text" id="tSFYear" style="width:70px" />' + + '<br /><input type="checkbox" id="tSFNoEpgMatch" />' + tr.noEpgMatch + + '</div></div>' + + '<div class="noTypeS"><div><label for="tRepeat"><input type="checkbox" id="tRepeat" /> ' + + tr.noRepeat + epgd.pages.help.getIcon('sTRepeat') + '</label><div class="ui-corner-all week">' + [""].concat(trS.searchFields).join('<input type="checkbox" name="tRFields" />') + '</div></div></div>' + + '<div><input type="radio" name="tChExclude" value="1" id="tChExclude0" /><label for="tChInclude">' + tr.chInclude + + '</label>' + epgd.pages.help.getIcon('sTChannels') + '<input type="radio" name="tChExclude" value="0" id="tChExclude1" /><label for="tChExclude">' + tr.chExclude + + '</label></div><input type="text" id="tChannels" class="full"/>' + + '<div class="noTypeS"><label for="tChFormat">' + tr.chFormat + epgd.pages.help.getIcon('sTChFormat') + '</label><input id="tChFormat" readonly onclick="epgd.timerEditChFormat(this)" /></div>' + + '<div><label for="tTime"><input type="checkbox" id="tTime" /> ' + epgd.tr.dateTimePicker.timeText + epgd.pages.help.getIcon('sTime') + '</label></div>'); + $(form.tWeek[0]).before('<span>' + epgd.tr.dateTimePicker.timeTextBetween + ' <input type="text" id="tStart" style="width:40px" /> - <input type="text" id="tEnd" style="width:40px" /></span>') + .parent().append('<br /><span class="onlyTypeS">' + tr.nextDays.replace('$field$','<input style="width:40px" type="text" id="tNextDays" />') + '</span>').insertAfter(form.tTime.parentNode); + $([form.tStart,form.tEnd]).timepicker({
+ alwaysSetTime: false
+ }); + $([form.tTime, form.tRepeat, form.tAdv]).change(function () {
+ $(this).parent().next().toggle(this.checked);
+ }); + $([form.tSFSeason, form.tSFSPart, form.tSFYear]).change(function () {
+ this.value = this.value.replace(/[^0-9-]/g, ''); + if (this.value.length == 1 && this.value == '-') + this.value = '';
+ }); + $(form.tType).append('<option value="S">' + epgd.tr.menu.search + '</option>'); + epgd.utils.addAutoComplete(form.tChannels, { source: epgd.channels.autoCompleteData, multiselect: true }); + epgd.utils.addAutoComplete(form.tSFCat, { source: epgd.categories, multiselect: true }); + epgd.utils.addAutoComplete(form.tSFGenre, { source: epgd.genres, multiselect: true }); +}; +epgd.searchTimerDialog.prototype.render = function (t) {
+ t = t || { searchfields: 1 }; + epgd.searchTimerDialog.base.render.call(this, t); + var form = this.form, + d, i; + form.tExpr.value = t.expression || ''; + $(form.tSMode).val(t.searchmode || 4); + form.tCaseSens.checked = t.casesensitiv == 1; + d = t.searchfields || 0; + for (i = 0, f = 1; i < form.tSFields.length; i++, f *= 2) + form.tSFields[i].checked = (d & f); + if (t.starttime || t.endtime || t.weekdays || t.nextdays) {
+ form.tTime.checked = true; + t.starttime ? $(form.tStart).datetimepicker('setTime', new Date(0, 0, 0, parseInt(t.starttime / 100, 10), (t.starttime % 100))) : form.tStart.value = ''; + t.endtime ? $(form.tEnd).datetimepicker('setTime', new Date(0, 0, 0, parseInt(t.endtime / 100, 10), (t.endtime % 100))) : form.tEnd.value;
+ form.tNextDays.value = t.nextdays || '';
+ } else
+ form.tTime.checked = false; + $(form.tTime).change(); + d = t.repeatfields || 0; + for (i = 0, f = 1; i < form.tRFields.length; i++, f *= 2) + form.tRFields[i].checked = (d & f); + form.tRepeat.checked = d > 0; + $(form.tRepeat).change(); + + form.tSFEpisode.value = t.episodename || ''; + form.tSFSeason.value = t.season || ''; + form.tSFSPart.value = t.seasonpart || ''; + form.tSFYear.value = t.year || ''; + + epgd.utils.setAutoCompleteValues(form.tSFCat, new String(t.category).replace(/'/g, '').split(',')); + epgd.utils.setAutoCompleteValues(form.tSFGenre, new String(t.genre).replace(/'/g, '').split(',')); + d = t.tipp || ''; + for (i = 0; i < form.tSFTip.length; i++) + form.tSFTip[i].checked = d.indexOf("'" + form.tSFTip[i].value + "'") >= 0; + form.tSFNoEpgMatch.checked = t.noepgmatch == 1; + + form.tAdv.checked = t.episodename || t.season || t.seasonpart || t.year || t.category || t.genre || t.tipp || t.noepgmatch; + $(form.tAdv).change(); + epgd.utils.setAutoCompleteValues(form.tChannels, new String(t.channelids).split(',')); + + if (t.chexclude) + form.tChExclude1.checked = 1; + else + form.tChExclude0.checked = 1; + form.tChFormat.value = t.chformat || (t.id ? '' : epgd.profile.chFormat); + form.tNameMode.defaultIndex = parseInt(t.category == 'Serie' ? epgd.profile.namingModeSearchSerie : epgd.profile.namingModeSearchMovie, 10); + form.tNameMode.selectedIndex = t.namingmode || form.tNameMode.defaultIndex; + form.tTemplate.value = t.template || (t.category == 'Serie' ? epgd.profile.namingModeSearchSerieTemplate : epgd.profile.namingModeSearchMovieTemplate);
+ $(form.tNameMode).change();
+ this.$win.parent().find('#tBCopy').toggle(!!t.id);
+}; +epgd.searchTimerDialog.prototype.getData = function (dontValid) {
+ var form = this.form, + d, i, + data = { expression: form.tExpr.value }; + if (form.tSFSeason.value) data.season = form.tSFSeason.value; + if (form.tSFSPart.value) data.seasonpart = form.tSFSPart.value; + if (form.tSFYear.value) data.year = form.tSFYear.value; + if (!dontValid) {
+ if (!data.expression) + return this.showError(epgd.tr.error.emptyField.replace("$field$", epgd.tr.pages.search.searchExpression), form.tExpr); + if (data.season && !/^[0-9]{0,3}-?[0-9]{0,3}$/.test(data.season)) + return this.showError(epgd.tr.error.invalid, form.tSFSeason); + if (data.seasonpart && !/^[0-9]{0,3}-?[0-9]{0,3}$/.test(data.seasonpart)) + return this.showError(epgd.tr.error.invalid, form.tSFSPart); + if (data.year && !/^((19|20)[0-9]{2})?(-|-(19|20)[0-9]{2})?$/.test(data.year)) + return this.showError(epgd.tr.error.invalid, form.tSFYear);
+ } + if (form.tID.value) data.id = parseInt(form.tID.value, 10); + if (form.tSFEpisode.value) data.episodename = form.tSFEpisode.value; + data.category = epgd.utils.getAutoCompleteValues(form.tSFCat, "'"); + data.genre = epgd.utils.getAutoCompleteValues(form.tSFGenre, "'"); + d = ''; + for (i = 0; i < form.tSFTip.length; i++) + if (form.tSFTip[i].checked) d += ",'" + form.tSFTip[i].value + "'"; + data.tipp = d.slice(1); + data.noepgmatch = form.tSFNoEpgMatch.checked ? 1 : 0; + + data.searchmode = parseInt($(form.tSMode).val(), 10); + data.searchfields = 0; + for (i = 0, f = 1; i < form.tSFields.length; i++, f *= 2) + if (form.tSFields[i].checked) + data.searchfields += f; + data.casesensitiv = form.tCaseSens.checked ? 1 : 0; + data.repeatfields = 0; + if (form.tRepeat.checked) {
+ for (i = 0, f = 1; i < form.tRFields.length; i++, f *= 2) + if (form.tRFields[i].checked) + data.repeatfields += f;
+ } + data.active = form.tInactive.checked ? 0 : 1; + + data.channelids = epgd.utils.getAutoCompleteValues(form.tChannels); + data.chformat = form.tChFormat.value; + data.chexclude = form.tChExclude1.checked ? 1 : 0; + if (form.tTime.checked) {
+ data.starttime = parseInt(form.tStart.value.replace(':', ''), 10); + data.endtime = parseInt(form.tEnd.value.replace(':', ''), 10);
+ data.weekdays = 0; + for (i = 0, f = 1; i < form.tWeek.length; i++, f *= 2) + if (form.tWeek[i].checked) + data.weekdays += f;
+ } + data.vps = form.tVPS.checked ? 1 : 0; + if (form.tPrio.value) data.priority = parseInt(form.tPrio.value, 10); + if (form.tLife.value) data.lifetime = parseInt(form.tLife.value, 10); + //if (form.t) data.childlock = form.t; + data.directory = form.tFolder.value; + d = $(form.tVdr).val(); + if (d) data.vdruuid = d; + //if (!dontValid || form.tNameMode.defaultIndex != form.tNameMode.selectedIndex) + data.namingmode = form.tNameMode.selectedIndex; + data.template = form.tTemplate.value; + data.type = $(form.tType).val(); + if (data.type == 'V' && !d && !dontValid) + return this.showError(epgd.tr.error.emptyField.replace("$field$", "VDR"), form.tVdr); + data.name = form.tSName.value; + if (form.tNextDays.value) data.nextdays = parseInt(form.tNextDays.value,10); + return data;
+} +epgd.searchTimerDialog.prototype.save = function (d, url, failFunc, succFunc) {
+ d = d || this.getData();
+ var self = this,
+ id= d.id,
+ name= d.name;
+ d.max = 0;
+ d.id && delete d.id;
+ d.name && delete d.name;
+ epgd.utils.loader.process(function () {
+ epgd.ajax({
+ url: epgd.login.url + "data/search", + type: 'post', + data: JSON.stringify(d)
+ }, function (data) {
+ d.id = id;
+ d.name = name;
+ if (data.count > 50) {
+ epgd.utils.confirm(epgd.tr.pages.timerList.confirmSaveBigResult.replace('$cnt$', data.count), function (ok) {
+ ok && epgd.searchTimerDialog.base.save.call(self, d);
+ });
+ } else
+ epgd.searchTimerDialog.base.save.call(self, d, url, failFunc, succFunc);
+ epgd.utils.loader.close();
+ });
+ },true);
+} +// Suche - Klasse +epgd.searchDialog = epgd.utils.inherits(function () {
+ epgd.searchTimerDialog.call(this, {
+ id: 'search', + embed: true,
+ buttons: null
+ }); + this.searchResultList = new epgd.searchResultList({
+ empty: epgd.tr.pages.search.empty
+ }, this); +}, epgd.searchTimerDialog); +epgd.searchDialog.prototype.create = function () {
+ epgd.searchDialog.base.create.call(this);
+ var form = this.form,
+ search= this,
+ $result = $('<div id="searchResult"></div>').appendTo(this.$win);
+ $('<button type="submit" id="sSearch" class="iAsButton i-search">' + epgd.tr.pages.search.search + '</button>')
+ .insertAfter(form.tExpr)
+ .after(' <input type="checkbox" id="sAdv" /> <label for="sAdv">' + epgd.tr.advanced + '</label>');
+ $(form.tType).parent().hide().parent().css('border-top','1px solid #ccc').insertAfter($(form.tVdr.parentNode.parentNode).hide());
+ $('<input type="button" class="iAsButton" id="tCopy" value="' + epgd.tr.copy + '" />').insertAfter(form.tSName).click(function () {
+ search.form.tID.value = '';
+ search.form.tSName.value += ' copy';
+ search.form.tSName.select();
+ }).prop("disabled", true);
+ $('<input type="button" class="iAsButton" id="tDel" value="' + epgd.tr.del + '" />').insertAfter(form.tSName).click(function () {
+ search.list.del(this.form.tID.value, function () { search.form.tID.value = '';search.loadSavedSearch() });
+ }).prop("disabled", true); $('<input type="button" class="iAsButton" value="' + epgd.tr.save + '" />').insertAfter(form.tSName).click(function () {
+ var d = search.getData();
+ if (!d.name)
+ return this.showError(epgd.tr.error.invalid, form.tSName);
+ search.save(d, null, null, function () { search.loadSavedSearch() });
+ });
+ $(form).submit(function () {
+ search.search($result);
+ return false;
+ }); + this.$win.find('#sExpr').keyup(function (ev) { if (ev.keyCode == 13) { this.form.sSearch.click(); $(this).blur(); } }).focus(); + //$(form.tExpr).parent().next().nextAll().wrapAll('<div id="sAdvView"/>'); + this.$win.find('#sAdv').change(function () {
+ $(form).toggleClass("noAdv", !this.checked); + search.resize(); + }).prop('checked', epgd.profile.searchAdv == "1").change(); + $(form.tSName).autocomplete({
+ minLength: 0, + maxHeight: 300,
+ source:function(){return false}, // damit bei einem focus kein error ausgelöst wird
+ select: function (ev, ui) {
+ var d = ui.item.data || { id: '' };
+ if (d.id) {
+ search.render(d);
+ search.form.sSearch.click();
+ $([form.tDel, form.tCopy, form.tInactive]).prop("disabled", false);
+ return false;
+ } else {
+ form.tID.value = '';
+ $([form.tDel, form.tCopy, form.tInactive]).prop("disabled", true);
+ }
+ }
+ }).focus(function () {
+ $(this).autocomplete("search", "");
+ }); + this.loadSavedSearch();
+} +epgd.searchDialog.prototype.loadSavedSearch = function () {
+ var form = this.form;
+ epgd.ajax({ url: epgd.login.url + "data/searchtimers?type=S" }, function (data) {
+ var list = [];
+ $.each(data.searchtimers, function (id, t) {
+ list.push({ value: t.name || t.expression, label: t.name || t.expression, data: t });
+ });
+ $(form.tSName).autocomplete("option", "source", list);
+ });
+} +epgd.searchDialog.prototype.resize = function () {
+ var $result = this.$win.find('#searchResult'), + h = $(window).height() - $result.offset().top - 20; + if (h < 100) + $result.css({ 'height': 'auto', 'overflow-y': 'visible' }); + else + $result.css({ 'height': h + 'px', 'overflow-y': 'auto' });
+} +epgd.searchDialog.prototype.render = function (t) {
+ if (!epgd.$con.find('#search').length) {
+ $('#menu_search').addClass("menu-active"); + this.create();
+ epgd.$con.html(''); + this.$win.appendTo(epgd.$con); + } + t = t || { searchfields: 1 };
+ t.type = 'S';
+ epgd.searchDialog.base.render.call(this, t);
+}
+epgd.searchDialog.prototype.close = function () { }
diff --git a/http/src/js/channels.js b/http/src/js/channels.js new file mode 100644 index 0000000..add3035 --- /dev/null +++ b/http/src/js/channels.js @@ -0,0 +1,46 @@ +epgd.channels = { + list: null, + autoCompleteData: null, + isDirty: false, + selBox: $('<select id="selChannel"></select>')[0], + load: function () { + if (!this.list || this.isDirty) { + epgd.ajax({ url: epgd.login.url + "data/channels", async: false, cache: false},function (data) { + var logoPath = (epgd.profile.channelLogoPath ? epgd.profile.channelLogoPath + '?maxW=70&maxH=50&id=' : false), + channelOpt = '', + list = {}, + ac_data = []; + data.channels && $.each(data.channels, function (i, channel) { + var id = channel.channelid || i; + if (channel.name) { + channel.html = '<div class="channel" id="' + id + '">' + (logoPath ? '<img src="' + logoPath + id + '" alt="' + channel.name + '" />' + + '<i class="i-tv" title="' + epgd.tr.pages.eventDetail.ch_switch + '" />' + + (epgd.profile.logoShowName == "1" ? channel.name : '') : channel.name) + '</div>'; + channel.visible & 1 && (channelOpt += '<option value="' + id + '">' + channel.name + '</option>'); + } + else { + channel.html = '<div class="channel" id="' + id + '">' + + '<i class="i-tv" title="' + epgd.tr.pages.eventDetail.ch_switch + '" />' + id + '</div>'; + channel.visible & 1 && (channelOpt += '<option value="' + id + '">' + id + '</option>'); + } + list[id] = channel; + ac_data.push({ label: channel.name, value: id }); + }); + epgd.channels.list = list; + epgd.channels.autoCompleteData= ac_data; + $(epgd.channels.selBox).html(channelOpt); + $(window).trigger('channels_load'); + this.dirty = false; + }); + } + }, + getHtml: function (id) { + var ch = this.list[id]; + return ch ? ch.html : '<div class="channel" id="' + id + '">' + + '<i class="i-tv" title="' + epgd.tr.pages.eventDetail.ch_switch + '" />' + id + '</div>'; + }, + getName: function (id) { + var ch = this.list[id]; + return ch ? ch.name : id; + } +};
diff --git a/http/src/js/epgd b/http/src/js/epgd new file mode 100644 index 0000000..8673096 --- /dev/null +++ b/http/src/js/epgd @@ -0,0 +1,3 @@ +var epgd = { + pages: {} +}; diff --git a/http/src/js/eventDetail.js b/http/src/js/eventDetail.js new file mode 100644 index 0000000..8ff8548 --- /dev/null +++ b/http/src/js/eventDetail.js @@ -0,0 +1,523 @@ +epgd.eventDetail = function (id) { + this.id = id; + this.data = null; + this.expire = 0; +} +epgd.eventDetail.prototype.imgPath = false; +epgd.eventDetail.prototype.load = function (channelId, time) { + var self = this; + epgd.ajax({ + url: epgd.login.url + "data/event?" + (channelId && time ? "channelid=" + channelId + "&time=" + time : "id=" + this.id), async: false, cache: false + }, function (data) { + self.data = data.event; self.id = data.id; self.expire = epgd.utils.now().getTime() + 900000; + }); //15*60*1000 + return this; +} +epgd.eventDetail.prototype.render = function () { + if (this.expire < epgd.utils.now().getTime()) + this.load(); + if (!this.data) + return ''; + this.win.render(this); +}; +epgd.eventDetail.prototype.doRecord = function (eData) { + if (eData === true) return epgd.tr.pages.eventDetail.record; // eData = getTitle + eData = eData || this.data; + var tData = { + id: eData.timerid, + eventid: eData.id, + channelid: eData.channelid, + title: eData.title, + evStartTime: eData.starttime, + evDuration: eData.duration, + category: eData.category, + shorttext: eData.shorttext, + expression: eData.title + }; + if (tData.eventid) + epgd.pages.timerList.dialog.render(tData); + else + epgd.pages.searchTimerList.dialog.render(tData); +} +epgd.eventDetail.prototype.doRepeat = function (checkAvail) { + if (checkAvail) return true; + var win = this.win, + $repeatHdl = win.$con.find('.repeat'), + searchData; + if (!$repeatHdl.length) { + if (!this.searchResultList) {
+ this.searchResultList = new epgd.searchResultList(null, {
+ resize: function () {
+ win.$con.last().find('td[data-evId="' + win.detail.data.id + '"]').parent().remove(); + win.$con.accordion("refresh"); + $repeatHdl.click();
+ }
+ });
+ } + $repeatHdl = $('<h3 class="repeat">' + epgd.tr.pages.eventDetail.repeat + '</h3>').appendTo(win.$con); + searchData = { searchfields: 1, expression: this.data.title, searchmode: 1, casesensitiv: 1, fromEventDetail: true }; + if (this.data.shorttext) { + searchData.searchfields1= 2; + searchData.expression1 = this.data.shorttext; + } + epgd.pages.search.search.call(this, $('<div class="desc"></div>').appendTo(win.$con), searchData); + } else + $repeatHdl.click(); +} +epgd.eventDetail.prototype.doPlay = function (checkAvail) { + var t = parseInt(epgd.utils.now().getTime() / 1000, 10) - this.data.starttime; + if (t < 0 || t > this.data.duration) + return false; + if (checkAvail) return true; + epgd.vdrs.current.switchChannel(this.data.channelid); +} +epgd.eventDetail.prototype.doPrev = function (checkAvail) { + var t = this.data.starttime - 500, + self = this; + if (t < epgd.profile.minEventTime) + return false; + if (checkAvail) return true; + epgd.utils.loader.process(function () { + new epgd.eventDetail().load(self.data.channelid, t).render(); + }); +} +epgd.eventDetail.prototype.doNext = function (checkAvail) { + var t = this.data.starttime + this.data.duration + 500, + self = this; + if (t > epgd.profile.maxEventTime) + return false; + if (checkAvail) return true; + epgd.utils.loader.process(function () { + new epgd.eventDetail().load(self.data.channelid, t).render(); + }); +} + +epgd.eventDetail.win = function () { + this._create(); + this.closed = true; + this.detail = null; + var win = this; + $(window).bind("epgd_close.eventDetail", function () { + if (!win.closed) { + //win.$win.css('left', ''); + win.$win.css('z-Index', ''); + win.$win.hide(); + $(document).unbind("keyup.eventDetail"); + win.closed = true; + win.$openDialogs && win.$openDialogs.removeClass("ui-state-disabled"); + } + }); + $(window).bind("resize.eventDetail", function (ev) { + if (!win.closed) { + try { + win.$win.css("max-width", $(window).width()); + win.$win.show().position({ of: window }); + win.$con.accordion("refresh"); + } catch (e) { } + if (parseInt(win.$win.css('top'), 10) < 69) + win.$win.css('top', '69px'); + }; + }); +} +epgd.eventDetail.win.prototype._create = function () { + this.imgPath = epgd.profile.eventImgPath ? epgd.profile.eventImgPath + '?no=0&maxW=270&maxH=146&id=' : false; + this.movieImgPath = epgd.profile.movieMediaPath ? epgd.profile.movieMediaPath + '?actor_id=0&movie_id=' : false; + this.movieActorImgPath = epgd.profile.movieMediaPath ? epgd.profile.movieMediaPath + '?maxW=60&maxH=90&media_type=4&actor_id=' : false; + this.serieImgPath = epgd.profile.serieImgPath ? epgd.profile.serieImgPath + '?actor_id=0&series_id=' : false; + this.serieActorImgPath = epgd.profile.serieImgPath ? epgd.profile.serieImgPath + '?maxW=60&maxH=90&season_number=0&episode_id=0&media_type=11&actor_id=' : false; + + this.$win = $('<div id="eventDetail" class="ui-front">' + + '<div class="ui-front ui-widget ui-widget-content ui-corner-all" style="position:absolute;width:100%;height:100%">' + + '<div class="toolbar ui-widget-header ui-corner-all"></div>' + + '<div></div>' + + '</div>' + + '<div class="ui-widget ui-widget-shadow ui-corner-all" style="position:absolute;width:100%;height:100%"></div>' + + '</div>').appendTo(document.body); + this.$con = this.$win.find(':first :last'); + var win = this, + tr = epgd.tr.pages.eventDetail, + toolbar = this.$win.find('.toolbar')[0]; + this.$rec= $('<button class="iAsButton i-record"/>').css('float', 'left').appendTo(toolbar).click(function () { win.detail.doRecord() }); + $('<button class="iAsButton i-buffer" title="' + tr.repeat + '" />').css('float', 'left').appendTo(toolbar).click(function () { win.detail.doRepeat() }); + this.$play = $('<button class="iAsButton i-tv" title="' + tr.ch_switch + '" />').css('float', 'left').appendTo(toolbar).click(function () { win.detail.doPlay() }); + this.$prev = $('<button class="iAsButton i-rewind" title="' + tr.eventPrev + '" />').appendTo(toolbar).click(function () { win.detail.doPrev() }); + this.$next = $('<button class="iAsButton i-forward" title="' + tr.eventNext + '" />').appendTo(toolbar).click(function () { win.detail.doNext() }); + $('<button class="iAsButton i-cancel" title="' + epgd.tr.close + '" />').css('float', 'right').appendTo(toolbar).click(function () { $(window).trigger("epgd_close.eventDetail"); }); +} + +epgd.eventDetail.win.prototype.render = function (detail) { + this.detail = detail; + var e = detail.data, + tr = epgd.tr.pages.eventDetail, + progress = ((parseInt(epgd.utils.now().getTime() / 1000, 10) - e.starttime) / e.duration * 100), + stars = '', + ep = e.episode || {}, + desc = e.longdescription ? '<div title="longdescription">' + e.longdescription + '</div>' : '', + extInfo = '', + actors = null, + mainImg = (this.imgPath && e.imagecount ? this.imgPath + e.id : ''), + firstImg = null, + constTitle= ep.episodename || e.title, + isMobile = $(window).width() < 500, + terms, i, sc, actor, info1, info2, + recordings= ''; + if (e.cntlongdescription) + desc += '<hr><div title="cntlongdescription">' + e.cntlongdescription + '</div>'; + if (e.rating) { + terms = e.rating.slice(e.rating.indexOf('/')).split(' '); + for (i = 1; i < terms.length; i += 3) + stars += terms[i] + '<div class="stars' + terms[i + 1].length + '"> </div>'; + } + + extInfo = ""; + for (i in tr.extInfo) + if (e[i]) extInfo += '<tr><th>' + tr.extInfo[i] + '</th><td>' + e[i] + '</td></tr>'; + + if (e.scraper && (sc = e.scraper.movie || e.scraper.serie)) { + sc.media = sc.media || []; + if (sc.actors) { + actors = ''; + for (i in sc.actors) { + actor = sc.actors[i]; + actors += '<div>' + (this.movieActorImgPath && actor.actorid ? '<img src="' + this.movieActorImgPath + actor.actorid + '" />' : '') + + '<a href="' + epgd.profile.movieActorPath + actor.actorid + '" target="_blank">' + actor.actorname + '</a>' + (actor.actorrole || '') + '</div>'; + } + } + if (e.scraper.movie) { + sc.isMovie= true; + if ( sc.media && this.movieImgPath){ + if (!mainImg && sc.media["1"]) + mainImg = this.movieImgPath + sc.movieid + '&media_type=1&maxW=270&maxH=146'; + if (sc.media["3"]) + firstImg = this.movieImgPath + sc.movieid + '&media_type=3&maxW=400&maxH=999'; + else if (sc.media["1"]) + firstImg = this.movieImgPath + sc.movieid + '&media_type=1&maxW=400&maxH=999'; + } + + if (sc.actors) { + actors = ''; + for (i in sc.actors) { + actor = sc.actors[i]; + actors += '<div>' + (this.movieActorImgPath ? '<img src="' + this.movieActorImgPath + i + '" />' : '') + + '<a href="' + epgd.profile.movieActorPath + i + '" target="_blank">' + actor.actorname + '</a>' + (actor.actorrole || '') + '</div>'; + } + } + if (sc.overview) + desc = '<div title="overview">' + sc.overview + "</div><hr />" + desc; + + /* 0=mmPoster, 1=mmFanart, 2=mmCollectionPoster, 3=mmCollectionFanart, 4=mmActorThumb, 5=mmPosterThumb */ + extInfo = '<h3><span>' + tr.scrapperMovieInfo + '</span></h3><div>' + + '<table class="colFull">' + + (sc.media["1"] && this.movieImgPath ? '<tr><th colspan="2"><img src="' + this.movieImgPath + sc.movieid + '&media_type=1&maxW=397&maxH=400" /></th></tr>' : '') + + (sc.title ? '<tr><th>' + tr.title + '</th><td>' + sc.title + '</td></tr>' : '') + + (sc.originaltitle ? '<tr><th>' + tr.original_title + '</th><td>' + sc.originaltitle + '</td></tr>' : '') + + (sc.runtime ? '<tr><th>' + tr.runtime + '</th><td>' + sc.runtime + ' ' + epgd.tr.minutes + '</td></tr>' : '') + + (sc.movie_release_date ? '<tr><th>' + tr.release_date + '</th><td>' + sc.movie_release_date + '</td></tr>' : '') + + (sc.genres ? '<tr><th>' + tr.genre + '</th><td>' + sc.genres.replace(/^\||\|$/g, '').replace(/ ?\| ?/g, ', ') + '</td></tr>' : '') + + (sc.voteaverage ? '<tr><th>' + tr.vote_average + '</th><td class="stars"><div class="stars5" style="width:' + parseInt(sc.voteaverage * 8, 10) + 'px"></div> (' + sc.voteaverage.toFixed(1) + ' / 10)</td></tr>' : '') + + (sc.popularity ? '<tr><th>' + tr.popularity + '</th><td>' + sc.popularity.toFixed(1) + '</td></tr>' : '') + + extInfo + + (sc.budget ? '<tr><th>Budget</th><td>$' + sc.budget + '</td></tr>' : '') + + (sc.revenue ? '<tr><th>Einnahmen</th><td>$' + sc.revenue + '</td></tr>' : '') + + (sc.homepage ? '<tr><th>' + tr.homepage + '</th><td><a href="' + sc.homepage + '">' + sc.homepage + '</a></td></tr>' : '') + + '</table>' + + (sc.media["0"] && this.movieImgPath ? '<img class="poster" src="' + this.movieImgPath + sc.movieid + '&media_type=0&maxW=390&maxh=999" />' : ''); + } else { + sc.isSerie = true; + /*0=msBanner1, 1=msBanner2, 2=msBanner3, 3=msPoster1, 4=msPoster2, 5=msPoster3, 7=msFanart1,8=msFanart2, 9=msFanart3, + 6=msSeasonPoster, 10=msEpisodePic, + 11=msActorThumb, 12=msPosterThumb, 13=msSeasonPosterThumb, */ + if (sc.actors) { + actors = ''; + for (i in sc.actors) { + actor = sc.actors[i]; + actors += '<div>' + (this.serieActorImgPath ? '<img src="' + this.serieActorImgPath + i + '&series_id=' + sc.seriesid + '" />' : '') + + '<a>' + actor.actorname + '</a>' + (actor.actorrole ? actor.actorrole.replace(/\|/g, '<br />') : '') + '</div>'; + } + } + terms = sc.episode; + if (terms) { + if (terms.episodeoverview){ + if ( e.longdescription && terms.episodeoverview.length > e.longdescription.length)
+ desc = desc.replace(/^<div.+<\/div>/i, ''); + desc= '<div title="episodeoverview">' + terms.episodeoverview + '</div>' + desc; + } + desc = '<h5>' + terms.episodename + '</h5>' + desc; + if (terms.episodegueststars) + actors += '</div><div class="colFull actors"><h5>' + tr.gueststars + '</h5><br />' + terms.episodegueststars.replace(/^\||\|$/g, '').replace(/\|/g, '<br />'); + } + if (!mainImg && sc.media["10"] && this.serieImgPath) + mainImg = this.serieImgPath + sc.seriesid + '&season_number=' + terms.seasonnumber + '&episode_id=' + terms.episodeid + '&media_type=10&maxW=270&maxH=146'; + if (sc.media["7"]) + firstImg = this.serieImgPath + sc.seriesid + '&season_number=0&episode_id=0&media_type=7&maxW=400&maxh=999'; + if (sc.seriesoverview) + desc += desc ? '<hr /><a href="#" onclick="return !$(this).next().toggle()">Serienbeschreibung</a><div style="display:none" title="seriesoverview">' + sc.seriesoverview + "</div>" : '<div>' + sc.seriesoverview + '</div>'; + extInfo = '<h3><span>' + tr.scrapperSerieInfo + '</span></h3><div>' + + '<table class="colFull">' + + (sc.media["1"] && this.serieImgPath ? '<tr><th colspan="2"><img src="' + this.serieImgPath + sc.seriesid + '&season_number=0&episode_id=0&media_type=1&maxW=397&maxH=250" /></th></tr>' : '') + + (sc.media["10"] && this.serieImgPath ? '<tr><th colspan="2"><img src="' + this.serieImgPath + sc.seriesid + '&season_number=' + terms.seasonnumber + '&episode_id=' + terms.episodeid + '&media_type=10&maxW=397&maxH=400" /></th></tr>' : '') + + (sc.seriesname ? '<tr><th>' + tr.title + '</th><td>' + sc.seriesname + '</td></tr>' : '') + + (sc.seriesnetwork ? '<tr><th>' + tr.network + '</th><td>' + sc.seriesnetwork + '</td></tr>' : '') + + (sc.seriesstatus ? '<tr><th>' + tr.seriesstatus + '</th><td>' + sc.seriesstatus + '</td></tr>' : '') + + (sc.seriesfirstaired ? '<tr><th>' + tr.release_date + '</th><td>' + sc.seriesfirstaired + '</td></tr>' : '') + + (sc.seriesgenre ? '<tr><th>' + tr.genre + '</th><td>' + sc.seriesgenre.replace(/^\||\|$/g, '').replace(/ ?\| ?/g, ', ') + '</td></tr>' : '') + + (sc.seriesrating ? '<tr><th>' + tr.vote_average + '</th><td class="stars"><div class="stars5" style="width:' + parseInt(sc.seriesrating * 8, 10) + 'px"></div> (' + sc.seriesrating.toFixed(1) + ' / 10)</td></tr>' : '') + + extInfo + + (epgd.profile.serieSeasonPath ? '<tr><td colspan="2"><a href="' + epgd.profile.serieSeasonPath + sc.seriesid + '" target="_blank">' + tr.homepage + '</a></td></tr>' : '') + + '</table>' + + (sc.media["6"] && this.serieImgPath ? '<img class="poster" src="' + this.serieImgPath + sc.seriesid + '&season_number=' + terms.seasonnumber + '&episode_id=0&media_type=6&maxW=390&maxh=999" />' : '') + + (sc.media["3"] && this.serieImgPath ? '<img class="poster" src="' + this.serieImgPath + sc.seriesid + '&season_number=0&episode_id=0&media_type=3&maxW=390&maxh=999" />' : ''); + } + } else { + sc = {}; + extInfo = '<h3><span>' + tr.extentedInfo + '</span></h3><div><table class="colFull">' + + '<tr><th>' + tr.title + '</th><td>' + e.title + '</td></tr>' + + (ep.partname ? '<tr><th>' + tr.part + '</th><td>' + ep.partname + '</td></tr>' : '') + + (e.year ? '<tr><th>' + tr.release_date + '</th><td>' + e.year + '</td></tr>' : '') + + (ep.lang ? '<tr><th>' + tr.lang + '</th><td>' + ep.lang + '</td></tr>' : '') + + extInfo + + '</table>'; + } + if (!actors && e.actor) + actors = e.actor.replace(/, /g, '<br />'); + actors && (extInfo += '<div class="colFull actors"><h5>' + tr.actors + '</h5>' + actors + '</div>'); + extInfo && (extInfo += '</div>'); + + info1 = (e.path ? epgd.tr.pages.timerList.folder + '<br />' + e.path.replace(/\//g, ' / ') + '<br />' : '') + + (e.genre ? (tr.genre + '<b>' + e.genre + '</b><br />') : '') + + (e.category ? tr.category + '<b>' + e.category + '</b><br />' : '') + + (e.country ? tr.country + '<b>' + e.country + '</b><br />' : '') + + (e.year ? tr.year + '<b>' + e.year + '</b><br />' : ''); + info2 = (ep.part ? tr.part + '<b>' + ep.part + (ep.parts ? ' / ' + ep.parts + '' : '') + '</b><br />' : '') + + (ep.season ? tr.season + '<b>' + ep.season + '</b><br />' : '') + + (ep.number ? tr.number + '<b>' + ep.number + '</b><br />' : ''); + + /* + e.recordings = [
+ {
+ "matchdensityshorttext": 12,
+ "owner": "7F13E490-09B3-401C-B26C-8B7F2F111014",
+ "name": "Star Wars: Episode III - Die Rache der Sith",
+ "duration": 10736,
+ "path": "Die_Biene_Maja/S03E04/2014-03-23.06.53.29-0.rec",
+ "md5path": "f6abd21ea13f52626723b3321c7a8c42",
+ "matchdensitytitle": 68,
+ "starttime": 1395553980,
+ "title": "Star Wars: Episode III - Die Rache der Sith",
+ "shorttext": "Science-Fiction (USA 2005)"
+ },
+ {
+ "matchdensityshorttext": 48,
+ "owner": "7F13E490-09B3-401C-B26C-8B7F2F111014",
+ "name": "Star Wars: Das Erwachen der Macht",
+ "duration": 8783,
+ "path": "Das_Traumhotel/2016-05-15.18.28.64-0.rec",
+ "md5path": "0279b0d04b68e891ef2b7e6d8bcdd059",
+ "matchdensitytitle": 70,
+ "starttime": 1463329680,
+ "title": "Star Wars: Das Erwachen der Macht",
+ "sho__rttext": "Star Wars - Episode VII: The Force Awakens"
+ }
+ ];
+ */ + + if (e.recordings) + for (i in e.recordings) {
+ terms= e.recordings[i];
+ recordings += '<div class="rec" data-start="' + terms.starttime + '" data-owner="' + (terms.owner || '') + + '" data-md5="' + terms.md5path + '" data-path="' + terms.path + '">' + + '<em>' + epgd.utils.formatDateTime(terms.starttime) + '</em><u>' + parseInt(terms.duration / 60, 10) + ' ' + epgd.tr.minutes + + '</u><b onclick="new epgd.recordDetail(this.parentNode).render()">' + + '<div class="progress" title="' + terms.matchdensitytitle + '% ' + epgd.tr.pages.search.matchdensity + '"><div style="width:' + terms.matchdensitytitle + '%" ></div></div>' + terms.title
+ + (terms.shorttext ? '<i><div class="progress" title="' + terms.matchdensityshorttext + '% ' + epgd.tr.pages.search.matchdensity + '"><div style="width:' + terms.matchdensityshorttext + '%" ></div></div>' + terms.shorttext + '</i>' : '') + + '</b></div>';
+ } + + this.$con = $('<div><h3><div class="date">' + $.datepicker.formatDate(isMobile ? 'd. M y' : 'd. MM yy', epgd.utils.date(e.starttime)) + '</div>' + + (isMobile ? '' : e.title) + '<div class="time"><b>' + + epgd.utils.formatTime(e.starttime) + '</b> – ' + epgd.utils.formatTime(e.starttime + e.duration) + + ' ' + epgd.tr.oClock + ' | ' + parseInt(e.duration / 60, 10) + ' ' + epgd.tr.minutes + '</div></h3>' + + '<div>' + + '<div class="colFull">' + + '<div class="imgBox">' + (mainImg ? '<img src="' + mainImg + '" />' : '') + '</div>' + + '<div class="chPrFl">' + + epgd.channels.getHtml(e.channelid) + + (progress > 0 && progress <= 100 ? '<div class="progress"><div style="width: ' + progress + '%"></div></div>' : '') + + '<div class="audio">' + + (e.flags && e.flags.indexOf('16:9') > 0 ? '<span class="a-169"></span>' : '') + + (e.audio && e.audio.indexOf('DolbyDigital') >= 0 ? '<span class="a-dd" title="DolbyDigital"></span>' : '') + + (e.flags && e.flags.indexOf('Live') > 0 ? 'Live' : '') + + (e.parentalrating ? '<div class="parRate' + e.parentalrating + '">' + tr.parentalrating + e.parentalrating + '</div>' : '') + + '</div>' + + (e.merge ? '<div>' + tr.mergeSrc + e.merge + '</div>' : '') + + '</div>' + + (stars ? '<div class="stars">' + stars + '</div>' : '') + + '<div class="col2">' + + e.title + (ep.partname ? '<br /><i>' + ep.partname + '</i>' : (e.shorttext ? '<br /><i>' + e.shorttext + '</i>' : '')) + + '</div><div class="col2 rate rate' + (e.numrating || '0') + '">' + + (e.tipp ? '<b class="tipp">' + e.tipp + '</b>' : '') + + (e.txtrating ? '<span>' + e.txtrating + '</span>' : '') + + (e.shortreview || '') + + '</div>' + + (info1 ? '<div class="info">' + info1 + '</div>': '') + + (info2 ? '<div class="info">' + info2 + '</div>' : '') + + (firstImg ? '<img src="' + firstImg + '" />' : '') + + '</div>' + + '<div class="colFull desc">' + (desc ? desc.replace(/\n/g, '<br />') : '') + '</div>' + + '</div>' + + extInfo + + (e.category == 'Serie' || sc.isSerie ? '<h3 data-conti="' + constTitle + '"><span>' + tr.constabelInfo + '</span></h3><div class="desc">' + + '<a class="iAsButton i-edit" href="' + epgd.profile.constabelEditPath + encodeURIComponent(constTitle) + '.episodes' + '" target="constabel">' + epgd.tr.edit + '</a>' + + '<a class="iAsButton i-link-ext" href="' + epgd.profile.constabelLinkPath + encodeURIComponent(constTitle) + '" target="constabel">' + epgd.tr.pages.eventDetail.addConstableLink + '</a>' + + epgd.pages.help.getButton('constabel',true) + + (epgd.profile.constabelLoginPath ? '<a class="iAsButton i-login" href="' + epgd.profile.constabelLoginPath + '" target="constabel">' + epgd.tr.pages.eventDetail.loginConstable + '</a>' : '') + + '<pre id="cRaw"></pre>' + + '</div>' + : '') + + (recordings ? '<h3><span>' + epgd.tr.menu.records + '</span></h3><div class="recordings">' + recordings + '</div>' : '') + + '</div>').replaceAll(this.$con); + this.$con.accordion({ + heightStyle: "fill", + header: "h3", + active: 0, + beforeActivate: function(ev, ui){ + if (ui.newHeader.attr('data-conti')) { + epgd.utils.loader.process(function () {
+ epgd.ajax({ url: epgd.login.url + 'data/proxy?id=constabel&title=' + encodeURIComponent(encodeURIComponent(ui.newHeader.attr('data-conti'))) + '&_' + new Date().getTime(), dataType: "html", contentType: "text/plain; charset=utf-8" }, function (data) {
+ if (data.indexOf('Error:') == -1) {
+ var $pre = ui.newPanel.find('#cRaw'), + thead = '<thead><tr><th>' + tr.season + '</th><th>' + tr.part + '</th><th>' + tr.number + '</th><th>' + tr.title + '</th>', + tbody = '<tbody>', + lines = data.split(/\r?\n/), + line, m, i; + for (i = 0; i < lines.length; i++) {
+ line = lines[i]; + if (line.charAt(0) == '#') {
+ m = line.match(/EXTRACOL[0-9] (.+)/i); + if (m) + thead += '<th>' + m[1] + '</th>';
+ } else {
+ m = line.split(/\t/); + if (m.length > 3) + tbody += '<tr><td>' + m.join('</td><td>') + '</td></tr>';
+ }
+ } + $pre.html(data).hide().before('<a href="#" onclick="return !!$(\'#cRaw\').toggle()[0].scrollIntoView()">Raw</a>'); + $pre.before('<table>' + thead + '</thead>' + tbody + '</tbody></table>');
+ } else
+ ui.newPanel.find('#cRaw').html(epgd.tr.error.noData);
+ epgd.utils.loader.close();
+ });
+ ui.newHeader.removeAttr('data-conti');
+ },true); + } + } + }); + this.$rec.toggleClass("hasTimer", !!e.timerid).prop("title", this.detail.doRecord(true)); + this.$play.toggle(this.detail.doPlay(true)); + this.$prev.toggle(this.detail.doPrev(true)); + this.$next.toggle(this.detail.doNext(true)); + this.$con.find('.channel .i-tv').click(function () { epgd.vdrs.current.switchChannel(this.parentNode.id); }); + //this.$win.position({ of: window }); + this.closed = false; + + i = Math.max.apply(null, this.$win.siblings(".ui-front:visible").map(function () { + return +$(this).css("z-index"); + }).get()); // zIndexMax + if (i >= +this.$win.css("z-index")) + this.$win.css("z-index", i + 1); + + $(window).trigger("resize.eventDetail"); + this.$openDialogs = $('.ui-dialog:visible:not(.ui-state-disabled)').addClass("ui-state-disabled"); + $(document).bind("keyup.eventDetail", function (e) { + if (e.keyCode == 27) {
+ $(window).trigger("epgd_close.eventDetail");
+ } + }); + epgd.pages.help.initButtons(this.$con); +} + +epgd.recordDetail = epgd.utils.inherits(function (elem) { + this.elem = elem; + return epgd.eventDetail.call(this); +}, epgd.eventDetail); +epgd.recordDetail.prototype.load = function () { + var self = this; + epgd.ajax({ + url: epgd.login.url + 'data/recording?starttime=' + this.elem.getAttribute('data-start') + '&md5path=' + this.elem.getAttribute('data-md5') + '&owner=' + this.elem.getAttribute('data-owner'), async: false + }, function (data) { + self.data = data.recording; + }); + return this; +} +epgd.recordDetail.prototype.doRecord = function (eData) {
+ if (eData === true) return epgd.tr.pages.records.similarTimer; // eData = getTitle + epgd.eventDetail.prototype.doRecord.call(this, eData); +} +epgd.recordDetail.prototype.doPlay = function (checkAvail) { + if (checkAvail) return true; + epgd.ajax({ url: epgd.login.url + 'data/replayrecording?vdruuid=' + ( !epgd.vdrs.list[this.data.vdruuid].usecommonrecfolder ? this.data.vdruuid : epgd.vdrs.current.uuid ) + '&starttime=' + this.data.starttime + '&md5path=' + this.data.md5path + '&owner=' + (this.data.owner || ''), cache: false }, function (data) { + epgd.utils.popup(data.result.message, { title: 'VDR', autoClose: 5000 }); + }); +} +epgd.recordDetail.prototype.doPrev = function (checkAvail) { + var $elem = $(this.elem).prev('.rec'); + if (!$elem.length) + return false; + if (checkAvail) return true; + $elem.find('B').click(); +} +epgd.recordDetail.prototype.doNext = function (checkAvail) { + var $elem = $(this.elem).next('.rec'); + if (!$elem.length) + return false; + if (checkAvail) return true; + $elem.find('B').click(); +} + +epgd.doneTimerDetail = epgd.utils.inherits(function (tr) {
+ this.tr = tr; + return epgd.eventDetail.call(this);
+}, epgd.eventDetail); +epgd.doneTimerDetail.prototype.load= function () {
+ var self = this; + epgd.ajax({ url: epgd.login.url + 'data/donetimer?id=' + this.tr.tData.id, async: false, cache: false }, function (data) {
+ var t = data.donetimer; + if (t.state) + t.cntlongdescription = epgd.pages.timerListDone.stateIcons[t.state]; + t.episode = { lang: t.episodelang, season: t.episodeseason, part: t.episodepart };
+ self.id = data.id; + self.expire = epgd.utils.now().getTime() + 900000;
+ delete t.timerid;
+ delete t.id;
+ self.data = t;
+ }); + return this;
+};
+epgd.doneTimerDetail.prototype.doRecord= function (eData) {
+ if (eData === true) return epgd.tr.pages.records.similarTimer; + epgd.eventDetail.prototype.doRecord.call(this, eData); + //epgd.pages.searchTimerList.dialog.render(eData || this.data); +}; +epgd.doneTimerDetail.prototype.doPlay= function (checkAvail) {
+ return false;
+}; +epgd.doneTimerDetail.prototype.doPrev= function (checkAvail) {
+ var $elem = $(this.tr).prev('tr'); + if (!$elem.length) + return false; + if (checkAvail) return true; + $elem.find('td').click();
+}; +epgd.doneTimerDetail.prototype.doNext= function (checkAvail) {
+ var $elem = $(this.tr).next('tr'); + if (!$elem.length) + return false; + if (checkAvail) return true; + $elem.find('td').click();
+};
+ + +$(document).ready(function () { + epgd.eventDetail.prototype.win = new epgd.eventDetail.win(); +});
\ No newline at end of file diff --git a/http/src/js/pages.editChannels.js b/http/src/js/pages.editChannels.js new file mode 100644 index 0000000..74883c3 --- /dev/null +++ b/http/src/js/pages.editChannels.js @@ -0,0 +1,313 @@ +epgd.pages.editChannels = { + /* $.get("http://wwwa.tvmovie.de/static/tvghost/html/onlinedata/cftv520/datainfo.txt").done(function(data){console.log(data)}) */ + + render: function () { + if (!(epgd.login.rights & epgd.rights.umConfigEdit) == epgd.rights.umConfigEdit) return epgd.utils.popup(epgd.tr.error.forbidden, { title: epgd.tr.error.error }); + var tr = epgd.tr.pages.editChannels, + $panel = epgd.$con, + $but, + lis='', + vdrs= '', + merge, + src, id, plg, uuid,ch; + for (id in epgd.channels.list) { + ch = epgd.channels.list[id]; + merge = []; + for (plg in ch.sources) { + src = ch.sources[plg]; + merge[src.merge] = '<li><u>' + plg + '</u> <input type="text" readonly value="' + src.extid + '" /></li>'; + } + //merge[99] = '<li>dvb</li>'; + lis+='<li><em class="i-check' + (ch.visible & 1 ? '' : '-empty') + + '"></em><em style="display:none" class="i-check' + (ch.visible & 2 ? '' : '-empty') + + '"></em><span>' + id + '</span><input type="text" value="' + (ch.name || '') + '" />' + //+ '<ol>' + merge.join('') + '</ol>' + + '</li>'; + }; + for (uuid in epgd.vdrs.list) + vdrs += '<li data-url="vdr&uuid=' + uuid + '">' + epgd.vdrs.list[uuid].name + '</li>'; + + /* + merge = []; + merge[1] = '<li><u>tvm</u> <input type="text" value="enter id" /></li>'; + merge[2] = '<li><u>epgdata</u> <input type="text" value="enter id" /></li>'; + //merge[99] = '<li>dvb</li>'; + <a class="ui-icon ui-icon-trash">Trash</a> + */ + $but = $panel.html('<div class="ui-widget"><div class="ui-state-highlight ui-corner-all" style="padding: 0.3em 0.7em; font-size:0.9em">' + + '<button class="iAsButton i-down-dir">' + tr.menu.channelList + '</button> ' + + '<span class="i-info-circled" style="display:inline-block"></span>' + epgd.tr.pages.editChannels.headline + + '</div></div>' + + '<div class="pageEditChannels" id="pageEditChannelsHead"><div class="selMarkBlock"><b title="' + epgd.tr.markAll + '" class="selected" data-t="1"></b><b title="' + epgd.tr.markNone + + '" data-t="0"></b><b title="' + epgd.tr.markToggle + '"><b class="selected"></b></b></div><div class="selMarkBlock" data-index="0" title="' + epgd.tr.pages.editChannels.checkWeb + + '">Web<em title="' + epgd.tr.markAll + '" class="iAsButton i-check"></em><em title="' + epgd.tr.markNone + + '" class="iAsButton i-check-empty"></em></div>' + //+ '<div data-index="1" title="' + epgd.tr.pages.editChannels.checkVDR + //+ '">VDR<em title="' + epgd.tr.markAll + '" class="iAsButton i-check"></em><em title="' + epgd.tr.markNone + //+ '" class="iAsButton i-check-empty"></em></div>' + + '<span><input type="text"/>channel-id</span><span><input type="text"/>channel-name</span>' + //+ '<div>merging</div>' + + '</div>' + ).find('button'); + + $but.click(function () { + var $menu = this.$menu.show(); + $(document).bind("click.ui_menu", function (ev) { + if (!$(ev.target).closest(".ui-menu").length) { + $menu.hide(); + $(this).unbind("click.ui_menu"); + } + }); + return false; + })[0].$menu = $('<ul style="font-size:0.8em; width:200px;position:absolute">' + + '<li data-id="loadList"><a>' + tr.menu.referenceList + '</a><ul style="width:100px">' + + '<li data-id="channelpedia"><a>channelpedia</a></li>' + + ( vdrs ? '<li><a>VDR</a><ul>' + vdrs + '</ul></li>' : '') + + '<li data-id="insertList"><a>' + tr.menu.insertAsText + '</a></li>' + + '</ul></li>' + + '<li data-id="getChannelNames"><a>' + tr.menu.extentEmptyChannelNames + '</a></li>' + + '<li data-id="getAllChannelNames"><a>' + tr.menu.applyAllChannelNames + '</a></li>' + + '<li data-id="getOrder"><a>' + tr.menu.applyChannelSort + '</a></li></ul>').hide().insertAfter($but).menu({ + select: function (ev, ui) { + var $li = ui.item, + ul, path, + filter = ''; + if (!$li.attr('data-id')) + $li = $li.parents('li[data-id]:first'); + switch ($li.attr('data-id')) { + case 'getChannelNames': + filter= '[value=""]'; + case 'getAllChannelNames': + epgd.utils.loader.process(function () { + var list = []; + $('#pageEditChannelsSource li').each(function () { + list[this.lastChild.innerHTML] = this.firstChild.innerHTML; + }) + $('#pageEditChannels > li > input' + filter).each(function () { + this.value = list[this.previousSibling.innerHTML] || this.value; + }); + }); + break; + case 'getOrder': + epgd.utils.loader.process(function () { + var $list = $('#pageEditChannels'), + $span; + $($('#pageEditChannelsSource span').get().reverse()).each(function () { + $span = $list.find('> li > span:contains(' + this.innerHTML + ')'); + if ($span.length) + $span.parent().prependTo($list); + }); + }); + break; + case 'insertList': + $('<div title="channel.conf"><p>' + tr.desc_insertList + ' <a href="http://channelpedia.yavdr.com/gen/DVB-S/S19.2E/S19.2E_complete_sorted_by_groups.channels.conf" target="forList">channelpedia.yavdr.com</p><textarea style="width:100%; height:60%"></textarea><button>ok</button></div>').dialog({ + modal: true, + width: 500, + height: 400 + }).find('textarea').change(function () { + epgd.pages.editChannels.insertReferenceList(this.value); + $(this).parent().dialog('destroy'); + }); + break; + case 'loadList': + if (ui.item.attr('data-url')) { + epgd.ajax({url:epgd.login.url + 'data/proxy?id=' + ui.item.attr('data-url'), dataType: "html", contentType: "text/plain; charset=utf-8"},epgd.pages.editChannels.insertReferenceList); + break; + } + case 'channelpedia': + ul = $('<ul style="width:100px" />').appendTo(ui.item)[0]; + epgd.ajax({url:epgd.login.url + 'data/proxy?id=channelpedia', dataType: "html", contentType: "text/plain; charset=utf-8"},function (data) { + $li.attr('data-id', ''); + var $ul = $(data.replace(/<img [^>]+>/g, '')).find('.entryMenu > ul:first'); + $ul.find('br').remove(); + $ul.find('a').each(function () { + this.parentNode.setAttribute('data-url', this.getAttribute("href")); + this.removeAttribute('href'); + }); + $ul.find('>li').each(function () { + $('<li data-id="channelpediaList"><a>' + this.firstChild.innerHTML + '</a></li>').append($(this).next('ul').width(400)).appendTo(ul); + }); + $(ev.target).menu("refresh").menu("expand"); + }); + return true; + case 'channelpediaList': + path = ui.item.attr('data-url'); + $li.attr('data-id', 'loadList'); + ui.item.removeAttr('data-url'); + epgd.ajax({ url: epgd.login.url + 'data/proxy?id=channelpedia&path=' + path, dataType: "html", contentType: "text/plain; charset=utf-8" }, function (data) { + var $ul = $('<ul />'); + $(data).find('.singleSourceMainMenu li:contains("channels.conf")').each(function () { + var $this = $(this); + $('<li title="' + $this.find('.description').text() + '" data-url="channelpedia&path=' + + path + $this.find('.button a').attr('href') + '"><a>' + + $this.find('.caption').text() + '</a></li>').appendTo($ul); + }); + $ul.appendTo(ui.item); + $(ev.target).menu("refresh").menu("expand"); + }); + return true; + default: + return false; + } + $(document).trigger("click.ui_menu"); + } + }).position({ + my: "left top", + at: "left bottom", + of: $but[0] + }); + $('<button class="iAsButton i-save">' + epgd.tr.save + '</button>').insertAfter($but).click(function () { + var data = {}; + $('#pageEditChannels > li').each(function (index) { + var $this = $(this), + sources = {}; + merge = {}; + $this.find('>ol>li').each(function (index) { + var $this = $(this), + extid = $this.find('input').val(); + sources[$this.find('u').text()] = merge = { merge: index }; + if (extid) merge.extid = extid; + }); + data[$this.find('span').text()] = { + name: $this.find('input').val(), + visible: $this.find('em:eq(0)').hasClass('i-check') * 1 + $this.find('em:eq(1)').hasClass('i-check') * 2, + order: index + 1, + sources: sources + } + }); + epgd.ajax({ + url: epgd.login.url + 'data/save-channels', + type: 'post', + data: JSON.stringify({ "channels": data }) + },function (data) { + data = data.result; + if (data.state == 200) { + epgd.utils.popup(epgd.tr.dataSaved); + epgd.channels.isDirty = true; + } + else + epgd.utils.popup(data.message); + }); + }); + + $('<ol id="pageEditChannels" class="pageEditChannels">' + lis + '</ol>').appendTo($panel).sortable({ + revert: 'invalid', + handle: ':not(em)' + }).click(function (ev) { + if (ev.target.nodeName == "EM") + $(ev.target).toggleClass('i-check i-check-empty'); + else { + $li = $(ev.target).closest('li'); + if ($li.parent('#pageEditChannels').length) { + $li.toggleClass('selected'); + if (ev.shiftKey && this.lastSel) { + var $lastSel = $(this.lastSel), + delta = $li.index() - $lastSel.index(); + if (delta > 0) + $lastSel.nextAll(':lt(' + delta + '):not(.filterHide)').toggleClass('selected', $lastSel.hasClass('selected')); + else + $lastSel.prevAll(':lt(' + -delta + '):not(.filterHide)').toggleClass('selected', $lastSel.hasClass('selected')); + } + else + this.lastSel = $li[0]; + } + } + }); + $('<ol id="pageEditChannelsSource" class="pageEditChannels"></ol>').appendTo($panel).sortable({ + connectWith: '#pageEditChannels', + revert: "invalid", + remove: function (e, ui) { + $('<li><em class="i-check"></em>' + //+ '<em class="i-check"></em>' + + '<span>' + ui.item.find('span').text() + + '</span><input type="text" value="' + ui.item.find('i').text() + '" />' + //+ '<ol></ol>' + +'</li>').insertAfter(ui.item); + return false; + }, + }).hide(); + $panel.append('<br clear="all" />'); + $(window).bind("resize.editChannels", function () { + var h = $(window).height() - $('#pageEditChannels').offset().top -20; + if ($('#pageEditChannelsSource:visible').length == 0 || ($panel.width() - $('#pageEditChannels').width() - $('#pageEditChannelsSource').width() - 80) > 0) + $('#pageEditChannels,#pageEditChannelsSource').css({ height: h }); + else { + $('#pageEditChannels').height(h*0.66); + $('#pageEditChannelsSource').height(h * 0.33); + } + }).trigger('resize'); + $(window).bind("epgd_close.editChannels", function () { + $(window).unbind(".editChannels"); + epgd.channels.load(); + }); + + /* + .find('ol').sortable({ + connectWith: "#mergeSrc" + }); + */ + /*, + cancel: ??? + accept: function (event, ui) { + console.log(ui); + return $(event.target).html().indexOf('>' + ui.item.find('u').text() + '<') > 0; + }*/ + /* + $('#mergeSrc').droppable({ + accept: "#pageEditChannels ol li", + drop: function (event, ui) { + $(ui.draggable).remove(); + } + }).find('li').draggable({ + connectToSortable: "#pageEditChannels ol", + helper: "clone", + }); + */ + + $('#pageEditChannelsHead em').click(function () { + var $sel = null, + $lis; + try { + $sel = $(window.getSelection().getRangeAt(0).cloneContents()).children(); + } catch (e) { $sel = null; } + if (!$sel || !$sel.length) { + $lis = $('#pageEditChannels > li'); + $sel = $lis.filter('.selected'); + if (!$sel.length) + $sel = $lis; + } + + $sel.find('> em:eq(' + this.parentNode.getAttribute('data-index') + ').i-check' + (this.className.indexOf('i-check-empty') > 0 ? '' : '-empty')).toggleClass('i-check i-check-empty'); + }); + + $('#pageEditChannelsHead b').click(function () { + var t = this.getAttribute('data-t'); + $('#pageEditChannels > li').toggleClass('selected', t == 1 ? true : t == 0 ? false : undefined); + return false; + }); + this.inp_ChID = $('#pageEditChannelsHead input:eq(0)').keyup(this.filter)[0]; + this.inp_ChName = $('#pageEditChannelsHead input:eq(1)').keyup(this.filter)[0]; + }, + filter: function () {
+ var id = epgd.pages.editChannels.inp_ChID.value.toLowerCase(),
+ name = epgd.pages.editChannels.inp_ChName.value.toLowerCase();
+ $('#pageEditChannels > li').each(function () {
+ var $li = $(this);
+ if ((!id || $li.find('span').text().toLowerCase().indexOf(id) >= 0) && (!name || $li.find('input').val().toLowerCase().indexOf(name) >= 0)) + $li.removeClass('filterHide'); + else + $li.addClass('filterHide');
+ }); + }, + insertReferenceList: function (data) { + var html = '', + terms; + $(data.split('\n')).each(function () { + terms = this.split(':'); + if (terms[0]) + html += '<li><i>' + terms[0].split(/,|;/)[0] + '</i><span>' + terms[3] + '-' + terms[10] + '-' + terms[11] + '-' + terms[9] + '</span></li>'; + }) + $('#pageEditChannelsSource').show().html(html); + $(window).trigger("resize.editChannels"); + } +}; diff --git a/http/src/js/pages.editUser.js b/http/src/js/pages.editUser.js new file mode 100644 index 0000000..e41b67c --- /dev/null +++ b/http/src/js/pages.editUser.js @@ -0,0 +1,96 @@ +epgd.pages.editUser = { + cur: null, + render: function () { + if (!(epgd.login.rights & epgd.rights.umConfigUsers) == epgd.rights.umConfigUsers) return epgd.utils.popup(epgd.tr.error.forbidden, { title: epgd.tr.error.error }); + var tr = epgd.tr.pages.editUser, + $form= $('<form></form>'), + $sel = $('<select size="10"></select>').change(function () { + epgd.pages.editUser.showUser(this[this.selectedIndex].data, $form, epgd.pages.editUser.render); + }); + $('<option>' + tr.add + '</option>').appendTo($sel)[0]; + epgd.$con.html('<div id="page_editUser"><div><h2>' + tr.user + '</h2></div></div>'); + epgd.ajax({ url: epgd.login.url + "data/users", cache: false }, function (data) { + for (var uName in data.users) { + $('<option>' + uName + '</option>').appendTo($sel)[0].data = data.users[uName]; + } + }); + epgd.$con.find('#page_editUser').append($form).children().first().append($sel); + }, + showUser: function (userData, $form, callback) { + epgd.pages.editUser.cur = userData || {"user": "", "active": 1, "rights": epgd.login.rights}; + var tr = epgd.tr.pages.editUser, + u = epgd.pages.editUser.cur, + rightForm = '', + um; + //epgd.rights = {}; for (var i = 1; i < 1025; i = i * 2) epgd.rights['um' + i] = i;// zum Test + for (um in epgd.rights) + rightForm += '<div><input type="checkbox"' + ((u.rights & epgd.rights[um]) == epgd.rights[um] ? ' checked="checked"' : '') + ' name="uRights" id="uR' + um + '" value="' + epgd.rights[um] + '"/><label for="uR' + um + '">' + (tr.rights[um] || um) + '</label></div>'; + $form.html((!u.user ? '<h2>' + epgd.tr.pages.login.userName + '</h2><div><input type="text" id="uName" value="" /></div><br />' : '') + + '<div><input type="radio"' + (u.active == "1" ? ' checked="checked"' : '') + ' name="uActive" value="1" id="uActive"/><label for="uActive">' + tr.active + '</label>' + + ' <input type="radio"' + (u.active == "0" ? ' checked="checked"' : '') + ' name="uActive" value="0" id="uInactive" /><label for="uInActive">' + tr.inActive + '</label>' + + (u.user && ' <input type="radio" name="uActive" value="-1" id="uDel"/><label for="uDel">' + epgd.tr.del + '</label>') + + '</div>' + + '<h2>' + epgd.tr.pages.login.password + '</h2><div><input type="password" id="uPass" /></div>' + + '<h2>' + tr.rights.label + '</h2><div>' + rightForm + '</div>' + + '<div><br /><button class="iAsButton i-save">' + epgd.tr.save + '</button></div>'); + $form.find('button').click(function () { + return epgd.pages.editUser.save(this.form, callback); + }); + $uRights = $($form[0].uRights).each(function () {
+ this.r = parseInt(this.value, 10);
+ }); + function check() {
+ var flag = this.r; + if (this.checked) + $uRights.each(function () { // Alle unterrechte automatisch setzen und fixieren
+ if (this.r < flag && (flag & this.r) == this.r) this.checked = this.disabled = true;
+ }); + else + $uRights.each(function () {
+ if (this.r < flag && (flag & this.r) == this.r) {
+ this.disabled = false; // Es ist ein Unterrecht, also erst mal wieder erlauben
+ var sub = this; // Suchen, ob dieses recht noch ein von einem weiteren Recht ein Unterrecht ist und dann ggf. wieder setzen und fixieren
+ $uRights.each(function () {
+ if (this.checked && this.r > sub.r && (this.r & sub.r) == sub.r) sub.checked = sub.disabled = true;
+ });
+ }
+ });
+ } + $uRights.each(check).click(check); + }, + save: function (form, callback) { + var u = {rights:1}, + cur = epgd.pages.editUser.cur; + $(form.uRights).each(function () { if (this.checked) u.rights |= this.r; }); + u.active = parseInt(form.uActive.value,10); + if (cur.user) { + u.user = cur.user; + if (u.active == -1) { + delete u.active; + u.state = 'D'; + } else { + u.state = 'M'; + if (u.active == cur.active) + delete u.active; + if (u.rights == cur.rights) + delete u.rights; + if (form.uPass.value) + u.passwd = YaMD5.hashStr(u.user + form.uPass.value); + } + } else{ + u.state = 'C'; + u.user = form.uName.value; + if (!u.user) + return !epgd.utils.topInfo(epgd.tr.error.emptyField.replace('$field$', epgd.tr.pages.login.userName), { isError: 1 }); + u.passwd = YaMD5.hashStr(u.user + form.uPass.value); + } + epgd.ajax({url: epgd.login.url + "data/save-users",type: 'post',data: JSON.stringify({ users: [u] })},function (data) { + if (data.Error || data.result.state != 200) + return epgd.utils.topInfo(data.Error || data.result.message, { isError: 1 }); + (u.user == epgd.login.user) && $(window).trigger("login_changed",u); + if ( $.isFunction(callback)) + callback(data); + }); + return false; + } +}; diff --git a/http/src/js/pages.help.js b/http/src/js/pages.help.js new file mode 100644 index 0000000..d63ebd6 --- /dev/null +++ b/http/src/js/pages.help.js @@ -0,0 +1,49 @@ +epgd.pages.help = { + $con: null, + render: function () { + $('#menu_help').addClass("menu-active"); + if (!this.$con) this.load(); + epgd.$con.html(this.$con); + this.init(); + }, + getButton: function(id, useAnchor){ + return (useAnchor ? '<a' : '<button') + ' id="bh_' + id + '" class="help iAsButton i-help" role="button">' + epgd.tr.menu.help + '</' + ( useAnchor ? 'a>' : 'button>'); + }, + getIcon: function (id) {
+ return '<a id="bh_' + id + '" class="help iAsIcon i-help" />';
+ }, + initButtons: function ($con) { + if (!$con) + $con = epgd.$con; + $con.tooltip({ + items: ".help", + //position: { at: "left top" }, + //position: { my: "left top" }, + tooltipClass: 'quickInfo', + content: function () { + return epgd.pages.help.getQuickInfo(this.id.slice(3)); + }, + open: function (ev, ui) {
+ $(ui.tooltip).position({
+ of: ev.toElement,
+ my: "left top"
+ });
+ ev.preventDefault();
+ } + }); + }, + getQuickInfo: function (id) { + var h= epgd.pages.help; + if (!h.$con) h.load(); + return h.$con.find('#h_' + id).html() || epgd.tr.pages.help.noHelp; + }, + load: function () { + var me = this; + epgd.ajax({
+ url: epgd.tr.pages.help.url, async: false, dataType: "html", contentType: "text/plain; charset=utf-8"
+ }, function (data) {
+ me.$con = $($(data).filter('#help')[0]);
+ $(data).filter('#help_js').appendTo(document.body);
+ }); + } +}; diff --git a/http/src/js/pages.login.js b/http/src/js/pages.login.js new file mode 100644 index 0000000..c751d49 --- /dev/null +++ b/http/src/js/pages.login.js @@ -0,0 +1,114 @@ +epgd.pages.login = { + useCookie: document.cookie.match(/login=([^;]+)/), + render: function () { + if (epgd.login.session) + this.doLogin('logout'); + this.showForm(); + }, + showForm: function(callback){ + var tr = epgd.tr.pages.login, + $con = $('#login'); + if (!$con.length) { + $con = $('<div id="login" title="' + tr.label + '" class="searchDialog ui-dialog" style="margin:5% auto"><form class="ui-dialog-content ui-widget-content"><table cellpadding="5">' + + '<tr><td>' + tr.userName + '</td><td><input type="text" id="lUser" /></td></tr>' + + '<tr><td>' + tr.password + '</td><td><input type="password" id="lPass" /></td></tr>' + + '<tr><td colspan="2"><input type="checkbox" id="lAlways" /> <label for="lAlways">' + tr.loggedAlwaysIn + '</label></td></tr>' + + '</table></form></div>'); + $con.dialog({ + modal: true, width: "auto", + closeOnEscape: false, + buttons: [{ + text: tr.label, + icons: {primary: "ui-icon-unlocked"}, + click: function () { + var form = $con.find('form')[0]; + if (!form.lUser.value) + return !!epgd.utils.topInfo(epgd.tr.error.emptyField.replace('$field$', tr.userName), { isError: 1 }); + $(this).dialog("close"); + epgd.pages.login.useCookie = form.lAlways.checked ? [] : null; + epgd.pages.login.doLogin(form.lUser.value, form.lPass.value, callback); + } + }] + }).keypress(function (e) { + if (e.keyCode == 13) { + $(this).parent().find(".ui-dialog-buttonpane button:eq(0)").trigger("click"); + } + }).parent().find('.ui-dialog-titlebar-close').remove(); + } else + $con.dialog('open'); + }, + doLogin: function (user, pass, callback) { + var curLogin = epgd.login, + uKey = '', + storage = sessionStorage; + + try {
+ storage.setItem('_storagetest_', 1);
+ storage.removeItem('_storagetest_');
+ } catch (ex) {
+ storage = { removeItem: function () { }, setItem: function () { }, getItem: function () { return null; } }
+ }
+ + function trigger_changed() { + if (epgd.login.user != curLogin.user || epgd.login.rights != curLogin.rights) { + if (!epgd.login.session) { + if (epgd.pages.login.useCookie) { + epgd.pages.login.useCookie[1] = null; + document.cookie = "login=; expires=Thu, 01 Jan 1970 00:00:00 UTC"; + } + storage.removeItem('login'); + epgd.login.url = ''; + } else { + if (epgd.pages.login.useCookie) { + epgd.pages.login.useCookie[1] = uKey; + var d = new Date(); + d.setTime(d.getTime() + 365 * 24 * 60 * 60 * 1000); + document.cookie = "login=" + uKey + "; expires=" + d.toUTCString(); + } + storage.setItem('login', uKey); + epgd.login.url = 'sid' + epgd.login.session + '/'; + } + $(window).trigger("login_changed", curLogin); + } + epgd.login.url = epgd.login.session ? 'sid' + epgd.login.session + '/' : ''; + if ($.isFunction(callback)) + callback(); + } + + if (user != 'logout') { + if (curLogin.session) { + $.ajax({ url: curLogin.url + "data/login", data: JSON.stringify({ key: '' }), type: 'post', contentType: "application/json; charset=utf-8", dataType: 'json' }); + epgd.login.url = ''; + } + if (epgd.profile.needLogin == "0") { + epgd.login = { user: '', session: '', rights: 4294967295, url: '' }; + return trigger_changed(); + } + if (user) + uKey = YaMD5.hashStr(user + pass); + else { + uKey = storage.getItem('login'); + if (!uKey && epgd.pages.login.useCookie) + uKey = epgd.pages.login.useCookie[1]; + if (!uKey) + return this.showForm(callback); + } + } + $.ajax({ url: epgd.login.url + "data/login", data: JSON.stringify({ key: uKey }), type: 'post', contentType: "application/json; charset=utf-8", dataType: 'json' }).done(function (data) { + var tr = epgd.tr.pages.login; + epgd.login = data.login || { user: '', session: '', rights: 0, url: '' }; + if (!epgd.login.session) { + if (user == 'logout') { + epgd.utils.topInfo(tr.logoutMessage); + } else + epgd.utils.topInfo(tr.error, { isError: 1 }); + $('#menu_login a').text(tr.label); + } else { + $('#menu_login a').text(epgd.login.user + ' ' + tr.logout); + if (location.hash == "#menu_login" || location.hash == "#") + location.hash = ""; + } + return trigger_changed(); + }); + } +}; diff --git a/http/src/js/pages.magazine.js b/http/src/js/pages.magazine.js new file mode 100644 index 0000000..f5769e2 --- /dev/null +++ b/http/src/js/pages.magazine.js @@ -0,0 +1,413 @@ +epgd.pages.magazine = { + startTime: null, + endTime: null, + $head: null, + $con: null, + list: [], + viewCnt: 0, + scrollStart:0, + timeLineL: null, + timeLineR: null, + qt:{}, + imgPath: epgd.profile.eventImgPath ? epgd.profile.eventImgPath + '?no=0&maxW=100&maxH=70&id=' : false, + init: function () { + //this.initQT(); + this.select = epgd.channels.selBox; + + $(window).bind('channels_load', function () { + var self= epgd.pages.magazine, + id; + if (!self.$head) + return; + self.$head.empty(); + for (id in self.list) + self.list[id].index = -1; + self._initChannels(); + for (id in self.list) + if (self.list[id].index == -1) { + self.preTime.removeChild(self.list[id].col); + delete self.list[id]; + }; + }); + }, + initQT: function () {
+ var qt = {};
+ epgd.profile.quickTimes.replace(/=([0-9]{1,2}):([0-9]{1,2})/g, function (a, h, m) {
+ qt[parseInt(h,10)] = '<p' + (m ? ' style="margin-top:' + (m * 2) + 'px"' : '') + '> </p>';
+ }); + this.qt= qt; + }, + _initChannels: function () { + var ch,i; + for (i = 0; i < this.select.length; i++) { + ch = this.list[this.select[i].value]; + if (!ch) { + ch = new epgd.pages.magazine.channel(this.select[i].value, i, $('<div class="ui-widget-content"/>')[0]); + this.list[ch.id] = ch; + } else { + ch.index = i; + } + this.preTime.appendChild(ch.col); + this.select[i].ch = ch; + this.$head.append('<div class="ui-widget-content ui-corner-top">' + epgd.channels.getHtml(ch.id) + '</div>') + } + this.$head.css('width',(208 * this.select.length + 55) + 'px'); + }, + _initWinBindings: function(){ + $(window) + .bind("epgd_close.pages_magazine", function () { + epgd.$dtPicker.hide(); + $(window).unbind(".pages_magazine"); + clearInterval(this.pages_magazine.timeInterval); + delete this.pages_magazine; + }) + .bind("resize.pages_magazine", function () { + var w = $(window).width(), + l = $(this).scrollLeft(); + this.pages_magazine.$nav.width(w + 'px'); + this.pages_magazine.$con.css('height', ($(window).height() - 10 - $('#magazine').offset().top) + 'px'); + this.pages_magazine.viewCnt = parseInt((w - 110) / 208, 10); + if (this.pages_magazine.viewCnt < 5 ) { + this.pages_magazine.timeLineR.style.left = '-50px'; + this.pages_magazine.$con.css('width', (208 * this.pages_magazine.select.length + 25) + 'px'); + } else if (this.pages_magazine.viewCnt >= this.pages_magazine.select.length) { + this.pages_magazine.viewCnt = this.pages_magazine.select.length; + this.pages_magazine.timeLineR.style.left = '-50px'; + w = this.pages_magazine.viewCnt * 208 + 55; + this.pages_magazine.$con.css('width', (w -30) + 'px'); + } else { + this.pages_magazine.timeLineR.style.left = (l + w - 52) + 'px'; + this.pages_magazine.$con.css('width', (208 * this.pages_magazine.select.length + 150) + 'px'); + } + this.pages_magazine.lineNow.style.width = (w - 10) + 'px'; + epgd.$menu.parent().offset({ 'left': l }); + this.pages_magazine.$nav.offset({ 'left': l }); + this.pages_magazine.update(); + }) + .bind("scroll.pages_magazine", function () { + this.pages_magazine.timeLineL.style.left = '-50px'; + this.pages_magazine.timeLineR.style.left = '-50px'; + }) + .bind("scrollstop.pages_magazine", function () { + var l = $(this).scrollLeft(); + this.pages_magazine.timeLineL.style.left = this.pages_magazine.lineNow.style.left = l + 'px'; + if (this.pages_magazine.viewCnt >= 5 && this.pages_magazine.viewCnt < this.pages_magazine.select.length) + this.pages_magazine.timeLineR.style.left = (l + $(window).width() - 52) + 'px'; + this.pages_magazine.nextMain = parseInt((l + 104) / 208, 10); + if (this.pages_magazine.select.selectedIndex != this.pages_magazine.nextMain) + this.pages_magazine.setMain(0, this.pages_magazine.nextMain, true); + epgd.$menu.parent().offset({ 'left': l }); + this.pages_magazine.$nav.offset({ 'left': l }); + return false; + })
+ .bind("datepicker.pages_magazine", function () {
+ this.pages_magazine.setTime(epgd.utils.unixTime(epgd.$dtPicker.datetimepicker('getDate') || epgd.utils.now()), true); + })[0].pages_magazine = this; + + this.$con.bind('scrollstop.pages_magazine', function () { + var s = $(this).scrollTop(); + if (s > this.pages_magazine.scrollEnd) + this.pages_magazine.setTime(s * 30 + epgd.profile.minEventTime); + else if (s < this.pages_magazine.scrollStart) + this.pages_magazine.setTime(Math.max(this.pages_magazine.startTime - 43200, epgd.profile.minEventTime)); // 60 * 60 *12 + }); + + this._setLineNow(); + this.timeInterval = setInterval(this._setLineNow, 60000); + }, + _setLineNow: function(){ + var m = window.pages_magazine, + now = new Date().getTime() / 1000; + if (now > m.endTime || (m.startTime - epgd.profile.minEventTime) < -3600 ) { + $(window).trigger("epgd_close"); + $('<div class="ui-widget-overlay ui-front"></div>').click(function () { + epgd.profile.minEventTime = epgd.utils.now().getTime() / 1000 - 10800; + $(window).trigger("profile_updated", { "minEventTime": true }); + epgd.$dtPicker.datetimepicker('setDate', epgd.utils.now()); + m.$con.empty(); + m.render(); + $(this).remove(); + }).appendTo(document.body); + return; + } + m.lineNow.style.top = ((now - m.startTime) / 30 + m.scrollStart) + 'px'; + m.lineNow.innerHTML= epgd.utils.formatTime(now); + }, + render: function (channel) { + $('#menu_magazine').addClass("menu-active").append(epgd.$dtPicker.show()); + var startTime = epgd.utils.unixTime(epgd.utils.now()), + d; + if (this.startTime && (this.startTime - epgd.profile.minEventTime) < -3600) { + this.startTime = null; + this.list = []; + } + if (!this.startTime) { + $(window).trigger("epgd_close"); + $(this.select).appendTo(epgd.$menu.find('#menu_magazine')).mousedown(function (ev) { + ev.stopPropagation(); + return true; + }).click(function (ev) { + return false; + }).change(function () { + epgd.pages.magazine.render($(this).val()); + }); + if (this.select.selectedIndex < 0) + this.select.selectedIndex = 0; + this.$nav= $('<div id="magazine-nav"><div class="ui-widget-content ui-corner-top left"><div class="ui-widget-content ui-corner-top"><span class="iAsButton i-left-dir"></span><span class="iAsButton i-rewind"></span></div></div>' + + '<div class="ui-widget-content ui-corner-top right"><div class="ui-widget-content ui-corner-top"><span class="iAsButton i-right-dir"></span><span class="iAsButton i-forward"></span></div></div></div>') + this.$head = $('<div id="magazine-head"></div>'); + this.$con = $('<div id="magazine"></div>'); + this.$con[0].pages_magazine = this; + this.preTime = $('<div style="height:' + parseInt((epgd.profile.maxEventTime - epgd.profile.minEventTime) / 30,10) + 'px"></div>').appendTo(this.$con)[0]; + this.timeLineL = $('<div class="ui-widget-content timeLine"></div>').appendTo(this.preTime)[0]; + this.timeLineR = $('<div class="ui-widget-content timeLine tlr"></div>').appendTo(this.preTime)[0]; + this.lineNow = $('<p class="timeNow"></p>').appendTo(this.preTime)[0]; + this._initChannels(); + this.startTime = startTime+3600; + d = new Date(this.startTime * 1000); + if (d.getMinutes() > 0) { + d.setMinutes(0); + this.startTime = d.getTime() / 1000; + } + this.endTime = this.startTime; + this.setTime(this.startTime-7200); + } + if (!window.pages_magazine) { + this._initWinBindings(); + epgd.$con.empty(); + this.$nav.appendTo(epgd.$con).bind("click", this.actionHead); + this.$head.appendTo(epgd.$con).bind('click', function (ev) {
+ if (ev.target.className == 'i-tv') + epgd.vdrs.current.switchChannel(ev.target.parentNode.id);
+ }); + this.$con.appendTo(epgd.$con).bind("click", this.actionCon).bind("touchend",this.actionConOpen); + if (!$.support.touch && epgd.profile.magazinePan > 0)
+ this._pan();
+ } + $(window).trigger("resize.pages_magazine"); + if (channel) + this.setChannel(channel); + if (startTime < this.startTime || startTime > this.endTime) + this.setTime(startTime); + this.$con.scrollTop((startTime - epgd.profile.minEventTime) / 30 - 15); + $(window).trigger("resize.pages_magazine"); + }, + _pan: function(){ + var pan = false,
+ tp = $('<div style="width:90%; height:35px; margin-top:15px; position:fixed;z-index:99;left:5%"></div>').prependTo(epgd.$con)[0],
+ bot = $('<div style="width:90%; height:35px; position:fixed;z-index:99;bottom:0;left:5%"></div>').appendTo(epgd.$con)[0];
+ this.timeLineL.pan = -1;
+ this.timeLineR.pan = 1;
+ tp.pan = epgd.profile.magazinePan * -30;
+ bot.pan = epgd.profile.magazinePan * 30;
+
+ window.tp = tp;
+ window.bp = bot;
+ window.p = pan;
+ $([this.timeLineL, this.timeLineR, tp, bot]).mouseover(function (ev) {
+ if (pan) return;
+ pan = this.pan;
+ window.setTimeout(function () {
+ if (pan) {
+ var checkPan = window.setInterval(function () {
+ if (!pan || !window.pages_magazine)
+ return window.clearInterval(checkPan);
+ if (pan < -1 || pan > 1)
+ window.pages_magazine.setTime((window.pages_magazine.$con.scrollTop() + 15) * 30 + epgd.profile.minEventTime + pan, true);
+ else
+ window.pages_magazine.setMain(pan);
+ }, (pan < -1 || pan > 1 ? 100 : 1200));
+ }
+ }, epgd.profile.magazinePanDelay);
+ }).mouseout(function () {
+ pan = false;
+ });
+ }, + setChannel: function (channel) { this.setMain(0, this.list[channel].index); }, + setMain: function (delta, baseIndex, dontScroll) { + var optList = this.select, + i = isNaN(baseIndex) ? optList.selectedIndex : baseIndex; + i += delta; + if (i < 0) + i = 0;//+= optList.length; + else if (i >= optList.length - this.viewCnt) + i = optList.length - this.viewCnt;// -= optList.length; + optList.selectedIndex = i; + this.update(); + !dontScroll && $(window).scrollLeft(i * 208); + }, + setTime: function (start, doScroll) { + var t, insHtml = '', + h, + newEndTime = start + 43200; //86400; //60 * 60 * 24 + if (start < this.startTime) { + do { + this.startTime -= 3600; + t = epgd.utils.formatTime(this.startTime); + h = parseInt(t, 10); + if (h % 4 == 0) //if (t == '00:00') + t += $.datepicker.formatDate('<br />D,<br />dd<br />MM<br />yy', new Date(this.startTime * 1000)) + insHtml = (this.qt[h] || '') + '<dfn>' + t + '</dfn>' + insHtml; + } while (this.startTime > start); + $(this.timeLineL).prepend(insHtml); + $(this.timeLineR).prepend(insHtml); + this.scrollStart = (this.startTime - epgd.profile.minEventTime) / 30; + if (this.scrollStart < 0) { + this.scrollStart = 0; + this._setLineNow(); + } + this.preTime.style.paddingTop = this.scrollStart + 'px'; + } + if (this.endTime < newEndTime) { + insHtml = ''; + newEndTime = Math.max(newEndTime, this.endTime + 43200); //60 * 60 * 12 + for (; this.endTime < newEndTime; this.endTime += 3600) { + t = epgd.utils.formatTime(this.endTime); + h = parseInt(t, 10); + if (h % 4 == 0) + t += $.datepicker.formatDate('<br />D,<br />dd<br />M<br />yy', new Date(this.endTime * 1000)); + insHtml += (this.qt[h] || '') + '<dfn>' + t + '</dfn>'; + } + $(this.timeLineL).append(insHtml); + $(this.timeLineR).append(insHtml); + this.scrollEnd = (this.endTime - epgd.profile.minEventTime - 43200) / 30; // 60 * 60 *12 + } + insHtml && this.update(); + doScroll && this.$con.scrollTop((start - epgd.profile.minEventTime) / 30 - 15);
+ }, + actionHead: function (ev) { + var self = epgd.pages.magazine, + c; + if (ev.target.nodeName == 'SPAN') {
+ c = ev.target.className; + if (c.indexOf('i-left-dir') > -1) + self.setMain(-1); + else if (c.indexOf('i-rewind') > -1) + self.setMain(-self.viewCnt); + else if (c.indexOf('i-right-dir') > -1) + self.setMain(1); + else if (c.indexOf('i-forward') > -1) + self.setMain(self.viewCnt);
+ } + }, + actionConOpen: function (ev) { + var dt = $(ev.target).closest('dt')[0]; + if (dt) + dt.firstOpen = (dt.clientHeight != dt.scrollHeight); + }, + actionCon: function (ev) { + var dt = $(ev.target).closest('dt')[0]; + if (dt) { + if (dt.firstOpen) + return false; + if (!dt.eventDetail) + dt.eventDetail = new epgd.eventDetail(dt.title); + epgd.utils.loader.process(function () { + dt.eventDetail.render(); + }); + } + }, + update: function () { + var self = this, + i; + for (i = 0, j = this.select.selectedIndex; i < this.viewCnt && j < this.select.length; i++) + this.select[j++].ch.updateTime(); + window.setTimeout(function () { + for (var i = 0, j = self.select.selectedIndex + self.viewCnt; i < self.viewCnt && j < self.select.length; i++) + self.select[j++].ch.updateTime(); + }, 500); + } +}; + +epgd.pages.magazine.channel = function (id,index, col) { + this.id = id; + this.index = index; + this.col = col; + this.startTime; + this.endTime; +} +epgd.pages.magazine.channel.prototype = { + updateTime: function () { + if (!this.startTime) { + this.startTime = epgd.pages.magazine.startTime; + this.endTime = epgd.pages.magazine.endTime; + this.loadData(epgd.pages.magazine.startTime, epgd.pages.magazine.endTime); + } else { + if (epgd.pages.magazine.startTime < this.startTime) + this.loadData( epgd.pages.magazine.startTime, this.startTime); + if (epgd.pages.magazine.endTime > this.endTime) + this.loadData(this.endTime, epgd.pages.magazine.endTime); + } + }, + loadData: function (startTime, endTime) { + var self = this, + insAfter= (self.endTime < endTime); + if (insAfter) + self.endTime = endTime; + else + self.startTime = startTime; + epgd.ajax({ url: epgd.login.url + "data/events?time=" + startTime + '&endtime=' + endTime + '&channelid=' + this.id }, function (data) { + var insHtml = '', + first = data.events[0], + i, + event, + $dt= null, + $col = $(self.col), + desc,h,d, + eTime; + if (first) {
+ if (insAfter) {
+ $dt = $col.find('dt:last');
+ eTime = $dt[0].eTime;
+ if ($dt.attr('title') == first.id) + delete data.events[0];
+ } else {
+ eTime = first.starttime;
+ $dt = $col.find('dt:first');
+ if ($dt.attr('title') == data.events[data.events.length - 1].id) + delete data.events[data.events.length-1];
+ }
+ for (i = 0; i < data.events.length; i++) {
+ event = data.events[i];
+ desc = event.shortdescription || event.shorttext; + h = event.duration; + d = parseInt(h / 60, 10);/*, + fav = epgd.profile.fav ? ';border-color:' + epgd.profile.fav(event) : ''*/; + h += (event.starttime - eTime); + h = h < 600 ? 20 : parseInt(h / 30, 10); // 20px = 10 Minuten
+ eTime += h * 30; + insHtml += '<dt title="' + event.id + '" style="height:' + h + 'px;min-height:' + h + 'px">' //' + fav + ' + + '<div class="title">' + event.title + '</div>' + + (epgd.pages.magazine.imgPath && event.imagecount ? '<img src="' + epgd.pages.magazine.imgPath + event.id + '" />' : '') + + '<div class="time' + (event.timerid ? ' hasTimer' : '') + '"><u>' + epgd.utils.formatTime(event.starttime) + '</u><i>' + d + ' ' + epgd.tr.minutes + '</i></div>' + + (event.numrating ? '<span class="rate rate' + event.numrating + '"> </span>' : '') + + (event.tipp ? '<b class="tipp">' + event.tipp + '</b>' : '') + + '<div class="desc">' + (event.genre ? '<span>' + event.genre + '</span> ' : '') + (desc ? desc.replace(/\n/g, '<br />') : '') + + '</div></dt>';
+ };
+ } else { + h = (endTime - startTime) / 30; + insHtml = '<div style="height:' + h + 'px;min-height:' + h + 'px"></div>'; + first = { starttime: startTime }; + eTime = startTime; + } + if (insAfter) { + $col.append(insHtml); + $col.find('dt:last')[0].eTime = eTime; + } else { + $col.prepend(insHtml); + if ($dt && $dt.length) {
+ $dt.css('margin-top', '');
+ h = $dt[0].starttime - eTime; + if (h) {
+ h = parseInt(h/30,10) + parseInt($dt.css('min-height'), 10);
+ $dt.css({ "height": h + 'px', "min-height": h + 'px' })
+ }
+ } else + $col.find('dt:last')[0].eTime = eTime; + $col.find('dt:first').css('margin-top', parseInt((first.starttime - startTime) / 30, 10))[0].starttime= first; + } + //self.html = $(col).html(); + }); + } +}; diff --git a/http/src/js/pages.now.js b/http/src/js/pages.now.js new file mode 100644 index 0000000..8244f33 --- /dev/null +++ b/http/src/js/pages.now.js @@ -0,0 +1,135 @@ +epgd.pages.now = { + $ul: null, + timestamp_min: -1, + timestamp_max: 0, + timestamp_cur: 0, + + init: function () { + $(window).bind('channels_load', function () { epgd.pages.timestamp_max = 0; }); + }, + render: function () { + //this.renderTime = new Date().getTime();
+ if (!window.pages_now) {
+ this.$search = $('<div style="float:left;margin-left:5px"></div>').appendTo($('#menu_now')).click(function () {
+ if (this.curType == '@Now')
+ window.pages_now.setTime(null,'@Now');
+ }); + var $searchMenu = this.$searchMenu = $('<ul class="ui-menu ui-widget ui-widget-content"></ul>').appendTo($('#menu_now')).hide(); + epgd.profile.quickTimes && epgd.profile.quickTimes.replace(/([^=]+)=!?([^~]+)~?/g, function (a, l, v) {
+ $searchMenu.append('<li data-type="' + v + '" class="ui-menu-item ' + (v.indexOf('@') == 0 && v != '@Next' && v != '@Now' ? 'i-search' : 'i-clock') + '">' + l + '</li>');
+ });
+ if (!$searchMenu.find('li[data-type="@Next"]').length)
+ $searchMenu.prepend('<li data-type="@Next" class="ui-menu-item">' + epgd.tr.pages.eventDetail.eventNext + '</li>');
+ if (!$searchMenu.find('li[data-type="@Now"]').length)
+ $searchMenu.prepend('<li data-type="@Now" class="ui-menu-item">' + epgd.tr.pages.dateTimePicker.currentText + '</li>');
+ this.$searchMenu.click(function (ev) {
+ if (ev.target.getAttribute('data-type')) {
+ window.pages_now.setTime(null, ev.target.getAttribute('data-type'));
+ $searchMenu.hide();
+ }
+ });
+ $(window).bind("epgd_close.pages_now", function () {
+ if (window.pages_now) {
+ epgd.$dtPicker.hide(); + window.pages_now.$searchMenu.remove(); + window.pages_now.$search.remove(); + delete window.pages_now;
+ }
+ $(window).unbind(".pages_now");
+ $('#menu_now').unbind(".pages_now");
+ }).bind("datepicker.pages_now", function () {
+ this.pages_now.setTime(epgd.utils.unixTime(epgd.$dtPicker.datetimepicker('getDate')));
+ })[0].pages_now = this;
+ this.$ul = epgd.$con.html('<div id="pageNow"><ul class="teaserList"></ul></div>').find('ul')
+ .click(function (ev) {
+ if ($(ev.target).closest('.channel').length) {
+ $(window).trigger("epgd_close.eventDetail"); + if (ev.target.className == 'i-tv') + epgd.vdrs.current.switchChannel(ev.target.parentNode.id); + else {
+ epgd.$menu.menu("select", { target: "#menu_magazine" });
+ epgd.pages.magazine.setChannel(ev.target.parentNode.id);
+ } + return;
+ } + var li = $(ev.target).closest('li')[0]; + if (!li) return; + if (!li.eventDetail) + li.eventDetail = new epgd.eventDetail(li.title); + epgd.utils.loader.process(function () {
+ li.eventDetail.render();
+ });
+ });
+ this.setTime(null, '@Now');
+ }; + $('#menu_now').addClass("menu-active").bind("click.pages_now", function (ev) {
+ if ((ev.target == this || ev.target.nodeName == 'A') && window.pages_now) {
+ window.pages_now.$searchMenu.show();
+ ev.preventDefault();
+ }
+ return false;
+ }).append(epgd.$dtPicker.show());
+ }, + setTime: function (start, type) { + type = type || '@time'; + var at = ' ' + epgd.tr.pages.now.at; + if (type == '@Now' || type == '@time') {
+ this.timestamp_cur = start || epgd.utils.unixTime(epgd.utils.now());
+ this.load("data/events?time=" + this.timestamp_cur);
+ epgd.$dtPicker.datetimepicker('setDate', epgd.utils.date(this.timestamp_cur));
+ } else if (type == '@Next')
+ this.load("data/events?next=1&time=" + this.timestamp_cur);
+ else if (type[0] == '@') {
+ at = ' ' + epgd.tr.menu.search;
+ this.load("data/search", 'post', JSON.stringify({ autotimername: type.slice(1) }));
+ } else {
+ $.timepicker.quicklink({ target: { nodeName: 'U', innerHTML: type }, data: { unit: 'time' } });
+ $(window).trigger('datepicker');
+ } + this.$search[0].curType = type; + this.$search.text(this.$searchMenu.find('li[data-type="' + type + '"]').text() + at); + }, + load: function (url,type,data) {
+ epgd.utils.loader.process(function () {
+ pages_now.$ul.empty(); + epgd.ajax({ url: epgd.login.url + url, async: false, cache: false, type:type,data:data }, function (data) {
+ if (!data.events || !data.events.length) {
+ epgd.utils.loader.close(); + return epgd.utils.popup(epgd.tr.error.noData);
+ } + var imgPath = epgd.profile.eventImgPath ? epgd.profile.eventImgPath + '?no=0&maxW=100&maxH=70&id=' : false, + min = 0, + max = 2000000000, + dFormat = epgd.tr.dateTimePicker.dateFormat.replace(/\.?y+/,''); + now = parseInt(epgd.utils.now().getTime() / 1000, 10); + //maxHeight = 0, + $.each(data.events, function (id, event) {
+ var end = event.starttime + event.duration, + progress = ((now - event.starttime) / event.duration * 100), + desc = event.shortdescription || event.shorttext; + if (event.starttime > min) min = event.starttime; + if (end < max) max = end; + $('<li title="' + event.id + '" class="ui-widget-content ui-corner-all">' + + epgd.channels.getHtml(event.channelid) + + '<div class="time' + (event.timerid ? ' hasTimer' : '') + '"><b>' + epgd.utils.formatTime(event.starttime) + + '</b> – ' + epgd.utils.formatTime(end) + ' ' + epgd.tr.oClock + + (event.tipp ? '<b class="tipp">' + event.tipp + '</b>' : '') + + '</div>' + + (progress > 0 && progress <= 100 ? '<div class="progress"><div style="width: ' + progress + '%"></div></div>' : '<div class="date">' + epgd.utils.formatDate(event.starttime, dFormat) + '</div>') + + '<div class="desc">' + + (imgPath && event.imagecount ? '<img src="' + imgPath + event.id + '" />' : '') + + '<div class="title">' + event.title + + (event.numrating ? '<span class="rate rate' + event.numrating + '"> </span>' : '') + + '</div>' + + (event.genre ? '<span>' + event.genre + '</span> ' : '') + (desc ? desc.replace(/\n/g, '<br />') : '') + + '</div>' + + '</li>').appendTo(pages_now.$ul);
+ }); + epgd.pages.now.timestamp_min = min; + epgd.pages.now.timestamp_max = max; + epgd.utils.loader.close();
+ });
+ }, true);
+ } + +}; diff --git a/http/src/js/pages.profile.js b/http/src/js/pages.profile.js new file mode 100644 index 0000000..87bbc1b --- /dev/null +++ b/http/src/js/pages.profile.js @@ -0,0 +1,251 @@ +epgd.pages.profile = { + render: function () { + var /*fav = '', + rules= epgd.profile.favCond.split('\n'); + for (var i = 0; i < rules.length; i++) { + var terms = rules[i].match(/if \((.+)\) return '([^']+)';$/); + if (terms) + fav += '<li style="border:2px solid ' + terms[2] + '"></li>'; + },*/ + startPage = epgd.profile.startPage.slice(5), + namingmodeOptions = '<option>' + epgd.tr.pages.timerList.namingModes.join('</option><option>') + '</option>', + html = '<form id="page_profile"><h3>Interface</h3><div><table>' + + '<tr><td>startpage</td><td><select id="startPage">' + + jQuery.map(epgd.tr.menu, function (value, key) { + return '<option value="menu_' + key + (startPage == key ? '" selected="selected">' : '">') + value + '</option>'; + }).join('') + '</select></td></tr>' + + '<tr><td>default VDR</td><td><select id="defaultVDRuuid">' + $('#menu_vdrs').find('select').html() + '</select></td></tr>' + + '<tr><td>datepicker first day</td><td><select id="pickerFirstDay"><option>' + epgd.tr.dateTimePicker.dayNames.join('</option><option>') + '</option></select></td></tr>' + + '<tr><td>quicklinks</td><td><textarea rows="5" style="float:left;width:50%; margin-right:10px" id="quickTimes" onchange="epgd.pages.profile.validate.quickTimes(this)">' + epgd.profile.quickTimes.replace(/~/g, '\n') + '</textarea><span>enter in each line label=hh:mm(24h), eg:<br />prime time=20:15 or prime time=!20:15 (this time will not be highlighted in magazine)<br />now=@Now or next=@Next<br />tip=@searchtimerName</span></td></tr>' + + '<tr><td>constabel-login</td><td><input type="text" class="full" id="constabelLoginPath" value="' + (epgd.profile.constabelLoginPath || '') + '" />' + + '<br />e.g.https://www.eplists.de/eplist.cgi?action=login&login=[username]&secret=[password]</td></tr>' + + '<tr><td>' + epgd.tr.pages.profile.maxListEntries + '</td><td><input type="text" id="maxListEntries" value="' + epgd.profile.maxListEntries + '" data-valexp="^[1-9]{0,3}$" /></td></tr>' + + '<tr><th colspan="2">' + epgd.tr.menu.magazine + '</th><tr>' + + '<tr><td>' + epgd.tr.pages.profile.magazinePan + '</td><td><input type="text" id="magazinePan" value="' + epgd.profile.magazinePan + '" data-valexp="^[0-9]{1,2}$" /></td></tr>' + + '<tr><td>' + epgd.tr.pages.profile.magazinePanDelay + '</td><td><input type="text" id="magazinePanDelay" value="' + epgd.profile.magazinePanDelay + '" data-valexp="^[1-9][0-9]{2,3}$" /></td></tr>' + + '<tr><th colspan="2">' + epgd.tr.pages.timer.timerList + '</th><tr>' + + '<tr><td>' + epgd.tr.pages.timerList.namingMode + '</td><td><b>' + epgd.tr.pages.eventDetail.scrapperSerieInfo + '</b><div>' + + epgd.tr.pages.timer.timerList + ': <select id="namingModeSerie">' + namingmodeOptions + '</select><input id="namingModeSerieTemplate" value="' + epgd.profile.namingModeSearchSerieTemplate + '" type="text" style="width:90%" /></div><div>' + + epgd.tr.pages.timer.searchTimerList + ': <select id="namingModeSearchSerie">' + namingmodeOptions + '</select><input id="namingModeSearchSerieTemplate" value="' + epgd.profile.namingModeSearchSerieTemplate + '" type="text" style="width:90%" /></div><b style="text-decoration:line-through">' + + epgd.tr.pages.eventDetail.scrapperSerieInfo + '</b><div>' + + epgd.tr.pages.timer.timerList + ': <select id="namingModeMovie">' + namingmodeOptions + '</select><input id="namingModeMovieTemplate" value="' + epgd.profile.namingModeMovieTemplate + '" type="text" style="width:90%" /></div><div>' + + epgd.tr.pages.timer.searchTimerList + ': <select id="namingModeSearchMovie">' + namingmodeOptions + '</select><input id="namingModeSearchMovieTemplate" value="' + epgd.profile.namingModeSearchMovieTemplate + '" type="text" style="width:90%" /></div></td></tr>' + + '<tr><td>' + epgd.tr.pages.timerList.chFormat + '</td><td><input id="chFormat" readonly onclick="epgd.timerEditChFormat(this)" value="' + epgd.profile.chFormat + '" /></td></tr>' + + '<tr><td>VDR</td><td><select id="timerDefaultVDRuuid"><option value="">Auto</option>' + $('#menu_vdrs').find('select').html() + '</select></td></tr>' + + '<tr><td>' + epgd.tr.pages.profile.mailReceiver + '</td><td><input type="mail" value="' + (epgd.profile.mailReceiver || '') + '" id="mailReceiver" /><button onclick="epgd.utils.sendMail(\'checkMailAddress\',\'it works\',\'\',$(form.mailReceiver).val())">' + epgd.tr.test + '</button></td></tr>' + + '<tr><td>' + epgd.tr.pages.profile.sendMessages + '</td><td>' + + jQuery.map(epgd.tr.pages.timerList.messageTypes, function (value, key) { + return '<input type="checkbox" value="' + key + '" name="messageMailTypes"' + (epgd.profile.messageMailTypes.indexOf(key) >= 0 ? ' checked="checked"' : '') + ' />' + value; + }).join(' ') + + '</td></tr>' + + '<tr><th colspan="2">' + epgd.tr.menu.search + '</th><tr>' + + '<tr><td>' + epgd.tr.advanced + '</td><td><input type="checkbox" id="searchAdv" /></td></tr>' + + '<tr><th colspan="2">VDR OSD</th><tr>' + + '<tr><td>' + epgd.tr.pages.profile.vdr.startWithSched + '</td><td><input type="checkbox" id="startWithSched"' + (epgd.profile.startWithSched == "1" ? ' checked="checked"' : '') + ' /></td></tr>' + + '<tr><th colspan="2">' + epgd.tr.menu.records + '</th><tr>' + + '<tr><td>' + epgd.tr.pages.profile.record.subFolderSort + '</td><td><select id="recordSubFolderSort"><option value="1">' + epgd.tr.pages.eventDetail.title + ' up</option><option value="2">' + epgd.tr.pages.eventDetail.title + ' down</option><option value="3">' + epgd.tr.pages.timerList.folder + ' up</option><option value="4">' + epgd.tr.pages.timerList.folder + ' down</option><option value="5">' + epgd.tr.pages.timerList.recordTime + ' up</option><option value="6">' + epgd.tr.pages.timerList.recordTime + ' down</option></select></td></tr>' + + '</table></div>'; + if ((epgd.login.rights & epgd.rights.umConfigEdit) == epgd.rights.umConfigEdit) + html += '<h3>System</h3><div></div>'; + epgd.$con.html(html + '</form>' + + '<br /><input type="button" value="' + epgd.tr.save + '" onclick="epgd.pages.profile.save()" class="ui-button ui-widget ui-state-default ui-corner-all">'); + this.form= $( "#page_profile" ).tooltip().accordion({ + headers: "<h3>", + collapsible: true, + heightStyle: "content", + activate: function (event, ui) { + var panel = ui.newPanel[0]; + if (panel && !panel.hasLoaded) { + panel.hasLoaded = true; + if (ui.newHeader.text() == "System") { + $(panel).html('<table>' + + '<tr><th colspan="2">' + epgd.tr.pages.login.label + '</th></tr>' + + '<tr><td>' + epgd.tr.pages.login.needLogin + '</td><td><input type="checkbox" id="needLogin" /></td></tr>' + + '</table>') + .find("#needLogin").click(function () { + if (this.checked && !this.hasUsers) { + this.checked = false; + var elem = this; + epgd.ajax({ url: epgd.login.url + "data/users", cache:false }, function (data) { + var u = null, + $dialog, + uName; + for (uName in data.users) { u = data.users[uName]; if (u.active) return (elem.hasUsers = elem.checked = true) }; + $dialog = $('<form title="' + epgd.tr.pages.editUser.user + ' ' + (u ? u.user : epgd.tr.pages.editUser.add) + '"></form>'); + epgd.pages.editUser.showUser(u, $dialog, function () { + $dialog.dialog("close"); + if (!u) + elem.hasUsers = elem.checked = true; + else + $(elem).click(); + }); + $dialog.dialog({ modal: true, width: "auto" }); + }); + } + }).prop('checked', epgd.profile.needLogin == "1"); + epgd.ajax({ url: epgd.login.url + "data/parameters", async: true, cache: false, dataType: "json" }, function (data) { + var html = '', i, p, val, + tr = epgd.tr.pages.profile.system, + ptTime = 1, ptBool = 2; // ptNum = 0, , ptAscii = 3 + for (i in data.parameters) { + p = data.parameters[i]; + if (p.owner == 'epgd') { + html += '<tr><td>' + (tr[p.name] || p.name) + '</td><td>'; + val = typeof p.value == "undefined" ? p["default"] : p.value; + if (p.type == ptTime) + val= epgd.utils.formatDateTime(val); + if (p.readonly) + html += val; + else { + html += '<input data-value="' + val + '" data-valexp="' + (p.valexp || '') + '" id="' + p.name + '"'; + if (p.type == ptBool) + html += ' type="checkbox"' + (val == "1" ? ' checked' : ''); + else + html += ' type="text" class="full" value="' + val + '"'; + html += ' /></td></tr>'; + } + } + } + html && $(panel).find('table').append('<tbody id="pSystem"><tr><th>' + tr.label + '</th><th style="min-width:300px"></th></tr>' + html + '</tbody>') //&& $( "#page_profile" ).accordion('refresh'); + }); + } + } + } + })[0]; + this.form.namingModeSerie.selectedIndex = epgd.profile.namingModeSerie; + this.form.namingModeSearchSerie.selectedIndex = epgd.profile.namingModeSearchSerie; + this.form.namingModeMovie.selectedIndex = epgd.profile.namingModeMovie; + this.form.namingModeSearchMovie.selectedIndex = epgd.profile.namingModeSearchMovie; + + $([this.form.namingModeSerie,this.form.namingModeSearchSerie,this.form.namingModeMovie,this.form.namingModeSearchMovie] ).change(function () {
+ this.nextSibling.style.display = (this.selectedIndex == 6) ? 'block' : 'none';
+ }).change(); + epgd.utils.addPlaceholders(this.form.namingModeSerieTemplate, '%', epgd.tr.pages.timerList.templateFields); + epgd.utils.addPlaceholders(this.form.namingModeSearchSerieTemplate, '%', epgd.tr.pages.timerList.templateFields); + epgd.utils.addPlaceholders(this.form.namingModeMovieTemplate, '%', epgd.tr.pages.timerList.templateFields); + epgd.utils.addPlaceholders(this.form.namingModeSearchMovieTemplate, '%', epgd.tr.pages.timerList.templateFields); + + $(this.form.quickTimes).one("focus", function () {
+ var quickTimes = this;
+ epgd.ajax({ url: epgd.login.url + "data/searchtimers?type=S" }, function (data) {
+ var placeholders = { "@Now": ": current time", "@Next": ": next event" };
+ $.each(data.searchtimers, function (id, t) {
+ placeholders['@' + t.name || t.expression] = ': saved timer';
+ });
+ epgd.utils.addPlaceholders(quickTimes, '@', placeholders);
+ });
+ }); + + this.form.searchAdv.checked = epgd.profile.searchAdv == "1"; + epgd.profile.defaultVDRuuid && $(this.form.defaultVDRuuid).val(epgd.profile.defaultVDRuuid); + $(this.form.timerDefaultVDRuuid).val(epgd.profile.timerDefaultVDRuuid); + $(this.form.recordSubFolderSort).val(epgd.profile.recordSubFolderSort); + this.form.pickerFirstDay.selectedIndex= (epgd.profile.pickerFirstDay || epgd.tr.dateTimePicker.firstDay); + }, + save: function () { + var profile = epgd.profile, + data = [], + form = this.form, + owner= "@" + epgd.login.user, + panel; + function checkData(p) { + if (profile[p.name] != p.value) + data.push(p); + } + + if (!this.validate.quickTimes(form.quickTimes) + || !this.validate.checkRegex(form.magazinePan) + || !this.validate.checkRegex(form.magazinePanDelay)) + return false; + + checkData({ name: "defaultVDRuuid", value: $(form.defaultVDRuuid).val() || '', owner: owner }); + checkData({ name: "quickTimes", value: form.quickTimes.value.replace(/\n/g, '~'), owner: owner }); + checkData({ name: "startWithSched", value: $(form.startWithSched).prop('checked') ? "1" : "0", owner: owner }); + checkData({ name: "pickerFirstDay", value: new String(form.pickerFirstDay.selectedIndex), owner: owner }); + checkData({ name: "startPage", value: $(form.startPage).val() || '', owner: owner }); + checkData({ name: "namingModeSerie", value: new String(this.form.namingModeSerie.selectedIndex), owner: owner }); + checkData({ name: "namingModeSearchSerie", value: new String(this.form.namingModeSearchSerie.selectedIndex), owner: owner }); + checkData({ name: "namingModeMovie", value: new String(this.form.namingModeMovie.selectedIndex), owner: owner }); + checkData({ name: "namingModeSearchMovie", value: new String(this.form.namingModeSearchMovie.selectedIndex), owner: owner }); + checkData({ name: "namingModeSerieTemplate", value: new String(this.form.namingModeSerieTemplate.value), owner: owner }); + checkData({ name: "namingModeSearchSerieTemplate", value: new String(this.form.namingModeSearchSerieTemplate.value), owner: owner }); + checkData({ name: "namingModeMovieTemplate", value: new String(this.form.namingModeMovieTemplate.value), owner: owner }); + checkData({ name: "namingModeSearchMovieTemplate", value: new String(this.form.namingModeSearchMovieTemplate.value), owner: owner }); + checkData({ name: "timerDefaultVDRuuid", value: $(form.timerDefaultVDRuuid).val() || '', owner: owner }); + checkData({ name: "constabelLoginPath", value: $(form.constabelLoginPath).val() || '', owner: owner }); + checkData({ name: "chFormat", value: $(form.chFormat).val() || '', owner: owner }); + checkData({ name: "searchAdv", value: $(form.searchAdv).prop('checked') ? "1" : "0", owner: owner }); + checkData({ name: "messageMailTypes", value: $(form.messageMailTypes).map(function () { return this.checked ? this.value : "" }).toArray().join(''), owner: owner }); + checkData({ name: "mailReceiver", value: $(form.mailReceiver).val() || '', owner: owner }); + checkData({ name: "magazinePan", value: $(form.magazinePan).val() || '', owner: owner }); + checkData({ name: "magazinePanDelay", value: $(form.magazinePanDelay).val() || '', owner: owner }); + checkData({ name: "maxListEntries", value: $(form.maxListEntries).val() || '', owner: owner }); + checkData({ name: "recordSubFolderSort", value: $(form.recordSubFolderSort).val() || '1', owner: owner }); + + panel = $('#pSystem').parent().parent()[0]; + if (panel && panel.hasLoaded) { + checkData({ name: "needLogin", value: $(form.needLogin).prop('checked') ? "1" : "0", owner: "webif" }); + $('#pSystem input').each(function () { + if (this.type == 'checkbox') { + if (this.checked != (this.getAttribute('data-value') == "1")) + data.push({ name: this.id, value: (this.checked ? "1" : "0"), owner: "epgd", valexp: this.getAttribute('data-valexp')}); + } else if (this.getAttribute('data-value') != this.value) { + if (epgd.pages.profile.validate.checkRegex(this)) + data.push({ name: this.id, value: this.value, owner: "epgd" }); + else{ + data = []; + return false; + } + } + }); + } + if (data.length) { + if (panel) panel.hasLoaded = false; + panel = $("#page_profile").accordion("option", "active"); + $("#page_profile").accordion("option", "active", false).accordion("option", "active", panel); + epgd.ajax({ + url: epgd.login.url + 'data/save-parameters', + type: 'post', + data: JSON.stringify({ "parameters": data }) + }, function (res) { + res = res.result; + if (res && res.state == 200) + epgd.utils.topInfo(epgd.tr.dataSaved); + else + epgd.utils.topInfo(res.message, { isError: 1 }); + epgd.profile_load(); + }, function (jqxhr) { + try { + var msg = ''; + $(jqxhr.responseJSON.result.failed).each(function () { + msg += '<li>' + form[data[this].name].parentNode.previousSibling.innerHTML + '</li>'; + }); + if (msg) { + epgd.utils.popup('<ol>' + msg + '</ol>', { title: epgd.tr.error.invalid }); + return true; + } + } catch (e) { } + return false; + }); + } + }, + validate: { + quickTimes: function (input) { + input.value = input.value.replace(/\n{2,}/g, '\n').replace(/^\n+|\n+$/g, ''); + if (!/^(\n?[^=]+=!?(([0-1]?[0-9]|2[0-4]):[0-5]?[0-9]|@Now|@Next|@[A-Za-z0-9]*))*$/.test(input.value)) { + input.focus(); + epgd.utils.popup(epgd.tr.error.invalid); + return false; + } + return true; + }, + checkRegex: function (input) {
+ if (input.getAttribute('data-valexp') && !new RegExp(input.getAttribute('data-valexp')).test(input.value)) {
+ input.focus(); + epgd.utils.popup(epgd.tr.error.invalid); + return false;
+ }
+ return true;
+ } + } +}; diff --git a/http/src/js/pages.records.js b/http/src/js/pages.records.js new file mode 100644 index 0000000..640a27a --- /dev/null +++ b/http/src/js/pages.records.js @@ -0,0 +1,453 @@ +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 = $('<div class="ui-widget ui-state-highlight ui-corner-all" style="padding:3px 10px">' + + '<button class="iAsButton i-trash" title="' + epgd.tr.del + '"/>' + + '<div id="recBar">' + + '<button class="iAsButton i-refresh" onclick="epgd.pages.records.update()">' + epgd.tr.reload + '</button>' + + epgd.pages.help.getIcon('recRefresh') + ' ' + + epgd.tr.pages.search.search + epgd.pages.help.getIcon('recSearch') + '<button class="iAsButton" onclick="this.checked = !this.checked; $(this).toggleClass(\'ui-state-highlight\', this.checked); epgd.pages.records.search();"> ∗</button>' + + '<input id="rSVal" type="text" onkeyup="epgd.pages.records.search(this.value)" />' + + '<button class="iAsButton" onclick="this.checked = !this.checked;$(this).toggleClass(\'ui-state-highlight\', this.checked); epgd.pages.records.search();">∗ </button>' + + '<span style="display:none">' + + '<button class="iAsButton i-rewind" onclick="epgd.pages.records.searchMove(1)"></button>' + + '<span id="rSCnt">0</span>' + + '<button class="iAsButton i-forward" onclick="epgd.pages.records.searchMove(-1)"></button>' + + '</span> <input type="checkbox" id="dragdrop"' + ($.support.touch ? '' : ' checked="checked"') + ' onchange="epgd.pages.records.dd(this.checked)" />' + + tr.ddLabel + epgd.pages.help.getIcon('recDD') + + '</div>' + +'</div>'); + this.$trash = this.$bar.find('.i-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 ? '<br />' + $recs.length + epgd.tr.entries : ''), function (ok) {
+ ok && $recs.each(function () {
+ epgd.pages.records.del(this);
+ });
+ });
+ });
+ 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]
+ }
+ epgd.pages.help.initButtons(this.$bar);
+ } + this.$bar.insertAfter(epgd.$menu); + epgd.$menu.checkMenuSize(); + $(window).bind("epgd_close.records", function () {
+ epgd.pages.records.$bar.remove();
+ epgd.$menu.checkMenuSize();
+ $(window).unbind(".records");
+ }); + epgd.$con.html('<div id="records"></div>'); + 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 += '<div>VDR - ' + v.name + ': ' + v.videodir + ' - ' + parseInt(v.videofree / 1000, 10) + ' GB ' + tr.available + ' / ' + parseInt(v.videototal / 1000, 10) + ' GB</div>';
+ } + 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 ? '<div class="folder"><h4><span class="i-folder-closed">(' + (subTree.cnt) + ')</span><m class="i-"/>' + subFolder + '</h4>' : '<div>'; + 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) ? '<br />' + rec.title : '') + + (rec.shorttext && (rec.shorttext != rec.name) ? '<i>' + rec.shorttext + '</i>' : '')) || subFolder; + rec.html = '<div class="rec" data-start="' + rec.starttime + '" data-owner="' + (rec.owner || '') + + '" data-md5="' + rec.md5path + '" data-path="' + rec.path + '">' + + '<em>' + epgd.utils.formatDateTime(rec.starttime) + '</em><u>' + parseInt(rec.duration / 60, 10) + min + '</u><b>' + + rec.tit + + '</b></div>';
+ };
+ subTree.r.sort(sortFunc);
+ for (i in subTree.r) { html += subTree.r[i].html; }
+ } + html += '</div>';
+ });
+ } + + 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 = $('<ul class="ui-menu ui-widget ui-widget-content" style="position:absolute">' + + '<li class="ui-menu-item" data-type="title"><a class="iAsButton i-sort-name-up" data-sort="1"></a> <a class="iAsButton i-sort-name-down" data-sort="2"></a> ' + epgd.tr.pages.eventDetail.title + '</li>' + + '<li class="ui-menu-item" data-type="path"><a class="iAsButton i-sort-name-up" data-sort="3"></a> <a class="iAsButton i-sort-name-down" data-sort="4"></a> ' + epgd.tr.pages.timerList.folder + '</li>' + + '<li class="ui-menu-item" data-type="start"><a class="iAsButton i-sort-name-up" data-sort="5"></a> <a class="iAsButton i-sort-name-down" data-sort="6"></a> ' + epgd.tr.pages.timerList.recordTime + '</li>' + + '</ul>').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, '<').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>([^<]+)<\/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) + "<mark>" + cs.searchValue + "</mark>" + this.innerHTML.slice(pos + sLength);
+ } while ((pos = this.innerHTML.toLowerCase().indexOf(pattern, pos + 13)) > 0) // "<mark></mark>" = 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 = $('<h4><span class="i-folder-closed">(1)</span><m class="i-"/>' + newPath[i] + '</h4></div>').droppable(epgd.pages.records.__dropSettings).wrap('<div class="folder open"></div>').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') + '<br />' + 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') + '<br />' + 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);
+ }
+});
+*/
\ No newline at end of file diff --git a/http/src/js/pages.timer.js b/http/src/js/pages.timer.js new file mode 100644 index 0000000..44b1cd7 --- /dev/null +++ b/http/src/js/pages.timer.js @@ -0,0 +1,743 @@ +epgd.sortTable = function (options) { + this.o = $.extend({ + conSel: epgd.$con, + empty: '', + right: 1 + }, options); +} +epgd.sortTable.prototype = { + sortIcons: '<span class="iAsButton i-sort-name-down sort"></span><span class="iAsButton i-sort-name-up sort"></span>', + update: function () { }, + hideHead: function(){ + var $ths = this.$con.find('thead:first').hide().find('>tr>th'); + this.$con.find('tbody:first').html('<tr><td colspan="' + $ths.length + '">' + this.o.empty + + ($ths.last().find('.i-doc-new').wrapAll('<div />').parent().html() || '') + '</td></tr>'); + }, + showHead: function(){ + this.$con.find('>table>thead').show();
+ this.filter();
+ this.sort();
+ }, + getTable: function () { }, + action: function ($el, iconName, data) { + switch (iconName) { + case 'refresh': + this.update(); + break; + case 'detail': + if (!$el[0].eventDetail) + $el[0].eventDetail = new epgd.eventDetail(data); + epgd.utils.loader.process(function () { + $el[0].eventDetail.render(); + }); + break; + } + }, + render: function ($con, searchData) { + this.trs = []; + this.$con = $con || $(this.o.conSel); + this.$con.empty(); + if (!(epgd.login.rights & this.o.right) == this.o.right) return epgd.utils.popup(epgd.tr.error.forbidden, { title: epgd.tr.error.error }); + this.$con.html(this.getTable()); + this.init(); + this.update(searchData); + }, + init: function () {
+ var list = this, + cIndex = 0;
+ this.$con.find('>table').click(function (ev) {
+ var $el = $(ev.target), + el = $el[0], + data = el.getAttribute('data-evId'), + d, + $lastSel; + if (data) + list.action($el, 'detail', data); + else if (ev.target.className == 'i-tv') {
+ epgd.vdrs.current.switchChannel(ev.target.parentNode.id);
+ } else {
+ //if (!searchData || searchData.fromEventDetail != true) + // $(window).trigger("epgd_close.eventDetail"); + $el = $el.closest('span.sort'); + if ($el.length) {
+ $el.parent().parent().find('.ui-state-highlight').removeClass('ui-state-highlight'); + $el.addClass("ui-state-highlight"); + list.sort($el);
+ } else {
+ $el = $(el).closest('span.edit'); + if ($el.length) {
+ list.action($el, $el[0].className.match(/i-([a-z0-9-]+)/)[1]);
+ } if (list.o.selectable) {
+ if (el.nodeName == 'TD') {
+ $el = $(el).parent().toggleClass('selected'); + if (ev.shiftKey && this.lastSel) {
+ $lastSel = $(this.lastSel); + d = $el.index() - $lastSel.index(); + if (d > 0) + $lastSel.nextAll(':lt(' + d + '):visible').toggleClass('selected', $lastSel.hasClass('selected')); + else + $lastSel.prevAll(':lt(' + -d + '):visible').toggleClass('selected', $lastSel.hasClass('selected'));
+ } + else + this.lastSel = $el[0];
+ } else if (el.nodeName == 'B') {
+ d = el.getAttribute('data-t'); + $(list.trs).filter(":visible").toggleClass('selected', d == 1 ? true : d == 0 ? false : undefined); + return false;
+ }
+ }
+ } + return false;
+ }
+ }).find('>thead>tr').find('>th').each(function () {
+ this.cIndex = cIndex;
+ cIndex += this.colSpan;
+ }).end().find('[data-defaultSort="1"]>span.sort:last,[data-defaultSort="-1"]>span.sort:first').addClass('ui-state-highlight'); + this.$con.find('>table>thead input.filter').keyup(function () {
+ list.filter();
+ }).each(function () {
+ if (!this.result)
+ this.result = $('<i style="padding-left:5px;font-weight:normal"></i>').insertAfter(this)[0];
+ }); + }, + sort: function ($el) {
+ $el = $el || this.$con.find('>table>thead .ui-state-highlight');
+ if (!$el.length) return;
+ var i = $el.parent()[0], + d = ($el.hasClass('i-sort-name-down') ? -1 : 1), + trs = this.trs, + l,td; + if (!i.sortInfo) {
+ i = i.cIndex; + for (l = 0; l < trs.length; l++) {
+ td = trs[l].cells[i]; + td.sort = td.getAttribute('data-sort') || $(td).text().toLowerCase();
+ };
+ } else + i = i.cIndex; + trs.sort(function (a, b) {
+ var va = a.cells[i].sort, + vb = b.cells[i].sort; + return (va > vb ? 1 * d : va == vb ? 0 : -1 * d);
+ }); + this.$con.find('>table>tbody').append(trs.slice()); + }, + filter: function(){ + var cells = {},
+ l, i,
+ tr, hide;
+ this.$con.find('>table>thead input.filter').each(function () {
+ if (this.value)
+ cells[this.parentNode.cIndex] = [this.value.toLowerCase(),0,this.result || {}];
+ else if (this.result)
+ this.result.innerHTML= '';
+ });
+ for (l = 0; l < this.trs.length; l++) {
+ tr = this.trs[l];
+ hide = '';
+ for (i in cells) {
+ if (tr.cells[i].innerHTML.toLowerCase().indexOf(cells[i][0]) == -1)
+ hide = 'none';
+ else
+ cells[i][1]++;
+ }
+ tr.style.display = hide;
+ };
+ for (i in cells)
+ if (cells[i][2].innerHTML = cells[i][1]);
+ } +} + +epgd.timerEditChFormat = function (input) {
+ var formats = ',SD,HD,3D', + values = input.value, + i; + if (values) {
+ values = values.split(','); + for (i = 0; i < values.length; i++) + formats = formats.replace(',' + values[i] + ',', ',');
+ } + $('<div title="' + epgd.tr.pages.timerList.chFormat + '"><ol style="float:left; border:2px inset #ddd; min-height:50px; margin-right:20px;">' + + (values.length ? '<li>' + values.join('</li><li>') + '</li>' : '') + + '</ol><ul style="float:left; border:2px inset #ddd; min-height:50px;list-style-type:none">' + + (formats.length > 1 ? '<li>' + formats.slice(1).replace(/,/g, '</li><li>') + '</li>' : '') + '</div>') + .dialog({
+ modal: true, + buttons: [{
+ text: epgd.tr.apply, + click: function () {
+ var val = ''; + $(this).find('ol > li').each(function () { val += ',' + this.innerHTML; }); + input.value = val.slice(1); + $(this).dialog("close");
+ }
+ }, {
+ text: epgd.tr.cancel, + click: function () {
+ $(this).dialog("close");
+ }
+ }]
+ }).find('ul,ol').sortable({
+ connectWith: "ul,ol"
+ }).disableSelection();
+}; + + +// Timer Listen Base Klasse +epgd.timerListBase = epgd.utils.inherits(function (options, dialog) { + this.dialog = dialog; + if (this.dialog) + this.dialog.list = this; + if (!options.conSel) options.conSel = '#content';//'#tabCon'; + if (!options.empty) options.empty = epgd.tr.pages.timerList.empty; + epgd.sortTable.call(this,options); +}, epgd.sortTable); +epgd.timerListBase.prototype.getTable = function () { + var tr = epgd.tr.pages.timerList; + return '<table id="timerList" class="timerTable"><thead><tr><th style="min-width:120px">' + epgd.tr.channel + this.sortIcons + + '</th><th></th><th data-defaultSort="1" colspan="2">' + tr.startTime + this.sortIcons + ' <input type="text" class="filter" style="width:50px" /></th><th>' + + tr.endTime + '</th><th style="min-width:120px">' + epgd.tr.pages.eventDetail.title + this.sortIcons + + ' <input type="text" class="filter" style="width:100px" /></th><th style="min-width:120px">VDR' + this.sortIcons + + ' <input type="text" class="filter" style="width:50px" /></th><th style="min-width:130px">' + this.sortIcons + + (this.o.addNew ? '<span class="iAsButton i-doc-new edit" title="' + tr.newTimer + '"></span>' + + '<span class="iAsButton i-refresh edit" title="' + epgd.tr.reload + '"></span>' : '') + + (this.o.selectable ? '<br clear="all" /><span style="margin-top:3px" class="iAsButton i-trash edit" title="' + epgd.tr.del + '"></span>' + + '<div class="selMarkBlock" style="width:auto"><b title="' + epgd.tr.markAll + '" class="selected" data-t="1"></b><b title="' + epgd.tr.markNone + + '" data-t="0"></b><b title="' + epgd.tr.markToggle + '"><b class="selected"></b></b></div>' : '') + + '</th></tr></thead><tbody></tbody></table>'; +} +epgd.timerListBase.prototype.update = function () { + var timerList = this; + epgd.utils.loader.process(function () {
+ timerList.$con.find('tbody').empty(); + epgd.ajax({ url: epgd.login.url + timerList.o.updateUrl, async: false, cache: false }, function (data) {
+ if (!data.timers.length) {
+ timerList.hideHead();
+ } else {
+ var trs = [], + editIcons = timerList.editIcons, + noEditStates = 'DF', + stateIcons = {
+ 'D': '<div class="i-trash">' + epgd.tr.pages.timerList.timerStates.D + '</div>', // gelöscht + 'E': '<div class="i-warning">' + epgd.tr.pages.timerList.timerStates.E + '</div>', // Fehler + 'F': '<div class="i-ok">' + epgd.tr.pages.timerList.timerStates.F + '</div>', // Aufnahme erfolgreich + 'R': '<div class="i-progress">' + epgd.tr.pages.timerList.timerStates.R + '</div>', // nimmt gerade auf + 'P': '<div class="i-clock">' + epgd.tr.pages.timerList.timerStates.P + '</div>', // wartet auf Aufnhemebeginn + 'U': '<div class="i-help">' + epgd.tr.pages.timerList.timerStates.U + '</div>' // unbekannt + }, + timerActions = epgd.tr.pages.timerList.timerActions, + searchTimerIcon = '<span class="iAsButton i-flashlight edit" title="' + epgd.tr.pages.timer.searchTimerList + ' ' + epgd.tr.edit + '" data-id="$id$">$title$</span>'; + $.each(data.timers, function (id, t) {
+ t.action = t.action ? t.action.toUpperCase() : 'A'; + t.state = t.state ? t.state.toUpperCase() : 'U'; + var vdr = epgd.vdrs.list[t.vdruuid] || { name: '--' }, + //start = t.day ? t.day + parseInt(t.starttime / 100, 10) * 60 * 60 + (t.starttime % 100) * 60 : new String(100 + parseInt(t.endtime / 100, 10)).slice(1) + ':' + (t.endtime % 100), + // searchTimer = t.aux && t.aux.match(/<epgd>.*<expression>([^<]+)<\/expression>/), + tr = $('<tr' + (t.active ? '' : ' class="ui-state-disabled"') + '><td>' + + epgd.channels.getHtml(t.channelid) + '</td><td>' + + (t.action != 'A' + ? '<div class="i-wait">' + timerActions[t.action] + '</div>' + : stateIcons[t.state] + ) + (t.info || '') + '</td>' + + '<td data-sort="' + new String(t.day) + new String(10000 + t.starttime).slice(1) + '">' + + (t.day ? epgd.utils.formatDate(t.day) : '-') + + '</td><td>' + + new String(100 + parseInt(t.starttime / 100, 10)).slice(1) + ':' + new String(100 + parseInt(t.starttime % 100, 10)).slice(1) + + '</td><td>' + + new String(100 + parseInt(t.endtime / 100, 10)).slice(1) + ':' + new String(100 + parseInt(t.endtime % 100, 10)).slice(1) + + '</td><td' + (t.eventid ? ' data-evId="' + t.eventid + '">' + (t.title || '') + '<br />' + (t.shorttext || '') : '>') + '</td><td>' + + vdr.name + '<br />' + (t.directory ? t.directory + '~' : '') + (t.file || '') + '</td><td>' + + (t.autotimerid ? searchTimerIcon.replace('$id$', t.autotimerid).replace('$title$', t.autotimername || t.expression || epgd.tr.pages.timer.searchTimerList) : '') + + (noEditStates.indexOf(t.state) == -1 ? editIcons : '') + '</td></tr>')[0]; + tr.tData = t; + trs.push(tr);
+ }); + timerList.trs = trs; + timerList.showHead(); + /*timerList.$con.find('>table>tbody>tr').find('>td:eq(1)').tooltip({ + items: "div", content: function () { + return this.innerHTML; + } + })*/
+ } + epgd.utils.loader.close(); + $(window).trigger('timerlist_updated', timerList);
+ });
+ },true); +} +epgd.timerListBase.prototype.action = function ($el, iconName,data) { + //this.dialog && this.dialog.close && this.dialog.close(); + var id; + switch (iconName) { + case 'edit': + case 'doc-new': + this.dialog.render($el.closest('tr')[0].tData); + break; + case 'trash': + this.del(this.getSelectedIds($el)); + break; + case 'flashlight': + id = $el.attr('data-id'), + list = this; + $(window).one('searchTimerList_updated', function () { + list.$con.find('tbody>tr').each(function () { + if (this.tData.id == id) { + epgd.pages.searchTimerList.dialog.render(this.tData); + return false; + } + }); + }); + epgd.$menu.menu("select", { target: "#menu_searchTimerList" }); + break; + default: + epgd.sortTable.prototype.action.call(this,$el, iconName, data); + } +}; +epgd.timerListBase.prototype.editIcons = '<span class="iAsButton i-trash edit" title="' + epgd.tr.del + '"></span><span class="iAsButton i-edit edit" title="' + epgd.tr.edit + '"></span>'; +epgd.timerListBase.prototype.getSelectedIds = function ($el) {
+ var ids = [];
+ if ($el[0].parentNode.nodeName == 'TH') {
+ $(this.trs).filter(".selected:visible").each(function () {
+ ids.push(this.tData.id);
+ });
+ } else
+ ids.push($el.closest('tr')[0].tData.id);
+ return ids;
+} +epgd.timerListBase.prototype.del = function (ids, succFunc, arrayName) {
+ var self = this, + allIDs= $.isArray(ids) ? ids : [parseInt(ids,10)]; + ids && allIDs.length && epgd.utils.confirm(epgd.tr.confirmDelete + (allIDs.length > 1 ? '<br />' + allIDs.length + epgd.tr.entries : ''), function (ok) {
+ ok && self.saveArray(allIDs, arrayName || "delete", succFunc);
+ });
+} +epgd.timerListBase.prototype.saveArray = function (ids, arrayName, succFunc) { + var self = this, + allIDs= $.isArray(ids) ? ids : [parseInt(ids,10)], + data= {}; + data[arrayName] = allIDs; + ids && allIDs.length && this.save(data, null, function (jqxhr) {
+ try {
+ var ids = ','; + $(jqxhr.responseJSON.result.failed).each(function () {
+ ids += allIDs[this] + ',';
+ }); + if (ids.length > 1) {
+ $(self.trs).each(function () {
+ if (ids.indexOf(',' + this.tData.id + ',') >= 0) + this.style.backgroundColor = 'red';
+ });
+ }
+ } catch (e) { } + return false;
+ }, succFunc); +}; +epgd.timerListBase.prototype.save = function (data, url, failFunc, succFunc) { + if (!data) return false; + var timerList = this; + epgd.utils.loader.process(function () {
+ epgd.ajax({
+ url: epgd.login.url + (url || timerList.o.saveUrl), + type: 'post', + data: JSON.stringify(data)
+ }, function (data) {
+ data = data.result; + if (data.state == 200) + epgd.utils.topInfo(epgd.tr.dataSaved); + else + epgd.utils.topInfo(data.message, { isError: 1 }); + epgd.utils.loader.close(); + timerList.$con && timerList.$con.parent().length && timerList.update();
+ succFunc && succFunc.call(timerList);
+ }, failFunc);
+ },true); + return true; +} + +// searchResult List - Klasse +epgd.searchResultList = epgd.utils.inherits(function (options, dialog) {
+ epgd.timerListBase.call(this, $.extend({
+ saveUrl: 'data/save-searchtimer'
+ }, options),dialog);
+}, epgd.timerListBase); +epgd.searchResultList.prototype.getTable = function () {
+ var tr = epgd.tr.pages.timerList; + return '<table id="searchResultList" class="timerTable"><thead><tr><th style="min-width:120px">' + epgd.tr.channel + this.sortIcons + '</th><th data-defaultSort="1" colspan="2">' + tr.startTime + this.sortIcons + '</th><th>' + + tr.endTime + '</th><th>' + epgd.tr.pages.eventDetail.title + this.sortIcons + '</th><th></th></tr></thead><tbody></tbody></table>';
+} +epgd.searchResultList.prototype.update = function (d) {
+ if (!d) + return false; + var timerList = this; + d.id && delete d.id;
+ d.name && delete d.name;
+ d.max = epgd.profile.maxListEntries; + epgd.utils.loader.process(function () {
+ timerList.$con.find('tbody').empty();
+ epgd.ajax({
+ url: epgd.login.url + "data/search", + type: 'post', + data: JSON.stringify(d)
+ }, function (data) {
+ var trs = [], i; + if (!data.events || !data.events.length) {
+ timerList.hideHead();
+ } else {
+ data.count > d.max && epgd.utils.popup('Achtung! Es wurden ' + data.count + ' Ergebnisse gefunden. Angezeigt werden aber nur ' + d.max + '.<br /> Das Nachladen ist noch nicht implementiert! Der Wert kann in den Einstellungen angepasst werden');
+ $.each(data.events, function (id, e) {
+ var trClass = '', + icons = '', + d; + if (e.dones) {
+ for (i in e.dones) {
+ d = e.dones[i]; + icons += '<span class="iAsButton" title="' + epgd.tr.pages.timerList.doneStates[d.state] + ' data-id=' + d.id + '">' + d.state + '</span>'; + if (d.state == 'R') + trClass = ' class="ui-state-disabled"';
+ }
+ } + trs.push($('<tr' + trClass + '><td>' + + epgd.channels.getHtml(e.channelid) + '</td><td data-sort="' + e.starttime + '">' + + epgd.utils.formatDate(e.starttime) + '</td><td>' + + epgd.utils.formatTime(e.starttime) + '</td><td>' + + epgd.utils.formatTime(e.starttime + e.duration) + + '</td><td data-evId="' + e.id + '">' + e.title + '<br />' + (e.shorttext || '') + + '</td><td>' + icons + '</td></tr>').tooltip()[0]);
+ }); + timerList.trs = trs; + timerList.showHead();
+ } + epgd.utils.loader.close(); + timerList.dialog && timerList.dialog.resize && window.setTimeout(function(){timerList.dialog.resize();},100); + });
+ },true);
+}; +// Timerliste eines Suchtimers - Klasse +epgd.searchTimerTimerList = epgd.utils.inherits(function (options, dialog) {
+ epgd.timerListBase.call(this, $.extend({
+ saveUrl: 'data/save-timer', + updateUrl: 'data/timers?state=P,R'
+ }, options), dialog);
+}, epgd.timerListBase); +epgd.searchTimerTimerList.prototype.getTable = function () {
+ var tr = epgd.tr.pages.timerList; + return '<table class="timerTable"><thead><tr><th>' + epgd.tr.channel + this.sortIcons + '</th><th data-defaultSort="1" colspan="2">' + tr.startTime + this.sortIcons + '</th><th>' + + tr.endTime + '</th><th>' + epgd.tr.pages.eventDetail.title + this.sortIcons + '</th><th>VDR' + this.sortIcons + '</th><th>' + + '</th></tr></thead><tbody></tbody></table>';
+} +epgd.searchTimerTimerList.prototype.update = function (d) {
+ if (!d) + return false;
+ var timerList = this; + epgd.utils.loader.process(function () {
+ timerList.$con.find('tbody').empty();
+ epgd.ajax({ url: epgd.login.url + timerList.o.updateUrl + '&autotimerid=' + d.id, async: true, cache: false }, function (data) {
+ var trs = [], + editIcons = '<span class="iAsButton i-trash edit" title="' + epgd.tr.del + '"></span>'; + if (!data.timers.length) {
+ timerList.hideHead();
+ } else {
+ $.each(data.timers, function (id, t) {
+ var vdr = epgd.vdrs.list[t.vdruuid] || { name: '--' }, + tr = $('<tr' + (t.active ? '' : ' class="ui-state-disabled"') + '><td>' + + epgd.channels.getHtml(t.channelid) + '</td><td data-sort="' + new String(t.day) + new String(10000 + t.starttime).slice(1) + '">' + + (t.day ? $.datepicker.formatDate(epgd.tr.dateTimePicker.dateFormat, epgd.utils.date(t.day)) : '-') + + '</td><td>' + + new String(100 + parseInt(t.starttime / 100, 10)).slice(1) + ':' + new String(100 + parseInt(t.starttime % 100, 10)).slice(1) + + '</td><td>' + + new String(100 + parseInt(t.endtime / 100, 10)).slice(1) + ':' + new String(100 + parseInt(t.endtime % 100, 10)).slice(1) + + '</td><td' + (t.eventid ? ' data-evId="' + t.eventid + '">' + t.title + '<br />' + (t.shorttext || '') : '>') + '</td><td>' + + vdr.name + '<br />' + t.file + '</td><td>' + + editIcons + '</td></tr>')[0]; + tr.tData = t; + trs.push(tr);
+ }); + timerList.trs = trs; + timerList.showHead();
+ } + timerList.dialog && timerList.dialog.resize && window.setTimeout(function () { timerList.dialog.resize(); }, 100); + epgd.utils.loader.close();
+ });
+ });
+} + +// anstehende Timer +epgd.pages.timerList = new epgd.timerListBase({
+ updateUrl: 'data/timers?state=P,R',
+ saveUrl: 'data/save-timer',
+ selectable: true,
+ addNew: true,
+ right: epgd.rights.umTimer
+}, new epgd.timerDialog()); +// Küzlich erledigte Timer +epgd.pages.timersDone = new epgd.timerListBase({
+ updateUrl: 'data/timers?state=D,F,E&action=A',
+ right: epgd.rights.umTimer
+}); +epgd.pages.timersDone.getTable = function () {
+ return epgd.timerListBase.prototype.getTable.call(this).replace('data-defaultSort="1"', 'data-defaultSort="-1"')
+} +// Timerhistorie +epgd.pages.timerListDone = new epgd.timerListBase({
+ updateUrl: 'data/donetimers', saveUrl: 'data/store-donetimers',
+ selectable: true,
+ right: epgd.rights.umTimer
+}); +epgd.pages.timerListDone.getTable = function () { + return '<table id="timerListDone" class="timerTable"><thead><tr><th style="min-width:120px"><input type="text" class="filter" style="width:40px" />' + + this.sortIcons + '</th><th data-defaultSort="-1" style="min-width:180px">' + + epgd.tr.pages.timerList.recordTime + this.sortIcons + '</th><th>' + + epgd.tr.pages.eventDetail.title + ' <input type="text" class="filter" />' + this.sortIcons + '</th><th style="min-width:120px">' + + epgd.tr.channel + this.sortIcons + '</th><th style="min-width:100px">' + this.sortIcons + + '<span style="margin-top:3px" class="iAsButton i-trash edit" title="' + epgd.tr.del + '"></span>' + + '<div class="selMarkBlock" style="width:auto"><b title="' + epgd.tr.markAll + '" class="selected" data-t="1"></b><b title="' + epgd.tr.markNone + + '" data-t="0"></b><b title="' + epgd.tr.markToggle + '"><b class="selected"></b></b></div>' + + '</th></tr></thead><tbody></tbody></table>'; +} +epgd.pages.timerListDone.action = function ($el, iconName,data) {
+ if (iconName == 'detail' && !$el[0].eventDetail)
+ $el[0].eventDetail = new epgd.doneTimerDetail($el.parent()[0]);
+ epgd.timerListBase.prototype.action.call(this, $el, iconName, data);
+} +epgd.pages.timerListDone.stateIcons = {
+ 'D': '<div class="i-trash">' + epgd.tr.pages.timerList.doneStates.D + '</div>', // gelöscht + 'F': '<div class="i-warning">' + epgd.tr.pages.timerList.doneStates.F + '</div>', // Aufnahme fehlgeschlagen + 'f': '<div class="i-warning">' + epgd.tr.pages.timerList.doneStates.f + '</div>', // Timer konnte nicht erstellt werden + 'R': '<div class="i-ok">' + epgd.tr.pages.timerList.doneStates.R + '</div>', // Aufnahme fertig + 'C': '<div class="i-buffer">' + epgd.tr.pages.timerList.doneStates.C + '</div>', // Timer bereits erstellt + 'Q': '<div class="i-clock">' + epgd.tr.pages.timerList.doneStates.Q + '</div>' // Timer in Vorbereitung +} +epgd.pages.timerListDone.update = function () { + var timerList = this; + epgd.utils.loader.process(function () {
+ epgd.ajax({ url: epgd.login.url + timerList.o.updateUrl, async: false, cache: false }, function (data) {
+ timerList.$con.find('tbody').empty(); + if (!data.donetimers.length) {
+ timerList.hideHead();
+ } else {
+ var trs = [], + tr, i, t, + searchTimerIcon = '<span class="iAsButton i-flashlight edit" title="' + epgd.tr.pages.timer.searchTimerList + ' ' + epgd.tr.edit + '" data-id="$id$">$title$</span>'; + for (i in data.donetimers) {
+ t = data.donetimers[i]; + tr = $('<tr><td>' + + (t.state && timerList.stateIcons[t.state] || '') + '</td>' + + '<td data-sort="' + t.starttime + '">' + + epgd.utils.formatDateTime(t.starttime) + '<br />' + parseInt(t.duration / 60, 10) + ' ' + epgd.tr.minutes + + '</td><td data-evId="' + t.id + '">' + (t.title || '') + '<br />' + (t.shorttext || '') + '</td><td data-sort="' + t.channelid + '">' + + epgd.channels.getHtml(t.channelid) + '</td><td>' + + '<span class="iAsButton i-trash edit" title="' + epgd.tr.del + '"></span>' + + (t.autotimerid ? searchTimerIcon.replace('$id$', t.autotimerid).replace('$title$', t.autotimername || t.expression || epgd.tr.pages.timer.searchTimerList) : '') + + '</td></tr>')[0]; + tr.tData = t; + trs.push(tr);
+ }; + timerList.trs = trs; + timerList.showHead();
+ } + epgd.utils.loader.close(); + $(window).trigger('timerlist_updated', timerList);
+ });
+ },true); +} +// ungesyncte Aufträge +epgd.pages.timerJobList = new epgd.timerListBase({
+ updateUrl: "data/timers?notaction=A",
+ saveUrl: 'data/delete-timerjobs',
+ selectable: true,
+ right: epgd.rights.umTimer
+}, new epgd.timerDialog()); + +// Suchtimer +epgd.pages.searchTimerList = new epgd.timerListBase({
+ saveUrl: 'data/save-searchtimer',
+ right: epgd.rights.umSearchTimer
+}, new epgd.searchTimerDialog()); +epgd.pages.searchTimerList.getTable = function () { + var tr = epgd.tr.pages.timerList; + return '<table id="timerSearchList" class="timerTable"><thead><tr><th data-defaultSort="1">' + + epgd.tr.pages.search.searchName + '/' + epgd.tr.pages.search.searchExpression + ' <input type="text" class="filter" />' + this.sortIcons + '</th><th>' + 'hits' + this.sortIcons + + '</th><th style="min-width:120px">VDR' + this.sortIcons + '</th><th>' + + '<span class="iAsButton i-doc-new edit" title="' + tr.newTimer + '"></span>' + + '<span class="iAsButton i-refresh edit" title="' + epgd.tr.reload + '"></span>' + + '<span class="iAsButton i-link-ext edit" title="' + tr.searchTimerReload + '"></span>' + + '</th></tr></thead><tbody></tbody></table>'; +} +epgd.pages.searchTimerList.action = function ($el, iconName, data) { + epgd.timerListBase.prototype.action.call(this,$el, iconName, data); + switch (iconName) { + case 'link-ext': + this.triggerUpdate(); + break; + case 'down-dir': + if (!$el[0].tList) { + var dialog={
+ $td: $el.parent().css("position", "relative"),
+ tdHeight: $el.parent().outerHeight() + 10,
+ data: $el.parent().parent()[0].tData,
+ resize: function () {
+ var $table = this.list.$con.find('>table').addClass("sub"); + $table.width(this.$td.parent().outerWidth()); + this.$td.height(this.tdHeight + $table.outerHeight(true) + 10); + //this.$td.append(this.list.$con); + },
+ toggle : function (doShow) {
+ this.list.$con.toggle(doShow); + if (doShow) {
+ this.$td.css("height", "100px");
+ this.list.update(this.data);
+ } else + this.$td.css("height", "auto");
+ } + }, + options= {
+ conSel: $('<div style="position:absolute;z-index:5;top:' + dialog.tdHeight + 'px" />').appendTo(document.body) + }; + $el[0].tList = dialog.data.type == 'S' ? new epgd.searchResultList(options, dialog) : new epgd.searchTimerTimerList(options, dialog); + $el[0].tList.render(); + dialog.$td.append(dialog.list.$con); + } + $el[0].tList.dialog.toggle(true); + $el.removeClass('i-down-dir').addClass('i-right-dir'); + break; + case 'right-dir': + $el.removeClass('i-right-dir').addClass('i-down-dir'); + if ($el[0].tList) + $el[0].tList.dialog.toggle(false); + break; + } +} +epgd.pages.searchTimerList.update = function () { + var timerList = this; + this.$con.find('tbody').empty(); + epgd.utils.loader.process(function () {
+ epgd.ajax({ url: epgd.login.url + "data/searchtimers", async: false, cache: false }, function (data) {
+ var trs = [], + editIcons = timerList.editIcons, + typeIcons = { 'V': 'i-tv', 'R': 'i-record', 'S': 'i-search' }; + if (!data.searchtimers.length) {
+ timerList.hideHead();
+ } else {
+ $.each(data.searchtimers, function (id, t) {
+ var vdr = epgd.vdrs.list[t.vdruuid] || { name: '--' }, + tr = $('<tr' + (t.active ? '' : ' class="ui-state-disabled"') + '><td>' + + '<span class="iAsButton i-down-dir edit" title="' + epgd.tr.pages.timer.timerList + '"></span>' + + '<div class="' + typeIcons[t.type] + '">' + (t.name || t.expression) + '</div></td><td' + + (t.type == 'S' ? '>--' : ' data-sort="' + new String('00000' + t.hits).slice(-5) + '">' + t.hits) + '</td><td>' + + vdr.name + '</td><td>' + editIcons + '</td></tr>')[0]; + tr.tData = t; + trs.push(tr);
+ }); + timerList.trs = trs; + timerList.showHead();
+ } + epgd.utils.loader.close(); + $(window).trigger('searchTimerList_updated', timerList);
+ });
+ }); +} +epgd.pages.searchTimerList.triggerUpdate = function () { + var timerList = this; + epgd.ajax({url: epgd.login.url + 'data/updatesearchtimer'},function (data) { + if (data.result.state == 200) + epgd.utils.topInfo(epgd.tr.dataSaved); + else + epgd.utils.topInfo(data.message, { isError: 1 }); + timerList.update(); + }); +} + +epgd.pages.search = new epgd.searchDialog(); + +//message List +epgd.pages.messageList = new epgd.timerListBase({
+ saveUrl: 'data/markmessages',
+ selectable: true
+}) +epgd.pages.messageList.getTable = function () {
+ return '<table id="messageList" class="timerTable"><thead><tr><th style="width:70px">id' + this.sortIcons + '</th>' + + '<th style="width:120px">' + 'Typ' + ' <input type="text" class="filter" style="width:18px" />' + this.sortIcons + '</th>' + + '<th style="width:140px">' + 'Zeit' + this.sortIcons + '</th>' + + '<th style="width:100px">' + 'Titel' + ' <input type="text" class="filter" style="width:50px" />' + this.sortIcons + '</th>' + + '<th style="min-width:140px">' + 'infotext' + ' <input type="text" class="filter" />' + this.sortIcons + '</th>' + + '<th style="min-width:190px"><div class="selMarkBlock" style="width:auto;float: right;">' + +'<b title="' + epgd.tr.markAll + '" class="selected" data-t="1"></b><b title="' + epgd.tr.markNone + '" data-t="0"></b><b title="' + epgd.tr.markToggle + '"><b class="selected"></b></b></div>' + + 'Status' + ' <input type="text" class="filter" style="width:20px" />' + '<br />' + this.sortIcons + + '<span class="iAsButton i-refresh edit" title="' + epgd.tr.reload + '"></span>' + + '<span style="margin-top:3px" class="iAsButton i-trash edit" title="' + epgd.tr.del + '"></span>' + + '<span style="margin-top:3px" class="iAsButton i-check edit" title="' + epgd.tr.pages.timerList.messageStates.R + '"></span>' + + '<span style="margin-top:3px" class="iAsButton i-check-empty edit" title="' + epgd.tr.pages.timerList.messageStates.N + '"></span></th>' + + '</tr></thead><tbody></tbody></table>';
+} +epgd.pages.messageList.update = function (d) {
+ var messList = this; + epgd.utils.loader.process(function () {
+ epgd.ajax({ url: epgd.login.url + "data/messages", async: false, cache: false }, function (data) {
+ messList.$con.find('tbody').empty(); + if (!data.messages.length) {
+ messList.hideHead();
+ } else {
+ var trs = [], + tr, i, t, + icons = {
+ 'N': '<span class="iAsButton i-check-empty edit">' + epgd.tr.pages.timerList.messageStates.N + '</span>', + 'R': '<span class="iAsButton i-check edit">' + epgd.tr.pages.timerList.messageStates.R + '</span>'
+ }, + types = {
+ 'E': '<div class="i-error">' + epgd.tr.pages.timerList.timerStates.E + '</div>', + 'F': '<div class="i-flash-outline">' + epgd.tr.pages.timerList.timerStates.F + '</div>', + 'I': '<div class="i-info">' + epgd.tr.pages.timerList.messageTypes.I + '</div>',
+ 'W': '<div class="i-warning">' + epgd.tr.pages.timerList.messageTypes.W + '</div>'
+ }; + for (i in data.messages) {
+ t = data.messages[i]; + tr = $('<tr><td data-sort="' + new String('0000000' + t.id).slice(-7) + '">' + t.id + '</td>' + + '<td>' + (types[t.type] ||'') +'</td>' + + '<td data-sort="' + t.updsp + '">' + + epgd.utils.formatDateTime(t.updsp) + '</td>' + + '<td>' + t.title + '</td>' + + '<td>' + t.text + '</td>' + + '<td data-sort="' + t.state + t.updsp + '"><span class="iAsButton i-trash edit" title="' + epgd.tr.del + '"></span>' + (icons[t.state] || '') + '</td>' + + '</tr>')[0]; + tr.tData = t; + trs.push(tr);
+ }; + messList.trs = trs; + messList.$con.find('>table>tbody').append(trs.sort(function (a,b) { + return a.tData.state == b.tData.state + ? a.tData.state.updsp > b.tData.state.updsp ? -1 : 1 + : a.tData.state > b.tData.state
+ }).slice()); + messList.showHead();
+ } + epgd.utils.loader.close(); + $(window).trigger('messagelist_updated', messList);
+ });
+ }, true);
+};
+epgd.pages.messageList.action = function ($el, iconName, data) {
+ var ids = this.getSelectedIds($el), + state= null, + i; + if (ids) {
+ switch (iconName) {
+ case 'check': + state = $el[0].parentNode.nodeName == 'TH' ? 'R' : 'N'; + break; + case 'check-empty': + state = $el[0].parentNode.nodeName == 'TH' ? 'N' : 'R'; + break;
+ case 'trash': + state = 'D' + break;
+ }
+ if (state) {
+ for (i in ids)
+ ids[i]= {"id":ids[i], "state":state}
+ state == 'D' ? this.del(ids, null,"messages") : this.saveArray(ids, "messages");
+ return true;
+ }
+ }
+ return epgd.timerListBase.prototype.action.call(this, $el, iconName, data);
+}
+
diff --git a/http/src/js/vdr.js b/http/src/js/vdr.js new file mode 100644 index 0000000..af27b3c --- /dev/null +++ b/http/src/js/vdr.js @@ -0,0 +1,57 @@ +epgd.vdr = function (uuid, data) { + this.uuid = uuid; + $.extend(this, data); +} +epgd.vdr.prototype.switchChannel = function (channelNo) { + epgd.ajax({url: epgd.login.url + 'data/channelswitch?uuid=' + this.uuid + '&channel=' + channelNo, cache: false},function (data) { + epgd.utils.popup(data.result.message, { title: 'VDR', autoClose:5000 }); + }); +} +epgd.vdr.prototype.wol = function () {
+ epgd.ajax({ url: epgd.login.url + 'data/wakeupvdr?uuid=' + this.uuid, cache: false }, function (data) {
+ epgd.utils.popup(data.result.message, { title: 'VDR', autoClose: 5000 });
+ });
+} +epgd.vdrs = { + list: null, + current:null, + load: function () { + if (!this.list) { + this.list = {}; + epgd.ajax({ url: epgd.login.url + "data/vdrs", async: false }, function (data) { + var uuid; + for (uuid in data.vdrs) { + epgd.vdrs.list[uuid] = new epgd.vdr(uuid, data.vdrs[uuid]); + } + if (!epgd.vdrs.current){ + if (epgd.profile.defaultVDRuuid){ + epgd.vdrs.current = epgd.vdrs.list[epgd.profile.defaultVDRuuid]; + if (!epgd.vdrs.current) + epgd.utils.log('the default VDR (' + epgd.profile.defaultVDRuuid + ' is invalid! Please change this in Web Interface/options)'); + } + if (!epgd.vdrs.current){ + for (uuid in epgd.vdrs.list) { + epgd.vdrs.current = epgd.vdrs.list[uuid]; + break; + }
+ } + if (!epgd.vdrs.current){ + epgd.utils.log('no VDR found',2); + epgd.vdrs.current = new epgd.vdr("000-missing-vdr-000", { name: "no VDR found" }); + } + } + $(window).trigger('vdrs_load'); + }); + } + }, + get: function (uuid) { + return this.list[(uuid || this.current)] || {}; + } +}; + + +epgd.pages.vdrs = {
+ render: function () {
+ epgd.$con.html('<div><button class="iAsButton" onclick="epgd.vdrs.current.wol()">WOL</button>');
+ }
+};
\ No newline at end of file |