(function($) {

	var lib = window.lib = {
		layer : {
			initManager : function() {
				$(window).unbind("resize.layerManager").bind("resize.layerManager", function() {
					$(".lib__keepcentered").each(function(){ lib.layer.center( "#" + $(this).attr("id") ); });
					$(".lib__shouldbecentered").each(function() {
						$(this).addClass("lib__keepcentered").removeClass("lib__shouldbecentered");
						lib.layer.center( "#" + $(this).attr("id") );
					});
				}).unbind("scroll.layerManager").bind("scroll.layerManager", function() {
					$(".lib__keepcentered").each(function(){ lib.layer.center( "#" + $(this).attr("id") ); });
				});
			},
			create : function(selector, settings) {
				var settings = $.extend({
					closeSelector : "#_none",
					url : null,
					defaultContent : "",
					xPos : null,
					yPos : null,
					keepCentered : false,
					callback : null,
					method : "get",
					data : null,
					transition : false
				}, settings);

				lib.layer.add( selector, settings );
				if( settings.url != null)
				{
					if (settings.method == "get")
					{
					   	$.get(settings.url, settings.data, function(data){
					   		settings.defaultContent = data;
					   		lib.layer.add(selector, settings);
					   		if (settings.callback != null) {
					   			settings.callback();
					   		}
					   	});
					}
					else
					{
					   	$.post(settings.url, settings.data, function(data){
					   		settings.defaultContent = data;
					   		lib.layer.add(selector, settings);
					   		if (settings.callback != null) {
					   			settings.callback();
					   		}
					   	});
					}
				}
				else
				{
					if( settings.callback != null )
					{ settings.callback(); }
				}
			},
			add : function(selector, settings) {
				lib.layer.remove(selector);
				var layerTransitionHTML = ( settings.transition ) ? ( 'class="lib__transition" style="opacity: 0; filter: alpha(opacity=0)"' ) : "";
				var addHTML = '<div id="' + selector.split("#")[1] + '" ' + layerTransitionHTML +'></div>';
				$("body").append(addHTML);

				if( settings.xPos != null && settings.yPos != null )
				{
					$(selector).css("left", settings.xPos+"px").css("top", settings.yPos+"px");
					$(selector).append(settings.defaultContent);
				}
				else
				{
					if( settings.keepCentered )
					{ $(selector).addClass("lib__keepcentered"); }
					lib.layer.center(selector);
					$(selector).append(settings.defaultContent);
					lib.layer.center(selector);
				}

				/* Transition in the Layer, if applicable */
				if( settings.transition )
				{ $(selector).fadeTo(250, 1); }
				/* --------------------- */

				lib.layer.closeButton(settings.closeSelector, selector);
			},
			remove : function(selector) {
				$(selector).remove();
			},
			closeButton : function( selector, layerSelector ) {
				$(layerSelector + " " + selector).unbind("click.lib.layer.close").bind("click.lib.layer.close", function(evt) { evt.preventDefault(); lib.layer.remove(layerSelector); });
			},
			center : function(selector) {
				var wPosition = lib.screen.position();
				var wSize = lib.screen.size();

				/* Get Left Offset */
				var left = 0;
				left = (( wSize[0] - $(selector).width() ) / 2);
				left = ( left < 0 ) ? 20 : left;
				left += wPosition[0];
				/* ---------------- */

				/* Get Top Offset */
				var top = 0;
				top = (( wSize[1] - $(selector).height() ) / 2);
				top = ( top < 0 ) ? 20 : top;
				top += wPosition[1];
				/* ----------------- */

				/* if layer Can't be centered on Screen */
				if( ( $(selector).width() > wSize[0] ) || ( $(selector).height() > wSize[1] ) )
				{
					/* Should this layer stay centered? */
					if( $(selector).hasClass("lib__keepcentered") )
					{ $(selector).removeClass("lib__keepcentered").addClass("lib__shouldbecentered"); }
				}
				/* ---------------------------------- */

				$(selector).css("top",top+"px").css("left", left+"px");
				//lib.layer.ie6Fix(selector,"u");
			}			
		},
		screen : {
			position : function() {
				if( typeof( window.pageYOffset ) == 'number' ) {
					//Netscape compliant
					return [ window.pageXOffset, window.pageYOffset ];
				} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
				    //DOM compliant
				    return [ document.body.scrollLeft, document.body.scrollTop ];
				} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
				    //IE6 standards compliant mode
				    return [ document.documentElement.scrollLeft, document.documentElement.scrollTop ];
				} else {
					return [ 0, 0 ];
				}
			},
			size : function() {
				var myWidth = 0, myHeight = 0;
				if( typeof( window.innerWidth ) == 'number' ) {
				//Non-IE
				    myWidth = window.innerWidth;
				    myHeight = window.innerHeight;
				} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
				    //IE 6+ in 'standards compliant mode'
				    myWidth = document.documentElement.clientWidth;
				    myHeight = document.documentElement.clientHeight;
				} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
					//IE 4 compatible
					myWidth = document.body.clientWidth;
					myHeight = document.body.clientHeight;
				}

				return [myWidth, myHeight];
			}
		}	
	  };


	$(function() {
		/* Layer Manager */
		lib.layer.initManager();
	});

})($);
