474 lines
16 KiB
JavaScript
474 lines
16 KiB
JavaScript
var SERVER = new Object();
|
|
var BULK_EDIT = false;
|
|
var COLUMN_TO_SORT;
|
|
var SEARCH_MAPPING = new Object();
|
|
var UNDO = new Object();
|
|
var SERVER_CONNECTION = false;
|
|
var WS_AVAILABLE = false;
|
|
// Menü
|
|
var menuItems = new Array();
|
|
menuItems.push(new MainMenuItem("playlist", "{{.mainMenu.item.playlist}}", "m3u.png", "{{.mainMenu.headline.playlist}}"));
|
|
//menuItems.push(new MainMenuItem("pmsID", "{{.mainMenu.item.pmsID}}", "number.png", "{{.mainMenu.headline.pmsID}}"))
|
|
menuItems.push(new MainMenuItem("filter", "{{.mainMenu.item.filter}}", "filter.png", "{{.mainMenu.headline.filter}}"));
|
|
menuItems.push(new MainMenuItem("xmltv", "{{.mainMenu.item.xmltv}}", "xmltv.png", "{{.mainMenu.headline.xmltv}}"));
|
|
menuItems.push(new MainMenuItem("mapping", "{{.mainMenu.item.mapping}}", "mapping.png", "{{.mainMenu.headline.mapping}}"));
|
|
menuItems.push(new MainMenuItem("users", "{{.mainMenu.item.users}}", "users.png", "{{.mainMenu.headline.users}}"));
|
|
menuItems.push(new MainMenuItem("settings", "{{.mainMenu.item.settings}}", "settings.png", "{{.mainMenu.headline.settings}}"));
|
|
menuItems.push(new MainMenuItem("log", "{{.mainMenu.item.log}}", "log.png", "{{.mainMenu.headline.log}}"));
|
|
menuItems.push(new MainMenuItem("logout", "{{.mainMenu.item.logout}}", "logout.png", "{{.mainMenu.headline.logout}}"));
|
|
// Kategorien für die Einstellungen
|
|
var settingsCategory = new Array();
|
|
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.general}}", "xteveAutoUpdate,tuner,epgSource,api,scheme.m3u,scheme.xml"));
|
|
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.files}}", "update,files.update,temp.path,cache.images,xepg.replace.missing.images"));
|
|
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.streaming}}", "buffer,buffer.size.kb,buffer.timeout,user.agent,ffmpeg.path,ffmpeg.options,vlc.path,vlc.options"));
|
|
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.backup}}", "backup.path,backup.keep"));
|
|
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.authentication}}", "authentication.web,authentication.pms,authentication.m3u,authentication.xml,authentication.api"));
|
|
function showPopUpElement(elm) {
|
|
var allElements = new Array("popup-custom");
|
|
for (var i = 0; i < allElements.length; i++) {
|
|
showElement(allElements[i], false);
|
|
}
|
|
showElement(elm, true);
|
|
setTimeout(function () {
|
|
showElement("popup", true);
|
|
}, 10);
|
|
return;
|
|
}
|
|
function showElement(elmID, type) {
|
|
var cssClass;
|
|
switch (type) {
|
|
case true:
|
|
cssClass = "block";
|
|
break;
|
|
case false:
|
|
cssClass = "none";
|
|
break;
|
|
}
|
|
document.getElementById(elmID).className = cssClass;
|
|
}
|
|
function changeButtonAction(element, buttonID, attribute) {
|
|
var value = element.options[element.selectedIndex].value;
|
|
document.getElementById(buttonID).setAttribute(attribute, value);
|
|
}
|
|
function getLocalData(dataType, id) {
|
|
var data = new Object();
|
|
switch (dataType) {
|
|
case "m3u":
|
|
data = SERVER["settings"]["files"][dataType][id];
|
|
break;
|
|
case "hdhr":
|
|
data = SERVER["settings"]["files"][dataType][id];
|
|
break;
|
|
case "filter":
|
|
case "custom-filter":
|
|
case "group-title":
|
|
if (id == -1) {
|
|
data["active"] = true;
|
|
data["caseSensitive"] = false;
|
|
data["description"] = "";
|
|
data["exclude"] = "";
|
|
data["filter"] = "";
|
|
data["include"] = "";
|
|
data["name"] = "";
|
|
data["type"] = "group-title";
|
|
SERVER["settings"]["filter"][id] = data;
|
|
}
|
|
data = SERVER["settings"]["filter"][id];
|
|
break;
|
|
case "xmltv":
|
|
data = SERVER["settings"]["files"][dataType][id];
|
|
break;
|
|
case "users":
|
|
data = SERVER["users"][id]["data"];
|
|
break;
|
|
case "mapping":
|
|
data = SERVER["xepg"]["epgMapping"][id];
|
|
break;
|
|
case "m3uGroups":
|
|
data = SERVER["data"]["playlist"]["m3u"]["groups"];
|
|
break;
|
|
}
|
|
return data;
|
|
}
|
|
function getObjKeys(obj) {
|
|
var keys = new Array();
|
|
for (var i in obj) {
|
|
if (obj.hasOwnProperty(i)) {
|
|
keys.push(i);
|
|
}
|
|
}
|
|
return keys;
|
|
}
|
|
function getAllSelectedChannels() {
|
|
var channels = new Array();
|
|
if (BULK_EDIT == false) {
|
|
return channels;
|
|
}
|
|
var trs = document.getElementById("content_table").getElementsByTagName("TR");
|
|
for (var i = 1; i < trs.length; i++) {
|
|
if (trs[i].style.display != "none") {
|
|
if (trs[i].firstChild.firstChild.checked == true) {
|
|
channels.push(trs[i].id);
|
|
}
|
|
}
|
|
}
|
|
return channels;
|
|
}
|
|
function selectAllChannels() {
|
|
var bulk = false;
|
|
var trs = document.getElementById("content_table").getElementsByTagName("TR");
|
|
if (trs[0].firstChild.firstChild.checked == true) {
|
|
bulk = true;
|
|
}
|
|
for (var i = 1; i < trs.length; i++) {
|
|
if (trs[i].style.display != "none") {
|
|
switch (bulk) {
|
|
case true:
|
|
trs[i].firstChild.firstChild.checked = true;
|
|
break;
|
|
case false:
|
|
trs[i].firstChild.firstChild.checked = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
function bulkEdit() {
|
|
BULK_EDIT = !BULK_EDIT;
|
|
var className;
|
|
var rows = document.getElementsByClassName("bulk");
|
|
switch (BULK_EDIT) {
|
|
case true:
|
|
className = "bulk showBulk";
|
|
break;
|
|
case false:
|
|
className = "bulk hideBulk";
|
|
break;
|
|
}
|
|
for (var i = 0; i < rows.length; i++) {
|
|
rows[i].className = className;
|
|
rows[i].checked = false;
|
|
}
|
|
return;
|
|
}
|
|
function sortTable(column) {
|
|
//console.log(columm);
|
|
if (column == COLUMN_TO_SORT) {
|
|
return;
|
|
}
|
|
var table = document.getElementById("content_table");
|
|
var tableHead = table.getElementsByTagName("TR")[0];
|
|
var tableItems = tableHead.getElementsByTagName("TD");
|
|
var sortObj = new Object();
|
|
var x, xValue;
|
|
var tableHeader;
|
|
var sortByString = false;
|
|
if (column > 0 && COLUMN_TO_SORT > 0) {
|
|
tableItems[COLUMN_TO_SORT].className = "pointer";
|
|
tableItems[column].className = "sortThis";
|
|
}
|
|
COLUMN_TO_SORT = column;
|
|
var rows = table.rows;
|
|
if (rows[1] != undefined) {
|
|
tableHeader = rows[0];
|
|
x = rows[1].getElementsByTagName("TD")[column];
|
|
for (i = 1; i < rows.length; i++) {
|
|
x = rows[i].getElementsByTagName("TD")[column];
|
|
switch (x.childNodes[0].tagName.toLowerCase()) {
|
|
case "input":
|
|
xValue = x.getElementsByTagName("INPUT")[0].value.toLowerCase();
|
|
break;
|
|
case "p":
|
|
xValue = x.getElementsByTagName("P")[0].innerText.toLowerCase();
|
|
break;
|
|
default: console.log(x.childNodes[0].tagName);
|
|
}
|
|
if (xValue == "" || xValue == NaN) {
|
|
xValue = i;
|
|
sortObj[i] = rows[i];
|
|
}
|
|
else {
|
|
switch (isNaN(xValue)) {
|
|
case false:
|
|
xValue = parseFloat(xValue);
|
|
sortObj[xValue] = rows[i];
|
|
break;
|
|
case true:
|
|
sortByString = true;
|
|
sortObj[xValue.toLowerCase() + i] = rows[i];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
while (table.firstChild) {
|
|
table.removeChild(table.firstChild);
|
|
}
|
|
var sortValues = getObjKeys(sortObj);
|
|
if (sortByString == true) {
|
|
sortValues.sort();
|
|
console.log(sortValues);
|
|
}
|
|
else {
|
|
function sortFloat(a, b) {
|
|
return a - b;
|
|
}
|
|
sortValues.sort(sortFloat);
|
|
}
|
|
table.appendChild(tableHeader);
|
|
for (var i = 0; i < sortValues.length; i++) {
|
|
table.appendChild(sortObj[sortValues[i]]);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
function createSearchObj() {
|
|
SEARCH_MAPPING = new Object();
|
|
var data = SERVER["xepg"]["epgMapping"];
|
|
var channels = getObjKeys(data);
|
|
var channelKeys = ["x-active", "x-channelID", "x-name", "_file.m3u.name", "x-group-title"];
|
|
channels.forEach(function (id) {
|
|
channelKeys.forEach(function (key) {
|
|
if (key == "x-active") {
|
|
switch (data[id][key]) {
|
|
case true:
|
|
SEARCH_MAPPING[id] = "online ";
|
|
break;
|
|
case false:
|
|
SEARCH_MAPPING[id] = "offline ";
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
SEARCH_MAPPING[id] = SEARCH_MAPPING[id] + data[id][key] + " ";
|
|
}
|
|
});
|
|
});
|
|
return;
|
|
}
|
|
function searchInMapping() {
|
|
var searchValue = document.getElementById("searchMapping").value;
|
|
var trs = document.getElementById("content_table").getElementsByTagName("TR");
|
|
for (var i = 1; i < trs.length; ++i) {
|
|
var id = trs[i].getAttribute("id");
|
|
var element = SEARCH_MAPPING[id];
|
|
switch (element.toLowerCase().includes(searchValue.toLowerCase())) {
|
|
case true:
|
|
document.getElementById(id).style.display = "";
|
|
break;
|
|
case false:
|
|
document.getElementById(id).style.display = "none";
|
|
break;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
function calculateWrapperHeight() {
|
|
if (document.getElementById("box-wrapper")) {
|
|
var elm = document.getElementById("box-wrapper");
|
|
var divs = new Array("myStreamsBox", "clientInfo", "content");
|
|
var elementsHeight = 0 - elm.offsetHeight;
|
|
for (var i = 0; i < divs.length; i++) {
|
|
elementsHeight = elementsHeight + document.getElementById(divs[i]).offsetHeight;
|
|
}
|
|
elm.style.height = window.innerHeight - elementsHeight + "px";
|
|
}
|
|
return;
|
|
}
|
|
function changeChannelNumber(element) {
|
|
var dbID = element.parentNode.parentNode.id;
|
|
var newNumber = parseFloat(element.value);
|
|
var channelNumbers = [];
|
|
var data = SERVER["xepg"]["epgMapping"];
|
|
var channels = getObjKeys(data);
|
|
if (isNaN(newNumber)) {
|
|
alert("{{.alert.invalidChannelNumber}}");
|
|
return;
|
|
}
|
|
channels.forEach(function (id) {
|
|
var channelNumber = parseFloat(data[id]["x-channelID"]);
|
|
channelNumbers.push(channelNumber);
|
|
});
|
|
for (var i = 0; i < channelNumbers.length; i++) {
|
|
if (channelNumbers.indexOf(newNumber) == -1) {
|
|
break;
|
|
}
|
|
if (Math.floor(newNumber) == newNumber) {
|
|
newNumber = newNumber + 1;
|
|
}
|
|
else {
|
|
newNumber = newNumber + 0.1;
|
|
newNumber.toFixed(1);
|
|
newNumber = Math.round(newNumber * 10) / 10;
|
|
}
|
|
}
|
|
data[dbID]["x-channelID"] = newNumber.toString();
|
|
element.value = newNumber;
|
|
console.log(data[dbID]["x-channelID"]);
|
|
if (COLUMN_TO_SORT == 1) {
|
|
COLUMN_TO_SORT = -1;
|
|
sortTable(1);
|
|
}
|
|
return;
|
|
}
|
|
function backup() {
|
|
var data = new Object();
|
|
console.log("Backup data");
|
|
var cmd = "xteveBackup";
|
|
console.log("SEND TO SERVER");
|
|
console.log(data);
|
|
var server = new Server(cmd);
|
|
server.request(data);
|
|
return;
|
|
}
|
|
function toggleChannelStatus(id) {
|
|
var element;
|
|
var status;
|
|
if (document.getElementById("active")) {
|
|
var checkbox = document.getElementById("active");
|
|
status = (checkbox).checked;
|
|
}
|
|
var ids = getAllSelectedChannels();
|
|
if (ids.length == 0) {
|
|
ids.push(id);
|
|
}
|
|
ids.forEach(function (id) {
|
|
var channel = SERVER["xepg"]["epgMapping"][id];
|
|
channel["x-active"] = status;
|
|
switch (channel["x-active"]) {
|
|
case true:
|
|
if (channel["x-xmltv-file"] == "-" || channel["x-mapping"] == "-") {
|
|
if (BULK_EDIT == false) {
|
|
alert(channel["x-name"] + ": Missing XMLTV file / channel");
|
|
checkbox.checked = false;
|
|
}
|
|
channel["x-active"] = false;
|
|
}
|
|
break;
|
|
case false:
|
|
// code...
|
|
break;
|
|
}
|
|
if (channel["x-active"] == false) {
|
|
document.getElementById(id).className = "notActiveEPG";
|
|
}
|
|
else {
|
|
document.getElementById(id).className = "activeEPG";
|
|
}
|
|
});
|
|
}
|
|
function restore() {
|
|
if (document.getElementById('upload')) {
|
|
document.getElementById('upload').remove();
|
|
}
|
|
var restore = document.createElement("INPUT");
|
|
restore.setAttribute("type", "file");
|
|
restore.setAttribute("class", "notVisible");
|
|
restore.setAttribute("name", "");
|
|
restore.id = "upload";
|
|
document.body.appendChild(restore);
|
|
restore.click();
|
|
restore.onchange = function () {
|
|
var filename = restore.files[0].name;
|
|
var check = confirm("File: " + filename + "\n{{.confirm.restore}}");
|
|
if (check == true) {
|
|
var reader = new FileReader();
|
|
var file = document.querySelector('input[type=file]').files[0];
|
|
if (file) {
|
|
reader.readAsDataURL(file);
|
|
reader.onload = function () {
|
|
console.log(reader.result);
|
|
var data = new Object();
|
|
var cmd = "xteveRestore";
|
|
data["base64"] = reader.result;
|
|
var server = new Server(cmd);
|
|
server.request(data);
|
|
};
|
|
}
|
|
else {
|
|
alert("File could not be loaded");
|
|
}
|
|
restore.remove();
|
|
return;
|
|
}
|
|
};
|
|
return;
|
|
}
|
|
function uploadLogo() {
|
|
if (document.getElementById('upload')) {
|
|
document.getElementById('upload').remove();
|
|
}
|
|
var upload = document.createElement("INPUT");
|
|
upload.setAttribute("type", "file");
|
|
upload.setAttribute("class", "notVisible");
|
|
upload.setAttribute("name", "");
|
|
upload.id = "upload";
|
|
document.body.appendChild(upload);
|
|
upload.click();
|
|
upload.onblur = function () {
|
|
alert();
|
|
};
|
|
upload.onchange = function () {
|
|
var filename = upload.files[0].name;
|
|
var reader = new FileReader();
|
|
var file = document.querySelector('input[type=file]').files[0];
|
|
if (file) {
|
|
reader.readAsDataURL(file);
|
|
reader.onload = function () {
|
|
console.log(reader.result);
|
|
var data = new Object();
|
|
var cmd = "uploadLogo";
|
|
data["base64"] = reader.result;
|
|
data["filename"] = file.name;
|
|
var server = new Server(cmd);
|
|
server.request(data);
|
|
var updateLogo = document.getElementById('update-icon');
|
|
updateLogo.checked = false;
|
|
updateLogo.className = "changed";
|
|
};
|
|
}
|
|
else {
|
|
alert("File could not be loaded");
|
|
}
|
|
upload.remove();
|
|
return;
|
|
};
|
|
}
|
|
function checkUndo(key) {
|
|
switch (key) {
|
|
case "epgMapping":
|
|
if (UNDO.hasOwnProperty(key)) {
|
|
SERVER["xepg"][key] = JSON.parse(JSON.stringify(UNDO[key]));
|
|
}
|
|
else {
|
|
UNDO[key] = JSON.parse(JSON.stringify(SERVER["xepg"][key]));
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
function sortSelect(elem) {
|
|
var tmpAry = [];
|
|
var selectedValue = elem[elem.selectedIndex].value;
|
|
for (var i = 0; i < elem.options.length; i++)
|
|
tmpAry.push(elem.options[i]);
|
|
tmpAry.sort(function (a, b) { return (a.text < b.text) ? -1 : 1; });
|
|
while (elem.options.length > 0)
|
|
elem.options[0] = null;
|
|
var newSelectedIndex = 0;
|
|
for (var i = 0; i < tmpAry.length; i++) {
|
|
elem.options[i] = tmpAry[i];
|
|
if (elem.options[i].value == selectedValue)
|
|
newSelectedIndex = i;
|
|
}
|
|
elem.selectedIndex = newSelectedIndex; // Set new selected index after sorting
|
|
return;
|
|
}
|
|
function updateLog() {
|
|
console.log("TOKEN");
|
|
var server = new Server("updateLog");
|
|
server.request(new Object());
|
|
}
|