/*
Copyright 2016 Ville Rantanen
This program is free software: you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see .
See other included library licenses further down the file.
*/
/* ------------ Qalbum functions start here ------------- */
var maxThumb=10;
var uagent = navigator.userAgent.toLowerCase();
var marklist=[]
var currentimage=-1;
var currentlist=-1;
var originals=false;
var fullscreen=false;
var zoom=false;
var preloader;
var slideshowtimer;
var slideshowinterval;
var configupdatetimer;
var sorttype="";
function setup() {
// Setup run at the load of page.
if (notsupported()) {
return;
}
document.onkeydown=keypressed;
slideshowinterval=request('auto');
if (slideshowinterval!=0) { slidenextrestart(); }
fullscreen=request('full')==1;
originals=request('orig')==1;
request('sort');
var req=request('p');
if (req==-1) { req=request('q'); }
if (req!=-1) {
showimage(req);
} else {
thumblist(0,-1);
subfolderbiglist();
}
return;
}
function showimage(i) {
// Main function to show a single image
if (i>imagelist.length-1 || i<0) { return; }
thumblist(i,i);
var dirStr=$('#imagecontainer').data('ID')';
if (slideshowinterval!=0) {
linkToBig = '';
}
if (isHTML(imagelist[i].name)) {
$('#imagecontainer').html('
';
$('#thumbcontainer').html(thumbstr);
if (curr>-1) {
c=document.getElementById('n'+curr);
if (c) {c.className="imagebox thumbbox rounded"; }
}
if (marklist.length>0) {
for (m in marklist) {
//var mth=document.getElementById('n'+marklist[m])
if ($('#n'+marklist[m]).length!=0) {
$('#n'+marklist[m]).addClass('marked');
}
}
}
return;
}
function getProgressEl() {
// returns an empty progressbar
return ''
}
function setProgress(i) {
// Sets the progess bar width
if ($('#progressbar').length!=0) {
$('#progressbar').css('width',parseInt(100*(i+1)/(imagelist.length))+'%');
}
return
}
function getThumbStartEnd(n,maxThumb) {
// Sets the thumbnail list first and last shown item to sensible values
startI=Math.max(0,n+1-Math.round((maxThumb/2)));
startI=Math.min(startI,imagelist.length-maxThumb);
startI=Math.max(0,startI);
endI=Math.min(startI+maxThumb,imagelist.length);
return {first: startI, last: endI}
}
function allprogress() {
var imgs=document.images;
var completed=0;
for (i=0;i';
}
thumbstr+='';
$('#thumbcontainer').html(thumbstr);
$('#imagecontainer').html(getProgressEl());
$('#imagecontainer').css('height',15);
$('#desccontainer').hide();
currentimage=-1;
$('#imagecontainer').data('preloaded',setInterval('allprogress()', 200));
return;
}
function allmediums() {
// Shows all the medium sized in the current folder
thumbstr='
';
for (i=0; i';
}
thumbstr+='
';
$('#thumbcontainer').html(thumbstr);
$('#imagecontainer').html(getProgressEl());
$('#imagecontainer').css('height',15);
$('#desccontainer').hide();
for (i=0; i(texticonlist) ';
for (p=0; p'+
nicestring(pathlist[p].name)+'('+String(pathlist[p].size)+')/ ';
}
pathstr+='';
if (pathlist.length==0) {
$('#pathcontainer').html('');
} else { $('#pathcontainer').html(pathstr); }
return;
}
function subfolderbiglist() {
// Shows a subfolder list with thumbnails
pathstr='
';
}
if (pathlist.length==0) {
$('#pathcontainer').html('');
} else { $('#pathcontainer').html(pathstr); }
return;
}
function sortlist(property) {
// sorts the image list based on time or name, or reverse sort
if (currentimage!=-1) { var tempcurrent=imagelist[currentimage].name; }
var templist=imagelist;
var tempmark=[];
for (i in marklist) {
tempmark.push(imagelist[marklist[i]].name);
}
if (property=='time') {
templist.sort(function(a,b) {
return a.time-b.time
})
}
if (property=='size') {
templist.sort(function(a,b) {
return a.size-b.size
})
}
if (property=='alpha') {
templist.sort(function(a, b){
if (a.name < b.name)
return -1
if (a.name > b.name)
return 1
return 0
})
}
if (property=='rev') {
templist.reverse();
}
imagelist=templist;
var markidx=0;
marklist=[];
for (i in imagelist) {
markidx=tempmark.indexOf(imagelist[i].name);
if (markidx!=-1) {
marklist.push(parseInt(i));
}
}
if (currentimage!=-1) {
for (i in imagelist) {
if (imagelist[i].name == tempcurrent) {
currentimage=parseInt(i);
}
}
}
thumblist(currentimage,currentimage);
return;
}
function request(type) {
// Check for URL queries
var queries = location.search.substr(1).split("&");
for (que=0;que1 && query[1].length>0) {
for (imname in imagelist) {
if (imagelist[imname].name.indexOf(unescape(query[1])) != -1) {
return parseInt(imname);
break;
}
}
}
}
if (type=="p") {
// Fetch ?p=position request and return the integer
if ((query[0]=="p") && query.length>1 && query[1].length>0) {
var retval=parseInt(query[1]);
if (isNaN(retval)) { return -1; }
retval=Math.max(1,retval);
retval=Math.min(retval,imagelist.length);
return retval-1;
}
}
if (type=="auto") {
// Fetch ?auto=num seconds request and return the boolean
if ((query[0]=="auto") && query.length>1 && query[1].length>0) {
var retval=parseFloat(query[1]);
if (isNaN(retval)) { return 0; }
return retval;
}
}
if (type=="full") {
// Fetch ?full=1
if ((query[0]=="full") && query.length>1 && query[1].length>0) {
var retval=parseInt(query[1]);
if (isNaN(retval)) { return 0; }
return retval;
}
}
if (type=="orig") {
// Fetch ?orig=1
if ((query[0]=="orig") && query.length>1 && query[1].length>0) {
var retval=parseInt(query[1]);
if (isNaN(retval)) { return 0; }
return retval;
}
}
if (type=="sort") {
// Fetch ?sort=n|t|nr|nt
if ((query[0]=="sort") && query.length>1 && query[1].length>0) {
var order=query[1].substring(0,1);
var rev=query[1].substring(1,2)=="r"
if (order=="n") { sortlist('alpha'); }
if (order=="t") { sortlist('time'); }
if (rev) { sortlist('rev'); }
return 0;
}
}
}
if (type=="auto") { return 0; }
return -1;
}
function markitem(i) {
// Adds an item in a list of selected images
if (imagelist.length==0) { return; }
if (i==-1) { return; }
if ($('#listcontainer').html().length<4) {
$('#listcontainer').html('
Marked:'+
'edit'+
'copy'+
'
');
}
var existidx=marklist.indexOf(i);
if (existidx==-1) {
marklist.push(i);
} else {
marklist.splice(existidx,1);
}
marklisteditor();
showimage(i);
return;
}
function unmarkitem(i) {
// remove an item from selection list
marklist.splice(i,1);
marklisteditor();
showimage(currentimage);
return;
}
function marklisteditor() {
// print out an editor view of the selection list
var liststr='';
var dlstr='X'+
''+imagelist[marklist[i]].name+'';
dlstr+=imagelist[marklist[i]].name+'%0A';
}
dlstr+='">Download as file';
liststr+='
'+
'delete list'+
''+
''+dlstr+''+
'
';
$('#marklist').html(liststr);
return;
}
function marklisttable() {
// print out a copy-pastable text box of the selection list
$('#marklist').html('');
var cel=$('#marktable')[0];
cel.onclick=marklistselect;
cel.onblur=marklistblur;
cel.cols=80;
cel.hasfocus=false;
for (i in marklist) {
cel.value=cel.value+'"'+imagelist[marklist[i]].name+'"\r\n';
}
var rows=cel.value.split(/\r?\n|\r/).length + 1;
cel.rows=rows;
marklistselect();
return;
}
function deletemarklist() {
// delete the selection list
var answer = confirm("Delete your selection list?")
if (answer) {
$('#listcontainer').html('');
marklist=[];
showimage(currentimage);
}
return
}
function marklistselect() {
// set focus to selection list text area
var cel=$('#marktable')[0];
cel.hasfocus=true;
cel.select();
}
function marklistblur() {
// set blur to selection list text area
var cel=$('#marktable')[0];
cel.hasfocus=false;
}
function ArrayToURL(array) {
var pairs = [];
for (var key in array) {
if (array.hasOwnProperty(key))
{ pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(array[key])); }
}
return pairs.join('&');
}
function nicestring(s) {
// Return a nice version of a string (short)
s=String(s);
if (s.length<20) {
return s;
}
s=s.replace(/_/g,' ');
s=s.replace(/-/g,' ');
if (s.length>30) {
s=s.substring(0,26)+'..'+s.substring(s.length-4);
}
return s;
}
function titlestring(s) {
// Return a nice version of a string for title attribute
s=s.replace(/"/g,""");
s=s.replace(/<\/?[^>]+(>|$)/g, "");
return s;
}
function flipConfigVar(variable) {
// Flip content of a boolean config variable
if (variable)
{ variable=false; }
else
{ variable=true; }
return variable
}
function fliporiginals() {
// Use original images / medium size jpegs
originals=flipConfigVar(originals);
showimage(currentimage);
}
function flipfullscreen() {
// show thumbrow / not
fullscreen=flipConfigVar(fullscreen);
if (fullscreen)
{ $('#imagecontainer')[0].scrollIntoView(true); }
else
{ $('#crumbcontainer')[0].scrollIntoView(true); }
showimage(currentimage);
}
function flipzoom() {
// show zoomer / not
zoom=flipConfigVar(zoom);
showimage(currentimage);
}
function getmaxthumbs() {
maxthumbs=Math.floor((document.body.clientWidth-30)/100)-2;
// quick fix for larger displays
maxthumbs=maxthumbs - Math.floor(document.body.clientWidth/1000);
return maxthumbs;
}
function isHTML(s) {
return s.match(/htm.?$/i);
}
function hidethumbs() {
// hide all thumbnails (obsolete)
if (notsupported()) {
return;
}
for (n=0; n(imagelist.length-1)) { currentimage=0; }
}
showimage(currentimage);
}
}
function slidenextrestart() {
if (slideshowinterval==0) { showimage(currentimage); return; }
if (slideshowtimer) { clearInterval(slideshowtimer); }
slideshowtimer=setInterval('slidenext()',1000*Math.abs(slideshowinterval));
slidenext();
}
function slidesetupfromconfig() {
var el=$('#configSlideInterval')[0];
var newinterval=parseFloat(el.value);
if (isNaN(newinterval)) { newinterval=0; }
el.value=newinterval;
slideshowinterval=newinterval;
if (slideshowtimer) { clearInterval(slideshowtimer); }
if (slideshowinterval!=0) {
slideshowtimer=setInterval('slidenext()',1000*Math.abs(slideshowinterval));
}
return;
}
function keypressed(e) {
//if ($('#marklist').length!=0) {
// if (document.getElementById('marklist').hasfocus) { return; } }
var evtobj=window.event? event : e; //distinguish between IE's explicit event object (window.event) and Firefox's implicit.
var unicode=evtobj.charCode? evtobj.charCode : evtobj.keyCode;
maxThumb=getmaxthumbs();
var shift=evtobj.shiftKey;
// shift end: move to last image
if (unicode==35 && shift==1) {
currentimage=imagelist.length-1;
showimage(currentimage);
}
// shift home: move to first item
if (unicode==36 && shift==1) {
currentimage=0;
showimage(currentimage);
}
// arrow left, j: move 1 left
if ((unicode==37 || unicode==74 ) && shift==0) {
currentimage-=1;
if (currentimage<0) { currentimage=imagelist.length-1; }
showimage(currentimage);
}
// shift arrow left, j: move 1 page left
if ((unicode==37 || unicode==74 ) && shift==1) {
currentimage-=maxThumb;
if (currentimage<0) { currentimage=imagelist.length-1; }
showimage(currentimage);
}
// arrow right, k: move 1 right
if ((unicode==39 || unicode==75) && shift==0) {
currentimage+=1;
if (currentimage>(imagelist.length-1)) { currentimage=0; }
showimage(currentimage);
}
// shift arrow right, k: move 1 page right
if ((unicode==39 || unicode==75) && shift==1) {
currentimage+=maxThumb;
if (currentimage>(imagelist.length-1)) { currentimage=0; }
showimage(currentimage);
}
// a: all thumbs
if (unicode==65) {
allthumbs();
}
// b: boss key
if (unicode==66) {
bosskey();
}
// f: fullscreen
if (unicode==70) {
flipfullscreen();
}
// m: mediums
if (unicode==77) {
allmediums();
}
// o: originals
if (unicode==79) {
fliporiginals();
}
// s: setup or h: help
if (unicode==83 || unicode==72) {
usersetupflip();
}
// x: mark image
if (unicode==88) {
markitem(currentimage);
}
if (slideshowinterval!=0) {
clearInterval(slideshowtimer);
slideshowtimer=setInterval('slidenext()',1000*Math.abs(slideshowinterval));
}
// z: zoomer
if (unicode==90) {
flipzoom();
}
//Debug:
//alert(unicode);
return;
}
function usersetupflip() {
if ($('#setupcontainer').length!=0) {
usersetupclose();
} else {
usersetup();
}
return
}
function usersetup() {
if ($('#setupcontainer').length==0) {
el=getsetupwindow();
$('body').append(el);
// document.body.appendChild(el);
el.scrollIntoView(true);
$('#configSlideInterval')[0].value=slideshowinterval;
usersetupupdate();
$('#setupcontainer').hide();
$('#setupcontainer').show(200);
configupdatetimer=setInterval('usersetupupdate()',500);
}
return
}
function usersetupclose() {
if ($('#setupcontainer').length!=0) {
$('#setupcontainer').hide(200);
//var el=document.getElementById('setupcontainer')
//el.parentNode.removeChild(el);
clearInterval(configupdatetimer);
setTimeout(function() { $('#setupcontainer').remove(); },200);
}
return
}
function usersetupupdate() {
var el=$('#configFullscreen')[0];
if (fullscreen) { el.value='Fullscreen: True'; }
else { el.value='Fullscreen: False'; }
el=$('#configOriginals')[0];
if (originals) { el.value='Originals: True'; }
else { el.value='Originals: False'; }
el=$('#configZoom')[0];
if (zoom) { el.value='Zoom: True'; }
else { el.value='Zoom: False'; }
var optionArray=[];
if (fullscreen) { optionArray['full']=1; }
if (originals) { optionArray['orig']=1; }
if (slideshowinterval!=0) { optionArray['auto']=slideshowinterval; }
if (currentimage!=-1) { optionArray['p']=(parseInt(currentimage)+1); }
var optionstr=ArrayToURL(optionArray);
if (optionstr.length>0) { optionstr='?'+optionstr; }
var linkstr=top.location.origin+top.location.pathname+optionstr;
$('#configExample').html('Link to this image and configuration');
return
}
function getsetupwindow() {
/* Returns an object containing the long help text */
var el = document.createElement('div');
el.setAttribute("id", 'setupcontainer');
var str='
Configuration
'+
'
'+
''+
'
'+
'
'+
''+
''+
'
'+
'
'+
'
'+
'
Slideshow: seconds
'+
''+
'
Keyboard shortcuts
'+
'
'+
'
←, →, j, k : Move to previous / next image'+
' Shift ←, → : Jump to next page'+
' Shift Home, End : Move to first / last image'+
' a : show all thumbnails'+
' f : toggle fullscreen'+
' m : show all images as medium size'+
' o : toggle originals'+
' s/h : show setup'+
' z : zoom in to image'+
' x : mark image (creates a downloadable list of filenames)'+
'