PhotoShowcase = {
	
	Moving : {
		Up : 1,
		Down : 2
	},
	
	_timerlen : 5,
	_slideAniLen : 250,
	_cachebust : new Date().valueOf().toString(),
	_moving : {},
	_dir : {},
	_loaded : {},
	_obj : {},
	_endHeight : {},
	_startTime : {},
	_timers : {},
	
	Toggle : function(id, invdef) {
		if (this._moving[id])
			return;
		
		if (Html.Get(id).style.display == '')
			this._SlideUp(id);
		else
			this._SlideDown(id,invdef);
	},
	
	_SlideUp : function(id) {
		this._dir[id] = PhotoShowcase.Moving.Up;
		this._StartSlide(id);
	},
	
	_SlideDown : function(id, invdef) {
		this._dir[id] = PhotoShowcase.Moving.Down;
		this._StartSlide(id);
		if (this._loaded[id] === undefined)
		{
			this._loaded[id] = false;
			var builderid = invdef.builderid;
			
			var args = [];
			args.push('builder=' + builderid);
			args.push(this._cachebust);
			
	        var url = 'api/PhotoShowcase.php?' + args.join('&');
    	    GDownloadUrl(url, this._MakeHandler(id));
		}
	},
	
	_MakeHandler : function(id)
	{
		return function(body, status) {
			if (status == 200)
			{
				PhotoShowcase._loaded[id] = true;	
				var newnode = Html.NodeFromHtml(body);
				var div = Html.Get(id);
				div.removeChild(div.firstChild);
				div.appendChild(newnode);
			}
		};
	},
	
	_StartSlide : function(id)
	{
	    var element = Html.Get(id);
	    this._obj[id] = element;
	    this._endHeight[id] = parseInt(element.style.height);
    	this._startTime[id] = (new Date()).getTime();
		if (PhotoShowcase.Moving.Down == this._dir[id])
			element.style.height = '1px';
		element.style.display = '';
    	this._timers[id] = window.setInterval(this._MakeSlideTickHandler(id), this._timerlen);		
	},
		
	_MakeSlideTickHandler : function(id)
	{
		return function() { PhotoShowcase._SlideTick(id); };
	},
	
	_SlideTick : function(id)
	{
		var elapsed = (new Date()).getTime() - this._startTime[id];
		if (elapsed > this._slideAniLen)
			this._EndSlide(id);
		else 
		{
			var d = Math.round(elapsed / this._slideAniLen * this._endHeight[id]);
			if (PhotoShowcase.Moving.Up === this._dir[id])
				d = this._endHeight[id] - d;
			var element = this._obj[id];
			element.style.height = d + 'px';
		}
	},
	
	_EndSlide : function(id) {
		window.clearInterval(this._timers[id]);
	    var element = this._obj[id];
    	if (PhotoShowcase.Moving.Up === this._dir[id])
	        element.style.display = 'none';
	    element.style.height = this._endHeight[id] + 'px';
	    delete this._moving[id];
	    delete this._timers[id];
	    delete this._startTime[id];
	    delete this._endHeight[id];
	    delete this._obj[id];
	    delete this._dir[id];		
	}
	
};