﻿// Kopieringsrätt av Digitalyard Sverige AB. Alla rättigheter reserverade.
// För mer information, eller för att köpa komponenten HoverTips vänligen kontakta info@yard.se.

var m_hoverTipsWait = 0, m_hoverTipsDiv = null;

// hook mouseover & mouseout
function hoverTipsInit() {
	var x, items = document.getElementsByTagName("*");
	for (x = 0; x < items.length; x++) {
		if (items[x].getAttribute("hovertip")) {
			addEvent(items[x], "mouseout", hoverTipsMouseOut);
			addEvent(items[x], "mouseover", hoverTipsMouseOver);
			addEvent(items[x], "click", hoverTipsMouseOver);
		}
	}
}

function hoverTipsHook(element, text) {
    if (element) {
        element.setAttribute("hovertip", text);
    }
	addEvent(element, "mouseout", hoverTipsMouseOut);
	addEvent(element, "mouseover", hoverTipsMouseOver);
	addEvent(element, "click", hoverTipsMouseOver);
}

// handles mouseover
function hoverTipsMouseOver(e, useCursorPos) {
	if (!e) var e = window.event;
    var isIE = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;	
	var currentElement = e.target || e.srcElement;
	var previousElement = e.relatedTarget || e.fromElement;
	if (!currentElement.getAttribute("hovertip")) return;

	if (m_hoverTipsWait != 0) {
		clearTimeout(m_hoverTipsWait);
		m_hoverTipsWait = 0;
	}
	if (!m_hoverTipsDiv) {
		m_hoverTipsDiv = createElem("DIV", new Array("style", "visibility: hidden; position: absolute; height: auto", "class", "hoverTip"));
		addEvent(m_hoverTipsDiv, "mouseout", hoverTipsMouseOut);
		document.body.appendChild(m_hoverTipsDiv);
	}
	var pos = findPos(currentElement);
	if (useCursorPos) {
	    pos = (isIE ? [e.clientX + document.documentElement.scrollLeft,e.clientY + document.documentElement.scrollTop] : [e.pageX,e.pageY]);
	    m_hoverTipsDiv.style.left = pos[0] + "px";
	    m_hoverTipsDiv.style.top = (pos[1]+20) + "px";
	} else {
	    m_hoverTipsDiv.style.left = pos[0] + "px";
	    m_hoverTipsDiv.style.top = (pos[1] + currentElement.offsetHeight) + "px";
	}

	m_hoverTipsDiv.source = currentElement;
	m_hoverTipsDiv.innerHTML = currentElement.getAttribute("hovertip");
	if (e.type == "click") {
	    hoverTipsShow(e);
	} else {
	    m_hoverTipsWait = setTimeout(hoverTipsShow, 1000);
	}
}

// handles mouseout
function hoverTipsMouseOut(e) {
	if (!e) var e = window.event;
	var currentElement = e.target || e.srcElement;
	var nextElement = e.relatedTarget || e.toElement;

	if (m_hoverTipsDiv.style.visibility == "hidden") {
		if (m_hoverTipsWait != 0) {
			clearTimeout(m_hoverTipsWait);
			m_hoverTipsWait = 0;
		}	
	}

	if (!isDescendant(currentElement, nextElement) && (nextElement != m_hoverTipsDiv) && (nextElement != m_hoverTipsDiv.source)) {
		m_hoverTipsDiv.style.visibility = "hidden";
	}
}

// handles showing the tip
function hoverTipsShow(e) {
	if (!e) var e = window.event;

	m_hoverTipsDiv.style.visibility = "visible";
}

function addEvent(element, eventName, eventHandler) {
	if (element.addEventListener) {
		element.addEventListener(eventName, eventHandler, false);
	} else {
		element.attachEvent("on" + eventName, eventHandler);
	}
}

function getParentByTagName(element, tagName) {
	while (element) {
		if (element.tagName == tagName) {
			return element;
		}
		element = element.parentNode || element.parentElement;
	}
	return null;
}

function isDescendant(parent, possibleChild) {
	while (possibleChild) {
		if (possibleChild == parent) {
			return true;
		}
		possibleChild = possibleChild.parentNode || possibleChild.parentElement;
	}
	return false;
}

function getSibling(element, direction) {
	element = direction < 0 ? element.previousSibling : element.nextSibling;
	while ((element) && (element.nodeType != 1)) {
		element = direction < 0 ? element.previousSibling : element.nextSibling;
	}
	return element;
}


function findPos(obj) {
	var left = 0, top = 0;
	if (obj.offsetParent) {
		do {
			left += obj.offsetLeft;
			top += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [left, top];
}

function createElem(tagName, attributes) {
    var result, s, x;
    var isIE = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;

    if (isIE) {
	s = "<" + tagName;
	for (x = 0; x < attributes.length; x += 2) {
	    s += " " + attributes[x] + "=\"" + attributes[x + 1] + "\"";
	}
	s += ">";
	result = document.createElement(s);
    } else {
	result = document.createElement(tagName);
	for (x = 0; x < attributes.length; x += 2) {
	    result.setAttribute(attributes[x], attributes[x + 1]);
	}
    }
    return result;
}


addEvent(window, "load", hoverTipsInit);
