window.onload = bodyOnLoad;
window.onresize = bodyOnSize;

var hdrtbl = document.all.hdrtbl;
if (hdrtbl)
{
	hdrtbl.style.left = 0;
	hdrtbl.style.width = document.body.clientWidth;
}

function bodyOnClick()
{
	var elem = window.event.srcElement;
	for (; elem; elem = elem.parentElement)
	{
		if (elem.id == "reftip")
			return;
	}
	hideTip();
	closeMenu();
	hideSeeAlso();
}

function bodyOnLoad()
{
	initReftips();
	initSeeAlso();
	document.body.onclick = bodyOnClick;
}

function bodyOnSize()
{
	var hdr = document.all.hdrtbl;
	if (!hdr)
		return;
	hdr.style.left = 0;
	hdr.style.width = document.body.clientWidth;
}

function closeMenu()
{
	var div = document.all.lang_menu;
	if (div && div.style.visibility != "hidden")
	{
		var lnk = document.activeElement;
		if (lnk && lnk.tagName == "A")
			lnk.blur();

		div.style.visibility = "hidden";
	}
}

function getNext(elem)
{
	for (var i = elem.sourceIndex + 1; i < document.all.length; i++)
	{
		var next = document.all[i];
		if (!elem.contains(next))
			return next;
	}
	return null;
}

function initReftips()
{
	var DLs = document.all.tags("DL");
	var PREs = document.all.tags("PRE");
	if (DLs && PREs)
	{
		var iDL = 0;
		var iPRE = 0;
		var iSyntax = -1;
		for (var iPRE = 0; iPRE < PREs.length; iPRE++)
		{
			if (PREs[iPRE].className == "syntax")
			{
				while (iDL < DLs.length && DLs[iDL].sourceIndex < PREs[iPRE].sourceIndex)
					iDL++;			
				if (iDL < DLs.length)
				{
					initSyntax(PREs[iPRE], DLs[iDL]);
					iSyntax = iPRE;
				}
				else break;
			}
		}

		if (iSyntax >= 0)
		{
			var last = PREs[iSyntax];
			last.insertAdjacentHTML(
				'AfterEnd',
				'<DIV ID=reftip CLASS=reftip STYLE="position:absolute;visibility:hidden;overflow:visible;"></DIV>'
				);
		}
	}
}

function initSyntax(pre, dl)
{
	var strSyn = pre.outerHTML;
	var ichStart = strSyn.indexOf('>', 0) + 1;
	var terms = dl.children.tags("DT");
	if (terms)
	{
		for (var iTerm = 0; iTerm < terms.length; iTerm++)
		{
			var words = terms[iTerm].innerText.replace(/\[.+\]/g, " ").replace(/,/g, " ").split(" ");
			var htm = terms[iTerm].innerHTML;
			for (var iWord = 0; iWord < words.length; iWord++)
			{
				var word = words[iWord];

				if (word.length > 0 && htm.indexOf(word, 0) < 0)
					word = word.replace(/:.+/, "");

				if (word.length > 0)
				{
					var ichMatch = findTerm(strSyn, ichStart, word);
					while (ichMatch > 0)
					{
						var strTag = '<a href="" onclick="showTip(this)" class="synParam">' + word + '</A>';

						strSyn =
							strSyn.slice(0, ichMatch) +
							strTag +
							strSyn.slice(ichMatch + word.length);

						ichMatch = findTerm(strSyn, ichMatch + strTag.length, word);
					}
				}
			}
		}
	}

	// Replace the syntax block with our modified version.
	pre.outerHTML = strSyn;
}

function findTerm(strSyn, ichPos, strTerm)
{
	var ichMatch = strSyn.indexOf(strTerm, ichPos);
	while (ichMatch >= 0)
	{
		var prev = (ichMatch == 0) ? '\0' : strSyn.charAt(ichMatch - 1);
		var next = strSyn.charAt(ichMatch + strTerm.length);
		if (!isalnum(prev) && !isalnum(next) && !isInTag(strSyn, ichMatch))
		{
			var ichComment = strSyn.indexOf("/*", ichPos);
			while (ichComment >= 0)
			{
				if (ichComment > ichMatch)
				{
					ichComment = -1;
					break; 
				}
				var ichEnd = strSyn.indexOf("*/", ichComment);
				if (ichEnd < 0 || ichEnd > ichMatch)
					break;
				ichComment = strSyn.indexOf("/*", ichEnd);
			}
			if (ichComment < 0)
			{
				ichComment = strSyn.indexOf("//", ichPos);
				while (ichComment >= 0)
				{
					if (ichComment > ichMatch)
					{
						ichComment = -1;
						break; 
					}
					var ichEnd = strSyn.indexOf("\n", ichComment);
					if (ichEnd < 0 || ichEnd > ichMatch)
						break;
					ichComment = strSyn.indexOf("//", ichEnd);
				}
			}
			if (ichComment < 0)
				break;
		}
		ichMatch = strSyn.indexOf(strTerm, ichMatch + strTerm.length);
	}
	return ichMatch;
}

function isInTag(strHtml, ichPos)
{
	return strHtml.lastIndexOf('<', ichPos) >
		strHtml.lastIndexOf('>', ichPos);
}

function isalnum(ch)
{
	return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || (ch == '_'));
}

function showTip(link)
{
	bodyOnClick();

	var tip = document.all.reftip;
	if (!tip || !link)
		return;

	window.event.returnValue = false;
	window.event.cancelBubble = true;

	// Hide the tip if necessary and initialize its size.
	tip.style.visibility = "hidden";
	tip.style.pixelWidth = 260;
	tip.style.pixelHeight = 24;

	// Find the link target.
	var term = null;
	var def = null;
	var DLs = document.all.tags("DL");
	for (var iDL = 0; iDL < DLs.length; iDL++)
	{
		if (DLs[iDL].sourceIndex > link.sourceIndex)
		{
			var dl = DLs[iDL];
			var iMax = dl.children.length - 1;
			for (var iElem = 0; iElem < iMax; iElem++)
			{
				var dt = dl.children[iElem];
				if (dt.tagName == "DT" && dt.style.display != "none")
				{
					if (findTerm(dt.innerText, 0, link.innerText) >= 0)
					{
						var dd = dl.children[iElem + 1];
						if (dd.tagName == "DD")
						{
							term = dt;
							def = dd;
						}
						break;
					}
				}
			}
			break;
		}
	}

	if (def)
	{
		window.linkElement = link;
		window.linkTarget = term;
		tip.innerHTML = '<dl><dt>' + term.innerHTML + '</dt><dd>' + def.innerHTML + '</dd></dl>';
		window.setTimeout("moveTip()", 0);
	}
}

function moveTip()
{
	var tip = document.all.reftip;
	var link = window.linkElement;
	if (!tip || !link)
		return; //error

	var w = tip.offsetWidth;
	var h = tip.offsetHeight;

	if (w > tip.style.pixelWidth)
	{
		tip.style.pixelWidth = w;
		window.setTimeout("moveTip()", 0);
		return;
	}

	var maxw = document.body.clientWidth;
	var maxh = document.body.clientHeight;

	if (h > maxh)
	{
		if (w < maxw)
		{
			w = w * 3 / 2;
			tip.style.pixelWidth = (w < maxw) ? w : maxw;
			window.setTimeout("moveTip()", 0);
			return;
		}
	}

	var x,y;

	var linkLeft = link.offsetLeft - document.body.scrollLeft;
	var linkRight = linkLeft + link.offsetWidth;

	var linkTop = link.offsetTop - document.body.scrollTop;
	var linkBottom = linkTop + link.offsetHeight;

	var cxMin = link.offsetWidth - 24;
	if (cxMin < 16)
		cxMin = 16;

	if (linkLeft + cxMin + w <= maxw)
	{
		x = maxw - w;
		if (x > linkRight + 8)
			x = linkRight + 8;
		y = maxh - h;
		if (y > linkTop)
			y = linkTop;
	}
	else if (linkBottom + h <= maxh)
	{
		x = maxw - w;
		if (x < 0)
			x = 0;
		y = linkBottom;
	}
	else if (w <= linkRight - cxMin)
	{
		x = linkLeft - w - 8;
		if (x < 0)
			x = 0;
		y = maxh - h;
		if (y > linkTop)
			y = linkTop;
	}
	else if (h <= linkTop)
	{
		x = maxw - w;
		if (x < 0)
			x = 0;
		y = linkTop - h;
	}
	else if (w >= maxw)
	{
		x = 0;
		y = linkBottom;
	}
	else
	{
		w = w * 3 / 2;
		tip.style.pixelWidth = (w < maxw) ? w : maxw;
		window.setTimeout("moveTip()", 0);
		return;
	}

	link.style.background = "#FFFF80";
	tip.style.pixelLeft = x + document.body.scrollLeft;
	tip.style.pixelTop = y + document.body.scrollTop;
	tip.style.visibility = "visible";
}

function hideTip()
{
	if (window.linkElement)
	{
		window.linkElement.style.background = "";
		window.linkElement = null;
	}

	var tip = document.all.reftip;
	if (tip)
	{
		tip.style.visibility = "hidden";
		tip.innerHTML = "";
	}
}

function beginsWith(s1, s2)
{
	// Does s1 begin with s2?
	return s1.substring(0, s2.length) == s2;
}

//
// See Also popups
//
function initSeeAlso()
{
	// Localizable strings
	var L_See_Also = "لمزيد من المعلومات";
	var L_Requirements = "المتطلبات";
	var L_System_Requirements = "متطلبات النظام";
	var L_QuickInfo = "معلومات سريعة";
	var L_Keywords = "المصطلحات المستخدمة";
	var L_Back_To_Main = "عودة إلى الصفحة الرئيسية";

	var hdr = document.all.hdr;
	if (!hdr)
		return;

	var divS = new String;
	var divR = new String;
	var divK = new String;

	var heads = document.all.tags("H3");
	if (heads)
	{
		for (var i = 0; i < heads.length; i++)
		{
			var head = heads[i];
			var txt = head.innerText;
			if (beginsWith(txt, L_See_Also))
			{
				divS += head.outerHTML;
				var next = getNext(head);
				while (next && !next.tagName.match(/^(H[1-4]|DIV)$/)) {
					divS += next.outerHTML;
					next = getNext(next);
				}
			}
			else if (beginsWith(txt, L_Requirements) || beginsWith(txt, L_QuickInfo) || beginsWith(txt, L_System_Requirements))
			{
				divR += head.outerHTML;
				var next = getNext(head);
				while (next && !next.tagName.match(/^(H[1-4]|DIV)$/)) {
					divR += next.outerHTML;
					next = getNext(next);
				}
			}
			else if (beginsWith(txt, L_Keywords))
			{
				divK += head.outerHTML;
				var next = getNext(head);
				while (next && !next.tagName.match(/^(H[1-4]|DIV)$/))
				{
					divK += next.outerHTML;
					next = getNext(next);
				}
			}
		}
	}	// if (heads)

	// H4 Headers
	heads = document.all.tags("H4");
	if (heads) {
		for (var i = 0; i < heads.length; i++)
		{
			var head = heads[i];
			var txt = head.innerText;
			if (beginsWith(txt, L_See_Also))
			{
				divS += head.outerHTML;
				var next = getNext(head);
				while (next && !next.tagName.match(/^(H[1-4]|DIV)$/))
				{
					divS += next.outerHTML;
					next = getNext(next);
				}
			}
			else if (beginsWith(txt, L_Requirements) || beginsWith(txt, L_QuickInfo) || beginsWith(txt, L_System_Requirements))
			{
				divR += head.outerHTML;
				var next = getNext(head);
				while (next && !next.tagName.match(/^(H[1-4]|DIV)$/)) {
					divR += next.outerHTML;
					next = getNext(next);
				}
			}
			else if (beginsWith(txt, L_Keywords))
			{
				divK += head.outerHTML;
				var next = getNext(head);
				while (next && !next.tagName.match(/^(H[1-4]|DIV)$/))
				{
					divK += next.outerHTML;
					next = getNext(next);
				}
			}
		}
	}

	var pos = getNext(hdr.parentElement);
	if (pos)
	{
		if (divR != "")
		{
			divR = '<DIV ID=rpop CLASS=sapop>' + divR + '</DIV>';
			var td = hdr.insertCell(0);
			if (td)
			{
				td.className = "button1";
				td.style.width = "19px";
				td.onclick = showRequirements;
				td.innerHTML = '<img src="images/images_requirements.gif" alt="' + L_Requirements + '" border=0>';
				document.body.insertAdjacentHTML('BeforeEnd', divR);
			}
		}
		if (divS != "")
		{
			divS = '<DIV ID=sapop CLASS=sapop>' + divS + '</DIV>';
			var td = hdr.insertCell(0);
			if (td)
			{
				td.className = "button1";
				td.style.width = "19px";
				td.onclick = showSeeAlso;
				td.innerHTML = '<img src="images/images_seealso.gif" alt="' + L_See_Also + '" border=0>';
				document.body.insertAdjacentHTML('BeforeEnd', divS);
			}
		}
		if (divK != "")
		{
			divK = '<DIV ID=kpop CLASS=sapop>' + divK + '</DIV>';
			var td = hdr.insertCell(0);
			if (td) {
				td.className = "button1";
				td.style.width = "19px";
				td.onclick = showKeywords;
				td.innerHTML = '<img src="images/images_keywords.gif" alt="' + L_Keywords + '" border=0>';
				document.body.insertAdjacentHTML('BeforeEnd', divK);
			}
		}
	}

	// Back button
	var td = hdr.insertCell(0);
	if (td)
	{
		td.className = "button1";
		td.style.width = "19px";
		td.style.height = "22px";
		td.onclick = backToMain;
		td.innerHTML = '<img src="images/images_back.gif" alt="' + L_Back_To_Main + '" border=0>';
	}
}

function showSeeAlso()
{
	bodyOnClick();

	window.event.returnValue = false;
	window.event.cancelBubble = true;

	var div = document.all.sapop;
	var lnk = window.event.srcElement;

	if (div && lnk) {
		div.style.pixelTop = lnk.offsetTop + lnk.offsetHeight;
		div.style.visibility = "visible";
	}
}

function showRequirements()
{
	bodyOnClick();

	window.event.returnValue = false;
	window.event.cancelBubble = true;

	var div = document.all.rpop;
	var lnk = window.event.srcElement;

	if (div && lnk) {
		div.style.pixelTop = lnk.offsetTop + lnk.offsetHeight;
		div.style.visibility = "visible";
	}
}

function showKeywords()
{
	bodyOnClick();
	
	window.event.returnValue = false;
	window.event.cancelBubble = true;

	var div = document.all.kpop;
	var lnk = window.event.srcElement;

	if (div && lnk) {
		div.style.pixelTop = lnk.offsetTop + lnk.offsetHeight;
		div.style.visibility = "visible";
	}
}

function hideSeeAlso()
{
	var div = document.all.sapop;
	if (div)
		div.style.visibility = "hidden";

	var div = document.all.rpop;
	if (div)
		div.style.visibility = "hidden";
		
	var div = document.all.kpop;
	if (div)
		div.style.visibility = "hidden";
}

function backToMain()
{
	window.top.navigate("http://www.agdn-online.com/default.aspx?view=articles");
}