(function($) {
	var layerDisplayed = false;
	var currentPos = true;
	$.fn.createLayer = function(options) {
		var opts = $.extend({}, $.fn.createLayer.defaults, options);
		$(this).click(function(e){ 
			e.preventDefault();
			currentPos = opts.center;
			if (!layerDisplayed) {
				$('body').append('<div id="layerOverlay"></div><div id="layerContainer"><div><img src="images/ajax-loader.gif" /></div></div>');
				overlayPos(1);
				layerDisplayed=true;
			}			
			if(opts.progress){
				$('#layerContainer').show();
				if (currentPos)
					reposition();
			}
				
			$.ajax({
				type: opts.method,
				data: opts.data,
				url: opts.addr,
				success: function(msg){
					$('#layerContainer').html(msg);
					if (currentPos)
						reposition();					
				}
			});
			//only IE6 needs this function
			if($.browser.msie && parseInt($.browser.version) < 7) {
				$(window).scroll(function(){
					if(layerDisplayed==1) {
						overlayPos();
						if (currentPos)
							reposition();
					}
				});
			}
			$(window).resize(function(){
				if (layerDisplayed==1) {
					overlayPos();
					if (currentPos)
						reposition();
				}
			});
			
			$(window).unload( function () {
				if (layerDisplayed==1)
					$.closeLayer();
			});
			
			$(window).keydown(function(event){									
				if (event.keyCode == 27) 
					$.closeLayer();
			});
		});
		
		//private function
		function overlayPos(init){
			var left = 0;
			var top = 0;
			var overlayWidth = $(window).width();
			var overlayHeight = $(document).height();
			var winHeight =  $(window).height();
		
			if ($.browser.msie && parseInt($.browser.version) < 7) { //if IE6
				$("#layerOverlay").css({
									  top: 0, 
									  left: 0, 
									  width: overlayWidth, 
									  height: overlayHeight, 
									  position: 'absolute',
									  display: 'block',
									  color: opts.bg,
									  zIndex: opts.index
								  });
			}
			else { //other browsers
				$('#layerOverlay').css({
									  top: 0, 
									  left: 0, 
									  width: overlayWidth, 
									  height: winHeight, 
									  position: 'fixed',
									  display: 'block',
									  background: opts.bg,
									  zIndex: opts.index
								  }).show();
			}
			
			if (init==1) {
				$('#layerOverlay').css('opacity', 0);
				$('#layerOverlay').fadeTo(200, opts.opacity);
			}
		}
		
		//private function
		function reposition(){ //calculate the position
			var left = 0;
			var top = 0;
			var winWidth = $(window).width();
			var winHeight =  $(window).height();
			var layerHeight = $('#layerContainer').children().height();
			var layerWidth = $('#layerContainer').children().width();
			
			if(layerHeight > 500){
				layerHeight = 500;
			}
			if ($.browser.msie) {
				left = document.body.scrollLeft || document.documentElement.scrollLeft;
				top = document.body.scrollTop || document.documentElement.scrollTop;
			}
			else {
				left = window.pageXOffset;
				top = window.pageYOffset;
			}
		
			
			var topOff = top + winHeight/2 - layerHeight/2; //offset for IE6
			var	leftOff = left + winWidth/2 - layerWidth/2; //offset for IE6
			var topFixed = topOff - top;
			var	leftFixed = leftOff - left;
			
			if(layerHeight == 500){
				$('#layerContainer').children().css({
														'height': layerHeight + 'px',
														'overflow': 'auto'
												  })
			}
			
			if ($.browser.msie && parseInt($.browser.version) < 7) { // IE6
				//IE 6 fix
				$('select').hide();
				//IE 6 fix
				$('#layerContainer select').show(); 
				//IE6 doesn't support fixed position
				$('#layerContainer').children().css({
														  top: topOff,
														  left: leftOff,
														  position: 'absolute',
														  zIndex: (opts.index+1)
													  }).show(); 
			}
			else{	// firefox and IE7
				$('#layerContainer').children().css({
														  top: topFixed, 
														  left: leftFixed, 
														  position: 'fixed', 
														  zIndex: (opts.index+1)
													  }).show();
			}
		}
	};
	
	$.fn.createLayer.defaults = {
		progress: true,
		center: true,
		method: 'GET',
		data: '',
		opacity: 0.85,
		bg: '#FFFFFF',
		index: 2000
	};
	
	$.closeLayer = function(){				
		layerDisplayed=false;
		if($.browser.msie && parseInt($.browser.version) < 7) //IE6 bug
			$('select').show();
		//fade out and remove DOM nodes
		$('#layerOverlay').fadeTo(200, 0, function(){
			$('#layerContainer, #layerOverlay').remove();
		});
		
	};

})(jQuery);

