function ImageExpander(oThumb, sImgSrc, FFA, Seq)
{
	// store thumbnail image and overwrite its onclick handler.
    this.theTop = 0;
    this.theLeft = 0;
	this.oThumb = oThumb;
	this.oThumb.expander = this;
	this.oThumb.onclick = function() { this.expander.expand(); }
    
    var obj = this.oThumb;    
    var x = obj.offsetLeft;var y = obj.offsetTop;
    while(obj.offsetParent){
        if(obj==document.getElementsByTagName('body')[0]){break;}
        else{
            x=x+obj.offsetParent.offsetLeft;
            y=y+obj.offsetParent.offsetTop;
            obj=obj.offsetParent;
        }
    }
    this.theLeft=x;
    this.theTop=y;
    
    this.x=this.theLeft;
    this.y=this.theTop;
	
	// record original size
	this.smallWidth = oThumb.offsetWidth;
	this.smallHeight = oThumb.offsetHeight;	

	this.bExpand = true;
	this.bTicks = false;
	
	// self organized list
	if ( !window.aImageExpanders )
	{
		window.aImageExpanders = new Array();
	}
	window.aImageExpanders.push(this);

    // create the blank overlay.
   	this.oImgBlank = new Image();
    this.oImgBlank.src = "/image.gif";
    this.oImgBlank.style.position = "absolute";
    this.oImgBlank.style.float = "left";
    this.oImgBlank.style.zIndex = "1000";
    
    // create wait image
   	this.oImgWait = new Image();
    document.body.appendChild(this.oImgWait);
    this.oImgWait.src = "/files/ajax-loader.gif";
    this.oImgWait.style.position = "absolute";
    this.oImgWait.style.float = "left";
    this.oImgWait.style.zIndex = "9000";
    
    // Find Middle of Thumb
    var waitTop = this.y + (this.smallHeight / 2) - 16;
    var waitLeft = this.x + (this.smallWidth / 2) - 16;
    
    //alert (waitTop+" - "+waitLeft);
    // Load Wait Graphic
	this.oImgWait.style.left = waitLeft + "px";
	this.oImgWait.style.top = waitTop + "px";
    this.oImgWait.style.visibility = "visible";
    
	// create the full sized image.
	this.oImg = new Image();
	this.oImg.expander = this;
	this.oImg.onload = function(){this.expander.onload();}
    if(FFA) {
            this.oImg.src = '/publications/FreeForAll.php?PK='+sImgSrc+'&MAX=800&SEQ='+Seq;
     } else {
         if (ExpanderIsNumeric(sImgSrc)) {
            this.oImg.src = '/files/image.php?iid='+sImgSrc+'&MAX=800';
         } else {
             this.oImg.src = sImgSrc;
         }
    }
    this.oImg.style.position = "absolute";
    this.oImg.style.float = "left";
    
    
    

}

function ExpanderIsNumeric(sText)
{
   var ValidChars = "0123456789";
   var IsNumber=true;
   var Char;

 
   for (i = 0; i < sText.length && IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;
   
}

ImageExpander.prototype.onload = function()
{
	this.oDiv = document.createElement("div");

    this.oDiv.style.left=0;
    this.oDiv.style.top=0;
    this.oImg.style.left=0;
    this.oImg.style.top=0;
    this.oImg.style.maxWidth=this.oImg.width;
    
    this.oDiv.style.visibility = "hidden";
    this.oImg.style.visibility = "hidden";
    this.oImgWait.style.visibility = "hidden";
    
    
	document.body.appendChild(this.oDiv);
	this.oDiv.appendChild(this.oImg);
    this.oDiv.appendChild(this.oImgBlank);
	this.oDiv.style.position = "absolute";
	this.oImg.style.borderStyle = "solid";
	this.oImg.style.borderWidth = "1px";
	this.oImg.style.borderColor = "#000000";
	this.oDiv.expander = this;
	this.oDiv.onclick = function() {this.expander.toggle();};
	this.oImg.title = "Click to reduce.";
    this.oImgBlank.title = "Click to Reduce.";
	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
    
    /*
    var obj = this.oThumb;    
    var x = obj.offsetLeft;var y = obj.offsetTop;
    while(obj.offsetParent){
        if(obj==document.getElementsByTagName('body')[0]){break;}
        else{
            x=x+obj.offsetParent.offsetLeft;
            y=y+obj.offsetParent.offsetTop;
            obj=obj.offsetParent;
        }
    }
    this.theLeft=x;
    this.theTop=y;
    
    this.x=this.theLeft;
    this.y=this.theTop;
    */
    
	//this.x = this.oThumb.offsetLeft;
	//this.y = this.oThumb.offsetTop;
	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";
    
	this.oImgBlank.style.width = this.w + "px";
	this.oImgBlank.style.height = this.h + "px";
	this.oImgBlank.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 = document.body.clientWidth;
	var ch = document.body.clientHeight;
	var cx = document.body.scrollLeft + cw / 2;
	var cy = document.body.scrollTop + ch / 2;

	// calculate target
	var tw,th,tx,ty;
	if ( this.bExpand )
	{
		tw = this.bigWidth;
		th = this.bigHeight;
		if ( tw > cw )
		{
			th *= cw / tw;
			tw = cw;
		}	
		if ( th > ch )
		{
			tw *= ch / th;
			th = ch;
		}
		tx = cx - tw / 2;
		ty = cy - th / 2; 
	}
	else
	{
		tw = this.smallWidth;
		th = this.smallHeight;
        
        tx = this.theLeft;
        ty = this.theTop;
		//tx = this.oThumb.offsetLeft;
		//ty = this.oThumb.offsetTop;
	}	
	// move 5% 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 / 10;
		}
	}
	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";

	this.oImgBlank.style.width = this.w + "px";
	this.oImgBlank.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.oImgBlank.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);
	}
}
