/*

	Use examples:
	
	METHOD #1
	
	This method iterates over all of the given anchor tags and associates the particular link with the overlay given in the href attribute.
	
	<script src="js/jquery-l5-overlay.js" type="text/javascript"></script>
	<script type="text/javascript">
		$(function(){
			$('.overlay-trigger').overlay(); // Initialize overlays and establish links/triggers to open them
			$('#my-overlay').overlay('close'); // Programmatically close overlay
		});
	</script>

	<a class="overlay-trigger" href="#my-overlay">Open inline overlay</a>
	<a class="overlay-trigger" href="overlay.html">Open AJAX overlay</a>
	
	METHOD #2
	
	<script src="js/jquery-l5-overlay.js" type="text/javascript"></script>
	<script type="text/javascript">
		$(function(){
			$("#my-overlay").overlay("init");
		});
	</script>
	<a href="#my-overlay" onclick="$('#my-overlay').overlay('open'); return false;">Open overlay</a>

	FOR METHOD #1 OR #2, HERE IS THE MARKUP FOR THE OVERLAY
	
  <div id="my-overlay" class="overlay" style="display: none;">
		<h1>Test</h1>
		<p>Lorem ipsum dolor</p>
	</div> <!-- /.overlay -->
	
*/

(function ($) {
					 
	// Set debug to true for console debuging
	var debug = false;
	
	/*
		Utility functions
	*/
	
	$.fn.isVisible = function() {
		return $(this).css("display") == "block";
	};
	$.fn.exists = function() {
		return $(this).length > 0;
	};
	$.log = function(message) {
		if (debug) {
			if(window.console) {
				 console.log(message);
			}
			else {
				 // alert(message);
			};
		};
	};
	
	/*
		Private functions
	*/
	
	function createOverlay(eTrigger) {
		$.log("Overlay: createOverlay");
		var el;
		var href = $(eTrigger).attr("href");
		$.log("Overlay: href = " + href);
		if (href.charAt(0) == '#')
			// Make an on-page element an overlay
			el = $(href);
		else {
			// Use a remote page for the overlay
			$.ajax({
				url: href,
				async: false,
				success: function(html){
					el = $("body").append(html).children(".overlay:last");
				}
			});
		}

		if (el) {
			var outerWrap = initOverlay(el);
			$(eTrigger).click(function() {
				$.log("Overlay: Click");
				openOverlay(outerWrap);
				/*
				e.dropShadow({opacity: .25});
				*/
				return false;
			});
		} else {
			$.log("Overlay: Invalid Reference");
		}
	};
	function initOverlay(e) {
		$.log("Overlay: initOverlay");
		var outerWrap = e.closest(".outer-wrap");
		if (outerWrap.exists()) {
			$.log("Overlay: " + e.attr("id") + " already initialized");
		} else {
			outerWrap = e.wrap("<div class='outer-wrap' style='position: absolute; top: 0; left: 0; width: 100%; z-index: 100; display: none;'></div>").parent();
			var innerWrap = e.wrap("<div class='inner-wrap'></div>").parent();
			var eClose = $("<a class='btn-close' href='#'><span>Close</span></a>").click(function() {
				$.log("Overlay: Close");
				closeOverlay(outerWrap);
				return false;
			});
			e.prepend(eClose);
			e.css("display", "block");
		};
		return outerWrap;
	};
	function openOverlay(e) {
		$.log("Overlay: openOverlay");
		
		if (! e.hasClass(".outer-wrap")) {
			e =  e.closest(".outer-wrap");
		};
		
		if (! e) {
			$.log("Overlay: Invalid element");
		} else {
			if (! $(e).isVisible()) {
				$.log("Overlay: Show");
				showBackground();
				$('html,body').animate({scrollTop: '0px'}, "normal", "easeOutQuart", function() {
					if (typeof document.body.style.maxHeight == "undefined") {
						// IE6, older browsers
						// Hide selects because of ie6 select z-index problem
						$("#page select").css("visibility", "hidden");
					};
					if(!$.browser.msie) {
						$(e).css("opacity", "0");
						$(e).css("display", "block");
						$(e).animate({opacity: '1'}, "normal", "easeOutQuad");
					} else {
						$(e).show();
					}
				});
			};
		};

		return e;
	};
	function closeOverlay(e) {
		$.log("Overlay: closeOverlay");

		if (! e.hasClass(".outer-wrap")) {
			e =  e.closest(".outer-wrap");
		};

		if (! e) {
			$.log("Overlay: Invalid element");
		} else {
			if ($(e).isVisible()) {
				$.log("Overlay: Hide");
				
				// # of overlays displayed
				var overlayCount = $('.outer-wrap:visible').length;
				
				if(!$.browser.msie) {
					$(e).animate({opacity: '0'}, "normal", "easeOutQuart", function() { $(e).css("display", "none"); });
				} else {
					$(e).hide();
				}
				
				hideBackground(overlayCount);
				
				if (typeof document.body.style.maxHeight == "undefined") {
					// IE6, older browsers
					$("#page select").css("visibility", "visible");
				};
			};
		};

		return e;
	};
	function toggleOverlay() {
		$.log("Overlay: Enter toggleOverlay");
		if ($(this).isVisible()) {
			closeOverlay(this);
		} else {
			openOverlay(this);
		};
		return this;
	};
	function showBackground() {
		var e = $('#overlay-background');
		
		if (!e.exists()) {
			$.log("Overlay: Create background element");
			e = $("<div id='overlay-background' style='display: none;'></div>");
			$(document.body).append(e);
		};
		
		if (! e.isVisible()) {
			$.log("Overlay: Show background");
			var h =  $(document.body).height();
			e.height(h);
			e.show();
		};
	};
	function hideBackground(overlayCount) {
		var e = $('#overlay-background');
		if (e.isVisible()) {
			if (overlayCount == 1) {
				$.log("Overlay: Hide background");
				e.hide();
			};
		};
	};
	function toggleBackground(e) {
		if (e.isVisible()) {
			hideBackground(e);
		} else {
			showBackground(e);
		};
	};

	/***
		Public constructor
	*/
	
	$.fn.overlay = function(settings) {
		$.log("Overlay: Constructor");
		
		switch(settings) {
			case "init":
				initOverlay(this);
				break;
			case "open":
				openOverlay(this);				
				break;
			case "close":
				closeOverlay(this);
				break;
			default:
				
				// Iterate over the array of links and create overlays 
				// based on their href value (ie href="#my-overlay")
				$(this).each(function() {
					createOverlay(this);
				});
					
				// If the overlay is given as a URL parameter, then open it
				// For example:  someurl.com/index.html#my-overlay
				var urlRef = self.document.location.hash;
				if (urlRef) {
					$.log("Overlay: Anchor Reference " + urlRef);
					var el = $(urlRef);
					if (el.exists()) {
						openOverlay(el);
					};
				};
				
		}
		
		return this;
	};
}) (jQuery);

