Files
5ducky/legacy/media/picturelicious.js
kibiandClaude Opus 5.5 664d8c6117 Move the original PHP site into legacy/
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>
2026-10-17 02:15:05 +02:00

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;
}