$(function() { /* name of the selected album, in the top right combo box */ var album = $('#albumSelect div').html(); /* mode is small or expanded, depending on the picture size */ var mode = 'small'; /* this is the index of the last clicked picture */ var current = 0; /* first, let's build the thumbs for the selected album */ buildThumbs(); /* clicking on a thumb loads the image (alt attribute of the thumb is the source of the large image); mouseover and mouseout for a nice spotlight hover effect */ $('#thumbsContainer img').live('click',function(){ loadPhoto($(this),'cursorPlus'); if(!$(this).hasClass('currentThumb')){ $('#thumbsContainer').find('img.currentThumb').removeClass('currentThumb').css('opacity',0.4); $(this).addClass('currentThumb'); } }).live('mouseover',function(){ var $this = $(this); $this.stop().animate({ 'opacity':'1.0' },200); }).live('mouseout',function(){ var $this = $(this); if(!$this.hasClass('currentThumb')){ $this.stop().animate({ 'opacity':'0.4' },200); } }); /* when resizing the window resize the picture */ $(window).bind('resize', function() { resize($('#displayed'),0); }); /* Album Combo Events to open, close, and select an album from the combo */ $('#albumSelect div').bind('click',function(){ var $this = $(this); /*if($this.is('.up')) closeAlbumCombo(); else if($this.is('.down')) openAlbumCombo();*/ }); $('#albumSelect ul > li').bind('click',function(){ var $this = $(this); album = $this.find('a').html(); buildThumbs(); var $combo = $('#albumSelect div'); $('#albumSelect ul').find('li.currentAlbum').removeClass('currentAlbum'); $this.addClass('currentAlbum'); //$this.find('a').html($combo.html()); //$combo.html(album); //closeAlbumCombo(); //orderCombo($this.parent()); }); //functions to control the albums combos /* when hovering the main image change the mouse icons (left,right,plus,minus) also when clicking on the image, expand it or make it smaller depending on the mode */ /* $('#displayed').live('mousemove',function(e){ var $this = $(this); var imageWidth = parseFloat($this.css('width'),10); var x = e.pageX - $this.offset().left; if(x<(imageWidth/3)) $this.addClass('cursorLeft') .removeClass('cursorPlus cursorRight cursorMinus'); else if(x>(2*(imageWidth/3))) $this.addClass('cursorRight') .removeClass('cursorPlus cursorLeft cursorMinus'); else{ if(mode=='expanded'){ $this.addClass('cursorMinus') .removeClass('cursorLeft cursorRight cursorPlus'); } else if(mode=='small'){ $this.addClass('cursorPlus') .removeClass('cursorLeft cursorRight cursorMinus'); } } }).live('click',function(){ var $this = $(this); if(mode=='expanded' && $this.is('.cursorMinus')){ mode='small'; $this.addClass('cursorPlus') .removeClass('cursorLeft cursorRight cursorMinus'); $('#thumbsWrapper').stop().animate({ 'bottom':'0px' },300); resize($this,1); } else if(mode=='small' && $this.is('.cursorPlus')){ mode='expanded'; $this.addClass('cursorMinus') .removeClass('cursorLeft cursorRight cursorPlus'); $('#thumbsWrapper').stop().animate({ 'bottom':'-85px' },300); resize($this,1); } else if($this.is('.cursorRight')){ var $thumb = $('#thumbsContainer img:nth-child('+parseInt(current+1)+')'); if($thumb.length){ ++current; loadPhoto($thumb,'cursorRight'); } } else if($this.is('.cursorLeft')){ var $thumb = $('#thumbsContainer img:nth-child('+parseInt(current-1)+')'); if($thumb.length){ --current; loadPhoto($thumb,'cursorLeft'); } } });*/ /* function to build the thumbs container An AJAX request is made to retrieve the photo locations of the selected album */ function buildThumbs(){ current=1; $('#imageWrapper').empty(); $('#loading').show(); $.get('ajax/thumbs.php?album='+album, function(data) { var countImages = data.length; var count = 0; var $tContainer = $('
',{ id : 'thumbsContainer', style : 'visibility:hidden;' }) var images = new Array(); for(var i = 0; i < countImages; ++i){ try{ var titleString = data[i].title[0]; }catch(e){ titleString=''; } if(titleString==undefined) titleString=''; try{ var description = data[i].desc[0]; }catch(e){ description=''; } if(description==undefined) description=''; images[i] = new Image() images[i].src = data[i].alt; $(''+data[i].alt+'').load(function(){ var $this = $(this); $tContainer.append($this); ++count; if(count==1){ //make first thumbnail 'currentThumb' $this.addClass('currentThumb'); /* load 1 image into container*/ $('').load(function(){ var $first = $(this); $('#loading').hide(); resize($first,0); $('#imageWrapper').append($first); $('#title').html($this.attr('title')); $('#description').html(description); }).attr('src',$this.attr('alt')); } if(count == countImages){ $('#thumbsWrapper').empty().append($tContainer); thumbsDim($tContainer); makeScrollable($('#thumbsWrapper'),$tContainer,15); } }).attr('src',data[i].src); } },'json'); } /* adjust the size (width) of the scrollable container - this depends on all its images widths */ function thumbsDim($elem){ var finalW = 0; $elem.find('img').each(function(i){ var $img = $(this); finalW+=$img.width()+5; //plus 5 -> 4 margins + 1 to avoid rounded calculations }); $elem.css('width',finalW+'px').css('visibility','visible'); } /* loads a picture into the imageWrapper the image source is in the thumb's alt attribute */ function loadPhoto($thumb,cursorClass){ current = $thumb.index()+1; $('#imageWrapper').empty(); $('#loading').show(); $('').load(function(){ var $this = $(this); $('#loading').hide(); resize($this,0); if(!$('#imageWrapper').find('img').length){ $('#imageWrapper').append($this.fadeIn(800)); //XML DESC LOADED ON ALBUM CLICK NOW: //$('#description').html($this.attr('title')); } }).attr('src',$thumb.attr('alt')); } //functions to control the albums combos function closeAlbumCombo(){ var $combo = $('#albumSelect div'); $combo.addClass('down').removeClass('up'); $combo.prev().hide(); } function openAlbumCombo(){ var $combo = $('#albumSelect div'); $combo.addClass('up').removeClass('down'); $combo.prev().show(); } function orderCombo($ul){ var items = $ul.find('li').get(); items.sort(function(a,b){ var keyA = $(a).text(); var keyB = $(b).text(); if (keyA < keyB) return -1; if (keyA > keyB) return 1; return 0; }); $.each(items, function(i, li){ $ul.append(li); }); } //Get our elements for faster access and set overlay width function makeScrollable($wrapper, $container, contPadding){ //Get menu width var divWidth = $wrapper.width(); //Remove scrollbars $wrapper.css({ overflow: 'hidden' }); //Find last image container var lastLi = $container.find('img:last-child'); $wrapper.scrollLeft(0); //When user move mouse over menu $wrapper.unbind('mousemove').bind('mousemove',function(e){ //As images are loaded ul width increases, //so we recalculate it each time var ulWidth = lastLi[0].offsetLeft + lastLi.outerWidth() + contPadding; var left = (e.pageX - $wrapper.offset().left) * (ulWidth-divWidth) / divWidth; $wrapper.scrollLeft(left); }); } /* function to resize an image based on the windows width and height */ function resize($image, type){ var widthMargin = 10 var heightMargin = 0; if(mode=='expanded') heightMargin = 60; else if(mode=='small') heightMargin = 220; //type 1 is animate, type 0 is normal var windowH = $(window).height()-heightMargin; var windowW = $(window).width()-widthMargin; var theImage = new Image(); theImage.src = $image.attr("src"); var imgwidth = theImage.width; var imgheight = theImage.height; if((imgwidth > windowW)||(imgheight > windowH)){ if(imgwidth > imgheight){ var newwidth = windowW; var ratio = imgwidth / windowW; var newheight = imgheight / ratio; theImage.height = newheight; theImage.width= newwidth; if(newheight>windowH){ var newnewheight = windowH; var newratio = newheight/windowH; var newnewwidth =newwidth/newratio; theImage.width = newnewwidth; theImage.height= newnewheight; } } else{ var newheight = windowH; var ratio = imgheight / windowH; var newwidth = imgwidth / ratio; theImage.height = newheight; theImage.width= newwidth; if(newwidth>windowW){ var newnewwidth = windowW; var newratio = newwidth/windowW; var newnewheight =newheight/newratio; theImage.height = newnewheight; theImage.width= newnewwidth; } } } if((type==1)&&(!$.browser.msie)) $image.stop(true).animate({ 'width':theImage.width+'px', 'height':theImage.height+'px' },1000); else $image.css({ 'width':theImage.width+'px', 'height':theImage.height+'px' }); } });