GoldmanSachs.GSAMToolTip = new Class({
	options: {
		offsets: {'x': 16, 'y': 16},
		delay: 200 
	},
	initialize: function (trigger, target, options) {
		if (!trigger || !target) return; // fail fast

		this.setOptions(options);
		
		this.trigger = trigger;
		this.target = target;

		var coords = this.target.getCoordinates();
		this.width = coords.width;
		this.height = coords.height;

		this.trigger.addEvent('mouseover', this.doShow.bind(this));
		this.trigger.addEvent('mouseout', this.doHide.bind(this));
		
		this.target.addEvent('mouseover', this.stayOpen.bind(this));
		this.target.addEvent('mouseout', this.doHide.bind(this));
		
		this.fx = new Fx.Style(this.target, 'opacity', {duration: this.options.delay, wait: false}).set(0);
	},
	stayOpen: function() {
		this.fx.stop();
		this.fx.set(1);
		this.show();
	},
	doShow: function (e) {
		var event = new Event(e);
		this.fx.start(1);
		this.locate(event);
		this.show();
	},
	doHide: function() {
		this.fx.start(0);
		this.hide();
	},
	show: function() {
		// to be overridden
	},
	hide: function() {
		// to be overridden
	},
	locate: function(event) {
		var win = {'x': window.getWidth(), 'y': window.getHeight()};
		var scroll = {'x': window.getScrollLeft(), 'y': window.getScrollTop()};
		var pos = this.trigger.getPosition();

		var l = pos.x - (this.options.offsets.x + this.width);
		var t = pos.y + this.options.offsets.y;

		this.target.setStyles({
			'left': l,
			'top': t
		});
		
		var tip = this.target.getCoordinates();		
		if (scroll.x > tip.left) {
			this.target.setStyle('left', (l + scroll.x - tip.left + this.options.offsets.x));
		}
	}
});
GoldmanSachs.GSAMToolTip.implement(new Options);