forked from 4ducky/4ducky
The PHP sources, templates and old jQuery-based scripts move unchanged into legacy/ for reference. Shared assets (media/, images/, favicon.ico, the default avatar) stay at the repository root. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
490 lines
12 KiB
JavaScript
490 lines
12 KiB
JavaScript
function $(id){return document.getElementById(id)}
|
|
function gridView(id){ gridSolve(id); gridSolve(id); window.setInterval("gridSolve('"+id+"')",250); }
|
|
function swap(e, c1, c2) { e.className = e.className == c1 ? c2 : c1; };
|
|
|
|
// GridSolver ------------------------------------------------------------
|
|
var gridSize = 64;
|
|
var gridMinWidth = 6;
|
|
var gridWidth = 0;
|
|
var grid = null;
|
|
var boxDef = {
|
|
'b0': {'width': 3, 'height': 3},
|
|
'b1': {'width': 2, 'height': 2},
|
|
'b2': {'width': 1, 'height': 1}
|
|
};
|
|
|
|
function gridSolve( cid ) {
|
|
var container = $(cid);
|
|
var newWidth = parseInt( container.offsetWidth );
|
|
var newGridWidth = parseInt( newWidth / gridSize );
|
|
newGridWidth = newGridWidth < gridMinWidth ? gridMinWidth : newGridWidth;
|
|
|
|
if( gridWidth == newGridWidth )
|
|
return;
|
|
else
|
|
gridWidth = newGridWidth;
|
|
|
|
boxes = new Array();
|
|
while( container.hasChildNodes() ) {
|
|
e = container.removeChild( container.firstChild );
|
|
if( e.tagName == 'DIV' ) {
|
|
boxes.push( e );
|
|
}
|
|
}
|
|
|
|
grid = new Array( gridWidth );
|
|
for( var i = 0; i < grid.length; i++ ) {
|
|
grid[i] = 0;
|
|
}
|
|
|
|
for(var i = 0; i < boxes.length; i++) {
|
|
insertThumb( boxes[i], cid )
|
|
}
|
|
|
|
var maxHeight = 0;
|
|
for( var i = 0; i < grid.length; i++) {
|
|
maxHeight = Math.max( maxHeight,grid[i] );
|
|
}
|
|
container.style.height = (maxHeight * gridSize) + 'px';
|
|
$('images').style.height = (maxHeight * gridSize) + 'px';
|
|
}
|
|
|
|
function insertThumb( box, cid ) {
|
|
var boxWidth = boxDef[box.className]['width'];
|
|
var boxHeight = boxDef[box.className]['height'];
|
|
var maxHeight = 0;
|
|
var currentHeight = -1;
|
|
var spotWidth = 0;
|
|
var spotLeft = 0;
|
|
var freeSpots = new Array();
|
|
for( var i = 0; i < grid.length; i++) {
|
|
if( currentHeight == grid[i] ) {
|
|
spotWidth++;
|
|
}
|
|
|
|
if( (currentHeight != grid[i] || i+1 == grid.length) && spotWidth > 0) {
|
|
freeSpots.push({'width': spotWidth, 'left': spotLeft, 'height': currentHeight});
|
|
|
|
spotWidth = 1;
|
|
spotLeft = i;
|
|
if(currentHeight != grid[i] && i+1 == grid.length) {
|
|
freeSpots.push({'width': spotWidth, 'left': spotLeft, 'height': grid[i]});
|
|
}
|
|
}
|
|
|
|
else if( spotWidth == 0 ) {
|
|
spotWidth = 1;
|
|
}
|
|
|
|
currentHeight = grid[i];
|
|
if( grid[i] > maxHeight ) {
|
|
maxHeight = grid[i];
|
|
}
|
|
}
|
|
|
|
var targetHeight = 0;
|
|
var targetLeft = 0;
|
|
var bestScore = -1;
|
|
for( var j = 0; j < boxWidth; j++ ) {
|
|
if( grid[j] > targetHeight ) {
|
|
targetHeight = grid[j];
|
|
}
|
|
}
|
|
var newHeight = targetHeight + boxHeight;
|
|
|
|
for( var i = 0; i < freeSpots.length; i++ ) {
|
|
var heightScore = ( maxHeight - freeSpots[i]['height'] );
|
|
var widthScore = boxWidth / freeSpots[i]['width'];
|
|
var score = heightScore * heightScore + widthScore * 2;
|
|
|
|
if( freeSpots[i]['width'] >= boxWidth && score > bestScore ) {
|
|
targetHeight = freeSpots[i]['height'];
|
|
targetLeft = freeSpots[i]['left'];
|
|
newHeight = freeSpots[i]['height'] + boxHeight;
|
|
bestScore = score;
|
|
}
|
|
}
|
|
|
|
for( var j = 0; j < boxWidth; j++ ) {
|
|
grid[targetLeft + j] = newHeight;
|
|
}
|
|
|
|
var container = $( cid );
|
|
container.appendChild( box );
|
|
box.style.left = (targetLeft * gridSize) + 'px';
|
|
box.style.top = (targetHeight * gridSize) + 'px';
|
|
return true;
|
|
}
|
|
|
|
// Colorpicker -----------------------------------------------------------
|
|
function colorpicker( id, size, onchange, onshow ) {
|
|
var that = this;
|
|
this.size = size;
|
|
this.onchange = onchange;
|
|
this.onshow = onshow;
|
|
|
|
this.mode = 'none';
|
|
|
|
this.sv = $(id+'SV');
|
|
this.svselect = $(id+'SVSelect');
|
|
this.h = $(id+'H');
|
|
this.hselect = $(id+'HSelect');
|
|
this.value = $(id+'Value');
|
|
this.current = $(id+'Current');
|
|
|
|
this.cap = function( v, min, max ) {
|
|
return Math.min(Math.max(min,v),max);
|
|
}
|
|
|
|
this.getMousPos = function( event ) {
|
|
if(event.pageX || event.pageY){
|
|
return {
|
|
'x': event.pageX,
|
|
'y': event.pageY
|
|
};
|
|
}
|
|
return {
|
|
'x': event.clientX + document.body.scrollLeft - document.body.clientLeft,
|
|
'y': event.clientY + document.body.scrollTop - document.body.clientTop
|
|
};
|
|
}
|
|
|
|
this.getObjPos = function( obj ) {
|
|
var curleft = curtop = 0;
|
|
if (obj.offsetParent) {
|
|
curleft = obj.offsetLeft;
|
|
curtop = obj.offsetTop;
|
|
while (obj = obj.offsetParent) {
|
|
curleft += obj.offsetLeft;
|
|
curtop += obj.offsetTop;
|
|
}
|
|
}
|
|
return {
|
|
'x':curleft,
|
|
'y':curtop
|
|
};
|
|
}
|
|
|
|
|
|
this.release = function() {
|
|
document.onmousemove = '';
|
|
this.mode = 'none';
|
|
}
|
|
|
|
this.move = function( event ) {
|
|
if (!event) var event = window.event;
|
|
if(event.pageX || event.pageY) {
|
|
var mx = event.pageX;
|
|
var my = event.pageY;
|
|
} else {
|
|
var mx = event.clientX + document.body.scrollLeft - document.body.clientLeft;
|
|
var my = event.clientY + document.body.scrollTop - document.body.clientTop;
|
|
}
|
|
if( this.mode == 'sv' ) {
|
|
var obj = this.getObjPos( this.sv );
|
|
var x = this.cap(mx - obj.x - 3, -4, this.size - 4);
|
|
var y = this.cap(my - obj.y - 3, -4, this.size - 4);
|
|
this.svselect.style.left = x + "px";
|
|
this.svselect.style.top = y + "px";
|
|
}
|
|
else if ( this.mode == 'h' ) {
|
|
var obj = this.getObjPos( this.sv );
|
|
var y = this.cap(my - obj.y - 2, -2, this.size - 3);
|
|
this.hselect.style.top = y + "px";
|
|
this.sv.style.backgroundColor = '#' + this.rgb2hex(this.hsv2rgb( {'h':1-((y+3)/this.size), 's':1, 'v':1} ));
|
|
}
|
|
else return false;
|
|
|
|
var hex = this.getHex();
|
|
this.current.style.backgroundColor = '#' + hex;
|
|
this.value.innerHTML = '#' + hex;
|
|
this.onchange( this );
|
|
return false;
|
|
}
|
|
|
|
this.sv.onmousedown = function() {
|
|
that.mode = 'sv';
|
|
document.onmousemove = function( event ) { that.move( event ) };
|
|
document.onmouseup = that.release;
|
|
return false;
|
|
}
|
|
|
|
this.h.onmousedown = function() {
|
|
that.mode = 'h';
|
|
document.onmousemove = function( event ) { that.move( event ) };
|
|
document.onmouseup = that.release;
|
|
return false;
|
|
}
|
|
|
|
|
|
this.getHSV = function() {
|
|
var svpos = this.getObjPos( this.sv );
|
|
var svselectpos = this.getObjPos( this.svselect );
|
|
|
|
var hpos = this.getObjPos( this.h );
|
|
var hselectpos = this.getObjPos( this.hselect );
|
|
|
|
return {
|
|
'h': 1 - (this.cap(hselectpos.y - hpos.y + 3, 0, this.size) / this.size),
|
|
's': this.cap(svselectpos.x - svpos.x + 2, 0, this.size) / this.size,
|
|
'v': 1 - (this.cap(svselectpos.y - svpos.y + 4, 0, this.size) / this.size)
|
|
}
|
|
}
|
|
|
|
this.getRGB = function() {
|
|
return this.hsv2rgb( this.getHSV() );
|
|
}
|
|
|
|
this.getHex = function() {
|
|
return this.rgb2hex( this.getRGB() );
|
|
}
|
|
|
|
this.toHex = function(v) { v=Math.round(Math.min(Math.max(0,v),255)); return("0123456789ABCDEF".charAt((v-v%16)/16)+"0123456789ABCDEF".charAt(v%16)); }
|
|
this.rgb2hex = function(c) { return this.toHex(c.r)+this.toHex(c.g)+this.toHex(c.b); }
|
|
|
|
this.hsv2rgb = function( c ) {
|
|
var R, B, G, H = c.h, S = c.s, V = c.v;
|
|
if( S>0 ) {
|
|
if(H>=1) H=0;
|
|
|
|
H=6*H; F=H-Math.floor(H);
|
|
A=Math.round(255*V*(1.0-S));
|
|
B=Math.round(255*V*(1.0-(S*F)));
|
|
C=Math.round(255*V*(1.0-(S*(1.0-F))));
|
|
V=Math.round(255*V);
|
|
|
|
switch(Math.floor(H)) {
|
|
case 0: R=V; G=C; B=A; break;
|
|
case 1: R=B; G=V; B=A; break;
|
|
case 2: R=A; G=V; B=C; break;
|
|
case 3: R=A; G=B; B=V; break;
|
|
case 4: R=C; G=A; B=V; break;
|
|
case 5: R=V; G=A; B=B; break;
|
|
}
|
|
return {'r': (R?R:0), 'g': (G?G:0), 'b': (B?B:0)};
|
|
}
|
|
else {
|
|
return {'r': (Math.round(V*255)), 'g': (Math.round(V*255)), 'b': (Math.round(V*255))};
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Adjust height of prev/next bars in IE ---------------------------------
|
|
var ieAdjustCount = 0;
|
|
function ieAdjustHeight( oldHeight ) {
|
|
var pe = ($('viewer') ? $('viewer') : $('images'));
|
|
if(
|
|
!document.all || // IE
|
|
!( pe ) ||
|
|
(
|
|
pe.scrollHeight < oldHeight + 50 &&
|
|
ieAdjustCount > 10
|
|
)
|
|
) {
|
|
return;
|
|
}
|
|
ieAdjustCount++;
|
|
var newHeight = pe.scrollHeight;
|
|
$('prevBar').style.height = pe.scrollHeight + 'px';
|
|
$('nextBar').style.height = pe.scrollHeight + 'px';
|
|
setTimeout( 'ieAdjustHeight(' + newHeight + ')', 100 );
|
|
}
|
|
|
|
//GET
|
|
|
|
function getUrlVars() {
|
|
var vars = {};
|
|
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
|
|
vars[key] = value;
|
|
});
|
|
return vars;
|
|
}
|
|
|
|
|
|
// JSON functions for tagging, rating, deleting... -----------------------
|
|
function post( url, params, callback ) {
|
|
if (window.ActiveXObject) { // ie
|
|
try {
|
|
req = new ActiveXObject( 'Msxml2.XMLHTTP' );
|
|
}
|
|
catch (e) {
|
|
try {
|
|
req = new ActiveXObject( 'Microsoft.XMLHTTP' );
|
|
}
|
|
catch (e) {}
|
|
}
|
|
}
|
|
else if (window.XMLHttpRequest) { // moz
|
|
req = new XMLHttpRequest();
|
|
req.overrideMimeType( 'text/plain' );
|
|
}
|
|
req.onreadystatechange = function(){
|
|
if (req.readyState == 4 && req.status == 200) {
|
|
callback();
|
|
}
|
|
};
|
|
|
|
if( !req ) return false;
|
|
req.open( 'POST', url, true );
|
|
req.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded; charset=UTF-8' );
|
|
req.setRequestHeader( 'Content-length', params.length );
|
|
req.setRequestHeader( 'Connection', 'close' );
|
|
req.send( params );
|
|
}
|
|
|
|
function addTags( imageId, inputField, admin ) {
|
|
$( 'loadTags' ).style.display = 'block';
|
|
var tags = encodeURIComponent(inputField.value);
|
|
if( !admin ) {
|
|
inputField.value = '';
|
|
}
|
|
post(
|
|
location.protocol + "//" + location.host + '/json.php?addTags',
|
|
'id='+imageId+'&tags='+tags,
|
|
function(){
|
|
q = ( eval('('+req.responseText+')') );
|
|
if( q.tags ) {
|
|
$('tags').innerHTML = q.tags;
|
|
}
|
|
$('addTag').className='hidden';
|
|
$( 'loadTags' ).style.display = 'none';
|
|
}
|
|
);
|
|
return false;
|
|
}
|
|
|
|
function del( imageId ) {
|
|
try {
|
|
if( !confirm( 'Delete this image: ' + imageId +' ?' ) ) return false;
|
|
//$( 'loadDelete' ).style.display = 'block';
|
|
|
|
post(
|
|
location.protocol + "//" + location.host + '/json.php?delete','id='+imageId);
|
|
LoadData("comments","cmts",imageId);
|
|
}
|
|
catch (e) {
|
|
|
|
alert("Fehler: "+e);
|
|
return false;
|
|
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function movehof( imageId ) {
|
|
try {
|
|
if( !confirm( 'Move to Hall of Fame?' ) ) return false;
|
|
//$( 'loadhof' ).style.display = 'block';
|
|
|
|
post(
|
|
location.protocol + "//" + location.host + '/json.php?fame',
|
|
'id='+imageId);
|
|
//function(){
|
|
//$( 'loadhof' ).style.display = 'none';
|
|
// //$( 'hof' ).style.display = 'none';
|
|
//}
|
|
}
|
|
catch (e) {
|
|
|
|
alert("Fehler: "+e);
|
|
return false;
|
|
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function CloseThread( imageId ) {
|
|
try {
|
|
if( !confirm( 'Close Thread?' ) ) return false;
|
|
//$( 'loadhof' ).style.display = 'block';
|
|
|
|
post(
|
|
location.protocol + "//" + location.host + '/json.php?CloseThread',
|
|
'id='+imageId);
|
|
//function(){
|
|
//$( 'loadhof' ).style.display = 'none';
|
|
// //$( 'hof' ).style.display = 'none';
|
|
//}
|
|
}
|
|
catch (e) {
|
|
|
|
alert("Fehler: "+e);
|
|
return false;
|
|
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
function banUser( userId ) {
|
|
|
|
if( !confirm( 'Ban this User?' ) ) return false;
|
|
var rsn = prompt("Why?");
|
|
//$( 'loadDelete' ).style.display = 'block';
|
|
post(
|
|
location.protocol + "//" + location.host + '/json.php?banUser',
|
|
'id='+userId+'&rsn='+rsn);
|
|
return false;
|
|
}
|
|
|
|
function TimeUser( userId ) {
|
|
|
|
if( !confirm( 'Spamlock this user?' ) ) return false;
|
|
var tm = prompt("How long? (in hours)");
|
|
var rsn = prompt("Why?");
|
|
//$( 'loadDelete' ).style.display = 'block';
|
|
var now = parseInt(Math.round((new Date()).getTime() / 1000));
|
|
now = now + (3600 * parseInt(tm));
|
|
alert(now);
|
|
post(
|
|
location.protocol + "//" + location.host + '/json.php?TimeUser',
|
|
'id='+userId+'&time='+now+'&rsn='+rsn);
|
|
|
|
return false;
|
|
}
|
|
|
|
function delComment( commentId, e ) {
|
|
if( !confirm( 'Delete this comment?' ) ) return false;
|
|
var cdiv = e.parentNode.parentNode.parentNode;
|
|
post(
|
|
location.protocol + "//" + location.host + '/json.php?deleteComment',
|
|
'id='+commentId);
|
|
return false;
|
|
}
|
|
|
|
function addfav( imageId, e ) {
|
|
post(
|
|
location.protocol + "//" + location.host + '/json.php?addfav',
|
|
'id='+imageId);
|
|
return false;
|
|
}
|
|
|
|
|
|
// mouseover for rating stars
|
|
function sr( id, scale ) {
|
|
$( id ).style.backgroundPosition = ( (20 * scale) - 100 ) + 'px 0';
|
|
}
|
|
|
|
function rate( imageId, score ) {
|
|
$( 'loadRating' ).style.display = 'block';
|
|
post(
|
|
$('home').href + 'json.php?rate',
|
|
'id='+imageId+'&score='+score,
|
|
function() {
|
|
q = ( eval('('+req.responseText+')') );
|
|
$( 'loadRating' ).style.display = 'none';
|
|
$( 'currentRating' ).style.width = 20 * parseFloat(q.score) + 'px';
|
|
$( 'ratingDescription' ).innerHTML = q.score + ' after ' + q.votes + ' Vote' + ( q.votes > 1 ? 's' : '' );
|
|
}
|
|
);
|
|
return false;
|
|
}
|
|
|
|
function s() {
|
|
var q = $( 'q' );
|
|
if( q && q.value ) {
|
|
window.location = $('home').href + 'search/' + encodeURI( q.value );
|
|
}
|
|
return false;
|
|
} |