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 %}
+
+
+
+
+
+ ID |
+ Occurred |
+ Revision |
+ Type |
+ Line |
+ String |
+ File |
+
+
+
+ {% for error in errors %}
+
+ {{ error.error_id }} |
+ {{ error.error_timestamp }} |
+ {{ error.error_revision }} |
+ {{ error.error_type }} |
+ {{ error.error_line }} |
+ {{ error.error_string }} |
+ {{ error.error_file }} |
+
+ {% endfor %}
+
+
+
+{% 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') }}