function ImageView(index,entity,id,ext,width,height,name){
	this.index=parseInt(index);
	this.entity=entity;
	this.id=id;
	this.ext=ext;
	this.width=width;
	this.height=height;
	this.name=name;
}
var ei={
	isIE:true
	,maxFade:0.75
	,animZoomInSteps:10
	,animZoomOutSteps:5
	,countAnimZoom:0
	,intervalAnimZoom:0
	,imageViewerData:null
	,imageViews:null
	,imageViewIndex:0
	,imageViewerTextTopMargin:8
	,imageViewerTextHeight:80
	,imageViewerPadding:{
		top:10
		,right:10
		,bottom:100
		,left:10
	}
	,isImageViewerMode:false
	,intervalLoadDynamicImages:0
	,intervalAnimDynamicImages:0
	,countAnimDynamicImages:0
	,loadedDynamicImages:{}

	,absOffset:function(a,b){
		var c=0;
		while(a){
			c+=a[b];
			a=a.offsetParent;
		}
		return c;
	}
	,onWResize:function(){
		if(!ei.isImageViewerMode)return;
		getScreenSize();
		ei.redrawFade();

		// reload big image:
		ei.createImageViewer(ei.imageViewerData.imageView,ei.imageViewerData.origImg);
		ei.showImageControls();
		ei.showImage();
		ei.loadImage();
	}
	,onWScroll:function(){
		if(!ei.isImageViewerMode)return;
		getScreenScroll();
		ei.showImageControls();
		ei.showImage();
	}
	,setOpacity:function(d,o){
		if(ei.isIE)d.style.filter="alpha(opacity="+Math.round(o*100)+")";
		else d.style.opacity=o;
	}
	,showImage:function(){
		// get screen size/scroll:
		getScreenSize();
		getScreenScroll();
		// set image taarget size:
		var tX=screenWidth/2-ei.imageViewerData.targetWidth/2;
		var tY=ei.imageViewerPadding.top+(screenHeight-ei.imageViewerPadding.top-ei.imageViewerPadding.bottom)/2-ei.imageViewerData.targetHeight/2;
		var vImg=ei.imageViewerData.img;
		vImg.style.width=(ei.imageViewerData.targetWidth)+"px";
		vImg.style.height=(ei.imageViewerData.targetHeight)+"px";
		vImg.style.left=tX+"px";
		vImg.style.top=screenScrollTop+tY+"px";
		// make it visible:
		vImg.style.display="block";
		// show text:
		var vText=ei.imageViewerData.textDiv;
		vText.style.left=Math.round(screenWidth*.15)+"px";
		vText.style.top=((ei.absOffset(vImg,"offsetTop"))+vImg.offsetHeight+ei.imageViewerTextTopMargin)+"px";
		vText.style.display="block";
	}
	,loadImage:function(){
		ei.imageViewerData.img.src=
			"/i/"
			+ei.imageViewerData.imageView.entity
			+"."+ei.imageViewerData.targetWidth
			+"."+ei.imageViewerData.imageView.id
			+"."+ei.imageViewerData.imageView.ext;
		classAdd(ei.imageViewerData.img,"imageViewerLoading");
		if(ei.isImageLoaded(ei.imageViewerData.img)){
			ei.hideImageLoader();
		}
		else {
			eventOn(ei.imageViewerData.img,"load",ei.onImageLoad);
		}
	}
	,onImageLoad:function(e){
		ei.hideImageLoader();
	}
	,hideImageLoader:function(){
		// nothing so far...
	}
	,showImageControls:function(){
		var c=d.getElementById("imageViewerControl");
		classAdd(c,"visible");
		c.style.left=(screenWidth/2-c.offsetWidth/2)+"px";
		c.style.top=(screenScrollTop
			+screenHeight
			-ei.imageViewerPadding.bottom/2
			-c.offsetHeight/2
			)+"px";
		if(ei.imageViewIndex==0)classAdd(d.getElementById("imageViewerControlPrev"),"disabled");
		else classRemove(d.getElementById("imageViewerControlPrev"),"disabled");
		if(ei.imageViewIndex+1>=ei.imageViews.length)classAdd(d.getElementById("imageViewerControlNext"),"disabled");
		else classRemove(d.getElementById("imageViewerControlNext"),"disabled");
	}
	,animZoomIn:function(){
		// get current screen size/scroll positions:
		getScreenSize();
		getScreenScroll();
		// increment animation counter:
		ei.countAnimZoom++;
		// calculate animation step:
		var a=ei.countAnimZoom/ei.animZoomInSteps;
		var f=d.getElementById("fade");
		if(ei.countAnimZoom>=ei.animZoomInSteps){
			// animation is done - stop interval:
			clearInterval(ei.intervalAnimZoom);
			ei.intervalAnimZoom=0;
			// show fade in full:
			ei.setOpacity(f,ei.maxFade);
			// show controls:
			ei.showImageControls();
			// show image:
			ei.showImage();

			// start loading image:
			ei.loadImage();
			//classAdd(ei.imageViewerData.img,"imageViewerLoading");
		}
		else{
			// zoom-in animation loop:

			// increase image viewer size a little:
			/*var tX=screenWidth/2-ei.imageViewerData.targetWidth/2;
			var tY=ei.imageViewerPadding.top+(screenHeight-ei.imageViewerPadding.top-ei.imageViewerPadding.bottom)/2-ei.imageViewerData.targetHeight/2;
			var w=((ei.imageViewerData.targetWidth-ei.imageViewerData.origWidth)*a);
			var h=((ei.imageViewerData.targetHeight-ei.imageViewerData.origHeight)*a);
			ei.imageViewerData.img.style.width=w+"px";
			ei.imageViewerData.img.style.height=h+"px";
			ei.imageViewerData.img.style.left=(ei.imageViewerData.origLeft+(tX-ei.imageViewerData.origLeft)*a)+"px";
			ei.imageViewerData.img.style.top=(ei.imageViewerData.origTop+(tY-ei.imageViewerData.origTop)*a)+"px";
			ei.imageViewerData.img.style.display="block";*/

			// fade out a little:
			ei.setOpacity(f,ei.maxFade*a);
		}
	}
	,animZoomOut:function(){
		ei.countAnimZoom++;
		var a=ei.countAnimZoom/ei.animZoomOutSteps;
		var f=d.getElementById("fade");
		if(ei.countAnimZoom>=ei.animZoomOutSteps){
			clearInterval(ei.intervalAnimZoom);
			ei.intervalAnimZoom=0;
			ei.setOpacity(f,0);
			classRemove(f,"visible");
			classRemove(d.body,"nonScrollable");
			ei.isImageViewerMode=false;
		}
		else{
			ei.setOpacity(f,(1-a)*ei.maxFade);
		}
	}
	,onImageViewerPrev:function(){
		if(ei.imageViewIndex==0)return;
		ei.createImageViewer(ei.imageViews[ei.imageViewIndex-1],null);
		ei.showImage();
		ei.loadImage();
		if(ei.imageViewIndex==0)classAdd(d.getElementById("imageViewerControlPrev"),"disabled");
		else classRemove(d.getElementById("imageViewerControlPrev"),"disabled");
		classRemove(d.getElementById("imageViewerControlNext"),"disabled");
	}
	,onImageViewerNext:function(){
		if(ei.imageViewIndex+1>=ei.imageViews.length)return;
		ei.createImageViewer(ei.imageViews[ei.imageViewIndex+1],null);
		ei.showImage();
		ei.loadImage();
		if(ei.imageViewIndex+1>=ei.imageViews.length)classAdd(d.getElementById("imageViewerControlNext"),"disabled");
		else classRemove(d.getElementById("imageViewerControlNext"),"disabled");
		classRemove(d.getElementById("imageViewerControlPrev"),"disabled");
	}
	,onImageViewerClose:function(){
		ei.removeImageViewer();
		// hide control:
		var c=d.getElementById("imageViewerControl");
		classRemove(c,"visible");
		// start fade in animation:
		ei.countAnimZoom=0;
		ei.intervalAnimZoom=setInterval("ei.animZoomOut()",25);
	}
	,redrawFade:function(){
		getScreenSize();
		//getScreenScroll();
		var f=d.getElementById("fade");
		f.style.top="0px";//screenScrollTop+"px";
		f.style.left="0px";
		f.style.width=screenWidth+"px";
		f.style.height=d.body.offsetHeight+"px";//screenHeight+"px";
	}
	,isImageLoaded:function(img) {
		// During the onload event, IE correctly identifies
		// any images that
		// weren’t downloaded as not complete. Others should too. Gecko-based
		// browsers act like NS4 in that they report this incorrectly.
		if(!img.complete)return false;

		// However, they do have two very useful properties:
		//naturalWidth and
		// naturalHeight. These give the true size of the image. If it failed
		// to load, either of these should be zero.
		if(typeof img.naturalWidth!="undefined"&&img.naturalWidth==0)return false;

		// No other way of checking: assume it’s ok.
		return true;
	}
	/**
		Creates image viewer.
		One of the following params should be not null:
		imageView - ImageView object
		img - clicked <img> element
	*/
	,createImageViewer:function(imageView,img){
		ei.removeImageViewer();
		if(img){
			// take data from attributes of the original <img>:
			var viewIndex=parseInt(img.getAttribute("viewIndex"));
			imageView=ei.imageViews[viewIndex];
		}
		// set index of currently vieved image:
		ei.imageViewIndex=imageView.index;
		// fill in image viewer params:
		ei.imageViewerData={
			imageView:imageView,
			targetWidth:imageView.width,
			targetHeight:imageView.height,
			textDiv:null,
			origImg:img
		};
		// create image viewer element - enlarged image object - invisible so far:
		var vImg=d.createElement("img");
		vImg.style.position="absolute";
		vImg.style.zIndex="10001";
		vImg.style.display="none";
		d.body.appendChild(vImg);
		ei.imageViewerData.img=vImg;
		if(img){
			ei.imageViewerData.origLeft=ei.absOffset(img,"offsetLeft");
			ei.imageViewerData.origTop=ei.absOffset(img,"offsetTop");
			ei.imageViewerData.origWidth=img.offsetWidth;
			ei.imageViewerData.origHeight=img.offsetHeight;
			// set same image src as in the clicked original <img>:
			vImg.src=img.src;
			// set image original position (over clicked <img>):
			vImg.style.left=(ei.absOffset(img,"offsetLeft"))+"px";
			vImg.style.top=(ei.absOffset(img,"offsetTop"))+"px";
			vImg.style.width=img.offsetWidth+"px";
			vImg.style.height=img.offsetHeight+"px";
		}
		// calculate target size:
		var w=screenWidth-(ei.imageViewerPadding.left+ei.imageViewerPadding.right);
		var h=screenHeight-(ei.imageViewerPadding.top+ei.imageViewerPadding.bottom+ei.imageViewerTextTopMargin+ei.imageViewerTextHeight);
		var ratio=ei.imageViewerData.imageView.width/ei.imageViewerData.imageView.height;
		ei.imageViewerData.targetWidth=w
		ei.imageViewerData.targetHeight=w/ratio;
		if(ei.imageViewerData.targetWidth>w){
			ei.imageViewerData.targetWidth=w;
			ei.imageViewerData.targetHeight=Math.ceil(ei.imageViewerData.targetWidth/ratio);
		}
		if(ei.imageViewerData.targetHeight>h){
			ei.imageViewerData.targetHeight=h;
			ei.imageViewerData.targetWidth=Math.ceil(ei.imageViewerData.targetHeight*ratio);
		}
		// check we have not oversized the loading image:
		if(ei.imageViewerData.targetWidth>ei.imageViewerData.imageView.width){
			ei.imageViewerData.targetWidth=ei.imageViewerData.imageView.width;
			ei.imageViewerData.targetHeight=Math.ceil(ei.imageViewerData.targetWidth/ratio);
		}
		// create text label:
		var vText=d.createElement("div");
		vText.style.display="none";
		vText.className="imageViewerText";
		d.body.appendChild(vText);
		vText.innerHTML=ei.imageViewerData.imageView.name?ei.imageViewerData.imageView.name:"";
		//vText.style.height=img.offsetHeight+"px";
		ei.imageViewerData.textDiv=vText;
	}
	,removeImageViewer:function(){
		// if image element for viewer already exists?
		if(ei.imageViewerData&&ei.imageViewerData.img){
			// remove old image element in viewer:
			d.body.removeChild(ei.imageViewerData.img);
			ei.imageViewerData.img=null;
		}
		// if text element for viewer already exists?
		if(ei.imageViewerData&&ei.imageViewerData.textDiv){
			// remove old text:
			d.body.removeChild(ei.imageViewerData.textDiv);
			ei.imageViewerData.textDiv=null;
		}
	}
	/**
		Handles click on an image on the page.
		Creates image viewer.
	*/
	,onImgClick:function(e){
		// enter image viewer mode:
		ei.isImageViewerMode=true;
		// get screen/scroll positions:
		getScreenSize();
		getScreenScroll();
		// get clicked image (<img> HTML element):
		var img=eventTarget(e);
		// create image viewer:
		ei.createImageViewer(null,img);
		// prepare fade animation:
		ei.redrawFade();	// fits fade over the <body>
		var f=d.getElementById("fade");
		ei.setOpacity(f,0);
		classAdd(f,"visible");
		// start fade animation:
		ei.countAnimZoom=0;
		ei.intervalAnimZoom=setInterval("ei.animZoomIn()",25);
		// disable scrolling:
		classAdd(d.body,"nonScrollable");
	}
	,init:function(){
		BrowserDetect.init();
		ei.isIE=BrowserDetect.browser=="Explorer";

		// attach image enlarge handlers to all <img> with viewIndex attribute:
		var imgs=d.getElementsByTagName("IMG");
		for(var i=0;i<imgs.length;i++){
			var img=imgs[i];
			if(!img.getAttribute("viewIndex"))continue;
			eventOn(img,"click",ei.onImgClick);
			classAdd(img,"enlargable");
		}

		// create image viewer control handlers:
		if(d.getElementById("imageViewerControlPrev")){
			eventOn(d.getElementById("imageViewerControlPrev"),"click",ei.onImageViewerPrev);
			eventOn(d.getElementById("imageViewerControlNext"),"click",ei.onImageViewerNext);
			eventOn(d.getElementById("imageViewerControlClose"),"click",ei.onImageViewerClose);
		}

		// listen to window scroll and resize:
		eventOn(self,"scroll",ei.onWScroll);
		eventOn(self,"resize",ei.onWResize);
	}
}
onReadys.push(ei.init);
