jQuery(document).ready(function () { jQuery('.cb-ids').change(function () { if (jQuery(this).is(':checked')) { jQuery(this).closest('tr').addClass('selected'); } else { jQuery(this).closest('tr').removeClass('selected'); } }); jQuery('th input:checkbox').change(function () { if (jQuery(this).is(':checked')) { jQuery('#ThumbsTable tbody tr').addClass('selected'); } else { jQuery('#ThumbsTable tbody tr').removeClass('selected'); } }); jQuery('input.current-page').bind('keypress', {}, function (e) { var code = (e.keyCode ? e.keyCode : e.which); if (code == 13) {//Enter keycode e.preventDefault(); jQuery(location).attr('href', '?' + jQuery.param(jQuery.extend(URL_params, {sheet: this.value}))); } }); jQuery('select.limit_per_page').change(function () { jQuery(location).attr('href', '?' + jQuery.param(jQuery.extend(URL_params, {limit: this.value}))); }); jQuery('#thumbnail-management-tab').submit(function (event) { event.preventDefault(); if (jQuery('.cb-ids:checked').length > 0) { var a = jQuery(this).attr('action'); var b = jQuery(this).serialize() + '&document_gallery%5Bajax%5D=true' + '&document_gallery%5Bcleanup%5D=true'; jQuery('.deleteSelected').addClass('waiting').attr('disabled', 'disabled'); jQuery.post(a, b, function (reply) { if (reply.result) { var result = reply.deleted; for (var index in result) { jQuery('input[type=checkbox][value=' + result[index] + ']').closest('tr').fadeOut('slow', 0.00, function () { jQuery(this).slideUp('slow', function () { jQuery(this).remove(); }); }); } } jQuery('.deleteSelected').removeClass('waiting').removeAttr('disabled'); }).fail(function () { console.log('Problem in reaching the server'); jQuery('.deleteSelected').removeClass('waiting').removeAttr('disabled'); }); } return false; }); jQuery('#advanced-tab #options-dump').click(function () { jQuery(this).select(); }); function toggleSpoiler() { var sel = getSelection().toString(); if (!sel) { jQuery(this).next().slideToggle('slow'); jQuery(this).find('.dashicons').toggleClass('dashicons-arrow-down-alt2 dashicons-arrow-up-alt2'); jQuery(this).toggleClass('expander collapser'); jQuery(this).attr('title', (jQuery(this).hasClass('expander') ? 'Click to Expand' : 'Click to Collapse')); } } jQuery('.expander').click(toggleSpoiler); if (jQuery('.spoiler-body').length) { jQuery('.expandAll, .collapseAll').addClass('button'); jQuery('.expandAll').click(function (e) { e.preventDefault(); jQuery('.expander').trigger('click'); }); jQuery('.collapseAll').click(function (e) { e.preventDefault(); jQuery('.collapser').trigger('click'); }); } jQuery('.levelSelector input').change(function () { if (jQuery(this).val() == 'all') { jQuery('.levelSelector input').not("[value='all']").prop('checked', jQuery(this).is(':checked')); jQuery(this).is(':checked') ? jQuery('#LogTable tbody tr').show() : jQuery('#LogTable tbody tr').hide(); } else { jQuery(this).is(':checked') ? jQuery('#LogTable tbody tr:has(span.' + jQuery(this).val() + ')').show() : jQuery('#LogTable tbody tr:has(span.' + jQuery(this).val() + ')').hide(); if ((jQuery('.levelSelector input:checked').not("[value='all']").length + 1) == jQuery('.levelSelector input[type="checkbox"]').length) { jQuery('.levelSelector input[value="all"]').prop('checked', true); } else { jQuery('.levelSelector input[value="all"]').prop('checked', false); } } }); jQuery('#LogTable .manage-column.column-date').click(function () { jQuery(this).toggleClass('asc desc'); var table = jQuery('#LogTable > tbody'); var rows = table.children('tr'); table.append(rows.get().reverse()); }); function DragDropFilesStop(e) { e = e || event; if (e.dataTransfer.types) { //Testing if dragenter/dragover Event Contains Files - http://css-tricks.com/snippets/javascript/test-if-dragenterdragover-event-contains-files/ for (var i = 0; i < e.dataTransfer.types.length; i++) { if (e.dataTransfer.types[i] == 'Files') { //Or maybe it is better just to test e.dataTransfer.files[0].name - http://stackoverflow.com/a/12622904/3951387 //NO: before drop the list is not accessible e.stopPropagation(); e.preventDefault(); e.dataTransfer.dropEffect = 'none'; break; } } //jQuery way - Not working /*if (jQuery.inArray('Files', e.dataTransfer.types)) { e.stopPropagation(); e.preventDefault(); e.dataTransfer.dropEffect = 'none'; }*/ } } //Preventing browser from acting on drag&dropped files beside the dedicated areas window.addEventListener('dragover', DragDropFilesStop, false); window.addEventListener('drop', DragDropFilesStop, false); function handleDragOver(e) { e = e || event; if (e.originalEvent.dataTransfer.types) { for (var i = 0; i < e.originalEvent.dataTransfer.types.length; i++) { if (e.originalEvent.dataTransfer.types[i] == 'Files') { e.stopPropagation(); e.preventDefault(); //Have to exploit broker to access standart properties while using jQuery to bind handlers - http://stackoverflow.com/a/14792183/3951387 e.originalEvent.dataTransfer.dropEffect = 'move'; return false; } } } } //Firing HTML5 DragLeave only when all the DragEnter'ed child elements were DragLeave'd - http://stackoverflow.com/a/21002544 //Had to change in favour of http://stackoverflow.com/questions/10253663/ because of issues with FireFox var counter = {}; function handleDragEnter(e) { // this / e.target is the current hover target. e = e || event; if (e.originalEvent.dataTransfer.types) { for (var i = 0; i < e.originalEvent.dataTransfer.types.length; i++) { if (e.originalEvent.dataTransfer.types[i] == 'Files') { this.classList.add('dragover'); counter[jQuery(this).data('entry')] = counter[jQuery(this).data('entry')].add(jQuery(e.target)); break; } } } } function handleDragLeave(e) { e = e || event; if (e.originalEvent.dataTransfer.types) { for (var i = 0; i < e.originalEvent.dataTransfer.types.length; i++) { if (e.originalEvent.dataTransfer.types[i] == 'Files') { counter[jQuery(this).data('entry')] = counter[jQuery(this).data('entry')].not(e.target); if (counter[jQuery(this).data('entry')].length === 0) { this.classList.remove('dragover');// this / e.target is previous target element. } break; } } } } function handleDrop(e) { e = e || event; if (e.originalEvent.dataTransfer.types) { for (var i = 0; i < e.originalEvent.dataTransfer.types.length; i++) { if (e.originalEvent.dataTransfer.types[i] == 'Files') { e.stopPropagation();// Stops some browsers from redirecting. e.preventDefault(); processFiles(e.originalEvent.dataTransfer.files, jQuery(this).data('entry')); counter[jQuery(this).data('entry')] = jQuery(); this.classList.remove('dragover'); break; } } } } function handleBrowseButton(e) { e = e || event; processFiles(e.target.files, jQuery(this).closest('tr').data('entry')); //Was thinking about purging input:file control - http://stackoverflow.com/questions/1043957/clearing-input-type-file-using-jquery //Decided just to get rid of name properties thus such controls wouldn't be taken into consideration during form submit or processed with FormData } function processFiles(files, entry) { for (var i = 0, f; f = files[i]; i++) { //Processing only first qualifying file if (f.type.indexOf('image/') == 0 && typeof dg_admin_vars.upload_limit != 'undefined' && f.size <= parseInt(dg_admin_vars.upload_limit)) { var target, theRow = jQuery('[data-entry=' + entry + ']'); var formData = new FormData(theRow.closest('form')[0]); var thumbMgmtTab = jQuery('#thumbnail-management-tab'); if (thumbMgmtTab.length) { target = thumbMgmtTab.attr('action'); } else { target = ajaxurl; formData.append('action', 'dg_upload_thumb'); } formData.append('document_gallery[entry]', entry); formData.append('document_gallery[ajax]', 'true'); formData.append('document_gallery[upload]', 'true'); formData.append('file', f); var xhr = new XMLHttpRequest(); xhr.open('POST', target); var theImg = theRow.find('.column-icon img'); var progressBarValue = theRow.find('.progress > *:first'); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status == 200 && xhr.responseText.indexOf("\n") == -1) { jQuery(progressBarValue).parent().addClass('success'); var response = jQuery.parseJSON(xhr.responseText); if (response.result) { // check if generated thumbnail has the same url if (response.url === theImg.attr('src')) { theImg.attr('src', theImg.attr('src') + '?' + new Date().getTime()); } else { theImg.attr('src', response.url); } } } else { jQuery(progressBarValue).parent().addClass('fail'); console.log('Invalid response from server:'); console.log(xhr.responseText); } setTimeout(function () { theRow.find('.column-thumbupload > *').toggleClass('invis'); jQuery(progressBarValue).parent().removeClass('success fail'); }, 5000); } }; xhr.onload = function () { progressBarValue.width('100%'); }; xhr.upload.onprogress = function (event) { if (event.lengthComputable) { var complete = (event.loaded / event.total * 100 | 0); progressBarValue.width(complete + '%'); } }; progressBarValue.width(0); theRow.find('.column-thumbupload > *').toggleClass('invis'); xhr.send(formData); break; } else { console.log('Attempt to upload improper file %c' + f.name + ':', 'font-weight:bold;'); if (f.type.indexOf('image/') != 0) { console.log('\tIs not an image - ' + f.type); } if (typeof dg_admin_vars.upload_limit != 'undefined' && f.size > parseInt(dg_admin_vars.upload_limit)) { console.log('\tIs too big - ' + f.size + 'b; (Limit is ' + dg_admin_vars.upload_limit + 'b)'); } } } } // Prepairing all the drop-zones on page load jQuery('#ThumbsTable tbody tr').each(function () { jQuery(this) .on('dragenter', handleDragEnter) .on('dragover', handleDragOver) .on('dragleave', handleDragLeave) .on('drop', handleDrop); counter[jQuery(this).data('entry')] = jQuery(); jQuery(this).find('input:button').on('click', function () { jQuery(this).prevAll('input:file').click(); }); jQuery(this).find('input:file').on('change', handleBrowseButton); }); //Checking Drag&Drop support //Structure is Not supported in Chrome's WebKit /*if (!('files' in DataTransfer.prototype)) {//Determine presence of HTML5 drag'n'drop file upload API - http://stackoverflow.com/a/2312859/3951387 jQuery('.html5dndmarker').hide(); }*/ if (!('draggable' in document.createElement('span'))) { jQuery('.html5dndmarker').hide(); } jQuery('td .dashicons-edit').click(function () { var cell = jQuery(this).closest('td'); if (cell.hasClass('column-title')) { if (cell.find('a').css('display') == 'none') { return; } cell.find('a').hide().after(''); cell.find('input').focus(); } else if (cell.hasClass('column-description')) { if (cell.find('.editable-description').css('display') == 'none') { return; } cell.find('.editable-description').hide().after(''); cell.find('textarea').focus(); } else { return; } jQuery(this).css('visibility', 'hidden'); cell.find('.edit-controls').show(); }); jQuery('.edit-controls .dashicons-no').click(function () { var cell = jQuery(this).closest('td'); if (cell.hasClass('column-title')) { if (cell.find('a').css('display') != 'none') { return; } cell.find('input').fadeOut('fast', function () { jQuery(this).remove(); cell.find('a').fadeIn('fast'); }); } else if (cell.hasClass('column-description')) { if (cell.find('.editable-description').css('display') != 'none') { return; } cell.find('textarea').fadeOut('fast', function () { jQuery(this).remove(); cell.find('.editable-description').fadeIn('fast'); }); } else { return; } jQuery(this).closest('.edit-controls').hide(); cell.find('.dashicons-edit').css('visibility', 'visible'); }); jQuery('.edit-controls .dashicons-yes').click(function () { var cell = jQuery(this).closest('td'); var entry = jQuery(this).closest('tr').data('entry'); var target = jQuery('#thumbnail-management-tab').attr('action'); var formData = new FormData(jQuery('[data-entry=' + entry + ']').closest('form')[0]); formData.append('document_gallery[entry]', entry); formData.append('document_gallery[ajax]', 'true'); var newContent, updateGoal; if (cell.hasClass('column-title')) { newContent = cell.find('input'); updateGoal = cell.find('.editable-title'); formData.append('document_gallery[title]', encodeURIComponent(newContent.val())); } else if (cell.hasClass('column-description')) { newContent = cell.find('textarea'); updateGoal = cell.find('.editable-description'); formData.append('document_gallery[description]', encodeURIComponent(newContent.val())); } else { return; } if (newContent.val() == updateGoal.text() || ( cell.hasClass('column-description') && newContent.val() == updateGoal.html() )) { jQuery(this).next('.dashicons-no').click(); return; } var xhr = new XMLHttpRequest(); xhr.open('POST', target); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { cell.addClass('trans'); cell.find('.edit-controls').removeClass('waiting'); if (xhr.responseText.indexOf("\n") == -1) { var response = jQuery.parseJSON(xhr.responseText); if (response.result) { if (cell.hasClass('column-description')) { updateGoal.html(newContent.val()); } else { updateGoal.text(newContent.val()); } cell.find('.dashicons-no').click(); cell.addClass('responseSuccess').delay(2000).queue(function () { jQuery(this).removeClass('responseSuccess').dequeue(); }).delay(1100).queue(function () { jQuery(this).removeClass('trans').dequeue(); }); } else { shake(newContent); cell.addClass('responseFail').delay(1100).queue(function () { jQuery(this).removeClass('responseFail').dequeue(); }).delay(1100).queue(function () { jQuery(this).removeClass('trans').dequeue(); }); } } else { shake(newContent); cell.addClass('responseFail').delay(1100).queue(function () { jQuery(this).removeClass('responseFail').dequeue(); }).delay(1100).queue(function () { jQuery(this).removeClass('trans').dequeue(); }); console.log('Invalid response from server:'); console.log(xhr.responseText); } } }; jQuery(this).closest('.edit-controls').addClass('waiting'); xhr.send(formData); }); function shake(target) { var offset = 4; for (var i = 0; i < 6; i++) { target.animate({'margin-left': "+=" + ( offset = -offset ) + 'px'}, 50); } } });