
/*
	bbncFlickr v0.2
	Josh Skidmore <josh.skidmore@blackbaud.com>
	August 2009
	
	Ben Wong <ben.wong@blackbaud.com>
	January 2010
*/

;(function($)
{	
	$.fn.bbncFlickr = function(_in)
	{
		//Add configuration options to bbncFlickr.defaults
		_prefs = $.extend($.fn.bbncFlickr.defaults,_in);
		
		//Set the #bbncFlickrWrapper div as the _prefs.container
		_prefs.container = $(".bbncFlickrWrapper");
		
		if (_prefs.doAction == 'singleSet')
			initSet('single');
			
		else if (_prefs.doAction == 'inlineSet')
			initSet('inline');
			
		else if (_prefs.doAction == 'multipleSet')
			initSet('multiple');
			
		else if (_prefs.doAction == 'multipleInlineSet' || _prefs.doAction == 'multipleSingleSet'){
			initMultipleSets();
		}

		else
		{
			// Just set defaults
			$.fn.bbncFlickr.defaults = _prefs;
			return;
		}
	};
	
	function initSet(_type)
	{
		/*
		* This function sets up the divs within #bbncFlickrWrapper
		*/
		
		// Empty #bbncFlickrWrapper
		$(_prefs.container).empty();

		// Build Indicator Gif
		var _indicator = $('<div id="' + _prefs.cssPrefix + 'Indicator" />').appendTo(_prefs.container);
		
		$('<img src="' + _prefs.lightbox.imageLoading + '" alt="Indicator" id="' + _prefs.cssPrefix + 'IndicatorImage" />').appendTo(_indicator);
		
		// Build internal wrapper for thumbnails
		$('<div id="' + _prefs.cssPrefix + 'ContentWrapper" />').appendTo(_prefs.container);
		
		// Show indicator
		$('#' + _prefs.cssPrefix + 'ContentWrapper').hide(120,function(){$('#' + _prefs.cssPrefix + 'ContentWrapper').show(120);});
		
		// Activate set if there is a photoset id
		if(_prefs.photoSet)
			activateSet();
		
		//If multiple set build the list
		if (_type == 'multiple')
		{
			// Load photoset listing
			loadSets(function(){buildSetListing();});
		}
		else
		{
			// Load set, load set images
			loadSet(_prefs.photoSet,function(){
											 loadSetPhotos(_prefs.photoSet,function(){
																					buildSet(_type);
																					});
											 });
		}
	};
	
	function initMultipleSets(){
		/* Count the number of inline sets */
		/* Load each photoSet */
		$.each(_prefs.photoSet, function(_i, _item){
			var setId = _item;
			var count = _i;
			loadSet(setId, function(){
							loadSetPhotos(setId, function(setId){
										if(_prefs.doAction == 'multipleSingleSet') buildMultipleSets(setId, count);
										else buildSetPhotos(setId, count);
							});
			});						
		}); //end each
		
	};
	
	function buildMultipleSets(_id, count){
		// Add titles and descriptions from photoSet
			$(_prefs.container[count]).append("<h2>"+_photosets[_id].title._content+"</h2>");
			$('<p class="' + _prefs.cssPrefix + 'PhotosetDescription" />').html(_photosets[_id].description._content).appendTo(_prefs.container[count]);
			
			//Add photos
			buildSetPhotos(_id, count);
	}
	
	function buildSetPhotos(setId, count){
		//Add photos to the .bbncFlickrWrapper
		
		$.each(_photosets[setId].list,function(_i,_item)
		{
			var _link = $('<a class="' + _prefs.cssPrefix + 'ThumbnailLink" />').attr({'title':_item.title,'href':'http://farm' + _item.farm + '.static.flickr.com/' + _item.server + '/' + _item.id + '_' + _item.secret + '.jpg'}).appendTo(_prefs.container[count]);
			
			$('<img class="' + _prefs.cssPrefix + 'ThumbnailPhoto" />').attr('title',_item.title).css({opacity:.75}).hover(function(){$(this).fadeTo(100,1); $(this).addClass('hover');},function(){$(this).fadeTo(200,.75); $(this).removeClass('hover');}).attr("src",'http://farm' + _item.farm + '.static.flickr.com/' + _item.server + '/' + _item.id + '_' + _item.secret + '_s.jpg').appendTo(_link);
		});
		
		if($.fn.lightBox)
			$('.bbncFlickrWrapper a').lightBox(_prefs.lightbox);
	}
	
	function buildSetListing()
	{

		var _cnt = 0;
		var _ul = $('<ul id="' + _prefs.cssPrefix + 'PhotosetsListing"/>').appendTo($(_prefs.setListingWrapper));
		
		$.each(_photosets,function(_i,_item)
		{
			if (_cnt == 0 && location.hash.substring(1))
			{
				_prefs.photoSet = location.hash.substring(1);
				initSet('single');
			}
			else if (_cnt == 0)
			{
				_prefs.photoSet = _item.id;
				initSet('single');
			}
				
			var _li = $('<li class="' + _prefs.cssPrefix + 'PhotosetEntry" />').attr('id',_prefs.cssPrefix + 'PhotosetEntry' + _item.id).appendTo(_ul);
			_li.text(_item.title._content + ' (' + _item.photos + ')').hover(function(){$(this).addClass('hover');},function(){$(this).removeClass('hover');}).bind('click',function(){ $().bbncFlickr.loadPhotoset(_item.id);});
			
			_cnt++;
			
			if (_cnt == _prefs.max_galleries)
				return false;
		});
		
		// Activate set
		activateSet();
	};
	
	function activateSet()
	{
		/*
		 *	Change the photoset id in the URL and reload page
		 */
		 
		$('.flickrPhotosetEntry').removeClass('active');
		$('#' + _prefs.cssPrefix + 'PhotosetEntry' + _prefs.photoSet).addClass('active');
		
		//if there is already a set loaded in the url
		if (_prefs.photoSet && !location.hash.substring(1))
			window.location.href = window.location.href + '#' + _prefs.photoSet;
		
		else if (_prefs.photoSet)
			window.location.href = window.location.href.replace(/#(.*?)$/,'#' + _prefs.photoSet);
	};
	
	function buildSet(_type)
	{
		if (_type == 'single' || _type == 'multiple')
		{
			//Create h2 with header and append to flickrContentWrapper
			$('<h2 id="' + _prefs.cssPrefix + 'PhotosetTitle" />').html(_photosets[_prefs.photoSet].title._content).appendTo('#' + _prefs.cssPrefix + 'ContentWrapper');
			$('<p id="' + _prefs.cssPrefix + 'PhotosetDescription" />').html(_photosets[_prefs.photoSet].description._content).appendTo('#' + _prefs.cssPrefix + 'ContentWrapper');
		}
		
		buildImages();
		
		// Hide indicator
		$('#' + _prefs.cssPrefix + 'Indicator').hide(120,function(){$('#' + _prefs.cssPrefix + 'ContentWrapper').show(120);});
	};
	
	function buildImages()
	{
		//Create a photoswrapper in the contentWrapper
		var _photosWrapper	=	$('<div id="' + _prefs.cssPrefix + 'PhotosWrapper" />').appendTo('#' + _prefs.cssPrefix + 'ContentWrapper');
		
		
		$.each(_photosets[_prefs.photoSet].list,function(_i,_item)
		{
			var _link = $('<a class="' + _prefs.cssPrefix + 'ThumbnailLink" />').attr({'title':_item.title,'href':'http://farm' + _item.farm + '.static.flickr.com/' + _item.server + '/' + _item.id + '_' + _item.secret + '.jpg'}).appendTo(_photosWrapper);
			$('<img class="' + _prefs.cssPrefix + 'ThumbnailPhoto" />').attr('title',_item.title).css({opacity:.75}).hover(function(){$(this).fadeTo(100,1); $(this).addClass('hover');},function(){$(this).fadeTo(200,.75); $(this).removeClass('hover');}).attr("src",'http://farm' + _item.farm + '.static.flickr.com/' + _item.server + '/' + _item.id + '_' + _item.secret + '_s.jpg').appendTo(_link);
		});
		
		if($.fn.lightBox)
			$('#' + _prefs.cssPrefix + 'PhotosWrapper a').lightBox(_prefs.lightbox);
	};
	
	function loadSets(_cb)
	{
		// loadSets: Loads photosets into DOM

		$.getJSON(_prefs.base_url + 'flickr.photosets.getList&api_key=' + _prefs.api_key + '&user_id=' + _prefs.user_id + '&jsoncallback=?',
		function(_d)
		{
			$.each(_d.photosets.photoset,function(_i,_it){_photosets[_it.id] = _it; });
			if (_cb) _cb();
			return;
		});
	};
	
	
	function loadSetPhotos(_set,_cb)
	{
		//If there are already photos in the photoset list
		if (_photosets[_set].list)
		{
			// If callback, push (with set)
			if (_cb) _cb(_set);
			return;
		}
		else
		{
			//Load photos from photoset into the photoset list
			
			$.getJSON(_prefs.base_url + 'flickr.photosets.getPhotos&api_key=' + _prefs.api_key + '&photoset_id=' + _set + '&jsoncallback=?',
			function(_d)
			{
				//add the _d.photoset.photo array to the _photosets list
				_photosets[_set].list = _d.photoset.photo;
				
				//Go through the photo array and add the photo data to the _photos array
				$.each(_d.photoset.photo, function(_i,_it){
												   _photos[_it.id] = _it;
												   });
				
				// If callback, push (with set)
				if (_cb) _cb(_set);
				return;
			});
		}
	};
	
	function loadSet(_set,_cb)
	{
		/*
		 * Gets the info for a single photoset and adds it to the _photosets array
		 */
		 
		// If sets are loaded, don't make extra call
		if (_prefs.doAction == 'multipleSet')
		{
			if (_cb) _cb();
			return;
		}
		
		//Flickr API call getInfo to get the info of a single photoset, with callback function
		$.getJSON(_prefs.base_url + 'flickr.photosets.getInfo&api_key=' + _prefs.api_key + '&photoset_id=' + _set + '&jsoncallback=?',
		function(_d)
		{
			//add photoset object to _photosets
			_photosets[_set] = _d.photoset;
			//_set
			if (_cb) _cb();
			return;
		});
	};
	
	
	$.fn.bbncFlickr.photosets = {};
	$.fn.bbncFlickr.photos = {};
	
	var _prefs			=	{};
	var _active			=	null;
	var _photosets		=	$.fn.bbncFlickr.photosets;
	var _photos			=	$.fn.bbncFlickr.photos;

	$.fn.bbncFlickr.loadPhotoset = function(_set)
	{
		_prefs.photoSet = _set;
		initSet('single');
	};

	$.fn.bbncFlickr.defaults = 
	{
		// Defaults
		base_url:			'http://api.flickr.com/services/rest/?format=json&method=',
		max_galleries:		25,
		cssPrefix:			'flickr',
		
		lightbox:
		{
			// Lightbox Defaults
			// Lightbox set defaults (not worrying about it here)
			fixedNavigation:		true
		}
	};
	
})(jQuery);

/**
 * jQuery lightBox plugin
 * This jQuery plugin was inspired and based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/)
 * and adapted to me for use like a plugin from jQuery.
 * @name jquery-lightbox-0.5.js
 * @author Leandro Vieira Pinho - http://leandrovieira.com
 * @version 0.5
 * @date April 11, 2008
 * @category jQuery plugin
 * @copyright (c) 2008 Leandro Vieira Pinho (leandrovieira.com)
 * @license CC Attribution-No Derivative Works 2.5 Brazil - http://creativecommons.org/licenses/by-nd/2.5/br/deed.en_US
 * @example Visit http://leandrovieira.com/projects/jquery/lightbox/ for more informations about this jQuery plugin
 */
(function($){$.fn.lightBox=function(settings){settings=jQuery.extend({overlayBgColor:'#000',overlayOpacity:0.8,fixedNavigation:false,imageLoading:'view.image?id=1276',imageBtnPrev:'view.image?id=1275',imageBtnNext:'view.image?id=1274',imageBtnClose:'view.image?id=1273',imageBlank:'view.image?id=1272',containerBorderSize:10,containerResizeSpeed:400,txtImage:'Image',txtOf:'of',keyToClose:'c',keyToPrev:'p',keyToNext:'n',imageArray:[],activeImage:0},settings);var jQueryMatchedObj=this;function _initialize(){_start(this,jQueryMatchedObj);return false;}
function _start(objClicked,jQueryMatchedObj){$('embed, object, select').css({'visibility':'hidden'});_set_interface();settings.imageArray.length=0;settings.activeImage=0;if(jQueryMatchedObj.length==1){settings.imageArray.push(new Array(objClicked.getAttribute('href'),objClicked.getAttribute('title')));}else{for(var i=0;i<jQueryMatchedObj.length;i++){settings.imageArray.push(new Array(jQueryMatchedObj[i].getAttribute('href'),jQueryMatchedObj[i].getAttribute('title')));}}
while(settings.imageArray[settings.activeImage][0]!=objClicked.getAttribute('href')){settings.activeImage++;}
_set_image_to_view();}
function _set_interface(){$('body').append('<div id="jquery-overlay"></div><div id="jquery-lightbox"><div id="lightbox-container-image-box"><div id="lightbox-container-image"><img id="lightbox-image"><div style="" id="lightbox-nav"><a href="#" id="lightbox-nav-btnPrev"></a><a href="#" id="lightbox-nav-btnNext"></a></div><div id="lightbox-loading"><a href="#" id="lightbox-loading-link"><img src="'+settings.imageLoading+'"></a></div></div></div><div id="lightbox-container-image-data-box"><div id="lightbox-container-image-data"><div id="lightbox-image-details"><span id="lightbox-image-details-caption"></span><span id="lightbox-image-details-currentNumber"></span></div><div id="lightbox-secNav"><a href="#" id="lightbox-secNav-btnClose"><img src="'+settings.imageBtnClose+'"></a></div></div></div></div>');var arrPageSizes=___getPageSize();$('#jquery-overlay').css({backgroundColor:settings.overlayBgColor,opacity:settings.overlayOpacity,width:arrPageSizes[0],height:arrPageSizes[1]}).fadeIn();var arrPageScroll=___getPageScroll();$('#jquery-lightbox').css({top:arrPageScroll[1]+(arrPageSizes[3]/10),left:arrPageScroll[0]}).show();$('#jquery-overlay,#jquery-lightbox').click(function(){_finish();});$('#lightbox-loading-link,#lightbox-secNav-btnClose').click(function(){_finish();return false;});$(window).resize(function(){var arrPageSizes=___getPageSize();$('#jquery-overlay').css({width:arrPageSizes[0],height:arrPageSizes[1]});var arrPageScroll=___getPageScroll();$('#jquery-lightbox').css({top:arrPageScroll[1]+(arrPageSizes[3]/10),left:arrPageScroll[0]});});}
function _set_image_to_view(){$('#lightbox-loading').show();if(settings.fixedNavigation){$('#lightbox-image,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();}else{$('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();}
var objImagePreloader=new Image();objImagePreloader.onload=function(){$('#lightbox-image').attr('src',settings.imageArray[settings.activeImage][0]);_resize_container_image_box(objImagePreloader.width,objImagePreloader.height);objImagePreloader.onload=function(){};};objImagePreloader.src=settings.imageArray[settings.activeImage][0];};function _resize_container_image_box(intImageWidth,intImageHeight){var intCurrentWidth=$('#lightbox-container-image-box').width();var intCurrentHeight=$('#lightbox-container-image-box').height();var intWidth=(intImageWidth+(settings.containerBorderSize*2));var intHeight=(intImageHeight+(settings.containerBorderSize*2));var intDiffW=intCurrentWidth-intWidth;var intDiffH=intCurrentHeight-intHeight;$('#lightbox-container-image-box').animate({width:intWidth,height:intHeight},settings.containerResizeSpeed,function(){_show_image();});if((intDiffW==0)&&(intDiffH==0)){if($.browser.msie){___pause(250);}else{___pause(100);}}
$('#lightbox-container-image-data-box').css({width:intImageWidth});$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({height:intImageHeight+(settings.containerBorderSize*2)});};function _show_image(){$('#lightbox-loading').hide();$('#lightbox-image').fadeIn(function(){_show_image_data();_set_navigation();});_preload_neighbor_images();};function _show_image_data(){$('#lightbox-container-image-data-box').slideDown('fast');$('#lightbox-image-details-caption').hide();if(settings.imageArray[settings.activeImage][1]){$('#lightbox-image-details-caption').html(settings.imageArray[settings.activeImage][1]).show();}
if(settings.imageArray.length>1){$('#lightbox-image-details-currentNumber').html(settings.txtImage+' '+(settings.activeImage+1)+' '+settings.txtOf+' '+settings.imageArray.length).show();}}
function _set_navigation(){$('#lightbox-nav').show();$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({'background':'transparent url('+settings.imageBlank+') no-repeat'});if(settings.activeImage!=0){if(settings.fixedNavigation){$('#lightbox-nav-btnPrev').css({'background':'url('+settings.imageBtnPrev+') left 15% no-repeat'}).unbind().bind('click',function(){settings.activeImage=settings.activeImage-1;_set_image_to_view();return false;});}else{$('#lightbox-nav-btnPrev').unbind().hover(function(){$(this).css({'background':'url('+settings.imageBtnPrev+') left 15% no-repeat'});},function(){$(this).css({'background':'transparent url('+settings.imageBlank+') no-repeat'});}).show().bind('click',function(){settings.activeImage=settings.activeImage-1;_set_image_to_view();return false;});}}
if(settings.activeImage!=(settings.imageArray.length-1)){if(settings.fixedNavigation){$('#lightbox-nav-btnNext').css({'background':'url('+settings.imageBtnNext+') right 15% no-repeat'}).unbind().bind('click',function(){settings.activeImage=settings.activeImage+1;_set_image_to_view();return false;});}else{$('#lightbox-nav-btnNext').unbind().hover(function(){$(this).css({'background':'url('+settings.imageBtnNext+') right 15% no-repeat'});},function(){$(this).css({'background':'transparent url('+settings.imageBlank+') no-repeat'});}).show().bind('click',function(){settings.activeImage=settings.activeImage+1;_set_image_to_view();return false;});}}
_enable_keyboard_navigation();}
function _enable_keyboard_navigation(){$(document).keydown(function(objEvent){_keyboard_action(objEvent);});}
function _disable_keyboard_navigation(){$(document).unbind();}
function _keyboard_action(objEvent){if(objEvent==null){keycode=event.keyCode;escapeKey=27;}else{keycode=objEvent.keyCode;escapeKey=objEvent.DOM_VK_ESCAPE;}
key=String.fromCharCode(keycode).toLowerCase();if((key==settings.keyToClose)||(key=='x')||(keycode==escapeKey)){_finish();}
if((key==settings.keyToPrev)||(keycode==37)){if(settings.activeImage!=0){settings.activeImage=settings.activeImage-1;_set_image_to_view();_disable_keyboard_navigation();}}
if((key==settings.keyToNext)||(keycode==39)){if(settings.activeImage!=(settings.imageArray.length-1)){settings.activeImage=settings.activeImage+1;_set_image_to_view();_disable_keyboard_navigation();}}}
function _preload_neighbor_images(){if((settings.imageArray.length-1)>settings.activeImage){objNext=new Image();objNext.src=settings.imageArray[settings.activeImage+1][0];}
if(settings.activeImage>0){objPrev=new Image();objPrev.src=settings.imageArray[settings.activeImage-1][0];}}
function _finish(){$('#jquery-lightbox').remove();$('#jquery-overlay').fadeOut(function(){$('#jquery-overlay').remove();});$('embed, object, select').css({'visibility':'visible'});}
function ___getPageSize(){var xScroll,yScroll;if(window.innerHeight&&window.scrollMaxY){xScroll=window.innerWidth+window.scrollMaxX;yScroll=window.innerHeight+window.scrollMaxY;}else if(document.body.scrollHeight>document.body.offsetHeight){xScroll=document.body.scrollWidth;yScroll=document.body.scrollHeight;}else{xScroll=document.body.offsetWidth;yScroll=document.body.offsetHeight;}
var windowWidth,windowHeight;if(self.innerHeight){if(document.documentElement.clientWidth){windowWidth=document.documentElement.clientWidth;}else{windowWidth=self.innerWidth;}
windowHeight=self.innerHeight;}else if(document.documentElement&&document.documentElement.clientHeight){windowWidth=document.documentElement.clientWidth;windowHeight=document.documentElement.clientHeight;}else if(document.body){windowWidth=document.body.clientWidth;windowHeight=document.body.clientHeight;}
if(yScroll<windowHeight){pageHeight=windowHeight;}else{pageHeight=yScroll;}
if(xScroll<windowWidth){pageWidth=xScroll;}else{pageWidth=windowWidth;}
arrayPageSize=new Array(pageWidth,pageHeight,windowWidth,windowHeight);return arrayPageSize;};function ___getPageScroll(){var xScroll,yScroll;if(self.pageYOffset){yScroll=self.pageYOffset;xScroll=self.pageXOffset;}else if(document.documentElement&&document.documentElement.scrollTop){yScroll=document.documentElement.scrollTop;xScroll=document.documentElement.scrollLeft;}else if(document.body){yScroll=document.body.scrollTop;xScroll=document.body.scrollLeft;}
arrayPageScroll=new Array(xScroll,yScroll);return arrayPageScroll;};function ___pause(ms){var date=new Date();curDate=null;do{var curDate=new Date();}
while(curDate-date<ms);};return this.unbind('click').click(_initialize);};})(jQuery);
