function Point(x, y) {
	this.x = x;
	this.y = y;
}
function Size(width, height) {
	this.width = width;
	this.height = height;
}
function Directions(top, right, bottom, left) {
	this.top = top;
	this.right = right;
	this.bottom = bottom;
	this.left = left;
}
DivStatus.CLOSED = 1;
DivStatus.OPENED = 2;
DivStatus.RESIZING = 3;
function DivStatus() {}

MovablePopupDiv.EXPAND_STEPS = 20;
MovablePopupDiv.EXPAND_TIME_DELTA = 10;
MovablePopupDiv.COLLAPSE_STEPS = 10;
MovablePopupDiv.COLLAPSE_TIME_DELTA = 10;
MovablePopupDiv.MIN_WIDTH = 20;
MovablePopupDiv.MIN_HEIGHT = 20;
function MovablePopupDiv(divId) {
	this.div = null;
	this._error = null;
	
	this._expandWaiter = null;
	this._collapseWaiter = null;
	this._status = DivStatus.CLOSED;
	
	this._startPoint = null;
	
	this.init(divId);
}
MovablePopupDiv.prototype.init = function(id) {
	var success;
	
	try {
		this.div = document.getElementById(id);
		this.div.style.position = "absolute";
	
		this._error = null;
		this._expandWaiter = null;
		
		success = true;
	} catch (e) {
		this._error = e.message;
		
		success = false;
	}
	
	return success;
}
MovablePopupDiv.prototype.openAtPosition = function(fromPage, fromClient, size) {
if (this._status == DivStatus.CLOSED) {
		this._status = DivStatus.RESIZING;
		
		this._startPoint = fromPage;
		
		var x = (fromClient.x + size.width > this.getBrowserDimensions().width)?
			fromPage.x - (fromClient.x - (this.getBrowserDimensions().width - size.width))
			:
			fromPage.x
		;
		
		var y = (fromClient.y + size.height > this.getBrowserDimensions().height)?
			fromPage.y - (fromClient.y - (this.getBrowserDimensions().height - size.height))
			:
			fromPage.y
		;
		
		this._showAtInitPlace({x: x, y: y});
		this._prepareStylesForMoving();
		
		var iteration = 0;
		var obj = this;
		clearInterval(this._collapseWaiter);
		this._expandWaiter = setInterval(function() {
			if (iteration++ >= MovablePopupDiv.EXPAND_STEPS) {
				clearInterval(obj._expandWaiter);
				obj._prepareStylesForAppear();
				obj._status = DivStatus.OPENED;
			} else {
				obj.div.style.width = (parseInt(obj.div.style.width) + size.width / MovablePopupDiv.EXPAND_STEPS) + "px";
				obj.div.style.height = (parseInt(obj.div.style.height) + size.height / MovablePopupDiv.EXPAND_STEPS) + "px";
			}
		}, MovablePopupDiv.EXPAND_TIME_DELTA);
	}
}
MovablePopupDiv.prototype.openAtCenter = function(from, size) {
	if (this._status == DivStatus.CLOSED) {
		this._status = DivStatus.RESIZING;
		
		this._startPoint = from;
		
		this._showAtInitPlace(from);
		this._prepareStylesForMoving();
	
		var deltas = new Directions(
			(this.getBrowserDimensions().height - size.height) / 2 - from.y,
			null,
			null,
			(this.getBrowserDimensions().width - size.width) / 2 - from.x
		);
		
		var iteration = 0;
		var obj = this;
		clearInterval(this._collapseWaiter);
		this._expandWaiter = setInterval(function() {
			if (iteration++ >= MovablePopupDiv.EXPAND_STEPS) {
				clearInterval(obj._expandWaiter);
				obj._prepareStylesForAppear();
				obj._status = DivStatus.OPENED;
			} else {
				obj.div.style.top = (parseInt(obj.div.style.top) + deltas.top / MovablePopupDiv.EXPAND_STEPS) + "px";
				obj.div.style.left = (parseInt(obj.div.style.left) + deltas.left / MovablePopupDiv.EXPAND_STEPS) + "px";
				obj.div.style.width = (parseInt(obj.div.style.width) + size.width / MovablePopupDiv.EXPAND_STEPS) + "px";
				obj.div.style.height = (parseInt(obj.div.style.height) + size.height / MovablePopupDiv.EXPAND_STEPS) + "px";
			}
		}, MovablePopupDiv.EXPAND_TIME_DELTA);
	}
}
MovablePopupDiv.prototype.close = function() {
	if (this._status == DivStatus.OPENED) {
		this._status = DivStatus.RESIZING;
		
		this._prepareStylesForMoving();
		
		var deltas = new Directions(
			this._startPoint.y - parseInt(this.div.style.top),
			null,
			null,
			this._startPoint.x - parseInt(this.div.style.left)
		);
		
		var iteration = 0;
		var obj = this;
		clearInterval(this._expandWaiter);
		this._collapseWaiter = setInterval(function() {
			if (iteration++ >= MovablePopupDiv.COLLAPSE_STEPS) {
				clearInterval(obj._collapseWaiter);
				obj._prepareStylesForHide();
				obj._status = DivStatus.CLOSED;
			} else {
				obj.div.style.top = (parseInt(obj.div.style.top) + deltas.top / MovablePopupDiv.COLLAPSE_STEPS) + "px";
				obj.div.style.left = (parseInt(obj.div.style.left) + deltas.left / MovablePopupDiv.COLLAPSE_STEPS) + "px";
				obj.div.style.width = (parseInt(obj.div.style.width) - parseInt(obj.div.style.width) / MovablePopupDiv.COLLAPSE_STEPS) + "px";
				obj.div.style.height = (parseInt(obj.div.style.height) - parseInt(obj.div.style.height) / MovablePopupDiv.COLLAPSE_STEPS) + "px";
			}
		}, MovablePopupDiv.COLLAPSE_TIME_DELTA);
	}
}
MovablePopupDiv.prototype._prepareStylesForMoving = function() {
	this.div.style.overflow = "hidden";
	this.div.style.display = "inline";
	
	document.getElementById("content_list").style.visibility = "hidden";
	document.getElementById("content_thumb").style.visibility = "hidden";
}
MovablePopupDiv.prototype._prepareStylesForAppear = function() {
 	//this.div.style.overflow = "scroll";
 	
 	document.getElementById("content_list").style.visibility = "visible";
 	document.getElementById("content_thumb").style.visibility = "visible";
}
MovablePopupDiv.prototype._prepareStylesForHide = function() {
	this.div.style.display = "none";
	
	document.getElementById("content_list").style.visibility = "hidden";
	document.getElementById("content_thumb").style.visibility = "hidden";
}
MovablePopupDiv.prototype._showAtInitPlace = function(from) {
	this.div.style.display = "inline";
	this.div.style.top = from.y + "px";
	this.div.style.left = from.x + "px";
	this.div.style.width = MovablePopupDiv.MIN_WIDTH + "px";
	this.div.style.height = MovablePopupDiv.MIN_HEIGHT + "px";
}
MovablePopupDiv.prototype.getBrowserDimensions = function() {
	return new Size(
		document.all? window.document.documentElement.clientWidth : window.innerWidth,
		document.all? window.document.documentElement.clientHeight : window.innerHeight
	);
}