function ImageExpander( oThumb, sImgSrc ) {

	// store thumbnail image and overwrite its onclick handler
	this.oThumb = oThumb;
	this.oThumb.expander = this;
	this.oThumb.onclick = function() { this.expander.expand(); }

	// record original size
	this.smallWidth = oThumb.offsetWidth;
	this.smallHeight = oThumb.offsetHeight;    

	// initial settings
	this.bExpand = true;
	this.bTicks = false;  

	// insert into self organized list
	if ( !window.aImageExpanders ) window.aImageExpanders = new Array();
	window.aImageExpanders.push( this );

	// create the full sized image and automatically expand when loaded
	this.oImg = new Image();
	this.oImg.expander = this;
	this.oImg.onload = function() { this.expander.onload(); }
	this.oImg.src = sImgSrc;

}


ImageExpander.prototype.onload = function() {

	this.oDiv = document.createElement( "div" );
	document.body.appendChild( this.oDiv );
	this.oDiv.appendChild( this.oImg );
	this.oDiv.style.position = "absolute";
	this.oDiv.expander = this;
	this.oDiv.onclick = function() { this.expander.toggle(); };
	this.oImg.title = "Click to scale down";
	this.bigWidth = this.oImg.width;
	this.bigHeight = this.oImg.height;
	
	if ( this.bExpand ) {
		this.expand();
	}
	else {
		this.oDiv.style.visibility = "hidden";
		this.oImg.style.visibility = "hidden";
	}
	
}


ImageExpander.prototype.toggle = function() {

	this.bExpand = !this.bExpand;
	if ( this.bExpand )
		for ( var i in window.aImageExpanders )
			if ( window.aImageExpanders[i] !== this )
				window.aImageExpanders[i].reduce();

}


ImageExpander.prototype.expand = function() {

	// set direction of expansion
	this.bExpand = true;

	// set all other images to reduce
	for ( var i in window.aImageExpanders )
		if ( window.aImageExpanders[i] !== this )
			window.aImageExpanders[i].reduce();

	// if not loaded, don't continue just yet
	if ( !this.oDiv ) return;
	
	// hide the thumbnail
	this.oThumb.style.visibility = "hidden";
	
	// calculate initial dimensions
	this.x = this.oThumb.offsetLeft + 436 + 0; // nabidka_obrazu left & padding-left
	this.y = this.oThumb.offsetTop + 35; // body padding-top
	this.w = this.oThumb.clientWidth;
	this.h = this.oThumb.clientHeight;
	
	this.oDiv.style.left = this.x + "px";
	this.oDiv.style.top = this.y + "px";
	this.oImg.style.width = this.w + "px";
	this.oImg.style.height = this.h + "px";
	this.oDiv.style.visibility = "visible";
	this.oImg.style.visibility = "visible";
	
	// start the animation engine
	if ( !this.bTicks ) {
		this.bTicks = true;
		var pThis = this;
		window.setTimeout( function() { pThis.tick(); }, 25 );	
	}
	
}


ImageExpander.prototype.reduce = function() {

	// set direction of expansion
	this.bExpand = false;
	
}


ImageExpander.prototype.tick = function() {

	// calculate screen dimensions
	var cw, ch, cx, cy;
	
	if ( typeof( window.innerWidth ) == 'number' ) {
		// Non-IE
		cw = window.innerWidth;
		ch = window.innerHeight;
	}
	else if ( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		// IE 6+ strict
		cw = document.documentElement.clientWidth;
		ch = document.documentElement.clientHeight;
	}
	else if ( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		// IE 4 compatible
		cw = document.body.clientWidth;
		ch = document.body.clientHeight;
	}
	
	if ( typeof( window.pageXOffset ) == 'number' ) {
		// NS compliant
		cx = window.pageXOffset;
		cy = window.pageYOffset;
	}
	else if ( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
		// DOM compliant
		cx = document.body.scrollLeft;
		cy = document.body.scrollTop;
	}
	else {
		// IE 6 strict, IE 7
		cx = document.documentElement.scrollLeft;
		cy = document.documentElement.scrollTop;
	}
	cx += cw / 2;
	cy += ch / 2;
	

	// calculate target
	var tw, th, tx, ty;
	if ( this.bExpand ) {
	
		// start with the full size dimensions
		tw = this.bigWidth;
		th = this.bigHeight;
		
		// reduce to fit the screen, but leave there 5px gaps
		if ( tw > cw ) {
			th *= (cw-10) / tw;
			tw = cw-10;
		}	
		if ( th > ch ) {
			tw *= (ch-10) / th;
			th = ch-10;
		}
		
		// then center it on the page
		tx = cx - tw / 2;
		ty = cy - th / 2;
		
	}
	else {
		tw = this.smallWidth;
		th = this.smallHeight;
		tx = this.oThumb.offsetLeft + 436 + 0; // nabidka_obrazu left & padding-left
		ty = this.oThumb.offsetTop + 35; // body padding-top
	}
	
	// move 20% closer to target
	var nHit = 0;
	var fMove = function( n, tn ) {
		var dn = tn - n;
		if ( Math.abs( dn ) < 3 ) {
			nHit++;
			return tn;
		}
		else {
			return n + dn / 5;
		}
	}
	this.x = fMove( this.x, tx );
	this.y = fMove( this.y, ty );
	this.w = fMove( this.w, tw );
	this.h = fMove( this.h, th );
	
	this.oDiv.style.left = this.x + "px";
	this.oDiv.style.top = this.y + "px";
	this.oImg.style.width = this.w + "px";
	this.oImg.style.height = this.h + "px";

	// if reducing and size/position is a match, stop the tick	
	if ( !this.bExpand && ( nHit == 4 ) ) {
		this.oImg.style.visibility = "hidden";
		this.oDiv.style.visibility = "hidden";
		this.oThumb.style.visibility = "visible";

		this.bTicks = false;
	}
	
	if ( this.bTicks ) {
		var pThis = this;
		window.setTimeout( function() { pThis.tick(); } , 25 );
	}
	
}
