Enhances advertisement management at bd742.com
// ==UserScript== // @name BDManagementEnhancer // @version 1.60 // @license none // @run-at document-end // @match https://bd742.com/user.php* // @require https://cdn.jsdelivr.net/jquery/latest/jquery.min.js // @require https://cdn.jsdelivr.net/momentjs/latest/moment.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/daterangepicker.js // @require https://cdn.jsdelivr.net/npm/[email protected]/jquery.hotkeys.js // @namespace https://greasyfork.org/users/290665 // @description Enhances advertisement management at bd742.com // @grant GM_addStyle // @grant GM_download // @grant unsafeWindow // ==/UserScript== const xrps = 25; // XHR requests per second const maxXHR = 6; // maximum concurrent XHR requests const ladMinNo = 150; // minimum banner number for "ladisha" domain const urlParm = "?mtm_campaign=lhannounce"; const special_banners = [14]; const regular_banners = [12, 14, 16]; const $ = window.jQuery; const chmap = { 'a': ['a', '𝐚', '𝖆', '𝒂', '𝓪', '𝕒', '𝚊', '𝖺', '𝗮', '𝙖', '𝘢'], 'b': ['b', '𝐛', '𝖇', '𝒃', '𝓫', '𝕓', '𝚋', '𝖻', '𝗯', '𝙗', '𝘣'], 'c': ['c', '𝐜', '𝖈', '𝒄', '𝓬', '𝕔', '𝚌', '𝖼', '𝗰', '𝙘', '𝘤'], 'd': ['d', '𝐝', '𝖉', '𝒅', '𝓭', '𝕕', '𝚍', '𝖽', '𝗱', '𝙙', '𝘥'], 'e': ['e', '𝐞', '𝖊', '𝒆', '𝓮', '𝕖', '𝚎', '𝖾', '𝗲', '𝙚', '𝘦'], 'f': ['f', '𝐟', '𝖋', '𝒇', '𝓯', '𝕗', '𝚏', '𝖿', '𝗳', '𝙛', '𝘧'], 'g': ['g', '𝐠', '𝖌', '𝒈', '𝓰', '𝕘', '𝚐', '𝗀', '𝗴', '𝙜', '𝘨'], 'h': ['h', '𝐡', '𝖍', '𝒉', '𝓱', '𝕙', '𝚑', '𝗁', '𝗵', '𝙝', '𝘩'], 'i': ['i', '𝐢', '𝖎', '𝒊', '𝓲', '𝕚', '𝚒', '𝗂', '𝗶', '𝙞', '𝘪'], 'j': ['j', '𝐣', '𝖏', '𝒋', '𝓳', '𝕛', '𝚓', '𝗃', '𝗷', '𝙟', '𝘫'], 'k': ['k', '𝐤', '𝖐', '𝒌', '𝓴', '𝕜', '𝚔', '𝗄', '𝗸', '𝙠', '𝘬'], 'l': ['l', '𝐥', '𝖑', '𝒍', '𝓵', '𝕝', '𝚕', '𝗅', '𝗹', '𝙡', '𝘭'], 'm': ['m', '𝐦', '𝖒', '𝒎', '𝓶', '𝕞', '𝚖', '𝗆', '𝗺', '𝙢', '𝘮'], 'n': ['n', '𝐧', '𝖓', '𝒏', '𝓷', '𝕟', '𝚗', '𝗇', '𝗻', '𝙣', '𝘯'], 'o': ['o', '𝐨', '𝖔', '𝒐', '𝓸', '𝕠', '𝚘', '𝗈', '𝗼', '𝙤', '𝘰'], 'p': ['p', '𝐩', '𝖕', '𝒑', '𝓹', '𝕡', '𝚙', '𝗉', '𝗽', '𝙥', '𝘱'], 'q': ['q', '𝐪', '𝖖', '𝒒', '𝓺', '𝕢', '𝚚', '𝗊', '𝗾', '𝙦', '𝘲'], 'r': ['r', '𝐫', '𝖗', '𝒓', '𝓻', '𝕣', '𝚛', '𝗋', '𝗿', '𝙧', '𝘳'], 's': ['s', '𝐬', '𝖘', '𝒔', '𝓼', '𝕤', '𝚜', '𝗌', '𝘀', '𝙨', '𝘴'], 't': ['t', '𝐭', '𝖙', '𝒕', '𝓽', '𝕥', '𝚝', '𝗍', '𝘁', '𝙩', '𝘵'], 'u': ['u', '𝐮', '𝖚', '𝒖', '𝓾', '𝕦', '𝚞', '𝗎', '𝘂', '𝙪', '𝘶'], 'v': ['v', '𝐯', '𝖛', '𝒗', '𝓿', '𝕧', '𝚟', '𝗏', '𝘃', '𝙫', '𝘷'], 'w': ['w', '𝐰', '𝖜', '𝒘', '𝔀', '𝕨', '𝚠', '𝗐', '𝘄', '𝙬', '𝘸'], 'x': ['x', '𝐱', '𝖝', '𝒙', '𝔁', '𝕩', '𝚡', '𝗑', '𝘅', '𝙭', '𝘹'], 'y': ['y', '𝐲', '𝖞', '𝒚', '𝔂', '𝕪', '𝚢', '𝗒', '𝘆', '𝙮', '𝘺'], 'z': ['z', '𝐳', '𝖟', '𝒛', '𝔃', '𝕫', '𝚣', '𝗓', '𝘇', '𝙯', '𝘻'], 'A': ['A', '𝐀', '𝕬', '𝑨', '𝓐', '𝔸', '𝙰', '𝖠', '𝗔', '𝘼', '𝘈'], 'B': ['B', '𝐁', '𝕭', '𝑩', '𝓑', '𝔹', '𝙱', '𝖡', '𝗕', '𝘽', '𝘉'], 'C': ['C', '𝐂', '𝕮', '𝑪', '𝓒', 'ℂ', '𝙲', '𝖢', '𝗖', '𝘾', '𝘊'], 'D': ['D', '𝐃', '𝕯', '𝑫', '𝓓', '𝔻', '𝙳', '𝖣', '𝗗', '𝘿', '𝘋'], 'E': ['E', '𝐄', '𝕰', '𝑬', '𝓔', '𝔼', '𝙴', '𝖤', '𝗘', '𝙀', '𝘌'], 'F': ['F', '𝐅', '𝕱', '𝑭', '𝓕', '𝔽', '𝙵', '𝖥', '𝗙', '𝙁', '𝘍'], 'G': ['G', '𝐆', '𝕲', '𝑮', '𝓖', '𝔾', '𝙶', '𝖦', '𝗚', '𝙂', '𝘎'], 'H': ['H', '𝐇', '𝕳', '𝑯', '𝓗', 'ℍ', '𝙷', '𝖧', '𝗛', '𝙃', '𝘏'], 'I': ['I', '𝐈', '𝕴', '𝑰', '𝓘', '𝕀', '𝙸', '𝖨', '𝗜', '𝙄', '𝘐'], 'J': ['J', '𝐉', '𝕵', '𝑱', '𝓙', '𝕁', '𝙹', '𝖩', '𝗝', '𝙅', '𝘑'], 'K': ['K', '𝐊', '𝕶', '𝑲', '𝓚', '𝕂', '𝙺', '𝖪', '𝗞', '𝙆', '𝘒'], 'L': ['L', '𝐋', '𝕷', '𝑳', '𝓛', '𝕃', '𝙻', '𝖫', '𝗟', '𝙇', '𝘓'], 'M': ['M', '𝐌', '𝕸', '𝑴', '𝓜', '𝕄', '𝙼', '𝖬', '𝗠', '𝙈', '𝘔'], 'N': ['N', '𝐍', '𝕹', '𝑵', '𝓝', 'ℕ', '𝙽', '𝖭', '𝗡', '𝙉', '𝘕'], 'O': ['O', '𝐎', '𝕺', '𝑶', '𝓞', '𝕆', '𝙾', '𝖮', '𝗢', '𝙊', '𝘖'], 'P': ['P', '𝐏', '𝕻', '𝑷', '𝓟', 'ℙ', '𝙿', '𝖯', '𝗣', '𝙋', '𝘗'], 'Q': ['Q', '𝐐', '𝕼', '𝑸', '𝓠', 'ℚ', '𝚀', '𝖰', '𝗤', '𝙌', '𝘘'], 'R': ['R', '𝐑', '𝕽', '𝑹', '𝓡', 'ℝ', '𝚁', '𝖱', '𝗥', '𝙍', '𝘙'], 'S': ['S', '𝐒', '𝕾', '𝑺', '𝓢', '𝕊', '𝚂', '𝖲', '𝗦', '𝙎', '𝘚'], 'T': ['T', '𝐓', '𝕿', '𝑻', '𝓣', '𝕋', '𝚃', '𝖳', '𝗧', '𝙏', '𝘛'], 'U': ['U', '𝐔', '𝖀', '𝑼', '𝓤', '𝕌', '𝚄', '𝖴', '𝗨', '𝙐', '𝘜'], 'V': ['V', '𝐕', '𝖁', '𝑽', '𝓥', '𝕍', '𝚅', '𝖵', '𝗩', '𝙑', '𝘝'], 'W': ['W', '𝐖', '𝖂', '𝑾', '𝓦', '𝕎', '𝚆', '𝖶', '𝗪', '𝙒', '𝘞'], 'X': ['X', '𝐗', '𝖃', '𝑿', '𝓧', '𝕏', '𝚇', '𝖷', '𝗫', '𝙓', '𝘟'], 'Y': ['Y', '𝐘', '𝖄', '𝒀', '𝓨', '𝕐', '𝚈', '𝖸', '𝗬', '𝙔', '𝘠'], 'Z': ['Z', '𝐙', '𝖅', '𝒁', '𝓩', 'ℤ', '𝚉', '𝖹', '𝗭', '𝙕', '𝘡'] }; const defaultfont = 1; addStyle(); unsafeWindow.updateAdNames = function () { $('ul.dropdown-menu[role="menu"] li a').each(function () { const txt = $(this).text(); const link = $(this).attr('href'); let size; size = link.match(/size=(\d+)/); const number = $(this).data('adnumber') if (number) { if (Store.getItem('name-' + size[1] + "-" + number)) { $(this).html(number + ' <span class="adnamemenu">' + Store.getItem('name-' + size[1] + "-" + number) + "</span>") .parent().removeClass("empty-banner") } else { $(this).html(number + " (empty)").parent().addClass("empty-banner"); } } }); }; unsafeWindow.overview = function () { if ($('#overview').length) { $('#overview').remove(); return; } const overview = $(` <div id="overview"> <div id="overview-prog-container"> <div id="overview-prog-fill"></div> </div> <div id="overview-tools" class="btn-group" style="display:block;"> <a class="btn btn-warning disabled" id="cleanbutton" href="#"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> Clean</a> <a class="btn btn-primary disabled" id="announcebutton" href="#"><span class="glyphicon glyphicon-volume-up" aria-hidden="true"></span> Announce</a> <label> <select name="overviewstyle" onchange="changeoverviewstyle();"> <option value="compact">Compact View</option> <option value="details">Details view</option> <option value="gallery" selected="selected">Gallery view</option> <option value="table">Table view</option> <option value="names">Names only</option> </select> </label> <label> sort by <select name="overviewsort" onchange="sortOverview();"> <option value="adno">Ad number</option> <option value="name">Name</option> <option value="targeturl">Target URL</option> <option value="text">Ad text</option> <option value="startdate">Start date</option> </select> </label> <label><input type="checkbox" name="showActive" checked="checked"> active (<span id="noActive"></span>)</label> <label><input type="checkbox" name="showPlanned" checked="checked"> planned (<span id="noPlanned"></span>)</label> <label><input type="checkbox" name="showInactive" checked="checked"> inactive/disabled (<span id="noInactive"></span>)</label> <label><input type="checkbox" name="showEmpty"> empty (<span id="noEmpty"></span>)</label> </div> </div> `).insertBefore('div.well:first'); $('#announcebutton').on('click', function (event) { event.preventDefault(); event.stopPropagation(); announce(overview); }); $('#cleanbutton').on('click', function (event) { event.preventDefault(); event.stopPropagation(); cleanNames(overview); }); $('#overview-tools input').on('change', function () { filterOverview() }); changeoverviewstyle(); $('ul.dropdown-menu[role="menu"]').last().find('li a').each(function () { const txt = $(this).text(); const link = $(this).attr('href'); let size; size = link.match(/size=(\d+)/); let number; let name; if (number = link.match(/ad_n=(\d+)/)) { name = Store.getItem('name-' + size[1] + "-" + number[1]); } else { number = ['', '']; return; } $(` <div> <a href="${link}"> <span class="adno">${number ? number[1] : ''}</span> ${name ? ' ' + name : ' '} <div class="detail"></div> </a> </div> `) .data("link", link) .data("targeturl", "") .data("name", name) .data("adno", number[1]) .addClass("overviewentry loadme") .appendTo(overview); }); checkStatus(overview); // starts fetching of ads overviewProgress(); } unsafeWindow.overviewProgress = function () { const total = $('#overview .overviewentry').length; if (total === 0) return; const finished = $('#overview .overviewentry:not(.loadme):not(.loading)').length; const percent = (finished / total) * 100; $('#overview-prog-fill').css('width', percent + '%'); if (finished === total) { setTimeout(() => $('#overview-prog-container').css({ 'opacity': 0, 'visibility': 'hidden' }), 1000); } else { $('#overview-prog-container').css({ 'opacity': 1, 'visibility': 'visible' }); } }; unsafeWindow.filterOverview = function (entry) { let showActive = $('[name=showActive]').is(':checked'); let showInactive = $('[name=showInactive]').is(':checked'); let showPlanned = $('[name=showPlanned]').is(':checked'); let showEmpty = $('[name=showEmpty]').is(':checked'); $(entry ? $(entry) : $('#overview .overviewentry')).each(function (undefined, element) { if ((!showActive && $(element).hasClass('active')) || (!showInactive && ($(element).hasClass('inactive') || $(element).hasClass('disabled'))) || (!showPlanned && $(element).hasClass('planned')) || (!showEmpty && $(element).hasClass('empty')) ) { $(element).addClass('hidden'); } else { $(element).removeClass('hidden'); } }); }; unsafeWindow.sortOverview = function () { let sortkey = $('[name=overviewsort').val(); $('#overview .overviewentry').sort( sortkey == "adno" ? function (a, b) { return (parseInt($(b).data('adno'))) < parseInt($(a).data('adno')) ? 1 : -1; } : function (a, b) { return ($(b).data(sortkey)) < ($(a).data(sortkey)) ? 1 : -1; } ).appendTo($('#overview')); }; unsafeWindow.changeoverviewstyle = function () { let style = $('[name=overviewstyle]').val(); switch (style) { case "compact": $('#overview').removeClass('showdetails gallery table namesonly'); break; case "details": $('#overview').removeClass('gallery table namesonly').addClass('showdetails'); break; case "gallery": $('#overview').removeClass('table namesonly').addClass('showdetails gallery'); break; case "table": $('#overview').removeClass('gallery namesonly').addClass('showdetails table'); break; case "names": $('#overview').removeClass('showdetails gallery table').addClass('namesonly'); break; } }; unsafeWindow.countOverview = function () { $('#overview #noActive').html($('#overview .active').length); $('#overview #noInactive').html($('#overview .inactive, #overview .disabled').length); $('#overview #noPlanned').html($('#overview .planned').length); $('#overview #noEmpty').html($('#overview .empty').length); }; (function ($) { $.fn.tzCheckbox = function (options) { // Default On / Off labels: options = $.extend({ labels: ['ON', 'OFF'] }, options); return this.each(function () { const originalCheckBox = $(this); let labels = []; // Checking for the data-on / data-off HTML5 data attributes: if (originalCheckBox.data('on')) { labels[0] = originalCheckBox.data('on'); labels[1] = originalCheckBox.data('off'); } else labels = options.labels; // Creating the new checkbox markup: const checkBox = $('<span>', { className: 'tzCheckBox ' + (this.checked ? 'checked' : ''), html: '<span class="tzCBContent">' + labels[this.checked ? 0 : 1] + '</span><span class="tzCBPart"></span>' }); // Inserting the new checkbox, and hiding the original: checkBox.insertAfter(originalCheckBox.hide()); checkBox.click(function () { checkBox.toggleClass('checked'); const isChecked = checkBox.hasClass('checked'); // Synchronizing the original checkbox: originalCheckBox.attr('checked', isChecked); checkBox.find('.tzCBContent').html(labels[isChecked ? 0 : 1]); }); // Listening for changes on the original and affecting the new one: originalCheckBox.bind('change', function () { checkBox.click(); }); }); }; })(jQuery); const myVersion = GM_info.script.version; const Store = localStorage; $('header .navbar-brand').after('<div style="position: absolute;top: 76px;left: 18px;color: #ee6000;font-size: 13px;">Enhanced by BDManagementEnhancer V' + myVersion + '</div>'); $("head").append('<link href="//cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" rel="stylesheet" type="text/css">'); const matchesElement = $('#wrap > div.container > div > div div.btn-group:nth-child(3) > ul li:nth-last-child(2) a'); const matchesHref = (matchesElement.length ? matchesElement.attr('href') : "") || ""; const matches = matchesHref.match(/(.*=)(\d+)$/) || ["", "", ""]; const myurl = matches[1]; const lastad = parseInt(matches[2]) || 0; const currentad = parseInt($('input[name=ad_n]').val()) || 0; const nextad = currentad + 1; let prevad = currentad - 1; if (prevad < 1) prevad = 1; const sizepar = $('input[name=size]').val(); const namevar = 'name-' + sizepar + '-' + currentad; $('h1').append(' <span id="name_title"></span>'); $('#myform>table tr:nth-child(4) td:nth-child(2)').wrapInner('<div class="spacelist"></div>'); $('#myform>table tr:nth-child(8) a') .addClass('btn btn-danger') .html('<span class="glyphicon glyphicon-trash"></span>') .attr('style', ''); $('#myform > table tr:nth-child(8) td:first-child').remove(); let spacelist = $('.spacelist').html(); if (spacelist) { spacelist = '<label>' + spacelist.replace(/<br>/gi, '</label><br><label>') + '</label>'; $('.spacelist').html(spacelist); } $('#myform>table tr:nth-child(9) td:nth-child(2)').css('position', 'relative').append('<div id="textpreviewcontainer">Preview: <div id="textpreview"></div></div>'); $('#myform>table tr:nth-child(11) td:nth-child(2) br').remove(); $('#myform>table tr:nth-child(12) td:nth-child(2) br').remove(); // "pause this banner" button $('#myform > table tr:nth-child(14) a').prepend('<span class="glyphicon glyphicon-pause"></span> '); // "delete this banner" button $('#myform > table tr:nth-child(15) a').prepend('<span class="glyphicon glyphicon-trash"></span> '); // ENABLED switch $('input[name=enabled]').after(` <span style="position:relative;left:50px;"> Name <input class="form-control" id="adname" style="width:200px;display:inline;"> <input type="text" id="unicodefont" value="" readonly> <span><a href="#" onclick="openqaz()">Unicode Text</a></span> </span> `); $('input[name=enabled]').wrap('<label for="enabled"></label>'); $('#adname').on('change keyup', function () { $('#name_title').html($('#adname').val()); Store.setItem(namevar, $('#adname').val()); updateAdNames(); document.title = $('#adname').val() + ' | Banner Management'; let name = $('#adname').val(); let namef = fancy(name.toUpperCase()); $('#unicodefont').val(namef); }); $('#wrap > div.container > div:first-child > div > div.btn-group').eq(1).attr('id', "ads-button"); // OVERVIEW button $('<a id="overviewbutton" title="Overview" href="#" class="btn btn-primary"><span class="glyphicon glyphicon-th-list"></span> Overview</a>') .on('click', overview) .wrap('<div class="btn-group"></div>') .appendTo('#wrap > div.container > div:first-child > div') .after(' '); $('#ads-button').on('click', function (ev) { $('input[name=adfilter]').focus().select(); }) // PREVIOUS AD button $('#wrap > div.container > div:first-child > div').append('<div class="btn-group"><a id="prevad" title="Previous banner" href="' + myurl + (prevad) + '" class="btn btn-info"><span class="glyphicon glyphicon glyphicon-step-backward"></span></a></div> '); if (isNaN(currentad) || prevad == currentad) $('#prevad').attr("disabled", "disabled"); // CURRENT AD input box $('#wrap > div.container > div:first-child > div').append('<div class="btn-group"><input id="currentad" title="Current banner. Enter number and press return to jump to another banner!" value="' + (isNaN(currentad) ? '' : currentad) + '"></div> '); $('#currentad').bind('keypress', function (event) { if ((event.keyCode || event.which) == 13) { window.location.href = myurl + $(this).val(); } }); // NEXT AD button $('#wrap > div.container > div:first-child > div').append('<div class="btn-group"><a id="nextad" title="Next banner" href="' + myurl + (nextad) + '" class="btn btn-info"><span class="glyphicon glyphicon glyphicon-step-forward"></span></a></div> '); if (isNaN(currentad) || currentad == lastad) $('#nextad').attr("disabled", "disabled"); // NEW AD button $('#wrap > div.container > div:first-child > div').append('<div class="btn-group"><a id="newad" title="Add new banner" href="' + myurl + (lastad + 1) + '" class="btn btn-warning"><span class="glyphicon glyphicon glyphicon-plus"></span> new</a></div> '); // Import/Export buttons $('#wrap > div.container > div:first-child > div') .append('<div class="btn-group"><a id="importNames" title="Import Names" data-toggle="modal" data-target="#myModal" href="#" class="btn btn-primary"><span class="glyphicon glyphicon-import"></span> Imp</a></div> '); $(` <div class="modal" tabindex="-1" role="dialog" id="myModal"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Import names from JSON</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <textarea style="width:100%;height:300px;" id="jsonPaste" placeholder="Paste JSON data here!"></textarea> </div> <div class="modal-footer"> <button type="button" class="btn btn-primary" onclick="return importJSON($('#jsonPaste').val());"> <span class="glyphicon glyphicon-import"></span> Import names </button> <button type="button" class="btn btn-secondary" data-dismiss="modal"> <span class="glyphicon glyphicon-remove"></span> Cancel </button> </div> </div> </div> </div> `).appendTo('#wrap'); const datum = new Date(); $('#wrap > div.container > div:first-child > div') .append('<div class="btn-group"><a id="exportNames" title="Export Names" class="btn btn-primary"><span class="glyphicon glyphicon-export"></span> Exp</a></div> ') .find('a#exportNames') .attr('href', 'data:application/json;charset=utf-8,' + (JSON.stringify(Store)).replace(/ /g, '%20')) .attr('download', 'bd-' + datum.toISOString().substring(0, 10) + '.json'); // CLEAR button $(' <button style="margin-left:8px;" type="reset" name="clearButton" class="btn btn-warning"><span class="glyphicon glyphicon-trash"></span> Clear</button>').on('click', function (event) { $('form :text, form select').val(''); $('#adname').keyup(); event.preventDefault(); }).insertAfter('input[type=submit]'); // Save as ... button $(' <input style="margin-left:8px;" type="button" name="saveAsButton" value="Save as..." class="btn btn-secondary">').on('click', function (event) { event.preventDefault(); const saveas = prompt("Save as ... (ad number)"); if (saveas === null) return; if (confirm("Are you sure to overwrite ad number " + saveas + " (" + Store.getItem('name-' + sizepar + '-' + saveas) + ")?")) { $('input[name=ad_n]').val(saveas); Store.setItem('name-' + sizepar + '-' + saveas, $('#adname').val()); $('form').submit(); } }).insertAfter('input[type=submit]'); // SUBTEXT preview $('[name=text1]').on('change keyup', function () { $('#textpreview').html($('[name=text1]').val()); }); $('#textpreview').html($('[name=text1]').val()); function updateDateRange(start, end, label) { $('[name=date_d1]').val(start.format('D')); $('[name=date_m1]').val(start.format('M')); $('[name=date_y1]').val(start.format('YYYY')); $('[name=date_d2]').val(end.format('D')); $('[name=date_m2]').val(end.format('M')); $('[name=date_y2]').val(end.format('YYYY')); } // DATE PICKER $('#myform>table tr:nth-child(10) td:nth-child(2)') .wrapInner('<div class="old-datepicker"></div>') .prepend('<div class="new-datepicker"><input style="display:inline;" class="form-control" id="daterange">' + '<div id="weekpicker">' + '</div><br></div>' ); for (let week = 0; week < 8; week++) { $('#weekpicker').append($('<button/>', { "data": { "weeks": "1", "offset": week }, "html": "w" + (week + 1) })); } let nextweek_start = new Date(); nextweek_start.setDate(nextweek_start.getDate() + (8 - nextweek_start.getDay()) % 7); let nextweek_end = new Date(nextweek_start); nextweek_end.setDate(nextweek_end.getDate() + 6); $('#weekpicker button').each(function () { let week = $(this).data('offset'); let week_start = new Date(nextweek_start); week_start.setDate(week_start.getDate() + (week * 7)); $(this).prepend($('<span>', { class: "buttondate" }).html(week_start.getDate() + '.' + (week_start.getMonth() + 1) + ".")); if ($(this).is('last')) { week_start.setDate(week_start.getDate() + 7); $(this).append($('<span>', { class: "buttondate" }).html(week_start.getDate() + '.' + (week_start.getMonth() + 1) + ".")); } }) let mousebutton_pressed = false; let drag_start_offset = -1; $('#weekpicker button') .on('click', adtime) .on('mousedown', week_drag_start) .on('mouseup', week_drag_stop) .on('mouseenter', function () { if (mousebutton_pressed) { let current_offset = $(this).data('offset'); let start = Math.min(drag_start_offset, current_offset); let end = Math.max(drag_start_offset, current_offset); $('#weekpicker button').each(function () { let off = $(this).data('offset'); if (off >= start && off <= end) { $(this).addClass('dragged'); } else { $(this).removeClass('dragged'); } }); } }); $('<div id="weekpicker-old"></div>').appendTo('.new-datepicker'); $('<button> ↞ </button>').data({ "movedays": -7 }).on('click', moveadtime).appendTo('#weekpicker-old'); $('<button>1w</button>').data({ "weeks": 1, "offset": 0 }).on('click', adtime).appendTo('#weekpicker-old'); $('<button>2w</button>').data({ "weeks": 2, "offset": 0 }).on('click', adtime).appendTo('#weekpicker-old'); $('<button>3w</button>').data({ "weeks": 3, "offset": 0 }).on('click', adtime).appendTo('#weekpicker-old'); $('<button>4w</button>').data({ "weeks": 4, "offset": 0 }).on('click', adtime).appendTo('#weekpicker-old'); $('<button>1+1w</button>').data({ "weeks": 1, "offset": 1 }).on('click', adtime).appendTo('#weekpicker-old'); $('<button>1+2w</button>').data({ "weeks": 2, "offset": 1 }).on('click', adtime).appendTo('#weekpicker-old'); $('<button>1+3w</button>').data({ "weeks": 3, "offset": 1 }).on('click', adtime).appendTo('#weekpicker-old'); $('<button>1+4w</button>').data({ "weeks": 4, "offset": 1 }).on('click', adtime).appendTo('#weekpicker-old'); $('<button> ↠ </button>').data({ "movedays": 7 }).on('click', moveadtime).appendTo('#weekpicker-old'); selectorsToString(); const thisYear = new Date().getFullYear(); $('#daterange').daterangepicker({ autoApply: true, autoUpdateInput: true, showDropdowns: true, drops: "up", minYear: thisYear - 1, maxYear: thisYear + 3, "locale": { "format": "D.M.YYYY", "separator": " - ", "applyLabel": "Apply", "cancelLabel": "Cancel", "fromLabel": "From", "toLabel": "To", "customRangeLabel": "Custom", "weekLabel": "W", "daysOfWeek": [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ], "monthNames": [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], "firstDay": 1 } }, updateDateRange ); $('[name^="date_"]').on('change', selectorsToString); function selectorsToString() { $('#daterange').val( $('[name=date_d1]').val() + "." + $('[name=date_m1]').val() + "." + $('[name=date_y1]').val() + " - " + $('[name=date_d2]').val() + "." + $('[name=date_m2]').val() + "." + $('[name=date_y2]').val() ); } // rename ads with proper names if (Store.getItem(namevar)) { $('#adname').val(Store.getItem(namevar)).change(); } $('input[name=url1]').on('change', function () { nameFromURL(); }); nameFromURL(); function nameFromURL() { let adurl = $('input[name=url1]').val(); let [name, area] = urltoname(adurl); if (name) { let namef = fancy(name.toUpperCase()); $('#unicodefont').val(namef); if (!$('#adname').val()) $('#adname').val(`${name} ${area}`).change(); if (!$('[name=text1]').val()) $('[name=text1]').val(namef); } } function urltoname(url) { let name; let area; let matches; if (url && url.length && (matches = url.match(/\/\/([a-z0-9]+)\.[a-z]+\/[a-z]{2,6}\/(.*)-/))) { name = matches[2]; area = matches[1].replace(/^(.).+(..)$/, "$1$2").toUpperCase(); } return [name, area]; } function fancy(string, font = defaultfont) { if (!string.length) return; let out = ""; for (const letter of string) { out += chmap?.[letter] ? chmap[letter][font] : letter; } return out; } const adFilter = $('<li id="adfilter"></li>').append($('<input name="adfilter" autocomplete="off" placeholder="Filter by name">')); $('ul.dropdown-menu[role="menu"]').last().prepend(adFilter); $(adFilter).on('click', function (ev) { ev.preventDefault(); ev.stopPropagation(); }); $(adFilter).find('input[name="adfilter"]').on('keyup change', function (ev) { const string = $(ev.target).val(); $('ul.dropdown-menu[role="menu"] li a').each(function () { if ($(this).find('span').text().match(new RegExp(string, 'i'))) { $(this).removeClass('disabled').show(); } else { $(this).addClass('disabled').hide(); } }); }); $(document).bind('keyup', 'a', function () { $('#wrap > div.container > div:nth-child(1) > div > div:nth-child(3) > button').trigger("click"); $('input[name="adfilter"]').val("").focus(); }); setInterval(function () { const $input = $('input[name="adfilter"]'); if ($input.length && $input.is(':visible') && document.activeElement !== $input[0]) { $input.focus(); } }, 500); $('ul.dropdown-menu[role="menu"] li a').each(function () { const txt = $(this).text(); const link = $(this).attr('href'); let size; size = link.match(/size=(\d+)/); let number; if (number = txt.match(/Banner number (\d+)/)) { $(this).data('adnumber', number[1]); if (Store.getItem('name-' + size[1] + "-" + number[1])) { $(this).html(number[1] + ' <span class="adnamemenu">' + Store.getItem('name-' + size[1] + "-" + number[1]) + "</span>"); } else { $(this).html(number[1] + ' (empty)').parent().addClass('empty-banner'); } } }); $('.spacelist input').on('change', function (ev) { hilite_spacelist($('.spacelist')); }); unsafeWindow.importJSON = function (text) { let obj; try { obj = JSON.parse(text); } catch (e) { $('#jsonPaste').val('').attr('placeholder', "Invalid JSON! Paste JSON data here!"); return false; } Object.keys(Store).forEach(key => { if (key.startsWith('name-')) Store.removeItem(key); }); $.each(obj, function (idx, val) { Store.setItem(idx, val); }); unsafeWindow.$('#myModal').modal('hide'); updateAdNames(); return true; } unsafeWindow.announce = function (overview) { let now = new Date(); if (now.getDay() >= 4) now.setDate(now.getDate() + 7); // from Thursday, go to next week let weekstart = new Date(now.setDate(now.getDate() + 1 - now.getDay())); // This Monday let weekend = new Date(now.setDate(now.getDate() + 6 - now.getDay())); // Next Saturday weekstart.setHours(0); weekstart.setMinutes(0); weekstart.setSeconds(0); weekend.setHours(23); weekend.setMinutes(59); weekend.setSeconds(59); let text = {}; let htmltext = {}; let firstdomain; let adcounter = []; $(overview) .find('.overviewentry') .not('.loadme') .not('.loading') .not('.inactive') .not('.disabled') .not('.empty') .not('.failed').each(function (id, el) { let adstart = new Date($(el).data('startdate')); let adend = new Date($(el).data('enddate')); if (adstart < weekend && adend > weekstart) { // let name = $(el).data('name'); let target = $(el).data('targeturl'); target = target.replace(/\?mtm_campaign=.*/, ''); target += urlParm; let img = $(el).find('img').attr('src'); let domain = target.match(/^https?:\/\/(.*?)\//)[1]; if (!firstdomain) firstdomain = domain; if (domain.match(/^h....-test-forum\./i)) domain = firstdomain; let adno = $(el).find('a').attr('href').match(/ad_n=(\d+)/)[1]; if (adno >= ladMinNo) domain = "ladisha.de"; if (!text[domain]) text[domain] = ""; if (!htmltext[domain]) htmltext[domain] = ""; if (!adcounter[domain]) adcounter[domain] = 0; // if (adcounter[domain] >= 5) { // adcounter[domain] = 0; // text[domain] += "\n"; // htmltext[domain] += "<br>"; // } text[domain] += `[URL="${target}"][IMG]${img}[/IMG][/URL] `; let editLink = $(el).find('a').attr('href'); htmltext[domain] += `<div style="position:relative; display:inline-block; margin:2px;"> <a href="${target}"><img src="${img}"></a> <a href="${editLink}" class="edit-ad-icon" title="Edit ad"> <span class="glyphicon glyphicon-pencil"></span> </a> </div> `; adcounter[domain]++; } }); let start = weekstart.toLocaleDateString("de-de"); let end = new Date(weekend); end.setDate(weekend.getDate() + 1); end = end.toLocaleDateString("de-de"); $('#announcepreview').remove(); $('#overview-tools').after('<div id="announcepreview"></div>'); let announcement = `[SIZE="3"]Diese Woche anwesend (${start} – ${end}):[/SIZE]\n\n`; $('#announcepreview').append(`<div>Diese Woche anwesend (${start} – ${end}):</div>`); let domains = Object.keys(text).sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' })); for (let domain of domains) { let header = domain.charAt(0).toUpperCase() + domain.slice(1); announcement += `[SIZE="4"][B][URL="https://${domain}"][COLOR="#11aac1"]${header}[/COLOR][/URL][/B][/SIZE]\n\n`; announcement += text[domain]; announcement += "\n\n"; $('#announcepreview').append(`<h2><a href="https://${domain}">${header}</a> (${adcounter[domain]})</h2>`); $('#announcepreview').append(htmltext[domain]); } $(` <div class="announce-tools"> <a href="#" class="btn btn-info" id="copy-announce" title="Copy BBCode to clipboard">Copy</a> <a href="#" class="btn btn-danger" id="close-announce" title="Close"><span class="glyphicon glyphicon-remove"></span></a> </div> `).appendTo('#announcepreview'); $('#close-announce').on('click', function (ev) { ev.preventDefault(); $('#announcepreview').remove(); }); $('#copy-announce').on('click', function (ev) { ev.preventDefault(); navigator.clipboard.writeText(announcement); let $btn = $(this); $btn.addClass('btn-success').removeClass('btn-info'); setTimeout(() => $btn.removeClass('btn-success').addClass('btn-info'), 1000); }); navigator.clipboard.writeText(announcement); /* adno: "186" dateStart: "2010-11-30" enabled: "1" enddate: "2010-11-30" link: "https://bd742.com/user.php?action=ad_edit&size=13&ad_n=186" name: "" startdate: "2010-11-30" targeturl: "" text: "" */ } unsafeWindow.cleanNames = function (overview) { const sizeMatch = location.href.match(/size=(\d+)/); const sizepar = sizeMatch ? sizeMatch[1] : ""; const all = $(overview) .find('.overviewentry') .not('.loadme') .not('.loading') .not('.failed'); const total = all.length; $(all).each(function (id, el) { $(el).addClass('loading'); window.setTimeout(function () { let key = 'name-' + sizepar + '-' + $(el).data('adno'); if ($(el).data('adurl') || $(el).data('adtext')) { // get name from URL let url = $(el).data('adurl'); let [name, area] = urltoname(url); if (name) { name = `${name} ${area}`; } if (!name && $(el).data('adtext')) { name = ($(el).data('adtext').match(/^(\S+)/))[1]; } if (name) { Store.setItem(key, name); updateAdNames(); } } if ($(el).data('adtext') === undefined && $(el).data('adurl') === undefined) { if ($(el).data('name') !== undefined && $(el).data('name') != "") { // remove it Store.setItem(key, ""); updateAdNames(); } } $(el).removeClass('loading'); }, 0); }); } function hilite_spacelist(spacelist) { $(spacelist).children('label:has(input:checked)').addClass('selected'); $(spacelist).children('label:not(:has(input:checked))').removeClass('selected'); } function hilite_enabled() { const box = $('input[name=enabled]'); if ($(box).is(':checked')) { $(box).removeClass('disabled') } else { $(box).addClass('disabled') } } hilite_spacelist($('.spacelist')); const adList = []; let openXHR = 0; let fetchInterval; unsafeWindow.checkStatus = function (overview) { $(overview).find('a').each(function (idx, element) { const url = $(element).attr('href'); if (url && url.match(/action=ad_edit/)) adList.push([element, $(element).attr('href')]); }); const timeout = parseInt(1000 / xrps); fetchInterval = setInterval(getRemainingAdData, timeout); } unsafeWindow.loadImages = function (overview) { $(overview).find('div.overviewentry').each(function (idx, element) { const url = $(element).data('imagesrc'); if (url) { $(element).find('img').remove(); $('<img src="' + url + '">').appendTo(element); } }); } unsafeWindow.tableOverview = function (overview) { const $overview = $(overview); if (!$overview.length) return; const otable = $('<table id="overviewtable"></table>'); $overview.find('div.overviewentry').each(function (i, el) { $('<tr class="clickable">' + '<td>' + $(el).data('adno') + '</td>' + '<td>' + $(el).data('name') + '</td>' + '<td>' + $(el).data('adtext') + '</td>' + '<td>' + $(el).data('adurl') + '</td>' + '<tr>') .addClass($(el).attr('class')).on('click', function () { }).appendTo(otable); }); $overview.replaceWith(otable); } unsafeWindow.getRemainingAdData = function () { let me; if (openXHR >= maxXHR) return; if (me = adList.shift()) { getAdData(me); } else { clearInterval(fetchInterval); $('#overview-tools a.btn').removeClass("disabled"); } } unsafeWindow.getAdData = function (me) { const el = me[0]; const url = me[1]; $(el).parent().append(' <span class="date">loading</span>'); $(el).closest('div').removeClass('loadme').addClass('loading'); (function (element, URL) { openXHR++; $.get(URL, function (data) { const entry = $(element).closest('div'); $(entry).removeClass('loading'); const htmlDoc = new DOMParser().parseFromString(data, 'text/html'); const enabled = $(htmlDoc).find('[name=enabled]').prop('checked') $(entry).data('enabled', enabled ? '1' : ''); const imagesrc = $(htmlDoc).find('#myform table img:last').attr('src'); if (imagesrc && imagesrc.length && imagesrc.length > 2) { $(entry).data('imagesrc', imagesrc); } else { $(entry).addClass('empty'); } const adURL = $(htmlDoc).find('[name=url1]').val(); if (adURL) $(entry).data('adurl', adURL); const adText = $(htmlDoc).find('[name=text1]').val(); if (adText) $(entry).data('adtext', adText); const dateStartStr = $(htmlDoc).find('[name=date_y1]').val() + '-' + ("00" + $(htmlDoc).find('[name=date_m1]').val()).slice(-2) + '-' + ("00" + $(htmlDoc).find('[name=date_d1]').val()).slice(-2); const dateEndStr = $(htmlDoc).find('[name=date_y2]').val() + '-' + ("00" + $(htmlDoc).find('[name=date_m2]').val()).slice(-2) + '-' + ("00" + $(htmlDoc).find('[name=date_d2]').val()).slice(-2); if (dateStartStr.match(/^\d/)) { const dateStart = new Date(dateStartStr).setHours(0, 0, 0, 0); $(entry).data('dateStart', dateStartStr); const dateEnd = new Date(dateEndStr).setHours(23, 59, 59, 999); $(entry).data('dateEnd', dateEndStr); const today = new Date(); $(entry).find('span.date').html(dateStartStr + '–' + dateEndStr); if (today >= dateStart && today <= dateEnd) { $(entry).addClass('active'); } else if (today <= dateStart) { $(entry).addClass('planned'); } else { $(entry).addClass('inactive'); } if (!enabled) $(entry).addClass('disabled'); } else { $(entry).find('span.date').html('[n/a]'); console.error(data); } let adplaces = []; $(htmlDoc).find("input[name='cats[7][]']:checked").each(function (idx, elem) { let id = $(elem).val(); let label = $(elem)[0].nextSibling.nodeValue let banner; if (label) { banner = label.match(/^(B +)(\d+)/); if (banner.length) banner = banner[2]; } adplaces.push({ 'bannerid': id, 'label': label, 'banner': banner }); }); // console.log("adplaces: ",adplaces); let bannerplace = adplaces.map(function (el) { return el['banner']; }).join(', '); $(entry) .data("targeturl", adURL) .data("text", adText) .data("startdate", dateStartStr) .data("enddate", dateEndStr) .data("banner", adplaces) .find('.detail').html( (imagesrc ? `<img src="${imagesrc}">` : '') + `<div>${adText}</div>` + `<div><a href="${adURL}">${adURL}</a></div>` + `<span class="bannerplace">${bannerplace}</span>` ); if (special_banners.includes(Number(bannerplace))) { $(entry).find(".bannerplace").addClass("special"); } if (!regular_banners.includes(Number(bannerplace))) { $(entry).find(".bannerplace").addClass("nonstandard"); } countOverview(); overviewProgress(); filterOverview($(element).closest('div')); }).fail(function () { $(element).closest('div').removeClass('loading').addClass('failed'); console.error("failed!", element); }).then(function () { openXHR--; }); })(el, url); } unsafeWindow.openqaz = function () { window.open('https://qaz.wtf/u/convert.cgi?text=' + $('#adname').val() + '%20' + $('#adname').val().toUpperCase()); } function adtime(ev) { ev.preventDefault(); let tg = ev.target; let weeks = $(tg).data("weeks"); if (weeks <= 1) weeks = 1; let offset = $(tg).data("offset"); let startday = 1; // mon if ($('input[name=url1]').val().match(/19\.de/)) startday = 0; // sun const dateOptions = { year: 'numeric', month: '2-digit', day: 'numeric' }; let start = new Date(); start.setDate(start.getDate() + (startday + 7 - start.getDay()) % 7 + (offset * 7)); let end = new Date(start); end.setDate(start.getDate() + (weeks * 7) - 1); $('#daterange').data('daterangepicker').setStartDate(start.toLocaleDateString('de-DE', dateOptions)); $('#daterange').data('daterangepicker').setEndDate(end.toLocaleDateString('de-DE', dateOptions)); updateDateRange($('#daterange').data('daterangepicker').startDate, $('#daterange').data('daterangepicker').endDate); } function week_drag_start(ev) { ev.preventDefault(); mousebutton_pressed = true; drag_start_offset = $(ev.target).data('offset'); $('#weekpicker button').removeClass("dragged"); $(ev.target).addClass("dragged"); } function week_drag_stop(ev) { ev.preventDefault(); mousebutton_pressed = false; let first = $("#weekpicker button.dragged").first(); let last = $("#weekpicker button.dragged").last(); let offset = $(first).data('offset'); let weeks = $(last).data('offset') - offset + 1; set_weeks(offset, weeks); } function set_weeks(offset, weeks) { let startday = 1; // mon if ($('input[name=url1]').val().match(/19\.de/)) startday = 0; // sun const dateOptions = { year: 'numeric', month: '2-digit', day: 'numeric' }; let start = new Date(); start.setDate(start.getDate() + (startday + 7 - start.getDay()) % 7 + (offset * 7)); let end = new Date(start); end.setDate(start.getDate() + (weeks * 7) - 1); $('#daterange').data('daterangepicker').setStartDate(start.toLocaleDateString('de-DE', dateOptions)); $('#daterange').data('daterangepicker').setEndDate(end.toLocaleDateString('de-DE', dateOptions)); updateDateRange($('#daterange').data('daterangepicker').startDate, $('#daterange').data('daterangepicker').endDate); } function moveadtime(ev) { ev.preventDefault(); let tg = ev.target; let movedays = $(tg).data("movedays"); const dateOptions = { year: 'numeric', month: '2-digit', day: 'numeric' }; let start = new Date($('#daterange').data('daterangepicker').startDate); start.setDate(start.getDate() + movedays); let end = new Date($('#daterange').data('daterangepicker').endDate); end.setDate(end.getDate() + movedays); $('#daterange').data('daterangepicker').setStartDate(start.toLocaleDateString('de-DE', dateOptions)); $('#daterange').data('daterangepicker').setEndDate(end.toLocaleDateString('de-DE', dateOptions)); updateDateRange($('#daterange').data('daterangepicker').startDate, $('#daterange').data('daterangepicker').endDate); } function addStyle() { $('head').append('<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">'); GM_addStyle(` /* i really want this to be global */ @import url('https://fonts.googleapis.com/css?family=Roboto+Condensed:400,400i,700,700i|Roboto:400,400i,500,500i,700,700i&display=swap'); ul.dropdown-menu { column-gap: 4px; font-size: 13px; right: -515px; left: -200px; column-width: 120px; font-family: "Roboto Condensed"; } .adnamemenu { font-weight: bold; } h1 { margin: 0; background-color: #11aac1; color: white; padding: 0 20px; } tr td { padding: 3px !important; } div.container div { padding-bottom: 0; } div.well { padding: 4px 8px; } .navbar { margin-bottom: 8px; } #myform>table { position: relative; } #myform>table tr { position: relative; } #myform>table tr:nth-child(-n+12) td:first-child { text-align: right; vertical-align: middle; } #myform>table tr:nth-child(1) { /* Editing... */ position: absolute; right: 20px; top: -43px; font-size: 13px; color: white; } #myform>table tr:nth-child(2) { /* Approved... */ position: absolute; right: 20px; top: -27px; font-size: 13px; color: white; } #myform>table tr:nth-child(3) { /* thumbnail */ position: absolute; right: 0px; top: 0px; transform: scale(0.7); display: none; } #myform>table tr:nth-child(8) { /* current banner */ position: absolute; right: 0px; top: 0px; background-color:#ffffff; } #myform>table tr:nth-child(n+11):nth-child(-n+12) td:first-child { font-size: 10px; } #myform>table tr:nth-child(8) td a { /* banner delete button */ position: absolute; top: calc(100% + 50px); right: 0; width: auto; z-index: 10; } .spacelist { height: 280px !important; max-width: 765px; overflow: auto; line-height: 13px; column-gap: 0; column-width: 190px; column-fill: auto; } .container .dropdown-menu>li>a { line-height: 10px; padding: 4px; } input[type=checkbox] { margin: 0 auto !important; } .spacelist input[type="checkbox"] { transform: scale(0.8); margin-left: -13px !important; position: relative; top: 2px; } input[name=text1], input[name=banner_uploaded], input[name=url1] { width: 550px; } input#currentad { width: 50px; text-align: center; } #textpreview { position: absolute; border: none; width: 146px; height: 45px; overflow: hidden; font-family: verdana; font-size: 10px; text-align: center; top: 0px; left: 78px; color: #0000ff; background-color: #ffffff; resize: none; padding: 1px 3px 0; } #textpreviewcontainer { position: absolute; top: -170px; right: 165px; } .daterangepicker .today { background-color: #ffe840; } .daterangepicker td.in-range { background-color: #B4F0F8; } .daterangepicker td.start-date, .daterangepicker td.end-date { background-color: #11AAC1; } #daterange { width: 170px; } .spacelist label { font-weight: normal; font-family: roboto; font-size: 12px; line-height: 11px; margin-top: -1px; margin-left: 14px; margin-right: 0px; margin-bottom: -1px; padding: 2px; } .spacelist .selected { font-weight: 700; background-color: #11aac1; color: white; } .adnamemenu { font-weight: bold; padding-left: 2px; } .tzCheckBox { background: no-repeat right bottom url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASIAAABCCAYAAADzPdtYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAE3lJREFUeNrsnXuQHNV1xr/unpmentfuzmpf2tVqJa0RxmWhhBgXWBgbIiA2pozBQILLha0CKkSEson8qCJJkYRyisSxoLCVQAiUKxFPh3IlxAk4IjyMHByBkAhYIMRa0mpX+57defd0d865u3foXQktJP+lz0ed6pnbPXe2NMWvvnPuy7jmgQ34AFpPcSXF2RS9C9ENkUgUZU1RvEMxTLGH4gmK/ct96KHrXm2+joVvPPyVfSc8TKBK0GULxTYnGV+zoj2NbNqGnbCQSMSQiFvyM4hEEVaj4eerNTdfq3tnFUu1yyany7eXynUG010UOyjqy/URO9VNgtDldLmzpzM7SIF0KqHayw0Xru9htlGFW/fklxCJIqyYaSIRs+CQMWlvdbC6txWVqrtmZGxu+/Do7FZ65NsUj39gEBGA2OZsb29LbWUAtbU4qPkNjJTn5F9dJBItdkS+rwJwUahXVVub7WBtfx751tQgAemxianS/dR803u5o9hJINRCl8d6unKbuaOA/jtWOgmAAsAxWrHa2YAuexAxY94t0Z+E0cpBHK7tQ8mn1NGQH0okipqmqhV17cykcXquA4cOW1uOjc4OUtMXMF9Tem8QEYQcuvxzX0/LpoG+NszUqqhQGraIP36AVYkN+ETnNVid+wg8z0O1WkW9XqdcsQHDMHB6/nw4jkNAehs/G3sEQ7U9MEwhkkgUNY2VS0jGYli7Kg/LNM4/cqzwj9R80VJntNQR/aC3O6cgNFkto+55ixxQMmjBJd2/hzM6z4VlWQpCDCCOUqmEWq22qLNUKofP9fwBRutv4Z+O/RVqRkEckkgUMVXJoEwGZazubSNmBOcfOz67fSFNOymIrl6RT1+3ui+PyUoFtRCE2AW1mf24eu0foiPbi2QyiSAI5jsg2jGU2AktVblcVtHWtgpfXfc9PDp0B8YbB8UdiUQRU63hYZoypwFyRnXX+92JqdKz1PyIvm8uXDMU3+1ekYXn+/ShhnJAKnwg63fh2nV/hjanC6ZpwqdnGDwMoFOBSGt6ehqVQgPXrv0TtAarEHjBu/1LSEhEIiquq/jCnCF957cfPDOxFERbejpzvblsEuOU0y2qCbkmLl/9TSTgNNMwrgWxI2IAxeNxdWVAnUpzc3OYmynjioFvwnQT83+cSCSKlJgvzBnizRp6e8NSEG3tIkpVFWDQDK8R4MPOBWiLr0SxWFQ1IA4NIxZDKJFIqOty4jpSMmjFmdnPqL7D3yUhIRGNYM50zbuibeSKLF0jOiebtgedZAyjxblFxemgauLC9V9CYbqgHBAXpzkt89WcAah0jFMzBhFfTyV2TvwMQ+xTA9fglZd/QhisSfFaJIqYpitldGeyyGbs/rli7RxqeoHpsbklm2zSSsv3Aqx1Pg64MVQqFZV6sQtiGPFVwyiVSikQcZxMDCuGkH5GpXKIY336PLzuPg3TEhKJRFETs6Yt54BA9FkNonMyaRtld/GER8/18aG2j6l0SrsghgqDyHXdRTDKZDJq3tBScbpm27YaZdOuSRe3ue99R/4NiZSsVROJoqZivQbmDvNHp2brk3YcJQJR2BG5VR8rc+vgltwQxebTM+2KdL1IwygsBg+3aQiFi9rcT28L9f2Wh7gjIBKJoqZqw0M2oUA0qEGUj5mGckBhEnl1H/lMF47PjjVHxILQfXZD4cmM/f39zXv5fB65XE5BiD8bHt7X17Z0B32JuTgfFIlEkRAbmbitsqhuDaIWVf/x/MWpWSNAMj6fbi03NM9QGhoawsaNG9/3H8JAMr0EAt+TgrVIFDEFTQ7A4pEzBlFhplRoqZar8Px33Um5VEexUlA1nfAomb4qkCy4HU692AHt3bsXXV1d6jWnYnxfPxsGkAIdpXdThXHkkraASCSKmBgDs5aawuM9dN2rHoNoigDUYlomvODdZR0GmaCxmWOUx61QxWkNlDCA9IRGLlTz6BlrdnZWXbktXBdaCqSxmWH1HQpCAiKRKFKKWc0sbFSnZgfqdW+NHbfghtaXmTEDb43sw7kf+oyqDWkA6dCjXzwqxqEnNHLux8P92vWEYaSBxO1vUt9m3Hh3SqVIJIqM4sSbuqtAdFCDaHe16l3SkUmiVHt3CN9KGHj5yC5c8NEvNB2RdkIaRAwZDRrtdjiN4+c1mPj9Uhhx256hXYglTBjihkSiyCmbjGNiSm2itluD6OlSuXF7p2EuSp3itoWh8f04PP4WeloHlIsJu6HwnKBwMVsP8Wt4aTF89LPDE0M4MP1ztK6yT7lYViQS/f+UQbwpFtUysSdVBsZEKlcaB2uuh5aU3azZWLYJpzWGnT/b3ky99Gp7DaBw/ScMIg0jTtOWBt976Pm7kWy1lOtq1ogkJCQiEVknAbfhg7gzHHZErHump2vbe7pTmF3Y3Iw/k8zFMDz7Gp5+5UfY/GtXNFfc6wgXoPUiWA0jdkDaRelnOEV7/rWf4M3SbuT7HVWHEolE0VLKjuP4WFlxh0fMwiC6f3Kquq0ll+hdkUlhsjRfbI4nLWQ6EvjR3ruxMj+ADWvPPqForWF0MhBpGPF9ntx4aPQN/HD3HWgdsKlvU9IykShiak875IQ8jE9Ued/qHbpdg6hIcevUdO3h/mwWdiKGesNTrsjJxeH3AXf/9FZ85dw/wnkbLl40lK9hwjWhpdLr03go/9VDu3Hfc3+M7KoYpWVxcUMiUcRkq7KOhalp5YZuJjdUWAoi1iMzhdol8VHzut6eNKbLVbVntRU3kM7H1FKMv33xNuwf+jmuveD30ZZrV6mWVhhE7Ij4XjqdhpUw8fCz38ez7zyKtlUO0u1xxOICIZEoSopbFtpSNoaPlTAzU7uXmnaG7xtLjpzmNR1PdXWmNq0kGBVqNVTd+W1jeclHpeBidrSGxnQcnzzt8/j4+gvw4YGNKkXjNWe8P7VeZf/OyAH854Fd2PXGY4i1ush126r4bcVMmcAoEkVIfIpHS9LGyGgJo8fLL1DThRT1Ux05XSEwXXp8rPyY7web+3ozyNkJjJfKiCUMZMjN8LYdlRkXL449hp++uRMptNKXdKAnvxqmYWF48hDm6lMoepMEnjha1sbp6qhV9rL3kEgULbWnHHUS7NHhIsbGK7xhPp9rdsIhiydsq0gwKhCMfmt8orLdbfhbO1Y46M5lVM2Id+FPZkwkCCrpfAL1ige34qJaO4qDjcPKOVkrTDi2iVwyq+DDRWkFIGGQSBQZtSaTsGMWikUXRydKmJqqPkjNN+L9nvS6ACMeUruZgLSL8rk7OzqcwU4GUiat7pd5YzTHh5v11bIQ3s3RX1gdYlpQxwWZpsBHJIqCLMNAgucYkvNJLdSNq1UPR0eLPEz/Dr29DUtqQu8LRCEgPUEwenJ8vLKFYlsyGVuTb0sim4kjTnlfxuYJjrJYTCSKsnjXjmq1gUbdx8hkGdPTVZ6syAC6C/ND9PXl+ogt9wDBqL7Q2Q6C0vpjI8Ur6fUmig4KPhIkLz+FSBRp8fSfAxTjFC9RPE6x/4N0sAhES0bQTtAF3xjTL+tLriKRKLoK80AVaXbd2fmBOjDu7ehe7hk+nmMLxbaUH6zp8nzkyIrZQYBkQDdlq1eRKNJyDaBiGKhRzJkGxiwTRdNopmY3jI+e1LCEt55eDkSXU9zZ1/AH+xoeMgs7ONYCHw1e2IpAXUUiUXRlwUDMmA/bmK8ZlwlIR2MmDscs3m/o2wSjx/83IOLNhLZ3eP7WPnJAeQKQS9CZ8xryry4SiZZVxrSQIChNM5DIIZFLup+abwq7o+VA1ELxWJ8XbD7Nmz91cdpz5V9WJIqoGBdGZweSn9wE+6MbYDrJ+fZ6HdV9+1F97gUEo6Mnna3TasVhklN60zJwxDLUhEaC0dRyIFJLPAZ8bFpHECr5DdR8X34JkSiC4v/zE+dtQsfXb0H27I+pnTSq1apazsW7bfCCdt6rjBe1V/e/hvHv3YXavz9zwu7P7IwyVgxvE4yGTDCMLmJnFAbR0uH7H/QHBCG6P+d7cPlB2apDJIqcAwo6OtD1l3+OjosvUnuPMYTC5xjWFvYt00p1d6Hrr78P95W9GNl6C4zxiaZDqlOPs2Rq1plxkL85/4iB7ZymhT8fdkRXd8F4+COBgbmGSxASJyQSRdEFGetPw8CDf4fswGq1jxg7F95dgw/FKBaLmJubU87oZGpra0OaoDX01evhv7pvkTtKmOyM4vhvI8BxBNdcPzbyyFIQ8XnRv/x1w+rNEQ5nXJkeJBJF0Qn5q/sx+MTjsFe0N3fS4N01dFrGECoUCs2Tek6mbDaLPKVrb11xNXDgzUUwao0nMEtW6eXA4+H90wlG9XBqtmUVQajVtDBVJ9KZko6JRFGTS9BZveMeIklGpWBa+hSe8Gk8pxLDiutH/dTX25d9HolypZmmzXgu8okk+nysORp4N1DTPWEQbe21Yqj7AQJD1o6JRFETT4e2r74K8bVrVPrFbkgXkxkqGkLcro8KO5W4jpTs7EDmy19G+W/uW1SMZsQxb442vG33dfbsIFekTno9p8UwB1PkhibdihSnRaIIpmQ128bg127BNKVd+hQeve+8hhGnaTpdO5UYWvwMu6r+rTdh386HYBVLTVfENeh220GrYfbPBP451PQC97i5jSAU0BcFAiGRKJpu6KLfhGsnUJktqNSLh+f1kWAaRnysPIOI42TSzkk/o7aSpj6dyy6F99CjCPsoZk2eXNFMo/5ZDaJzWqihyhsKCYhEosipTg6o49Pnq3RKuyB9NDyPloVhlMlk1LyhpdLHz/Mom3ZN+vzD1k9/CscIRKkQX8rEmxZO8RpgR6RSt/UpaqjRF4ojEomipyqBKHvGGSguOQCDQaRdEc8b0gVshlFYDB5u0xAKF7W5nxz1fYiec0J8qQc+HNPml4MaRHnLMNUCVgGRSBQ98er59MqVKEyMN0fEwrOe2Q2FJzP29/c37+XzeeRyOQUh/qw+eFWnaqx0dxcaBKcgtEqDF8vH57+rW4OoJWYZCkSytatIFD1xjSieTgETWHZonqE0NDSEjRs3vu/+GUi+YyMIDeOr9WvzB/pY93X2WAyiwmRhrmWiUZctPUSiCGqc4FKZmVE1nfAomb7q05318D07oL1796Krq0u95lQsfOpzGEAKdJTajRwfg2daTRDx1aqT/aFkTA/fT/kGuSJjwRWJRKJIiecvTx8+jERPjypOh09x1gDSExq5UM2jZ6zZ2Vl15bZwXWgpkGYOH1Er8I3QeRoJ5s38m1Gdmh2omVjjUCd1T0AkEkVNbEKO7XkZ66+8QtWGNIB06NEvHhXj0BMauYitl3pwUTsMIw0kbh/es0d9hxmCk+KNqXK0gxpEu0vAJT30ZbP6TCCRSBQZ8WLUoSf/BWd+6dqmI9JOSIOIIaNBo90Op3H8vAYTv18KI257h/pOmItdUi4Wx+j8wvrdGkRPzyK4faVhLnpQJBJFQzyIPv7SLzD2xhtoGxxULibshsJzgsLFbD3Er+GlxfDRz46//TYmnnkWfUv4YtD72UAZnyffdURBcLBmGoMr7CSmZOW9SBQ5ELURI57/0zvwxYd3qjlD2hFpAIXrP2EQaRjpjdLC7eyOnrvjO6pv27Saq/BbyA255JCKXjAcdkSse8Z9b3t/LAGzIdvCikRRU5ZAMfuL/8Kef9iJs679HQUSDSCdjmnQMHTCMGIHpF2UfoYhtO/HP8bsrmewyoqpGpFWhkB0dJ4z9/CIWRhE9x/3Gtvy8Xhvl5PCeK0qv4xIFCHxoo0OgsUr5Ira163Duk+ce0LRWsPoZCDSMOL7PLlx5LXX8OK2b2E1OSon5IY6KOsqBT5GPJf3rd6h+9Eg4pMabx1rNB4+zXaQIoLVpHAtEkVKLZaJXs/HU1uux3nf/Qts+Nyli4bytdtx3ROzJr0+jYfy3372OTz7ta+jjyDFe5xpN5TkeUj0/lc1Vf65mdxQQX9+6eb5D6xM2NcNJB1M89oSgZFIFCnxPvWT9P/9EXI9fVd9ERd+6xvIrVixaMRsamoKhw8fbsKJHVA6nVZzg/5j+9049MADWEXpV7s6UmghVSNHlSc39E61gpF67d4bxkdvXPYUjz7b2bQ6mcKcW0OlIWeZiURREaPBI0AUyOGMeg1Mpxysv+YqnH7xxRj4jbNUisZrzsrlcnOV/cjrr+OX//oUXv/h36O1UkE3ZVQtPOLGoKL+bH6fsPGrahlHa5UXqOnCpad4vOe5ZiuTzua1qQzlgD4mKmX5hUSiCIln+FQIRgVyR5Oehxle+tHejmRXJ/Jr18AkdzTx1kHUJibgj42pFKyd2lro6pgG9GKOvJMiIJk4VC5iuFp53+eaaamTXlck7K095Iza4gmVphWqFfmFRKKIuaMaRYUMSXXhNadvfC+hjpiejxTBhq/WggvKURrGTqjQcDFCTmisVn2Qmm/8ICe9hnU5xZ0rndTgSieN9MIWkRW3Tn+gD5f3K5EDGEWiSEBJg8kLuRUeDYtRGmbzfCOCkROf372xTGndMcqkhsslPq3jNgLQzhP6/AAgYnHPWyi2pWKxNR1JRx0JwsUnroLHTdlsXySKshhO5UYDLpmSWTIpY9UqSg2XAXQXxY6wC/q/gCis9RRXUmyi6KBYw2mg/BQiUaTF038OUIxTvETxOMFn/7IuKwSi/xFgAONAbYVssdKAAAAAAElFTkSuQmCC); display: inline-block; min-width: 60px; height: 33px; white-space: nowrap; position: relative; cursor: pointer; margin-left: 14px; } .tzCheckBox.checked { background-position: top left; margin: 0 14px 0 0; } .tzCheckBox .tzCBContent { color: white; line-height: 31px; padding-right: 38px; text-align: right; } .tzCheckBox.checked .tzCBContent { text-align: left; padding: 0 0 0 38px; } .tzCBPart { background: no-repeat left bottom url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASIAAABCCAYAAADzPdtYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAE3lJREFUeNrsnXuQHNV1xr/unpmentfuzmpf2tVqJa0RxmWhhBgXWBgbIiA2pozBQILLha0CKkSEson8qCJJkYRyisSxoLCVQAiUKxFPh3IlxAk4IjyMHByBkAhYIMRa0mpX+57defd0d865u3foXQktJP+lz0ed6pnbPXe2NMWvvnPuy7jmgQ34AFpPcSXF2RS9C9ENkUgUZU1RvEMxTLGH4gmK/ct96KHrXm2+joVvPPyVfSc8TKBK0GULxTYnGV+zoj2NbNqGnbCQSMSQiFvyM4hEEVaj4eerNTdfq3tnFUu1yyany7eXynUG010UOyjqy/URO9VNgtDldLmzpzM7SIF0KqHayw0Xru9htlGFW/fklxCJIqyYaSIRs+CQMWlvdbC6txWVqrtmZGxu+/Do7FZ65NsUj39gEBGA2OZsb29LbWUAtbU4qPkNjJTn5F9dJBItdkS+rwJwUahXVVub7WBtfx751tQgAemxianS/dR803u5o9hJINRCl8d6unKbuaOA/jtWOgmAAsAxWrHa2YAuexAxY94t0Z+E0cpBHK7tQ8mn1NGQH0okipqmqhV17cykcXquA4cOW1uOjc4OUtMXMF9Tem8QEYQcuvxzX0/LpoG+NszUqqhQGraIP36AVYkN+ETnNVid+wg8z0O1WkW9XqdcsQHDMHB6/nw4jkNAehs/G3sEQ7U9MEwhkkgUNY2VS0jGYli7Kg/LNM4/cqzwj9R80VJntNQR/aC3O6cgNFkto+55ixxQMmjBJd2/hzM6z4VlWQpCDCCOUqmEWq22qLNUKofP9fwBRutv4Z+O/RVqRkEckkgUMVXJoEwGZazubSNmBOcfOz67fSFNOymIrl6RT1+3ui+PyUoFtRCE2AW1mf24eu0foiPbi2QyiSAI5jsg2jGU2AktVblcVtHWtgpfXfc9PDp0B8YbB8UdiUQRU63hYZoypwFyRnXX+92JqdKz1PyIvm8uXDMU3+1ekYXn+/ShhnJAKnwg63fh2nV/hjanC6ZpwqdnGDwMoFOBSGt6ehqVQgPXrv0TtAarEHjBu/1LSEhEIiquq/jCnCF957cfPDOxFERbejpzvblsEuOU0y2qCbkmLl/9TSTgNNMwrgWxI2IAxeNxdWVAnUpzc3OYmynjioFvwnQT83+cSCSKlJgvzBnizRp6e8NSEG3tIkpVFWDQDK8R4MPOBWiLr0SxWFQ1IA4NIxZDKJFIqOty4jpSMmjFmdnPqL7D3yUhIRGNYM50zbuibeSKLF0jOiebtgedZAyjxblFxemgauLC9V9CYbqgHBAXpzkt89WcAah0jFMzBhFfTyV2TvwMQ+xTA9fglZd/QhisSfFaJIqYpitldGeyyGbs/rli7RxqeoHpsbklm2zSSsv3Aqx1Pg64MVQqFZV6sQtiGPFVwyiVSikQcZxMDCuGkH5GpXKIY336PLzuPg3TEhKJRFETs6Yt54BA9FkNonMyaRtld/GER8/18aG2j6l0SrsghgqDyHXdRTDKZDJq3tBScbpm27YaZdOuSRe3ue99R/4NiZSsVROJoqZivQbmDvNHp2brk3YcJQJR2BG5VR8rc+vgltwQxebTM+2KdL1IwygsBg+3aQiFi9rcT28L9f2Wh7gjIBKJoqZqw0M2oUA0qEGUj5mGckBhEnl1H/lMF47PjjVHxILQfXZD4cmM/f39zXv5fB65XE5BiD8bHt7X17Z0B32JuTgfFIlEkRAbmbitsqhuDaIWVf/x/MWpWSNAMj6fbi03NM9QGhoawsaNG9/3H8JAMr0EAt+TgrVIFDEFTQ7A4pEzBlFhplRoqZar8Px33Um5VEexUlA1nfAomb4qkCy4HU692AHt3bsXXV1d6jWnYnxfPxsGkAIdpXdThXHkkraASCSKmBgDs5aawuM9dN2rHoNoigDUYlomvODdZR0GmaCxmWOUx61QxWkNlDCA9IRGLlTz6BlrdnZWXbktXBdaCqSxmWH1HQpCAiKRKFKKWc0sbFSnZgfqdW+NHbfghtaXmTEDb43sw7kf+oyqDWkA6dCjXzwqxqEnNHLux8P92vWEYaSBxO1vUt9m3Hh3SqVIJIqM4sSbuqtAdFCDaHe16l3SkUmiVHt3CN9KGHj5yC5c8NEvNB2RdkIaRAwZDRrtdjiN4+c1mPj9Uhhx256hXYglTBjihkSiyCmbjGNiSm2itluD6OlSuXF7p2EuSp3itoWh8f04PP4WeloHlIsJu6HwnKBwMVsP8Wt4aTF89LPDE0M4MP1ztK6yT7lYViQS/f+UQbwpFtUysSdVBsZEKlcaB2uuh5aU3azZWLYJpzWGnT/b3ky99Gp7DaBw/ScMIg0jTtOWBt976Pm7kWy1lOtq1ogkJCQiEVknAbfhg7gzHHZErHump2vbe7pTmF3Y3Iw/k8zFMDz7Gp5+5UfY/GtXNFfc6wgXoPUiWA0jdkDaRelnOEV7/rWf4M3SbuT7HVWHEolE0VLKjuP4WFlxh0fMwiC6f3Kquq0ll+hdkUlhsjRfbI4nLWQ6EvjR3ruxMj+ADWvPPqForWF0MhBpGPF9ntx4aPQN/HD3HWgdsKlvU9IykShiak875IQ8jE9Ued/qHbpdg6hIcevUdO3h/mwWdiKGesNTrsjJxeH3AXf/9FZ85dw/wnkbLl40lK9hwjWhpdLr03go/9VDu3Hfc3+M7KoYpWVxcUMiUcRkq7KOhalp5YZuJjdUWAoi1iMzhdol8VHzut6eNKbLVbVntRU3kM7H1FKMv33xNuwf+jmuveD30ZZrV6mWVhhE7Ij4XjqdhpUw8fCz38ez7zyKtlUO0u1xxOICIZEoSopbFtpSNoaPlTAzU7uXmnaG7xtLjpzmNR1PdXWmNq0kGBVqNVTd+W1jeclHpeBidrSGxnQcnzzt8/j4+gvw4YGNKkXjNWe8P7VeZf/OyAH854Fd2PXGY4i1ush126r4bcVMmcAoEkVIfIpHS9LGyGgJo8fLL1DThRT1Ux05XSEwXXp8rPyY7web+3ozyNkJjJfKiCUMZMjN8LYdlRkXL449hp++uRMptNKXdKAnvxqmYWF48hDm6lMoepMEnjha1sbp6qhV9rL3kEgULbWnHHUS7NHhIsbGK7xhPp9rdsIhiydsq0gwKhCMfmt8orLdbfhbO1Y46M5lVM2Id+FPZkwkCCrpfAL1ige34qJaO4qDjcPKOVkrTDi2iVwyq+DDRWkFIGGQSBQZtSaTsGMWikUXRydKmJqqPkjNN+L9nvS6ACMeUruZgLSL8rk7OzqcwU4GUiat7pd5YzTHh5v11bIQ3s3RX1gdYlpQxwWZpsBHJIqCLMNAgucYkvNJLdSNq1UPR0eLPEz/Dr29DUtqQu8LRCEgPUEwenJ8vLKFYlsyGVuTb0sim4kjTnlfxuYJjrJYTCSKsnjXjmq1gUbdx8hkGdPTVZ6syAC6C/ND9PXl+ogt9wDBqL7Q2Q6C0vpjI8Ur6fUmig4KPhIkLz+FSBRp8fSfAxTjFC9RPE6x/4N0sAhES0bQTtAF3xjTL+tLriKRKLoK80AVaXbd2fmBOjDu7ehe7hk+nmMLxbaUH6zp8nzkyIrZQYBkQDdlq1eRKNJyDaBiGKhRzJkGxiwTRdNopmY3jI+e1LCEt55eDkSXU9zZ1/AH+xoeMgs7ONYCHw1e2IpAXUUiUXRlwUDMmA/bmK8ZlwlIR2MmDscs3m/o2wSjx/83IOLNhLZ3eP7WPnJAeQKQS9CZ8xryry4SiZZVxrSQIChNM5DIIZFLup+abwq7o+VA1ELxWJ8XbD7Nmz91cdpz5V9WJIqoGBdGZweSn9wE+6MbYDrJ+fZ6HdV9+1F97gUEo6Mnna3TasVhklN60zJwxDLUhEaC0dRyIFJLPAZ8bFpHECr5DdR8X34JkSiC4v/zE+dtQsfXb0H27I+pnTSq1apazsW7bfCCdt6rjBe1V/e/hvHv3YXavz9zwu7P7IwyVgxvE4yGTDCMLmJnFAbR0uH7H/QHBCG6P+d7cPlB2apDJIqcAwo6OtD1l3+OjosvUnuPMYTC5xjWFvYt00p1d6Hrr78P95W9GNl6C4zxiaZDqlOPs2Rq1plxkL85/4iB7ZymhT8fdkRXd8F4+COBgbmGSxASJyQSRdEFGetPw8CDf4fswGq1jxg7F95dgw/FKBaLmJubU87oZGpra0OaoDX01evhv7pvkTtKmOyM4vhvI8BxBNdcPzbyyFIQ8XnRv/x1w+rNEQ5nXJkeJBJF0Qn5q/sx+MTjsFe0N3fS4N01dFrGECoUCs2Tek6mbDaLPKVrb11xNXDgzUUwao0nMEtW6eXA4+H90wlG9XBqtmUVQajVtDBVJ9KZko6JRFGTS9BZveMeIklGpWBa+hSe8Gk8pxLDiutH/dTX25d9HolypZmmzXgu8okk+nysORp4N1DTPWEQbe21Yqj7AQJD1o6JRFETT4e2r74K8bVrVPrFbkgXkxkqGkLcro8KO5W4jpTs7EDmy19G+W/uW1SMZsQxb442vG33dfbsIFekTno9p8UwB1PkhibdihSnRaIIpmQ128bg127BNKVd+hQeve+8hhGnaTpdO5UYWvwMu6r+rTdh386HYBVLTVfENeh220GrYfbPBP451PQC97i5jSAU0BcFAiGRKJpu6KLfhGsnUJktqNSLh+f1kWAaRnysPIOI42TSzkk/o7aSpj6dyy6F99CjCPsoZk2eXNFMo/5ZDaJzWqihyhsKCYhEosipTg6o49Pnq3RKuyB9NDyPloVhlMlk1LyhpdLHz/Mom3ZN+vzD1k9/CscIRKkQX8rEmxZO8RpgR6RSt/UpaqjRF4ojEomipyqBKHvGGSguOQCDQaRdEc8b0gVshlFYDB5u0xAKF7W5nxz1fYiec0J8qQc+HNPml4MaRHnLMNUCVgGRSBQ98er59MqVKEyMN0fEwrOe2Q2FJzP29/c37+XzeeRyOQUh/qw+eFWnaqx0dxcaBKcgtEqDF8vH57+rW4OoJWYZCkSytatIFD1xjSieTgETWHZonqE0NDSEjRs3vu/+GUi+YyMIDeOr9WvzB/pY93X2WAyiwmRhrmWiUZctPUSiCGqc4FKZmVE1nfAomb7q05318D07oL1796Krq0u95lQsfOpzGEAKdJTajRwfg2daTRDx1aqT/aFkTA/fT/kGuSJjwRWJRKJIiecvTx8+jERPjypOh09x1gDSExq5UM2jZ6zZ2Vl15bZwXWgpkGYOH1Er8I3QeRoJ5s38m1Gdmh2omVjjUCd1T0AkEkVNbEKO7XkZ66+8QtWGNIB06NEvHhXj0BMauYitl3pwUTsMIw0kbh/es0d9hxmCk+KNqXK0gxpEu0vAJT30ZbP6TCCRSBQZ8WLUoSf/BWd+6dqmI9JOSIOIIaNBo90Op3H8vAYTv18KI257h/pOmItdUi4Wx+j8wvrdGkRPzyK4faVhLnpQJBJFQzyIPv7SLzD2xhtoGxxULibshsJzgsLFbD3Er+GlxfDRz46//TYmnnkWfUv4YtD72UAZnyffdURBcLBmGoMr7CSmZOW9SBQ5ELURI57/0zvwxYd3qjlD2hFpAIXrP2EQaRjpjdLC7eyOnrvjO6pv27Saq/BbyA255JCKXjAcdkSse8Z9b3t/LAGzIdvCikRRU5ZAMfuL/8Kef9iJs679HQUSDSCdjmnQMHTCMGIHpF2UfoYhtO/HP8bsrmewyoqpGpFWhkB0dJ4z9/CIWRhE9x/3Gtvy8Xhvl5PCeK0qv4xIFCHxoo0OgsUr5Ira163Duk+ce0LRWsPoZCDSMOL7PLlx5LXX8OK2b2E1OSon5IY6KOsqBT5GPJf3rd6h+9Eg4pMabx1rNB4+zXaQIoLVpHAtEkVKLZaJXs/HU1uux3nf/Qts+Nyli4bytdtx3ROzJr0+jYfy3372OTz7ta+jjyDFe5xpN5TkeUj0/lc1Vf65mdxQQX9+6eb5D6xM2NcNJB1M89oSgZFIFCnxPvWT9P/9EXI9fVd9ERd+6xvIrVixaMRsamoKhw8fbsKJHVA6nVZzg/5j+9049MADWEXpV7s6UmghVSNHlSc39E61gpF67d4bxkdvXPYUjz7b2bQ6mcKcW0OlIWeZiURREaPBI0AUyOGMeg1Mpxysv+YqnH7xxRj4jbNUisZrzsrlcnOV/cjrr+OX//oUXv/h36O1UkE3ZVQtPOLGoKL+bH6fsPGrahlHa5UXqOnCpad4vOe5ZiuTzua1qQzlgD4mKmX5hUSiCIln+FQIRgVyR5Oehxle+tHejmRXJ/Jr18AkdzTx1kHUJibgj42pFKyd2lro6pgG9GKOvJMiIJk4VC5iuFp53+eaaamTXlck7K095Iza4gmVphWqFfmFRKKIuaMaRYUMSXXhNadvfC+hjpiejxTBhq/WggvKURrGTqjQcDFCTmisVn2Qmm/8ICe9hnU5xZ0rndTgSieN9MIWkRW3Tn+gD5f3K5EDGEWiSEBJg8kLuRUeDYtRGmbzfCOCkROf372xTGndMcqkhsslPq3jNgLQzhP6/AAgYnHPWyi2pWKxNR1JRx0JwsUnroLHTdlsXySKshhO5UYDLpmSWTIpY9UqSg2XAXQXxY6wC/q/gCis9RRXUmyi6KBYw2mg/BQiUaTF038OUIxTvETxOMFn/7IuKwSi/xFgAONAbYVssdKAAAAAAElFTkSuQmCC); width: 14px; position: absolute; top: 0; left: -14px; height: 33px; overflow: hidden; } .tzCheckBox.checked .tzCBPart { background-position: top right; left: auto; right: -14px; } #adfilter { column-span: all; padding: 0px 6px; } #adfilter input[name="adfilter"] { box-sizing: border-box; width: 100%; line-height: initial; padding: 4px; background-color: #f2f5f7; border: 1px solid #aaa; } #overviewbutton { background-color: #6c456a; } #overview { position: relative; padding: 8px; border: 1px solid gray; background-color: #f0f0f0; min-height: 150px; overflow: auto; font-size: 12px; column-count: 4; font-family: "Roboto Condensed"; } #overview #overview-prog-container { height: 6px; background: #e0e0e0; margin-top: -8px; margin-left: -8px; margin-right: -8px; margin-bottom: 8px; column-span: all; position: sticky; top: -8px; z-index: 1000; transition: opacity 0.5s ease, visibility 0.5s ease; } #overview #overview-prog-fill { height: 100%; width: 0%; background-color: #11aac1; transition: width 0.3s ease; } #overview.showdetails { column-count: 2; } #overview.table { display: flex; flex-direction: column; gap: 2px; background: #f8f9fa; padding: 7px; border: 1px solid #dee2e6; border-radius: 12px; box-shadow: inset 0 2px 4px rgba(0,0,0,0.02); column-count: 1 !important; font-size: 17px; /* 140% from previous 12px */ } #overview.table .overviewentry { display: grid !important; grid-template-columns: 39px 120px 1fr 300px 30px 200px; align-items: center; gap: 4px; padding: 4px 8px; background: #ffffff; border-radius: 8px; border: 0px solid #e9ecef; margin-bottom: 0px; line-height: normal; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); height: auto !important; } #overview.table .overviewentry:hover { border-color: #11aac1; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); transform: translateY(-1px); z-index: 2; } #overview.table .overviewentry.active { background-color: #11aac1; color: white; border-left: 5px solid #008ba3; } #overview.table .overviewentry.active a, #overview.table .overviewentry.active .adno, #overview.table .overviewentry.active .detail div, #overview.table .overviewentry.active .date { color: white !important; } #overview.table .overviewentry.planned { background-color: #b4f0f8; color: #006064; border-left: 5px solid #11aac1; } #overview.table .overviewentry.inactive { background-color: #f8f9fa; border-left: 5px solid #6c757d; } /* Red warning for deactivated ads that are currently active in time span */ #overview.table .overviewentry.disabled.active { background-color: #e53935; color: white; border-left: 5px solid #b71c1c; } #overview.table .overviewentry.disabled.active a, #overview.table .overviewentry.disabled.active .adno, #overview.table .overviewentry.disabled.active .detail div, #overview.table .overviewentry.disabled.active .date { color: white !important; } #overview.table .overviewentry.disabled:not(.active) { background-color: #f1f3f5; border-left: 5px solid #dee2e6; opacity: 0.7; } #overview.namesonly { column-count: 1; background: transparent; border: none; padding: 10px; font-size: 14px; } #overview.namesonly .overviewentry { display: block !important; background: transparent !important; border: none !important; box-shadow: none !important; padding: 0 !important; margin: 0 !important; height: auto !important; } #overview.namesonly .overviewentry a { color: inherit !important; text-decoration: none; } #overview.namesonly .overviewentry .adno, #overview.namesonly .overviewentry .detail, #overview.namesonly .overviewentry .date, #overview.namesonly .overviewentry::after { display: none !important; } div#overview div { border-radius: 3px; padding: 2px; color: rgb(51, 51, 51); position: relative; line-height: 12px; break-inside: avoid; } #overview div::after { position: absolute; right: 5px; top: 0; } .overviewentry span.date { font-weight: normal; right: 20px; top: 2px; } .overviewentry span.adno { width: 18px; display: inline-block; text-align: right; } #overview.table .overviewentry>a { display: contents !important; } #overview div.active { background-color: #11aac1; color: white; font-weight: bold; } #overview div.active::after, #overview div.disabled::after { position: absolute; top: 2px; right: 4px; } #overview div.disabled { background-color: #eaeaea; color: #acacac; } #overview div.loading { background-color: yellow !important; filter: none !important; } #overview div.loadme { background-color: #ffffeb; opacity: 0.15; } #overview div.failed { background-color: #772c2c; } #overview div.error, #overview div.disabled.planned { color: #f9430b; font-weight: bold; } #overview div.planned { background-color: #c9dee1; } div#overview-tools { column-span: all; margin-bottom: 8px; padding: 2px !important; display: block; } div#overview-tools>* { margin: 0 10px; vertical-align: text-bottom; } #overview-tools a.btn { margin-right: 2px; margin-left: 0px; } div#overview-tools label { line-height: 44px; } #ads-button li.empty-banner a { color: #c0c0c0; } #ads-button li:nth-child(n+2):nth-child(-n+199) { border-left-width: 3px; border-left-style: solid; } #ads-button li:nth-child(n+2):nth-child(-n+101) { border-color: rgb(173, 20, 87); } #ads-button li:nth-child(n+101):nth-child(-n+150) { border-color: rgb(66, 133, 244); } #ads-button li:nth-child(n+151):nth-child(-n+199) { border-color: rgb(244, 81, 30); } #overviewtable { font-size: 12px; font-family: "Roboto Condensed"; } .overviewentry .detail { display: none; } #overview.showdetails .overviewentry .detail { display: block; height: 105px; } #overview.showdetails:not(.gallery) .overviewentry .detail { background-color: rgba(255, 255, 255, 0.5); } #overview.showdetails.gallery .overviewentry .detail { height:174px; } #overview.showdetails.gallery .overviewentry .table { height:1.5em; } #overview.showdetails .overviewentry > a { line-height: 120%; max-width: initial; } #overview.table .overviewentry .adno { grid-column: 1; font-weight: 700; color: #11aac1; font-family: 'Roboto Mono', monospace; font-size: 1.1em; width: auto !important; min-width: auto !important; margin-right: 0; text-align: left; } #overview.table .overviewentry .detail { display: contents !important; } #overview.table .overviewentry .detail div:first-of-type { grid-column: 3; font-size: 0.95em; color: #495057; font-weight: 400; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding-right: 10px; } #overview.table .overviewentry .detail div:last-of-type { grid-column: 4; font-size: 0.8em; opacity: 0.7; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } #overview.table .overviewentry .bannerplace { grid-column: 5; position: static !important; margin-left: 0; font-weight: 700; font-size: 0.8em; padding: 3px 8px; background: #e9ecef !important; color: #495057 !important; border-radius: 4px !important; box-shadow: none !important; min-width: 30px; text-align: center; } #overview.table .overviewentry .bannerplace.special { background-color: #ffd600 !important; color: #000 !important; box-shadow: 0 0 10px rgba(255, 214, 0, 0.4) !important; border: 1px solid #ffab00 !important; } #overview.table .overviewentry .date { grid-column: 6; text-align: right; font-family: 'Roboto Mono', monospace; font-size: 0.85em; color: #868e96 !important; background: transparent !important; padding: 0 !important; position: static !important; font-weight: normal; } #overview.showdetails .overviewentry > a { color: inherit; max-width: initial; width:100%; } #overview.showdetails .overviewentry .adno { width: 30px; } .detail { font-weight: normal; } #overview .detail img { display: block; height: 100px; float: right; } #overview.gallery .detail img { display: block; height: 170px; float: none; } #name_title { margin-left: 20px; font-weight: bold; color: #E3CBB3; text-shadow: 1px 1px 1px white, 1px -1px 1px white, -1px 1px 1px white, -1px -1px 1px white; } #overview.showdetails.gallery { column-count: 1; } #overview.gallery .overviewentry { display: inline-block; width: 116px; margin:4px; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } #overview.gallery .overviewentry span, #overview.gallery .overviewentry .detail div { display: none; } #overview.gallery .overviewentry.inactive .detail img { filter: grayscale(1); opacity: 0.6; } #overview.gallery .overviewentry.planned .detail img { filter: grayscale(0.5); opacity: 0.8; } #overview .overviewentry.disabled.planned .detail img { filter: grayscale(100%) brightness(40%) sepia(100%) hue-rotate(-55deg) saturate(700%) contrast(0.8); } #overview.showdetails:not(.table) .overviewentry.disabled::after, #overview.gallery .overviewentry.disabled::after { content: " "; background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' preserveAspectRatio='none' viewBox='0 0 100 100'><path d='M100 0 L0 100 ' stroke='black' stroke-width='1'/><path d='M0 0 L100 100 ' stroke='black' stroke-width='1'/></svg>"); background-repeat:no-repeat; background-position:center center; background-size: 100% 100%, auto; width: 100%; height: 100%; pointer-events: none; } #overview .overviewentry.hidden { display:none !important; } #overview.table .overviewentry img { display: none; } .panel { position: absolute; top: 110px; right: 50px; left: 400px; } #overview #announcepreview { background: white; padding: 28px; border: 1px solid lightgray; margin-bottom: 8px; font-size: 15px; box-shadow: 0 0 17px #30666b; position: relative; } #overview .announce-tools { position: absolute; top: 15px; right: 15px; display: flex; gap: 10px; } #overview .announce-tools a { box-shadow: 2px 2px 5px rgba(0,0,0,0.2); } .edit-ad-icon { position: absolute; top: 4px; right: 4px; background: rgba(255, 255, 255, 0.8); color: #11aac1; border-radius: 4px; padding: 2px 4px; box-shadow: 0 0 5px rgba(0,0,0,0.3); font-size: 12px; transition: all 0.2s; z-index: 10; } .edit-ad-icon:hover { background: #11aac1; color: white; transform: scale(1.1); text-decoration: none; } #announcepreview h2 { font-size: 18px; font-family: "Roboto Condensed"; font-weight: bold; } #announcepreview h2 a { color: #11aac1; } #overview .overviewentry .detail .bannerplace { position: absolute; top: -15px; right: 2px; font-size: 12px; padding: 2px 4px; display: block !important; border-radius: 2px; } #overview .overviewentry .detail .bannerplace.special { background-color: yellow; color: #ff8000; } #overview .overviewentry .detail .bannerplace.nonstandard { background-color: #ff8080; color: red; } #weekpicker { display: inline-grid; width: calc(100% - 210px); max-width: 400px; grid-template-columns: repeat(8, 12.5%); column-gap: 0; margin-left: 16px; } #weekpicker button { text-align: center; position: relative; border-top: none; border-bottom: none; border-right: none; } #weekpicker button:hover, #weekpicker button.dragged:hover { background-color:#ff8000; } #weekpicker button.dragged { background-color:#ff800080; } #weekpicker button:last-child { border-right: 2px solid; } #weekpicker .buttondate { font-size: 0.7em; position: absolute; top: -15px; left: calc(-2px - 50%); width: 100%; } .new-datepicker { margin-top: 12px; } #weekpicker-old { margin-left: 170px; display: inline-block; } `); }