/* editModal functions */
RSFormPro.editModal = {
selector: '#editModal',
attached: false,
disableButton: function() {
jQuery(this.selector).find('.btn-primary').prop('disabled', true);
},
enableButton: function() {
jQuery(this.selector).find('.btn-primary').prop('disabled', false);
},
getFormFields: function() {
return jQuery(this.selector).find('input, select, textarea').serializeArray();
},
open: function() {
if (!this.attached)
{
this.attached = true;
var selector = this.selector;
if (RSFormPro.isJ4)
{
// Solve TinyMCE + BS5 issues
document.addEventListener('focusin', function (e) {
if (e.target.closest('.tox-tinymce-aux, .moxman-window, .tam-assetmanager-root') !== null) {
e.stopImmediatePropagation();
}
});
}
var func = function() {
if (!RSFormPro.isJ4)
{
// Solves issues with TinyMCE dialogs inside a Bootstrap 2.3.2 Modal
jQuery(document).off('focusin.modal');
}
else
{
// TinyMCE + Firefox + Paciu issues - this solves it
try {window.dispatchEvent(new Event('resize')); } catch (err) {}
}
var field = document.getElementById('NAME');
if (typeof field === 'object' && field.getAttribute('type') === 'text')
{
field.focus();
}
else
{
field = document.getElementById('CAPTION');
if (typeof field === 'object')
{
field.focus();
}
}
}
jQuery(selector).on('shown.bs.modal', func);
}
jQuery(this.selector).modal('show');
},
close: function() {
jQuery(this.selector).modal('hide');
// Doing this to prevent editors from showing 'data entered on the page may not be saved'
window.onbeforeunload = function() {};
},
save: function() {
var componentType = parseInt(jQuery('#COMPONENTTYPE').val());
processComponent(componentType);
},
display: function(componentTypeId, componentId) {
// Let's add a title to our modal
var $component = jQuery('#rsfpc' + componentTypeId);
if ($component.length > 0)
{
jQuery(this.selector).find('.modal-header h3').text($component.text());
if (!componentId)
{
$component.addClass('rsform_loading_btn');
}
}
var urlParams = {
option: 'com_rsform',
task: 'components.display',
componentType: componentTypeId,
formId: jQuery('#formId').val(),
format: 'raw'
};
if (componentId > 0)
{
urlParams.componentId = componentId;
document.getElementById('componentIdToEdit').value = componentId;
}
else
{
document.getElementById('componentIdToEdit').value = -1;
}
jQuery.ajax({
url: 'index.php',
data: urlParams,
beforeSend: function() {
stateLoading();
},
complete: function() {
stateDone();
},
success: function(responseText) {
$component.removeClass('rsform_loading_btn');
var response = responseText.split('{rsfsep}');
var tabTitle, tabContent;
var editorContainer = jQuery('#rsfp-editor-container');
var editorValue;
editorContainer.addClass('rsfp-hidden');
// Display tabs
for (var r = 0; r < response.length; r++)
{
tabTitle = jQuery(RSFormPro.getTab(r));
tabContent = jQuery('#rsfptab' + r);
tabTitle.show();
if (r === 3)
{
editorValue = '';
if (jQuery(response[r]).find('#TEXT').length > 0)
{
editorContainer.removeClass('rsfp-hidden');
editorValue = jQuery(response[r]).find('#TEXT').val();
}
try {
Joomla.editors.instances['TEXT'].setValue(editorValue);
} catch (err) {}
}
else
{
tabContent.html(response[r]);
}
if (response[r].trim() === '')
{
tabTitle.hide();
}
}
// Switch to 1st tab.
RSFormPro.switchTab(0);
changeValidation(document.getElementById('VALIDATIONRULE'));
var $fields = jQuery('[data-properties="oneperline"], [data-properties="toggler"]');
var $object = {};
jQuery.each($fields, function () {
var $name = jQuery(this).attr('id');
$object[$name] = {
selector: $name
};
if (jQuery(this).attr('data-properties') === 'toggler') {
$object[$name].data = jQuery.parseJSON( jQuery(this).attr('data-toggle') );
}
});
jQuery('#rsfp-tabs').trigger('renderedLayout', $object);
RSFormPro.editModal.open();
}
});
}
};
/* formTabs */
jQuery.formTabs = {
tabTitles: {},
tabContents: {},
build: function (startindex) {
this.each(function (index, el) {
var tid = jQuery(el).attr('id');
jQuery.formTabs.grabElements(el,tid);
jQuery.formTabs.makeTitlesClickable(tid);
jQuery.formTabs.setAllContentsInactive(tid);
jQuery.formTabs.setTitleActive(startindex,tid);
jQuery.formTabs.setContentActive(startindex,tid);
});
},
grabElements: function(el,tid) {
var children = jQuery(el).children();
children.each(function(index, child) {
if (index == 0)
jQuery.formTabs.tabTitles[tid] = jQuery(child).find('a');
else if (index == 1)
jQuery.formTabs.tabContents[tid] = jQuery(child).children();
});
},
setAllTitlesInactive: function (tid) {
this.tabTitles[tid].each(function(index, title) {
jQuery(title).removeClass('active');
});
},
setTitleActive: function (index,tid) {
index = parseInt(index);
if (tid == 'rsform_properties_tab') document.getElementById('ptab').value = index;
jQuery(this.tabTitles[tid][index]).addClass('active');
},
setAllContentsInactive: function (tid) {
this.tabContents[tid].each(function(index, content) {
jQuery(content).addClass('rsfp-hidden');
});
},
setContentActive: function (index,tid) {
index = parseInt(index);
jQuery(this.tabContents[tid][index]).removeClass('rsfp-hidden');
jQuery(this.tabContents[tid][index]).trigger('formtabs.shown');
try { window.dispatchEvent(new Event('resize')); } catch (err) {}
},
makeTitlesClickable: function (tid) {
this.tabTitles[tid].each(function(index, title) {
jQuery(title).on('click', function () {
if (jQuery(this).css('cursor') == 'not-allowed')
{
// Do nothing if we've "disabled" the button
return false;
}
jQuery.formTabs.setAllTitlesInactive(tid);
jQuery.formTabs.setTitleActive(index,tid);
jQuery.formTabs.setAllContentsInactive(tid);
jQuery.formTabs.setContentActive(index,tid);
});
});
}
};
jQuery.fn.extend({
formTabs: jQuery.formTabs.build
});
RSFormPro.offcanvas = {
element: null,
selector: 'offcanvasFields',
open: function (element) {
if (typeof document.adminForm.rowIndex !== 'undefined')
{
document.adminForm.removeChild(document.adminForm.rowIndex);
}
if (typeof document.adminForm.columnIndex !== 'undefined')
{
document.adminForm.removeChild(document.adminForm.columnIndex);
}
if (element)
{
var $element = jQuery(element);
var $column = $element.parents('.rsfp-grid-column');
var $row = $element.parents('.rsfp-grid-row');
var rowIndex = jQuery('.rsfp-grid-row').index($row);
var columnIndex = $row.children('.rsfp-grid-column').index($column);
var rowIndexInput = document.createElement('input');
rowIndexInput.type = 'hidden';
rowIndexInput.name = 'rowIndex';
rowIndexInput.value = rowIndex;
var columnIndexInput = document.createElement('input');
columnIndexInput.type = 'hidden';
columnIndexInput.name = 'columnIndex';
columnIndexInput.value = columnIndex;
document.adminForm.appendChild(rowIndexInput);
document.adminForm.appendChild(columnIndexInput);
}
if (RSFormPro.isJ4)
{
if (!RSFormPro.offcanvas.element)
{
RSFormPro.offcanvas.element = new bootstrap.Offcanvas('#' + RSFormPro.offcanvas.selector);
}
RSFormPro.offcanvas.element.show();
}
else
{
document.getElementById(RSFormPro.offcanvas.selector).classList.remove('hiding');
document.getElementById(RSFormPro.offcanvas.selector).classList.add('showing');
var backdrop = document.querySelector('.offcanvas-backdrop');
if (!backdrop)
{
backdrop = document.createElement('div');
backdrop.classList.add('offcanvas-backdrop');
backdrop.classList.add('fade');
backdrop.onclick = function() { RSFormPro.offcanvas.hide(); }
document.body.appendChild(backdrop);
}
backdrop.classList.add('show');
}
},
hide: function() {
if (RSFormPro.isJ4)
{
if (!RSFormPro.offcanvas.element)
{
RSFormPro.offcanvas.element = new bootstrap.Offcanvas('#' + RSFormPro.offcanvas.selector);
}
RSFormPro.offcanvas.element.hide();
}
else
{
document.getElementById(RSFormPro.offcanvas.selector).classList.remove('showing');
document.getElementById(RSFormPro.offcanvas.selector).classList.add('hiding');
var backdrop = document.querySelector('.offcanvas-backdrop');
if (backdrop)
{
backdrop.classList.remove('show');
}
backdrop.parentNode.removeChild(backdrop);
}
}
};
/* gridModal functions */
RSFormPro.gridModal = {
selector: '#gridModal',
params: [],
open: function(element, is_new_row) {
this.params = [element, is_new_row];
jQuery(this.selector).modal('show');
},
close: function() {
jQuery(this.selector).modal('hide');
},
save: function(new_columns) {
var element = this.params[0],
row = jQuery(element).parents('.rsfp-grid-row'),
columns = row.children('.rsfp-grid-column'),
size = new_columns[0],
is_new_row = typeof this.params[1] != 'undefined' ? this.params[1] : false;
var diff, i;
// Added new row
if (is_new_row)
{
row.after([
'<div class="rsfp-grid-row">',
'<div class="rsfp-grid-column rsfp-grid-column' + size + '">',
'<h3>' + size + '/12</h3>',
'</div>',
'<div class="clearfix"></div>',
'<div class="rsfp-row-controls">',
'<button type="button" class="btn btn-secondary" onclick="RSFormPro.gridModal.open(this);">' + Joomla.JText._('RSFP_ROW_OPTIONS') + '</button>',
'<button type="button" class="btn btn-success" onclick="RSFormPro.gridModal.open(this, true);">' + Joomla.JText._('RSFP_ADD_NEW_ROW') + '</button>',
'<button type="button" class="btn btn-danger" onclick="RSFormPro.Grid.deleteRow(this);">' + Joomla.JText._('RSFP_DELETE_ROW') + '</button>',
'</div>',
'</div>'
].join("\n"));
row = row.next('.rsfp-grid-row');
columns = row.children('.rsfp-grid-column');
}
// Process only if we've changed column sizes or if we've added a new row
if (columns.length != new_columns.length || is_new_row)
{
columns.removeClass(function(index, className) {
return (className.match(/(^|\s)rsfp-grid-column\S+/g) || []).join(' ');
}).removeClass('rsfp-grid-column-unresizable');
// Add new class
columns.addClass('rsfp-grid-column' + size);
// Change h3 text
columns.find('h3').text(size + '/12');
// We've selected a layout with more columns, just add empty columns
if (columns.length < new_columns.length)
{
diff = new_columns.length - columns.length;
for (i = 0; i < diff; i++)
{
// Refresh
columns = row.children('.rsfp-grid-column');
columns.last().after('<div class="rsfp-grid-column rsfp-grid-column' + size + '"><h3>' + size + '/12</h3></div>');
}
}
// We've selected a layout with fewer columns, must move fields inside closest column
else if (columns.length > new_columns.length)
{
diff = columns.length - new_columns.length;
for (i = 0; i < diff; i++)
{
// Refresh
columns = row.children('.rsfp-grid-column');
// Grab fields from last column and add them to the previous - keep doing that until we reach the last column
columns.last().prev('.rsfp-grid-column').append(
columns.last().children('.rsfp-grid-field')
);
columns.last().remove();
}
}
// Refresh number of columns
columns = row.children('.rsfp-grid-column');
// Remove 'Add Field' button to re-create it in each column
columns.find('.rsfp-grid-add-field').remove();
columns.find('h3').after('<div class="rsfp-grid-add-field"><button type="button" class="btn btn-secondary" onclick="RSFormPro.offcanvas.open(this);"><i class="icon-plus"></i> ' + Joomla.JText._('COM_RSFORM_ADD_FIELD') + '</button></div>');
// Last one must be unresizable
columns.last().addClass('rsfp-grid-column-unresizable');
}
RSFormPro.Grid.initialize();
this.close();
}
};
RSFormPro.Grid = {
// Make rows sortable (Y axis)
currentSortableRowsObj: false,
sortableRows: function() {
var rows = jQuery('#rsfp-grid-row-container');
if (this.currentSortableRowsObj)
{
try
{
this.currentSortableRowsObj.sortable('destroy');
}
catch (err){}
}
this.currentSortableRowsObj = rows.sortable({
placeholder: 'rsfp-grid-row-placeholder',
items: '.rsfp-grid-row:not(.rsfp-grid-row-unsortable)',
forcePlaceholderSize: true,
axis: 'y',
opacity: 0.8,
tolerance: 'pointer',
start: function(event, ui) {
ui.item.css({
'left' : '50%',
'-webkit-transform' : 'translateX(-50%)',
'-moz-transform' : 'translateX(-50%)',
'transform' : 'translateX(-50%)'
});
ui.item.closest('.rsfp-grid-row').find('.rsfp-grid-row-placeholder').css({
'margin-left' : 'auto',
'margin-right' : 'auto',
'width' : ui.item.width()
});
},
stop: function(event, ui) {
ui.item.removeAttr('style');
// Save the layout
RSFormPro.Grid.toJson();
}
}).disableSelection();
},
// Make elements (fields) sortable
currentSortableElementsObj: false,
sortableElements: function() {
if (this.currentSortableElementsObj)
{
try
{
this.currentSortableElementsObj.sortable('destroy');
}
catch (err){}
}
var columns = jQuery('.rsfp-grid-column');
this.currentSortableElementsObj = columns.sortable({
connectWith: columns.not('.rsfp-grid-column-unconnectable'),
items: '.rsfp-grid-field:not(.rsfp-grid-field-unsortable)', // Disable items that cannot be removed from container row (eg. pagebreaks)
placeholder: 'rsfp-grid-field-placeholder',
forcePlaceholderSize: true,
opacity: 0.8,
tolerance: 'pointer',
start: function(event, ui) {
ui.item.css('margin-bottom', '0');
},
over: function(event, ui) {
ui.item.css('width', ui.placeholder.width());
},
stop: function(event, ui) {
ui.item.removeAttr('style');
// Save the layout
RSFormPro.Grid.toJson();
}
}).disableSelection();
},
// Make hidden fields sortable
currentSortableHiddenElementsObj: false,
sortableHiddenElements: function() {
if (this.currentSortableHiddenElementsObj)
{
try
{
this.currentSortableHiddenElementsObj.sortable('destroy');
}
catch (err){}
}
var container = jQuery('#rsfp-grid-hidden-container');
this.currentSortableHiddenElementsObj = container.sortable({
connectWith: container,
items: '.rsfp-grid-field', // Disable items that cannot be removed from container row (eg. pagebreaks)
placeholder: 'rsfp-grid-field-placeholder',
forcePlaceholderSize: true,
opacity: 0.8,
tolerance: 'pointer',
start: function(event, ui) {
ui.item.css('margin-bottom', '0');
},
over: function(event, ui) {
ui.item.css('width', ui.placeholder.width());
},
stop: function(event, ui) {
ui.item.removeAttr('style');
// Save the layout
RSFormPro.Grid.toJson();
}
}).disableSelection();
},
// Allow columns to be resized
currentResizableObj: false,
resizableGrid: function() {
var obj = jQuery('.rsfp-grid-column:not(.rsfp-grid-column-unresizable)');
// Remove all previously resizable columns
if (this.currentResizableObj)
{
try
{
this.currentResizableObj.resizable('destroy');
}
catch (err){}
}
var
columns = 12,
fullWidth = obj.parent().width(),
columnWidth = fullWidth / columns,
totalCol, // this is filled by start event handler
updateClass = function(el, col) {
el.css('width', ''); // remove width, our class already has it
el.css('height', ''); // remove inline height
el.removeClass(function(index, className) {
return (className.match(/(^|\s)rsfp-grid-column[0-9]+/g) || []).join(' ');
}).addClass('rsfp-grid-column' + col);
};
this.currentResizableObj = obj.resizable({
containment: obj.parent(),
handles: 'e',
create: function(event, ui) {
var $target = jQuery(event.target);
var $handle = $target.find('.ui-resizable-handle');
var size = $target.next('.rsfp-grid-column').css('margin-left');
$handle.css({width: size, right: '-' + size});
},
start: function(event, ui) {
var
target = ui.element,
next = target.next('.rsfp-grid-column'),
targetCol = Math.round(target.width() / columnWidth),
nextCol = Math.round(next.width() / columnWidth);
// set totalColumns globally
totalCol = targetCol + nextCol;
var gridTotal = 0;
target.parent().children('.rsfp-grid-column').each(function(index, element){
var match = jQuery(element).attr('class').match(/rsfp-grid-column([0-9]+)/) || [];
var size = typeof match[1] != 'undefined' ? parseInt(match[1]) : 0;
gridTotal += size;
});
if (gridTotal < 12)
{
totalCol += 12 - gridTotal;
}
else if (gridTotal > 12)
{
// Something went wrong, let's re-create the column sizes
var eqSize = 12 / target.parent().children('.rsfp-grid-column').length;
target.parent().children('.rsfp-grid-column').addClass('rsfp-grid-column' + eqSize);
totalCol = 12;
}
target.resizable('option', 'minWidth', columnWidth);
target.resizable('option', 'maxWidth', ((totalCol - 1) * columnWidth));
},
resize: function(event, ui) {
var
target = ui.element,
next = target.next('.rsfp-grid-column'),
targetColumnCount = Math.round(target.width() / columnWidth),
nextColumnCount = Math.round(next.width() / columnWidth),
targetSet = totalCol - nextColumnCount,
nextSet = totalCol - targetColumnCount;
// Just showing class names inside headings
target.find('h3').text(targetSet + '/12');
next.find('h3').text(nextSet + '/12');
updateClass(target, targetSet);
updateClass(next, nextSet);
},
stop: function(event, ui) {
ui.element.removeAttr('style');
// Save the layout
RSFormPro.Grid.toJson();
}
});
},
clipboard: [],
rightClickMenu: function() {
var $menu;
if (!this.initialized)
{
var separator = '<li id="rsfp-grid-contextmenu-separator"><hr /></li>';
// No need for a divider in 4.0
if (RSFormPro.isJ4)
{
separator = '';
}
$menu = jQuery('<ul class="dropdown-menu" id="rsfp-grid-contextmenu">' +
'<li id="rsfp-grid-contextmenu-cut" class="dropdown-item"><a href="javascript:void(0);"><i class="icon-scissors"></i> <span class="rsfp-text">' + Joomla.JText._('RSFP_GRID_CUT') + '</span></a></li>' +
'<li id="rsfp-grid-contextmenu-paste" class="dropdown-item"><a href="javascript:void(0);" class="disabled"><i class="icon-copy"></i> <span class="rsfp-text">' + Joomla.JText._('RSFP_GRID_NOTHING_TO_PASTE') + '</span></a></li>' +
separator +
'<li id="rsfp-grid-contextmenu-state" class="dropdown-item">' + '<a href="javascript:void(0);" class="disabled"><i class="icon-expired"></i> <span class="rsfp-text">' + Joomla.JText._('RSFP_GRID_NOTHING_TO_PUBLISH') + '</span></a></li>' +
'<li id="rsfp-grid-contextmenu-required" class="dropdown-item">' + '<a href="javascript:void(0);" class="disabled"><i class="icon-expired"></i> <span class="rsfp-text">' + Joomla.JText._('RSFP_GRID_CANT_CHANGE_REQUIRED') + '</span></a></li>' +
'</ul>');
var $body = jQuery('body');
$body.append($menu);
$body.on('click', function(e){
$menu.hide();
});
}
else
{
$menu = jQuery('#rsfp-grid-contextmenu');
}
var $cut = $menu.find('#rsfp-grid-contextmenu-cut'),
$paste = $menu.find('#rsfp-grid-contextmenu-paste'),
$separator = $menu.find('#rsfp-grid-contextmenu-separator'),
$state = $menu.find('#rsfp-grid-contextmenu-state'),
$required = $menu.find('#rsfp-grid-contextmenu-required');
var showAllActions = function() {
$cut.show();
$paste.show();
$separator.show();
$state.show();
$required.show();
};
// Right clicking on a field should bring up a menu
jQuery('.rsfp-grid-row').find('.rsfp-grid-field').off('contextmenu').on('contextmenu', function(e){
var $this = jQuery(this);
showAllActions();
// Unsortable fields (Pagebreaks) only need to show the publish button
// This is the same for hidden fields
if ($this.hasClass('rsfp-grid-field-unsortable') || $this.parents('.rsfp-grid-row').hasClass('rsfp-grid-row-unsortable'))
{
$cut.hide();
$paste.hide();
$separator.hide();
$required.hide();
}
// Clicking on "Cut" will add this field to the clipboard
$cut.children('a').removeClass('disabled');
$cut.off('click').on('click', function(e){
e.preventDefault();
// Add to clipboard
RSFormPro.Grid.clipboard.push($this);
// Hide the field
$this.hide();
// Hide the menu
$menu.hide();
});
// If we don't have anything in the clipboard, the 'Paste' link must be disabled
if (RSFormPro.Grid.clipboard.length > 0)
{
$paste.children('a').removeClass('disabled');
$paste.find('.rsfp-text').text(Joomla.JText._('RSFP_GRID_PASTE_ITEMS').replace('%d', RSFormPro.Grid.clipboard.length));
// Clicking on "Paste" will paste all fields from the clipboard below the current element
$paste.off('click').on('click', function(e){
e.preventDefault();
// Loop through all items in the clipboard and show them
jQuery(RSFormPro.Grid.clipboard).each(function(index, item){
jQuery(item).show();
});
// Add them after the current element
$this.after(RSFormPro.Grid.clipboard);
// Empty the clipboard
RSFormPro.Grid.clipboard = [];
// Hide the menu
$menu.hide();
// Save the Grid
RSFormPro.Grid.toJson();
});
}
else
{
$paste.off('click');
$paste.children('a').addClass('disabled');
$paste.find('.rsfp-text').text(Joomla.JText._('RSFP_GRID_NOTHING_TO_PASTE'));
}
$state.children('a').removeClass('disabled');
if ($this.hasClass('rsfp-grid-unpublished-field'))
{
$state.find('.rsfp-text').text(Joomla.JText._('RSFP_GRID_UNPUBLISHED'));
$state.find('i').attr('class', 'icon-unpublish');
}
else
{
$state.find('.rsfp-text').text(Joomla.JText._('RSFP_GRID_PUBLISHED'));
$state.find('i').attr('class', 'icon-publish');
}
$state.off('click').on('click', function (e) {
e.preventDefault();
stateLoading();
var task;
var formId = jQuery('#formId').val();
var id = $this.find('input[data-rsfpgrid]').val();
if ($this.hasClass('rsfp-grid-unpublished-field'))
{
$this.removeClass('rsfp-grid-unpublished-field');
task = 'components.publish';
}
else
{
$this.addClass('rsfp-grid-unpublished-field');
task = 'components.unpublish';
}
var xml = buildXmlHttp();
var url = 'index.php?option=com_rsform&task=' + task + '&format=raw';
xml.open('POST', url, true);
var params = ['componentId=' + id, 'formId=' + formId, 'ajax=1'].join('&');
xml.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xml.send(params);
xml.onreadystatechange = function() {
if (xml.readyState === 4)
{
stateDone();
autoGenerateLayout();
}
};
// Hide the menu
$menu.hide();
});
if ($this.hasClass('rsfp-grid-can-be-required'))
{
$required.children('a').removeClass('disabled');
if ($this.hasClass('rsfp-grid-required-field'))
{
$required.find('.rsfp-text').text(Joomla.JText._('RSFP_GRID_SET_AS_REQUIRED'));
$required.find('i').attr('class', 'icon-publish');
}
else
{
$required.find('.rsfp-text').text(Joomla.JText._('RSFP_GRID_SET_AS_NOT_REQUIRED'));
$required.find('i').attr('class', 'icon-unpublish');
}
$required.off('click').on('click', function (e) {
e.preventDefault();
stateLoading();
var task;
var formId = jQuery('#formId').val();
var id = $this.find('input[data-rsfpgrid]').val();
var $name = $this.find('.rsfp-grid-field-name');
if ($this.hasClass('rsfp-grid-required-field'))
{
$this.removeClass('rsfp-grid-required-field').addClass('rsfp-grid-unrequired-field');
if ($name.text().indexOf(' (*)') > -1)
{
$name.contents().filter(function(){
return this.nodeType === Node.TEXT_NODE;
}).each(function(){
this.nodeValue = this.nodeValue.replace(' (*)', '');
});
}
task = 'components.unsetrequired';
}
else
{
$this.removeClass('rsfp-grid-unrequired-field').addClass('rsfp-grid-required-field');
task = 'components.setrequired';
$name.contents().filter(function(){
return this.nodeType === Node.TEXT_NODE;
}).each(function(){
this.nodeValue = this.nodeValue + ' (*)';
});
}
var xml = buildXmlHttp();
var url = 'index.php?option=com_rsform&task=' + task + '&format=raw';
xml.open('POST', url, true);
var params = [
'componentId=' + id,
'formId=' + formId,
'ajax=1'
];
params = params.join('&');
xml.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xml.send(params);
xml.onreadystatechange = function() {
if (xml.readyState === 4)
{
stateDone();
autoGenerateLayout();
}
};
// Hide the menu
$menu.hide();
});
}
else
{
// The "Required" link should be disabled since we don't have items
$required.children('a').addClass('disabled');
$required.find('i').attr('class', 'icon-expired');
$required.find('.rsfp-text').text(Joomla.JText._('RSFP_GRID_CANT_CHANGE_REQUIRED'));
// Remove the click event
$required.off('click');
}
// Show the menu next to the cursor
$menu.css({
left: e.pageX,
top: e.pageY
}).show();
return false;
});
// Right clicking on an empty row should bring up a menu so we can paste the clipboard fields in there
jQuery('.rsfp-grid-column').each(function(index, column){
jQuery(column).off('contextmenu').on('contextmenu', function(e){
var $this = jQuery(this);
showAllActions();
if ($this.children('.rsfp-grid-field:visible').length == 0)
{
// The "Cut" link should be disabled since we can't cut an entire row
$cut.children('a').addClass('disabled');
// Remove the click event
$cut.off('click');
$separator.hide();
$state.hide();
$required.hide();
// If we don't have anything in the clipboard, the 'Paste' link must be disabled
if (RSFormPro.Grid.clipboard.length > 0)
{
$paste.children('a').removeClass('disabled');
$paste.find('.rsfp-text').text(Joomla.JText._('RSFP_GRID_PASTE_ITEMS').replace('%d', RSFormPro.Grid.clipboard.length));
// Clicking on "Paste" should append the clipboard items to this row
$paste.off('click').on('click', function(e){
e.preventDefault();
// Loop through all items in the clipboard and append them to the current row
jQuery(RSFormPro.Grid.clipboard).each(function(index, item){
$this.append(jQuery(item).show());
});
// Empty the clipboard
RSFormPro.Grid.clipboard = [];
// Hide the menu
$menu.hide();
// Save the Grid
RSFormPro.Grid.toJson();
});
}
else
{
$paste.children('a').addClass('disabled');
$paste.find('.rsfp-text').text(Joomla.JText._('RSFP_GRID_NOTHING_TO_PASTE'));
$paste.off('click');
}
// Show the menu next to the cursor
$menu.css({
left: e.pageX,
top: e.pageY
}).show();
}
return false;
});
});
},
initialized: false,
initialize: function() {
RSFormPro.Grid.sortableElements();
RSFormPro.Grid.sortableHiddenElements();
RSFormPro.Grid.sortableRows();
RSFormPro.Grid.resizableGrid();
RSFormPro.Grid.rightClickMenu();
this.initialized = true;
// Save the layout
RSFormPro.Grid.toJson();
},
resize: function(e) {
if (e.target === window && RSFormPro.Grid.initialized && jQuery('#gridlayoutdiv').is(':visible')) {
RSFormPro.Grid.initialize();
}
},
deleteField: function(componentId) {
var $field = jQuery('#rsfp-grid-field-id-' + componentId);
// Is this a page? Remove the row
if ($field.parents('.rsfp-grid-page-container').length > 0)
{
$field.parents('.rsfp-grid-page-container').remove();
}
else
{
// Remove the field from the grid
$field.remove();
}
RSFormPro.Grid.toJson();
},
deleteRow: function(element) {
var row = jQuery(element).parents('.rsfp-grid-row');
if (row.find('.rsfp-grid-field').length > 0)
{
alert(Joomla.JText._('RSFP_GRID_CANNOT_REMOVE_ROW'));
}
else
{
if (confirm(Joomla.JText._('RSFP_GRID_REMOVE_ROW_CONFIRM')))
{
row.remove();
}
}
// Save the layout
RSFormPro.Grid.toJson();
},
toJson: function() {
var rows = [],
hidden = [];
jQuery('#rsfp-grid-row-container > .rsfp-grid-row').not('.rsfp-grid-row-unsortable').each(function(rowId, row) {
rows[rowId] = {
columns: [],
sizes: []
};
jQuery(row).children('.rsfp-grid-column').each(function(columnId, column) {
var match = column.className.match(/rsfp-grid-column([0-9]+)/) || [];
if (match.length > 0)
{
var size = match[1];
rows[rowId].columns[columnId] = [];
rows[rowId].sizes.push(size);
jQuery(column).find('input[data-rsfpgrid]').each(function(fieldId, input) {
rows[rowId].columns[columnId].push(jQuery(input).val());
});
}
});
});
jQuery('#rsfp-grid-row-container > .rsfp-grid-row.rsfp-grid-row-unsortable').find('input[data-rsfpgrid]').each(function(fieldId, input) {
hidden.push(jQuery(input).val());
});
var gridLayoutInput = jQuery('[name=GridLayout]');
var old_val = gridLayoutInput.val();
var new_val = JSON.stringify([rows, hidden]);
if (new_val != old_val)
{
// Loading
stateLoading();
// Save value to hidden field
gridLayoutInput.val(new_val);
gridLayoutInput.trigger('gridlayout.changed');
// Send AJAX request
jQuery.post(
'index.php?option=com_rsform&task=forms.savegridlayout',
{ formId: jQuery('#formId').val(), GridLayout: new_val },
function(response){
// Done loading
stateDone();
// If layout auto-generation is enabled, grab it from the request
if (jQuery('[name=FormLayoutAutogenerate]:checked').val() === '1') {
var hasCodeMirror = typeof Joomla.editors.instances['formLayout'] != 'undefined';
jQuery('#formLayout').val(response);
if (hasCodeMirror)
{
Joomla.editors.instances['formLayout'].setValue(response);
}
}
}
);
}
}
};
jQuery(document).ready(function($){
// Let's save the JSON first if we've added new elements
RSFormPro.Grid.toJson();
$('#componentscontent').on('components.shown', function() {
if (!RSFormPro.Grid.initialized && jQuery('.rsfp-grid-row').width() !== 98)
{
RSFormPro.Grid.initialize();
jQuery('#rsfp-grid-loader').fadeOut(200, function(){
jQuery(this).remove();
});
}
});
$(window).on('resize', RSFormPro.Grid.resize);
var tabposition = parseInt(document.getElementById('tabposition').value);
var ptab = parseInt(document.getElementById('ptab').value);
tabposition > 0 ? $("#properties").click() : $('#components').click();
$('#rsform_properties_tab').formTabs(tabposition > 0 ? ptab : 0);
toggleQuickAdd();
if (jQuery('[name=FormLayoutAutogenerate]:checked').val() === '0') {
Joomla.renderMessages({'warning': [Joomla.JText._('RSFP_AUTOGENERATE_LAYOUT_DISABLED')]}, '#componentsMessages');
}
});
RSFormPro.switchTab = function(id) {
if (RSFormPro.isJ4)
{
RSFormPro.getTab(id).click();
}
else
{
jQuery(RSFormPro.getTab(id)).click();
}
}
RSFormPro.getTab = function(id) {
if (RSFormPro.isJ4)
{
return document.getElementById('editModalTabs').tabs[id].tabButton;
}
else
{
return document.querySelector('[href="#rsfptab' + id + '"]');
}
}
Joomla.submitbutton = function(pressbutton)
{
var propertiesSelected = jQuery('#properties').hasClass('btn-primary');
document.getElementById('tabposition').value = propertiesSelected ? 1 : 0;
if (['components.remove', 'components.publish', 'components.unpublish', 'components.save', 'submissions.back', 'forms.directory', 'forms.cancel'].indexOf(pressbutton) > -1)
{
Joomla.submitform(pressbutton);
}
else if (pressbutton === 'forms.preview')
{
var paths = Joomla.getOptions('system.paths');
var formId = document.getElementById('formId').value;
var url = paths.root + '/index.php?option=com_rsform&view=rsform&formId=' + formId;
if (typeof RSFormPro.PreviewItemid !== 'undefined' && parseInt(RSFormPro.PreviewItemid) > 0)
{
url += '&Itemid=' + RSFormPro.PreviewItemid;
}
window.open(url);
}
else
{
if ((pressbutton === 'forms.apply' || pressbutton === 'forms.save') && !validateEmailFields())
{
return false;
}
// do field validation
if (document.getElementById('FormName').value.length === 0)
{
jQuery("#properties").click();
jQuery("#editform").click();
var messages = {"error": []};
messages.error.push(Joomla.JText._('RSFP_SPECIFY_FORM_NAME'));
Joomla.renderMessages(messages);
}
else
{
Joomla.submitform(pressbutton);
}
}
};