/** * @copyright Copyright (C) 2020. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt * @author Cedric Keiflin - http://www.template-creator.com - http://www.joomlack.fr */ var $ck = jQuery.noConflict(); $ck(document).ready(function(){ ckInitMenusManager(); $ck(document.body).append('<div id="ckwaitoverlay"></div>'); ckInitTogglers(); ckSetParentClass(); }); function ckSetParentClass() { $ck('ol#sortable li').each(function(i, item) { item = $ck(item); if (item.children('ol').children('li').length) { item.addClass('parent'); } else { item.removeClass('parent'); } }); } function ckInitTogglers() { $ck('.itemtoggler').not('.togglerdone').each(function() { $ck(this).click(function() { $ck($ck($ck(this).parents('li')[0]).find('.togglecontent')[0]).toggle('fast'); $ck(this).toggleClass('opened'); }); $ck(this).addClass('togglerdone'); }); } function ckInitMenusManager() { $ck('ol#sortable').nestedSortable({ forcePlaceholderSize: true, handle: '.ckmove', helper: 'clone', items: 'li', opacity: .6, placeholder: 'placeholder', revert: 250, tolerance: 'pointer', toleranceElement: '> div', maxLevels: 0, isTree: true, expandOnHover: 900, startCollapsed: true, rtl: false, update: function( event, ui ) { if ($ck(ui.item).attr('data-valid') == 'true' && !$ck(ui.sender).hasClass('ckmenuselectsortable')) ckUpdateNestedItems(); }, complete: function( event, ui ) { } }); $ck('.disclose').on('click', function() { $ck(this).closest('li').toggleClass('mjs-nestedSortable-collapsed').toggleClass('mjs-nestedSortable-expanded'); }); } function ckPublish(button) { if ($ck($ck(button).parents('li')[0]).attr('data-home') == '1') { alert(CKApi.Text._('CK_UNABLE_UNPUBLISH_HOME','CK_UNABLE_UNPUBLISH_HOME')); return; } button = $ck(button); var id = button.attr('data-id'); var state = button.attr('data-state'); if (button.hasClass('ckwait')) return; ckAddWaitIcon(button); var myurl = ACCORDEONMENUCK.BASE_URL + "&task=joomlamenu.ajaxPublish&" + ACCORDEONMENUCK.TOKEN; jQuery.ajax({ type: "POST", url: myurl, data: { id: id, state: state } }).done(function(code) { var result = JSON.parse(code); if (result.status == '1') { ckRemoveWaitIcon(button); var ids = result.ids.split(','); for (var i=0; i<ids.length; i++) { var resultid = ids[i]; ckRemoveWaitIcon($ck('#publish'+resultid)); ckUpdatePublishState(resultid, parseInt(state)); } } else { alert(result.message); } }).fail(function() { ckRemoveWaitIcon($ck('#publish'+id)); }); } function ckUpdatePublishIcon(id, state) { var button = $ck('#publish'+id); var buttonclass = (state == 1) ? 'fas fa-check' : 'fas fa-times-circle'; button.find('i').attr('class', buttonclass); } function ckUpdatePublishState(id, state) { button = $ck('#publish'+id); state = 1 - state; button.attr('data-state', state); ckUpdatePublishIcon(id, state); return state; } function ckAddWaitIcon(button) { var icon = button.find('i'); if (icon.hasClass('fa-spinner')) return; icon.attr('data-class', icon.attr('class')).attr('class', ''); icon.attr('class', 'fas fa-spin fa-spinner'); } function ckRemoveWaitIcon(button, failed) { var icon = button.find('i'); if (failed) { icon.attr('class','fas fa-exclamation-triangle'); } else { icon.attr('class', icon.attr('data-class')); } } function ckCheckin(el, id) { ckAddWaitIcon($ck('.checkedouticon', $ck(el).parent())); var myurl = ACCORDEONMENUCK.BASE_URL + "&task=joomlamenu.ajaxCheckin&" + ACCORDEONMENUCK.TOKEN; jQuery.ajax({ type: "POST", url: myurl, data: { id: id } }).done(function(code) { var result = JSON.parse(code); if (result.status == '1') { ckRemoveWaitIcon($ck('.checkedouticon', $ck(el).parent())); $ck(el).remove(); } else { ckRemoveWaitIcon($ck('.checkedouticon', $ck(el).parent()), true); alert(CKApi.Text._('CK_CHECKIN_NOT_UPDATED', 'CK_CHECKIN_NOT_UPDATED')); } }).fail(function() { alert(CKApi.Text._('CK_CHECKIN_FAILED', 'CK_CHECKIN_FAILED')); ckRemoveWaitIcon($ck('.checkedouticon', $ck(el).parent()), true); }); } function ckEditItem(btn) { var item = $ck($ck(btn).parents('li')[0]); var boxfooterhtml = '<a class="ckboxmodal-button" href="javascript:void(0);" onclick="ckSaveIframe(this, '+item.attr('data-id')+');CKBox.close(this, \'1\')">' + CKApi.Text._('CK_SAVE_CLOSE') + '</a>'; CKBox.open({handler: 'iframe', id: 'accordeonmenuckJoomlaMenuItem', footerHtml: boxfooterhtml, style: {padding: '10px'}, onCKBoxLoaded: function() {ckAddSaveBtnToIframe('accordeonmenuckJoomlaMenuItem')}, url: ACCORDEONMENUCK.URIROOT + '/administrator/index.php?option=com_menus&view=item&layout=edit&id='+item.attr('data-id')+'&tmpl=component'}); } function ckAddSaveBtnToIframe(boxId) { var iframe = $ck('#' + boxId).find('iframe'); iframe.load(function() { var iframeForm = iframe.contents().find('form'); if (! iframeForm.find('#saveBtn').length) { var saveHtml = '<button id="saveBtn" style="display:none;" onclick="Joomla.submitbutton(\'item.apply\');" type="button"></button>'; iframe.contents().find('form').prepend(saveHtml); } }); } function ckSaveIframe(btn, id) { var iframe = $ck('iframe', $ck($ck(btn).parents('.ckboxmodal')[0])).contents(); ckUdpateModuleTitle(id, iframe.find('#jform_title').val()); iframe.find('#saveBtn').click(); } function ckUdpateModuleTitle(id, title) { var el = $ck('#sortable li[data-id="'+id+'"]'); el.find('.cktitle').text(title); } function ckEditTitle(editbutton) { el = $ck('> div .cktitle', $ck($ck(editbutton).parents('li')[0])); txt = $ck(el).text().trim(); txt = txt.replace(/"/g, '\"') $ck(el).html('<input type="text" value="'+txt+'" style="width:150px;"/>'); $ck(el).attr('data-text-origin', txt); $ck('input', $ck(el)).focus(); $ck('.exittitle', $ck(el).parent()).show(); $ck('.edittitle', $ck(el).parent()).hide(); } function ckUpdateTitle(el) { txt = $ck('input', el).val(); if (txt && txt != $ck(el).attr('data-text-origin')) { ckSaveTitle($ck(el).attr('data-id'), txt, el); } if (txt) { $ck(el).html(txt); $ck('.exittitle', $ck(el).parent()).hide(); $ck('.edittitle', $ck(el).parent()).show(); } } function ckExitTitle(el) { txt = $ck(el).attr('data-text-origin'); if (txt) { $ck(el).html(txt); $ck('.exittitle', $ck(el).parent()).hide(); $ck('.edittitle', $ck(el).parent()).show(); } } function ckSaveTitle(id, title, el) { ckAddWaitIcon($ck('.edittitle', $ck(el).parent())); ckAddWaitIcon($ck('#ckmessage')); var myurl = ACCORDEONMENUCK.BASE_URL + "&task=joomlamenu.ajaxSaveTitle&" + ACCORDEONMENUCK.TOKEN; jQuery.ajax({ type: "POST", url: myurl, data: { id: id, title: title } }).done(function(code) { var result = JSON.parse(code); if (result.status == '1') { ckRemoveWaitIcon($ck('.edittitle', $ck(el).parent())); } else { ckRemoveWaitIcon($ck('.edittitle', $ck(el).parent()), true); ckRemoveWaitIcon($ck('#ckmessage')); $ck('#ckmessage').append(code); alert(CKApi.Text._('CK_TITLE_NOT_UPDATED', 'CK_TITLE_NOT_UPDATED')); } }).fail(function() { ckRemoveWaitIcon($ck('.edittitle', $ck(el).parent()), true); }); } function ckSaveDescription(btn) { var item = $ck($ck(btn).parents('li')[0]); var txt = btn.value; if (txt != $ck(btn).attr('data-text-origin')) { ckSaveparam(item.attr('data-id'), 'accordeonckparams_desc', txt, btn, true, 'ckSuccessDescription', Array(btn, txt)); } } function ckSuccessDescription(params) { $ck(params[0]).attr('data-text-origin', params[1]); } function ckSaveparam(id, param, value, btn, waiticon, callback, args) { if (!waiticon) waiticon = false; if (waiticon) ckAddWaitIcon($ck(btn)); var myurl = ACCORDEONMENUCK.BASE_URL + "&task=joomlamenu.ajaxSaveParam&" + ACCORDEONMENUCK.TOKEN; jQuery.ajax({ type: "POST", url: myurl, data: { id: id, param: param, value:value } }).done(function(code) { var result = JSON.parse(code); if (result.status == '1') { if (waiticon) ckRemoveWaitIcon($ck(btn), false); if (callback && typeof window[callback] == 'function') { if (!args) args = null;window[callback](args); } } else { if (waiticon) ckRemoveWaitIcon($ck(btn), true); alert(CKApi.Text._('CK_PARAM_NOT_UPDATED', 'CK_PARAM_NOT_UPDATED')); } }).fail(function() { alert(CKApi.Text._('CK_PARAM_UPDATE_FAILED', 'CK_PARAM_UPDATE_FAILED')); if (waiticon) ckRemoveWaitIcon($ck(btn), true); }); } function ckToggleColumn(btn) { $ck(btn).toggleClass('active'); var item = $ck($ck(btn).parents('li')[0]); if (item.attr('data-level') == '1') { alert(CKApi.Text._('CK_NO_COLUMN_ON_ROOT_ITEM', 'WARNING : You can not create a column on a root item, this will kill your layout !')); } ckSaveparam(item.attr('data-id'), 'accordeonckparams_createcolumn', $ck(btn).hasClass('active') ? '1' : '0', btn, true); } function ckChangeColWidth(btn) { var colwidth = prompt('Column width', $ck(btn).text()); if (colwidth == null) return; var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_colwidth', colwidth, btn, true); $ck(btn).text(colwidth); } function ckCreateNewRow(btn) { $ck(btn).toggleClass('active'); var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_createnewrow', $ck(btn).hasClass('active') ? '1' : '0', btn, true); } function ckChangeSubmenuWidth(btn) { var submenuwidth = prompt('Submenu width', $ck(btn).find('.valuetxt').text()); if (submenuwidth == null) return; var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_submenucontainerwidth', submenuwidth, btn, true); $ck(btn).find('.valuetxt').text(submenuwidth); if (submenuwidth != '') { $ck(btn).addClass('ckhastext'); } else { $ck(btn).removeClass('ckhastext'); } } function ckChangeSubmenuHeight(btn) { var submenuheight = prompt('Submenu height', $ck(btn).find('.valuetxt').text()); if (submenuheight == null) return; var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_submenucontainerheight', submenuheight, btn, true); $ck(btn).find('.valuetxt').text(submenuheight); if (submenuheight != '') { $ck(btn).addClass('ckhastext'); } else { $ck(btn).removeClass('ckhastext'); } } function ckChangeSubmenuLeftMargin(btn) { var submenuleftmargin = prompt('Submenu left margin', $ck(btn).find('.valuetxt').text()); if (submenuleftmargin == null) return; var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_leftmargin', submenuleftmargin, btn, true); $ck(btn).find('.valuetxt').text(submenuleftmargin); if (submenuleftmargin != '') { $ck(btn).addClass('ckhastext'); } else { $ck(btn).removeClass('ckhastext'); } } function ckChangeSubmenuTopMargin(btn) { var submenutopmargin = prompt('Submenu top margin', $ck(btn).find('.valuetxt').text()); if (submenutopmargin == null) return; var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_topmargin', submenutopmargin, btn, true); $ck(btn).find('.valuetxt').text(submenutopmargin); if (submenutopmargin != '') { $ck(btn).addClass('ckhastext'); } else { $ck(btn).removeClass('ckhastext'); } } function ckChangeFullwidthClass(btn) { $ck(btn).toggleClass('active').toggleClass('ckbutton-primary'); var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_liclass', $ck(btn).hasClass('active') ? '1' : '0', btn, true); } function ckToggleDesktopState(btn) { $ck(btn).toggleClass('disable'); var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_disabledesktop', $ck(btn).hasClass('disable') ? '1' : '0', btn, true); } function ckToggleMobileState(btn) { $ck(btn).toggleClass('disable'); var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_disablemobile', $ck(btn).hasClass('disable') ? '1' : '0', btn, true); } function ckSelectImage(id) { CKBox.open({handler: 'iframe', id: 'ckmodalbrowseimage', url: 'index.php?option=com_accordeonmenuck&view=browse&type=image&func=ckSetImage&field='+id+'&tmpl=component'}); } function ckSetImage(image_url, fieldid) { var btn = '#'+fieldid; var item = $ck($ck(btn).parents('li')[0]); var title = $ck(btn).attr('data-original-title'); var tmp = $ck('<div />').append(title); var rep = tmp.find('img').attr('src'); if (tmp.find('img').length) { $ck(btn).attr('data-original-title', $ck(btn).attr('data-original-title').replace(rep, ACCORDEONMENUCK.URIROOT + '/' + image_url)); } else { $ck(btn).attr('data-original-title', title + '<br /><img src="' + ACCORDEONMENUCK.URIROOT + '/' + image_url + '" class="cktip-img-preview" />'); } ckSaveparam(item.attr('data-id'), 'menu_image', image_url, btn, true); $ck(btn).addClass('active'); CKBox.close('#ckmodalbrowseimage'); } function ckRemoveImage(btn) { if (!confirm(CKApi.Text._('CK_CONFIRM_DELETE','CK_CONFIRM_DELETE'))) return; var item = $ck($ck(btn).parents('li')[0]); var title = $ck(btn).prev().attr('data-original-title'); var pos = title.indexOf('<br />'); ckSaveparam(item.attr('data-id'), 'menu_image', '', $ck(btn).prev(), true); $ck(btn).prev().attr('data-original-title', title.substring(0, pos)).removeClass('active'); } function ckSelectIcon(id) { CKBox.open({handler: 'iframe', id: 'ckmodalicons', url: 'index.php?option=com_accordeonmenuck&view=icons&func=ckSetIcon&field='+id+'&tmpl=component'}); } function ckSetIcon(iclass, fieldid) { var btn = '#'+fieldid; var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_icon', iclass, btn, true, 'ckSuccessIcon', Array(fieldid, iclass)); CKBox.close('#ckmodalicons'); } function ckSuccessIcon(params) { jQuery('#'+params[0]).addClass('active').find('span').attr('class', params[1]); } function ckRemoveIcon(btn) { if (!confirm(CKApi.Text._('CK_CONFIRM_DELETE','CK_CONFIRM_DELETE'))) return; var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_icon', '', $ck(btn).prev(), true); $ck(btn).prev().removeClass('active').find('span').removeAttr('class'); } function ckSelectModule(id) { CKBox.open({handler: 'iframe', id: 'ckmodalmodules', url: 'index.php?option=com_accordeonmenuck&view=items&type=module&func=ckSetModule&field='+id+'&tmpl=component'}); } function ckSetModule(type, id, title, fieldid) { var btn = '#'+fieldid; var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_insertmodule', '1', btn, true); ckSaveparam(item.attr('data-id'), 'accordeonckparams_module', id, btn, true, 'ckSuccessModule', Array(fieldid, id, title)); CKBox.close('#ckmodalmodules'); } function ckSuccessModule(params) { var module = jQuery.parseJSON(params[1]); var btn = jQuery('#'+params[0]); btn.addClass('ckhastext'); btn.find('.modulename').html('<span class="moduleid">' + params[1] + '</span> ' + params[2]); btn.addClass('active'); } function ckRemoveModule(btn) { if (!confirm(CKApi.Text._('CK_CONFIRM_DELETE','CK_CONFIRM_DELETE'))) return; var item = $ck($ck(btn).parents('li')[0]); ckSaveparam(item.attr('data-id'), 'accordeonckparams_insertmodule', '', $ck(btn).prev(), true); $ck(btn).prev().removeClass('active').removeClass('ckhastext').find('.modulename').text(''); } function ckUpdateNestedItems() { var saveLevelLaunched = 0; $ck('ol#sortable li').attr('data-leveltmp', '1').attr('data-parenttmp','1'); $ck('ol#sortable li').each(function() { var item = $ck(this); if (item.children('ol').length) { $ck('li', item).attr('data-leveltmp', parseInt(item.attr('data-leveltmp'))+1).attr('data-parenttmp', item.attr('data-id')); } if (item.attr('data-leveltmp') != item.attr('data-level') || item.attr('data-parenttmp') != item.attr('data-parent')) { ckSaveItemLevel(item.attr('data-id'), item.attr('data-leveltmp'), item.attr('data-parenttmp')); saveLevelLaunched = 1; } }); ckSaveItemsOrder(); } function ckSaveItemLevel(id, level, parentid) { ckAddWaitOverlay(); var myurl = ACCORDEONMENUCK.BASE_URL + "&task=joomlamenu.ajaxSaveLevel&" + ACCORDEONMENUCK.TOKEN; jQuery.ajax({ type: "POST", url: myurl, async: true, data: { id: id, level: level, parentid: parentid } }).done(function(code) { if (code == '1') { $ck('#ckmessage > div').empty().append('<div class="alert alert-success">Items order saved with success</div>').fadeOut(3000); $ck('ol#sortable li[data-id='+id+']').attr('data-level', level).attr('data-parent', parentid); } else { alert(CKApi.Text._('CK_LEVEL_NOT_UPDATED', 'CK_LEVEL_NOT_UPDATED')+code); } }).fail(function() { alert(CKApi.Text._('CK_SAVE_LEVEL_FAILED', 'CK_SAVE_LEVEL_FAILED')); }); } function ckSaveItemsOrder() { ckAddWaitOverlay(); var cid_array = new Array(); var order_array = new Array(); var lft_array = new Array(); var rgt_array = new Array(); var lft = 1, rgt = 2; $ck('ol#sortable li:first-child').attr('lft', lft).attr('rgt', rgt); $ck('ol#sortable li').each(function(k, item) { item = $ck(item); if (item.prev('li').length) { item.attr('lft', parseInt(item.prev('li').attr('rgt'))+1).attr('rgt', parseInt(item.prev('li').attr('rgt'))+2); } if (item.children('ol').length) { item.attr('rgt', parseInt(item.attr('lft'))+$ck('li', item).length*2+1); $ck('> ol > li', item).attr('lft', parseInt(item.attr('lft'))+1).attr('rgt', parseInt(item.attr('lft'))+2); } cid_array.push($ck(this).attr('data-id')); order_array.push(k); lft_array.push($ck(this).attr('lft')); rgt_array.push($ck(this).attr('rgt')); }); var myurl = ACCORDEONMENUCK.BASE_URL + "&task=joomlamenu.ajaxSaveOrder&" + ACCORDEONMENUCK.TOKEN; jQuery.ajax({ type: "POST", url: myurl, data: { cid: cid_array, order: order_array, lft: lft_array, rgt: rgt_array } }).done(function(code) { if (code == '1') { ckRemoveWaitOverlay($ck('#ckmessage')); $ck('#ckmessage > div').empty().show().append('<div class="alert alert-success">Items order saved with success</div>').fadeOut(3000); } else { ckRemoveWaitOverlay($ck('#ckmessage')); alert(CKApi.Text._('CK_SAVE_ORDER_FAILED', 'CK_SAVE_ORDER_FAILED')+code); } ckSetParentClass(); }).fail(function() { ckRemoveWaitOverlay($ck('#ckmessage')); }); } function ckAddWaitOverlay() { $ck('#ckwaitoverlay').show(); } function ckRemoveWaitOverlay() { $ck('#ckwaitoverlay').hide(); } function ajaxSetStype(title, type, component, view, parentId, parentLevel, prevItemId, alias, dataId, dataLayout, dataController, category_id, dataAttribs) { // null here, only used in Menu Manager CK } function ajaxSaveItem(data64, title, type, component, view, alias, parentId, parentLevel, prevItemId, dataId) { // null here, only used in Menu Manager CK } function ajaxTrashItem(id) { // null here, only used in Menu Manager CK } function createItem(id, title, type, parentId, parentLevel, prevItemId) { // null here, only used in Menu Manager CK }