var dir; function disableall() { $('button,a,input').disable(); } function pastedialogue() { $('#pwdialogue').dialog({ title: "Pasting from clipboard", modal: true, autoOpen: true, height: 'auto', width: 'auto', show: 'scale', hide: 'fade', draggable: false, resizable: false, closeOnEscape: false, open: function() { $('.ui-dialog-titlebar-close').hide(); } }); } function reloadclipboard() { $('#clipboard') .empty() .html(' Loading...') .load('/browse/clipboard.jim', function() { // Start Clipboard post-load actions if ($('#clipclear').length) { $('#paste').enable(); $('#doptmenu,#dooptmenu').enableContextMenuItems('#paste'); } else { $('#paste').disable(); $('#doptmenu,#dooptmenu').disableContextMenuItems('#paste'); } $('#clipclear').button().click(function() { $.get('/browse/clipboard.jim?act=clear', function() { reloadclipboard(); }); }); $('a.clipdel').click(function() { $.get('/browse/clipboard.jim?act=remove&path=' + $(this).attr('path'), function() { reloadclipboard(); }); }); $('#paste').button() .click(function() { disableall(); pastedialogue(); $('#pwfeedback').load( '/browse/clipboard.jim?act=paste&dir=' + encodeURIComponent(dir), function() { $('#pwdialogue').dialog('close'); window.location.reload(true); }); }); // End Clipboard post-load actions }); } function epginfo_callback(data, status, xhr) { //console.log(status); //console.dir(data); if (status != 'success') return; $('#rename_title').val(data.title); $('#rename_synopsis').val(data.synopsis); $('#rename_guidance').val(data.guidance); $('#rename_genre').val(data.genre); $('tr.tstype').show('slow'); } function insert_folder_size(folder, size) { folder = folder.replace(/ /g, ''); folder = folder.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1'); //console.log("Folder: (%s) = (%s)", folder, size); if (size.search(/\d$/) == -1) size += 'iB'; else size += ' bytes'; if (folder == "") $('#dirsize').text(' (' + size + ')'); else $('#' + folder).text(' (' + size + ')'); } function folder_size_callback(data, status, xhr) { //console.log("Status: %s", status); //console.dir(data); $.each(data, insert_folder_size); } function set_folder_new(folder, cnt) { folder = folder.replace(/ /g, ''); folder = folder.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1'); //console.log("Folder: (%s) = (%s)", folder, cnt); left = cnt > 99 ? 11 : (cnt > 9 ? 14 : 17); $('#img' + folder) .attr('src', '/img/Folder_New.png') .next('span.foldernum') .css('left', left + 'px') .text(cnt) .show(); } function new_folder_callback(data, status, xhr) { //console.log("Status: %s", status); //console.dir(data); $.each(data, set_folder_new); } //function insert_shrunk(file, perc) //{ // if (perc == 0) // { // file = file.replace(/[ ]/g, ''); // file = file.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1'); // //console.log("File: (%s) = (%s)", file, perc); // $('#sp_' + file).show(); // } //} //function shrunk_callback(data, status, xhr) //{ // //console.log("Status: %s", status); // //console.dir(data); // $.each(data, insert_shrunk); //} function delete_callback(file, dir, id) { var el = 'div.bf#' + id; var results = el + ' .results'; $(results) .html('Deleting, please wait...') .slideDown('slow') .load('/browse/delete.jim', { 'dir': dir, 'files': [decodeURIComponent(file)] }, function() { $(el).delay(3000).slideUp(300, function() { $(el).remove(); }); }); } function lock_callback(file, type, id) { var url = '/browse/lock.jim?file=' + file; $.get(url, function() { window.location.reload(true); }); } function enc_callback(file, type, id) { var url = '/browse/enc.jim?file=' + file; $.get(url, function() { window.location.reload(true); }); } function new_callback(file, type, id) { var url = '/browse/new.jim?file=' + file; $.get(url, function() { window.location.reload(true); }); } function thumbnail_callback(file, type, id) { var el = 'div.bf#' + id; var results = el + ' .results'; $(results) .html('Generating thumbnail, ' + 'please wait...') .slideDown('slow') .load('/browse/thumbnail.jim?file=' + file) .delay(3000) .slideUp('slow'); $('div.bf#' + id + ' img.opt').attr('thmok', 1); } function rename_submit() { var s = $('#renameform_form').serialize(); $.post('/browse/rename.jim', s, function() { window.location.reload(true); }); } function drename_submit() { var s = $('#drenameform_form').serialize(); $.get('/browse/rename.jim?' + s, function() { window.location.reload(true); }); } function aexpiry_submit() { $('#aexpiry_working').slideDown('slow'); var s = $('#aexpiry_form').serialize(); $.get('/browse/aexpiry.jim?' + s, function() { window.location.reload(true); }); } function newdir_submit() { var s = $('#newdirform_form').serialize(); $.get('/browse/mknewdir.jim?' + s, function() { window.location.reload(true); }); } function savestream_submit() { var s = $('#savestream_form').serialize(); var sf = $('#save_stream').attr('file'); $('#savestream_name').disable(); $('#savestream_spin').show(); $.get('/browse/savestream.jim?sfile=' + encodeURIComponent(sf) + '&' + s, function() { window.location.reload(true); }); } var $confirm; // Populated after DOM is loaded. function confirm_action(action, callback, file, type, id) { var bfile = file.replace(/.*\/|\.[^.]*$/g, ''); $confirm.dialog('option', 'buttons', { 'Yes': function() { $(this).dialog('close'); callback(file, type, id); }, 'No': function() {$(this).dialog('close');} }); $('#confirm').empty().html( 'Are you sure you wish to ' + action + '
' + '' + decodeURIComponent(bfile) + ' ?' ); $confirm.dialog('open'); } function preparemenu(el, menu) { if (el.attr('type') == 'ts') { // if (el.attr('def') == 'HD') // { // $(menu).enableContextMenuItems('#enc'); // if (el.attr('encd') == 1) // $(menu).changeContextMenuItem('#enc', // 'Remove Enc'); // else // $(menu).changeContextMenuItem('#enc', // 'Set Enc'); // } if (el.attr('bx') > 0) $(menu).enableContextMenuItems('#crop'); else $(menu).disableContextMenuItems('#crop'); if (el.attr('odencd') == 0) $(menu).enableContextMenuItems('#thm'); else $(menu).disableContextMenuItems('#thm'); if (el.attr('thmok') == 1) $(menu).enableContextMenuItems('#vthm'); else $(menu).disableContextMenuItems('#vthm'); $(menu).enableContextMenuItems('#strip'); if (el.attr('rsize') > 4294967296) $(menu).enableContextMenuItems('#chunk'); else $(menu).disableContextMenuItems('#chunk'); $(menu).enableContextMenuItems('#new'); if (el.attr('new') == 1) $(menu).changeContextMenuItem('#new', 'Mark watched'); else $(menu).changeContextMenuItem('#new', 'Mark new'); $(menu).enableContextMenuItems('#lock'); if (el.attr('locked') == 1) { $(menu).changeContextMenuItem('#lock', 'Unlock'); $(menu).disableContextMenuItems('#delete'); } else { $(menu).changeContextMenuItem('#lock', 'Lock'); $(menu).enableContextMenuItems('#delete'); } if (el.attr('odencd') == 1 && el.attr('dlna') == 1 && el.attr('encd') == 0) $(menu).enableContextMenuItems('#decrypt'); else $(menu).disableContextMenuItems('#decrypt'); if (el.attr('odencd') == 1) { $(menu).disableContextMenuItems('#audio'); $(menu).disableContextMenuItems('#mpg'); } else { $(menu).enableContextMenuItems('#audio'); if (el.attr('def') == 'HD') $(menu).disableContextMenuItems('#mpg'); else $(menu).enableContextMenuItems('#mpg'); } } else { $(menu).enableContextMenuItems('#delete'); $(menu).disableContextMenuItems('#lock'); //$(menu).disableContextMenuItems('#enc'); $(menu).disableContextMenuItems('#new'); } } function fixdmenu(el, menu, flag, tag, descr, recurse) { var a = el.attr(flag); var b = el.attr(flag + 'r'); if (a == undefined) a = 0; if (b == undefined) b = 0; if (a > 0) $(menu).changeContextMenuItem(tag, 'Disable ' + descr); else $(menu).changeContextMenuItem(tag, 'Enable ' + descr); if (recurse) { if (b > 0) { $(menu).changeContextMenuItem(tag + 'r', 'Disable Recursive ' + descr); $(menu).disableContextMenuItems(tag); } else { $(menu).changeContextMenuItem(tag + 'r', 'Enable Recursive ' + descr); $(menu).enableContextMenuItems(tag); } } } function preparedmenu(el, menu) { if (el.attr('noflat') != undefined) { if (el.attr('noflat') > 0) $(menu).changeContextMenuItem('#flat', 'Allow Flatten'); else $(menu).changeContextMenuItem('#flat', 'Prevent Flatten'); } fixdmenu(el, menu, 'autoshrink', '#shrink', 'Auto-shrink', 1); fixdmenu(el, menu, 'autodedup', '#dedup', 'Auto-dedup', 0); fixdmenu(el, menu, 'autodecrypt', '#decrypt', 'Auto-decrypt', 1); fixdmenu(el, menu, 'autompg', '#mpg', 'Auto-mpg', 0); fixdmenu(el, menu, 'automp3', '#mp3', 'Auto-audio', 0); fixdmenu(el, menu, 'autoexpire', '#expire', 'Auto-expire', 0); } $(document).ready(function() { dir = $('#dir').text(); var menuclick = function(action, el, pos) { var file = $(el).parent().prevAll('a.bf').last().attr('file'); var bfile = file.replace(/.*\/|\.[^.]*$/g, ''); bfile = bfile.replace(/[\x00-\x1f]+/g, ''); var type = $(el).attr('type'); var id = $(el).attr('did'); switch (action) { case 'delete': confirm_action('delete', delete_callback, file, dir, id); break; case 'copy': if (!confirm('Are you sure? Copying recordings takes a long time!')) break; // Fallthrough case 'cut': $.get('/browse/clipboard.jim?act=add&mode=' + action + '&path=' + file, function() { reloadclipboard(); }); break; case 'lock': confirm_action('change the lock on', lock_callback, file, type, id); break; // case 'enc': // confirm_action('change the ENC flag on', enc_callback, // file, type, id); // break; case 'new': confirm_action('change the New flag on', new_callback, file, type, id); break; case 'rename': $('#rename').val(decodeURIComponent(bfile)); $('#renamefile').val(decodeURIComponent(file)); $('#rename_title').val(''); $('#rename_synopsis').val(''); $('#rename_guidance').val(''); $('tr.tstype').css('display', 'none'); if (type == 'ts') { $.getJSON('/browse/epgtitle.jim?file=' + file, epginfo_callback); } $('#renameform').dialog('open'); break; case 'thm': window.location.href = '/browse/thumbnail/index.jim?file=' + file; break; case 'vthm': // window.open('/browse/bmpw.jim?file=' + file, 'hxwebifbmp', // 'height=156,width=280,toolbar=no,' + // 'scrollbars=no,menubar=no,location=no,titlebar=no'); $('#thmbmp').attr('src', 'bmp.jim?file=' + file); $('#bmpdialogue').dialog('open'); break; case 'download': window.location.href = '/browse/download.jim?file=' + file + '&base=' + encodeURIComponent(document.URL.match(/:\/\/(.[^/]+)/)[1]); break; case 'crop': window.location.href = '/browse/crop/crop.jim?file=' + file; break; case 'strip': window.location.href = '/browse/strip/strip.jim?file=' + file; break; case 'chunk': window.location.href = '/browse/chunk/chunk.jim?file=' + file; break; case 'decrypt': window.location.href = '/browse/decrypt/decrypt.jim?file=' + file; break; case 'audio': window.location.href = '/browse/audio/audio.jim?file=' + file; break; case 'mpg': window.location.href = '/browse/mpg/mpg.jim?file=' + file; break; default: alert('Unhandled action: ' + action); break; } }; function flagdir(file, flag, iconset, output, options) { var url = '/browse/flagdir.jim?dir=' + file + '&flag=' + flag; $(output).load(url, function() { $(iconset) .empty() .html(' Updating...') .load('/browse/iconset.jim?file=' + file); if ($(options).attr(flag) == '1') $(options).attr(flag, 0); else $(options).attr(flag, 1); }).delay(3000).slideUp(); } var dmenuclick = function(action, el, pos) { var direl = $(el).parent().parent(); var file = $(el).parent().prevAll('a.dbf').last().attr('file'); var iconset = $(el).parent().prevAll('span.iconset').last(); var bfile = file.replace(/.*\//g, ''); bfile = bfile.replace(/[\x00-\x1f]+/g, ''); var results = $(el).parent().next('div.results'); switch (action) { case 'paste': pastedialogue(); $('#pwfeedback').load( '/browse/clipboard.jim?act=paste&dir=' + file, function() { $('#pwdialogue').dialog('close'); reloadclipboard(); }); break; case 'delete': if (confirm('Are you sure you wish to delete "' + decodeURIComponent(file) + '" and all files within it?')) { $(results) .html('' + 'Deleting, please wait...') .slideDown('slow') .load('/browse/delete.jim', { 'dir': dir, 'files': [decodeURIComponent(file)] }, function() { $(direl).delay(3000).slideUp(300, function() { $(direl).remove(); }); }); } break; case 'copy': if (!confirm('Are you sure? Copying directories can take a very long time!')) break; // Fallthrough case 'cut': $.get('/browse/clipboard.jim?act=add&mode=' + action + '&path=' + file, function() { reloadclipboard(); }); break; case 'rename': $('#drename').val(decodeURIComponent(bfile)); $('#drenameorig').val(decodeURIComponent(file)); $('#drenameform').dialog('open'); break; case 'expire': if ($(el).attr('autoexpire') == 1) flagdir(file, 'autoexpire', iconset, results, el); else { $('#aexpiry_ldir').val(decodeURIComponent(file)); if ($(el).attr('autoexpiredays') > 0) $('#aexpiry_days') .val($(el).attr('autoexpiredays')); else $('#aexpiry_days').val(7); $('#aexpiry_working').hide('fast'); $('#aexpiry').dialog('open'); } break; case 'flat': flagdir(file, 'noflatten', iconset, results, el); break; case 'dedup': flagdir(file, 'autodedup', iconset, results, el); break; case 'mpg': flagdir(file, 'autompg', iconset, results, el); break; case 'mp3': flagdir(file, 'automp3', iconset, results, el); break; case 'shrink': flagdir(file, 'autoshrink', iconset, results, el); break; case 'shrinkr': flagdir(file, 'autoshrinkr', iconset, results, el); break; case 'decrypt': flagdir(file, 'autodecrypt', iconset, results, el); break; case 'decryptr': flagdir(file, 'autodecryptr', iconset, results, el); break; case 'resetnew': var url = '/browse/resetnew.jim?dir=' + file; $.get(url, function() { window.location.reload(true); }); break; default: alert('Unhandled action: ' + action); break; } }; // Bind context menu to opt+ image $('img.opt').contextMenu( { menu: 'optmenu', leftButton: true, beforeShow: preparemenu }, menuclick ); // Bind context menu to opt+ image $('img.oopt').contextMenu( { menu: 'ooptmenu', leftButton: true, beforeShow: preparemenu }, menuclick ); $('img.dopt').contextMenu( { menu: 'doptmenu', leftButton: true, beforeShow: preparedmenu }, dmenuclick ); $('img.doopt').contextMenu( { menu: 'dooptmenu', leftButton: true, beforeShow: preparedmenu }, dmenuclick ); // Disable items which are not yet implemented. $('#optmenu').disableContextMenuItems('#title'); var $buttons = { "Close" : function() {$(this).dialog('close');} }; var $buttonsp = $.extend( {"Play" : function() { doplay(); }}, $buttons); // Create reusable dialogue. var $dialog = $('#dialogue').dialog({ title: "Media Details", modal: false, autoOpen: false, height: 600, width: 700, show: 'scale', hide: 'fade', draggable: true, resizable: true, buttons: $buttons, close: function(e,u) { $('#dialogue').empty().html( 'loading'); } }); function doplay() { var file = $dialog.attr('file'); var type = $dialog.attr('type'); disableall(); window.location = '/play/play.jim?' + 'dir=' + encodeURIComponent(dir) + '&file=' + file; } // Bind dialogue open to filenames. $('a.bf').click(function(e) { e.preventDefault(); var file = $(this).attr('file'); var type = $(this).attr('type'); var opt = $(this).nextAll('a').find('img.opt'); var url = '/browse/file.jim?file=' + file + '&type=' + type; $dialog.load(url); $dialog.attr('file', file); $dialog.attr('type', type); if (type == 'ts' && (opt.attr('odencd') == 0 || opt.attr('dlna') == 1)) $dialog.dialog("option", "buttons", $buttonsp); else $dialog.dialog("option", "buttons", $buttons); $dialog.dialog('open'); }); $('#renameform').dialog({ autoOpen: false, height: 'auto', width: 'auto', modal: true, buttons: { "Update": rename_submit, "Close": function() { $(this).dialog('close'); } }, close: function() { $('#rename').val(''); } }); $('#drenameform').dialog({ autoOpen: false, height: 'auto', width: 'auto', modal: true, buttons: { "Update": drename_submit, "Close": function() { $(this).dialog('close'); } }, close: function() { $('#drename').val(''); } }); $('#aexpiry').dialog({ autoOpen: false, height: 'auto', width: 'auto', modal: true, buttons: { "Update": aexpiry_submit, "Close": function() { $(this).dialog('close'); } }, close: function() { $('#aexpiry_days').val('0'); } }); $('#savestreamform').dialog({ autoOpen: false, height: 'auto', width: 'auto', modal: true, buttons: { "Save": savestream_submit, "Cancel": function() { $(this).dialog('close'); } }, close: function() { $('#savestream_name').val(''); } }); $('#savestream_name').keyup(function(e) { if (e.keyCode == $.ui.keyCode.ENTER) savestream_submit(); }); $('#bmpdialogue').dialog({ autoOpen: false, height: 'auto', width: 'auto', modal: true, buttons: { "Close": function() { $(this).dialog('close'); } }, close: function() { $('#thmbmp').attr('src', 'about:blank'); } }); // Create re-usable confirmation dialogue. $confirm = $('#confirm').dialog({ modal: true, autoOpen: false, height: 160, width: 500, show: 'fade', hide: 'fade', draggable: false, resizable: false }); // Load folder sizes $.getJSON('/browse/sizes.jim?dir=' + encodeURIComponent(dir), folder_size_callback); // Flag shrunk recordings // $.getJSON('/browse/shrunk.jim?dir=' + encodeURIComponent(dir), // shrunk_callback); // Flag folders with unwatched items $.getJSON('/browse/newdir.jim?dir=' + encodeURIComponent(dir), new_folder_callback); // Load clipboard reloadclipboard(); // Uncheck everything $('input.fs:checked').prop('checked', false); // Buttons $('#dedup').button().click(function() { window.location = '/dedup/dedup.jim?dir=' + encodeURIComponent(dir); }); $('#save_stream').button().click(function() { $('#savestream_retrieving').show(); $('#savestream_detail').text('').hide(); $('#savestream_spin').hide(); $('#savestream_name').val('').enable(); $('#savestreamform').dialog('open'); $('#savestream_detail').load( '/browse/ffmpeg.jim?file=' + encodeURIComponent($('#save_stream').attr('file')), function() { $('#savestream_retrieving').hide(); $('#savestream_detail').show(); $('#savestream_form').show(); }); }); $('#selectall').click(function(e) { e.preventDefault(); $('input.fs').prop('checked', true).trigger('change'); }); $('#deselectall').click(function(e) { e.preventDefault(); $('input.fs:checked').prop('checked', false).trigger('change'); }); $('#join').button().disable() .click(function() { var files = new Array(); var els = $('input.fsts:checked + a').each(function() { files.push($(this).attr('file')); }); //console.log("%o", files); window.location.href = '/browse/join/join.jim?files=' + files.join(); }); $('#delete').button().disable() .click(function() { var files = new Array(); var els = $('input.fs:checked + a').each(function() { files.push(decodeURIComponent($(this).attr('file'))); }); //console.log("%o", files); var str = 'Are you sure you want to delete ' + files.length + ' file'; if (files.length != 1) str += 's'; str += '?'; if (confirm(str)) { disableall(); $('#deletewait').slideDown('slow'); $('#pwdialogue').dialog({ title: "Deleting", modal: true, autoOpen: true, height: 'auto', width: 'auto', show: 'scale', hide: 'fade', draggable: false, resizable: false, closeOnEscape: false, open: function() { $('.ui-dialog-titlebar-close').hide(); } }); $('#pwfeedback').load( '/browse/delete.jim', { 'dir': dir, 'files': files }, function() { $('#pwdialogue').dialog('close'); window.location.reload(true); }); } }); $('#copy,#cut').button().disable() .click(function() { var files = new Array(); var els = $('input.fs:checked + a').each(function() { files.push(decodeURIComponent($(this).attr('file'))); }); //console.log("%o", files); var action = $(this).attr('id'); if (action == 'copy' && !confirm('Are you sure? ' + 'Copying recordings can take a very long time!')) return; $.post('/browse/clipboard.jim', { 'act': 'add', 'dir': dir, 'mode': action, 'path': files }, function() { reloadclipboard(); $('input.fs:checked').prop('checked', false); }); }); $('#newdir').button().click(function() { $('#newdirform').dialog({ autoOpen: true, height: 'auto', width: 'auto', modal: true, buttons: { "Create": newdir_submit, "Cancel": function() { $(this).dialog('close'); } }, close: function() { $('#newdirname').val(''); } }); }); $('input.fs').change(function() { var num = $('input.fs:checked').size(); if (num > 0) $('#delete,#cut,#copy').enable(); else $('#delete,#cut,#copy').disable(); var num = $('input.fsts:checked').size(); if (num > 1) $('#join').enable(); else $('#join').disable(); }); var streamsize = 0; function checkstream() { $.get('/browse/streamsize.jim', function(size) { //console.log('Stream size: %o', size); var mb = size / (1024 * 1024); mb = mb|0; if (streamsize && size > streamsize) { rate = (size - streamsize) * 8.0 / (3 * 1048576); $('#streamstatus').text(mb + ' MiB (growing @' + rate.toFixed(2) + ' Mib/s)'); } else $('#streamstatus').text(mb + ' MiB'); streamsize = size; }); } if ($('#streamstatus').length) setInterval(checkstream, 3000); });