$.fn.saszoomer = function(settings)
{
	sasZoomer  = 
	{
		init: function(elem,settings)
		{
			var params = new Array();
			params.elem = elem;

			params.speed = 200;
			params.width = 800;
			params.height = null;
			params.bDoneAnimation = true;
			params.bZoomed = false;
			params.bLargeLoaded = false;
			params.cssPresentation = "bubbleBoxNice";
			params.cssAnimation = "bubbleBoxSimple";
			
			if (typeof(settings) != 'undefined')
			{
				try {
					for (s in settings) {
						params[s] = settings[s];
					}
				} catch(e) {}
			}

			if ($.browser.mozilla)
				$(elem).css({'cursor': '-moz-zoom-in'});
			else
				$(elem).css({'cursor': 'pointer'});

			params.imgTag = $(elem).find("img").get(0);
			params.smallSrc = $(params.imgTag).attr('src');
			params.largeSrc = $(params.imgTag).attr('rel');
			params.orgWidth = $(elem).width();
			params.orgHeight = $(elem).height();
			params.orgTop = $(elem).offset().top;
			params.orgLeft = $(elem).offset().left;
			params.orgImgWidth = $(params.imgTag).outerWidth();
			params.orgImgHeight = $(params.imgTag).outerHeight();

			$(elem).data("prop", params);
			$(params.imgTag).data("prop", params);

			$(elem).click(function(event){
				sasZoomer.zoom(event, $(this));
			});

			$(elem).bind("documentzoom",function(event,data){
				sasZoomer.hide(event, $(this));
			});

		},

		zoom: function(event, ob)
		{
			var params = $(ob).data("prop");
			if (!params.bDoneAnimation || params.bZoomed) { return; }
			if (event.target.nodeName == "A") { return; }

			$(params.elem).css({'cursor': 'wait'});

			$(params.imgTag).load(function(event2)
			{
				var params = $(ob).data("prop");
				if (!params.bLargeLoaded)
				{
					params.bLargeLoaded = true;
					$(params.elem).data("prop", params);
					$(params.imgTag).data("prop", params);
					$(params.imgTag).css({'height': 'auto'});
					sasZoomer.show(event2, ob);
				}
			});
			$(params.imgTag).attr('src', params.largeSrc);
		},

		show: function(event, ob)
		{
			var params = $(ob).data("prop");
			if (!params.bDoneAnimation || params.bZoomed) { return; }
			if (event.target.nodeName == "A") { return; }

			params.bDoneAnimation = false;
			$(params.elem).data("prop", params);
			$(params.imgTag).data("prop", params);

			if ($.browser.mozilla)
				$(params.elem).css({'cursor': '-moz-zoom-out'});
			else
				$(params.elem).css({'cursor': 'pointer'});

			$(params.elem).removeClass(params.cssPresentation).addClass(params.cssAnimation);
			$(params.imgTag).load(function(){return false;});

			var newHeight = params.height + ($(params.elem).height() - params.orgImgHeight);
			$(params.elem).stop(true,true).animate({
												'width': params.width,
												'height': newHeight,
												'left': ($(window).width() - params.width) / 2 + $(window).scrollLeft(),
												'top': ($(window).height() - (params.height + ($(params.elem).innerHeight() - params.orgImgHeight))/*newHeight*/) / 2 + $(window).scrollTop()
												},
												params.speed, 'easeOutCubic',
												function()
												{
													var params = $(this).data("prop");
													params.bDoneAnimation = true; 
													params.bZoomed = true;
													$(params.elem).data("prop", params);
													$(params.imgTag).data("prop", params);
													$(params.elem).removeClass(params.cssAnimation).addClass(params.cssPresentation);
													$(this).click(function(){sasZoomer.hide($(params.elem));});
												});
		},

		hide: function(ob)
		{
			var params = $(ob).data("prop");
			if (!params.bDoneAnimation || !params.bZoomed) { return; }
			params.bDoneAnimation = false;
			$(params.elem).data("prop", params);
			$(params.imgTag).data("prop", params);

			if ($.browser.mozilla)
				$(params.elem).css({'cursor': '-moz-zoom-in'});
			else
				$(params.elem).css({'cursor': 'pointer'});
			$(params.elem).removeClass(params.cssPresentation).addClass(params.cssAnimation);

			$(params.elem).stop(true,true).animate({
												'left': params.orgLeft,
												'top': params.orgTop,
												'width': params.orgWidth,
												'height': params.orgHeight
												},
												params.speed, 'easeOutBack',
												function()
												{
													var params = $(this).data("prop");
													$(params.imgTag).attr('src', params.smallSrc);
													params.bDoneAnimation = true; 
													params.bZoomed = false;
													$(params.elem).data("prop", params);
													$(params.imgTag).data("prop", params);
													$(params.elem).removeClass(params.cssAnimation).addClass(params.cssPresentation);
													$(this).click(function(event){sasZoomer.show(event, $(params.elem));});
												});
		}
	}
	
	sasZoomer.init($(this),settings);
}
