define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listViewStyle', 'paper-icon-button-light'], function ($, loading, globalize) { 'use strict'; return function (page, providerId, options) { function getListingProvider(config, id) { if (config && id) { var result = config.ListingProviders.filter(function (provider) { return provider.Id === id; })[0]; if (result) { return Promise.resolve(result); } return getListingProvider(); } return ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/Default')); } function reload() { loading.show(); ApiClient.getNamedConfiguration('livetv').then(function (config) { getListingProvider(config, providerId).then(function (info) { page.querySelector('.txtPath').value = info.Path || ''; page.querySelector('.txtKids').value = (info.KidsCategories || []).join('|'); page.querySelector('.txtNews').value = (info.NewsCategories || []).join('|'); page.querySelector('.txtSports').value = (info.SportsCategories || []).join('|'); page.querySelector('.txtMovies').value = (info.MovieCategories || []).join('|'); page.querySelector('.txtMoviePrefix').value = info.MoviePrefix || ''; page.querySelector('.txtUserAgent').value = info.UserAgent || ''; page.querySelector('.chkAllTuners').checked = info.EnableAllTuners; if (page.querySelector('.chkAllTuners').checked) { page.querySelector('.selectTunersSection').classList.add('hide'); } else { page.querySelector('.selectTunersSection').classList.remove('hide'); } refreshTunerDevices(page, info, config.TunerHosts); loading.hide(); }); }); } function getCategories(txtInput) { var value = txtInput.value; if (value) { return value.split('|'); } return []; } function submitListingsForm() { loading.show(); var id = providerId; ApiClient.getNamedConfiguration('livetv').then(function (config) { var info = config.ListingProviders.filter(function (provider) { return provider.Id === id; })[0] || {}; info.Type = 'xmltv'; info.Path = page.querySelector('.txtPath').value; info.MoviePrefix = page.querySelector('.txtMoviePrefix').value || null; info.UserAgent = page.querySelector('.txtUserAgent').value || null; info.MovieCategories = getCategories(page.querySelector('.txtMovies')); info.KidsCategories = getCategories(page.querySelector('.txtKids')); info.NewsCategories = getCategories(page.querySelector('.txtNews')); info.SportsCategories = getCategories(page.querySelector('.txtSports')); info.EnableAllTuners = page.querySelector('.chkAllTuners').checked; info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (tuner) { return tuner.checked; }).map(function (tuner) { return tuner.getAttribute('data-id'); }); ApiClient.ajax({ type: 'POST', url: ApiClient.getUrl('LiveTv/ListingProviders', { ValidateListings: true }), data: JSON.stringify(info), contentType: 'application/json' }).then(function (result) { loading.hide(); if (false !== options.showConfirmation) { Dashboard.processServerConfigurationUpdateResult(); } Events.trigger(self, 'submitted'); }, function () { loading.hide(); Dashboard.alert({ message: globalize.translate('ErrorAddingXmlTvFile') }); }); }); } function getTunerName(providerId) { switch (providerId = providerId.toLowerCase()) { case 'm3u': return 'M3U Playlist'; case 'hdhomerun': return 'HDHomerun'; case 'satip': return 'DVB'; default: return 'Unknown'; } } function refreshTunerDevices(page, providerInfo, devices) { var html = ''; for (var i = 0, length = devices.length; i < length; i++) { var device = devices[i]; html += '
'; var enabledTuners = providerInfo.EnabledTuners || []; var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id); var checkedAttribute = isChecked ? ' checked' : ''; html += ''; html += '
'; html += '
'; html += device.FriendlyName || getTunerName(device.Type); html += '
'; html += '
'; html += device.Url; html += '
'; html += '
'; html += '
'; } page.querySelector('.tunerList').innerHTML = html; } function onSelectPathClick(e) { var page = $(e.target).parents('.xmltvForm')[0]; require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser.default(); picker.show({ includeFiles: true, callback: function (path) { if (path) { var txtPath = page.querySelector('.txtPath'); txtPath.value = path; txtPath.focus(); } picker.close(); } }); }); } var self = this; self.submit = function () { page.querySelector('.btnSubmitListings').click(); }; self.init = function () { options = options || {}; // Only hide the buttons if explicitly set to false; default to showing if undefined or null // FIXME: rename this option to clarify logic var hideCancelButton = options.showCancelButton === false; page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton); var hideSubmitButton = options.showSubmitButton === false; page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton); $('form', page).on('submit', function () { submitListingsForm(); return false; }); page.querySelector('#btnSelectPath').addEventListener('click', onSelectPathClick); page.querySelector('.chkAllTuners').addEventListener('change', function (evt) { if (evt.target.checked) { page.querySelector('.selectTunersSection').classList.add('hide'); } else { page.querySelector('.selectTunersSection').classList.remove('hide'); } }); reload(); }; }; });