jQuery.fn.extend({


	ultraLightBox: function(o) {
	/*
	*  Funcao que abre conteudo em "LightBox"
	* 	
	*  ** FEATURES:
	*  *  - So mostra iframe quando acaba de carregar toda a pagina	
	*  **
	*  	
	*  ** PARAMETROS:
	*  *	src: um endereco fixo, por default vai buscar o valor do href	
	*  *  width: largura do conteudo
	*  *  height: altura do conteudo
	*  *  border: margem que aparece a volta do iframe
	*  *  borderColor : cor que se vai aplicar a border e ao fundo dos botoes	*  	*  	
	*  *  overlayOpacity : opacidade do layer sobre a pagina, de 0 a 1
	*  *  overlayColor : cor do overlay
	*  *  backgroundColor : cor de fundo da box
	*  **	
	* 
	*  ** TODO: 
	*  *  - Opcao para abrir conteudo sem ser em iframe
	*  *  - Terminar comentarios e limpar codigo
	*  **	
	*/	
		
		o = jQuery.extend({ // definicoes default
			width : 600, // largura do iframe
			height : 400, // altura do iframe
			border : 10, // border a volta do iframe
			borderColor : "#000",
			overlayOpacity : 0.70, // opacidade do layer sobre a pagina, de 0 a 1
			overlayColor : "#000", // cor do overlay
			backgroundColor : "#000" // cor de fundo da box
		}, jQuery.fn.ultraLightBox.defaults, o);

		jQuery(this).click(function () {
			oTemp = o;
			oTemp.linkClass = jQuery(this).attr("class");
			oTemp.url = o.src || jQuery(this).attr("href"); // abre na lightbox o caminho especificado na opcao src ou, se nao existir, o atributo href do link
			oTemp.state = true;
			openBox(oTemp);
			return false;
		})
		
		centerLayers = function(o){
				var de = document.documentElement;
				var windowWidth = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
				var windowHeight = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
				
				var xScroll = self.pageXOffset || (de&&de.scrollLeft)/*Explorer 6 Strict*/ || document.body.scrollLeft/*all other Explorers*/;
				var yScroll = self.pageYOffset || (de&&de.scrollTop) || document.body.scrollTop;
				/*var xScroll, yScroll;
				if (self.pageYOffset) {
					yScroll = self.pageYOffset;
					xScroll = self.pageXOffset;
				} else if (de&&de.scrollTop) {	 // Explorer 6 Strict
					yScroll = de.scrollTop;
					xScroll = de.scrollLeft;
				} else if (document.body) {// all other Explorers
					yScroll = document.body.scrollTop;
					xScroll = document.body.scrollLeft;	
				}*/
				
				var documentWidth, documentHeight;
				if (window.innerHeight && window.scrollMaxY) {	
					//documentWidth = window.innerWidth + window.scrollMaxX;
					documentHeight = window.innerHeight + window.scrollMaxY;
				} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
					//documentWidth = document.body.scrollWidth;
					documentHeight = document.body.scrollHeight;
				} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
					//documentWidth = document.body.offsetWidth;
					documentHeight = document.body.offsetHeight;
				}
				
				var top = (windowHeight > o.height ? (windowHeight/2-(o.height+o.border)/2)/*+15*/ : 0) + yScroll;
				var left = (windowWidth > o.width ? (windowWidth/2-(o.width+o.border)/2) : 0) + xScroll;
				// se a largura ou altura da janela do browser for inferior ao tamanho da box, nao centra mas mete alinhada ao canto, a 0 + as coordenadas do scroll
				
				jQuery("#ulbxOverlay").css({
					//"width" : documentWidth > windowWidth ? documentWidth+30 : windowWidth + 'px',
					"height" : documentHeight > windowHeight ? documentHeight+30 : windowHeight + 'px'// para conseguir ter a altura correcta da janela no FF
				})

				jQuery("#ulbxLayer").css({
					"top" : top + jQuery("#ulbxLayerClose").height() + "px",
					"left" : left + "px"
				})

				jQuery("#ulbxLayerClose").css({
					"top" : top + "px",
					"left" : left + "px"
					//"left" : (left + o.width + o.border*2) - jQuery("#ulbxLayerClose").width() + "px"
				})

		}
		
		
		function openBox(o){
			if(o.state == true) { // abre
				//horizontalCenter = (jQuery(window).width()/2)-((o.width+10)/2);
				//verticalCenter = ((jQuery(window).height()/2)-((o.height+10)/2));
				
				if (typeof(jQuery().reloadStop) == "function")  {jQuery().reloadStop();};				
				
				jQuery("#ulbxLayer").css({
					"position" : "absolute",
					"width" : o.width+"px",
					"height" : o.height+"px",
					"border" : o.border+"px solid "+o.borderColor,
					"background-color" : o.backgroundColor,
					"overflow" : "hidden",
					"z-index" : "20001"
				})
				
				jQuery("#ulbxLayerClose").css("width", (o.width + o.border*2) + "px"); // atribui a largura do layer ao div dos botoes

				centerLayers(o); // centra os layers e da as dimensoes correctas ao overlay
				
				jQuery(window).resize(function() {
					centerLayers(o); // centra os layers e da as dimensoes correctas ao overlay
				})

				jQuery("SELECT,OBJECT,EMBED,.iframePub").css("visibility","hidden"); // esconde todos os elementos que se sobrepoem ao layer
				jQuery("#ulbxOverlay").show().fadeTo("normal", o.overlayOpacity, function(){
					jQuery("#ulbxLayer").slideDown(500, function(){
						jQuery(this).addClass("loading");
						jQuery("#ulbxLayerClose").fadeTo(500, 1);
						jQuery(this).html(jQuery('<iframe src='+o.url+' id="boxIframe" scrolling="auto" frameborder="0" framespacing="0" width="'+o.width+'" height="'+o.height+'" border="0"/>')
							.fadeOut(1) // esconde o iframe
							.load(function () { // mostra o iframe depois de carregado o conteudo
								jQuery(this).fadeIn(500);
								jQuery("#ulbxLayer").removeClass("loading");
							})	
						)
					});
				});
				jQuery("#ulbxLayerClose .soltar").bind("click", function(){ // executa apenas no primeiro click
					if (typeof(jQuery().reloadStart) == "function") {jQuery().reloadStart();};
					eval('window.open("'+o.url+'","ulbx'+o.linkClass+'","height='+o.height+',width='+o.width+'")'); // abre a pagina numa nova janela e fecha o layer
				})

			} else { // fecha
												
				jQuery("#ulbxLayerClose").fadeTo(500, 0, function(){
					jQuery("#ulbxLayerClose .soltar").unbind("click");
					jQuery(this).css("top", "-100px"); // hack para o #ulbxLayerClose nao ficar sobre o conteudo da pagina
					jQuery("#boxIframe").fadeOut(500, function(){
						jQuery("#ulbxLayer").removeClass("loading").slideUp(500, function(){
							jQuery("#ulbxOverlay").fadeTo("normal", 0, function(){
								jQuery(this).hide(); // esconde o layer depois do fade, para nao se sobrepor ao conteudo
								jQuery("SELECT,OBJECT,EMBED,.iframePub").css("visibility","visible");
								jQuery("#ulbxLayer").empty();								
								if (typeof(jQuery().reloadStart) == "function") {jQuery().reloadStart();};
							});
						})
					})
				})
			}
		}
		
		document.onkeydown = function(e){ 
			if (e == null) { // ie
				var keycode = event.keyCode;
			} else { // mozilla
				var keycode = e.which;
			}
			if (keycode == 27) { // Esc
				openBox(0);
			}
		};
		
		
		jQuery("<div id='ulbxOverlay'></div>")
			.click(function(){openBox(0)})
			.appendTo("body").fadeTo("fast", 0)
			.hide();
		jQuery("<div id='ulbxLayer'></div>")
			.appendTo("body")
			.slideUp();
		jQuery("<div id='ulbxLayerClose'></div>")
			.append(jQuery("<div class='fechar' title='fechar'>fechar</div>"))
			.click(function(){openBox(0)})
			.appendTo("body")
			.fadeTo("fast", 0)
			.append(jQuery("<div class='soltar' title='soltar janela'>soltar janela</div>"));

		
		jQuery("body").css({
			"margin" : 0,
			"padding" : 0
		})

		jQuery("SELECT,OBJECT,EMBED,.iframePub").css("visibility","visible"); // para depois esconder elementos que por default ficam sobre o layer

 		jQuery("#ulbxOverlay").css({
			"width" : "100%",
			"height" : "100%",
			"left" : "0",
			"top" : "0",
			"background-color" : o.overlayColor,
			"z-index" : "20000",
			"position" : "absolute"
		})
		if(document.all){
			jQuery("#ulbxOverlay").css({
				"height" : document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'
			});
		}
		
		jQuery("#ulbxLayerClose").css({
			"position" : "absolute",
			"top" : "-100px", // hack para o layer nao ficar sobre o conteudo
			"left" : "0",
			"color" : "white",
			"z-index" : "20002"
		})
		
		jQuery("#ulbxLayerClose div").css({
			"float" : "right",
			"background-color" : o.borderColor,
			"margin-left" : "3px",
			"padding" : "2px 10px",
			"fontSize" : "75%",
			"fontWeight" : "bold",
			"cursor" : "pointer"
		})
		
		//callback.apply(jQuery(self));
	},
	
	
	
	
	
	swapImage: function(o) {
	/*
	*  Funcao que troca as imagens onMouseOver
	*  o nome dos ficheiros das imagens devem ser passados no atributo 'name' da imagem, separados por virgula, o primeiro e relativo a imagem mouseOut
	*  ex.: <img src="caminhoDaImagem/nomeDoFicheiroDaImagemOff" name="nomeDoFicheiroDaImagemOff,nomeDoFicheiroDaImagemOn" class="swapimage" />	
	*/	
		var links = jQuery(this);
		
		o = jQuery.extend({
			path: jQuery(links[0]).attr("src").substring(0, jQuery(links[0]).attr("src").lastIndexOf('id/')+3) // caminho das imagens
		}, jQuery.fn.swapImage.defaults, o);
		
		jQuery(links).each(function(i, item) {
			jQuery(item).hover(function () { // hover in
				jQuery(this).attr("src", o.path + jQuery(this).attr("name").split('-')[1]);
			}, function () { // hover out
				jQuery(this).attr("src", o.path + jQuery(this).attr("name").split('-')[0]);
			})
		})
	},
	
	swapImage2: function(o) {
	/*
	*  Funcao que troca as imagens onMouseOver
	*  o nome dos ficheiros das imagens devem ser passados no atributo 'name' da imagem, separados por virgula, o primeiro e relativo a imagem mouseOut
	*  ex.: <img src="caminhoDaImagem/nomeDoFicheiroDaImagemOff" name="nomeDoFicheiroDaImagemOff,nomeDoFicheiroDaImagemOn" class="swapimage" />	
	*/	
		var links = jQuery(this);
		
		o = jQuery.extend({
			path: jQuery(links[0]).attr("src").substring(0, jQuery(links[0]).attr("src").lastIndexOf('id/')+3) // caminho das imagens
		}, jQuery.fn.swapImage.defaults, o);
		
		jQuery(links).each(function(i, item) {
			jQuery(item).hover(function () { // hover in
				jQuery(this).attr("src", o.path + jQuery(this).attr("name").split('-')[2]);
			}, function () { // hover out
				jQuery(this).attr("src", o.path + jQuery(this).attr("name").split('-')[1]);
			})
		})
	}
	
})