;(function($) {
    $.fn.plusGaleria = function(options) {
			if (options == null || options.arrayImagens == null) {
					throw('Parâmetro necessário não definido: arrayImagens');
			}
			configurar(options);
			var o = { s: this.selector, c: this.context };
			$.fn.plusGaleria.destino = $(o.s,o.c);
			$.fn.plusGaleria.destino.before(cssPadrao());

			ajustarPaginacao($.fn.plusGaleria.options);

			$.fn.plusGaleria.executar();

			$('.botao_paginacao a').live('click', function() {
				if ($(this).attr('rel') == '#') {
						return;
				}

				if ($.fn.plusGaleria.options.alturaFixa) {
					ajustarTamanhos($.fn.plusGaleria.options);
				}
				$.fn.plusGaleria.paginaAtual = $(this).attr('rel');
				$.fn.plusGaleria.executar($.fn.plusGaleria.destino);
			});
    }
		
		$.fn.plusGaleria.executar = function (destino, options) {
			//Fazendo isso pra facilitar um pouquinho a leitura
			var destino = $.fn.plusGaleria.destino;
			var options = $.fn.plusGaleria.options;
			
			if (options.efeitoAoAbrirPagina && $.fn.plusGaleria.redimensionado) {
				destino.fadeOut('fast');
			}

			montarGaleria(destino, options);

			if (options.arrayImagens.length > options.imagensPorPagina) {
				var	paginacao = montarPaginacao($.fn.plusGaleria.options, document.getElementById($.fn.plusGaleria.options.idComponentePaginacao));
				
				//TODO Se o destino da paginação for outro que não apenas abaixo do box da galeria, o cálculo da altura do box inteiro tem que ser refeito
				if (options.destinoPaginacao == null) {
					destino.after(paginacao);
				} else {
					//$(options.destinoPaginacao).html(paginacao);
					paginacao.appendTo($(options.destinoPaginacao));
				}
			}
			if (options.efeitoAoAbrirPagina && options.alturaFixa) {
				if ($.fn.plusGaleria.redimensionado) {
					destino.fadeIn('slow');
				}
			} else if (options.efeitoAoAbrirPagina) {
				destino.fadeIn();
			}

			//$('a[rel="colorbox"]').colorbox();

			if ($.fn.plusGaleria.options.efeitoAoPassarMouse) {
				$('a[rel="' + options.relDaImagem + '"] img').live('mouseenter', function() {
					$(this).animate({ opacity: '1' });
				});
				$('a[rel="' + options.relDaImagem + '"] img').live('mouseleave', function() {
					$(this).animate({ opacity: '0.6' });
				});
			}

			$('a[rel="' + options.relDaImagem + '"] img').css('opacity', '0.6'); 
		}

		$.fn.plusGaleria.paginaAtual = 1;
		$.fn.plusGaleria.destino;
		$.fn.plusGaleria.quantidadeDePaginas = 0;
		$.fn.plusGaleria.alturaComponentePaiGaleria = 0;
		$.fn.plusGaleria.alturaComponenteGaleria = 0;
		$.fn.plusGaleria.redimensionado = false;

    $.fn.plusGaleria.options = {
			intervaloMaximoBotoes:			7,
			intervaloMinimoBotoes:			3,
			imagensPorPagina:						12,
			componentesImagem:					'<a><img></a>',
			componentePaginacao:				'<ul></ul>',
			componenteBotaoPaginacao:		'<li><a></a></li>',
			idComponentePaginacao:			'paginacao',
			classeAncoraImagem:					null,
			classeImagem:								null,
			classeBotaoPaginacao:				'botao_paginacao',
			debug:											false,
			arrayImagens:								null,
			efeitoAoAbrirPagina:				false,
			efeitoAoPassarMouse:				true,
			relDaImagem:								'colorbox',
			alturaFixa:									true,
			destinoPaginacao:						null
    };

		function configurar(options) {
			$.fn.plusGaleria.options.arrayImagens = options.arrayImagens;
			if (options.intervaloMaximoBotoes != undefined) {
				$.fn.plusGaleria.options.intervaloMaximoBotoes = options.intervaloMaximoBotoes;
			}
			if (options.intervaloMinimoBotoes != undefined) {
				$.fn.plusGaleria.options.intervaloMinimoBotoes = options.intervaloMinimoBotoes;
			}
			if (options.imagensPorPagina != undefined) {
				$.fn.plusGaleria.options.imagensPorPagina = options.imagensPorPagina;
			}
			if (options.componentesImagem != undefined) {
				$.fn.plusGaleria.options.componentesImagem = options.componentesImagem;
			}
			if (options.componentePaginacao != undefined) {
				$.fn.plusGaleria.options.componentePaginacao = options.componentePaginacao;
			}
			if (options.componenteBotaoPaginacao != undefined) {
				$.fn.plusGaleria.options.componenteBotaoPaginacao = options.componenteBotaoPaginacao;
			}
			if (options.idComponentePaginacao != undefined) {
				$.fn.plusGaleria.options.idComponentePaginacao = options.idComponentePaginacao;
			}
			if (options.classeAncoraImagem != undefined) {
				$.fn.plusGaleria.options.classeAncoraImagem = options.classeAncoraImagem;
			}
			if (options.classeImagem != undefined) {
				$.fn.plusGaleria.options.classeImagem = options.classeImagem;
			}
			if (options.classeBotaoPaginacao != undefined) {
				$.fn.plusGaleria.options.classeBotaoPaginacao = options.classeBotaoPaginacao;
			}
			if (options.debug != undefined) {
				$.fn.plusGaleria.options.debug = options.debug;
			}
			if (options.efeitoAoAbrirPagina != undefined) {
				$.fn.plusGaleria.options.efeitoAoAbrirPagina = options.efeitoAoAbrirPagina;
			}
			if (options.efeitoAoPassarMouse != undefined) {
				$.fn.plusGaleria.options.efeitoAoPassarMouse = options.efeitoAoPassarMouse;
			}
			if (options.relDaImagem != undefined) {
				$.fn.plusGaleria.options.relDaImagem = options.relDaImagem;
			}
			if (options.alturaFixa != undefined) {
				$.fn.plusGaleria.options.alturaFixa = options.alturaFixa;
			}
			if (options.destinoPaginacao != undefined) {
				$.fn.plusGaleria.options.destinoPaginacao = options.destinoPaginacao;
			}
		}

    //Métodos relacionados a criação da galeria de imagens
    function montarGaleria(destino, options) {
        destino.html('');
        for (x = 1; x <= options.imagensPorPagina; x++) {
					foto = criarImagemGaleria(options, x);
					if (foto != null) {
						destino.append(foto);
					}
        }
    }

    function criarImagemGaleria(options, indice) {
				if ($.fn.plusGaleria.paginaAtual > 1) {
					indice = parseInt((parseInt($.fn.plusGaleria.paginaAtual - 1) * parseInt(options.imagensPorPagina)) + (indice - 1));
				} else {
					indice = parseInt(parseInt($.fn.plusGaleria.paginaAtual - 1) + parseInt(indice - 1));
				}
				
				if (indice >= options.arrayImagens.length) {
					return;
				}
				
				log('indice da imagem: ' + indice);
				
        urls = $(options.arrayImagens).get(indice);
        imagem = $(options.componentesImagem);
        imagem.attr('href', urls.normal);
        imagem.attr('rel', options.relDaImagem);
        imagem.find('img').attr('src', urls.mini);
				if (urls.descricao != "") {
					imagem.attr('title', urls.descricao);
				}
        return imagem;
    }
    //Fim

    //Métodos relacionados a criação e manipulação da paginação
    function montarPaginacao(options, paginacao) {
			if (paginacao) {
				paginacao = $('#' + options.idComponentePaginacao);
				//paginacao = $(options.seletorComponentePaginacao);
			} else {
				//paginacao = $(options.componentePaginacao);
				//paginacao.attr('id', options.componentePaginacao);
				paginacao = $(options.componentePaginacao);
				paginacao.attr('id', options.idComponentePaginacao);
				paginacao.addClass('paginacao');
			}

			paginacao.html('');

			if ($.fn.plusGaleria.paginaAtual == 1) {
				criarBotoesIntermediarios(options, paginacao);
				criarBotoesProximoUltimo(options, paginacao);
			} else if ($.fn.plusGaleria.paginaAtual == $.fn.plusGaleria.quantidadeDePaginas) {
				criarBotoesPrimeiroAnterior(options, paginacao);
				criarBotoesIntermediarios(options, paginacao);
			} else {
				criarBotoesPrimeiroAnterior(options, paginacao);
				criarBotoesIntermediarios(options, paginacao);
				criarBotoesProximoUltimo(options, paginacao);
			}

			return paginacao;
    }

		function criarBotoesPrimeiroAnterior(options, paginacao) {
			var botaoPrimeiro = criarBotao(options, '&lt;&lt;', 1, false);
			botaoPrimeiro.appendTo(paginacao);

			var botaoAnterior = criarBotao(options, '&lt;', parseInt($.fn.plusGaleria.paginaAtual) - 1, false);
			botaoAnterior.appendTo(paginacao);
		}

		function criarBotoesProximoUltimo(options, paginacao) {
			var botaoProximo = criarBotao(options, '&gt;', parseInt($.fn.plusGaleria.paginaAtual) + 1, false);
			botaoProximo.appendTo(paginacao);

			var botaoUltimo = criarBotao(options, '&gt;&gt;', $.fn.plusGaleria.quantidadeDePaginas, false);
			botaoUltimo.appendTo(paginacao);
		}

		function criarBotoesIntermediarios(options, paginacao) {
			var botaoDoMeio = Math.ceil(options.intervaloMaximoBotoes / 2);
			var x = 0;

			if (options.intervaloMaximoBotoes > options.intervaloMinimoBotoes) {
				if ($.fn.plusGaleria.paginaAtual > 1) {
					x = ($.fn.plusGaleria.paginaAtual - botaoDoMeio) + 1;
				}
			}

			var contador = 0;

			if ($.fn.plusGaleria.paginaAtual > 1) {
				var quantidadeQueFalta = ($.fn.plusGaleria.quantidadeDePaginas - $.fn.plusGaleria.paginaAtual);
				if (quantidadeQueFalta < (options.intervaloMaximoBotoes - botaoDoMeio)) {
					x -= (botaoDoMeio - parseInt(quantidadeQueFalta + 1));
				}
			}

			while (true) {
				if (contador == options.intervaloMaximoBotoes) {
					break;
				}
				if (x > $.fn.plusGaleria.quantidadeDePaginas) {
					break;
				}
				var valor = ($.fn.plusGaleria.paginaAtual == x) ? '#' : x;
				var botao = criarBotao(options, x, valor, x == $.fn.plusGaleria.paginaAtual);
				
				if (x <= 0) {
					x++;
					continue;
				}

				contador++;
				x++;
				botao.appendTo(paginacao);
			}
		}

    function criarBotao(options, label, valor, ehOBotaoAtivo) {
        botao = $(options.componenteBotaoPaginacao);
        //botao.attr('href', 'javascript:;');
				botao.addClass(options.classeBotaoPaginacao);
				
				if (ehOBotaoAtivo) {
					botao.addClass('ativo');
					botao.html('').html(label);
				} else {
					botao.find('a').attr('href', 'javascript:;');
					botao.find('a').attr('rel', valor);
					botao.find('a').html(label);
				}

        return botao;
    }

    function ajustarPaginacao(options) {
        $.fn.plusGaleria.quantidadeDePaginas = Math.ceil((options.arrayImagens.length) / options.imagensPorPagina);

        if ($.fn.plusGaleria.quantidadeDePaginas < options.intervaloMaximoBotoes) {
            if ($.fn.plusGaleria.quantidadeDePaginas > (Math.ceil(options.intervaloMaximoBotoes / 2))) {
                if ($.fn.plusGaleria.quantidadeDePaginas % 2 == 0) {
                    options.intervaloMaximoBotoes = $.fn.plusGaleria.quantidadeDePaginas - 1;
                } else {
                    options.intervaloMaximoBotoes = $.fn.plusGaleria.quantidadeDePaginas;
                }
            } else {
                options.intervaloMaximoBotoes = $.fn.plusGaleria.quantidadeDePaginas;
            }
        }
    }
    //Fim
		
		function ajustarTamanhos(options) {
			if (options.alturaFixa) {
				if (!$.fn.plusGaleria.redimensionado) {
					//Redimensiona o pai
					$.fn.plusGaleria.alturaComponentePaiGaleria = $("#" + options.idComponentePaginacao).parent().height();
					$("#" + options.idComponentePaginacao).parent().height($.fn.plusGaleria.alturaComponentePaiGaleria);

					//Redimensiona a galeria
					//$.fn.plusGaleria.alturaComponenteGaleria = destino.height();
					//destino.height($.fn.plusGaleria.alturaComponenteGaleria);
					$.fn.plusGaleria.redimensionado = true;
				}
				/*else if ($("#" + $.fn.plusGaleria.options.componentePaginacao).parent().height() != $.fn.plusGaleria.alturaComponentePaiGaleria) {
					$("#" + $.fn.plusGaleria.options.componentePaginacao).parent().height($.fn.plusGaleria.alturaComponentePaiGaleria);
				}*/
			}
		}
   
    function cssPadrao() {
        var css = '<style type="text/css">';
				css += '</style>';
        return css;
    }
		
		function log(mensagem) {
			if ($.fn.plusGaleria.options.debug) {
				if (false) {
					alert(mensagem);
				} else {
					console.log(mensagem);
				}
			}
		}
})(jQuery);
