var bubble = Class.create();

bubble.prototype = {

	initialize : function(obj, errMsg) {
		/* Пользовательские переменные */
		this.toOpacity |= 80; // Непрозрачность после появления
		this.disableOnClick = 0; // Выключать пузырь при клике по нему
		this.msgSpliter = this.msgSpliter || "<br><br>"; // Разделитель сообщений в балоне
		/***/

		/* "Внутренние" переменные */
		this.tm = 0; // Таймер для плавности появления
		this.opacity = 0; // Стартовая или текущая непрозрачность
		this.obj = obj; // Ссылка на проверяемый объект
		this.msg = new Array; // Массив сообщений в балоне
		this.bubbleDiv = document.createElement("div"); // Контейнер содержимого балона
		/***/
				
		id = new Date().getTime()+Math.round(Math.random(100)*1000000);

		if (!document.bubbles) document.bubbles = new Array;
		document.bubbles.push(this);

		// Ифрейм на подложку, чтобы перекрыть select'ы в IE
		var iframe = document.createElement("iframe");
		iframe.style.zIndex = 10000;
		iframe.setAttribute("id","iframe_" + id);
		iframe.style.position = "absolute";
		iframe.style.display = "none";
		iframe.style.filter="alpha(opacity:0)";
		iframe.setAttribute("src","");

		this.bubbleDiv.setAttribute("id", "bubble_" + id);
		this.iframe = iframe;
		this.bubbleDiv.link = this;
		this.bubbleDiv.style.zIndex = 100;
		this.bubbleDiv.style.position = "absolute";
		this.bubbleDiv.style.MozUserSelect = "none";
		this.bubbleDiv.onselectstart = function() { return false; }
		this.bubbleDiv.onclick = function() {
			if (this.link.disableOnClick) {
				this.link.removeOpacity();
			}
		}
			
		document.body.
//			$('content').
				appendChild(this.bubbleDiv);
		document.body.
//			$('content').
			appendChild(iframe);
		iframe.contentWindow.name = "iframe_" + id;

		// Позиционируем пузырь над объектом и делаем его невидимым
		setOpacity(this.bubbleDiv, this.opacity);
		this.msg.push(errMsg);
		this.refresh();
		Element.hide(this.bubbleDiv);
	},

	// Добавить сообщение об ошибке
	addMsg : function (errMsg) {
		this.msg.push(errMsg);
		this.refresh();
	},

	// Абсолютное изменение расположения балона
	setPosition : function(x, y) {
		this.bubbleDiv.style.left=x;
		this.bubbleDiv.style.top=y;
	},
	
	// Относительное изменение расположения балона
	setIndention : function(indentionX, indentionY) {
		this.setPosition(parseInt(this.bubbleDiv.style.left)+indentionX, parseInt(this.bubbleDiv.style.top)+indentionY);
	},

	// Обновление балона: текст, координаты
	refresh : function() {
		Element.update(this.bubbleDiv,
			'<table class="Bt">'+
			'<tr><td class="Btd11"></td><td class="Btd12"></td><td class="Btd13"></td></tr>'+
			'<tr><td class="Btd21"></td><td class="Btd22">'+this.msg.join(this.msgSpliter)+'</td><td class="Btd23"></td></tr>'+
			'<tr><td class="Btd31"></td><td class="Btd32"></td><td class="Btd33"></td></tr>'+
			'</table>'
		);			
		this.bubbleDiv.style.left = Position.cumulativeOffset(this.obj)[0]+Element.getDimensions(this.obj).width-Element.getDimensions(this.obj).width/2-16;
		this.bubbleDiv.style.top = Position.cumulativeOffset(this.obj)[1]-Element.getDimensions(this.bubbleDiv).height-$('content').scrollTop;
//		alert(Position.cumulativeOffset(this.obj));
		this.bubbleDiv.style.left=Position.cumulativeOffset(this.obj)[0]+Element.getDimensions(this.obj).width-Element.getDimensions(this.obj).width/2-16;
		this.bubbleDiv.style.top=Position.cumulativeOffset(this.obj)[1]-Element.getDimensions(this.bubbleDiv).height;
		if (parseInt(this.bubbleDiv.style.top) < 0) {
			Element.update(this.bubbleDiv,
				'<table class="Bt">'+
				'<tr><td class="Btd11"></td><td class="Btd12"></td><td class="Btd13"></td></tr>'+
				'<tr><td class="Btd21"></td><td class="Btd22">'+this.msg.join(this.msgSpliter)+'</td><td class="Btd23"></td></tr>'+
				'<tr><td class="Btd31"></td><td class="Btd32"></td><td class="Btd33"></td></tr>'+
				'</table>'
			);			
			this.bubbleDiv.style.left=Position.cumulativeOffset(this.obj)[0]+Element.getDimensions(this.obj).width-Element.getDimensions(this.obj).width/2-16;
			this.bubbleDiv.style.top=Position.cumulativeOffset(this.obj)[1]-Element.getDimensions(this.bubbleDiv).height;
		}


		var DivRef = this.bubbleDiv;
		var IfrRef = this.iframe;
		IfrRef.style.width = DivRef.offsetWidth;
		IfrRef.style.height = DivRef.offsetHeight;
		IfrRef.style.top = DivRef.style.top;
		IfrRef.style.left = DivRef.style.left;
		IfrRef.style.zIndex = DivRef.style.zIndex - 1;
//		Element.update($('a'), $('a').innerHTML+document.body.scrollHeight+"<br>")
//		Element.update($('a'), $('a').innerHTML+document.body.scrollHeight+"<br>")
		//parseInt(this.bubbleDiv.style.top)+"-"+Position.within(document.body, parseInt(this.bubbleDiv.style.left), parseInt(this.bubbleDiv.style.top))+"<br>");
	},

	// Сделать балон непрозрачным
	setOpacity : function() {
		newLeft = Position.cumulativeOffset(this.obj)[0]+Element.getDimensions(this.obj).width-Element.getDimensions(this.obj).width/2-16;
		newTop = Position.cumulativeOffset(this.obj)[1]-Element.getDimensions(this.bubbleDiv).height-$('content').scrollTop;
		clearInterval(this.tm);
		decOpacity(this.bubbleDiv.id);
		this.tm = setInterval("incOpacity('"+this.bubbleDiv.id+"')",10);
		if (Position.within($('content'), newLeft, newTop) && Position.within($('content'), newLeft, newTop+this.bubbleDiv.offsetHeight+5))	{
			Element.show(this.bubbleDiv);
			this.iframe.style.display = "block";
		}
//				this.bubbleDiv.style.top = this.bubbleDiv.style.top+$('content').scrollTop;
	},

	// Сделать балон прозрачным
	removeOpacity : function() {
		clearInterval(this.tm);
		incOpacity(this.bubbleDiv.id);	
		this.tm = setInterval("decOpacity('"+this.bubbleDiv.id+"')",10);
	}
}

function incOpacity(e) {
	obj = $(e).link;
	if (!obj.opacity || obj.opacity < obj.toOpacity/100) {
		obj.opacity += 0.1;
		setOpacity(obj.bubbleDiv, obj.opacity);
	} else {
		clearInterval(obj.tm);
	}
}

function decOpacity(e) {
	obj = $(e).link;
	if (!obj.opacity || obj.opacity > 0.0) {
		obj.opacity -= 0.1;
		setOpacity(obj.bubbleDiv, obj.opacity);
	} else {
		Element.hide($(e));
		obj.iframe.style.display = "none";
		clearInterval(obj.tm);
	}
}

function setOpacity(bubbleDiv, value) {
	bubbleDiv.style.filter="alpha(opacity:"+(value*100)+")";
	bubbleDiv.style.KHTMLOpacity = value;
	bubbleDiv.style.MozOpacity = value;
	bubbleDiv.style.opacity = value;
}

function updateFnInnerDiv() {
	document.updateBubbles = $('content').onscroll = function() {
		for (i in document.bubbles) {
			if (document.bubbles[i].bubbleDiv && document.bubbles[i].bubbleDiv.style.opacity && document.bubbles[i].bubbleDiv.style.opacity > 0) {
				newLeft = Position.cumulativeOffset(document.bubbles[i].obj)[0]+Element.getDimensions(document.bubbles[i].obj).width-Element.getDimensions(document.bubbles[i].obj).width/2-16;
				newTop = Position.cumulativeOffset(document.bubbles[i].obj)[1]-Element.getDimensions(document.bubbles[i].bubbleDiv).height-this.scrollTop;
				if (Position.within($('content'), newLeft, newTop) && Position.within($('content'), newLeft, newTop+document.bubbles[i].bubbleDiv.offsetHeight*2))	{
					document.bubbles[i].bubbleDiv.style.display = 'block';
					document.bubbles[i].iframe.style.display = 'block';
					document.bubbles[i].bubbleDiv.style.top=newTop;
					document.bubbles[i].iframe.style.top=newTop;
				} else {
					document.bubbles[i].bubbleDiv.style.display = 'none';
					document.bubbles[i].iframe.style.display = 'none';
				}
			}
		}
	}
}

Event.observe(window, 'load', updateFnInnerDiv, true);

