/*
 * Services - Plugin de jQuery para el manejo de galería de eventos de robando cámara
 *
 * Copyright (c) 2009 Héctor Borges
 *
 *
 */

(function($){
	
	var debugMode = false;
	$.gallery = {};
	
	$.fn.eventsGallery = function(options)
	{
		var opts = $.extend({}, $.gallery.defaults, options);
		
		$.gallery.cover = $(opts.coverSelector);
		$.gallery.cover.click(closeHolder);
		$.gallery.holder = $(opts.holderSelector);
		$.gallery.holder.prepend('<a href="#" id="closePhotoDetailJS">Cerrar</a>');
		$(opts.closeSelector).click(closeHolder);
		
		$.gallery.ajaxLoader = new Image();
		$.gallery.ajaxLoader.src = opts.ajaxLoaderSrc;
		
		var result = this.each(function() 
		{
			var me = $(this);
			me.config = {};
			$.extend(me.config, opts);
			return init.call(me);
		});
		
		return result;
	}
	
	$.eventsGallery = {};
	
	$.eventsGallery.showCover = function()
	{
		if (typeof($.gallery.cover) == 'undefined')
		{
			$.gallery.cover = $($.gallery.defaults.coverSelector);
			$.gallery.holder = $($.gallery.defaults.holderSelector);
		}
		
		showCover();
	};
	
	$.eventsGallery.hideCover = function()
	{
		if (typeof($.gallery.cover) == 'undefined')
		{
			$.gallery.cover = $($.gallery.defaults.coverSelector);
			$.gallery.holder = $($.gallery.defaults.holderSelector);
		}
		
		hideCover();
	};
	

	/*
	*
	*
	*	Funciones de uso privado para galería de eventos
	*
	*/
	function init()
	{
		this.click(handleImageClick);
	};
	
	function showCover()
	{
		if ($.gallery.cover.is(':hidden'))
		{
			$.gallery.cover.css({opacity:0, display:'block'});
			$.gallery.cover.fadeTo('slow', $.gallery.defaults.coverAlpha);
		}
	};
	
	function hideCover()
	{
		if ($.gallery.cover.is(':visible') && $.gallery.holder.is(':hidden'))
		{
			$.gallery.cover.fadeOut(function(){
				$(this).css('display', 'none');
			});
		}
	};
	
	function handleImageClick(event)
	{
		var me = $(this);	
		showCover();
		changeImage(me.attr('href') + ' ' + $.gallery.defaults.holderFilter);
		return false;
	};
	
	function changeImage(url)
	{
		debug("Mostrando ajax loader");
		$('<img id="ajaxLoading"/>')
		.attr('src', $.gallery.defaults.ajaxLoaderSrc)
		.appendTo($('#fotoDetalle', $.gallery.holder));
		
		var buffer = $('<div>').load(url, function(){
			var image = $('img', buffer);
			var imagePreloader = new Image();
			imagePreloader.src = image.attr('src');
			
			imagePreloader.onload = function(){
				debug("Image preloaded %o", this);
				$.gallery.holder.css({opacity:1, display:'block'});
				scaleAndCenter(this.width, this.height);
				var fotoDetalle = $('#fotoDetalle', buffer);
				
				fotoDetalle.fadeOut(0);
				$.gallery.holder.find('#fotoDetalle').remove();
				$.gallery.holder.append(buffer.html());
				fotoDetalle.fadeIn();
				
				initPrevNextLinks();
			};
		});
	};
	
	function initPrevNextLinks()
	{
		debug("inicializando links");
		$('.navlink', $.gallery.holder).click(handleImageClick);
	};
	
	function scaleAndCenter(width, height)
	{
		width += 100;

		$.gallery.holder.animate({marginLeft:-1*width/2, marginTop:(-1*height/2)+$(window).scrollTop(), width:width, minHeight:height});
		debug("Scaling to %dx%d", width, height);
	};
	
	function closeHolder()
	{
		$.gallery.holder.fadeOut(function(){
			hideCover();
			var me = $(this);
			$('#fotoDetalle', me).remove();
			me.css('display', 'none');
		});
		return false;
	};
	
	
	
	
	/*
	*
	*
	*	Opciones por defecto
	*
	*/
	$.gallery.defaults = {
		coverSelector:'#cover',
		coverAlpha:0.8,
		holderSelector:'#holder',
		holderFilter:'#bigPhotoDetails > *',
		closeSelector:'#closePhotoDetailJS',
		ajaxLoaderSrc:'./images/ajax-loader.gif'
	};
	
	/*
	*
	*
	*	Funciones utilitarias generales
	*
	*/
	
	function debug()
	{
		if(debugMode)
		{
			if(typeof(console) != 'undefined')
			{
				console.log.apply(this, arguments);
			}
		}
	}
	
})(jQuery);