fixed system stuff & added new icons

This commit is contained in:
Ulf Gebhardt 2019-08-22 18:31:53 +02:00
parent 54b29c7278
commit 76e99dcc73
No known key found for this signature in database
GPG Key ID: 81308EFE29ABFEBD
464 changed files with 1150 additions and 547 deletions

8
.htaccess Normal file
View File

@ -0,0 +1,8 @@
RewriteEngine On
RewriteRule ^(.*)/fonts/fontawesome-webfont(.*)$ lib/system/lib/font_awesome/lib/fonts/fontawesome-webfont$2 [L]
RewriteRule ^sai$ sai.php$1 [L]
# not working for some reason
RewriteRule ^(.*)/files/([^/]+)/([^/]+)$ api.php?call=files&cat=$2&id=$3 [L]
RewriteRule ^cache/([^/]+)/([^/]+)$ api.php?call=cache&id=$1&ident=$2 [L]

10
api.php
View File

@ -1,13 +1,5 @@
<?php
require_once 'lib/autoload.inc'; //SYSTEM Classes
require_once 'teamspeak/autoload.inc'; //Project Classes
require_once '/home/web/web/config/get_config.php';
\SYSTEM\system::start(\WEBCRAFT\get_config(dirname(__FILE__)));
\SYSTEM\system::include_ExceptionShortcut();
\SYSTEM\system::include_ResultShortcut();
\SYSTEM\system::register_errorhandler_dbwriter();
\SYSTEM\system::register_errorhandler_jsonoutput();
include 'index.inc';
echo \SYSTEM\API\api::run('\SYSTEM\API\verify','api_teamspeak',array_merge($_POST,$_GET));
new \SYSTEM\LOG\COUNTER("API was called sucessfully.");

0
cache/.gitkeep vendored Normal file
View File

View File

@ -0,0 +1,912 @@
/* jqBootstrapValidation
* A plugin for automating validation on Twitter Bootstrap formatted forms.
*
* v1.3.6
*
* License: MIT <http://opensource.org/licenses/mit-license.php> - see LICENSE file
*
* http://ReactiveRaven.github.com/jqBootstrapValidation/
*/
(function( $ ){
var createdElements = [];
var defaults = {
options: {
prependExistingHelpBlock: false,
sniffHtml: true, // sniff for 'required', 'maxlength', etc
preventSubmit: true, // stop the form submit event from firing if validation fails
submitError: false, // function called if there is an error when trying to submit
submitSuccess: false, // function called just before a successful submit event is sent to the server
semanticallyStrict: false, // set to true to tidy up generated HTML output
autoAdd: {
helpBlocks: true
},
filter: function () {
// return $(this).is(":visible"); // only validate elements you can see
return true; // validate everything
}
},
methods: {
init : function( options ) {
var settings = $.extend(true, {}, defaults);
settings.options = $.extend(true, settings.options, options);
var $siblingElements = this;
var uniqueForms = $.unique(
$siblingElements.map( function () {
return $(this).parents("form")[0];
}).toArray()
);
$(uniqueForms).bind("submit", function (e) {
var $form = $(this);
var warningsFound = 0;
var $inputs = $form.find("input,textarea,select").not("[type=submit],[type=image]").filter(settings.options.filter);
$inputs.trigger("submit.validation").trigger("validationLostFocus.validation");
$inputs.each(function (i, el) {
var $this = $(el),
$controlGroup = $this.parents(".control-group").first();
if (
$controlGroup.hasClass("warning")
) {
$controlGroup.removeClass("warning").addClass("error");
warningsFound++;
}
});
$inputs.trigger("validationLostFocus.validation");
if (warningsFound) {
if (settings.options.preventSubmit) {
e.preventDefault();
}
$form.addClass("error");
if ($.isFunction(settings.options.submitError)) {
settings.options.submitError($form, e, $inputs.jqBootstrapValidation("collectErrors", true));
}
} else {
$form.removeClass("error");
if ($.isFunction(settings.options.submitSuccess)) {
settings.options.submitSuccess($form, e);
}
}
});
return this.each(function(){
// Get references to everything we're interested in
var $this = $(this),
$controlGroup = $this.parents(".control-group").first(),
$helpBlock = $controlGroup.find(".help-block").first(),
$form = $this.parents("form").first(),
validatorNames = [];
// create message container if not exists
if (!$helpBlock.length && settings.options.autoAdd && settings.options.autoAdd.helpBlocks) {
$helpBlock = $('<div class="help-block" />');
$controlGroup.find('.controls').append($helpBlock);
createdElements.push($helpBlock[0]);
}
// =============================================================
// SNIFF HTML FOR VALIDATORS
// =============================================================
// *snort sniff snuffle*
if (settings.options.sniffHtml) {
var message = "";
// ---------------------------------------------------------
// PATTERN
// ---------------------------------------------------------
if ($this.attr("pattern") !== undefined) {
message = "Not in the expected format<!-- data-validation-pattern-message to override -->";
if ($this.data("validationPatternMessage")) {
message = $this.data("validationPatternMessage");
}
$this.data("validationPatternMessage", message);
$this.data("validationPatternRegex", $this.attr("pattern"));
}
// ---------------------------------------------------------
// MAX
// ---------------------------------------------------------
if ($this.attr("max") !== undefined || $this.attr("aria-valuemax") !== undefined) {
var max = ($this.attr("max") !== undefined ? $this.attr("max") : $this.attr("aria-valuemax"));
message = "Too high: Maximum of '" + max + "'<!-- data-validation-max-message to override -->";
if ($this.data("validationMaxMessage")) {
message = $this.data("validationMaxMessage");
}
$this.data("validationMaxMessage", message);
$this.data("validationMaxMax", max);
}
// ---------------------------------------------------------
// MIN
// ---------------------------------------------------------
if ($this.attr("min") !== undefined || $this.attr("aria-valuemin") !== undefined) {
var min = ($this.attr("min") !== undefined ? $this.attr("min") : $this.attr("aria-valuemin"));
message = "Too low: Minimum of '" + min + "'<!-- data-validation-min-message to override -->";
if ($this.data("validationMinMessage")) {
message = $this.data("validationMinMessage");
}
$this.data("validationMinMessage", message);
$this.data("validationMinMin", min);
}
// ---------------------------------------------------------
// MAXLENGTH
// ---------------------------------------------------------
if ($this.attr("maxlength") !== undefined) {
message = "Too long: Maximum of '" + $this.attr("maxlength") + "' characters<!-- data-validation-maxlength-message to override -->";
if ($this.data("validationMaxlengthMessage")) {
message = $this.data("validationMaxlengthMessage");
}
$this.data("validationMaxlengthMessage", message);
$this.data("validationMaxlengthMaxlength", $this.attr("maxlength"));
}
// ---------------------------------------------------------
// MINLENGTH
// ---------------------------------------------------------
if ($this.attr("minlength") !== undefined) {
message = "Too short: Minimum of '" + $this.attr("minlength") + "' characters<!-- data-validation-minlength-message to override -->";
if ($this.data("validationMinlengthMessage")) {
message = $this.data("validationMinlengthMessage");
}
$this.data("validationMinlengthMessage", message);
$this.data("validationMinlengthMinlength", $this.attr("minlength"));
}
// ---------------------------------------------------------
// REQUIRED
// ---------------------------------------------------------
if ($this.attr("required") !== undefined || $this.attr("aria-required") !== undefined) {
message = settings.builtInValidators.required.message;
if ($this.data("validationRequiredMessage")) {
message = $this.data("validationRequiredMessage");
}
$this.data("validationRequiredMessage", message);
}
// ---------------------------------------------------------
// NUMBER
// ---------------------------------------------------------
if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "number") {
message = settings.builtInValidators.number.message;
if ($this.data("validationNumberMessage")) {
message = $this.data("validationNumberMessage");
}
$this.data("validationNumberMessage", message);
}
// ---------------------------------------------------------
// EMAIL
// ---------------------------------------------------------
if ($this.attr("type") !== undefined && $this.attr("type").toLowerCase() === "email") {
message = "Not a valid email address<!-- data-validator-validemail-message to override -->";
if ($this.data("validationValidemailMessage")) {
message = $this.data("validationValidemailMessage");
} else if ($this.data("validationEmailMessage")) {
message = $this.data("validationEmailMessage");
}
$this.data("validationValidemailMessage", message);
}
// ---------------------------------------------------------
// MINCHECKED
// ---------------------------------------------------------
if ($this.attr("minchecked") !== undefined) {
message = "Not enough options checked; Minimum of '" + $this.attr("minchecked") + "' required<!-- data-validation-minchecked-message to override -->";
if ($this.data("validationMincheckedMessage")) {
message = $this.data("validationMincheckedMessage");
}
$this.data("validationMincheckedMessage", message);
$this.data("validationMincheckedMinchecked", $this.attr("minchecked"));
}
// ---------------------------------------------------------
// MAXCHECKED
// ---------------------------------------------------------
if ($this.attr("maxchecked") !== undefined) {
message = "Too many options checked; Maximum of '" + $this.attr("maxchecked") + "' required<!-- data-validation-maxchecked-message to override -->";
if ($this.data("validationMaxcheckedMessage")) {
message = $this.data("validationMaxcheckedMessage");
}
$this.data("validationMaxcheckedMessage", message);
$this.data("validationMaxcheckedMaxchecked", $this.attr("maxchecked"));
}
}
// =============================================================
// COLLECT VALIDATOR NAMES
// =============================================================
// Get named validators
if ($this.data("validation") !== undefined) {
validatorNames = $this.data("validation").split(",");
}
// Get extra ones defined on the element's data attributes
$.each($this.data(), function (i, el) {
var parts = i.replace(/([A-Z])/g, ",$1").split(",");
if (parts[0] === "validation" && parts[1]) {
validatorNames.push(parts[1]);
}
});
// =============================================================
// NORMALISE VALIDATOR NAMES
// =============================================================
var validatorNamesToInspect = validatorNames;
var newValidatorNamesToInspect = [];
do // repeatedly expand 'shortcut' validators into their real validators
{
// Uppercase only the first letter of each name
$.each(validatorNames, function (i, el) {
validatorNames[i] = formatValidatorName(el);
});
// Remove duplicate validator names
validatorNames = $.unique(validatorNames);
// Pull out the new validator names from each shortcut
newValidatorNamesToInspect = [];
$.each(validatorNamesToInspect, function(i, el) {
if ($this.data("validation" + el + "Shortcut") !== undefined) {
// Are these custom validators?
// Pull them out!
$.each($this.data("validation" + el + "Shortcut").split(","), function(i2, el2) {
newValidatorNamesToInspect.push(el2);
});
} else if (settings.builtInValidators[el.toLowerCase()]) {
// Is this a recognised built-in?
// Pull it out!
var validator = settings.builtInValidators[el.toLowerCase()];
if (validator.type.toLowerCase() === "shortcut") {
$.each(validator.shortcut.split(","), function (i, el) {
el = formatValidatorName(el);
newValidatorNamesToInspect.push(el);
validatorNames.push(el);
});
}
}
});
validatorNamesToInspect = newValidatorNamesToInspect;
} while (validatorNamesToInspect.length > 0)
// =============================================================
// SET UP VALIDATOR ARRAYS
// =============================================================
var validators = {};
$.each(validatorNames, function (i, el) {
// Set up the 'override' message
var message = $this.data("validation" + el + "Message");
var hasOverrideMessage = (message !== undefined);
var foundValidator = false;
message =
(
message
? message
: "'" + el + "' validation failed <!-- Add attribute 'data-validation-" + el.toLowerCase() + "-message' to input to change this message -->"
)
;
$.each(
settings.validatorTypes,
function (validatorType, validatorTemplate) {
if (validators[validatorType] === undefined) {
validators[validatorType] = [];
}
if (!foundValidator && $this.data("validation" + el + formatValidatorName(validatorTemplate.name)) !== undefined) {
validators[validatorType].push(
$.extend(
true,
{
name: formatValidatorName(validatorTemplate.name),
message: message
},
validatorTemplate.init($this, el)
)
);
foundValidator = true;
}
}
);
if (!foundValidator && settings.builtInValidators[el.toLowerCase()]) {
var validator = $.extend(true, {}, settings.builtInValidators[el.toLowerCase()]);
if (hasOverrideMessage) {
validator.message = message;
}
var validatorType = validator.type.toLowerCase();
if (validatorType === "shortcut") {
foundValidator = true;
} else {
$.each(
settings.validatorTypes,
function (validatorTemplateType, validatorTemplate) {
if (validators[validatorTemplateType] === undefined) {
validators[validatorTemplateType] = [];
}
if (!foundValidator && validatorType === validatorTemplateType.toLowerCase()) {
$this.data("validation" + el + formatValidatorName(validatorTemplate.name), validator[validatorTemplate.name.toLowerCase()]);
validators[validatorType].push(
$.extend(
validator,
validatorTemplate.init($this, el)
)
);
foundValidator = true;
}
}
);
}
}
if (! foundValidator) {
$.error("Cannot find validation info for '" + el + "'");
}
});
// =============================================================
// STORE FALLBACK VALUES
// =============================================================
$helpBlock.data(
"original-contents",
(
$helpBlock.data("original-contents")
? $helpBlock.data("original-contents")
: $helpBlock.html()
)
);
$helpBlock.data(
"original-role",
(
$helpBlock.data("original-role")
? $helpBlock.data("original-role")
: $helpBlock.attr("role")
)
);
$controlGroup.data(
"original-classes",
(
$controlGroup.data("original-clases")
? $controlGroup.data("original-classes")
: $controlGroup.attr("class")
)
);
$this.data(
"original-aria-invalid",
(
$this.data("original-aria-invalid")
? $this.data("original-aria-invalid")
: $this.attr("aria-invalid")
)
);
// =============================================================
// VALIDATION
// =============================================================
$this.bind(
"validation.validation",
function (event, params) {
var value = getValue($this);
// Get a list of the errors to apply
var errorsFound = [];
$.each(validators, function (validatorType, validatorTypeArray) {
if (value || value.length || (params && params.includeEmpty) || (!!settings.validatorTypes[validatorType].blockSubmit && params && !!params.submitting)) {
$.each(validatorTypeArray, function (i, validator) {
if (settings.validatorTypes[validatorType].validate($this, value, validator)) {
errorsFound.push(validator.message);
}
});
}
});
return errorsFound;
}
);
$this.bind(
"getValidators.validation",
function () {
return validators;
}
);
// =============================================================
// WATCH FOR CHANGES
// =============================================================
$this.bind(
"submit.validation",
function () {
return $this.triggerHandler("change.validation", {submitting: true});
}
);
$this.bind(
[
"keyup",
"focus",
"blur",
"click",
"keydown",
"keypress",
"change"
].join(".validation ") + ".validation",
function (e, params) {
var value = getValue($this);
var errorsFound = [];
$controlGroup.find("input,textarea,select").each(function (i, el) {
var oldCount = errorsFound.length;
$.each($(el).triggerHandler("validation.validation", params), function (j, message) {
errorsFound.push(message);
});
if (errorsFound.length > oldCount) {
$(el).attr("aria-invalid", "true");
} else {
var original = $this.data("original-aria-invalid");
$(el).attr("aria-invalid", (original !== undefined ? original : false));
}
});
$form.find("input,select,textarea").not($this).not("[name=\"" + $this.attr("name") + "\"]").trigger("validationLostFocus.validation");
errorsFound = $.unique(errorsFound.sort());
// Were there any errors?
if (errorsFound.length) {
// Better flag it up as a warning.
$controlGroup.removeClass("success error").addClass("warning");
// How many errors did we find?
if (settings.options.semanticallyStrict && errorsFound.length === 1) {
// Only one? Being strict? Just output it.
$helpBlock.html(errorsFound[0] +
( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" ));
} else {
// Multiple? Being sloppy? Glue them together into an UL.
$helpBlock.html("<ul role=\"alert\"><li>" + errorsFound.join("</li><li>") + "</li></ul>" +
( settings.options.prependExistingHelpBlock ? $helpBlock.data("original-contents") : "" ));
}
} else {
$controlGroup.removeClass("warning error success");
if (value.length > 0) {
$controlGroup.addClass("success");
}
$helpBlock.html($helpBlock.data("original-contents"));
}
if (e.type === "blur") {
$controlGroup.removeClass("success");
}
}
);
$this.bind("validationLostFocus.validation", function () {
$controlGroup.removeClass("success");
});
});
},
destroy : function( ) {
return this.each(
function() {
var
$this = $(this),
$controlGroup = $this.parents(".control-group").first(),
$helpBlock = $controlGroup.find(".help-block").first();
// remove our events
$this.unbind('.validation'); // events are namespaced.
// reset help text
$helpBlock.html($helpBlock.data("original-contents"));
// reset classes
$controlGroup.attr("class", $controlGroup.data("original-classes"));
// reset aria
$this.attr("aria-invalid", $this.data("original-aria-invalid"));
// reset role
$helpBlock.attr("role", $this.data("original-role"));
// remove all elements we created
if (createdElements.indexOf($helpBlock[0]) > -1) {
$helpBlock.remove();
}
}
);
},
collectErrors : function(includeEmpty) {
var errorMessages = {};
this.each(function (i, el) {
var $el = $(el);
var name = $el.attr("name");
var errors = $el.triggerHandler("validation.validation", {includeEmpty: true});
errorMessages[name] = $.extend(true, errors, errorMessages[name]);
});
$.each(errorMessages, function (i, el) {
if (el.length === 0) {
delete errorMessages[i];
}
});
return errorMessages;
},
hasErrors: function() {
var errorMessages = [];
this.each(function (i, el) {
errorMessages = errorMessages.concat(
$(el).triggerHandler("getValidators.validation") ? $(el).triggerHandler("validation.validation", {submitting: true}) : []
);
});
return (errorMessages.length > 0);
},
override : function (newDefaults) {
defaults = $.extend(true, defaults, newDefaults);
}
},
validatorTypes: {
callback: {
name: "callback",
init: function ($this, name) {
return {
validatorName: name,
callback: $this.data("validation" + name + "Callback"),
lastValue: $this.val(),
lastValid: true,
lastFinished: true
};
},
validate: function ($this, value, validator) {
if (validator.lastValue === value && validator.lastFinished) {
return !validator.lastValid;
}
if (validator.lastFinished === true)
{
validator.lastValue = value;
validator.lastValid = true;
validator.lastFinished = false;
var rrjqbvValidator = validator;
var rrjqbvThis = $this;
executeFunctionByName(
validator.callback,
window,
$this,
value,
function (data) {
if (rrjqbvValidator.lastValue === data.value) {
rrjqbvValidator.lastValid = data.valid;
if (data.message) {
rrjqbvValidator.message = data.message;
}
rrjqbvValidator.lastFinished = true;
rrjqbvThis.data("validation" + rrjqbvValidator.validatorName + "Message", rrjqbvValidator.message);
// Timeout is set to avoid problems with the events being considered 'already fired'
setTimeout(function () {
rrjqbvThis.trigger("change.validation");
}, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
}
}
);
}
return false;
}
},
ajax: {
name: "ajax",
init: function ($this, name) {
return {
validatorName: name,
url: $this.data("validation" + name + "Ajax"),
lastValue: $this.val(),
lastValid: true,
lastFinished: true
};
},
validate: function ($this, value, validator) {
if (""+validator.lastValue === ""+value && validator.lastFinished === true) {
return validator.lastValid === false;
}
if (validator.lastFinished === true)
{
validator.lastValue = value;
validator.lastValid = true;
validator.lastFinished = false;
$.ajax({
url: validator.url,
data: "value=" + value + "&field=" + $this.attr("name"),
dataType: "json",
success: function (data) {
if (""+validator.lastValue === ""+data.value) {
validator.lastValid = !!(data.valid);
if (data.message) {
validator.message = data.message;
}
validator.lastFinished = true;
$this.data("validation" + validator.validatorName + "Message", validator.message);
// Timeout is set to avoid problems with the events being considered 'already fired'
setTimeout(function () {
$this.trigger("change.validation");
}, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
}
},
failure: function () {
validator.lastValid = true;
validator.message = "ajax call failed";
validator.lastFinished = true;
$this.data("validation" + validator.validatorName + "Message", validator.message);
// Timeout is set to avoid problems with the events being considered 'already fired'
setTimeout(function () {
$this.trigger("change.validation");
}, 1); // doesn't need a long timeout, just long enough for the event bubble to burst
}
});
}
return false;
}
},
regex: {
name: "regex",
init: function ($this, name) {
return {regex: regexFromString($this.data("validation" + name + "Regex"))};
},
validate: function ($this, value, validator) {
return (!validator.regex.test(value) && ! validator.negative)
|| (validator.regex.test(value) && validator.negative);
}
},
required: {
name: "required",
init: function ($this, name) {
return {};
},
validate: function ($this, value, validator) {
return !!(value.length === 0 && ! validator.negative)
|| !!(value.length > 0 && validator.negative);
},
blockSubmit: true
},
match: {
name: "match",
init: function ($this, name) {
var element = $this.parents("form").first().find("[name=\"" + $this.data("validation" + name + "Match") + "\"]").first();
element.bind("validation.validation", function () {
$this.trigger("change.validation", {submitting: true});
});
return {"element": element};
},
validate: function ($this, value, validator) {
return (value !== validator.element.val() && ! validator.negative)
|| (value === validator.element.val() && validator.negative);
},
blockSubmit: true
},
max: {
name: "max",
init: function ($this, name) {
return {max: $this.data("validation" + name + "Max")};
},
validate: function ($this, value, validator) {
return (parseFloat(value, 10) > parseFloat(validator.max, 10) && ! validator.negative)
|| (parseFloat(value, 10) <= parseFloat(validator.max, 10) && validator.negative);
}
},
min: {
name: "min",
init: function ($this, name) {
return {min: $this.data("validation" + name + "Min")};
},
validate: function ($this, value, validator) {
return (parseFloat(value) < parseFloat(validator.min) && ! validator.negative)
|| (parseFloat(value) >= parseFloat(validator.min) && validator.negative);
}
},
maxlength: {
name: "maxlength",
init: function ($this, name) {
return {maxlength: $this.data("validation" + name + "Maxlength")};
},
validate: function ($this, value, validator) {
return ((value.length > validator.maxlength) && ! validator.negative)
|| ((value.length <= validator.maxlength) && validator.negative);
}
},
minlength: {
name: "minlength",
init: function ($this, name) {
return {minlength: $this.data("validation" + name + "Minlength")};
},
validate: function ($this, value, validator) {
return ((value.length < validator.minlength) && ! validator.negative)
|| ((value.length >= validator.minlength) && validator.negative);
}
},
maxchecked: {
name: "maxchecked",
init: function ($this, name) {
var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");
elements.bind("click.validation", function () {
$this.trigger("change.validation", {includeEmpty: true});
});
return {maxchecked: $this.data("validation" + name + "Maxchecked"), elements: elements};
},
validate: function ($this, value, validator) {
return (validator.elements.filter(":checked").length > validator.maxchecked && ! validator.negative)
|| (validator.elements.filter(":checked").length <= validator.maxchecked && validator.negative);
},
blockSubmit: true
},
minchecked: {
name: "minchecked",
init: function ($this, name) {
var elements = $this.parents("form").first().find("[name=\"" + $this.attr("name") + "\"]");
elements.bind("click.validation", function () {
$this.trigger("change.validation", {includeEmpty: true});
});
return {minchecked: $this.data("validation" + name + "Minchecked"), elements: elements};
},
validate: function ($this, value, validator) {
return (validator.elements.filter(":checked").length < validator.minchecked && ! validator.negative)
|| (validator.elements.filter(":checked").length >= validator.minchecked && validator.negative);
},
blockSubmit: true
}
},
builtInValidators: {
email: {
name: "Email",
type: "shortcut",
shortcut: "validemail"
},
validemail: {
name: "Validemail",
type: "regex",
regex: "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\.[A-Za-z]{2,4}",
message: "Not a valid email address<!-- data-validator-validemail-message to override -->"
},
passwordagain: {
name: "Passwordagain",
type: "match",
match: "password",
message: "Does not match the given password<!-- data-validator-paswordagain-message to override -->"
},
positive: {
name: "Positive",
type: "shortcut",
shortcut: "number,positivenumber"
},
negative: {
name: "Negative",
type: "shortcut",
shortcut: "number,negativenumber"
},
number: {
name: "Number",
type: "regex",
regex: "([+-]?\\\d+(\\\.\\\d*)?([eE][+-]?[0-9]+)?)?",
message: "Must be a number<!-- data-validator-number-message to override -->"
},
integer: {
name: "Integer",
type: "regex",
regex: "[+-]?\\\d+",
message: "No decimal places allowed<!-- data-validator-integer-message to override -->"
},
positivenumber: {
name: "Positivenumber",
type: "min",
min: 0,
message: "Must be a positive number<!-- data-validator-positivenumber-message to override -->"
},
negativenumber: {
name: "Negativenumber",
type: "max",
max: 0,
message: "Must be a negative number<!-- data-validator-negativenumber-message to override -->"
},
required: {
name: "Required",
type: "required",
message: "This is required<!-- data-validator-required-message to override -->"
},
checkone: {
name: "Checkone",
type: "minchecked",
minchecked: 1,
message: "Check at least one option<!-- data-validation-checkone-message to override -->"
}
}
};
var formatValidatorName = function (name) {
return name
.toLowerCase()
.replace(
/(^|\s)([a-z])/g ,
function(m,p1,p2) {
return p1+p2.toUpperCase();
}
)
;
};
var getValue = function ($this) {
// Extract the value we're talking about
var value = $this.val();
var type = $this.attr("type");
if (type === "checkbox") {
value = ($this.is(":checked") ? value : "");
}
if (type === "radio") {
value = ($('input[name="' + $this.attr("name") + '"]:checked').length > 0 ? value : "");
}
return value;
};
function regexFromString(inputstring) {
return new RegExp("^" + inputstring + "$");
}
/**
* Thanks to Jason Bunting via StackOverflow.com
*
* http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string#answer-359910
* Short link: http://tinyurl.com/executeFunctionByName
**/
function executeFunctionByName(functionName, context /*, args*/) {
var args = Array.prototype.slice.call(arguments).splice(2);
var namespaces = functionName.split(".");
var func = namespaces.pop();
for(var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
return context[func].apply(this, args);
}
$.fn.jqBootstrapValidation = function( method ) {
if ( defaults.methods[method] ) {
return defaults.methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return defaults.methods.init.apply( this, arguments );
} else {
$.error( 'Method ' + method + ' does not exist on jQuery.jqBootstrapValidation' );
return null;
}
};
$.jqBootstrapValidation = function (options) {
$(":input").not("[type=image],[type=submit]").jqBootstrapValidation.apply(this,arguments);
};
})( jQuery );

View File

@ -0,0 +1,36 @@
table.sai_table tr:nth-child(even) {
background-color: #FFFFFF;
}
table.sai_table tr:nth-child(odd) {
background-color: #EEEEEE;
}
table.sai_table tr:hover {
background-color: #FFEFD5;
}
a.active{
background-color: #e7e7e7;
}
#menu_start {
font-size: 20px;
padding-left: 15px;
padding-right: 15px;
display: block;
color: #777;
}
#menu_start:hover{
text-decoration: none;
color: #555;
}
#menu_start:focus{
text-decoration: none;
color: #555;
}
#menu_start:active{
text-decoration: none;
color: #555;
}

View File

@ -0,0 +1,33 @@
/**
* TSStatus: Teamspeak 3 viewer for php5
* @author Sebastien Gerard <seb@sebastien.me>
* @see http://tsstatus.sebastien.me/
* @version 2013-08-31
**/
function tsstatusconnect(id, channel)
{
var id = "tsstatus-" + id;
var hostport = document.getElementById(id + "-hostport").value;
var nickname = document.getElementById(id + "-nickname");
var password = document.getElementById(id + "-password");
var command = "ts3server://" + hostport.replace(":", "?port=");
var dateExpire = new Date;
dateExpire.setMonth(dateExpire.getMonth()+1);
if(channel != null){
command += "&cid=" + channel;
}
if(nickname != null && nickname.value != ""){
command += "&nickname=" + escape(nickname.value);
document.cookie = id + "-nickname=" + escape(nickname.value) + "; expires=" + dateExpire.toGMTString();
}
if(password != null && password.value != ""){
command += "&password=" + escape(password.value);
document.cookie = id + "-password=" + escape(password.value) + "; expires=" + dateExpire.toGMTString();
}
(window.open(command)).close();
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,77 @@
/**
* TSStatus: Teamspeak 3 viewer for php5
* @author Sebastien Gerard <seb@sebastien.me>
* @see http://tsstatus.sebastien.me/
* @version 2013-08-31
**/
.tsstatus, .tsstatuserror{
background-color: #ffffff;
width: 300px;
}
.tsstatus, .tsstatus *, .tsstatuserror{
color: #00000;
font-family: Verdana;
font-size: 10px;
}
.tsstatus label{
border-bottom: 1px solid #aaaaaa;
}
.tsstatusItem a{
color: #000000;
}
.tsstatusItem a:hover{
background-color: #f6f6f6;
color: #000099;
}
.tsstatuserror{
color: #ff0000;
}
.tsstatus, .tsstatus *{
vertical-align: middle;
margin: 0;
padding: 0;
}
.tsstatus{
position: relative;
overflow: hidden;
}
.tsstatus label{
display: block;
padding: 2px 0;
}
.tsstatusItem{
margin-left: 16px;
position: relative;
white-space:nowrap;
}
.tsstatusItem a{
display: block;
text-decoration: none;
}
.tsstatusItem img{
border: 0;
vertical-align: middle;
margin-right: 2px;
}
.tsstatusFlags{
position: absolute;
right: 0;
top: 0;
}
.tsstatusServer{
margin-left: 0;
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="keywords" lang="de" content="teamspeak, ts3">
<link rel="shortcut icon" href="./api.php?call=files&cat=content&id=favicon.ico">
<title>Mojotrollz.eu Teamspeak</title>
${js}
${css}
</head>
<body>
${ts_app}
</body>
</html>

View File

View File

View File

@ -0,0 +1,6 @@
$(document).ready(function() {
//new SYSTEM('./api.php',1,'start'); //state system not in use yet
$('#impressum').click(function(){
$('#modal_text').modal('show');});
});

7
index.inc Normal file
View File

@ -0,0 +1,7 @@
<?php
require_once 'lib/autoload.inc'; //SYSTEM Classes
require_once 'teamspeak/autoload.inc'; //Project Classes
require_once '../../config/get_config.php';
\SYSTEM\system::start(\WEBCRAFT\get_config(dirname(__FILE__)));

View File

@ -1,13 +1,5 @@
<?php
require_once 'lib/autoload.inc'; //SYSTEM Classes
require_once 'teamspeak/autoload.inc'; //Project Classes
require_once '/home/web/web/config/get_config.php';
\SYSTEM\system::start(\WEBCRAFT\get_config(dirname(__FILE__)));
\SYSTEM\system::include_ExceptionShortcut();
\SYSTEM\system::include_ResultShortcut();
\SYSTEM\system::register_errorhandler_dbwriter();
\SYSTEM\system::register_errorhandler_jsonoutput();
include 'index.inc';
echo \SYSTEM\API\api::run('\SYSTEM\API\verify', 'page_teamspeak', array_merge($_POST,$_GET), 1, false, true);
new \SYSTEM\LOG\COUNTER("Page was called sucessfully.");

10
sai.php
View File

@ -1,13 +1,5 @@
<?php
require_once 'lib/autoload.inc'; //SYSTEM Classes
require_once 'teamspeak/autoload.inc'; //Project Classes
require_once '/home/web/web/config/get_config.php';
\SYSTEM\system::start(\WEBCRAFT\get_config(dirname(__FILE__)));
SYSTEM\system::include_ExceptionShortcut(); //allow ERROR() instead of \SYSTEM\LOG\ERROR()
SYSTEM\system::include_ResultShortcut(); //allow JsonResult() instead of \SYSTEM\LOG\JsonResult()
SYSTEM\system::register_errorhandler_dbwriter(); //write errors to database (must be first errorhandler to register)
SYSTEM\system::register_errorhandler_jsonoutput(); //print errors as json to caller
include 'index.inc';
$sai = new SYSTEM\SAI\saigui();
echo $sai->html();

4
setup.php Normal file
View File

@ -0,0 +1,4 @@
<?php
include 'index.inc';
echo \SYSTEM\SQL\setup::install();

View File

@ -1,7 +1,6 @@
<?php
require_once dirname(__FILE__).'/path/autoload.inc.php';
require_once dirname(__FILE__).'/page/autoload.inc';
require_once dirname(__FILE__).'/docu/autoload.inc.php';
require_once dirname(__FILE__).'/dbd/autoload.inc.php';
require_once dirname(__FILE__).'/api/autoload.inc.php';
require_once dirname(__FILE__).'/config/autoload.inc.php';

View File

@ -1,3 +0,0 @@
<?php
\SYSTEM\autoload::registerFolder(dirname(__FILE__),'');
require_once dirname(__FILE__).'/register_docu.php';

View File

@ -1,7 +0,0 @@
<?php
class docu_categories extends \SYSTEM\DOCU\docu_categories{
const DOCU_WEBCRAFT_WEBCRAFT = 'Webcraft';
const DOCU_WEBCRAFT_PROJECTS = 'Projects';
const DOCU_WEBCRAFT_TODO = 'TODO';
const DOCU_WEBCRAFT_HOWTO = 'How to';
}

View File

@ -1,64 +0,0 @@
?[text](./api.php?call=files&cat=how_to&id=Anonymous-Seal.jpg)
Websites von Webcraft
=====================
Anleitung für einfaches Handling
--------------------------------
Dieses Kurzanleitung soll Ihnen einen Überblick über die Möglichkeiten zur Pflege und Verwaltung Ihrer Webcraft Website geben.
Sie finden hier eine Anleitung für Ihre Onlineverwaltung, die Einrichtung Ihres e-mail Postfachs, sowie nützliche Tipps und Tricks, um Ihnen das Handling Ihrer Website so unkompliziert wie möglich zu gestalten.
1. Erste Schritte
Alle Webseiten von webcraft-media sind mit einem sogenannten „back end“ ausgestattet: dem System Admin Interface, kurz SAI. Dieses ermöglicht Ihnen, die Inhalte ihrer Webseite einfach zu pflegen und zu verwalten.
Sie erreichen das SAI, indem Sie in die Addresszeile nach der URL Ihrer Seite „/sai.php“ eintippen.
Beispiel: http://www.meine-seite.de/sai.php
Hier können Sie unter Anderem Ihre Texte, Bilder und Dateien verwalten, Einstellungen vornehmen und Ihre Rechnungen einsehen.
Sollten Sie noch keinen Account von uns zugewiesen bekommen haben, klicken Sie auf die Schaltfläche Login am oberen rechten Rand. Klicken Sie anschließend auf den Link „Register new Account“, und geben Sie Ihre Daten ein.
Sollten Sie Probleme mit der Anmeldung am SAI haben, schreiben Sie uns bitte eine E-Mail an support@webcraft-media.de oder kontaktieren Sie uns telefonisch unter 0176/66802813.
2. Texte verwalten
Um Ihre Texte auf der Webseite zu pflegen, ist es wichtig einen einfachen Editierzugang zu haben. SAI bietet die Möglichkeit unter dem Reiter Text (siehe Grafik) schnell und unkompliziert Texte auf Ihrer Webseite zu aktualisieren.
Die Texte werden in verschiedene Gruppen unterschieden. In der Regel gibt es dabei eine Gruppe für Standardtexte wie Fehlermeldungen, Hinweise, AGBs oder ähnliches. Die auf Ihrer Seite angezeigten inhaltlichen Texte sind ebenfalls in eine oder ggf. mehrere Gruppen zusammengefasst. Um zum gewünschten Text zu gelangen, wählen Sie die entsprechende Gruppe aus.
Die Texte werden Ihnen nun in Form einer Liste angezeigt.
Dabei wird in der Spalte ID der Name des Textes angezeigt, und in der Sprachspalte (deDE, enUS, huHU etc.) der eigendliche Text in der jeweiligen Sprache.
Um einen bestimmten Text zu editieren, klicken Sie beim jeweiligen Text auf edit, um zum Editor zu gelangen. Um ihn zu löschen, klicken Sie delete.
HINWEIS
Sollten Sie Ihren Text irrtümlich oder unbeabsichtigt löschen, so können Sie ihn wiederherstellen, indem Sie einen neuen Text mit identischer ID und Category (Category = Gruppe) anlegen.
Im Editor können Sie ihren Text in allen freigeschalteten Sprachen anpassen. Dabei steht ihnen ein einfacher, HTML kompatibler Editor zur Verfügung.
1Wenn Sie mit Ihrer Änderung zufrieden sind, klicken sie unter dem Editorfenster erneut auf edit. Sie sollten nun eine Erfolgsmeldung erhalten. Ihr Text wurde editiert.
3. Bilder und Dateien verwalten
Um Bilder z.B. in Galerien oder Dateien die zum Download angeboten werden zu aktualisieren, zu ersetzen, oder zu löschen, stellt SAI Ihnen ein online-Verwaltungssystem zur Verfügung.
Um in die SAI-Dateiverwaltung zu gelangen, wählen Sie den Reiter „Files“ in der oberen Menuleiste aus.
Ähnlich dem Textmodul, sind Ihre Dateien in Verschiedene Gruppen zusammengefasst. Zum Beispiel alle Bilder einer Galerie, oder alle Dokumente, die zum Download bereitstehen. Die Namen der Gruppen deuten in der Regel auf den Inhalt hin.
Haben Sie eine Gruppe ausgewählt, werden Ihnen die Dateien ähnlich wie in der Textverwaltung als Liste angezeigt.
1. Die Spalte Name bezeichnet den Namen der hochgeladenen Datei.
2. Die Spalte Extension bezieht sich auf das jeweilige Dateiformat. (z.B. .zip, .mp3, .jpg)
3. URL zeigt Ihnen den Direktlink der Datei an.
4. Unter Action finden Sie die Optionen „Delete“ für das Löschen einer Datei und „Rename“ um Sie umzubenennen.
2.1 Dateien hochladen
Um eine Datei von Ihrem Computer ins SAI hochzuladen, wählen Sie zunächst die Gruppe, in die Sie hochgeladen werden soll aus. Wählen Sie nun am Ende der Liste die Option „Choose file“.
Nun öffnet sich ein Windows- Dialogfenster. Wählen Sie die ensprechende Datei von Ihrem Computer aus und klicken Sie auf unten rechts auf „Öffnen“.
Name und Dateiformat werden Ihnen nun angezeigt.
Klicken Sie nun auf Upload am rechten Tabellenrand. Wenn der Upload beendet ist, wird Ihnen eine Erfolgsmeldung als Popup angezeigt. Dies kann bis zu einigen Minuten dauern, je nach Größe der Datei. Haben Sie die Erfolgsmeldung erhalten, klicken Sie erneut auf „Files“ oder drücken Sie die F5 Taste, um Ihre neue Datei angezeigt zu bekommen.
2.2 Dateien umbenennen
HINWEIS
Sollten Sie eine vorhandene Datei umbenennen, die auf Ihrer Webseite via Link eingebunden ist, wird diese auf der Seite ohne Weiteres nicht mehr verfügbar sein. Sie können die Verfügbarkeit wiederherstellen, indem Sie der Datei den ursprünglichen Namen wieder geben.
Um eine bereits Hochgeladene Datei umzubennenen, geben Sie den gewünschten Namen in das dafür vorgesehene Eingabefeld ein.

View File

@ -1,5 +0,0 @@
<?php
//\SYSTEM\DOCU\docu::registerFolder(dirname(__FILE__).'/webcraft',docu_categories::DOCU_WEBCRAFT_WEBCRAFT);
//\SYSTEM\DOCU\docu::registerFolder(dirname(__FILE__).'/projects',docu_categories::DOCU_WEBCRAFT_PROJECTS);
\SYSTEM\DOCU\docu::registerFolder(dirname(__FILE__).'/todo',docu_categories::DOCU_WEBCRAFT_TODO);
\SYSTEM\DOCU\docu::registerFolder(dirname(__FILE__).'/how_to',docu_categories::DOCU_WEBCRAFT_HOWTO);

View File

@ -1,89 +0,0 @@
Webcraft
--------
- CRON Modul (done?), CRON STRUKTUR (done?)
- worldmap
- design
- coole map
- worldchat
Danube
------
- 450/6.5€ (where is da money?)
- GALLERY einbinden
- Domain Transfere
- sai fix(structure fix)
Mojotrollz
----------
- Repo wechseln
- start page
- www fix
UVote
-----
- Backend?
- www fix
Rhein
-----
- 420/6.5€
- treffen ulf do
Da-Sense
--------
- Chron Hook
- New Database Model
Redestoffmusik
--------------
- redesign ???
- downloadstuff ???
Akademischer Börsenverein Frankfurt
-----------------------------------
- 600/6.5€
- Auf Rücksprache
Jörg
----
- Ole Anfrage
Karate Zwingenberg
------------------
- Tobi muss mehr Druck machen
Lichtblick
----------
- Tobi Anfrage
Schönheitschirurg
-----------------
- Ole Anfrage(in Zeit)
Frisöse Zwbg
------------
- Ole Di treffen
Synagogenverein Zwingenberg
---------------------------
- Do anfrage Ulf
Kunstfaser stuff
----------------
- Tobi muss mhr rumstressen

View File

@ -1,50 +0,0 @@
Webcraft
--------
- CRON Modul, CRON STRUKTUR
* bild (worldmap, worldchat, websitemap)
* bild
-> Webcraft design done
Danube
------
GALLERY
-> done
Mojotrollz
----------
- Repo wechseln
- start page
UVote
-----
- Backend?
Rhein
-----
- 420/6.5€ alles !
- >
- Transferieren (test war ok!)
- Redesign (Schatten etc)
- Gallery Modul (done)
- EMail Server fixen / SSL Cert benötigt? (done)
Da-Sense
--------
- Docu
- Chron Hook
- New Database Model
Redestoffmusik
--------------
- transferieren (done)

View File

@ -1,82 +0,0 @@
Webcraft
--------
- CRON Modul, CRON STRUKTUR
- worldmap
- design
- coole map
- worldchat
Danube
------
- 450/6.5€ (where is da money?)
- GALLERY einbinden
- Domain Transfere
- sai fix(structure fix)
Mojotrollz
----------
- Repo wechseln
- start page
- www fix
UVote
-----
- Backend?
- www fix
Rhein
-----
- 420/6.5€
- Redesign
- Schatten (done)
- Farben (done)
- Banner
- Gallery Style (done)
- email schreiben mit pws (done) -> Modul wtf? where is it?
- rechnung 420/6.5€
- spam filter (done)
Da-Sense
--------
- Docu
- Chron Hook
- New Database Model
Redestoffmusik
--------------
- redesign
- downloadstuff
Akademischer Börsenverein Frankfurt
-----------------------------------
- 600/6.5€
- Auf Rücksprache
Jörg
----
- Ole Anfrage
Karate Zwingenberg
------------------
- Tobi muss Druck machen
Lichtblick
----------
- Tobi Anfrage
Schönheitschirurg
-----------------
- Ole Anfrage(in Zeit)

View File

@ -1,83 +0,0 @@
Webcraft
--------
- CRON Modul, CRON STRUKTUR
- worldmap
- markers (done)
- popup (done)
- design
- coole map
- worldchat
- sai lang switcher (done)
- www fix (done)
Danube
------
- 450/6.5€
- GALLERY einbinden
- Domain Transfere
- sai fix(structure fix)
Mojotrollz
----------
- Repo wechseln
- start page
- www fix
UVote
-----
- Backend?
- www fix
Rhein
-----
- 420/6.5€
- Transferieren (done)
- Anfrage Api (done)
- Sai Startpage (done)
- Redesign
- Schatten
- Farben
- Banner
- Gallery Style
- sai fix(structure fix) (done)
- gallery in saimod (done)
- danube gallery einbinden (done)
- rechnungs mod einbinden (done)
- anrufen (done)
- Karte Rand (done)
- Files Umbenennen fixen (done)
- www fix (done)
- email problem lösen (weiterleitung) (done?)
- email schreiben mit pws (done) -> Modul wtf? where is it?
- rechnung
- spam filter (done)
Da-Sense
--------
- Docu
- Chron Hook
- New Database Model
Redestoffmusik
--------------
- redesign
- downloadstuff
- sai fix(structure fix) (done)
- www fix (done)
Akademischer Börsenverein Frankfurt
-----------------------------------
- 600/6.5€
- klären -> Montag 26.5
- design
- MENU Modul

View File

@ -1,105 +0,0 @@
Textmodul
---------
- Backbutton
- Delete Nachfrage
- post/get zeichenproblem
- Timestamp für texte
- Blocksatz
Karate Zwingenberg
------------------
- Trainingskalender (Ulf)
- News
- user Rechte für Texgruppen?
- Design
- Original Logo
- Schwarzer Balken muss weg
- bottom bar mit spk logo und impressum-webcraft
Webcraft
--------
- CRON Modul (done?), CRON STRUKTUR (done?)
- worldmap
- design
- text bricht aus den divs (generelles problem?)
- mehr backgrounds
- coole map (done)
- worldchat
Rhein
-----
- 420/6.5€
- treffen ulf do
Danube
------
- 450/6.5€ (where is da money?)
- GALLERY einbinden
- Domain Transfere
- sai fix(structure fix)
Mojotrollz
----------
- Repo wechseln
- start page
- www fix
UVote
-----
- Backend?
- www fix
Da-Sense
--------
- Chron Hook
- New Database Model
Redestoffmusik
--------------
- Sascha bescheid sagen, dass er den shit hochladen muss
- MMONE Album einbinden
Akademischer Börsenverein Frankfurt
-----------------------------------
- 600/6.5€
- Auf Rücksprache
Jörg
----
- Ole Anfrage
Lichtblick
----------
- Tobi Anfrage
Schönheitschirurg
-----------------
- Ole Anfrage(in Zeit)
Frisöse Zwbg
------------
- Ole Di treffen
Synagogenverein Zwingenberg
---------------------------
- Do anfrage Ulf

View File

@ -1,3 +1,3 @@
<?php
\SYSTEM\autoload::registerFolder(dirname(__FILE__),'');
require_once dirname(__FILE__).'/register_files.php';
\SYSTEM\FILES\files::registerFolder(dirname(__FILE__).'/img/','img','*');

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1002 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 976 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 912 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 727 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 511 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 672 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 861 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 852 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 573 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 572 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Some files were not shown because too many files have changed in this diff Show More