if (!window.fio) {
	window.fio = {};
}

(function($) {
	
	$.fn.viewportOffset = function() {
		var offset = $(this).offset();
		
		return {
			left: offset.left - $(window).scrollLeft(),
			top: offset.top - $(window).scrollTop()
		};
	};
	
	$.fn.stripTags = function() { return this.replaceWith( this.html().replace(/<\/?[^>]+>/gi, '') ); };
	
	fio.ToolTipSet = function(selector, options) {
		
		var thisObject = this;
		
		this.selector = selector;
		this.tip;
		this.viewportDim;
		
		this.defaultOptions = {
			offsetY: 20,
			offsetX: 20,
			tipAttr: 'fio:tip',
			titleAttr: 'fio:word'
		};
		
		this.options = $.extend({}, this.defaultOptions, options);
		
		this.loadViewportDim = function() {
			thisObject.viewportDim = { 'height':$(window).height(), 'width':$(window).width() }
		}
		
		this.init = function() {
			$(window).resize(this.viewportDim);
			this.loadViewportDim();
			
			var tipEls = ($.isArray(this.selector) ? this.selector : $(this.selector));
			
			$(tipEls).each(function(i, el) {
				$(el).css('position','relative');
				
				var tipTitle, tipText = $(el).attr(thisObject.options.tipAttr);
				
				if (thisObject.options.titleAttr == 'innerHTML') {
					tipTitle = $(el).stripTags();
					
				}else if (typeof thisObject.options.titleAttr == 'string' && thisObject.options.titleAttr.length > 0) {
					tipTitle = $(el).attr(thisObject.options.titleAttr);
				}
				
				if (tipTitle) {
					tipText = '<h3>' + tipTitle + '</h3>' + tipText;
				}
				
				var html = '<div class="tooltip" style="position:absolute; display:none;">'+tipText+'</div>';
				$(el).append(html);
				
				$(el).mouseenter(thisObject.showTip);
				$(el).mouseleave(thisObject.hideTip);
			});
			
		}
		
		this.showTip = function(e) {
			this.tip = $(e.currentTarget).children('.tooltip');
			this.tip.show();
			var offset = $(e.currentTarget).viewportOffset();
			var size = { 'height':this.tip.height(), 'width':this.tip.width() }
			
			var hiddenHeight = (offset.top + size.height + thisObject.options.offsetY - thisObject.viewportDim.height);
			if (hiddenHeight > 0) {
				this.tip.css('top', -1 * (size.height + thisObject.options.offsetX - 25) + 'px');
			} else {
				this.tip.css('top', thisObject.options.offsetY + 'px');
			}
			var hiddenWidth = (offset.left + size.width + thisObject.options.offsetX - thisObject.viewportDim.width);
			if (hiddenWidth > 0) {
				this.tip.css('left', -1 * (size.width + thisObject.options.offsetX - 25) + 'px');
			} else {
				this.tip.css('left', thisObject.options.offsetX + 'px')
			}
		};
		
		this.hideTip = function() {
			$(this.tip).hide();
		};
		
		this.init();
	}
	
})(jQuery);

