var ToolTip = Class.create();
ToolTip.prototype = {
	initialize: function(elementToToggle, toggleElement, toolTipText) {
		var options = Object.extend({	      			    
		    min_distance_x: 5,
	      	min_distance_y: 5,
			tolerance: 20,			
	      	delta_x: 10,
	      	delta_y: 10,
	      	zindex: 2000
	    });
	
	    this.options = options;	    
	    
	    this.elementToToggle = $(elementToToggle);       		
		
        this.toggleElement = $(toggleElement);
		this.toolTipText = toolTipText;
		
		this.hideToolTip();       
        
        this.eventMouseOver = this.showToolTip.bindAsEventListener(this);
	    this.eventMouseOut = this.hideToolTip.bindAsEventListener(this);
	    this.eventMouseMove = this.moveToolTip.bindAsEventListener(this);
		
	    this.registerEvents();
    },
	
	registerEvents: function() {
		Event.observe(this.toggleElement, "mouseover", this.eventMouseOver);
    	Event.observe(this.toggleElement, "mouseout", this.eventMouseOut);
    	Event.observe(this.toggleElement, "mousemove", this.eventMouseMove);
	},
    
    showToolTip: function(event) {
		Event.stop(event);
		this.moveToolTip(event);
		this.elementToToggle.innerHTML = this.toolTipText;				
		new Element.show(this.elementToToggle);				
    },
	
	hideToolTip: function(event) {
		new Element.hide(this.elementToToggle);
	},
	
	moveToolTip: function(event) {
		Event.stop(event);
		
		var mouse_x = Event.pointerX(event);
		var mouse_y = Event.pointerY(event);		
		
		var dimensions = Element.getDimensions(this.elementToToggle);
		var element_width = dimensions.width;
		var element_height = dimensions.height;
		if ( (element_width + mouse_x) >= ( this.getWindowWidth() - this.options.min_distance_x - this.options.tolerance) ){ 
			mouse_x = mouse_x - element_width;			
			mouse_x = mouse_x - this.options.min_distance_x;
		} else {
		  mouse_x = mouse_x + this.options.min_distance_x;
		}
		
		if ( (element_height + mouse_y) >= ( this.getWindowHeight() - this.options.min_distance_y - this.options.tolerance) ){ 
		  mouse_y = mouse_y - element_height;		
		  mouse_y = mouse_y - this.options.min_distance_y;		  
		} else {
		  mouse_y = mouse_y + this.options.min_distance_y;
		} 
		
		this.setStyles(mouse_x, mouse_y);
	},
	
	setStyles: function(mouse_x, mouse_y) {
		Element.setStyle(this.elementToToggle, {
				position:'absolute',
				top: mouse_y + this.options.delta_y + "px",
				left: mouse_x + this.options.delta_x + "px",
				zindex: this.options.zindex
			}
		);
	},
	
	getWindowHeight: function() {
		var innerHeight;
		if (navigator.appVersion.indexOf('MSIE') > 0) {
			innerHeight = document.body.clientHeight;
		} else {
			innerHeight = window.innerHeight;
		}
		return innerHeight;
	},
	
	getWindowWidth: function() {
		var innerWidth;
		if (navigator.appVersion.indexOf('MSIE') > 0) {
			innerWidth = document.body.clientWidth;
		} else {
			innerWidth = window.innerWidth;
		}
		return innerWidth;
	},
	
	setMinDistanceX: function(x) {
		this.options.min_distance_x = x;
	},
	
	setMinDistanceY: function(y) {
		this.options.min_distance_y = y;
	},
	
	setDeltaX: function(x) {
		this.options.delta_x = x;
	},
	
	setDeltaY: function(y) {
		this.options.delta_y = y;
	}
}
