function ZoneFx() {
}

ZoneFx.options = {
	viewZoneCrossFade: {speed: 750, loaderWidth: 32, loaderHeight: 32, onWaitBox: null}
};

ZoneFx.showWaitBox = function(props) {
	var waitBox=$("#WaitBox");
	if(waitBox.size()==0)
	{
		var opt=props ? props : ZoneFx.options.viewZoneCrossFade;
		var imgBox=$("#ImageBox");
		imgBox.append('<div id="WaitBox" style="position:absolute; left:'+((imgBox.width()-opt.loaderWidth)/2)
				+'px; top:'+((imgBox.height()-opt.loaderHeight)/2)
				+'px; width:'+opt.loaderWidth
				+'px; height:'+opt.loaderHeight+'px;">'
				+'<img src="'+contextRelative("images/ajax-loader.gif")+'" border="0" style="width:'
				+opt.loaderWidth+'px;height:'+opt.loaderHeight+'px;"></div>');
		waitBox=$("#WaitBox");
		return true;
	}
	
	return false;
}

ZoneFx.hideWaitBox = function(props) {
	$("#WaitBox").remove();
}

/**





 */
ZoneFx.viewZoneCrossFade = function(zoneHolder, html, props, callback) {
	var opt=jQuery.extend(this.options.viewZoneCrossFade, props);
	


	if(currentZoom!=1) {
		minimize();
		initializeImagePos();
	}
	
	var fxHelper=new FxHelper(zoneHolder);
	fxHelper.prepareContent(html);
	
	var anchorOld=fxHelper.oldContent.is("a") ? fxHelper.oldContent : $("a", fxHelper.oldContent);
	var anchorNew=fxHelper.newContent.is("a") ? fxHelper.newContent : $("a", fxHelper.newContent);
	anchorNew.css({opacity: 0});
	

	if(ZoneFx.showWaitBox(opt)) {
		if(opt.onWaitBox) opt.onWaitBox(true);
	}
	
	var imgOld=$("img", fxHelper.oldContent);
	var imgNew=$("img", fxHelper.newContent);
	imgNew.one("load", function() {
		if (isCentered()) {
			var imageBoxWidth = $('#ImageBox').width();
			setImagePosX(((imageBoxWidth-imgNew.width())/2)+imagePosLeft);
		}
		else {
			setImagePosX(imagePosLeft+imageBorder);
		}
		setImagePosY(imagePosTop+imageBorder);
		initializeImagePos();






		if(imgOld.width()!=imgNew.width() || imgOld.height()!=imgNew.height()) {
			anchorOld.animate({opacity: 0}, opt.speed);
		}
		
		anchorNew.animate({opacity: 1}, opt.speed, function() {
			ZoneFx.hideWaitBox();
			if(opt.onWaitBox) opt.onWaitBox(false);
			




			fxHelper.finished();
			



			if($.browser.msie) anchorNew.each(function() {
				this.style.removeAttribute("opacity");
				this.style.removeAttribute("filter");
				this.style.removeAttribute("zoom");
			});
			
			setNewImageLoaded();






			var lightbox=$(".lightbox");
			if(lightbox.length>0) lightbox.lightbox({displayTitle: false,
				fileLoadingImage: contextRelative(jQuery.fn.lightbox.defaults.fileLoadingImage),
				fileBottomNavCloseImage: contextRelative('scripts/base/jquery-lightbox/images/close.gif'),
				onStart: lightboxStarting});


			if(callback) callback(fxHelper.zoneHolder);
		});
	});
}

/**





 */
ZoneFx.roomZoneCrossFade = function(zoneHolder, html, props, callback) {
	var opt=jQuery.extend({speed: 750}, props);
	
	var fxHelper=new FxHelper(zoneHolder);
	fxHelper.prepareContent(html);

	fxHelper.newContent.css({opacity: 0});
	fxHelper.newContent.animate({opacity: 1}, opt.speed);
	
	fxHelper.oldContent.animate({opacity: 0}, opt.speed, function() {
		fxHelper.finished(callback);
	});
}

/**





 */
ZoneFx.productListCrossFade = function(zoneHolder, html, props, callback) {
	var opt=jQuery.extend({speed: 750, orientation: "vertical"}, props);
	
	var fxHelper=new FxHelper(zoneHolder);
	fxHelper.prepareContent(html);
	




	fxHelper.saveAttr(fxHelper.newContent, "style");
	if(opt.orientation=="vertical") fxHelper.alignProductListBottomContent(true, false);
	
	fxHelper.saveAttr($('#ProductList'), "style");
	$('#ProductList').css("overflow", "hidden");
	



	if (opt.orientation=="vertical" && $.browser.msie && $.browser.version.substr(0,1)==7) {
		fxHelper.oldContent.css({width: $('#ProductList').width()+"px"});
	}
	
	fxHelper.newContent.css({opacity: 0});
	fxHelper.newContent.animate({opacity: 1}, opt.speed);
	

	$('#ProductList').scrollTop(0).scrollLeft(0);
	
	fxHelper.oldContent.animate({opacity: 0}, opt.speed, function() {
		fxHelper.finished(callback);
	});
}

/**







 */
ZoneFx.productListSlide = function(zoneHolder, html, props, callback) {
	var opt=jQuery.extend({speed: 750, slideToLeft: false}, props);
	
	var fxHelper=new FxHelper(zoneHolder);
	fxHelper.prepareContent(html, opt.slideToLeft);
	




	fxHelper.saveAttr(fxHelper.newContent, "style");
	fxHelper.alignProductListBottomContent(true, true);
	
	fxHelper.saveAttr($('#ProductList'), "style");
	$('#ProductList').css("overflow", "hidden");
	
	var listWidth=$('#ProductList').width()+"px";
	


	fxHelper.bottomContent.css({width: listWidth});
	
	var scrollto=listWidth;
	if(opt.slideToLeft) {
		scrollto="0px";
		$('#ProductList').scrollLeft($('#ProductList').width());
	}
	
	$('#ProductList').animate({scrollLeft: scrollto, scrollTop: "0px"}, opt.speed, function() {
		fxHelper.finished(callback);
	});
}

/**







 */
ZoneFx.scrollableCrossFade = function(zoneHolder, html, props, callback) {
	var opt=jQuery.extend({speed: 750}, props);
	
	var fxHelper=new FxHelper(zoneHolder);
	fxHelper.prepareContent(html);
	





	var first=fxHelper.newContent.first();
	fxHelper.saveAttr(fxHelper.newContent, "style");
	

	



	var props={};
	if ($.browser.msie && $.browser.version.substr(0,1)<8) {
		if(opt.orientation=="vertical") {
			var pos=(-$(zoneHolder).height()-zoneHolder.offsetTop)+"px";
			first.css({position: "relative", marginTop: pos});
		} else {
			var pos=(-$(zoneHolder).width()-zoneHolder.offsetLeft)+"px";
			first.css({position: "relative", marginLeft: pos});
		}
	}
	else {
		if(opt.orientation=="vertical") {
			var pos=(-zoneHolder.offsetTop)+"px";
			first.css({position: "absolute", top: pos});
		} else {
			var pos=(-zoneHolder.offsetLeft)+"px";
			first.css({position: "absolute", left: pos});
		}
	}
	
	fxHelper.newContent.css({opacity: 0});
	first.animate({opacity: 1}, opt.speed);
	

	fxHelper.oldContent.animate({opacity: 0}, opt.speed, function() {



		if(allAnimationsFinished(fxHelper.oldContent, this)) fxHelper.finished(callback);
	});
}

/**







 */
function allAnimationsFinished(content, object) {
	if(content==null) return true;
	
	var animated=content.filter(":animated");
	return (animated.length === 0 || animated.length === 1 && animated[0] == object);
}

function FxHelper(zoneHolder) {
	this.zoneHolder=zoneHolder;
	
	this.oldContent=null;
	this.topContent=null;
	this.newContent=null;
	this.bottomContent=null;
	
	this.attrStack=[];
	this.callback;
}

/**








 */
FxHelper.prototype.prepareContent = function(html, insertBeforeOldContent) {

	var tmpZoneHolder=this.zoneHolder.cloneNode(false);
	tmpZoneHolder.innerHTML = html;
	this.newContent=$(tmpZoneHolder).children();
	this.bottomContent=this.newContent; // normally the old content is above the new content

	this.oldContent=$(this.zoneHolder).children();
	this.topContent=this.oldContent; // normally the old content is above the new content
	
	if(insertBeforeOldContent) {
		this.topContent=this.newContent;
		this.bottomContent=this.oldContent;
		var before=this.zoneHolder.firstChild;
		while(tmpZoneHolder.childNodes.length>0) {
			this.zoneHolder.insertBefore(tmpZoneHolder.firstChild, before);
		}
	}
	else {
		while(tmpZoneHolder.childNodes.length>0) {
			this.zoneHolder.appendChild(tmpZoneHolder.firstChild);
		}
	}
}

/**




 */
FxHelper.prototype.alignProductListBottomContent = function(top, right) {






	this.topContent.css({float: "left"});
	
	var h="-"+this.topContent.height()+"px";
	var listWidth=$('#ProductList').width()+"px";



	var props={};
	if ($.browser.msie && $.browser.version.substr(0,1)<8) {
		if(top) props["margin-top"]=h;
		if(right) props["margin-left"]=listWidth;
	}
	else {
		props["position"]="relative";
		if(top) props["top"]=h;
		if(right) props["left"]=listWidth;
	}
	
	this.bottomContent.css(props);
}

/**


 */
FxHelper.prototype.finished = function(callback) {

	if(this.oldContent) {
		this.oldContent.remove();
		this.oldContent=null;
	}
	


	this.restoreAttrs();
	
	if(callback) callback(this.zoneHolder);
}

/**





 */
FxHelper.prototype.saveAttr = function(element, attr) {
    var saveCount=element.attr("_sc_"+attr);
    if(saveCount==undefined) {

    	element.attr("_sc_"+attr, 1);
    	
    	var value=element.attr(attr);
    	if(value!=undefined) element.attr("_sv_"+attr, value);
    }
    else {

    	var saveCountInt=parseInt(saveCount)+1;
    	element.attr("_sc_"+attr, saveCountInt);
    }
    
    this.attrStack.push({element: element, attrName: attr});
}

/**





 */
FxHelper.prototype.restoreAttrs = function() {
	for(var i=this.attrStack.length-1; i>=0; i--) {
		var entry=this.attrStack[i];
		
		var saveCount=entry.element.attr("_sc_"+entry.attrName);
		if(saveCount==undefined || parseInt(saveCount)<2) {

			var value=entry.element.attr("_sv_"+entry.attrName);
			
			if(value==undefined) entry.element.removeAttr(entry.attrName);
			else {
				entry.element.attr(entry.attrName, value);
				entry.element.removeAttr("_sv_"+entry.attrName);
			}
			

			entry.element.removeAttr("_sc_"+entry.attrName);
		}
		else {

			var saveCountInt=parseInt(saveCount)-1;
			entry.element.attr("_sc_"+entry.attrName, saveCountInt);
		}
	}
	this.attrStack=[];
}

