
var popupTips = new Class({
	Implements: [Options, Events],
	
	options: {
		'eventStart':'mouseenter',
		'eventEnd':'mouseleave',
		'offsetx':0,
		'offsety':0,
		'direction':'right',
		'className':'rTooltip',
		'hold':false,
		
		'flag_leaved':false,
		'flag_entered':false,
		'flag_tipbody_leaved':false,
		'flag_tipbody_entered':false
	},
	
	initialize: function(elements, options) {
		this.setOptions(options);
		this.elements = elements;
		
		this.elements.each(function(e,i) {
			var coords = e.getCoordinates();
			var tipbody = new Element("div", {
				'class': this.options.className
			});
			var inner = new Element("div", {
				'class': 'tip-inner'
			}).inject(tipbody);
			inner.adopt(new Element("div", {
				'class':'tip-title',
				/*'html': title.replace(/ /g, "&nbsp;")*/
				'html': (e.get('title') || '')
			})).adopt(new Element("div", {
				'class':'tip-center',
				'html': (e.get('rel') || '')
			})).adopt(new Element("div", {
				'class':'tip-text'
			}));
			tipbody.inject(document.body);
			
			var t = tipbody.getSize();
			if (this.options.direction=='top') {
				tipbody.setStyles({
					'left':coords.left+(coords.width/2).round()-(t.x/2).round()+this.options.offsetx,
					'top':coords.top+this.options.offsety-t.y
				});
			}
			else
				if (this.options.direction=='right') {
					tipbody.setStyles({
						'left':coords.left+this.options.offsetx+t.x,
						'top':coords.top+(coords.height/2).round()-(t.y/2).round()+this.options.offsety
					});
				}
			tipbody.setStyles({'display':'none','visibility':'visible'});
			tipbody.store('popupTipsParentElement',e);
			e.store('popupTipsObj',this);
			
			tipbody.addEvent(this.options.eventStart, function() {
				var e = this.retrieve('popupTipsParentElement');
				var p = e.retrieve('popupTipsObj');
				if (p) {
					p.options.flag_tipbody_entered=true;
					p.options.flag_tipbody_leaved=false;
				};
			});
			tipbody.addEvent(this.options.eventEnd, function() {
				var e = this.retrieve('popupTipsParentElement');
				var p = e.retrieve('popupTipsObj');
				if (p) {
					if (p.options.hold) {
						p.hide(e);
					}
					p.options.flag_tipbody_entered=false;
					p.options.flag_tipbody_leaved=true;
				};
			});
			e.addEvent(this.options.eventStart, function() {
				var p = this.retrieve('popupTipsObj');
				if (p) {
					p.hideall(this);
					p.show(this);
					p.options.flag_entered=true;
					p.options.flag_leaved=false;
				}
			});
			e.addEvent(this.options.eventEnd, function() {
				var p = this.retrieve('popupTipsObj');
				if (p) {
					if (!p.options.hold) {
						p.hide(this);
					}
					p.options.flag_entered=false;
					p.options.flag_leaved=true;
				}
			});
			e.store('tooltip',tipbody);
		}.bind(this));
		this.hideConditional.periodical(1000,this);
	},
	
	show: function(e) {
		var tipbody = e.retrieve('tooltip');
		if ($type(tipbody) == "element") {
			tipbody.setStyle('display','block');
			var p = e.retrieve('popupTipsObj');
			var t = tipbody.getSize();
			var coords = e.getCoordinates();
			if (p.options.direction=='top') {
				tipbody.setStyles({
					'left':coords.left+(coords.width/2).round()-(t.x/2).round()+p.options.offsetx,
					'top':coords.top+p.options.offsety-t.y
				});
			}
			else
				if (p.options.direction=='right') {
					tipbody.setStyles({
						'left':coords.left+p.options.offsetx+t.x,
						'top':coords.top+(coords.height/2).round()-(t.y/2).round()+p.options.offsety
					});
				}
		}
	},
	
	hide: function(e) {
		var tipbody = e.retrieve('tooltip');
		if ($type(tipbody) == "element") {
			tipbody.setStyle('display','none');
		}
	},
	
	hideall: function(actElem) {
		this.elements.each(function(e,i) {
			if (e != actElem) {
				this.hide(e);
			}
		}.bind(this));
	},
	
	hideConditional: function() {
		if (this.options.flag_leaved && !this.options.flag_tipbody_entered)
			this.hideall(false);
	}

});

