/**
 * Contains hint scripts 
 */

Hint = new Object();

/*
 * Shows hint on mouse over
 */
Hint.show = function(event) {
    var y = this.offsetTop;
    var parentElement = this.offsetParent;
    while (parentElement != null) {
        y = parseInt(y) + parseInt(parentElement.offsetTop);
        parentElement = parentElement.offsetParent;
    }
    var element = $(this.id.replace("-mark-", "-popup-"));
    element.style.top = (y+22) + 'px';
    element.show();
    if (!Hint.isWithinViewport(element)) {
    	element.style.left = (element.offsetLeft - element.getDimensions().width + this.width) + 'px';  
    }
};

/*
 * Shows hint on mouse over
 */
Hint.showBelow = function(event) {
	
	// TODO The code is almost identical to Hint.show(), to be replaced
	
	var mouseX = Event.pointerX(event);
	var mouseY = Event.pointerY(event);
	
    var element = $(this.id.replace("-mark-", "-popup-"));
    element.style.top = (mouseY + 15) + 'px';
    element.style.left = (mouseX + 20) + 'px';  
    element.show();
};

/*
 * Hides opened hint on mouse out
 */
Hint.hide = function(evnt) {
    var e = (evnt) ? evnt : event;
    var p = (e.relatedTarget) ? e.relatedTarget : ((e.type == "mouseover") ? e.fromElement : e.toElement);
    while (p && p != this) {
      try {
        p = p.parentNode;
      } catch(e) {
        p = this;
      }
    }
    if (p == this) return;
    (e.type == "mouseover") ? "over" : $(this).hide();
};

/*
 * Hides opened hint on mouse out
 */
Hint.hideBelow = function(evnt) {
	
	// TODO This duplicates Hint.hide, should be refactored
	
	var element = $(this.id.replace("-mark-", "-popup-"));
	
	var e = (evnt) ? evnt : event;
	var p = (e.relatedTarget) ? e.relatedTarget : ((e.type == "mouseover") ? e.fromElement : e.toElement);
	while (p && p != element) {
		try {
			p = p.parentNode;
		} catch(e) {
			p = element;
		}
	}
	if (p == element) return;
	(e.type == "mouseover") ? "over" : $(element).hide();
};

/*
 * Checks if element fits viewport
 */
Hint.isWithinViewport = function(element) {
	var element = $(element);
    var elementOffset = element.cumulativeOffset(); 
    var viewportOffset = document.viewport.getScrollOffsets(); 
    var elementDimensions = element.getDimensions(); 
    var viewportDimensions = document.viewport.getDimensions();
    
    return !(elementOffset[0] < viewportOffset[0]
    		|| elementOffset[0] + elementDimensions.width > viewportOffset[0] + viewportDimensions.width); 
};

