(function() {
var TINYMCE_PLUGIN_NAME = Amilia.PLUGIN_NAME + '_calendar',
SHORTCODE = 'amilia_store_calendar';
var modalTemplate = [
'
{calendar-title}
',
'',
'',
' ',
' ',
'
',
'',
'',
' ',
' ',
'
',
'',
'',
'',
'',
'',
'',
'
{instructions}
',
'
{instructions-p1}
',
'
{calendar-instructions-p2}
',
'
{calendar-instructions-p3}
',
'
{calendar-instructions-p4}
',
'
'
].join('\n');
tinymce.PluginManager.add(TINYMCE_PLUGIN_NAME, function(editor, url) {
modalTemplate = Amilia.localize(modalTemplate);
// The modal
var mask = document.createElement('div');
mask.className = 'amilia-mask';
document.body.appendChild(mask);
mask.style.display = 'none';
var modal = document.createElement('div');
modal.className = 'amilia-modal';
document.body.appendChild(modal);
modal.innerHTML = modalTemplate;
modal.style.display = 'none';
var storeUrl = modal.querySelector('input[name=store-url]'),
storeUrlError = modal.querySelector('div.store-url'),
startView = modal.querySelector('select[name=start-view]'),
startDate = modal.querySelector('input[name=start-date]'),
startDateError = modal.querySelector('div.input-helper.start-date'),
startTime = modal.querySelector('select[name=start-time]'),
showTagsFilter = modal.querySelector('input[name=show-tags-filter]'),
tagsSelect = modal.querySelector('select[name="tags[]"]'),
tagsSelectError = modal.querySelector('div.input-helper.tags'),
showFacilitiesFilter = modal.querySelector('input[name=show-facilities-filter]'),
facilitiesSelect = modal.querySelector('select[name="facilities[]"]'),
facilitiesSelectError = modal.querySelector('div.input-helper.facilities'),
showStaff = modal.querySelector('input[name=show-staff]'),
showHidden = modal.querySelector('input[name=show-hidden]'),
insertButton = modal.querySelector('button[name=insert]'),
updateButton = modal.querySelector('button[name=update]'),
deleteButton = modal.querySelector('button[name=delete]'),
cancelButton = modal.querySelector('button[name=cancel]'),
helps = modal.querySelectorAll('a.amilia-help'),
instructions = modal.querySelector('.amilia-instructions'),
activeNode = null,
activeShortcode = null,
imagesUrl = url.replace('/shortcodes', '/images/');
function getSelectedTags() {
var result = [];
for (var i = 0; i < tagsSelect.options.length; i++) {
var option = tagsSelect.options[i];
if (option.selected) result.push(parseInt(option.value, 10));
}
return result;
}
function fetchTagsAndConstructSelect(selectedTags) {
selectedTags || (selectedTags = getSelectedTags());
tagsSelectError.innerHTML == '';
var urlComponents = Amilia.getUrlComponents(storeUrl.value);
if (urlComponents == null) return;
tagsSelectError.innerHTML == Amilia.lang('pleaseWait');
Amilia.ajaxGetJson(urlComponents.apiUrl + 'Tags',
function(xhr) {
var orgTags = JSON.parse(xhr.response);
tagsSelect.innerHTML = '';
tagsSelectError.innerHTML == '';
if (orgTags.length > 0) {
for (var i = 0; i < orgTags.length; i++) {
var tag = orgTags[i],
option = document.createElement('option');
option.value = tag.Id;
option.innerText = tag.Name;
if (selectedTags.indexOf(tag.Id) != -1) option.selected = true;
tagsSelect.appendChild(option);
}
} else {
tagsSelectError.innerHTML = Amilia.lang('error-no-tags');
}
},
function(xhr) {
tagsSelectError.innerHTML == Amilia.lang('error-unexpected');
}
);
}
function getSelectedFacilities() {
var result = [];
for (var i = 0; i < facilitiesSelect.options.length; i++) {
var option = facilitiesSelect.options[i];
if (option.selected) result.push(parseInt(option.value, 10));
}
return result;
}
function fetchFacilitiesAndConstructSelect(selectedFacilities) {
selectedFacilities || (selectedFacilities = getSelectedFacilities());
facilitiesSelectError.innerHTML == '';
var urlComponents = Amilia.getUrlComponents(storeUrl.value);
if (urlComponents == null) return;
facilitiesSelectError.innerHTML == Amilia.lang('pleaseWait');
Amilia.ajaxGetJson(urlComponents.apiUrl + 'Facilities',
function(xhr) {
var orgFacilities = JSON.parse(xhr.response);
facilitiesSelect.innerHTML = '';
facilitiesSelectError.innerHTML == '';
if (orgFacilities.length > 0) {
for (var i = 0; i < orgFacilities.length; i++) {
var facility = orgFacilities[i],
option = document.createElement('option');
option.value = facility.Id;
option.innerText = facility.FullName;
option.title = facility.FullName;
if (selectedFacilities.indexOf(facility.Id) != -1) option.selected = true;
facilitiesSelect.appendChild(option);
}
} else {
facilitiesSelectError.innerHTML = Amilia.lang('error-no-facilities');
}
},
function(xhr) {
facilitiesSelectError.innerHTML == Amilia.lang('error-unexpected');
}
);
}
function validateStoreUrlAndFetchTagsAndFacilities(selectedTags, selectedFacilities) {
Amilia.validateStoreUrl(storeUrl, storeUrlError,
function() {
fetchTagsAndConstructSelect(selectedTags);
fetchFacilitiesAndConstructSelect(selectedFacilities);
});
}
storeUrl.onchange = function() {
validateStoreUrlAndFetchTagsAndFacilities();
};
startDate.onchange = function() {
startDateError.innerText = '';
if (startDate.value.length == 0) return;
if (!Amilia.validateDate(startDate.value)) startDateError.innerText = Amilia.lang('invalid-date');
};
function generateShortCode() {
var urlComponents = Amilia.getUrlComponents(storeUrl.value);
var tags = getSelectedTags();
var facilities = getSelectedFacilities();
return '[' + SHORTCODE + " url='{url}' view='{view}' date='{date}' time='{time}' tags='{tags}' tagsfilter='{show-tags-filter}' facilities='{facilities}' facilitiesfilter='{show-facilities-filter}' showstaff='{show-staff}' showhidden='{show-hidden}' api='{api}' version='{version}']"
.replace('{url}', storeUrl.value)
.replace('{view}', startView.value)
.replace('{date}', startDate.value)
.replace('{time}', startTime.value)
.replace('{tags}', tags.join(','))
.replace('{facilities}', facilities.join(','))
.replace('{show-tags-filter}', !showTagsFilter.disabled && showTagsFilter.checked ? 1 : 0)
.replace('{show-facilities-filter}', !showFacilitiesFilter.disabled && showFacilitiesFilter.checked ? 1 : 0)
.replace('{show-staff}', showStaff.checked ? 1 : 0)
.replace('{show-hidden}', showHidden.checked ? 1 : 0)
.replace('{api}', urlComponents ? urlComponents.apiUrl : '')
.replace('{version}', Amilia.pluginVersion);
}
function close() {
mask.style.display = 'none';
modal.style.display = 'none';
}
insertButton.onclick = function(e) {
editor.execCommand('mceInsertContent', false, generateShortCode());
close();
};
updateButton.onclick = function(e) {
activeNode.innerHTML = '';
editor.execCommand('mceRemoveNode', false, activeNode);
editor.execCommand('mceInsertContent', false, generateShortCode());
close();
}
deleteButton.onclick = function(e) {
activeNode.innerHTML = '';
editor.execCommand('mceRemoveNode', false, activeNode);
close();
}
cancelButton.onclick = close;
mask.onclick = close;
function showHelp(e) {
e.preventDefault();
instructions.style.display = 'block';
return false;
}
for (var i = 0; i < helps.length; i++) helps[i].onclick = showHelp;
function getActiveShortcode() {
return wp.shortcode.next(SHORTCODE, editor.selection.getNode().innerHTML);
}
function showModal() {
activeNode = editor.dom.getParent(editor.selection.getNode());
activeShortcode = getActiveShortcode();
if (activeShortcode) {
var attrs = activeShortcode.shortcode.attrs.named;
storeUrl.value = attrs.url;
Amilia.validateStoreUrl(storeUrl, storeUrlError);
startView.value = attrs.view || 'month';
startDate.value = attrs.date || '';
startTime.value = attrs.time === '' ? '' : (attrs.time || '09:00');
showTagsFilter.checked = attrs.tagsfilter == 1;
showFacilitiesFilter.checked = attrs.facilitiesfilter == 1;
showHidden.checked = attrs.showhidden == 1;
showStaff.checked = attrs.showstaff == 1;
var tags = (attrs.tags + '').split(',');
for (var i = 0; i < tags.length; i++) tags[i] = parseInt(tags[i], 10);
var facilities = (attrs.facilities + '').split(',');
for (var i = 0; i < facilities.length; i++) facilities[i] = parseInt(facilities[i], 10);
validateStoreUrlAndFetchTagsAndFacilities(tags, facilities);
insertButton.style.display = 'none';
updateButton.style.display = 'inline';
deleteButton.style.display = 'inline';
} else {
storeUrl.value = Amilia.storeUrl;
validateStoreUrlAndFetchTagsAndFacilities();
insertButton.style.display = 'inline';
updateButton.style.display = 'none';
deleteButton.style.display = 'none';
}
mask.style.display = 'block';
modal.style.display = 'block';
modal.style.left = window.innerWidth/2 - modal.offsetWidth/2 + 'px';
}
// The TineMCE button
editor.addButton(TINYMCE_PLUGIN_NAME, {
onclick: showModal,
title: Amilia.lang('calendar-title'),
image: imagesUrl + 'calendar.svg'
});
editor.onNodeChange.add(function(editor, controllManager, node) {
controllManager.setActive(TINYMCE_PLUGIN_NAME, getActiveShortcode() != null);
});
});
})();