165 lines
6.4 KiB
JavaScript
165 lines
6.4 KiB
JavaScript
Misuzu.Forum.Editor = {};
|
|
Misuzu.Forum.Editor.allowWindowClose = false;
|
|
Misuzu.Forum.Editor.init = function() {
|
|
var postingForm = $q('.js-forum-posting');
|
|
if(!postingForm)
|
|
return;
|
|
|
|
var postingButtons = postingForm.querySelector('.js-forum-posting-buttons'),
|
|
postingText = postingForm.querySelector('.js-forum-posting-text'),
|
|
postingParser = postingForm.querySelector('.js-forum-posting-parser'),
|
|
postingPreview = postingForm.querySelector('.js-forum-posting-preview'),
|
|
postingMode = postingForm.querySelector('.js-forum-posting-mode'),
|
|
previewButton = document.createElement('button'),
|
|
bbcodeButtons = $q('.forum__post__actions--bbcode'),
|
|
markdownButtons = $q('.forum__post__actions--markdown'),
|
|
markupButtons = $qa('.forum__post__action--tag');
|
|
|
|
// hack: don't prompt user when hitting submit, really need to make this not stupid.
|
|
postingButtons.firstElementChild.addEventListener('click', function() {
|
|
Misuzu.Forum.Editor.allowWindowClose = true;
|
|
});
|
|
|
|
window.addEventListener('beforeunload', function(ev) {
|
|
if(!Misuzu.Forum.Editor.allowWindowClose && postingText.value.length > 0) {
|
|
ev.preventDefault();
|
|
ev.returnValue = '';
|
|
}
|
|
});
|
|
|
|
for(var i = 0; i < markupButtons.length; ++i)
|
|
(function(currentBtn) {
|
|
currentBtn.addEventListener('click', function(ev) {
|
|
$insertTags(postingText, currentBtn.dataset.tagOpen, currentBtn.dataset.tagClose);
|
|
});
|
|
})(markupButtons[i]);
|
|
|
|
Misuzu.Forum.Editor.switchButtons(parseInt(postingParser.value));
|
|
|
|
var lastPostText = '',
|
|
lastPostParser = null;
|
|
|
|
postingParser.addEventListener('change', function() {
|
|
var postParser = parseInt(postingParser.value);
|
|
Misuzu.Forum.Editor.switchButtons(postParser);
|
|
|
|
if(postingPreview.hasAttribute('hidden'))
|
|
return;
|
|
|
|
// dunno if this would even be possible, but ech
|
|
if(postParser === lastPostParser)
|
|
return;
|
|
|
|
postingParser.setAttribute('disabled', 'disabled');
|
|
previewButton.setAttribute('disabled', 'disabled');
|
|
previewButton.classList.add('input__button--busy');
|
|
|
|
Misuzu.Forum.Editor.renderPreview(postParser, lastPostText, function(success, text) {
|
|
if(!success) {
|
|
Misuzu.showMessageBox(text);
|
|
return;
|
|
}
|
|
|
|
postingPreview.classList[postParser == 2 ? 'add' : 'remove']('markdown');
|
|
|
|
lastPostParser = postParser;
|
|
postingPreview.innerHTML = text;
|
|
MszEmbed.handle($qa('.js-msz-embed-media'));
|
|
|
|
previewButton.removeAttribute('disabled');
|
|
postingParser.removeAttribute('disabled');
|
|
previewButton.classList.remove('input__button--busy');
|
|
});
|
|
});
|
|
|
|
previewButton.className = 'input__button';
|
|
previewButton.textContent = 'Preview';
|
|
previewButton.type = 'button';
|
|
previewButton.value = 'preview';
|
|
previewButton.addEventListener('click', function() {
|
|
if(previewButton.value === 'back') {
|
|
postingPreview.setAttribute('hidden', 'hidden');
|
|
postingText.removeAttribute('hidden');
|
|
previewButton.value = 'preview';
|
|
previewButton.textContent = 'Preview';
|
|
postingMode.textContent = postingMode.dataset.original;
|
|
postingMode.dataset.original = null;
|
|
} else {
|
|
var postText = postingText.value,
|
|
postParser = parseInt(postingParser.value);
|
|
|
|
if(lastPostText === postText && lastPostParser === postParser) {
|
|
postingPreview.removeAttribute('hidden');
|
|
postingText.setAttribute('hidden', 'hidden');
|
|
previewButton.value = 'back';
|
|
previewButton.textContent = 'Edit';
|
|
postingMode.dataset.original = postingMode.textContent;
|
|
postingMode.textContent = 'Previewing';
|
|
return;
|
|
}
|
|
|
|
postingParser.setAttribute('disabled', 'disabled');
|
|
previewButton.setAttribute('disabled', 'disabled');
|
|
previewButton.classList.add('input__button--busy');
|
|
|
|
Misuzu.Forum.Editor.renderPreview(postParser, postText, function(success, text) {
|
|
if(!success) {
|
|
Misuzu.showMessageBox(text);
|
|
return;
|
|
}
|
|
|
|
postingPreview.classList[postParser == 2 ? 'add' : 'remove']('markdown');
|
|
|
|
lastPostText = postText;
|
|
lastPostParser = postParser;
|
|
postingPreview.innerHTML = text;
|
|
MszEmbed.handle($qa('.js-msz-embed-media'));
|
|
|
|
postingPreview.removeAttribute('hidden');
|
|
postingText.setAttribute('hidden', 'hidden');
|
|
previewButton.value = 'back';
|
|
previewButton.textContent = 'Back';
|
|
previewButton.removeAttribute('disabled');
|
|
postingParser.removeAttribute('disabled');
|
|
previewButton.classList.remove('input__button--busy');
|
|
postingMode.dataset.original = postingMode.textContent;
|
|
postingMode.textContent = 'Previewing';
|
|
});
|
|
}
|
|
});
|
|
|
|
postingButtons.insertBefore(previewButton, postingButtons.firstChild);
|
|
};
|
|
Misuzu.Forum.Editor.switchButtons = function(parser) {
|
|
var bbcodeButtons = $q('.forum__post__actions--bbcode'),
|
|
markdownButtons = $q('.forum__post__actions--markdown');
|
|
|
|
bbcodeButtons.hidden = parser != 1;
|
|
markdownButtons.hidden = parser != 2;
|
|
};
|
|
Misuzu.Forum.Editor.renderPreview = function(parser, text, callback) {
|
|
if(!callback)
|
|
return;
|
|
parser = parseInt(parser);
|
|
text = text || '';
|
|
|
|
var xhr = new XMLHttpRequest,
|
|
formData = new FormData;
|
|
|
|
formData.append('post[mode]', 'preview');
|
|
formData.append('post[text]', text);
|
|
formData.append('post[parser]', parser.toString());
|
|
|
|
xhr.addEventListener('readystatechange', function() {
|
|
if(xhr.readyState !== XMLHttpRequest.DONE)
|
|
return;
|
|
if(xhr.status === 200)
|
|
callback(true, xhr.response);
|
|
else
|
|
callback(false, 'Failed to render preview.');
|
|
});
|
|
// need to figure out a url registry system again, current one is too much overhead so lets just do this for now
|
|
xhr.open('POST', '/forum/posting.php');
|
|
xhr.withCredentials = true;
|
|
xhr.send(formData);
|
|
};
|