/**
 * JQuery Plugin to create a hovering tooltip
 */
(function($) {

	var DATA_KEY_ID = 'hovertip.id';
	var DATA_KEY_CONFIG = 'hovertip.config';
	var id = 1;
	var tipElem = null;
	var currConfig = null;
	var html = '<div id="" style="position: absolute; z-index:32000" class="hovertipContainer"><div class="hovertip"></div></div>';
	
	$.fn.hovertip = function(options) {
        var config = jQuery.extend({
        	'useRel': false,
        	'position': {
        		my: 'right top',
        		at: 'left top',
        		offset: '-10px'
        	},
            'additionalStyles': ''
        }).extend(options);	
        this.each(function() {
        	if ($(this).data(DATA_KEY_ID) != null) {
        		// This element is already processed
        		return true;
        	}
        	if (!config.useRel) {
	        	var idAttr = 'hovertip-'+(id++);
	    		var template = $(html);
	    		$('.hovertip',template).html($(this).attr('title'));
	    		$(this).attr('title','');
	    		$(this).attr('alt','');
	    		$(template).addClass(config.additionalStyles);
	    		$(template).attr('id',idAttr);
	    		$(this).data(DATA_KEY_ID,idAttr);
	    		$('body').append(template);
	    		template.hide();
        	} else {
        		$(this).data(DATA_KEY_ID,$(this).attr('rel'));
        	}
        	$(this).data(DATA_KEY_CONFIG,jQuery.extend({},config));
    		$(this).bind('mouseenter.hovertip',function(e) {
    			var selector = '#'+$(this).data(DATA_KEY_ID);
    			var elem = $(selector);
    			elem.show();
    			currConfig = $(this).data(DATA_KEY_CONFIG);
    			tipElem = elem;
    		});
    		$(this).bind('mouseleave.hovertip',function(e) {
    			var selector = '#'+$(this).data(DATA_KEY_ID);
    			var elem = $(selector);
    			elem.hide();
    			tipElem = null;
    			currConfig = null;
    		});
    		$(document).mousemove(function(e) {
    			if (tipElem != null) {
    				$(tipElem).position({
    					  my: currConfig.position.my,
            			  at: currConfig.position.at,
            			  of: e,
            			  offset: currConfig.position.offset,
            			  collision: 'none' 
        		    });
    			}
    		});
        });
	};	
	
	$.fn.unhovertip = function() {
        this.each(function() {
        	if ($(this).data(DATA_KEY_ID) != null) {
        		var config = $(this).data(DATA_KEY_CONFIG);
        		var selector = '#'+$(this).data(DATA_KEY_ID);
        		$(this).attr('title',$('.hovertip',selector).html());
        		$(selector).hide();
        		$(this).data(DATA_KEY_ID,null);
        		$(this).unbind('mouseenter.hovertip');
        		$(this).unbind('mouseleave.hovertip');
        	}
        });
	};	        	
	
})(jQuery);
