﻿/**
 * 자동 Tooltip v0.2
 *
 * @author hooriza (ajaxUI team)
 */

// Jindo2 기능 확장
(function() {
	
	$Element.prototype.has = function(oElement) {
	
		var n = this.$value();
		var o = $Element(oElement).$value();
	
		for (; o; o = o.parentNode)
			if (o == n) return true;
	
		return false;
	};

	$Element.prototype.findElement = function(sRelative, fCallback, bIncl) {
	
		var oEl = this.$value();
		fCallback = fCallback || function(oEl) { return true; }
		
		if (!bIncl) oEl = oEl[sRelative];
		
		for (; oEl; oEl = oEl[sRelative])
			if (oEl.nodeType == 1 && fCallback(oEl))
				return $Element(oEl);
				
		return null;
		
	};
	
	$Event.prototype.getRelatedElement = function() {

		var e = this._event;
		return e.relatedTarget || (e.type == "mouseover" ? e.fromElement : e.toElement);
		
	};
	
	$Event.prototype.of = function(parent) {
		
		var el;
		var ret = true;
		
		if (el = this.element)
			ret &= $Element(parent).has(el);
			
		if (el = this.getRelatedElement())
			ret &= $Element(parent).has(el);
	
		return ret;				
	};
	
})();

Tooltip = {
	
	_layer : null,
	
	_over : false,
	_timer : null,

	_getParentByClassName : function(oEl, sClassName) {
		
		var eEl = $Element(oEl);
		
		eEl = eEl.hasClass(sClassName) ? eEl : eEl.findElement('parentNode', function(oEl) { return $Element(oEl).hasClass(sClassName); });
		return eEl;
		
	},
	
	_getLayer : function() {
		
		if (!this._layer) {
			
			this._layer = $('<div>');
			this._layer.className = 'tooltip_layer';
			
			document.body.insertBefore(this._layer, document.body.firstChild);
			
			this._layer = $Element(this._layer);
			this._layer.css({
				position : 'absolute',
				display : 'none'
			});
				
		}
		
		return this._layer;
		
	},
	
	_initElement : function(eEl) {
		
		var self = this;
		
		var oEl = eEl.$value();

		var sTitle = oEl.getAttribute('_title');
		if (!sTitle) return;
		
		$Fn(function() {
			
			var eLayer = self._getLayer();
			eLayer.hide();
			
			self._over = false;
			
		}).attach(oEl, 'mouseout');
		
		$Fn(function(oEvent) {
			
			if (!self._over) return;
			
			var eLayer = self._getLayer();
			var oPos = oEvent.pos();
			
			eLayer.css({
				left : oPos.pageX + 'px',
				top : oPos.pageY + 'px'
			});
			
			eLayer.show();
			
		}).attach(oEl, 'mousemove');
		
	},
	
	initialize : function(sClassName) {
		
		var self = this;
		
		$A($$('.' + sClassName)).forEach(function(oEl) {
			
			var sTitle = oEl.getAttribute('title');
			if (!sTitle) return;
			
			oEl.setAttribute('_title', sTitle);
			oEl.removeAttribute('title');
			
		});

		$Fn(function(oEvent) {
			
			var oSrc = oEvent.element;
		
			eSrc = self._getParentByClassName(oSrc, sClassName);
			if (!eSrc || oEvent.of(eSrc)) return;
			
			self._initElement(eSrc);

			var eLayer = self._getLayer();
			eLayer.html(eSrc.$value().getAttribute('_title'));

			self._over = true;
		
		}).attach(document, 'mouseover');
		
	}
	
};

