/*
Justified Gallery
Version: 2.1
Author: Miro Mannino
Author URI: http://miromannino.it
Copyright 2012 Miro Mannino (miro.mannino@gmail.com)
This file is part of Justified Gallery.
This work is licensed under the Creative Commons Attribution 3.0 Unported License.
To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/
or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
*/
(function($){
$.fn.justifiedGallery = function(options){
//TODO fare impostazione 'rel' che sostituisce tutti i link con il rel specificato
var settings = $.extend( {
'sizeRangeSuffixes' : {'lt100':'_t', 'lt240':'_m', 'lt320':'_n', 'lt500':'', 'lt640':'_z', 'lt1024':'_b'},
'rowHeight' : 120,
'margins' : 1,
'justifyLastRow' : true,
'fixedHeight' : false,
'captions' : true,
'rel' : null, //rewrite the rel of each analyzed links
'target' : null, //rewrite the target of all links
'extension' : /\.[^.]+$/,
'refreshTime' : 500,
'onComplete' : null
}, options);
function getErrorHtml(message, classOfError){
return "
" + message + "
";
}
return this.each(function(index, cont){
$(cont).addClass("justifiedGallery");
var loaded = 0;
var images = new Array($(cont).find("img").length);
if(images.length == 0) return;
$(cont).append("");
$(cont).find("a").each(function(index, entry){
var imgEntry = $(entry).find("img");
images[index] = new Array(5);
images[index]["src"] = (typeof $(imgEntry).data("safe-src") != 'undefined') ? $(imgEntry).data("safe-src") : $(imgEntry).attr("src");
images[index]["alt"] = $(imgEntry).attr("alt");
images[index]["href"] = $(entry).attr("href");
images[index]["title"] = $(entry).attr("title");
images[index]["rel"] = (settings.rel != null) ? settings.rel : $(entry).attr("rel");
images[index]["target"] = (settings.target != null) ? settings.target : $(entry).attr("target");
images[index]["extension"] = images[index]["src"].match(settings.extension)[0];
$(entry).remove(); //remove the image, we have its data
var img = new Image();
$(img).load(function() {
if(images[index]["height"] != settings.rowHeight)
images[index]["width"] = Math.ceil(this.width / (this.height / settings.rowHeight));
else
images[index]["width"] = this.width;
images[index]["height"] = settings.rowHeight;
var usedSizeRangeRegExp = new RegExp("(" + settings.sizeRangeSuffixes.lt100 + "|"
+ settings.sizeRangeSuffixes.lt240 + "|"
+ settings.sizeRangeSuffixes.lt320 + "|"
+ settings.sizeRangeSuffixes.lt500 + "|"
+ settings.sizeRangeSuffixes.lt640 + "|"
+ settings.sizeRangeSuffixes.lt1024 + ")$");
images[index]["src"] = images[index]["src"].replace(settings.extension, "").replace(usedSizeRangeRegExp, "");
if(++loaded == images.length) startProcess(cont, images, settings);
});
$(img).error(function() {
$(cont).prepend(getErrorHtml("The image can't be loaded: \"" + images[index]["src"] +"\"", "jg-usedPrefixImageNotFound"));
images[index] = null;
if(++loaded == images.length) startProcess(cont, images, settings);
});
$(img).attr('src', images[index]["src"]);
});
});
function startProcess(cont, images, settings){
//FadeOut the loading image and FadeIn the images after their loading
$(cont).find(".jg-loading").fadeOut(500, function(){
$(this).remove(); //remove the loading image
processesImages($, cont, images, 0, settings);
if($.isFunction(settings.onComplete)) settings.onComplete.call(this, cont);
});
}
function buildImage(image, suffix, nw, nh, l, minRowHeight, settings){
var ris;
ris = "";
return ris;
}
function buildContRow(row, images, extraW, settings){
var j, l = 0;
var minRowHeight;
for(var j = 0; j < row.length; j++){
row[j]["nh"] = Math.ceil(images[row[j]["indx"]]["height"] *
((images[row[j]["indx"]]["width"] + extraW) /
images[row[j]["indx"]]["width"]));
row[j]["nw"] = images[row[j]["indx"]]["width"] + extraW;
row[j]["suffix"] = getSuffix(row[j]["nw"], row[j]["nh"], settings);
row[j]["l"] = l;
if(!settings.fixedHeight){
if(j == 0)
minRowHeight = row[j]["nh"];
else
if(minRowHeight > row[j]["nh"]) minRowHeight = row[j]["nh"];
}
l += row[j]["nw"] + settings.margins;
}
if(settings.fixedHeight) minRowHeight = settings.rowHeight;
var rowCont = "";
for(var j = 0; j < row.length; j++){
rowCont += buildImage(images[row[j]["indx"]], row[j]["suffix"],
row[j]["nw"], row[j]["nh"], row[j]["l"], minRowHeight, settings);
}
return "" + rowCont + "
";
}
function getSuffix(nw, nh, settings){
var n;
if(nw > nh) n = nw; else n = nh;
if(n <= 100){
return settings.sizeRangeSuffixes.lt100; //thumbnail (longest side:100)
}else if(n <= 240){
return settings.sizeRangeSuffixes.lt240; //small (longest side:240)
}else if(n <= 320){
return settings.sizeRangeSuffixes.lt320; //small (longest side:320)
}else if(n <= 500){
return settings.sizeRangeSuffixes.lt500; //small (longest side:320)
}else if(n <= 640){
return settings.sizeRangeSuffixes.lt640; //medium (longest side:640)
}else{
return settings.sizeRangeSuffixes.lt1024; //large (longest side:1024)
}
}
function processesImages($, cont, images, lastRowWidth, settings){
var row = new Array();
var row_i, i;
var partialRowWidth = 0;
var extraW;
var rowWidth = $(cont).width();
for(i = 0, row_i = 0; i < images.length; i++){
if(images[i] == null) continue;
if(partialRowWidth + images[i]["width"] + settings.margins <= rowWidth){
//we can add the image
partialRowWidth += images[i]["width"] + settings.margins;
row[row_i] = new Array(5);
row[row_i]["indx"] = i;
row_i++;
}else{
//the row is full
extraW = Math.ceil((rowWidth - partialRowWidth + 1) / row.length);
$(cont).append(buildContRow(row, images, extraW, settings));
row = new Array();
row[0] = new Array(5);
row[0]["indx"] = i;
row_i = 1;
partialRowWidth = images[i]["width"] + settings.margins;
}
}
//last row----------------------
//now we have all the images index loaded in the row arra
if(settings.justifyLastRow){
extraW = Math.ceil((rowWidth - partialRowWidth + 1) / row.length);
}else{
extraW = 0;
}
$(cont).append(buildContRow(row, images, extraW, settings));
//---------------------------
//Captions---------------------
if(settings.captions){
$(cont).find(".jg-image").mouseenter(function(sender){
$(sender.currentTarget).find(".jg-image-label").stop();
$(sender.currentTarget).find(".jg-image-label").fadeTo(500, 0.7);
});
$(cont).find(".jg-image").mouseleave(function(sender){
$(sender.currentTarget).find(".jg-image-label").stop();
$(sender.currentTarget).find(".jg-image-label").fadeTo(500, 0);
});
}
$(cont).find(".jg-resizedImageNotFound").remove();
//fade in the images that we have changed and need to be reloaded
$(cont).find(".jg-image img").load(function(){
$(this).fadeTo(500, 1);
}).error(function(){
$(cont).prepend(getErrorHtml("The image can't be loaded: \"" + $(this).attr("src") +"\"", "jg-resizedImageNotFound"));
}).each(function(){
if(this.complete) $(this).load();
});
checkWidth($, cont, images, rowWidth, settings);
}
function checkWidth($, cont, images, lastRowWidth, settings){
var id = setInterval(function(){
if(lastRowWidth != $(cont).width()){
$(cont).find(".jg-row").remove();
clearInterval(id);
processesImages($, cont, images, lastRowWidth, settings);
return;
}
}, settings.refreshTime);
}
}
})(jQuery);