function useTexture(src) {
var canvas = document.getElementById('myCanvas');
var img = new Image();
img.onload = function() {
if (canvas.getContext) {
var context = canvas.getContext('2d');
context.clearRect(0, 0, canvas.width, canvas.height);
context.drawImage(img, 0, 0, canvas.width, canvas.height);
canvas.parentNode._x3domNode.invalidateGLObject();
}
};
img.src = src;
}
function mysql2Date(timestamp) {
//function parses mysql datetime string and returns javascript Date object
//input has to be in this format: 2007-06-05 15:26:02
var regex = /^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
var parts = timestamp.replace(regex, "$1 $2 $3 $4 $5 $6").split(' ');
return new Date(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);
}
function Skin(id, name, img, type, author, license, uploaded, cape_compatible) {
this.id = Number(id);
this.name = name;
this.type = type;
this.author = author;
var img = new Image();
img.className = 'Skin thumb';
//css klasse zuweisen fuers aussehen ;)
img.src = "data:" + type + ";base64," + img;
//das ist die data: url fuer die vorschau
img.title = name;
//als titel noch der dateiname.
/*img.addEventListener('click', function() {
useTexture(this.src);
}, false);*/
this.img = img;
this.license = license;
this.uploaded = mysql2Date(uploaded);
this.cape_compatible = (cape_compatible == 1) ? true : false;
};
Skinlist = new Array();
function License(id, name, url, text, imgurl) {
this.id = id;
this.name = name;
this.url = url;
this.text = text;
this.imgurl = imgurl;
this.type = (text == '') ? "url" : "text";
}
function uploadSkin(e) {
e.preventDefault();
e.stopPropagation();
var author = this.author.value;
var name = this.name.value;
if (this.license.options[this.license.selectedIndex].defaultSelected) {
alert("please select a license first!");
return false;
}
var license = this.license.value;
var img = this.img.value;
xhr.request(this.action, "author=" + author + "&name=" + name + "&license=" + license + "&img=" + img, uploaded);
this.submit.disabled = true;
//this.p.style.display="";
//console.log(this);
return false;
}
function checkLicense(input) {
if (input.options[input.selectedIndex].defaultSelected) {
input.setCustomValidity('please chose a License from the list');
} else {
// input is valid -- reset the error message
input.setCustomValidity('');
}
}
function uploaded(http) {
if (http.status == 200) {
if (JSON.parse(http.responseText)) {
var answer = JSON.parse(http.responseText);
if (answer.success) {
TINY.box.show({
html : 'Uploaded successfully!',
animate : false,
close : false,
mask : false,
boxid : 'success',
autohide : 3,
top : -14,
right : -17
});
} else {
alert("Error: " + answer.status_msg);
}
} else {
alert("Something is wrong: the answer of the server is " + http.getResponseText());
}
} else {
alert("Something is wrong: the answer of the server is " + http.status + " " + http.statusText);
}
}
function abort() {
var childNode = this.parentNode;
childNode.parentNode.removeChild(childNode);
}
/* ==========================================================================
Drag & drop file handler
========================================================================== */
function handleFileSelect(evt) {
evt.stopPropagation();
evt.preventDefault();
var dateien = (this.id == 'skinlist') ? evt.dataTransfer.files : evt.target.files;
// jenachdem ob ueber drag drop oder durchsuchen ausgewaehlt wurde.
//in dateien sind jetzt alle dateien gespeichert die ausgewahlt wurden
for (var i = 0, f; f = dateien[i]; i++) {//alle dateien nacheinander auslesen...
if (!f.type.match('image.*')) {//fals was anderes als ein bild dabei sein sollte
alert("ERROR!\n\n could not open the file " + f.name + " as an image");
continue;
}
var reader = new FileReader();
// wenn die datei geladen ist dann soll die gleich in ein img tag geschrieben werden
reader.onload = (function(Datei) {
return function(e) {
// Vorschau bzw. thumbnail rendern
var block = document.createElement('div');
block.className = "option";
var img = new Image();
img.className = 'thumb';
//css klasse zuweisen fuers aussehen ;)
img.src = e.target.result;
useTexture(e.target.result);
//das ist die data:// url fuer die vorschau
img.title = Datei.name;
//als titel noch der dateiname.
img.addEventListener('click', function() {
useTexture(img.src);
}, false);
//bild ende
var form = document.createElement('form');
form.action = "upload.php";
form.method = "get";
form.className = "upload";
form.addEventListener('submit', uploadSkin, false);
form.addEventListener('reset', abort, false);
var titel = document.createElement('label');
titel.innerHTML = "Name:
";
//titel Ende
//var eigenschaften = document.createElement('span');
var author = document.createElement('label');
author.innerHTML = "Author: ";
var license = document.createElement('label');
var licenseselect = document.createElement('select');
licenseselect.addEventListener('change', function(event) {
event.preventDefault();
checkLicense(this);
return false;
}, true);
licenseselect.name = "license";
//var br = document.createElement('br');
var NeuerEintrag = new Option("Please select your license", "0", true, true);
licenseselect.options[licenseselect.length] = NeuerEintrag;
for (index in Licenses) {
var NeuerEintrag = new Option(Licenses[index].name, Licenses[index].id, false, false);
licenseselect.options[licenseselect.length] = NeuerEintrag;
}
license.innerHTML += "License: ";
license.insertBefore(licenseselect, null);
licenseHelp = document.createElement('a');
licenseHelp.href = getHelpUrl('licenses');
licenseHelp.addEventListener('click', function(event) {
event.preventDefault();
showHelp('licenses');
return false;
}, true);
licenseHelp.className = "actionlink";
licenseHelp.innerHTML = "help";
var mimeElem = document.createElement('label');
var className = (Datei.type == "image/png") ? "valid" : "invalid";
var toolTip = (Datei.type == "image/png") ? "image is a png file, good :)" : "the selected image is not a png file and not supported by minetest";
mimeElem.innerHTML = "Mime Type: ";
var sizeElem = document.createElement('label');
var size = Datei.size / 1024;
size = size.toFixed(2);
var className = (size <= 5) ? "valid" : "invalid";
sizeElem.innerHTML += "Size: ";
var resolutionElem = document.createElement('label');
var width = img.width;
var height = img.height;
var className = (width == 64 && height == 32) ? "valid" : "invalid";
var toolTip = (width == 64 && height == 32) ? "resolution is 64x32, good :-)" : "currently only 64x32 images are alowed. sorry.";
resolutionElem.innerHTML += "Resolution: ";
var imgElem = document.createElement('input');
imgElem.name = 'img';
imgElem.type = "hidden";
imgElem.value = img.src;
var submitButtons = document.createElement('div');
submitButtons.innerHTML = "";
//Eigenschaften ende
block.insertBefore(img, null);
//das bild ins div schieben.
form.insertBefore(titel, null);
//titel einfügen
form.insertBefore(author, null);
form.insertBefore(document.createElement('br'), null);
form.insertBefore(license, null);
form.insertBefore(licenseHelp, null);
form.insertBefore(document.createElement('br'), null);
form.insertBefore(sizeElem, null);
form.insertBefore(document.createElement('br'), null);
form.insertBefore(resolutionElem, null);
form.insertBefore(document.createElement('br'), null);
form.insertBefore(mimeElem, null);
form.insertBefore(document.createElement('br'), null);
//form.insertBefore(resolutionElem, null);
form.insertBefore(document.createElement('br'), null);
form.insertBefore(imgElem, null);
//form.insertBefore(document.createElement('br'), null);
form.insertBefore(submitButtons, null);
block.insertBefore(form, null);
//zu guter letzt die Eigenschaften
document.getElementById('skinlist').insertBefore(block, document.getElementById("dnd"));
//anschliessend den block einfuegen
checkLicense(licenseselect);
};
})(f);
reader.readAsDataURL(f);
}
}
function handleDragOver(evt) {
evt.stopPropagation();
evt.preventDefault();
evt.dataTransfer.dropEffect = 'copy';
}
function initDragDrop() {
// Event listener Eintragen
var dropZone = document.getElementById('skinlist');
dropZone.addEventListener('dragover', handleDragOver, false);
dropZone.addEventListener('drop', handleFileSelect, false);
document.getElementById('files').addEventListener('change', handleFileSelect, false);
}
document.addEventListener('DOMContentLoaded', initDragDrop, false);
function makeTags(taglist) {
// Make the list itself which is a
' + answer.status_msg + '
" + location.protocol + "//" + location.hostname + location.pathname + "#!page:1,filtertype:Id,filter:" + id; TINY.box.show({ html : html }); } function report(id) { TINY.box.show({ url : "reportSkin.php", post : "id=" + id }); } function submitReport(form) { TINY.box.fill("reportSkin.php", 1, "id=" + form.id.value + "&text=" + form.text.value + "&topic=" + form.topic.value+ "&email=" + form.email.value); return false; } function resetReport(form) { TINY.box.hide(); return false; } /* ========================================================================== toolbar functions ========================================================================== */ function resetView() { document.getElementById('x3dprev').runtime.resetView(); } function getScreenshot() { screenshot = document.getElementById('x3dprev').runtime.getScreenshot(); window.open(screenshot, '_blank', "width=512,height=512"); } function dateFormat(mysqldate) { var date = Date.createFromMysql(mysqldate); //console.debug(date); return mysqldate; //todo! shuld output something like "just now" or "today at 17:30" or "12.12.12" } function goPage(page) { if (Number(page) >= 1) { URIHash.set("page",page); } } Date.createFromMysql = function(mysql_string) { if ( typeof mysql_string === 'string') { var t = mysql_string.split(/[- :]/); //when t[3], t[4] and t[5] are missing they defaults to zero return new Date(t[0], t[1] - 1, t[2], t[3] || 0, t[4] || 0, t[5] || 0); } return null; }; /* ========================================================================== licenses functions ========================================================================== */ var Licenses = new Array(); function getLicenses() { var HTTP = new XMLHttpRequest(); HTTP.open("POST", "api/get.json.php?licenses", false); HTTP.onreadystatechange = function() { //console.log(HTTP.readyState); console.log("get licenses " + (20 * (HTTP.readyState + 1)) + "% loaded"); if (HTTP.readyState == 4) { var objekt = JSON.parse(HTTP.responseText).licenses; var i = 0; while (objekt[i]) { Licenses[objekt[i].id] = new License(objekt[i].id, objekt[i].name, objekt[i].url, objekt[i].text, objekt[i].imgurl); i++; } } else { } }; HTTP.send(null); } function getLicenseById(id) { for (var element in Licenses) { if (Licenses[element].id == id) return Licenses[element]; } return undefined; } function showLicenseInfo(id) { var license = getLicenseById(id); if (license.type == "url") { TINY.box.show({ iframe : license.url, boxid : 'frameless', width : 900, height : 600, fixed : false, maskid : 'bluemask', maskopacity : 40 }); } else { TINY.box.show({ html : license.text, boxid : 'frameless', width : 750, height : 450, fixed : false, maskid : 'bluemask', maskopacity : 40 }); } } function getHelpUrl(about) { return "/helpfiles/" + about + ".html"; } function showHelp(about) { TINY.box.show({ iframe : getHelpUrl(about), boxid : 'frameless', width : 800, height : 600, fixed : false, maskid : 'bluemask', maskopacity : 40 }); } getLicenses(); shareSkin = { modified : function(elem) { var path = "http://" + location.hostname + location.pathname; var selected = elem.value; var form = elem.form; var id = form.id.value; form.help.value = elem.selectedOptions[0].title; if (selected == "perma") { form.output.value = path + "#!page:1,filtertype:Id,filter:" + id; } else if (selected == "forum") { var license = Skinlist[id].license; form.output.value = "[u]name[/u]:" + Skinlist[id].name + "\n" + "[img]" + path + "skins/5/" + id + ".png[/img]\n" + "[u]author[/u]: " + Skinlist[id].author + "\n" + "[u]license[/u]:[url=" + license.url + "]" + license.name + "[img]" + license.imgurl + "[/img][/url]\n" + "[b][url=" + path + "#!page:1,filtertype:Id,filter:" + id + "]view in 3d![/url] on skin Database\n[/b]" + "[b][url=" + path + "download.php?id=" + id + "]Download[/url][/b]"; } console.debug(form); }, show : function(id) { TINY.box.show({ url : "shareSkin.php", post : "id=" + id }); } }; //settings window settings = {}; settings.showHide = function() { if (document.getElementById('settingsWindow').style.display == 'block') { document.getElementById('settingsWindow').style.display = 'none'; //document.getElementById('showHide').innerHTML = 'Show description'; } else { document.getElementById('settingsWindow').style.display = 'block'; //document.getElementById('showHide').innerHTML = 'Hide description'; } }; function toggle(elemId) { if (document.getElementById(elemId).style.display == 'block') { document.getElementById(elemId).style.display = 'none'; } else { document.getElementById(elemId).style.display = 'block'; } }; function vollbild() { var element = document.getElementsByTagName("body")[0]; if (element.requestFullScreen) { if (!document.fullScreen) { element.requestFullscreen(); } else { document.exitFullScreen(); } } else if (element.mozRequestFullScreen) { if (!document.mozFullScreen) { element.mozRequestFullScreen(); } else { document.mozCancelFullScreen(); } } else if (element.webkitRequestFullScreen) { if (!document.webkitIsFullScreen) { element.webkitRequestFullScreen(); } else { document.webkitCancelFullScreen(); } } } var global_laden = false; function nextElements() { var element = document.getElementById('skinlist'); var height = element.scrollTopMax; var scroll = element.scrollTop; var diff = height - scroll; if (diff <= 200 && global_laden == false) { global_laden = true; console.log("runtergescrollt zu "+diff); } else if(element.scrollTopMax-diff <=200 && global_laden == false){ global_laden = true; console.log("hochgescrollt zu "+diff); } } document.addEventListener('load', timeAgo); function timeAgo(selector) { var templates = { prefix: "", suffix: "", seconds: "Just Now", minute: "about a minute", minutes: "%d minutes ago", hour: "about an hour ago", hours: "about %d hours ago", day: "a day ago", days: "%d days ago", month: "about a month ago", months: "%d months ago", year: "about a year ago", stNimerleinsTag: "Sankt-Nimmerleins-Day", years: "%d years ago" }; var template = function(t, n) { return templates[t] && templates[t].replace(/%d/i, Math.abs(Math.round(n))); }; var timer = function(time) { if (!time) return; time = time.replace(/\.\d+/, ""); // remove milliseconds time = time.replace(/-/, "/").replace(/-/, "/"); time = time.replace(/T/, " ").replace(/Z/, " UTC"); time = time.replace(/([\+\-]\d\d)\:?(\d\d)/, " $1$2"); // -04:00 -> -0400 time = new Date(time * 1000 || time); //console.log(time); var now = new Date(); var seconds = ((now.getTime() - time.getTime()) * .001) ; var minutes = seconds / 60; var hours = minutes / 60; var days = hours / 24; var years = days / 365; return templates.prefix + ( seconds < 45 && template('seconds', seconds) || seconds < 90 && template('minute', 1) || minutes < 45 && template('minutes', minutes) || minutes < 90 && template('hour', 1) || hours < 24 && template('hours', hours) || hours < 42 && template('day', 1) || days < 30 && template('days', days) || days < 45 && template('month', 1) || days < 365 && template('months', days / 30) || years < 1.5 && template('year', 1) || years < 120 && template('stNimerleinsTag', 100) || template('years', years) ) + templates.suffix; }; var elements = document.getElementsByClassName('timeago'); for (var i in elements) { var $this = elements[i]; if (typeof $this === 'object') { $this.innerHTML = timer($this.getAttribute('title') || $this.getAttribute('datetime')); } } // update time every minute setTimeout(timeAgo, 10000); };