var Prototips = new Class({

	Implements: [Events, Options],
	
	options: {
		onShow: function(tip){
			tip.setStyle('visibility', 'visible');
		},
		onHide: function(tip){
			tip.setStyle('visibility', 'hidden');
		},
		maxTitleChars: 30,
		showDelay: 100,
		hideDelay: 100,
		minimumHeight: 114,
		className: 'tool',
		offsets: {'x': 18, 'y': 20},
		imgPath: './img/tooltip/arrow/',
		fixed: false,
		closeBx: false
	},

	initialize: function(elements, options){
		this.setOptions(options);
		this.toolTip = new Element('div', {
			'class': this.options.className + '-tips',
			'styles': {'visibility': 'hidden'}
		}).inject(document.body);
		this.bgTop = new Element('div', { 'class' : this.options.className + '-bg-top' }).inject( new Element('div', { 'class' : this.options.className + '-right-top' }).inject( new Element('div', { 'class' : this.options.className + '-left-top' }).inject(this.toolTip) ) );
		this.tooltipsbody = new Element('div', { 'class' : this.options.className + '-bg-body' }).inject( new Element('div', { 'class' : this.options.className + '-right-body' }).inject( new Element('div', { 'class' : this.options.className + '-left-body' }).inject(this.toolTip) ) );
		this.bgbottom = new Element('div', { 'class' : this.options.className + '-bg-bottom' }).inject( new Element('div', { 'class' : this.options.className + '-right-bottom' }).inject( new Element('div', { 'class' : this.options.className + '-left-bottom' }).inject(this.toolTip) ) );
		this.title = new Element('span', {'class': this.options.className + '-title'}).inject(this.tooltipsbody);
		
		if(this.options.closeBx)
			this.closeBx = new Element('div', { 'class' : this.options.className + '-closeBx' }).inject(this.tooltipsbody);
		
		this.wrapper = new Element('div').inject(this.tooltipsbody);
		$$(elements).each(this.build, this);
		if (this.options.initialize) this.options.initialize.call(this);
	},

	build: function(el){
		/*el.$tmp.myTitle = (el.href && el.getTag() == 'a') ? el.href.replace('http://', '') : (el.rel || false);
		if (el.title){
			var dual = el.title.split('::');
			if (dual.length > 1){
				el.$tmp.myTitle = dual[0].trim();
				el.$tmp.myText = dual[1].trim();
			} else {
				el.$tmp.myText = el.title;
			}
			el.removeAttribute('title');
		} else {
			el.$tmp.myText = false;
		}
		
		if (el.$tmp.myTitle && el.$tmp.myTitle.length > this.options.maxTitleChars) 
			el.$tmp.myTitle = el.$tmp.myTitle.substr(0, this.options.maxTitleChars - 1) + "&hellip;";
		*/	
		if (!this.options.fixed) el.addEvent('mousemove', this.locate.bindWithEvent(this, el));
		var end = this.end.bind(this);
		if(!this.options.closeBx){
			el.addEvent('mouseleave', end);
			el.addEvent('trash', end);
		}else{
			this.closeBx.addEvent('mouseenter', function(){ this.setStyles({ 'background-position': 'left bottom' }); });
			this.closeBx.addEvent('mouseleave', function(){ this.setStyles({ 'background-position': 'left top' }); });
			this.closeBx.addEvent('click', end);
		}
	},

	start: function(el){
		this.wrapper.empty();
		if (el.$tmp.myText){ this.text = new Element('span', {'class': this.options.className + '-text'}).inject(this.wrapper).set('html', el.$tmp.myText); }
		$clear(this.timer);
		this.timer = this.show.delay(this.options.showDelay, this);
	},
	
	receive: function(el, myText){
		this.wrapper.empty();
		if (myText){
			this.text = new Element('span', {'class': this.options.className + '-text'}).inject(this.wrapper).set('html', myText);
		}
		$clear(this.timer);
		this.timer = this.show.delay(this.options.showDelay, this);
		
		this.toolTip.setStyles({
			'height' : (this.toolTip.getCoordinates().height > this.options.minimumHeight) ? this.toolTip.getCoordinates().height : this.options.minimumHeight					   
		});
		
		this.position(el);
	},

	end: function(event){
		$clear(this.timer);
		this.timer = this.hide.delay(this.options.hideDelay, this);
	},

	position: function(element){
		var pos = element.getPosition();
		this.toolTip.setStyles({
			'left': pos.x + this.options.offsets.x,
			'top': pos.y + this.options.offsets.y
		});
	},

	locate: function(event, el){
		var win = {'x': window.getWidth(), 'y': window.getHeight()};
		var scroll = {'x': window.getScrollLeft(), 'y': window.getScrollTop()};
		var tip = {'x': this.toolTip.offsetWidth, 'y': this.toolTip.offsetHeight};
		var prop = {'x': 'left', 'y': 'top'};
		for (var z in prop){
			var pos = event.page[z] + this.options.offsets[z];
			if ( (pos + tip[z] - scroll[z]) > win[z] )
				pos = event.page[z] - this.options.offsets[z] - tip[z];
			this.toolTip.setStyle(prop[z], pos);
		};
	},

	show: function(){
		if (this.options.timeout)
			this.timer = this.hide.delay(this.options.timeout, this);
		this.fireEvent('onShow', [this.toolTip]);
	},

	hide: function(){
		this.fireEvent('onHide', [this.toolTip]);
	}

});