﻿// Kopieringsrätt av Digitalyard Sverige AB. Alla rättigheter reserverade.
// För mer information, eller för att köpa komponenten HoverListView vänligen kontakta info@yard.se.

// hook window.scroll, window.resize, table.onmouseout, tr.mouseover
function hoverListViewInit() {
	var x, tables = document.getElementsByTagName("table");
	for (x = 0; x < tables.length; x++) {
		if ((tables[x].className == "hoverListView") && (tables[x].getAttribute("noninteractive") != "1")) {
			addEvent(tables[x], "mouseout", hoverListViewMouseOut);

			var y,rows = tables[x].getElementsByTagName("tr");
			for (y = 0; y < rows.length; y++) {
				if (rows[y].getElementsByTagName("th").length == 0) {
					addEvent(rows[y], "mouseover", hoverListViewMouseOver);
				} else {
					tables[x].headerRow = rows[y];
				}
			}
		}
	}

	if (document.elementFromPoint) {
		addEvent(window, "scroll", hoverListViewAdjustHeader);
		addEvent(window, "resize", hoverListViewAdjustHeader);
		hoverListViewAdjustHeader();
	}
}

// handles tr.mouseover
function hoverListViewMouseOver(e) {
	if (!e) var e = window.event;
	var currentElement = e.target || e.srcElement;
	var previousElement = e.relatedTarget || e.fromElement;
	var parentTable = getParentByTagName(currentElement,"TABLE");

	if (parentTable) {
		hoverListViewClearHighlight(parentTable);
		var tr = getParentByTagName(currentElement,"TR");
		if (parentTable.halfRow != tr) {
			parentTable.selectedRow = tr;
			if (parentTable.selectedRow) {
				parentTable.selectedRow.className = "hoverListViewSel";

				// insert image cell & description row
				parentTable.selectedRow.getElementsByTagName("td")[0].style.display = "";
				parentTable.selectedRow.getElementsByTagName("td")[0].getElementsByTagName("img")[0].src = (parentTable.selectedRow.getAttribute("image") || "images/pixel.gif");
				parentTable.selectedRow.getElementsByTagName("td")[1].colSpan = "1";

				var tr = document.createElement("TR");
				tr.className = "hoverListViewSelInsert";
				var td = document.createElement("TD");
				tr.appendChild(td);
				td.setAttribute("colSpan", parentTable.selectedRow.getElementsByTagName("td").length+1);
				td.innerHTML = parentTable.selectedRow.getAttribute("description") || "&nbsp;";

				var parent = parentTable.selectedRow.parentNode || parentTable.selectedRow.parentElement;
				if (!parentTable.selectedRow.nextSibling) {
					parent.appendChild(tr);
				} else {
					parent.insertBefore(tr, parentTable.selectedRow.nextSibling);
				}
			}
		}
	}
}

// handles table.mouseout
function hoverListViewMouseOut(e) {
	if (!e) var e = window.event;
	var currentElement = e.target || e.srcElement;
	var nextElement = e.relatedTarget || e.toElement;
	var parentTable = getParentByTagName(currentElement, "TABLE");

	if (!isDescendant(parentTable, nextElement)) {
		hoverListViewClearHighlight(parentTable);
	}
}

function hoverListViewClearHighlight(element) {
	if (element.selectedRow) {
		// clear image & additional row
		var tbody = element.getElementsByTagName("tbody")[0];
		if (!tbody) tbody = element;
		tbody.removeChild(element.selectedRow.nextSibling);

		element.selectedRow.getElementsByTagName("td")[0].style.display = "none";
		element.selectedRow.getElementsByTagName("td")[1].colSpan = "2";

		// remove highlight
		element.selectedRow.className = "";
		element.selectedRow = null;
	}
}

// handles window.scroll & window.resize
function hoverListViewAdjustHeader() {
	setTimeout(hoverListViewAdjustHeaderCB, 0);
}

function hoverListViewAdjustHeaderCB() {
	var x, tables = document.getElementsByTagName("table");
	for (x = 0; x < tables.length; x++) {
		if ((tables[x].className == "hoverListView") && (!tables[x].selectedRow) && (tables[x].getAttribute("noninteractive") != "1")) {
			// move header trick
			var headerRow = tables[x].headerRow;
			var tablePos = findPos(tables[x]);

			var possibleTableChild = document.elementFromPoint(tablePos[0] + 10, document.documentElement.scrollTop ? 0 : window.pageYOffset ? window.pageYOffset : 0);
			if (isDescendant(tables[x], possibleTableChild)) {
				var tr = getParentByTagName(possibleTableChild, "TR");
				while (true) {
					if (findPos(tr)[1] > (document.documentElement.scrollTop || window.pageYOffset)) break;
					if (!getSibling(tr,1)) break;
					tr = tr.nextSibling;
				}
				if ((headerRow.rowIndex < tr.rowIndex) && getSibling(tr,1)) {
					tr = tr.nextSibling;
				}

				getParentByTagName(headerRow,"TBODY").insertBefore(headerRow, tr);

				// hide half row by setting foreground to white
				var currentHalfRow = tables[x].halfRow;
				if (currentHalfRow) {
					currentHalfRow.style.color = "";
					currentHalfRow = null;
				}
				currentHalfRow = getSibling(headerRow, -1);
				if (currentHalfRow) {
					currentHalfRow.style.color = "#ffffff";
				}
				tables[x].halfRow = currentHalfRow;
			} else {
				var currentHalfRow = tables[x].halfRow;
				if (currentHalfRow) {
					currentHalfRow.style.color = "";
					tables[x].halfRow = null;
				}

				// move header row to top
				if (headerRow.previousSibling) {
					getParentByTagName(headerRow,"TBODY").insertBefore(headerRow, tables[x].getElementsByTagName("tr")[0]);
				}
			}
		}
	}
}

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];
}

addEvent(window, "load", hoverListViewInit);
