var ToolTipSingle = Class.create({
	cssClasses: {
		tooltip: 'tooltip',
		head: 'tooltip-head',
		body: 'tooltip-body',
		foot: 'tooltip-foot'
	},
	tooltips: [],
	effect: false,
	element: false,
	initialize: function(){
		if(this.element == false){
			this.element = this.create();
			this.element.hide();
			document.body.appendChild(this.element);
		}
	},
	create: function(){
		var element = new Element('div',{
			'field': 'tooltip',
			'class': this.cssClasses.tooltip
		});
		element.setStyle({
			"position": "absolute",
			"z-index": 9999
		});
		var head = new Element('div',{
			'field': 'tooltip-head',
			'class': this.cssClasses.head
		});
		element.appendChild(head);
		var body = new Element('div',{
			'field': 'tooltip-content',
			'class': this.cssClasses.body
		});
		element.appendChild(body);
		var foot = new Element('div',{
			'field': 'tooltip-foot',
			'class': this.cssClasses.foot
		});
		element.appendChild(foot);
		return element;
	},
	onMouseOver: function(event){
		var nr = event.element().readAttribute('nr');
		var content = this.tooltips[nr];
		if(content.length > 0){
			this.element.select("[field='tooltip-content']").first().update(content);
			this.setPosition(event);
			this.show();
		}
	},
	onMouseOut: function(event){
		this.hide();
	},
	onMouseMove: function(event){
		this.setPosition(event);
	},
	onMouseClick: function(event){
		this.hide();
	},
	hide: function(){
		if(this.effect && typeof Scriptaculous != 'undefined'){
			Effect.Shrik(this.element,{
				direction: 'top-right'
			});
		}else{
			this.element.hide();
		}
	},
	show: function(){
		if(this.effect && typeof Scriptaculous != 'undefined'){
			Effect.Grow(this.element,{
				direction: 'top-right'
			});
		}else{
			this.element.show();
		}
	},
	setPosition: function(event){
		var style = {};
		style.left = (event.pointerX() + parseInt(event.element().getWidth())) + 'px';
		style.top = (event.pointerY() - parseInt(event.element().getHeight())) + 'px';
		this.element.setStyle(style);
	},
	setObserver: function(node){
		node.observe('mouseover', this.onMouseOver.bind(this));
		node.observe('mousemove', this.onMouseMove.bind(this));
		node.observe('mouseout', this.onMouseOut.bind(this));
		node.observe('click', this.onMouseClick.bind(this));
	},
	add: function(node){
		if(node.hasAttribute('nr')){
			return this.update(node);
		}
		var content = node.readAttribute('title');
		if(content.length > 0){
			var count = 1 + this.tooltips.length;
			this.setObserver(node);
			node.writeAttribute('nr', count);
			this.tooltips[count] = content;
			node.removeAttribute('title');
		}
	},
	remove: function(node){
		if(node.hasAttribute('nr')){
			var nr = node.readAttribute('nr');
			var title = this.tooltip[nr];
			node.writeAttribute('title', title);
			node.removeAttribute('nr');
			node.stopObserving();
			this.tooltips[nr] = null;
		}
	},
	update: function(node){
		if(!node.hasAttribute('nr')){
			return this.add(node);
		}
		var nr = node.readAttribute('nr');
		this.tooltips[nr] = node.readAttribute('title')
		node.removeAttribute('title');
	}
});
