/* ------------------------------------------------------------------------
Class: prettyGallery
Use: Gallery plugin for jQuery
------------------------------------------------------------------------- */

jQuery.fn.prettyGallery = function(settings) {
settings = jQuery.extend({
itemsPerPage : 2,
animationSpeed : 'normal', /* fast/normal/slow */
navigation : 'top',  /* top/bottom/both */
of_label: ' of ', /* The content in the page "1 of 2" */
previous_title_label: 'Previous page', /* The title of the previous link */
next_title_label: 'Next page', /* The title of the next link */
previous_label: 'Previous', /* The content of the previous link */
next_label: 'Next' /* The content of the next link */
}, settings);
return this.each(function(){
// Global variables needed in multiple functions.
var currentPage = 1;
var itemWidth = 0;
var itemHeight = 0;
var galleryWidth = 0;
var pageCount = 0;
var animated = false;
var $gallery = $(this);

var prettyGalleryPrevious = function(caller) {
// Make sure not to double animate, and not animate of the button is disabled
if(animated || $(caller).hasClass('disabled')) return;
animated = true;

$gallery.find('li:lt('+(currentPage * settings.itemsPerPage)+')').each(function(i){
$(this).animate({'left': parseFloat($(this).css('left')) + (galleryWidth + itemMargin) }, settings.animationSpeed, function(){
animated = false;
});
});

$gallery.find('li:gt('+ ((currentPage * settings.itemsPerPage) - 1) +')').each(function(i){
$(this).animate({'left': parseFloat($(this).css('left')) + (galleryWidth + itemMargin) }, settings.animationSpeed);
});

currentPage--;

_displayPaging();
};

var prettyGalleryNext = function(caller) {
// Make sure not to double animate, and not animate of the button is disabled
if(animated || $(caller).hasClass('disabled')) return;
animated = true;

$gallery.find('li:lt('+(currentPage * settings.itemsPerPage)+')').each(function(i){
$(this).animate({'left': parseFloat($(this).css('left')) - (galleryWidth + itemMargin) }, settings.animationSpeed, function(){
animated = false;
});
});

$gallery.find('li:gt('+ ((currentPage * settings.itemsPerPage) - 1) +')').each(function(i){
$(this).animate({'left': parseFloat($(this).css('left')) - (galleryWidth + itemMargin) }, settings.animationSpeed);
});

currentPage++;

_displayPaging();
};

var _formatGallery = function() {
itemWidth = $gallery.find('li:first').width();
itemMargin = parseFloat($gallery.find('li:first').css('margin-right')) + parseFloat($gallery.find('li:first').css('margin-left')) + parseFloat($gallery.find('li:first').css('padding-left')) + parseFloat($gallery.find('li:first').css('padding-right')) + parseFloat($gallery.find('li:first').css('border-left-width')) + parseFloat($gallery.find('li:first').css('border-right-width'));
itemHeight = $gallery.find('li:first').height() + parseFloat($gallery.find('li:first').css('margin-top')) + parseFloat($gallery.find('li:first').css('margin-bottom')) + parseFloat($gallery.find('li:first').css('padding-top')) + parseFloat($gallery.find('li:first').css('padding-bottom'));
galleryWidth = (itemWidth + itemMargin) * settings.itemsPerPage - parseFloat($gallery.find('li:first').css('margin-right')); // We don't want the margin of the last item, that's why we remove it.

$gallery.css({
'width': galleryWidth,
'height': itemHeight,
'overflow': 'hidden',
'position': 'relative',
'clear': 'left'
});
$gallery.find('li').each(function(i){
$(this).css({
'position':'absolute',
'top':0,
'left':i * (itemWidth + itemMargin)
});
});

$gallery.wrap('<div class="prettyGallery"></div>').addClass('prettyGallery');
};

var _displayPaging = function() {
$cg = $gallery.parents('div.prettyGallery:first'); // The containing gallery

$cg.find('ul.prettyNavigation span.current').text(currentPage);
$cg.find('ul.prettyNavigation span.total').text(pageCount);

// Make sur all the links are enabled
$cg.find('ul.prettyNavigation li a').removeClass('disabled');

// Display the proper nav
if(currentPage == 1){
// Hide the previous button
$cg.find('ul.prettyNavigation li.prev a').addClass('disabled');
} else if(currentPage == pageCount) {
// Hide the next button
$cg.find('ul.prettyNavigation li.next a').addClass('disabled');
};
};

var _applyNav = function() {
var template = '';
template +='<ul class="prettyNavigation">';
template += '<li class="prev"><a href="#" title="'+settings.previous_title_label+'">'+settings.previous_label+'</a></li>';
template += '<li><span class="current">1</span>'+settings.of_label+'<span class="total">1</span></li>';
template += '<li class="next"><a href="#" title="'+settings.next_title_label+'">'+settings.next_label+'</a></li>';
template += '</ul>';

switch(settings.navigation){
case 'top':
$gallery.before(template);
break;
case 'bottom':
$gallery.after(template);
break;
case 'both':
$gallery.before(template);
$gallery.after(template);
break;
};

// Adjust the nav to the gallery width
$theNav = $gallery.parent('div.prettyGallery:first').find('ul.prettyNavigation');
galleryBorderWidth = parseFloat($theNav.css('border-left-width')) + parseFloat($theNav.css('border-right-width'));
$theNav.width(galleryWidth - galleryBorderWidth);
$theNav.each(function(){
$(this).find('li:eq(1)').width(galleryWidth - galleryBorderWidth - parseFloat($(this).parent().find('ul.prettyNavigation li:first').width()) - parseFloat($(this).parent().find('ul.prettyNavigation li:last').width()));
});

// Apply the functions to the buttons
$theNav.find('li.prev a').bind('click',function(){
prettyGalleryPrevious(this);
return false;
});

$theNav.find('li.next a').bind('click',function(){
prettyGalleryNext(this);
return false;
});
};

// Check if we need the gallery
if($(this).find('li').size() > settings.itemsPerPage) {
// Set the number of pages
pageCount = Math.ceil($(this).find('li').size() / settings.itemsPerPage);

// Format the gallery properly
_formatGallery();

// Build and display the nav
_applyNav();

// Display the proper paging
_displayPaging(this);
currentPage = 1;
};
});
};


$.fn.prettyPhoto = function(settings) {

var isSet = false; 
var setCount = 0; 
var setPosition = 0; 
var arrayPosition = 0; 
var hasTitle = false;
var caller = 0;
var doresize = true;
var imagesArray = [];

$(window).scroll(function(){ _centerPicture(); });
$(window).resize(function(){ _centerPicture(); _resizeOverlay(); });
$(document).keyup(function(e){
switch(e.keyCode){
case 37:
if (setPosition == 1) return;
changePicture('previous');
break;
case 39:
if (setPosition == setCount) return;
changePicture('next');
break;
case 27:
close();
break;
};
    });
 

settings = jQuery.extend({
animationSpeed: 'normal', /* fast/slow/normal */
padding: 40, /* padding for each side of the picture */
opacity: 0.35, /* Value betwee 0 and 1 */
showTitle: true, /* true/false */
allowresize: true /* true/false */
}, settings);

$(this).each(function(){
imagesArray[imagesArray.length] = this;
$(this).bind('click',function(){
open(this); return false;
});
});

function open(el) {
caller = $(el);

// Find out if the picture is part of a set
theRel = $(caller).attr('rel');
galleryRegExp = /\[(?:.*)\]/;
theGallery = galleryRegExp.exec(theRel);

// Find out the type of content
contentType = "image";
if($(caller).attr('href').indexOf('.swf') > 0){ hasTitle = false; contentType = 'flash'; };

// Calculate the number of items in the set, and the position of the clicked picture.
isSet = false;
setCount = 0;
for (i = 0; i < imagesArray.length; i++){
if($(imagesArray[i]).attr('rel').indexOf(theGallery) != -1){
setCount++;
if(setCount > 1) isSet = true;

if($(imagesArray[i]).attr('href') == $(el).attr('href')){
setPosition = setCount;
arrayPosition = i;
};
};
};

_buildOverlay(isSet);

// Display the current position
$('div.pictureHolder span.currentText').html('<span>' + setPosition + '</span>' + '/' + setCount);

// Position the picture in the center of the viewing area
_centerPicture();

$('div.pictureHolder #fullResImageContainer').hide();
$('.loaderIcon').show();

// Display the correct type of information
(contentType == 'image') ? _preload() : _writeFlash();
};

showimage = function(width,height,containerWidth,containerHeight,contentHeight,contentWidth,resized){
$('.loaderIcon').hide();
var scrollPos = _getScroll();

if($.browser.opera) {
windowHeight = window.innerHeight;
windowWidth = window.innerWidth;
}else{
windowHeight = $(window).height();
windowWidth = $(window).width();
};

$('div.pictureHolder .content').animate({'height':contentHeight,'width':containerWidth},settings.animationSpeed);

projectedTop = scrollPos['scrollTop'] + ((windowHeight/2) - (containerHeight/2));
if(projectedTop < 0) projectedTop = 0 + $('div.prettyPhotoTitle').height();

// Resize the holder
$('div.pictureHolder').animate({
'top': projectedTop,
'left': ((windowWidth/2) - (containerWidth/2)),
'width': containerWidth
},settings.animationSpeed,function(){
$('#fullResImage').attr({
'width':width,
'height':height
});

$('div.pictureHolder').width(containerWidth);
$('div.pictureHolder .hoverContainer').height(height).width(width);

// Show the nav elements
_shownav();

// Fade the new image
$('div.pictureHolder #fullResImageContainer').fadeIn(settings.animationSpeed);

// Fade the resizing link if the image is resized
if(resized) $('a.expand,a.contract').fadeIn(settings.animationSpeed);
});
};

function changePicture(direction){
if(direction == 'previous') {
arrayPosition--;
setPosition--;
}else{
arrayPosition++;
setPosition++;
};

// Allow the resizing of the images
if(!doresize) doresize = true;

// Fade out the current picture
$('div.pictureHolder .hoverContainer,div.pictureHolder .details').fadeOut(settings.animationSpeed);
$('div.pictureHolder #fullResImageContainer').fadeOut(settings.animationSpeed,function(){
$('.loaderIcon').show();

// Preload the image
_preload();
});

_hideTitle();
$('a.expand,a.contract').fadeOut(settings.animationSpeed,function(){
$(this).removeClass('contract').addClass('expand');
});
};

function close(){
$('div.pictureHolder,div.prettyPhotoTitle').fadeOut(settings.animationSpeed, function(){
$('div.prettyPhotoOverlay').fadeOut(settings.animationSpeed, function(){
$('div.prettyPhotoOverlay,div.pictureHolder,div.prettyPhotoTitle').remove();

// To fix the bug with IE select boxes
if($.browser.msie && $.browser.version == 6){
$('select').css('visibility','visible');
};
});
});
};

function _checkPosition(){
// If at the end, hide the next link
(setPosition == setCount) ? $('div.pictureHolder a.next').css('visibility','hidden') : $('div.pictureHolder a.next').css('visibility','visible');

// If at the beginning, hide the previous link
(setPosition == 1) ? $('div.pictureHolder a.previous').css('visibility','hidden') : $('div.pictureHolder a.previous').css('visibility','visible');

// Change the current picture text
$('div.pictureHolder span.currentText span').text(setPosition);

(isSet) ? $c = $(imagesArray[arrayPosition]) : $c = $(caller);

if($c.attr('title')){
$('div.pictureHolder .description').html(unescape($c.attr('title')));
}else{
$('div.pictureHolder .description').text('');
};

if($c.find('img').attr('alt') && settings.showTitle){
hasTitle = true;
$('div.prettyPhotoTitle .prettyPhotoTitleContent').html(unescape($c.find('img').attr('alt')));
}else{
hasTitle = false;
};
};

function _fitToViewport(width,height){
hasBeenResized = false;

$('div.pictureHolder .details').width(width); /* To have the correct height */
$('div.pictureHolder .details p.description').width(width - parseFloat($('div.pictureHolder a.close').css('width'))); /* So it doesn't overlap the button */

// Get the container size, to resize the holder to the right dimensions
contentHeight = height + parseFloat($('div.pictureHolder .details').height()) + parseFloat($('div.pictureHolder .details').css('margin-top')) + parseFloat($('div.pictureHolder .details').css('margin-bottom'));
contentWidth = width;
containerHeight = height + parseFloat($('div.prettyPhotoTitle').height()) + parseFloat($('div.pictureHolder .top').height()) + parseFloat($('div.pictureHolder .bottom').height());
containerWidth = width + settings.padding;

// Define them in case there's no resize needed
imageWidth = width;
imageHeight = height;

if($.browser.opera) {
windowHeight = window.innerHeight;
windowWidth = window.innerWidth;
}else{
windowHeight = $(window).height();
windowWidth = $(window).width();
};

if( ((containerWidth > windowWidth) || (containerHeight > windowHeight)) && doresize && settings.allowresize) {
hasBeenResized = true;

if((containerWidth > windowWidth) && (containerHeight > windowHeight)){
// Get the original geometry and calculate scales
var xscale =  (containerWidth + 200) / windowWidth;
var yscale = (containerHeight + 200) / windowHeight;
}else{
// Get the original geometry and calculate scales
var xscale = windowWidth / containerWidth;
var yscale = windowHeight / containerHeight;
}

// Recalculate new size with default ratio
if (yscale>xscale){
imageWidth = Math.round(width * (1/yscale));
imageHeight = Math.round(height * (1/yscale));
} else {
imageWidth = Math.round(width * (1/xscale));
imageHeight = Math.round(height * (1/xscale));
};

// Define the new dimensions
contentHeight = imageHeight + parseFloat($('div.pictureHolder .details').height()) + parseFloat($('div.pictureHolder .details').css('margin-top')) + parseFloat($('div.pictureHolder .details').css('margin-bottom'));
contentWidth = imageWidth;
containerHeight = imageHeight + parseFloat($('div.prettyPhotoTitle').height()) + parseFloat($('div.pictureHolder .top').height()) + parseFloat($('div.pictureHolder .bottom').height());
containerWidth = imageWidth + settings.padding;

$('div.pictureHolder .details').width(contentWidth); /* To have the correct height */
$('div.pictureHolder .details p.description').width(contentWidth - parseFloat($('div.pictureHolder a.close').css('width'))); /* So it doesn't overlap the button */
};

return {
width:imageWidth,
height:imageHeight,
containerHeight:containerHeight,
containerWidth:containerWidth,
contentHeight:contentHeight,
contentWidth:contentWidth,
resized:hasBeenResized
};
};

function _centerPicture(){
//Make sure the gallery is open
if($('div.pictureHolder').size() > 0){

var scrollPos = _getScroll();

if($.browser.opera) {
windowHeight = window.innerHeight;
windowWidth = window.innerWidth;
}else{
windowHeight = $(window).height();
windowWidth = $(window).width();
};

if(doresize) {
projectedTop = (windowHeight/2) + scrollPos['scrollTop'] - ($('div.pictureHolder').height()/2);
if(projectedTop < 0) projectedTop = 0 + $('div.prettyPhotoTitle').height();

$('div.pictureHolder').css({
'top': projectedTop,
'left': (windowWidth/2) + scrollPos['scrollLeft'] - ($('div.pictureHolder').width()/2)
});

$('div.prettyPhotoTitle').css({
'top' : $('div.pictureHolder').offset().top - $('div.prettyPhotoTitle').height(),
'left' : $('div.pictureHolder').offset().left + (settings.padding/2)
});
};
};
};

function _shownav(){
if(isSet) $('div.pictureHolder .hoverContainer').fadeIn(settings.animationSpeed);
$('div.pictureHolder .details').fadeIn(settings.animationSpeed);

_showTitle();
};

function _showTitle(){
if(settings.showTitle && hasTitle){
$('div.prettyPhotoTitle').css({
'top' : $('div.pictureHolder').offset().top,
'left' : $('div.pictureHolder').offset().left + (settings.padding/2),
'display' : 'block'
});

$('div.prettyPhotoTitle div.prettyPhotoTitleContent').css('width','auto');

if($('div.prettyPhotoTitle').width() > $('div.pictureHolder').width()){
$('div.prettyPhotoTitle div.prettyPhotoTitleContent').css('width',$('div.pictureHolder').width() - (settings.padding * 2));
}else{
$('div.prettyPhotoTitle div.prettyPhotoTitleContent').css('width','');
};

$('div.prettyPhotoTitle').animate({'top':($('div.pictureHolder').offset().top - 22)},settings.animationSpeed);
};
};

function _hideTitle() {
$('div.prettyPhotoTitle').animate({'top':($('div.pictureHolder').offset().top)},settings.animationSpeed,function() { $(this).css('display','none'); });
};

function _preload(){

_checkPosition();

// Set the new image
imgPreloader = new Image();

// Preload the neighbour images
nextImage = new Image();
if(isSet) nextImage.src = $(imagesArray[arrayPosition + 1]).attr('href');
prevImage = new Image();
if(isSet && imagesArray[arrayPosition - 1]) prevImage.src = $(imagesArray[arrayPosition - 1]).attr('href');

$('div.pictureHolder .content').css('overflow','hidden');

if(isSet) {
$('div.pictureHolder #fullResImage').attr('src',$(imagesArray[arrayPosition]).attr('href'));
}else{
$('div.pictureHolder #fullResImage').attr('src',$(caller).attr('href'));
};

imgPreloader.onload = function(){
var correctSizes = _fitToViewport(imgPreloader.width,imgPreloader.height);
imgPreloader.width = correctSizes['width'];
imgPreloader.height = correctSizes['height'];

// Need that small delay for the anim to be nice
setTimeout('showimage(imgPreloader.width,imgPreloader.height,'+correctSizes["containerWidth"]+','+correctSizes["containerHeight"]+','+correctSizes["contentHeight"]+','+correctSizes["contentWidth"]+','+correctSizes["resized"]+')',500);
};

(isSet) ? imgPreloader.src = $(imagesArray[arrayPosition]).attr('href') : imgPreloader.src = $(caller).attr('href');
};

function _getScroll(){
scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0;
scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || 0;
return {scrollTop:scrollTop,scrollLeft:scrollLeft};
};

function _resizeOverlay() {
$('div.prettyPhotoOverlay').css({
'height':$(document).height(),
'width':$(window).width()
});
};

function _writeFlash(){
flashParams = $(caller).attr('rel').split(';');
$(flashParams).each(function(i){
// Define the width and height
if(flashParams[i].indexOf('width') >= 0) flashWidth = flashParams[i].substring(flashParams[i].indexOf('width') + 6, flashParams[i].length);
if(flashParams[i].indexOf('height') >= 0) flashHeight = flashParams[i].substring(flashParams[i].indexOf('height') + 7, flashParams[i].length);
if(flashParams[i].indexOf('flashvars') >= 0) flashVars = flashParams[i].substring(flashParams[i].indexOf('flashvars') + 10, flashParams[i].length);
});

$('.pictureHolder #fullResImageContainer').append('<embed width="'+flashWidth+'" height="'+flashHeight+'" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" wmode="opaque" name="prettyFlash" flashvars="'+flashVars+'" allowscriptaccess="always" bgcolor="#FFFFFF" quality="high" src="'+$(caller).attr('href')+'"/>');
$('#fullResImage').hide();

contentHeight = parseFloat(flashHeight) + parseFloat($('div.pictureHolder .details').height()) + parseFloat($('div.pictureHolder .details').css('margin-top')) + parseFloat($('div.pictureHolder .details').css('margin-bottom'));
contentWidth = parseFloat(flashWidth)+ parseFloat($('div.pictureHolder .details').width()) + parseFloat($('div.pictureHolder .details').css('margin-left')) + parseFloat($('div.pictureHolder .details').css('margin-right'));
containerHeight = contentHeight + parseFloat($('div.pictureHolder .top').height()) + parseFloat($('div.pictureHolder .bottom').height());
containerWidth = parseFloat(flashWidth) + parseFloat($('div.pictureHolder .content').css("padding-left")) + parseFloat($('div.pictureHolder .content').css("padding-right")) + settings.padding;

setTimeout('showimage('+flashWidth+','+flashHeight+','+containerWidth+','+containerHeight+','+contentHeight+','+contentWidth+')',500);
};

function _buildOverlay(){
backgroundDiv = "<div class='prettyPhotoOverlay'></div>";
$('body').append(backgroundDiv);
$('div.prettyPhotoOverlay').css('height',$(document).height()).bind('click',function(){
close();
});

pictureHolder = '<div class="pictureHolder"><div class="top"><div class="left"></div><div class="middle"></div><div class="right"></div></div><div class="content"><a href="#" class="expand" title="Expand the image">Expand</a><div class="loaderIcon"></div><div class="hoverContainer"><a class="next" href="#">next</a><a class="previous" href="#">previous</a></div><div id="fullResImageContainer"><img id="fullResImage" src="" /></div><div class="details clearfix"><a class="close" href="#">Close</a><p class="description"></p><p class="currentTextHolder"><span class="currentText"><span>0</span>/<span class="total">0</span></span></p></div></div><div class="bottom"><div class="left"></div><div class="middle"></div><div class="right"></div></div></div>';

titleHolder = '<div class="prettyPhotoTitle"><div class="prettyPhotoTitleLeft"></div><div class="prettyPhotoTitleContent"></div><div class="prettyPhotoTitleRight"></div></div>';

$('body').append(pictureHolder).append(titleHolder);

$('.pictureHolder,.titleHolder').css({'opacity': 0});
$('a.close').bind('click',function(){ close(); return false; });
$('a.expand').bind('click',function(){

if($(this).hasClass('expand')){ 
$(this).removeClass('expand').addClass('contract'); doresize = false; }else{ $(this).removeClass('contract').addClass('expand'); doresize = true; };

_hideTitle(); 
$('div.pictureHolder .hoverContainer,div.pictureHolder #fullResImageContainer').fadeOut(settings.animationSpeed);
$('div.pictureHolder .details').fadeOut(settings.animationSpeed,function(){
_preload(); }); return false; });

$('.pictureHolder .previous').bind('click',function(){ changePicture('previous'); return false; });
$('.pictureHolder .next').bind('click',function(){ changePicture('next'); return false; });
$('.hoverContainer').css({ 'margin-left': settings.padding/2 });
if(!isSet) { $('.hoverContainer,.currentTextHolder').hide(); };
if($.browser.msie && $.browser.version == 6){ $('select').css('visibility','hidden'); };
$('div.prettyPhotoOverlay').css('opacity',0).fadeTo(settings.animationSpeed,settings.opacity, function(){
$('div.pictureHolder').css('opacity',0).fadeIn(settings.animationSpeed,function(){
$('div.pictureHolder').attr('style','left:'+$('div.pictureHolder').css('left')+';top:'+$('div.pictureHolder').css('top')+';');
}); }); }; };


