﻿/////////////////////////////////////////////////
//		HANZI DETAIL			//
/////////////////////////////////////////////////

function HZ (nChar)
{
	gShowHanzi (nChar);
}

function gShowHanzi (nChar)
{
	// Clear perfs
	gPerfsClear ();
	
	// Set the layout if not done
	gCheckLayout ();
	
	// debug
	JSetHeaderHeight ('frameInfo', '90px');
	
	// Set the info page
	JmvcSetPage ('frameInfo', 'hanzi');
	
	// Clear local data
	top.nHanzi		= nChar;
	top.oHanziBase	= null;
	top.oHanziDict	= null;
	
	// debug
	top.nNumPages	= 0;
	top.iCurrentPage	= 0;
	
	// Update display for loader
	top.bHanziChanged = true;
	JmvcUpdateAllViews ();
	
	// Load data
	gLoadData ('char_base.php', OnHanziBase, 'get', "id=" + nChar);
	gLoadData ('char_dict.php', OnHanziDict, 'get', "lang=" + top.sLangTarget + "&dict=" + top.sDict + "&id=" + nChar);
}

// debug
function gSetCurrentPage (iPage)
{
	// Update current page number
	top.iCurrentPage = iPage;
	
	// Update display
	top.bHanziChanged = true;
	JmvcUpdateAllViews ();
}

function OnHanziBase (url, transport)
{
	// Update local data
	top.oHanziBase = transport.responseXML.documentElement;
	
	// Check if the reference character is obviously simplified or traditional; if yes, update the display mode
	var c = top.oHanziBase.getElementsByTagName('i')[0].getAttribute('c');
	if (hzIsSimplifiedVariant(c))
		gSetSimplified (true);
	else if (hzIsTraditionalVariant(c))
		gSetSimplified (false);
	
	// Update display only when all data are available
	if (top.oHanziBase && top.oHanziDict)
	{
		top.bHanziChanged = true;
		JmvcUpdateAllViews ();
	}
}

function hzIsTraditionalVariant (c)
{
	// Get the list of simplified variants; if none: no decision
	var eListSimp = top.oHanziBase.getElementsByTagName('kS');
	if (eListSimp.length == 0)
		return false;
	
	// If one of them is the same as the reference character: no decision
	for (var i = 0; i <eListSimp.length; i++)
		if (eListSimp[i].getAttribute('c') == c)
			return false;
	
	// (else) Yes, it is a traditional variant
	return true;
}

function hzIsSimplifiedVariant (c)
{
	// Get the list of traditional variants; if none: no decision
	var eListTrad = top.oHanziBase.getElementsByTagName('kT');
	if (eListTrad.length == 0)
		return false;
	
	// If one of them is the same as the reference character: no decision
	for (var i = 0; i <eListTrad.length; i++)
		if (eListTrad[i].getAttribute('c') == c)
			return false;
	
	// (else) Yes, it is a simplified variant
	return true;
}

function OnHanziDict (url, transport)
{
	// Time stamp
	gPerfsResponse (transport.responseText.length);
	
	// Update local data
	top.oHanziDict = transport.responseXML.documentElement;
	
	// Get the total number of entries on each side
	var eListPos = top.oHanziDict.getElementsByTagName('pos');
	for (var i = 1, nPosLeft = 0, nPosRight = 0; i < eListPos.length; i++)
	{
		var ePos = eListPos [i];
		
		if (ePos.getAttribute('i') == 0)
			nPosLeft += ePos.getElementsByTagName('e').length;
		else
			nPosRight += ePos.getElementsByTagName('e').length;
	}
	
	// Get the number of pages
	top.nNumPages = Math.floor (((nPosRight > nPosLeft ? nPosRight : nPosLeft) + top.nEntriesPerPage - 1)/ top.nEntriesPerPage);
	top.iCurrentPage = 1;
	
	// Show perfs
	gPerfsShow ();		// Plus tard avec top.bPerfsChanged ?
	
	// Update display
	if (top.oHanziBase && top.oHanziDict)
	{
		top.bHanziChanged = true;
		JmvcUpdateAllViews ();
	}
}

function OnWriteHanzi (view, page)
{
	// Ignore if Hanzi flag or variant flag not set
	if (!(top.bHanziChanged || top.bSimplifiedChanged))
		return;
	
	// If ALL data not yet available, set loader
	// Note: avoid partial update because of a display issue with Internet Explorer
	if (!(top.oHanziBase  &&  top.oHanziDict))
	{
		JGetFrameHeader(view).innerHTML = gGetHanziBaseLoader ();
		JGetFrameContent(view).innerHTML = "";
		return;
	}
	
	// Except for variant flag, reset scrolling (does not work with Firefox)
	if (!top.bSimplifiedChanged)
		JGetFrameContent(view).scrollTop = 0;
	
	// Write header and content
	HanziWriteHeader (view);
	HanziWriteContent (view);
}

function HanziWriteHeader (view)
{
	var buf = new StringBuffer ();
	
	buf.append ("<table style='width:100%; height:100%;'><tr><td>");
	buf.append (gGetHanziBaseUnihan (top.oHanziBase.getElementsByTagName('i')[0]));
	buf.append ("</td><td style='width:250px;'><table style='width:100%; height:100%;'><tr style='height:30px;'><td><table style='width:100%; height:100%;'><tr><td class='serBack' style='text-align:right; vertical-align:bottom;'>");
	if (top.oParsedText)
	{
		if (top.oParsedText)
		{
			buf.append ("</td><td class='serBack'><a href='javascript:gSetMainList();'>Main list</a>");
			if (top.sLangSource == 'cn')
				buf.append ("</td><td class='serBack'><a href='javascript:gSetSimplTradList();'>Simpl/trad. list</a>");
		}
	}
	buf.append ("</tr></table></td></tr><tr>");
	
	buf.append ("</tr><tr style='height:30px;'><td id='divNumPages'>");
	buf.append (gGetListPages());
	buf.append ("</td></tr></table></td></tr></table>");
	
	JGetFrameHeader(view).innerHTML = buf.toString ();
}


function gGetListPages ()
{
	// debug
	var iPage = top.iCurrentPage;
	var nPages = top.nNumPages;
	
	var buf = new StringBuffer ();
	buf.append ("<table style='width:100%; height:100%;'><tr>");
	
	// Prev
	if (nPages < 2)							buf.append ("<td  class='serPrev'>&nbsp;</td>");
	else if (top.iCurrentPage > 1)				buf.append ("<td  class='serPrev'><a href='javascript:gSetCurrentPage(" + (top.iCurrentPage - 1) + ");'>Prev</a></td>");
	else									buf.append ("<td  class='serPrev'>Prev</td>");
	
	// 7 numeric positions
	for (var i = 1;  i <= 7;  i++)
	{
		switch (i)
		{
		case 1:
			if (nPages < 2)					buf.append ("<td  class='serOther'>&nbsp;</td>");
			else if (i == top.iCurrentPage)		buf.append ("<td  class='serCurrent'>1</td>");
			else							buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(1);' >1</a></td>");
			break;
		
		case 2:
			if (nPages < 2)					buf.append ("<td  class='serOther'>&nbsp;</td>");
			else if (iPage == 2)				buf.append ("<td  class='serCurrent'>2</td>");
			else
			{
				if (nPages > 7  &&  iPage > 4)	buf.append ("<td  class='serOther'>-</td>");
				else						buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(2);'>2</a></td>");
			}
			break;
		
		case 3:
			if (nPages < 3)					buf.append ("<td  class='serOther'>&nbsp;</td>");
			else if (nPages <= 7)
			{
				if (iPage == i)				buf.append ("<td  class='serCurrent'>3</td>");
				else						buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(3);' >3</a></td>");
			}
			else	// nPages > 7
			{
				if (iPage < 3)				buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(3);' >3</a></td>");
				else if (iPage == 3)			buf.append ("<td  class='serCurrent'>3</td>");
				else if (iPage >= nPages-3)		buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(" + (nPages-4)+ ");'>" + (nPages-4) + "</a></td>");
				else						buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(" + (iPage-1) + ");'>" + (iPage-1) + "</a></td>");
			}
			break;
			
		case 4:
			if (nPages < i)					buf.append ("<td  class='serOther'>&nbsp;</td>");
			else if (nPages <= 7)
			{
				if (iPage == 4)				buf.append ("<td  class='serCurrent'>4</td>");
				else						buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(4);'>4</a></td>");
			}
			else	// nPages > 7
			{
				if (iPage < 4)				buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(4);'>4</a></td>");
				else if (iPage >= nPages-2)		buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(" + (nPages-3)+ ");'>" + (nPages-3) + "</a></td>");
				else						buf.append ("<td  class='serCurrent'>" + iPage + "</td>");
			}
			break;
			
		case 5:
			if (nPages < 5)					buf.append ("<td  class='serOther'>&nbsp;</td>");
			else if (nPages <= 7)
			{
				if (iPage == 5)				buf.append ("<td  class='serCurrent'>5</td>");
				else						buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(5);'>5</a></td>");
			}
			else	// nPages > 7
			{
				if (iPage == nPages-2)			buf.append ("<td  class='serCurrent'>" + (nPages-2)  + "</td>");
				else if (iPage >= nPages-3)		buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(" + (nPages-2) + ");'>" + (nPages-2) + "</a></td>");
				else if (iPage < 5)			buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(5);'>5</a></td>");
				else						buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(" + (iPage+1) + ");'>" + (iPage+1) + "</a></td>");
			}
			break;
			
		case 6:
			if (nPages < 6)					buf.append ("<td  class='serOther'>&nbsp;</td>");
			else if (nPages <= 7)
			{
				if (iPage == 6)				buf.append ("<td  class='serCurrent'>6</td>");
				else						buf.append ("<td  class='serother'><a href='javascript:gSetCurrentPage(6);'>6</a></td>");
			}
			else	// nPages > 7
			{
				if (iPage == nPages -1)		buf.append ("<td  class='serCurrent'>" + (nPages-1)  + "</td>");
				else if (iPage >= nPages-3)		buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(" + (nPages-1) + ");'>" + (nPages-1) + "</a></td>");
				else						buf.append ("<td  class='serOther'>-</td>");
			}
			break;
			
		case 7:
			if (nPages < 7)					buf.append ("<td  class='serOther'>&nbsp;</td>");
			else if (top.iCurrentPage == nPages)	buf.append ("<td  class='serCurrent'>" + nPages + "</td>");
			else							buf.append ("<td  class='serOther'><a href='javascript:gSetCurrentPage(" + nPages + ");'>" + nPages + "</a></td>");
			break;
			
		default:
			break;
		}
	}
	
	// Next
	if (nPages < 2)							buf.append ("<td  class='serNext'>&nbsp;</td>");
	else if (top.iCurrentPage < top.nNumPages)		buf.append ("<td  class='serNext'><a href='javascript:gSetCurrentPage(" + (top.iCurrentPage+1) + ");' >Next</a></td>");
	else									buf.append ("<td  class='serNext'>Next</td>");
	
	buf.append ("</tr></table>");
	
	return buf.toString();
}

function HanziWriteContent (view)
{
	// Detect Safari for a problem with line folding
	var bSafari = (navigator.userAgent.toLowerCase().indexOf('safari') >= 0) ? true : false;

	// Get the current entry range
	var nMin = (top.iCurrentPage - 1) * top.nEntriesPerPage;
	var nMax = top.iCurrentPage * top.nEntriesPerPage - 1;
	
	var bufLeft = new StringBuffer ();
	var bufRight = new StringBuffer ();
	var nLeft = 0;
	var nRight = 0;
	var bDone = false;
	
	// Scan all positions
	var eListPos = top.oHanziDict.getElementsByTagName('pos');
	for (var i = 0; i < eListPos.length; i++)
	{
		var ePos = eListPos [i];
		var iPos = parseInt (ePos.getAttribute ('i')) + 1;
		
		// Position 1 on the left, other positions on the right
		var bLeft = (iPos == 1 ? true : false);
		var bRight = !bLeft;
		var buf = (bLeft ? bufLeft : bufRight);
		
		// Scan all positions
		for (var j = 0, bPosDone = false; j < ePos.getElementsByTagName('e').length; j++)
		{
			// Break if finished on both sides
			if (nLeft > nMax  &&  nRight > nMax)
			{
				bDone = true;
				break;
			}
			
			// If the entry is in the current range
			if ((bLeft  &&  nLeft>=nMin  &&  nLeft<=nMax)  ||  (bRight  &&  nRight>=nMin  &&  nRight<=nMax))
			{
				// On the right side
				if (iPos > 1)
				{
					// First position entry: show position
					if (j == 0)
					{
						buf.append ("<tr><td class='dicHeader' colspan='2'>Position " + (iPos) + "</td><td></td></tr>");
						bPosDone = true;
					}
					
					// First entry in a new page, position unchanged: remind current position
					if (!bPosDone)
					{
						buf.append ("<tr><td class='dicHeader' colspan='2'>(position " + (iPos) + ")</td><td></td></tr>");
						bPosDone = true;
					}
				}
				
				// Get word
				var eWord = ePos.getElementsByTagName ('e')[j];
				
				// Write entry...
				buf.append("<tr>");
				
				// (1) DDB ref if any
				if (top.sDict == 'ddb')
				{
					var sRefDdb = eWord.getAttribute('x');
					buf.append("<td class='tdXref'><a class='aXref' href=\"http://www.buddhism-dict.net/cgi-bin/xpr-ddb.pl?"
						+ sRefDdb + "\" target='_blank' title=\"non-members can log in with 'guest'\")>DDB</a></td>");
				}
				
				// (2) Chinese with pronunciation (infotip)
				buf.append ("<td" + top.sCLang + " class='dicChinese zh' title='" + eWord.getAttribute('p') + "' style='width:35%;'>");
				var sChinese = top.bSimplified ? eWord.getAttribute ('s') : eWord.getAttribute ('t');
				
				// debug
				if (top.bWordMode)
				{
					buf.append ("<a class='dicChinese' href=\"javascript:W('" + sChinese + "');\">" + sChinese + "</a>");
				}
				
				else
				{
					for (k = 0; k < sChinese.length; k++)
					{
						var hz	= sChinese.charAt (k);
						var nChar	= hz.charCodeAt (0);
						if (nChar >= 0x3400  &&  nChar <= 0x9FAF)
							buf.append ("<a class='dicChinese' href='javascript:HZ(" + hz.charCodeAt(0) + ");'>" + hz + "</a>");
						else
							buf.append ("<span" + top.sCLang + " class='dicChinese zh'>" + hz + "</span>");
						if (bSafari)
							buf.append ("<span style='font-size:2px;'> </span>");
					}
				}
				
				// (3) Definition
				var sDefinition = eWord.getAttribute('d');
				
				// First word of the definition too long: cut it to protect display; put full definition into a title				
				var nLen = sDefinition.length;
				var nPosBlank = 0;
				if (nLen > 40)
					nPosBlank = sDefinition.indexOf (" ");
				
				if (nPosBlank < 40)
					buf.append ("</td><td class='dicMeaning'>" + sDefinition + "</td></tr>");
				else
					buf.append ("</td><td class='dicMeaning' title='" + sDefinition + "' style='background:lightyellow; color:darkslategray;'>" + sDefinition.substr(0, 40) + "...</td></tr>");
				
			}
			
			// Update entry counts
			if (bLeft)		nLeft++;
			else			nRight++;
		}
		
		// Break if finished
		if (bDone)
			break;
	}
	
	
	var s1 = bufLeft.toString ();
	var s2 = bufRight.toString ();
	var sText;
	if (s1.length ||  s2.length)
	{
		sText = "<table style='width:100%;'><tr><td style='width:50%; vertical-align:top;'><table>"	// debug WIDTH: voir ListWords
			+ s1
			+ "</table></td><td style='width:50%; vertical-align:top; border:'><table>"
			+ s2
			+ "</table></td></tr></table>";
	}
	else
		sText = "(none)";
	
	// Get  XiTi page
	var sXiti;
	if (top.sLangSource == 'cn')		sXiti = (top.bSimplified ? "cs" : "ct");
	else						sXiti = top.sLangSource + "";
	sXiti += "_char_";
	switch (top.sDict)
	{
	case 'ddb':
	case 'soothill':
	case 'stardict':		sXiti += top.sDict;		break;
	default:			sXiti += top.sLangTarget;	break;
	}
	
	// Write the final string
	var bufAll = new StringBuffer ();
	
	bufAll.append ("<div id='divPageHanzi'>");
	bufAll.append (gGetHanziBaseWieger (top.oHanziBase.getElementsByTagName('i')[0]));
	bufAll.append ("<div class='hd1'>Dictionary");
	if (top.nNumPages > 1)
		bufAll.append (" <span style='font-size:8pt;'>" + top.iCurrentPage + "/" + top.nNumPages+ "</span>");
	bufAll.append ("</div>");
	bufAll.append (sText );
	bufAll.append (gXitiAjax (sXiti));
	bufAll.append ("</div>");
	
	JGetFrameContent(view).innerHTML = bufAll.toString();
}

function gGetHanziBaseLoader ()
{
	var nChar = top.nHanzi;
	
	return ("<table><tr>"
		+ "<td style='padding-right:30px;'><span" + top.sCLang + " class='bigChar zh'>&#" + nChar + ";</span></td>"
		
		+ "<td><table style='background:white; border:whitesmoke solid 2px;'><tr>"
		
		+ "<td style='padding-left:1em;'><img src='pictures/ajax-loader1.gif' /></td><td style='font-size:12pt; padding-left:1em; padding-right:1em;'>Loading...</td>"
		
		+ "</tr></table></td>"
		
		+ "</tr></table>");
}

function gGetHanziBase (eCharInfo)
{
	var buf = new StringBuffer ();
	
	// Header
	buf.append (gGetHanziBaseUnihan (eCharInfo));
	
	// Wieger
	var sWieger = gGetHanziBaseWieger (eCharInfo);
	
	buf.append (sWieger ? ("<span class='wieger'>" + sWieger + "</span>")  :  "<span class='gray'>(none)</span>");
	
	return buf;
}

function gGetHanziBaseUnihan (eCharInfo)
{
	var c = eCharInfo.getAttribute ('c');
	// var sMandarin = eCharInfo.getAttribute ('kM');
	var sKDefinition = eCharInfo.getAttribute ('kD');
	var sKRSKangxi = eCharInfo.getAttribute ('kX');
		
	var buf = new StringBuffer ();
	
	// HEADER
	
	// debug
	buf.append ("<table style='height:48pt;'>");
	buf.append ("<tr>");
	buf.append ("<td style='padding-right:30px;'>");
	
	// buf.append ("<div lang='zh' class='bigChar zh'>");
	buf.append ("<div" + top.sCLang + " class='bigChar zh'>");
	
	buf.append ("<a href='javascript:HZ(" + c.charCodeAt(0) + ");' style='color:green; text-decoration:none;'>" + c + "</a>");
	
	buf.append ("<span style='color:gray;'>");
	
	var bDone = false;
	for (var i = 0; i < eCharInfo.getElementsByTagName ('kT').length; i++)
	{
		if (bDone)
			buf.append (", ")
		else
			buf.append ("<span style='padding-left:20px;'>(</span>");
		
		var cT = eCharInfo.getElementsByTagName ('kT')[i].getAttribute('c');
		buf.append ("<a href='javascript:HZ(" + cT.charCodeAt(0) + ");' style='color:gray; text-decoration:none;' title='Traditional variant'>" + cT + "</a>");
		bDone = true;
	}
		
	for (var i = 0; i < eCharInfo.getElementsByTagName ('kS').length; i++)
	{
		if (bDone)
			buf.append (", ");
		else
			buf.append ("<span style='padding-left:20px;'>(</span>");
		var cS = eCharInfo.getElementsByTagName ('kS')[i].getAttribute('c');
		buf.append ("<a href='javascript:HZ(" + cS.charCodeAt(0) + ");' style='color:gray; text-decoration:none;' title='Simplified variant'>" + cS + "</a>");
		bDone = true;
	}
	if (bDone)
		buf.append (")");
	
	buf.append ("</span>");
	
	buf.append ("</div>");
	
	// debug
	
	buf.append ("</td><td>");
	buf.append ("<table style='height:100%;'>");
	
	if (top.sLangSource == "cn")
	{
		var sMandarin = eCharInfo.getAttribute ('kM');
		buf.append ("<tr><td style='vertical-align:bottom;'><span class='popKM' title='Pinyin pronunciation(s) as provided by the Unicode Consortium'>"
			+ (sMandarin ? sMandarin : "&nbsp;") + "</span></td></tr>");
	}
	else if (top.sLangSource == "jp")
	{
		var sKunYomi = eCharInfo.getAttribute ('kJ');
		var sOnYomi = eCharInfo.getAttribute ('kO');
		buf.append ("<tr><td style='vertical-align:bottom;'>"
			+ (sKunYomi ? ("<span class='popKM' title='Kun&#39;yomi pronunciation as provided by the Unicode Consortium'>" + sKunYomi + "</span>") : "&nbsp;")
			+ (sKunYomi ? ("<span class='popKM' title='On&#39;yomi pronunciation as provided by the Unicode Consortium'> (" + sOnYomi + ")</span>") : "&nbsp;")
			+ "</td></tr>");
	}
	
	// debug
	buf.append ("<tr><td title='Radical and number of additional strokes as provided by the Unicode Consortium'>");
	if (sKRSKangxi)
		buf.append ("<a href='javascript:KXRS(" + sKRSKangxi
			+ ");' class='popKX' style='text-decoration:none;'>"
			+ (top.sLangSource == 'cn' ? "Kangxi" : "Radical")
			
			// + " <span lang='zh' class='zh' style='font-size:larger;'>" + gKey2Uni (parseInt (sKRSKangxi))
			+ " <span" + top.sCLang + " class='zh' style='font-size:larger;'>" + gKey2Uni (parseInt (sKRSKangxi))
			
			+ "</span> <span >(" + sKRSKangxi + ")</span></a>");
			
	buf.append ("<span class='popUnicode' title='Unique character code allocated by the Unicode Consortium'>Unicode U+"+ c.charCodeAt(0).toString(16).toUpperCase() + "</span></td></tr>");

	buf.append ("<tr><td style='vertical-align:top;'><span class='popKD' title='Character Definition by the Unicode Consortium'>" + (sKDefinition ? sKDefinition : "&nbsp;") + "</span></td></tr>");
	
	buf.append ("</table></td></tr>");
	
	buf.append ("</table>");
	
	return buf;
}

function gGetHanziBaseWieger (eCharInfo)
{
	var buf = new StringBuffer ();
	var buf2 = new StringBuffer ();
	
	buf2.append (hzGetWiegerLine (eCharInfo));
	
	// Idem, en dehors
	var eListTrads = eCharInfo.getElementsByTagName ('kT');
	for (var j = 0; j < eListTrads.length; j++)
		buf2.append (hzGetWiegerLine (eListTrads[j], eListTrads[j].getAttribute('c')));
	
	sWieger = buf2.toString ();
	
	buf.append ("<div class='hd1'>Wieger</div>");
	buf.append (sWieger ? ("<span class='wieger'>" + sWieger + "</span>")  :  "<span class='gray'>(none)</span>");
	
	return buf;
}

function hzGetWiegerLine (eChar, bVariant)
{
	var buf = new StringBuffer ();
	
	var eListWieger = eChar.getElementsByTagName ('w');
	var bFirst = true;
	for (var i = 0; i < eListWieger.length; i++)
	{
		var eWieger= eListWieger[i];
		
		if (!bVariant  && eWieger.parentNode != eChar)
			continue;
			
		if (!bFirst)
			buf.append ("<span style='padding-left:15px; padding-right:15px;'><img src='pictures/circle09.gif'/></span>");
		bFirst = false;
			
		var nPhon = eWieger.getAttribute ('p');
		var nEtym = eWieger.getAttribute ('e');
		if (nPhon)
		{
			buf.append ("<a href='javascript:PS(" + nPhon + ");' class='popWieger' style='text-decoration:none;' title='Phonetic element'>Phonetic " + nPhon + "</a>");
			buf.append (" <span" + top.sCLang + " class='zh' title='Phonetic element'>" + eWieger.getAttribute ('c')
			
				+ "</span> <span class='popWieger' style='font-size:larger;'> » &nbsp;</span><a href='javascript:ES(" + nEtym + ");' class='popWieger' style='text-decoration:none;' title='Etymological lesson'>lesson "
				+ nEtym + " " + eWieger.getAttribute ('s') + "</a>");
		}
		
		else
			buf.append ("<a href='javascript:ES(" + nEtym + ");' class='popWieger' style='text-decoration:none;' title='Etymological lesson'>Lesson " + eWieger.getAttribute ('e') + " " + eWieger.getAttribute ('s') + "</a>");
	}
	
	var s = buf.toString();
	
	if (!s.length)
		return "";
	
	var bufReturn = new StringBuffer ();
	bufReturn.append ("<div>");
	
	if (bVariant)
		bufReturn.append ("<span" + top.sCLang + " class='zh' title='Traditional variant' style='padding-right:1em;'>" + eChar.getAttribute ('c') + "</span>");
	
	bufReturn.append (s);
	bufReturn.append ("</div>");
	
	return bufReturn.toString ();
}


