From 60b60ad30aaa81b393694d1c67320c6dd5e5275b Mon Sep 17 00:00:00 2001 From: flashwave Date: Wed, 9 Dec 2015 21:21:08 +0100 Subject: [PATCH] r20151209 --- libraries/{Action.php => ActionCode.php} | 4 +- libraries/Main.php | 4 +- .../data/broomcloset/css/broomcloset.css | 3 +- public/content/data/yuuno/js/yuuno.js | 672 +++++++----------- public/content/data/yuuno/js/yuuno.test.js | 591 --------------- .../data/yuuno/js/{yuuno.test.ts => yuuno.ts} | 19 +- public/content/data/yuuno/jsold/ybabstat.js | 79 -- public/manage.php | 19 +- sakura.php | 3 +- .../general.tpl} | 0 .../index.tpl} | 0 .../{index.error.tpl => error/index.tpl} | 0 templates/broomcloset/pages/logs/errors.tpl | 44 ++ templates/yuuno/global/master.tpl | 3 - 14 files changed, 341 insertions(+), 1100 deletions(-) rename libraries/{Action.php => ActionCode.php} (97%) delete mode 100644 public/content/data/yuuno/js/yuuno.test.js rename public/content/data/yuuno/js/{yuuno.test.ts => yuuno.ts} (98%) delete mode 100644 public/content/data/yuuno/jsold/ybabstat.js rename templates/broomcloset/pages/{general.configuration.tpl => configuration/general.tpl} (100%) rename templates/broomcloset/pages/{index.dashboard.tpl => dashboard/index.tpl} (100%) rename templates/broomcloset/pages/{index.error.tpl => error/index.tpl} (100%) create mode 100644 templates/broomcloset/pages/logs/errors.tpl diff --git a/libraries/Action.php b/libraries/ActionCode.php similarity index 97% rename from libraries/Action.php rename to libraries/ActionCode.php index 4d67573..683208e 100644 --- a/libraries/Action.php +++ b/libraries/ActionCode.php @@ -6,10 +6,10 @@ namespace Sakura; /** - * Class Action + * Class ActionCode * @package Sakura */ -class Action +class ActionCode { private $actions = []; // Contains the action methods private $code = null; // Contains the action code we're working with diff --git a/libraries/Main.php b/libraries/Main.php index 8b03dbc..07ed4e4 100644 --- a/libraries/Main.php +++ b/libraries/Main.php @@ -196,7 +196,7 @@ class Main if (isset($errid)) { $errorPage .= '

The error and surrounding data has been logged.

-

' . ($detailed ? 'Report the following text to a staff member' : 'Logged as') . '

+

' . (!$detailed ? 'Report the following text to a staff member' : 'Logged as') . '

' . $errid . '
'; } else { $errorPage .= '

Sakura was not able to log this error which could mean that there was an error @@ -205,7 +205,7 @@ class Main know about this error if it occurs again.

'; } - if (!$detailed) { + if ($detailed) { $errorPage .= '

Summary

' . $error . '

Backtraces

'; diff --git a/public/content/data/broomcloset/css/broomcloset.css b/public/content/data/broomcloset/css/broomcloset.css index 426f76d..9dbc931 100644 --- a/public/content/data/broomcloset/css/broomcloset.css +++ b/public/content/data/broomcloset/css/broomcloset.css @@ -4,5 +4,6 @@ */ .main { - margin: -40px 10px 0; + margin: -40px auto 0; + max-width: 1280px; } diff --git a/public/content/data/yuuno/js/yuuno.js b/public/content/data/yuuno/js/yuuno.js index b108929..5dc4189 100644 --- a/public/content/data/yuuno/js/yuuno.js +++ b/public/content/data/yuuno/js/yuuno.js @@ -1,618 +1,503 @@ /* - * Sakura Yuuno JavaScript + * Sakura Yuuno */ - -// Create a notification box +// Spawns a notification function notifyUI(content) { // Grab the container and create an ID - var container = document.getElementById('notifications'); - var identifier = 'sakura-notification-' + Date.now(); - - // Create the notification element and children - var notif = document.createElement('div'); - var notifIcon = document.createElement('div'); - var notifContent = document.createElement('div'); - var notifTitle = document.createElement('div'); - var notifText = document.createElement('div'); - var notifClose = document.createElement('div'); - var notifCloseIcon = document.createElement('div'); - var notifClear = document.createElement('div'); - var iconCont; - - // Add ID and class on notification container - notif.className = 'notification-enter'; - notif.setAttribute('id', identifier); - - // Add icon - notifIcon .className = 'notification-icon'; - if(content.img.substring(0, 5) == "FONT:") { - iconCont = document.createElement('div'); - iconCont.className = 'font-icon fa ' + content.img.replace('FONT:', '') + ' fa-4x'; - } else { - iconCont = document.createElement('img'); - iconCont.setAttribute('alt', identifier); - iconCont.setAttribute('src', content.img); + var cont = document.getElementById('notifications'); + var id = 'sakura-notification-' + Date.now(); + // Create the elements + var alert = document.createElement('div'); + var aIcon = document.createElement('div'); + var aCont = document.createElement('div'); + var aTitle = document.createElement('div'); + var aText = document.createElement('div'); + var aClose = document.createElement('div'); + var aCIcon = document.createElement('div'); + var aClear = document.createElement('div'); + var aIconCont; + // Add attributes to the main element + alert.className = 'notification-enter'; + alert.id = id; + // Add the icon + if ((typeof content.img).toLowerCase() === 'undefined' && content.img == null && !(content.img.length > 1)) { + aIconCont = document.createElement('div'); + aIconCont.className = 'font-icon fa fa-info fa-4x'; } - notifIcon .appendChild(iconCont); - notif .appendChild(notifIcon); - - // Add content - var notifTitleNode = document.createTextNode(content.title); - var notifTextNode = document.createTextNode(content.text); - notifContent .className = 'notification-content'; - notifTitle .className = 'notification-title'; - notifText .className = 'notification-text'; - notifTitle .appendChild(notifTitleNode); - notifText .appendChild(notifTextNode); - if(content.link) { - notif .setAttribute('sakurahref', content.link); - notifContent.setAttribute('onclick', content.link.substring(0, 11) == 'javascript:' ? content.link.substring(11) : 'notifyOpen(this.parentNode.id);'); + else if (content.img.substr(0, 5) == 'FONT:') { + aIconCont = document.createElement('div'); + aIconCont.className = 'font-icon fa ' + content.img.replace('FONT:', '') + ' fa-4x'; } - notifContent .appendChild(notifTitle); - notifContent .appendChild(notifText); - notif .appendChild(notifContent); - - // Add close button - notifClose .className = 'notification-close'; - notifClose .setAttribute('onclick', 'notifyClose(this.parentNode.id);'); - notifClose .appendChild(notifCloseIcon); - notif .appendChild(notifClose); - - // Add .clear - notifClear .className = 'clear'; - notif .appendChild(notifClear); - - // Append the notification to the document so it actually shows up to the user also add the link - container.appendChild(notif); - - // Play sound if requested - if(content.sound > 0) { - // Create sound element and mp3 and ogg sources - var sound = document.createElement('audio'); - var soundMP3 = document.createElement('source'); - var soundOGG = document.createElement('source'); - - // Assign the proper attributes to the sources - soundMP3.setAttribute('src', '//' + sakuraVars.content_path + '/sounds/notify.mp3'); - soundMP3.setAttribute('type', 'audio/mp3'); - soundOGG.setAttribute('src', '//' + sakuraVars.content_path + '/sounds/notify.ogg'); - soundOGG.setAttribute('type', 'audio/ogg'); - - // Append the children - sound.appendChild(soundMP3); - sound.appendChild(soundOGG); - - // Play the sound + else { + aIconCont = document.createElement('img'); + aIconCont.alt = id; + aIconCont.img = content.img; + } + aIcon.appendChild(aIconCont); + aIcon.className = 'notification-icon'; + alert.appendChild(aIcon); + // Add the content + aCont.className = 'notification-content'; + aTitle.className = 'notification-title'; + aText.className = 'notifcation-text'; + aTitle.textContent = content.title; + aText.textContent = content.text; + // Check if a link exists and add if it does + if ((typeof content.link).toLowerCase() !== 'undefined' && content.link !== null && content.link.length > 1) { + alert.setAttribute('sakurahref', content.link); + aCont.setAttribute('onclick', content.link.substr(0, 11) == 'javascript:' ? content.link.substring(11) : 'notifyOpen(this.parentNode.id);'); + } + // Append stuff + aCont.appendChild(aTitle); + aCont.appendChild(aText); + alert.appendChild(aCont); + // Add the close button + aClose.className = 'notification-close'; + aClose.setAttribute('onclick', 'notifyClose(this.parentNode.id);'); + aClose.appendChild(aCIcon); + alert.appendChild(aClose); + // Append the notification to the document + cont.appendChild(alert); + // Play sound if request + if (content.sound) { + // Create the elements + var sound = document.createElement('audio'); + var mp3 = document.createElement('source'); + var ogg = document.createElement('source'); + // Assign attribs + mp3.type = 'audio/mp3'; + ogg.type = 'audio/ogg'; + mp3.src = sakuraVars.content_path + '/sounds/notify.mp3'; + ogg.src = sakuraVars.content_path + '/sounds/notify.ogg'; + // Append + sound.appendChild(mp3); + sound.appendChild(ogg); + // And play sound.play(); } - - // If keepalive is 0 keep the notification open "forever" (until the user closes it or changes the page) - if(content.timeout > 0) { - // Set set a timeout and execute notifyClose() after amount of milliseconds specified - setTimeout(function() { - // Use the later defined notifyClose function - notifyClose(identifier); + // If keepalive is 0 keep the notification open forever + if (content.timeout > 0) { + // Set a timeout and close after an amount + setTimeout(function () { + notifyClose(id); }, content.timeout); } } - -// Closing a notification box +// Closing a notification function notifyClose(id) { - // Get the element and assign it to a variable - var element = document.getElementById(id); - - // Do the animation - element.className = 'notification-exit'; - - // Remove the element after 500 milliseconds (animation takes 400) - setTimeout(function() { - // Use the later defined removeId function + // Get the element + var e = document.getElementById(id); + // Add the animation + e.className = 'notification-exit'; + // Remove after 410 ms + setTimeout(function () { Sakura.removeById(id); }, 410); } - -// Opening a link to a notifcated thing (what even) +// Opening an alerted link function notifyOpen(id) { var sakuraHref = document.getElementById(id).getAttribute('sakurahref'); - - if(typeof sakuraHref !== 'undefined') { - window.location = sakuraHref; + if ((typeof sakuraHref).toLowerCase() !== 'undefined') { + window.location.assign(sakuraHref); } } - // Request notifications function notifyRequest(session) { // Check if the document isn't hidden - if(document.hidden) { + if (document.hidden) { return; } - - // Create AJAX - var alertGet = new AJAX(); - alertGet.setUrl('/settings.php?request-notifications=true&time=' + Sakura.epoch() + '&session=' + session); - - alertGet.addCallback(200, function () { - // Assign the JSON parsed content to a variable - var data = JSON.parse(alertGet.response()); - - // If nothing was set stop - if (typeof data == 'undefined') { - // Tell the user something went wrong... - throw "No data returned"; - - // ...then prevent the function from contiuing + // Create AJAX object + var get = new AJAX(); + get.setUrl('/settings.php?request-notifications=true&time=' + Sakura.epoch() + '&session=' + session); + // Add callbacks + get.addCallback(200, function () { + // Assign the parsed JSON + var data = JSON.parse(get.response()); + // Check if nothing went wrong + if ((typeof data).toLowerCase() === 'undefined') { + // Inform the user + throw "No or invalid data was returned"; + // Stop return; } - - // Go over every return notification and pass the object to it + // Create an object for every notification for (var id in data) { notifyUI(data[id]); } }); - - alertGet.addCallback(0, function () { - // Tell the user something went wrong... - throw "Notification request failed"; - }); - - alertGet.start(HTTPMethods.GET); + get.start(HTTPMethods.GET); } - -// Show the full-page busy window +// Show the full page busy window function ajaxBusyView(show, message, type) { + if (message === void 0) { message = null; } + if (type === void 0) { type = null; } // Get elements - var busyCont = document.getElementById('ajaxBusy'); - var busyStat = document.getElementById('ajaxStatus'); - var busyAnim = document.getElementById('ajaxAnimate'); - var pageContent = document.getElementById('contentwrapper'); - var busyAnimIco; - + var cont = document.getElementById('ajaxBusy'); + var stat = document.getElementById('ajaxStatus'); + var anim = document.getElementById('ajaxAnimate'); + var body = document.getElementById('contentwrapper'); + var icon = 'fa fa-4x '; // Select the proper icon - switch(type) { + switch (type) { case 'ok': - busyAnimIco = 'fa fa-check fa-4x'; + icon += 'fa-check'; break; case 'fail': - busyAnimIco = 'fa fa-remove fa-4x'; + icon += 'fa-remove'; break; case 'busy': default: - busyAnimIco = 'fa fa-refresh fa-spin fa-4x'; + icon += 'fa-refresh fa-spin'; break; } - - // If requested to show the window build it - if(show) { - // Make sure it doesn't exist already - if(busyCont === null) { + // If request to show the window, build it + if (show) { + if ((typeof cont).toLowerCase() === 'undefined' || cont === null) { // Container - var createBusyCont = document.createElement('div'); - createBusyCont.className = 'ajax-busy'; - createBusyCont.setAttribute('id', 'ajaxBusy'); - - // Inner box - var createBusyInner = document.createElement('div'); - createBusyInner.className = 'ajax-inner'; - createBusyCont.appendChild(createBusyInner); - - // Action description - var createBusyMsg = document.createElement('h2'); - createBusyMsg.setAttribute('id', 'ajaxStatus'); - createBusyInner.appendChild(createBusyMsg); - - // FontAwesome icon - var createBusySpin = document.createElement('div'); - createBusySpin.setAttribute('id', 'ajaxAnimate'); - createBusyInner.appendChild(createBusySpin); - - // Append the element to the actual page - pageContent.appendChild(createBusyCont); - - // Reassign the previously assigned variables - busyCont = document.getElementById('ajaxBusy'); - busyStat = document.getElementById('ajaxStatus'); - busyAnim = document.getElementById('ajaxAnimate'); - } // If the container already exists just continue and update the elements - - // Alter the icon - busyAnim.className = busyAnimIco; - - // Change the message - busyStat.innerHTML = (message === null ? 'Unknown' : message); - } else { // If show is false remove the element... - // ...but just do nothing if the container doesn't exist - if(busyCont !== null) { - // Create the fadeout with a 10ms interval - var fadeOut = setInterval(function() { - // Set an opacity if it doesn't exist yet - if(busyCont.style.opacity === null || busyCont.style.opacity === "") { - busyCont.style.opacity = 1; + var cCont = document.createElement('div'); + cCont.className = 'ajax-busy'; + cCont.id = 'ajaxBusy'; + // Inner + var cInner = document.createElement('div'); + cInner.className = 'ajax-inner'; + cCont.appendChild(cInner); + // Desc + var cMsg = document.createElement('h2'); + cMsg.id = 'ajaxStatus'; + cInner.appendChild(cMsg); + // Icon + var cIco = document.createElement('div'); + cIco.id = 'ajaxAnimate'; + cInner.appendChild(cIco); + // Append to document + body.appendChild(cCont); + // Reassign + cont = document.getElementById('ajaxBusy'); + stat = document.getElementById('ajaxStatus'); + anim = document.getElementById('ajaxAnimate'); + } + // Update the icon + anim.className = icon; + // Update the message + stat.textContent = (message === null ? '' : message); + } + else { + if (cont !== null) { + var out = setInterval(function () { + if (cont.style.opacity === null || cont.style.opacity === "") { + cont.style.opacity = "1"; } - - // If the value isn't 0 yet start subtract .1 from the opacity - if(busyCont.style.opacity > 0) { - busyCont.style.opacity = busyCont.style.opacity - 0.1; - } else { // When we've reached 0 remove the container element and clear the fadeout interval + // If the value isn't 0 yet subtract by .1 + if (parseInt(cont.style.opacity) > 0) { + cont.style.opacity = (parseInt(cont.style.opacity) - 0.1).toString(); + } + else { Sakura.removeById('ajaxBusy'); - clearInterval(fadeOut); + clearInterval(out); } }, 10); } } } - // Making a post request using AJAX function ajaxPost(url, data, callback) { // Create AJAX var request = new AJAX(); - // Set url request.setUrl(url); - // Add callbacks request.addCallback(200, function () { - callback.call(request.response()) + callback.call(request.response()); }); request.addCallback(0, function () { ajaxBusyView(false); - throw "POST Request failed"; }); - // Add header request.addHeader('Content-Type', 'application/x-www-form-urlencoded'); - // Set the post data request.setSend(data); - // Make the request request.start(HTTPMethods.POST); + // Return the AJAX object + return request; } - -// Convert href attribute to an object +// Convert a href attr to an object function prepareAjaxLink(linkId, callback, attrs) { - // Get the elements - var link = typeof linkId === 'object' ? linkId : document.getElementById(linkId); - + if (attrs === void 0) { attrs = null; } + // Get element + var link = (typeof linkId).toLowerCase() === 'object' ? linkId : document.getElementById(linkId); // Catch null - if(link == null) { + if (link === null) { return; } - - // Get the href value - var hrefRaw = link.attributes.href.value; - - // Get the action path - var action = hrefRaw.split('?')[0]; - + // Get the raw HREF value + var href = link.getAttribute('href'); + // Get the action + var action = href.split('?')[0]; // Split the request variables - var variablesNotSplit = hrefRaw.split('?')[1].split('&'); - - // Create variables object - var variables = {}; - - // Split the name and values of the variables - for(var key in variablesNotSplit) { - // Split name and value - var newVar = variablesNotSplit[key].split('='); - - // Push it into the object + var varEarly = href.split('?')[1].split('&'); + // Create storage thing + var variables = new Object(); + // Split them + for (var k in varEarly) { + // Split + var newVar = varEarly[k].split('='); + // Push variables[newVar[0]] = newVar[1]; } - // Add ajax=true variables['ajax'] = true; - // Update link attributes - link.setAttribute('href', 'javascript:void(0);'); - link.setAttribute('onclick', callback +'(\''+ action +'\', JSON.parse(\''+ JSON.stringify(variables) +'\')'+ (typeof attrs != 'undefined' ? attrs : '') +');'); + link.setAttribute('href', 'javascript:void(0);'); + link.setAttribute('onclick', callback + '(\'' + action + '\', JSON.parse(\'' + JSON.stringify(variables) + '\')' + (typeof attrs != 'undefined' ? attrs : '') + ');'); } - -function prepareAjaxForm(formId, message, resetCaptchaOnFailure) { +// Prepare a form for an AJAX request +function prepareAjaxForm(formId, message, resetCaptcha) { + if (resetCaptcha === void 0) { resetCaptcha = false; } // Get the form var form = document.getElementById(formId); - - // Create the AJAX form input - var createHidden = document.createElement('input'); - + // Create hidden ajax input + var hide = document.createElement('input'); // Set the attributes - createHidden.setAttribute('name', 'ajax'); - createHidden.setAttribute('value', 'true'); - createHidden.setAttribute('type', 'hidden'); - form.appendChild(createHidden); - + hide.name = 'ajax'; + hide.value = 'true'; + hide.type = 'hidden'; + form.appendChild(hide); // Update form - form.setAttribute('onsubmit', 'submitPost(\''+ form.action +'\', formToObject(\''+ formId +'\'), true, \''+ (message ? message : 'Please wait...') +'\', '+ (resetCaptchaOnFailure ? 'true' : 'false') +');'); + form.setAttribute('onsubmit', 'submitPost(\'' + form.getAttribute('action') + '\', formToObject(\'' + formId + '\'), true, \'' + (message ? message : 'Please wait...') + '\', ' + (resetCaptcha ? 'true' : 'false') + ');'); form.setAttribute('action', 'javascript:void(0);'); } - // Convert form to an object function formToObject(formId) { - // Get form data + // Get the form var form = document.getElementById(formId); - // Make an object for the request parts - var requestParts = {}; - - // Get all children with a name attribute + var requestParts = new Object(); + // Get all the children with a name attr var children = form.querySelectorAll('[name]'); - - // Sort children and make them ready for submission - for(var i in children) { - if(typeof children[i] == 'object') { + // Sort the children and make them ready for submission + for (var i in children) { + if ((typeof children[i]).toLowerCase() === 'object') { requestParts[children[i].name] = ((typeof children[i].type !== "undefined" && children[i].type.toLowerCase() == "checkbox") ? (children[i].checked ? 1 : 0) : children[i].value); } } - - // Return the object + // Return the request parts return requestParts; } - -// Quickly building a form for god knows what reason +// Quickly building a form function generateForm(formId, formAttr, formData, appendTo) { - // Create form elements and assign ID - var i; + if (appendTo === void 0) { appendTo = null; } + // Create form element var form = document.createElement('form'); - form.setAttribute('id', formId); - - // Set additional attributes - if(formAttr !== null) { - for(i in formAttr) { - form.setAttribute(i, formAttr[i]); - } + form.id = formId; + // Set additional attrs + for (var c in formAttr) { + form.setAttribute(c, formAttr[c]); } - - // Generate input elements - for(i in formData) { - var disposableVar = document.createElement('input'); - disposableVar.setAttribute('type', 'hidden'); - disposableVar.setAttribute('name', i); - disposableVar.setAttribute('value', formData[i]); - form.appendChild(disposableVar); + // Set data + for (var a in formData) { + var b = document.createElement('input'); + b.type = 'hidden'; + b.name = a; + b.value = formData[a]; + form.appendChild(b); } - - // Append to another element if requested - if(appendTo !== null) { + // Append to something if requested + if (appendTo !== null) { document.getElementById(appendTo).appendChild(form); } - - // Return the completed form return form; } - -// Submitting a form using an AJAX POST request -function submitPost(action, requestParts, busyView, msg, resetCaptchaOnFailure) { +// Submitting a post using AJAX +function submitPost(action, requestParts, busyView, msg, resetCaptcha) { // If requested display the busy thing - if(busyView) { + if (busyView) { ajaxBusyView(true, msg, 'busy'); } - - // Submit the AJAX request - var request = ajaxPost(action, requestParts, function() { - submitPostHandler(this, busyView, resetCaptchaOnFailure); + // Submit the AJAX + var request = ajaxPost(action, requestParts, function () { + submitPostHandler(request.response(), busyView, resetCaptcha); }); - } - -// Submitting a form using an AJAX POST request -function submitPostHandler(result, busyView, resetCaptchaOnFailure) { - - // Split result - result = result.split('|'); - - // If using the busy view thing update the text displayed to the return of the request - if(busyView) { +// Handling a submitted form using AJAX +function submitPostHandler(data, busyView, resetCaptcha) { + // Split the result + var result = data.split('|'); + // If using the bust view thing update the text displayed to the return of the request + if (busyView) { ajaxBusyView(true, result[0], (result[1] == '1' ? 'ok' : 'fail')); } - - // If request reset the recaptcha on failure - if(resetCaptchaOnFailure && result[1] != '1' && sakuraVars.recaptchaEnabled != '0') { + // Reset captcha + if (resetCaptcha && result[1] != '1' && sakuraVars.recaptchaEnabled != '0') { grecaptcha.reset(); } - - setTimeout(function(){ - if(busyView) { + setTimeout(function () { + if (busyView) { ajaxBusyView(false); } - - if(result[1] == '1') { - window.location = result[2]; + if (result[1] == '1') { + window.location.assign(result[2]); } }, 2000); - } - -// Check if password is within the minimum entropy value +// Check if a password is within the minimum entropy value function checkPwdEntropy(pwd) { - return (Sakura.pwdEntropy(pwd) >= sakuraVars.minPwdEntropy); + return (Sakura.entropy(pwd) >= sakuraVars.minPwdEntropy); } - // Check registration variables function registerVarCheck(id, mode, option) { + if (option === void 0) { option = null; } // Get the element we're working with var input = document.getElementById(id); var check = null; - // Use the proper mode - switch(mode) { + switch (mode) { case 'confirmpw': option = document.getElementById(option); - check = input.value === option.value; + check = input.getAttribute('value') === option.value; break; - case 'password': - check = checkPwdEntropy(input.value); + check = checkPwdEntropy(input.getAttribute('value')); break; - case 'email': - check = Sakura.validateEmail(input.value); + check = Sakura.validateEmail(input.getAttribute('value')); break; - case 'username': default: - check = Sakura.stringLength(input.value, sakuraVars.minUserLen, sakuraVars.maxUserLen); + check = Sakura.stringLength(input.getAttribute('value'), sakuraVars.minUserLen, sakuraVars.maxUserLen); break; } - - if(input.className.indexOf(check ? 'green' : 'red') < 0) { + if (input.className.indexOf(check ? 'green' : 'red') < 0) { input.className = input.className + ' ' + (check ? 'green' : 'red'); } - - if(input.className.indexOf(check ? 'red' : 'green') > 0) { + if (input.className.indexOf(check ? 'red' : 'green') > 0) { input.className = input.className.replace(check ? 'red' : 'green', ''); } } - // Initialising the element parallax functionality function initialiseParallax(id) { // Assign the element to a variable var parallax = document.getElementById(id); - // Set proper position values - parallax.style.top = '-2.5px'; - parallax.style.bottom = '-2.5px'; - parallax.style.left = '-2.5px'; - parallax.style.right = '-2.5px'; - + parallax.style.top = '-2.5px'; + parallax.style.bottom = '-2.5px'; + parallax.style.left = '-2.5px'; + parallax.style.right = '-2.5px'; // Add the event listener to the body element - document.addEventListener("mousemove", function(e) { - + document.addEventListener("mousemove", function (e) { // Alter the position of the parallaxed element - parallax.style.top = convertParallaxPositionValue(e.clientY, true, false) + 'px'; - parallax.style.bottom = convertParallaxPositionValue(e.clientY, true, true) + 'px'; - parallax.style.left = convertParallaxPositionValue(e.clientX, false, false) + 'px'; - parallax.style.right = convertParallaxPositionValue(e.clientX, false, true) + 'px'; - + parallax.style.top = convertParallaxPositionValue(e.clientY, true, false) + 'px'; + parallax.style.bottom = convertParallaxPositionValue(e.clientY, true, true) + 'px'; + parallax.style.left = convertParallaxPositionValue(e.clientX, false, false) + 'px'; + parallax.style.right = convertParallaxPositionValue(e.clientX, false, true) + 'px'; }); } - // Converting the position value of the mouseover to a pixel value function convertParallaxPositionValue(pos, dir, neg) { // Get the body element var body = document.getElementsByTagName('body')[0]; - // Get percentage of current position var position = (pos / (dir ? body.clientHeight : body.clientWidth)) * 100; - // If someone decided to fuck with the inputs reset it to 0% - if(position < 0 || position > 100) { + if (position < 0 || position > 100) { position = 0; } - // Do the first maths position = (position / (dir ? 25 : 20)) - 2.5; - // If the negative flag is set inverse the number - if(neg) { + if (neg) { position = -position; } - // Subtract another 2.5 to make the element not go all over the place position = position - 2.5; - // Return the proper position value return position; } - -// Smooth scrolling +// """"""""Smooth"""""""" scrolling function scrollToTop() { // Get the current position var windowY = window.pageYOffset - 100; - // Move up window.scrollTo(0, windowY); - // Keep executing this function till we're at the top - if(windowY + 1 > 0) { - setTimeout(function(){scrollToTop();}, 10); + if (windowY + 1 > 0) { + setTimeout(function () { scrollToTop(); }, 10); } } - +// Replace some special tags function replaceTag(tag) { - return {'&': '&', '<': '<', '>': '>'}[tag] || tag; + return { '&': '&', '<': '<', '>': '>' }[tag] || tag; } - +// ^ function safeTagsReplace(str) { return str.replace(/[&<>]/g, replaceTag); } - +// Open a comment reply field function commentReply(id, session, category, action, avatar) { // Find subject post var replyingTo = document.getElementById('comment-' + id); - // Check if it actually exists - if(typeof replyingTo === 'undefined') { - return false; + if ((typeof replyingTo).toLowerCase() === 'undefined') { + return; } - // Attempt to get previously created box var replyBox = document.getElementById('comment-reply-container-' + id); - // Remove it if it already exists - if(replyBox) { + if (replyBox) { Sakura.removeById('comment-reply-container-' + id); - return false; + return; } - // Container var replyContainer = document.createElement('li'); replyContainer.id = 'comment-reply-container-' + id; - // Form var replyForm = document.createElement('form'); replyForm.id = 'comment-reply-' + id; replyForm.action = action; replyForm.method = 'post'; - // Session var replyInput = document.createElement('input'); replyInput.type = 'hidden'; replyInput.name = 'session'; replyInput.value = session; replyForm.appendChild(replyInput); - // Category var replyInput = document.createElement('input'); replyInput.type = 'hidden'; replyInput.name = 'category'; replyInput.value = category; replyForm.appendChild(replyInput); - // Reply ID var replyInput = document.createElement('input'); replyInput.type = 'hidden'; replyInput.name = 'replyto'; - replyInput.value = id; + replyInput.value = id.toString(); replyForm.appendChild(replyInput); - // Mode var replyInput = document.createElement('input'); replyInput.type = 'hidden'; replyInput.name = 'mode'; replyInput.value = 'comment'; replyForm.appendChild(replyInput); - // Comment container var replyDiv = document.createElement('div'); replyDiv.className = 'comment'; - // Avatar var replyAvatar = document.createElement('div'); replyAvatar.className = 'comment-avatar'; - replyAvatar.style = 'background-image: url(' + avatar + ')'; + replyAvatar.style.backgroundImage = 'url(' + avatar + ')'; replyDiv.appendChild(replyAvatar); - // Pointer var replyPoint = document.createElement('div'); replyPoint.className = 'comment-pointer'; replyDiv.appendChild(replyPoint); - // Textarea var replyText = document.createElement('textarea'); replyText.className = 'comment-content'; replyText.name = 'comment'; replyDiv.appendChild(replyText); - // Submit var replySubmit = document.createElement('input'); replySubmit.className = 'comment-submit'; @@ -620,26 +505,22 @@ function commentReply(id, session, category, action, avatar) { replySubmit.name = 'submit'; replySubmit.value = "\uf1d8"; replyDiv.appendChild(replySubmit); - // Append to form replyForm.appendChild(replyDiv); - // Append form to container replyContainer.appendChild(replyForm); - // Insert the HTML - if(replyingTo.children[1].children.length > 0) { + if (replyingTo.children[1].children.length > 0) { replyingTo.children[1].insertBefore(replyContainer, replyingTo.children[1].firstChild); - } else { + } + else { replyingTo.children[1].appendChild(replyContainer); } - // Prepare AJAX submission prepareAjaxForm(replyForm.id, 'Replying...'); } - // Inserting text into text box -// Borrowed from http://stackoverflow.com/questions/1064089/inserting-a-text-where-cursor-is-using-javascript-jquery +// Borrowed from http://stackoverflow.com/questions/1064089/inserting-a-text-where-cursor-is-using-javascript-jquery (therefore not in Typescript format, fix this later) function insertText(areaId, text) { var txtarea = document.getElementById(areaId); var scrollPos = txtarea.scrollTop; @@ -652,8 +533,8 @@ function insertText(areaId, text) { range.moveStart('character', -txtarea.value.length); strPos = range.text.length; } - else if (br == "ff") strPos = txtarea.selectionStart; - + else if (br == "ff") + strPos = txtarea.selectionStart; var front = (txtarea.value).substring(0, strPos); var back = (txtarea.value).substring(strPos, txtarea.value.length); txtarea.value = front + text + back; @@ -673,19 +554,19 @@ function insertText(areaId, text) { } txtarea.scrollTop = scrollPos; } - // Inserting a bbcode function insertBBcode(textarea, tag, arg) { + if (arg === void 0) { arg = false; } var element = document.getElementById(textarea); var before = "[" + tag + (arg ? "=" : "") + "]"; - var after = "[/" + tag + "]"; - + var after = "[/" + tag + "]"; if (document.selection) { element.focus(); var sel = document.selection.createRange(); sel.text = before + sel.text + after; element.focus(); - } else if (element.selectionStart || element.selectionStart === 0) { + } + else if (element.selectionStart || element.selectionStart === 0) { var startPos = element.selectionStart; var endPos = element.selectionEnd; var scrollTop = element.scrollTop; @@ -694,21 +575,14 @@ function insertBBcode(textarea, tag, arg) { element.selectionStart = startPos + before.length; element.selectionEnd = endPos + before.length; element.scrollTop = scrollTop; - } else { + } + else { element.value += before + after; element.focus(); } } - // Formatting money -Number.prototype.formatMoney = function(u, c, k) { - var f = this, - u = isNaN(u = Math.abs(u)) ? 2 : u, - c = c == undefined ? "." : c, - k = k == undefined ? "," : k, - i = f < 0 ? "-" : "", - n = parseInt(f = Math.abs(+f || 0).toFixed(u)) + "", - g = (g = n.length) > 3 ? g % 3 : 0; - +Number.prototype.formatMoney = function (u, c, k) { + var f = this, u = isNaN(u = Math.abs(u)) ? 2 : u, c = c == undefined ? "." : c, k = k == undefined ? "," : k, i = f < 0 ? "-" : "", n = parseInt(f = Math.abs(+f || 0).toFixed(u)) + "", g = (g = n.length) > 3 ? g % 3 : 0; return i + (g ? n.substr(0, g) + k : "") + n.substr(g).replace(/(\c{3})(?=\c)/g, "$1" + k) + (u ? c + Math.abs(f - n).toFixed(u).slice(2) : ""); }; diff --git a/public/content/data/yuuno/js/yuuno.test.js b/public/content/data/yuuno/js/yuuno.test.js deleted file mode 100644 index 604adb8..0000000 --- a/public/content/data/yuuno/js/yuuno.test.js +++ /dev/null @@ -1,591 +0,0 @@ -/* - * Sakura Yuuno - */ -// Spawns a notification -function notifyUI(content) { - // Grab the container and create an ID - var cont = document.getElementById('notifications'); - var id = 'sakura-notification-' + Date.now(); - // Create the elements - var alert = document.createElement('div'); - var aIcon = document.createElement('div'); - var aCont = document.createElement('div'); - var aTitle = document.createElement('div'); - var aText = document.createElement('div'); - var aClose = document.createElement('div'); - var aCIcon = document.createElement('div'); - var aClear = document.createElement('div'); - var aIconCont; - // Add attributes to the main element - alert.className = 'notification-enter'; - alert.id = id; - // Add the icon - if ((typeof content.img).toLowerCase() === 'undefined' && content.img == null && !(content.img.length > 1)) { - aIconCont = document.createElement('div'); - aIconCont.className = 'font-icon fa fa-info fa-4x'; - } - else if (content.img.substr(0, 5) == 'FONT:') { - aIconCont = document.createElement('div'); - aIconCont.className = 'font-icon fa ' + content.img.replace('FONT:', '') + ' fa-4x'; - } - else { - aIconCont = document.createElement('img'); - aIconCont.alt = id; - aIconCont.img = content.img; - } - aIcon.appendChild(aIconCont); - aIcon.className = 'notification-icon'; - alert.appendChild(aIcon); - // Add the content - aCont.className = 'notification-content'; - aTitle.className = 'notification-title'; - aText.className = 'notifcation-text'; - aTitle.textContent = content.title; - aText.textContent = content.text; - // Check if a link exists and add if it does - if ((typeof content.link).toLowerCase() !== 'undefined' && content.link !== null && content.link.length > 1) { - alert.setAttribute('sakurahref', content.link); - aCont.setAttribute('onclick', content.link.substr(0, 11) == 'javascript:' ? content.link.substring(11) : 'notifyOpen(this.parentNode.id);'); - } - // Append stuff - aCont.appendChild(aTitle); - aCont.appendChild(aText); - alert.appendChild(aCont); - // Add the close button - aClose.className = 'notification-close'; - aClose.setAttribute('onclick', 'notifyClose(this.parentNode.id);'); - aClose.appendChild(aCIcon); - alert.appendChild(aClose); - // Append the notification to the document - cont.appendChild(alert); - // Play sound if request - if (content.sound) { - // Create the elements - var sound = document.createElement('audio'); - var mp3 = document.createElement('source'); - var ogg = document.createElement('source'); - // Assign attribs - mp3.type = 'audio/mp3'; - ogg.type = 'audio/ogg'; - mp3.src = sakuraVars.content_path + '/sounds/notify.mp3'; - ogg.src = sakuraVars.content_path + '/sounds/notify.ogg'; - // Append - sound.appendChild(mp3); - sound.appendChild(ogg); - // And play - sound.play(); - } - // If keepalive is 0 keep the notification open forever - if (content.timeout > 0) { - // Set a timeout and close after an amount - setTimeout(function () { - notifyClose(id); - }, content.timeout); - } -} -// Closing a notification -function notifyClose(id) { - // Get the element - var e = document.getElementById(id); - // Add the animation - e.className = 'notification-exit'; - // Remove after 410 ms - setTimeout(function () { - Sakura.removeById(id); - }, 410); -} -// Opening an alerted link -function notifyOpen(id) { - var sakuraHref = document.getElementById(id).getAttribute('sakurahref'); - if ((typeof sakuraHref).toLowerCase() !== 'undefined') { - location = new Location(); - location.assign(sakuraHref); - window.location = location; - } -} -// Request notifications -function notifyRequest(session) { - // Check if the document isn't hidden - if (document.hidden) { - return; - } - // Create AJAX object - var get = new AJAX(); - get.setUrl('/settings.php?request-notifications=true&time=' + Sakura.epoch() + '&session=' + session); - // Add callbacks - get.addCallback(200, function () { - // Assign the parsed JSON - var data = JSON.parse(get.response()); - // Check if nothing went wrong - if ((typeof data).toLowerCase() === 'undefined') { - // Inform the user - throw "No or invalid data was returned"; - // Stop - return; - } - // Create an object for every notification - for (var id in data) { - notifyUI(data[id]); - } - }); - get.start(HTTPMethods.GET); -} -// Show the full page busy window -function ajaxBusyView(show, message, type) { - if (message === void 0) { message = null; } - if (type === void 0) { type = null; } - // Get elements - var cont = document.getElementById('ajaxBusy'); - var stat = document.getElementById('ajaxStatus'); - var anim = document.getElementById('ajaxAnimate'); - var body = document.getElementById('contentwrapper'); - var icon = 'fa fa-4x '; - // Select the proper icon - switch (type) { - case 'ok': - icon += 'fa-check'; - break; - case 'fail': - icon += 'fa-remove'; - break; - case 'busy': - default: - icon += 'fa-refresh fa-spin'; - break; - } - // If request to show the window, build it - if (show) { - if ((typeof cont).toLowerCase() === 'undefined' || cont === null) { - // Container - var cCont = document.createElement('div'); - cCont.className = 'ajax-busy'; - cCont.id = 'ajaxBusy'; - // Inner - var cInner = document.createElement('div'); - cInner.className = 'ajax-inner'; - cCont.appendChild(cInner); - // Desc - var cMsg = document.createElement('h2'); - cMsg.id = 'ajaxStatus'; - cInner.appendChild(cMsg); - // Icon - var cIco = document.createElement('div'); - cIco.id = 'ajaxAnimate'; - cInner.appendChild(cIco); - // Append to document - body.appendChild(cCont); - // Reassign - cont = document.getElementById('ajaxBusy'); - stat = document.getElementById('ajaxStatus'); - anim = document.getElementById('ajaxAnimate'); - } - // Update the icon - anim.className = icon; - // Update the message - stat.textContent = (message === null ? '' : message); - } - else { - if (cont !== null) { - var out = setInterval(function () { - if (cont.style.opacity === null || cont.style.opacity === "") { - cont.style.opacity = "1"; - } - // If the value isn't 0 yet subtract by .1 - if (parseInt(cont.style.opacity) > 0) { - cont.style.opacity = (parseInt(cont.style.opacity) - 0.1).toString(); - } - else { - Sakura.removeById('ajaxBusy'); - clearInterval(out); - } - }, 10); - } - } -} -// Making a post request using AJAX -function ajaxPost(url, data, callback) { - // Create AJAX - var request = new AJAX(); - // Set url - request.setUrl(url); - // Add callbacks - request.addCallback(200, function () { - callback.call(request.response()); - }); - request.addCallback(0, function () { - ajaxBusyView(false); - throw "POST Request failed"; - }); - // Add header - request.addHeader('Content-Type', 'application/x-www-form-urlencoded'); - // Set the post data - request.setSend(data); - // Make the request - request.start(HTTPMethods.POST); -} -// Convert a href attr to an object -function prepareAjaxLink(linkId, callback, attrs) { - if (attrs === void 0) { attrs = null; } - // Get element - var link = (typeof linkId).toLowerCase() === 'object' ? linkId : document.getElementById(linkId); - // Catch null - if (link === null) { - return; - } - // Get the raw HREF value - var href = link.getAttribute('href'); - // Get the action - var action = href.split('?')[0]; - // Split the request variables - var varEarly = href.split('?')[1].split('&'); - // Create storage thing - var variables = new Object(); - // Split them - for (var k in varEarly) { - // Split - var newVar = varEarly[k].split('='); - // Push - variables[newVar[0]] = newVar[1]; - } - // Add ajax=true - variables['ajax'] = true; - // Update link attributes - link.setAttribute('href', 'javascript:void(0);'); - link.setAttribute('onclick', callback + '(\'' + action + '\', JSON.parse(\'' + JSON.stringify(variables) + '\')' + (typeof attrs != 'undefined' ? attrs : '') + ');'); -} -// Prepare a form for an AJAX request -function prepareAjaxForm(formId, message, resetCaptcha) { - if (resetCaptcha === void 0) { resetCaptcha = false; } - // Get the form - var form = document.getElementById(formId); - // Create hidden ajax input - var hide = document.createElement('input'); - // Set the attributes - hide.name = 'ajax'; - hide.value = 'true'; - hide.type = 'hidden'; - form.appendChild(hide); - // Update form - form.setAttribute('onsubmit', 'submitPost(\'' + form.getAttribute('action') + '\', formToObject(\'' + formId + '\'), true, \'' + (message ? message : 'Please wait...') + '\', ' + (resetCaptcha ? 'true' : 'false') + ');'); - form.setAttribute('action', 'javascript:void(0);'); -} -// Convert form to an object -function formToObject(formId) { - // Get the form - var form = document.getElementById(formId); - // Make an object for the request parts - var requestParts = new Object(); - // Get all the children with a name attr - var children = form.querySelectorAll('[name]'); - // Sort the children and make them ready for submission - for (var i in children) { - if ((typeof children[i]).toLowerCase() === 'object') { - requestParts[children[i].name] = ((typeof children[i].type !== "undefined" && children[i].type.toLowerCase() == "checkbox") ? (children[i].checked ? 1 : 0) : children[i].value); - } - } - // Return the request parts - return requestParts; -} -// Quickly building a form -function generateForm(formId, formAttr, formData, appendTo) { - if (appendTo === void 0) { appendTo = null; } - // Create form element - var form = document.createElement('form'); - form.id = formId; - // Set additional attrs - for (var c in formAttr) { - form.setAttribute(c, formAttr[c]); - } - // Set data - for (var a in formData) { - var b = document.createElement('input'); - b.type = 'hidden'; - b.name = a; - b.value = formData[a]; - form.appendChild(b); - } - // Append to something if requested - if (appendTo !== null) { - document.getElementById(appendTo).appendChild(form); - } - return form; -} -// Submitting a post using AJAX -function submitPost(action, requestParts, busyView, msg, resetCaptcha) { - var _this = this; - // If requested display the busy thing - if (busyView) { - ajaxBusyView(true, msg, 'busy'); - } - // Submit the AJAX - var request = ajaxPost(action, requestParts, function () { - submitPostHandler(_this, busyView, resetCaptcha); - }); -} -// Handling a submitted form using AJAX -function submitPostHandler(result, busyView, resetCaptcha) { - // Split the result - var data = result.split('|'); - // If using the bust view thing update the text displayed to the return of the request - if (busyView) { - ajaxBusyView(true, result[0], (result[1] == '1' ? 'ok' : 'fail')); - } - // Reset captcha - if (resetCaptcha && result[1] != '1' && sakuraVars.recaptchaEnabled != '0') { - grecaptcha.reset(); - } - setTimeout(function () { - if (busyView) { - ajaxBusyView(false); - } - if (result[1] == '1') { - location = new Location(); - location.assign(result[2]); - window.location = location; - } - }, 2000); -} -// Check if a password is within the minimum entropy value -function checkPwdEntropy(pwd) { - return (Sakura.entropy(pwd) >= sakuraVars.minPwdEntropy); -} -// Check registration variables -function registerVarCheck(id, mode, option) { - if (option === void 0) { option = null; } - // Get the element we're working with - var input = document.getElementById(id); - var check = null; - // Use the proper mode - switch (mode) { - case 'confirmpw': - option = document.getElementById(option); - check = input.getAttribute('value') === option.value; - break; - case 'password': - check = checkPwdEntropy(input.getAttribute('value')); - break; - case 'email': - check = Sakura.validateEmail(input.getAttribute('value')); - break; - case 'username': - default: - check = Sakura.stringLength(input.getAttribute('value'), sakuraVars.minUserLen, sakuraVars.maxUserLen); - break; - } - if (input.className.indexOf(check ? 'green' : 'red') < 0) { - input.className = input.className + ' ' + (check ? 'green' : 'red'); - } - if (input.className.indexOf(check ? 'red' : 'green') > 0) { - input.className = input.className.replace(check ? 'red' : 'green', ''); - } -} -// Initialising the element parallax functionality -function initialiseParallax(id) { - // Assign the element to a variable - var parallax = document.getElementById(id); - // Set proper position values - parallax.style.top = '-2.5px'; - parallax.style.bottom = '-2.5px'; - parallax.style.left = '-2.5px'; - parallax.style.right = '-2.5px'; - // Add the event listener to the body element - document.addEventListener("mousemove", function (e) { - // Alter the position of the parallaxed element - parallax.style.top = convertParallaxPositionValue(e.clientY, true, false) + 'px'; - parallax.style.bottom = convertParallaxPositionValue(e.clientY, true, true) + 'px'; - parallax.style.left = convertParallaxPositionValue(e.clientX, false, false) + 'px'; - parallax.style.right = convertParallaxPositionValue(e.clientX, false, true) + 'px'; - }); -} -// Converting the position value of the mouseover to a pixel value -function convertParallaxPositionValue(pos, dir, neg) { - // Get the body element - var body = document.getElementsByTagName('body')[0]; - // Get percentage of current position - var position = (pos / (dir ? body.clientHeight : body.clientWidth)) * 100; - // If someone decided to fuck with the inputs reset it to 0% - if (position < 0 || position > 100) { - position = 0; - } - // Do the first maths - position = (position / (dir ? 25 : 20)) - 2.5; - // If the negative flag is set inverse the number - if (neg) { - position = -position; - } - // Subtract another 2.5 to make the element not go all over the place - position = position - 2.5; - // Return the proper position value - return position; -} -// """"""""Smooth"""""""" scrolling -function scrollToTop() { - // Get the current position - var windowY = window.pageYOffset - 100; - // Move up - window.scrollTo(0, windowY); - // Keep executing this function till we're at the top - if (windowY + 1 > 0) { - setTimeout(function () { scrollToTop(); }, 10); - } -} -// Replace some special tags -function replaceTag(tag) { - return { '&': '&', '<': '<', '>': '>' }[tag] || tag; -} -// ^ -function safeTagsReplace(str) { - return str.replace(/[&<>]/g, replaceTag); -} -// Open a comment reply field -function commentReply(id, session, category, action, avatar) { - // Find subject post - var replyingTo = document.getElementById('comment-' + id); - // Check if it actually exists - if ((typeof replyingTo).toLowerCase() === 'undefined') { - return; - } - // Attempt to get previously created box - var replyBox = document.getElementById('comment-reply-container-' + id); - // Remove it if it already exists - if (replyBox) { - Sakura.removeById('comment-reply-container-' + id); - return; - } - // Container - var replyContainer = document.createElement('li'); - replyContainer.id = 'comment-reply-container-' + id; - // Form - var replyForm = document.createElement('form'); - replyForm.id = 'comment-reply-' + id; - replyForm.action = action; - replyForm.method = 'post'; - // Session - var replyInput = document.createElement('input'); - replyInput.type = 'hidden'; - replyInput.name = 'session'; - replyInput.value = session; - replyForm.appendChild(replyInput); - // Category - var replyInput = document.createElement('input'); - replyInput.type = 'hidden'; - replyInput.name = 'category'; - replyInput.value = category; - replyForm.appendChild(replyInput); - // Reply ID - var replyInput = document.createElement('input'); - replyInput.type = 'hidden'; - replyInput.name = 'replyto'; - replyInput.value = id.toString(); - replyForm.appendChild(replyInput); - // Mode - var replyInput = document.createElement('input'); - replyInput.type = 'hidden'; - replyInput.name = 'mode'; - replyInput.value = 'comment'; - replyForm.appendChild(replyInput); - // Comment container - var replyDiv = document.createElement('div'); - replyDiv.className = 'comment'; - // Avatar - var replyAvatar = document.createElement('div'); - replyAvatar.className = 'comment-avatar'; - replyAvatar.style.backgroundImage = 'url(' + avatar + ')'; - replyDiv.appendChild(replyAvatar); - // Pointer - var replyPoint = document.createElement('div'); - replyPoint.className = 'comment-pointer'; - replyDiv.appendChild(replyPoint); - // Textarea - var replyText = document.createElement('textarea'); - replyText.className = 'comment-content'; - replyText.name = 'comment'; - replyDiv.appendChild(replyText); - // Submit - var replySubmit = document.createElement('input'); - replySubmit.className = 'comment-submit'; - replySubmit.type = 'submit'; - replySubmit.name = 'submit'; - replySubmit.value = "\uf1d8"; - replyDiv.appendChild(replySubmit); - // Append to form - replyForm.appendChild(replyDiv); - // Append form to container - replyContainer.appendChild(replyForm); - // Insert the HTML - if (replyingTo.children[1].children.length > 0) { - replyingTo.children[1].insertBefore(replyContainer, replyingTo.children[1].firstChild); - } - else { - replyingTo.children[1].appendChild(replyContainer); - } - // Prepare AJAX submission - prepareAjaxForm(replyForm.id, 'Replying...'); -} -// Inserting text into text box -// Borrowed from http://stackoverflow.com/questions/1064089/inserting-a-text-where-cursor-is-using-javascript-jquery (therefore not in Typescript format, fix this later) -function insertText(areaId, text) { - var txtarea = document.getElementById(areaId); - var scrollPos = txtarea.scrollTop; - var strPos = 0; - var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? - "ff" : (document.selection ? "ie" : false)); - if (br == "ie") { - txtarea.focus(); - var range = document.selection.createRange(); - range.moveStart('character', -txtarea.value.length); - strPos = range.text.length; - } - else if (br == "ff") - strPos = txtarea.selectionStart; - var front = (txtarea.value).substring(0, strPos); - var back = (txtarea.value).substring(strPos, txtarea.value.length); - txtarea.value = front + text + back; - strPos = strPos + text.length; - if (br == "ie") { - txtarea.focus(); - var range = document.selection.createRange(); - range.moveStart('character', -txtarea.value.length); - range.moveStart('character', strPos); - range.moveEnd('character', 0); - range.select(); - } - else if (br == "ff") { - txtarea.selectionStart = strPos; - txtarea.selectionEnd = strPos; - txtarea.focus(); - } - txtarea.scrollTop = scrollPos; -} -// Inserting a bbcode -function insertBBcode(textarea, tag, arg) { - if (arg === void 0) { arg = false; } - var element = document.getElementById(textarea); - var before = "[" + tag + (arg ? "=" : "") + "]"; - var after = "[/" + tag + "]"; - if (document.selection) { - element.focus(); - var sel = document.selection.createRange(); - sel.text = before + sel.text + after; - element.focus(); - } - else if (element.selectionStart || element.selectionStart === 0) { - var startPos = element.selectionStart; - var endPos = element.selectionEnd; - var scrollTop = element.scrollTop; - element.value = element.value.substring(0, startPos) + before + element.value.substring(startPos, endPos) + after + element.value.substring(endPos, element.value.length); - element.focus(); - element.selectionStart = startPos + before.length; - element.selectionEnd = endPos + before.length; - element.scrollTop = scrollTop; - } - else { - element.value += before + after; - element.focus(); - } -} -// Formatting money -Number.prototype.formatMoney = function (u, c, k) { - var f = this, u = isNaN(u = Math.abs(u)) ? 2 : u, c = c == undefined ? "." : c, k = k == undefined ? "," : k, i = f < 0 ? "-" : "", n = parseInt(f = Math.abs(+f || 0).toFixed(u)) + "", g = (g = n.length) > 3 ? g % 3 : 0; - return i + (g ? n.substr(0, g) + k : "") + n.substr(g).replace(/(\c{3})(?=\c)/g, "$1" + k) + (u ? c + Math.abs(f - n).toFixed(u).slice(2) : ""); -}; diff --git a/public/content/data/yuuno/js/yuuno.test.ts b/public/content/data/yuuno/js/yuuno.ts similarity index 98% rename from public/content/data/yuuno/js/yuuno.test.ts rename to public/content/data/yuuno/js/yuuno.ts index 4e8e7d6..0ed9411 100644 --- a/public/content/data/yuuno/js/yuuno.test.ts +++ b/public/content/data/yuuno/js/yuuno.ts @@ -127,9 +127,7 @@ function notifyOpen(id: string): void { var sakuraHref: string = document.getElementById(id).getAttribute('sakurahref'); if ((typeof sakuraHref).toLowerCase() !== 'undefined') { - location = new Location(); - location.assign(sakuraHref); - window.location = location; + window.location.assign(sakuraHref); } } @@ -247,7 +245,7 @@ function ajaxBusyView(show: boolean, message: string = null, type: string = null } // Making a post request using AJAX -function ajaxPost(url: string, data: Object, callback: Function): void { +function ajaxPost(url: string, data: Object, callback: Function): AJAX { // Create AJAX var request = new AJAX(); @@ -272,6 +270,9 @@ function ajaxPost(url: string, data: Object, callback: Function): void { // Make the request request.start(HTTPMethods.POST); + + // Return the AJAX object + return request; } // Convert a href attr to an object @@ -391,14 +392,14 @@ function submitPost(action: string, requestParts: Object, busyView: boolean, msg // Submit the AJAX var request = ajaxPost(action, requestParts, () => { - submitPostHandler(this, busyView, resetCaptcha); + submitPostHandler(request.response(), busyView, resetCaptcha); }); } // Handling a submitted form using AJAX -function submitPostHandler(result: string, busyView: boolean, resetCaptcha: boolean): void { +function submitPostHandler(data: string, busyView: boolean, resetCaptcha: boolean): void { // Split the result - var data: string[] = result.split('|'); + var result: string[] = data.split('|'); // If using the bust view thing update the text displayed to the return of the request if (busyView) { @@ -416,9 +417,7 @@ function submitPostHandler(result: string, busyView: boolean, resetCaptcha: bool } if (result[1] == '1') { - location = new Location(); - location.assign(result[2]); - window.location = location; + window.location.assign(result[2]); } }, 2000); } diff --git a/public/content/data/yuuno/jsold/ybabstat.js b/public/content/data/yuuno/jsold/ybabstat.js deleted file mode 100644 index eca73ff..0000000 --- a/public/content/data/yuuno/jsold/ybabstat.js +++ /dev/null @@ -1,79 +0,0 @@ -var illuminati = []; -var startTime = (new Date()).getTime(); - -function hideYourMind(conflictions) { - - var twoThousandTwelveIsTheYearWeAscendToSpaceRobots = conflictions.keyCode; - - illuminati.push(twoThousandTwelveIsTheYearWeAscendToSpaceRobots); - - if(illuminati[0] == 68 && illuminati[1] == 73 && illuminati[2] == 67 && illuminati[3] == 75 && illuminati[4] == 83) { - - var dicksAre = document.createElement('audio'); - var forMyFriends = document.createElement('source'); - var whenTheyCome = document.createElement('source'); - - forMyFriends.setAttribute('type', 'audio/mp3'); - whenTheyCome.setAttribute('type', 'audio/ogg'); - - forMyFriends.setAttribute('src', sakuraVars.content + '/sounds/dicks.mp3'); - whenTheyCome.setAttribute('src', sakuraVars.content + '/sounds/dicks.ogg'); - - dicksAre.appendChild(forMyFriends); - dicksAre.appendChild(whenTheyCome); - - var toMyHouse = dicksAre; - - toMyHouse.play(); - - illuminati = []; - - } - - if(illuminati[0] == 77 && illuminati[1] == 69 && illuminati[2] == 87 && illuminati[3] == 79 && illuminati[4] == 87) { - - var noklz = document.createElement('audio'); - var von = document.createElement('source'); - var schnitzel = document.createElement('source'); - - von.setAttribute('type', 'audio/mp3'); - schnitzel.setAttribute('type', 'audio/ogg'); - - von.setAttribute('src', sakuraVars.content + '/sounds/mewow.mp3'); - schnitzel.setAttribute('src', sakuraVars.content + '/sounds/mewow.ogg'); - - noklz.appendChild(von); - noklz.appendChild(schnitzel); - - noklz.play(); - - document.body.style.animation = 'spin 5s infinite linear'; - - illuminati = []; - - } - - if(illuminati[0] == 83 && illuminati[1] == 79 && illuminati[2] == 67 && illuminati[3] == 75 && illuminati[4] == 67 && illuminati[5] == 72 && illuminati[6] == 65 && illuminati[7] == 84) { - - setInterval("twoThousandSixteenIsTheYearWePhysicallyMergeWithCats();", 17); - - illuminati = []; - - } - -} - -function twoThousandSixteenIsTheYearWePhysicallyMergeWithCats() { - - var diff = (new Date()).getTime() - startTime; - var vals = [-7 / Math.cos((diff / 500) * (.85 * Math.PI)), -7 * Math.tan((diff / 250) * (.85 * Math.PI))]; - - document.body.style.position = 'absolute'; - document.body.style.left = vals[0] + 'px'; - document.body.style.top = vals[1] + 'px'; - document.body.style.fontSize = vals[0] + 'px'; - -} - -document.addEventListener("onkeydown", hideYourMind, false); -document.addEventListener("keydown", hideYourMind, false); diff --git a/public/manage.php b/public/manage.php index a8113a3..64ff12d 100644 --- a/public/manage.php +++ b/public/manage.php @@ -30,6 +30,9 @@ $modes = [ 'appearance', 'performance', ], + 'logs' => [ + 'errors', + ], 'error' => [ 'index', ], @@ -67,17 +70,9 @@ $renderData = array_merge($renderData, [ // Add special variables switch ($category . '.' . $mode) { - case 'system.index': - $renderData = array_merge($renderData, [ - 'uname' => [ - 'osn' => php_uname('s'), - 'osv' => php_uname('v'), - 'host' => php_uname('n'), - 'arch' => php_uname('m'), - ], - ]); - break; - case 'config.index': + case 'logs.errors': + $errorLog = Database::fetch('error_log', true, null, ['error_id', true]); + $renderData = array_merge($renderData, ['errors' => $errorLog]); break; } @@ -91,4 +86,4 @@ $template->setTemplate($templateName); $template->setVariables($renderData); // Print page contents -echo $template->render('pages/' . $mode . '.' . $category . '.tpl'); +echo $template->render('pages/' . $category . '/' . $mode . '.tpl'); diff --git a/sakura.php b/sakura.php index eadf4b9..cd94f52 100644 --- a/sakura.php +++ b/sakura.php @@ -8,7 +8,7 @@ namespace Sakura; // Define Sakura version -define('SAKURA_VERSION', '20151208'); +define('SAKURA_VERSION', '20151209'); define('SAKURA_VLABEL', 'Eminence'); define('SAKURA_COLOUR', '#6C3082'); @@ -32,6 +32,7 @@ if (!@include_once ROOT . 'vendor/autoload.php') { } // Include components +require_once ROOT . 'libraries/ActionCode.php'; require_once ROOT . 'libraries/Bans.php'; require_once ROOT . 'libraries/BBcode.php'; require_once ROOT . 'libraries/Comments.php'; diff --git a/templates/broomcloset/pages/general.configuration.tpl b/templates/broomcloset/pages/configuration/general.tpl similarity index 100% rename from templates/broomcloset/pages/general.configuration.tpl rename to templates/broomcloset/pages/configuration/general.tpl diff --git a/templates/broomcloset/pages/index.dashboard.tpl b/templates/broomcloset/pages/dashboard/index.tpl similarity index 100% rename from templates/broomcloset/pages/index.dashboard.tpl rename to templates/broomcloset/pages/dashboard/index.tpl diff --git a/templates/broomcloset/pages/index.error.tpl b/templates/broomcloset/pages/error/index.tpl similarity index 100% rename from templates/broomcloset/pages/index.error.tpl rename to templates/broomcloset/pages/error/index.tpl diff --git a/templates/broomcloset/pages/logs/errors.tpl b/templates/broomcloset/pages/logs/errors.tpl new file mode 100644 index 0000000..7951cc3 --- /dev/null +++ b/templates/broomcloset/pages/logs/errors.tpl @@ -0,0 +1,44 @@ +{% extends 'global/master.tpl' %} + +{% block title %}Error Log{% endblock %} + +{% block js %} + +{% endblock %} + +{% block content %} +
+

Error Log A log of server side errors that Sakura could catch

+ + + + + + + + + + + + + + {% for error in errors %} + + + + + + + + + + {% endfor %} + +
IDOccurredRevisionTypeLineStringFile
{{ error.error_id }}{{ error.error_timestamp }}{{ error.error_revision }}{{ error.error_type }}{{ error.error_line }}{{ error.error_string }}{{ error.error_file }}
+
+{% endblock %} diff --git a/templates/yuuno/global/master.tpl b/templates/yuuno/global/master.tpl index fddad07..ab76bfc 100644 --- a/templates/yuuno/global/master.tpl +++ b/templates/yuuno/global/master.tpl @@ -124,14 +124,12 @@ {% endif %} if(!Sakura.cookie('accept_cookies')) { - notifyUI({ "title": sakuraVars.siteName + " uses cookies!", "text": "Click this if you're OK with that and want to hide this message.", "img": "FONT:fa-asterisk", "link": "javascript:Sakura.cookie('accept_cookies', 'true; expires=" + (new Date(2147483647000)).toUTCString() + "');notifyClose(this.parentNode.id);" }); - } }); @@ -144,7 +142,6 @@ "img": "FONT:fa-warning" }); } - {{ block('js') }}