/*
 * Facebox (for jQuery)
 * version: 1.2 (05/05/2008) 
 * Licensed under the MIT:
 *   http://www.opensource.org/licenses/mit-license.php 
 * Copyright 2007, 2008 Chris Wanstrath [ chris@ozmm.org ]
 */
(function($) {
	$.facebox = function(data, klass) {
		$.facebox.loading();

		if (data.ajax) {
			fillFaceboxFromAjax(data.ajax);
		} else if (data.image) {
			fillFaceboxFromImage(data.image);
		} else if (data.div) {
			fillFaceboxFromHref(data.div);
		} else if ($.isFunction(data)) {
			data.call($);
		} else {
			$.facebox.reveal(data, klass);
		}
	};

	/*
	* Public, $.facebox methods
	*/

	$.extend($.facebox, {
		settings: {
			opacity      : 0,
			overlay      : true,
			loadingImage : FULL_URL_BASE + '/themes/default/img/facebox/loading.gif',
			closeButton  : true,
			closeImage   : FULL_URL_BASE + '/themes/default/img/facebox/closelabel.gif',
			imageTypes   : [ 'png', 'jpg', 'jpeg', 'gif' ],
			faceboxHtml  : '\
			<div id="facebox" style="display:none;"> \
				<div class="popup"> \
					<table> \
						<tbody> \
							<tr> \
								<td class="tl"/><td class="t"/><td class="tr"/> \
							</tr> \
							<tr> \
								<td class="l"/> \
								<td class="body"> \
									<div class="content-wrapper"> \
										<div class="content"> \
										</div> \
										<div class="footer"> \
											<a href="#" class="close"> \
												<img src="' + FULL_URL_BASE + '/themes/default/img/facebox/closelabel.gif" title="Clique para fechar" /> \
											</a> \
										</div> \
									</div> \
								</td> \
								<td class="r"/> \
							</tr> \
							<tr> \
								<td class="bl"/><td class="b"/><td class="br"/> \
							</tr> \
						</tbody> \
					</table> \
				</div> \
			</div>'
		},

		loading: function() {
			init();
			if ($.facebox.$element.find('.loading').length == 1) {
				return true;
			}
			showOverlay();

			if ($.facebox.$element.is(':hidden')) {
				$.facebox.$element.css({
					top: $(window).height() / 2,
					left: $(window).width() / 2
				});
			}

			$.facebox.reveal('<div class="loading"><img src="' + $.facebox.settings.loadingImage + '"/></div>');

			$(document).bind('keydown.facebox', function(e) {
				if (e.keyCode == 27) {
					$.facebox.close();
				}
				return true;
			});
			$(document).trigger('loading.facebox');
		},

		reveal: function(data, klass, empty) {
			var empty = empty || true;
			var isHidden = $.facebox.$element.is(':hidden');

			var contentBeforeWidth  = $.facebox.$contentWrapper.outerWidth();
			var contentBeforeHeight = $.facebox.$contentWrapper.outerHeight();

			$(document).trigger('beforeReveal.facebox');

			if (klass) {
				$.facebox.$content.addClass(klass);
			}
			if (empty) {
				$.facebox.$content.empty();
			}

			$.facebox.$element.show();
			$.facebox.$content.append(data);
			
			/*
			if($.browser.msie) {
				if(data.is(':hidden')&& !data.is('form')) {
					data.fadeIn('fast');
				}
			}
			*/

			var width  = $.facebox.$element.outerWidth();
			var height = $.facebox.$element.outerHeight();

			var contentWidth  = $.facebox.$contentWrapper.outerWidth();
			var contentHeight = $.facebox.$contentWrapper.outerHeight();

			$.facebox.$content.hide();

			var pageScroll = getPageScroll()[1];
			var top  = Math.min(150, Math.max(0, ($(window).height() - height) / 3));
			var left = ($(window).width() - width) / 2;

			if (isHidden) {
				$.facebox
					.$element
						.css({
							'top': pageScroll + top,
							'left': left
						});
			}

			$.facebox.$contentWrapper.css({
				'width': contentBeforeWidth,
				'height': contentBeforeHeight
			});

			$.facebox
				.$contentWrapper
					.animate({
						'width': contentWidth,
						'height': contentHeight
					}, 'fast', function() {
						$.facebox.$contentWrapper.css({
							'width': 'auto',
							'height': 'auto'
						});
						$.facebox.$content.fadeIn('fast');
					});
					
					
			$.facebox
				.$element
					.animate({
						'top'  : pageScroll + top,						
						'left' : left
						}, 'fast');


			$(document).trigger('reveal.facebox').trigger('afterReveal.facebox');

			/*
			var empty = empty || true;

			var contentBeforeWidth  = $.facebox.$contentWrapper.outerWidth();
			var contentBeforeHeight = $.facebox.$contentWrapper.outerHeight();

			$(document).trigger('beforeReveal.facebox');
			if (klass) {
				$.facebox.$content.addClass(klass);
			}
			if (empty) {
				$.facebox.$content.empty();
			}
			$.facebox.$content.css('visibility', 'hidden').append(data);
			$.facebox.$element.show();

			var contentWidth  = $.facebox.$contentWrapper.outerWidth();
			var contentHeight = $.facebox.$contentWrapper.outerHeight();
			
			var pageScroll = getPageScroll()[1];
			var top  = Math.max(0, ($(window).height() - (contentHeight + $.facebox.heightExtra)) / 3);
			var left = ($(window).width() - (contentWidth + $.facebox.widthExtra)) / 2;

			$.facebox.$content.css({
				width: contentWidth,
				visibility: 'visible'
			}).hide().fadeIn('slow');

			$.facebox.$contentWrapper
				.css({
					width:  contentBeforeWidth || 0,
					height: contentBeforeHeight || 0
				})
				.animate({
					width:  contentWidth,
					height: contentHeight
				}, 'normal', function() {
					$.facebox.$content.fadeIn('normal');
					$(this).css({
						width:  'auto',
						height: 'auto'
					});
					$.facebox.$content.css('width', 'auto');
				});

			$.facebox.$element.animate({
				'top': pageScroll + top,
				'left': left
			}, 'normal');

			$(document).trigger('reveal.facebox').trigger('afterReveal.facebox');
			*/
		},

		close: function() {
			$(document).trigger('close.facebox');
			return false;
		}
	});

	/*
	* Public, $.fn methods
	*/

	$.fn.facebox = function(settings) {
		init(settings);

		function clickHandler(e) {
			// support for rel="facebox.inline_popup" syntax, to add a class
			// also supports deprecated "facebox[.inline_popup]" syntax
			var klass = $(this).attr('rel').match(/facebox\[?\.(\w+)\]?/);
			if (klass) {
				klass = klass[1];
			}

			var timerLoading = null;			
			if ($('#facebox').is(':hidden') && $(this).is('form')) {
				$.facebox.loading(true);
			} else {
				showOverlay();
				timerLoading = setTimeout(function() {
					$.facebox.loading(true);
				}, 1000);
			}

			if ($(this).is('form')) {
				fillFaceboxFromForm(this, klass, e, timerLoading);
			} else {
				$.facebox.$element.find(':input').attr('disabled', true);
				fillFaceboxFromHref(this.href, klass, timerLoading);
			}
			return false;
		}

		if ($(this).is('form')) {
			return this.unbind('submit.facebox').bind('submit.facebox', clickHandler);
		}

		return this.bind('click.facebox', clickHandler);
	};

	/*
	* Private methods
	*/

	// called one time to setup facebox on this page
	function init(settings) {
		if ($.facebox.settings.inited) {
			return true;
		} else {
			$.facebox.settings.inited = true;
		}

		$(document).trigger('init.facebox');
		makeCompatible();

		var imageTypes = $.facebox.settings.imageTypes.join('|');
		$.facebox.settings.imageTypesRegexp = new RegExp('\.' + imageTypes + '$', 'i');

		if (settings) {
			$.extend($.facebox.settings, settings);
		}
		$('body').append($.facebox.settings.faceboxHtml);

		$.facebox.$element = $('#facebox');
		$.facebox.$body = $.facebox.$element.find('.body:eq(0)');
		$.facebox.$contentWrapper = $.facebox.$body.find('.content-wrapper:eq(0)');
		$.facebox.$content = $.facebox.$body.find('.content:eq(0)');
		$.facebox.$footer = $.facebox.$body.find('.footer:eq(0)');

		var preload = [ new Image(), new Image() ];
		preload[0].src = $.facebox.settings.closeImage;
		preload[1].src = $.facebox.settings.loadingImage;

		$.facebox.$element.find(',t, .l, .r, .b, .bl, .br, .tl, .tr').each(function() {
			preload.push(new Image());
			preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1');
		});

		$.facebox.$element.find('.close').click($.facebox.close);
		$.facebox.$element.find('.close img').attr('src', $.facebox.settings.closeImage);

		$.facebox.$element.show();
		$.facebox.heightExtra = $.facebox.$element.outerHeight() - $.facebox.$contentWrapper.outerHeight();
		$.facebox.widthExtra = $.facebox.$element.outerWidth() - $.facebox.$contentWrapper.outerWidth();
		$.facebox.$element.hide();
	};

	// getPageScroll() by quirksmode.com
	function getPageScroll() {
		var xScroll, yScroll;
		if (self.pageYOffset) {
			yScroll = self.pageYOffset;
			xScroll = self.pageXOffset;
		} else if (document.documentElement && document.documentElement.scrollTop) {	 // Explorer 6 Strict
			yScroll = document.documentElement.scrollTop;
			xScroll = document.documentElement.scrollLeft;
		} else if (document.body) {// all other Explorers
			yScroll = document.body.scrollTop;
			xScroll = document.body.scrollLeft;	
		}
		return new Array(xScroll,yScroll);
	}

	// Adapted from getPageSize() by quirksmode.com
	function getPageHeight() {
		var windowHeight;
		if (self.innerHeight) {	// all except Explorer
			windowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) { // other Explorers
			windowHeight = document.body.clientHeight;
		}	
		return windowHeight;
	}

	// Backwards compatibility
	function makeCompatible() {
		var $s = $.facebox.settings;

		$s.loadingImage = $s.loading_image || $s.loadingImage;
		$s.closeImage   = $s.close_image || $s.closeImage;
		$s.imageTypes   = $s.image_types || $s.imageTypes;
		$s.faceboxHtml  = $s.facebox_html || $s.faceboxHtml;
	}

	// Figures out what you want to display and displays it
	// formats are:
	//     div: #id
	//   image: blah.extension
	//    ajax: anything else
	function fillFaceboxFromHref(href, klass, timer) {
		// div
		if (href.match(/#/)) {
			clearTimeout(timer);
			var url    = window.location.href.split('#')[0];
			var target = href.replace(url,'');
			$.facebox.reveal($(target).clone().show(), klass);

			// image
		} else if (href.match($.facebox.settings.imageTypesRegexp)) {
			fillFaceboxFromImage(href, klass, timer);
			// ajax
		} else {
			fillFaceboxFromAjax(href, klass, timer);
		}
	}

	function fillFaceboxFromForm (form, klass, e, timer) {
		var $submit = $(e.originalEvent.explicitOriginalTarget);
		var $form = $(form);
		
		var data = $form.serializeArray();
		var submitName = $submit.attr('name');

		if ($form.parents('#facebox').size() > 0) {
			$form.find(':input').attr('disabled', true);
		}

		if (submitName) {
			data.push({
				name: submitName,
				value: $submit.val()
			});
		}

		var href = $form.attr('action');

		$.facebox.currentUrl = href;
		$.post(href, data, function(data) { 
			clearTimeout(timer);
			$.facebox.reveal(data, klass);
		});
	}

	function fillFaceboxFromImage(href, klass, timer) {
		var image = new Image();
		image.onload = function() {
			clearTimeout(timer);
			$.facebox.reveal('<div class="image"><img src="' + image.src + '" /></div>', klass);
		};
		image.src = href;
	}

	function fillFaceboxFromAjax(href, klass, timer) {
		$.facebox.currentUrl = href;
		$.get(href, function(data) {
			clearTimeout(timer);
			$.facebox.reveal(data, klass);
		});
	}

	function skipOverlay() {
		return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null;
	}

	function showOverlay() {
		if (skipOverlay()) {
			return;
		}
		var $overlay = $('#facebox_overlay');

		if ($overlay.size() == 0)  {
			$("body").append('<div id="facebox_overlay" class="facebox_hide"></div>');
			$overlay = $('#facebox_overlay').hide();
		}
		
		if (!$overlay.is(':visible')) {
			$overlay
				.addClass("facebox_overlayBG")
				.css({
					height: $(document).height(),
					width: $(document).width(),
					opacity: $.facebox.settings.opacity
				})
				.click(function() { $(document).trigger('close.facebox'); })

				$overlay
					.fadeIn(200);
		} else {
			$overlay
				.stop()
				.css('opacity', $.facebox.settings.opacity);
		}

		return false;
	}

	function hideOverlay() {
		if (skipOverlay()) {
			return;
		}

		$('#facebox_overlay').fadeOut(200, function(){
			$("#facebox_overlay").removeClass("facebox_overlayBG").addClass("facebox_hide").remove();
			// $("select, embed, object").css('visibility', 'visible');
		});

		return false;
	}

	/*
	* Bindings
	*/

	$(document).bind('close.facebox', function() {
		var close = true;
		var val = true;
		//var val = jQuery.event.trigger( 'before_close.facebox', null, this, true);
		close = close && (val == true || val == undefined);
		
		if (!close) {
			return false;
		}

		$(document).unbind('keydown.facebox');
		$('#facebox').fadeOut(function() {
			$.facebox.$content.removeClass().addClass('content');
			hideOverlay();
			$.facebox.$element.find('.loading').remove();
		});
	});

})(jQuery);
