// copyright 2007-2010 GlobaLinguist, Inc.
////////////////////////////////////////////////////////////////////////////
// TO BE USED IN ISOLATION

////////////////////////////////////////////////////////////////////////////

var WORDCHAMP = new Object();

WORDCHAMP.isEditing = false;
WORDCHAMP.readerEnabled = true;
WORDCHAMP.fromID=-1;
WORDCHAMP.toID = -1;
WORDCHAMP.inTO = null;
WORDCHAMP.outTO = null;
WORDCHAMP.mouseTop = 0;
WORDCHAMP.mouseLeft = 0;
WORDCHAMP.searchID = 0;
WORDCHAMP.selected = null;
WORDCHAMP.selectedIdx = -1;
WORDCHAMP.selectionStart = -1;
WORDCHAMP.selectionEnd = -1;

WORDCHAMP.MENUWIDTH=300;

WORDCHAMP.host="www.wordchamp.com";
WORDCHAMP.base = "http://" + WORDCHAMP.host + "/lingua2/";

////////////////////////////////////////////////////////////////////////////
WORDCHAMP.readerLogID = -1;
WORDCHAMP.accessCode = null;

WORDCHAMP.showAll=false;

WORDCHAMP.tuples=null;

WORDCHAMP.hiliteList=new Array();

// request 
WORDCHAMP.maxAds=3;
WORDCHAMP.maxEntries=3;
WORDCHAMP.maxTranslations=8;
WORDCHAMP.wordIndex=0;

// resulting document structure
WORDCHAMP.targetDocument=null;
WORDCHAMP.contentDocument=null;
WORDCHAMP.contentWindow=null;
WORDCHAMP.mainDocument=null;

// audio player protocol
WORDCHAMP.AUDIO_PROTOCOL_FRAME=0;
WORDCHAMP.AUDIO_PROTOCOL_EMBED=1;
WORDCHAMP.audioProtocol=WORDCHAMP.AUDIO_PROTOCOL_FRAME;
WORDCHAMP.swfFileLocation=WORDCHAMP.base+"flash/linguapi.swf";
WORDCHAMP.AUDIO_FRAME_PROTOCOL_LOCATION=0;
WORDCHAMP.AUDIO_FRAME_PROTOCOL_HREF=1;
WORDCHAMP.AUDIO_FRAME_PROTOCOL_FRAME=2;
WORDCHAMP.audioFrameProtocol=WORDCHAMP.AUDIO_FRAME_PROTOCOL_LOCATION;

// extras
WORDCHAMP.showBanner=false;

////////////////////////////////////////////////////////////////////////////

WORDCHAMP.isMSIE=(navigator.userAgent.indexOf("MSIE")>=0);
WORDCHAMP.isSafari=(navigator.userAgent.indexOf("Safari")>=0); 
WORDCHAMP.isFirefox=(navigator.userAgent.indexOf("Firefox")>=0);

////////////////////////////////////////////////////////////////////////////

WORDCHAMP.unicodeBlock = new Object();
WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS = {lower:0x4E00,upper:0x9FBF};
WORDCHAMP.unicodeBlock.HIRAGANA = {lower:0x3040,upper:0x309F};
WORDCHAMP.unicodeBlock.CJK_COMPATIBILITY = {lower:0xF900,upper:0xFAFF};
WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A = {lower:0x3400,upper:0x4DBF};
WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B = {lower:0x20000,upper:0x2A6DF};
WORDCHAMP.unicodeBlock.KATAKANA = {lower:0x30A0,upper:0x30FF};
WORDCHAMP.unicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION = {lower:0x3000,upper:0x303F};
WORDCHAMP.unicodeBlock.of=function(charCode) {
	if (charCode >= WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS.lower && charCode <= WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS.upper) {
		return WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS;
	} else if (charCode >= WORDCHAMP.unicodeBlock.HIRAGANA.lower && charCode <= WORDCHAMP.unicodeBlock.HIRAGANA.upper) {
		return WORDCHAMP.unicodeBlock.HIRAGANA;
	} else if (charCode >= WORDCHAMP.unicodeBlock.CJK_COMPATIBILITY.lower && charCode <= WORDCHAMP.unicodeBlock.CJK_COMPATIBILITY.upper ) {
		return WORDCHAMP.unicodeBlock.CJK_COMPATIBILITY;
	} else if (charCode >= WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A.lower && charCode <= WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A.upper ) {
		return WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A;
	} else if (charCode >= WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B.lower && charCode <= WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B.upper ) {
		return WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B;
	} else if (charCode >= WORDCHAMP.unicodeBlock.KATAKANA.lower && charCode <= WORDCHAMP.unicodeBlock.KATAKANA.upper) {
		return WORDCHAMP.unicodeBlock.KATAKANA;
	} else if (charCode >= WORDCHAMP.unicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION.lower && charCode <= WORDCHAMP.unicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION.upper ) {
		return WORDCHAMP.unicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION;
	} else {
		return null; // currently unsupported.
	}
}

////////////////////////////////////////////////////////////////////////////

WORDCHAMP.wclanguages = [
{languageID:58 , name:"Afrikaans"},
{languageID:59 , name:"Albanian"},
{languageID:130 , name:"Amharic"},
{languageID:0 , name:"Arabic"},
{languageID:60 , name:"Armenian"},
{languageID:61 , name:"Assamese"},
{languageID:63 , name:"Aymara"},
{languageID:64 , name:"Azeri"},
{languageID:65 , name:"Baluchi"},
{languageID:66 , name:"Bashkir"},
{languageID:1 , name:"Basque"},
{languageID:2 , name:"Bengali"},
{languageID:67 , name:"Bhojpuri"},
{languageID:68 , name:"Bosnian"},
{languageID:69 , name:"Breton"},
{languageID:70 , name:"Brij"},
{languageID:3 , name:"Bulgarian"},
{languageID:4 , name:"Burmese"},
{languageID:71 , name:"Byelorussian"},
{languageID:6 , name:"Catalan"},
{languageID:72 , name:"Cherokee"},
{languageID:7 , name:"Chinese (Cantonese)"},
{languageID:8 , name:"Chinese (Mandarin)"},
{languageID:73 , name:"Creole"},
{languageID:74 , name:"Croatian"},
{languageID:10 , name:"Czech"},
{languageID:11 , name:"Danish"},
{languageID:75 , name:"Dari"},
{languageID:135 , name:"Dena'ina"},
{languageID:76 , name:"Dogri"},
{languageID:12 , name:"Dutch"},
{languageID:13 , name:"English"},
{languageID:116 , name:"Esperanto"},
{languageID:77 , name:"Estonian"},
{languageID:14 , name:"Farsi"},
{languageID:15 , name:"Finnish"},
{languageID:78 , name:"Flemish"},
{languageID:16 , name:"French"},
{languageID:79 , name:"Frisian"},
{languageID:90 , name:"Fur"},
{languageID:122 , name:"Gaelic"},
{languageID:81 , name:"Georgian"},
{languageID:17 , name:"German"},
{languageID:18 , name:"Greek"},
{languageID:82 , name:"Gujarati"},
{languageID:134 , name:"Gwich'in"},
{languageID:83 , name:"Hausa"},
{languageID:84 , name:"Hawaiian"},
{languageID:19 , name:"Hebrew"},
{languageID:20 , name:"Hindi"},
{languageID:85 , name:"Hmong"},
{languageID:21 , name:"Hungarian"},
{languageID:86 , name:"Icelandic"},
{languageID:87 , name:"Igbo"},
{languageID:22 , name:"Indonesian"},
{languageID:110 , name:"Interlingua"},
{languageID:23 , name:"Irish"},
{languageID:24 , name:"Italian"},
{languageID:132 , name:"Kinyarwanda"},
{languageID:25 , name:"Japanese"},
{languageID:88 , name:"Javanese"},
{languageID:89 , name:"Judeospanish"},
{languageID:91 , name:"Kannada"},
{languageID:92 , name:"Kannauji"},
{languageID:93 , name:"Kashmiri"},
{languageID:94 , name:"Kazakh"},
{languageID:5 , name:"Khmer"},
{languageID:26 , name:"Klingon"},
{languageID:96 , name:"Konkani"},
{languageID:27 , name:"Korean"},
{languageID:28 , name:"Kurdish"},
{languageID:97 , name:"Kyrgyz"},
{languageID:99 , name:"Lakota"},
{languageID:98 , name:"Laotian"},
{languageID:29 , name:"Latin"},
{languageID:9 , name:"Latvian"},
{languageID:30 , name:"Lithuanian"},
{languageID:100 , name:"Maithili"},
{languageID:101 , name:"Malagasy"},
{languageID:31 , name:"Malay"},
{languageID:102 , name:"Malayalam"},
{languageID:139 , name:"Maltese"},
{languageID:103 , name:"Manipuri"},
{languageID:104 , name:"Maori"},
{languageID:32 , name:"Marathi"},
{languageID:105 , name:"Mizo"},
{languageID:106 , name:"Mongolian"},
{languageID:107 , name:"Nepali"},
{languageID:33 , name:"Norwegian"},
{languageID:108 , name:"Oriya"},
{languageID:109 , name:"Papiamento"},
{languageID:34 , name:"Pashto"},
{languageID:35 , name:"Polish"},
{languageID:36 , name:"Portuguese"},
{languageID:37 , name:"Punjabi"},
{languageID:111 , name:"Quechua"},
{languageID:38 , name:"Romanian"},
{languageID:39 , name:"Russian"},
{languageID:40 , name:"Sanskrit"},
{languageID:41 , name:"Serbo-croatian"},
{languageID:114 , name:"Shona"},
{languageID:42 , name:"Sindhi"},
{languageID:43 , name:"Sinhalese"},
{languageID:44 , name:"Slovak"},
{languageID:115 , name:"Slovenian"},
{languageID:138 , name:"Somali"},
{languageID:112 , name:"Sotho"},
{languageID:45 , name:"Spanish"},
{languageID:46 , name:"Swahili"},
{languageID:117 , name:"Swazi"},
{languageID:47 , name:"Swedish"},
{languageID:48 , name:"Tagalog"},
{languageID:118 , name:"Taiwanese"},
{languageID:119 , name:"Tajik"},
{languageID:49 , name:"Tamil"},
{languageID:137 , name:"Tanana"},
{languageID:120 , name:"Tatar"},
{languageID:50 , name:"Telugu"},
{languageID:51 , name:"Thai"},
{languageID:52 , name:"Tibetan"},
{languageID:136 , name:"Tlingit"},
{languageID:121 , name:"Tsonga"},
{languageID:113 , name:"Tswana"},
{languageID:53 , name:"Turkish"},
{languageID:123 , name:"Turkmen"},
{languageID:124 , name:"Twi"},
{languageID:54 , name:"Ukrainian"},
{languageID:55 , name:"Urdu"},
{languageID:125 , name:"Uzbek"},
{languageID:126 , name:"Venda"},
{languageID:56 , name:"Vietnamese"},
{languageID:127 , name:"Welsh"},
{languageID:128 , name:"Xhosa"},
{languageID:57 , name:"Yiddish"},
{languageID:131 , name:"Yoruba"},
{languageID:133 , name:"Yup'ik"},
{languageID:129 , name:"Zulu"},
{languageID:62 , name:"Other"}
];


WORDCHAMP.languages = [ // 62 represents Other (unsupported)
{iso639:"aa",name:"Afar",languageID:62},
{iso639:"ab",name:"Abkhazian",languageID:62},
{iso639:"af",name:"Afrikaans",languageID:58},
{iso639:"am",name:"Amharic",languageID:130},
{iso639:"ar",name:"Arabic",languageID:0},
{iso639:"as",name:"Assamese",languageID:61},
{iso639:"ay",name:"Aymara",languageID:63},
{iso639:"az",name:["Azerbaijani","Azeri"],languageID:64},
	
{iso639:"ba",name:"Bashkir",languageID:66},
{iso639:"bal",name:"Baluchi",languageID:65},
{iso639:"be",name:"Byelorussian",languageID:71},
{iso639:"bg",name:"Bulgarian",languageID:3},
{iso639:"bh",name:["Bihari","Bhojpuri"],languageID:67},
{iso639:"bi",name:"Bislama",languageID:62},
{iso639:"bn",name:["Bengali","Bangla"],languageID:2},
{iso639:"bo",name:"Tibetan",languageID:52},
{iso639:"br",name:"Breton",languageID:69},
{iso639:"bra",name:["Brij","Braj"],languageID:70},
{iso639:"bs",name:"Bosnian",languageID:68},
	
{iso639:"ca",name:"Catalan",languageID:6},
{iso639:"chr",name:"Cherokee",languageID:72},
{iso639:"co",name:"Corsican",languageID:62},
{iso639:"cpe",name:"Creole",language:73}, // english creole?
{iso639:"cs",name:"Czech",languageID:10},
{iso639:"cy",name:"Welsh",languageID:127},
	
{iso639:"da",name:"Danish",languageID:11},
{iso639:"de",name:"German",languageID:17},
{iso639:"doi",name:"Dogri",languageID:76},
{iso639:"dz",name:"Bhutani",languageID:62},
	
{iso639:"el",name:"Greek",languageID:18},
{iso639:"en",name:"English",languageID:13},
{iso639:"eo",name:"Esperanto",languageID:116},
{iso639:"es",name:"Spanish",languageID:45},
{iso639:"et",name:"Estonian",languageID:77},
{iso639:"eu",name:"Basque",languageID:1},
	
{iso639:"fa",name:["Farsi","Persian"],languageID:14},
{iso639:"fi",name:"Finnish",languageID:15},
{iso639:"fj",name:"Fijian",languageID:62},
{iso639:"fo",name:"Faroese",languageID:62},
{iso639:"fr",name:"French",languageID:16},
{iso639:"fvr",name:"Fur",languageID:90},
{iso639:"fy",name:"Frisian",languageID:79},
	
{iso639:"ga",name:"Irish",languageID:23},
{iso639:"gd",name:["Gaelic","Scots gaelic"],languageID:122},
{iso639:"gl",name:"Galician",languageID:62},
{iso639:"gn",name:"Guarani",languageID:62},
{iso639:"gu",name:"Gujarati",languageID:82},
{iso639:"gwi",name:"Gwich'in",languageID:134},
	
{iso639:"ha",name:"Hausa",languageID:83},
{iso639:"haw",name:"Hawaiian",languageID:84},
{iso639:"he",name:"Hebrew",languageID:19},
{iso639:"hi",name:"Hindi",languageID:20},
{iso639:"hmn",name:"Hmong",languageID:85},
{iso639:"hr",name:"Croatian",languageID:74},
{iso639:"hu",name:"Hungarian",languageID:21},
{iso639:"hy",name:"Armenian",languageID:60},
	
{iso639:"ia",name:"Interlingua",languageID:110},
{iso639:"id",name:"Indonesian",languageID:22},
{iso639:"ig",name:"Igbo",languageID:87},
{iso639:"ik",name:"Kinyarwanda",languageID:132},
{iso639:"is",name:"Icelandic",languageID:86},
{iso639:"it",name:"Italian",languageID:24},
{iso639:"iu",name:"Inuktitut",languageID:62},
	
{iso639:"ja",name:"Japanese",languageID:25},
{iso639:"jw",name:"Javanese",languageID:88},
	
{iso639:"ka",name:"Georgian",languageID:81},
{iso639:"kk",name:"Kazakh",languageID:94},
{iso639:"kl",name:"Greenlandic",languageID:62},
{iso639:"km",name:["Khmer","Cambodian"],languageID:5},
{iso639:"kn",name:"Kannada",languageID:91},
{iso639:"ko",name:"Korean",languageID:27},
{iso639:"kok",name:"Konkani",languageID:96},
{iso639:"ks",name:"Kashmiri",languageID:93},
{iso639:"ku",name:"Kurdish",languageID:28},
{iso639:"ky",name:["Kirghiz","Kyrgyz"],languageID:97},
	
{iso639:"la",name:"Latin",languageID:29},
{iso639:"lad",name:["Ladino","Judeospanish"],languageID:89},
{iso639:"lkt",name:"Lakota",languageID:99},
{iso639:"ln",name:"Lingala",languageID:62},
{iso639:"lo",name:["Lao","Laotian"],languageID:98},
{iso639:"lt",name:"Lithuanian",languageID:30},
{iso639:"lus",name:["Lushai","Mizo"],languageID:105},
{iso639:"lv",name:["Latvian","Lettish"],languageID:9},

{iso639:"mai",name:"Maithili",languageID:100},
{iso639:"mg",name:"Malagasy",languageID:101},
{iso639:"mi",name:"Maori",languageID:104},
{iso639:"mk",name:"Macedonian",languageID:62},
{iso639:"ml",name:"Malayalam",languageID:102},
{iso639:"mn",name:"Mongolian",languageID:106},
{iso639:"mni",name:"Manipuri",languageID:103},
{iso639:"mo",name:"Moldavian",languageID:62},
{iso639:"mr",name:"Marathi",languageID:32},
{iso639:"ms",name:"Malay",languageID:31},
{iso639:"mt",name:"Maltese",languageID:139},
{iso639:"my",name:"Burmese",languageID:4},
	
{iso639:"na",name:"Nauru",languageID:62},
{iso639:"ne",name:"Nepali",languageID:107},
{iso639:"nl",name:"Dutch",languageID:12},
{iso639:"nld",name:"Flemish",languageID:78},
{iso639:"no",name:"Norwegian",languageID:33},
	
{iso639:"oc",name:"Occitan",languageID:62},
{iso639:"om",name:"Oromo",languageID:62},
{iso639:"or",name:"Oriya",languageID:108},
	
{iso639:"pa",name:"Punjabi",languageID:37},
{iso639:"pap",name:"Papiamento",languageID:109},
{iso639:"pl",name:"Polish",languageID:35},
{iso639:"ps",name:["Pashto","Pushto"],languageID:34},
{iso639:"pt",name:"Portuguese",languageID:36},
	
{iso639:"qu",name:"Quechua",languageID:111},
	
{iso639:"rm",name:"Rhaeto-romance",languageID:62},
{iso639:"rn",name:"Kirundi",languageID:62},
{iso639:"ro",name:"Romanian",languageID:38},
{iso639:"ru",name:"Russian",languageID:39},
	
{iso639:"sa",name:"Sanskrit",languageID:40},
{iso639:"sd",name:"Sindhi",languageID:42},
{iso639:"sg",name:"Sangho",languageID:62},
{iso639:"sh",name:"Serbo-croatian",languageID:41},
{iso639:"si",name:"Sinhalese",languageID:43},
{iso639:"sk",name:"Slovak",languageID:44},
{iso639:"sl",name:"Slovenian",languageID:115},
{iso639:"sm",name:"Samoan",languageID:62},
{iso639:"sn",name:"Shona",languageID:114},
{iso639:"so",name:"Somali",languageID:138},
{iso639:"sq",name:"Albanian",languageID:59},
{iso639:"sr",name:"Serbian",languageID:41},
{iso639:"ss",name:["Siswati","Swati","Swazi"],languageID:117},
{iso639:"st",name:["Sesotho","Sotho"],languageID:112},
{iso639:"su",name:"Sundanese",languageID:62},
{iso639:"sv",name:"Swedish",languageID:47},
{iso639:"sw",name:"Swahili",languageID:46},
	
{iso639:"ta",name:"Tamil",languageID:49},
{iso639:"taa",name:"Tanana",languageID:137},
{iso639:"te",name:"Telugu",languageID:50},
{iso639:"tfn",name:["Tataina","Dena'ina"],languageID:50},
{iso639:"tg",name:"Tajik",languageID:119},
{iso639:"th",name:"Thai",languageID:51},
{iso639:"ti",name:"Tigrinya",languageID:62},
{iso639:"tk",name:"Turkmen",languageID:123},
{iso639:"tl",name:"Tagalog",languageID:48},
{iso639:"tlh",name:"Klingon",languageID:92},
{iso639:"tli",name:"Klingon",languageID:136},
{iso639:"tn",name:["Tswana","Setswana"],languageID:113},
{iso639:"to",name:"Tonga",languageID:62},
{iso639:"tr",name:"Turkish",languageID:53},
{iso639:"ts",name:"Tsonga",languageID:121},
{iso639:"tt",name:"Tatar",languageID:120},
{iso639:"tw",name:"Twi",languageID:124},
	
{iso639:"ug",name:"Uighur",languageID:62},
{iso639:"uk",name:"Ukrainian",languageID:54},
{iso639:"ur",name:"Urdu",languageID:55},
{iso639:"uz",name:"Uzbek",languageID:125},

{iso639:"ve",name:"Venda",languageID:126},
{iso639:"vi",name:"Vietnamese",languageID:56},
{iso639:"vo",name:"Volapuk",languageID:62},
	
{iso639:"wo",name:"Wolof",languageID:62},
	
{iso639:"xh",name:"Xhosa",languageID:128},
	
{iso639:"yi",name:["Yiddish","Ji"],languageID:57},
{iso639:"yo",name:"Yoruba",languageID:131},
{iso639:"ypk",name:["Yupik","Yup'ik"],languageID:133},
{iso639:"yue",name:"Chinese (Cantonese)",languageID:7},
	
{iso639:"za",name:"Zhuang",languageID:62},
{iso639:"zh",name:"Chinese (Mandarin)",languageID:8},
{iso639:"zh",name:"Chinese (Mandarin)",ntld:"cn",languageID:8},
{iso639:"zh",name:"Chinese (Cantonese)",ntld:"hk",languageID:7},
{iso639:"zh",name:"Chinese (Taiwanese)",ntld:"tw",languageID:118},
{iso639:"zu",name:"Zulu",languageID:129}
];
WORDCHAMP.getLanguageByLanguageID=function(languageID) {
	for (var i=0; i<WORDCHAMP.languages.length; i++) {
		if (WORDCHAMP.languages[i].languageID == languageID) {
			return WORDCHAMP.languages[i];
		}
	}
	return null;
}

////////////////////////////////////////////////////////////////////////////

var hex = [	"%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
			"%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e", "%0f",
			"%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
			"%18", "%19", "%1a", "%1b", "%1c", "%1d", "%1e", "%1f",
			"%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27",
			"%28", "%29", "%2a", "%2b", "%2c", "%2d", "%2e", "%2f",
			"%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37",
			"%38", "%39", "%3a", "%3b", "%3c", "%3d", "%3e", "%3f",
			"%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47",
			"%48", "%49", "%4a", "%4b", "%4c", "%4d", "%4e", "%4f",
			"%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57",
			"%58", "%59", "%5a", "%5b", "%5c", "%5d", "%5e", "%5f",
			"%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67",
			"%68", "%69", "%6a", "%6b", "%6c", "%6d", "%6e", "%6f",
			"%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77",
			"%78", "%79", "%7a", "%7b", "%7c", "%7d", "%7e", "%7f",
			"%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87",
			"%88", "%89", "%8a", "%8b", "%8c", "%8d", "%8e", "%8f",
			"%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97",
			"%98", "%99", "%9a", "%9b", "%9c", "%9d", "%9e", "%9f",
			"%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7",
			"%a8", "%a9", "%aa", "%ab", "%ac", "%ad", "%ae", "%af",
			"%b0", "%b1", "%b2", "%b3", "%b4", "%b5", "%b6", "%b7",
			"%b8", "%b9", "%ba", "%bb", "%bc", "%bd", "%be", "%bf",
			"%c0", "%c1", "%c2", "%c3", "%c4", "%c5", "%c6", "%c7",
			"%c8", "%c9", "%ca", "%cb", "%cc", "%cd", "%ce", "%cf",
			"%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
			"%d8", "%d9", "%da", "%db", "%dc", "%dd", "%de", "%df",
			"%e0", "%e1", "%e2", "%e3", "%e4", "%e5", "%e6", "%e7",
			"%e8", "%e9", "%ea", "%eb", "%ec", "%ed", "%ee", "%ef",
			"%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
			"%f8", "%f9", "%fa", "%fb", "%fc", "%fd", "%fe", "%ff"];


var pinyin=[
["a1","\u0101"],
["a2","\xE1"],
["a3","\u01CE"],
["a4","\xE0"],
["a5","a"],
["ai1","\u0101i"],
["ai2","\xE1i"],
["ai3","\u01CEi"],
["ai4","\xE0i"],
["ai5","ai"],
["an1","\u0101n"],
["an2","\xE1n"],
["an3","\u01CEn"],
["an4","\xE0n"],
["an5","an"],
["ang1","\u0101ng"],
["ang2","\xE1ng"],
["ang3","\u01CEng"],
["ang4","\xE0ng"],
["ang5","ang"],
["ao1","\u0101o"],
["ao2","\xE1o"],
["ao3","\u01CEo"],
["ao4","\xE0o"],
["ao5","ao"],
["e1","\u0113"],
["e2","\xE9"],
["e3","\u011B"],
["e4","\xE8"],
["e5","e"],
["ei1","\u0113i"],
["ei2","\xE9i"],
["ei3","\u011Bi"],
["ei4","\xE8i"],
["ei5","ei"],
["en1","\u0113n"],
["en2","\xE9n"],
["en3","\u011Bn"],
["en4","\xE8n"],
["en5","en"],
["eng1","\u0113ng"],
["eng2","\xE9ng"],
["eng3","\u011Bng"],
["eng4","\xE8ng"],
["eng5","eng"],
["er1","\u0113r"],
["er2","\xE9r"],
["er3","\u011Br"],
["er4","\xE8r"],
["er5","er"],
["i1","\u012B"],
["i2","\xED"],
["i3","\u01D0"],
["i4","\xEC"],
["i5","i"],
["ia1","i\u0101"],
["ia2","i\xE1"],
["ia3","i\u01CE"],
["ia4","i\xE0"],
["ia5","ia"],
["ian1","i\u0101n"],
["ian2","i\xE1n"],
["ian3","i\u01CEn"],
["ian4","i\xE0n"],
["ian5","ian"],
["iang1","i\u0101ng"],
["iang2","i\xE1ng"],
["iang3","i\u01CEng"],
["iang4","i\xE0ng"],
["iao1","i\u0101o"],
["iao5","iao"],
["iao2","i\xE1o"],
["iao3","i\u01CEo"],
["iao4","i\xE0o"],
["iao5","iao"],
["ie1","i\u0113"],
["ie2","i\xE9"],
["ie3","i\u011B"],
["ie4","i\xE8"],
["ie5","ie"],
["in1","\u012Bn"],
["in2","\xEDn"],
["in3","\u01D0n"],
["in4","\xECn"],
["in5","in"],
["ing1","\u012Bng"],
["ing2","\xEDng"],
["ing3","\u01D0ng"],
["ing4","\xECng"],
["ing5","ing"],
["iong1","\u012Bong"],
["iong2","\xEDong"],
["iong3","\u01D0ong"],
["iong4","\xECong"],
["iong5","iong"],
["iu1","\u012Bu"],
["iu2","\xEDu"],
["iu3","\u01D0u"],
["iu4","\xECu"],
["iu5","iu"],
["o1","\u014D"],
["o2","\xF3"],
["o3","\u01D2"],
["o4","\xF2"],
["o5","o"],
["ong1","\u014Dng"],
["ong2","\xF3ng"],
["ong3","\u01D2ng"],
["ong4","\xF2ng"],
["ong5","ong"],
["ou1","\u014Du"],
["ou2","\xF3u"],
["ou3","\u01D2u"],
["ou4","\xF2u"],
["ou5","ou"],
["u1","\u016B"],
["u2","\xFA"],
["u3","\u01D4"],
["u4","\xF9"],
["u5","u"],
["u:1","\u01D6"],
["u:2","\u01D8"],
["u:3","\u01DA"],
["u:4","\u01DC"],
["u:5","\xFC"],
["u:e1","\xFC\u0113"],
["u:e2","\xFC\xE9"],
["u:e3","\xFC\u011B"],
["u:e4","\xFC\xE8"],
["u:e5","\xFCe"],
["ua1","u\u0101"],
["ua2","u\xE1"],
["ua3","u\u01CE"],
["ua4","u\xE0"],
["ua5","ua"],
["uai1","u\u0101i"],
["uai2","u\xE1i"],
["uai3","u\u01CEi"],
["uai4","u\xE0i"],
["uai5","uai"],
["uan1","u\u0101n"],
["uan2","u\xE1n"],
["uan3","u\u01CEn"],
["uan4","u\xE0n"],
["uan5","uan"],
["uang1","u\u0101ng"],
["uang2","u\xE1ng"],
["uang3","u\u01CEng"],
["uang4","u\xE0ng"],
["uang5","uang"],
["ue1","u\u0113"],
["ue2","u\xE9"],
["ue3","u\u011B"],
["ue4","u\xE8"],
["ue5","ue"],
["ui1","u\u012B"],
["ui2","u\xED"],
["ui3","u\u01D0"],
["ui4","u\xEC"],
["ui5","ui"],
["un1","\u016Bn"],
["un2","\xFAn"],
["un3","\u01D4n"],
["un4","\xF9n"],
["un5","un"],
["uo1","u\u014D"],
["uo2","u\xF3"],
["uo3","u\u01D2"],
["uo4","u\xF2"],
["uo5","uo"],
["v1","\u01D6"],
["v2","\u01D8"],
["v3","\u01DA"],
["v4","\u01DC"],
["v5","\xFC"],
["ve1","\xFC\u0113"],
["ve2","\xFC\xE9"],
["ve3","\xFC\u011B"],
["ve4","\xFC\xE8"],
["ve5","\xFCe"],
["\xFC1","\u01D6"],
["\xFC2","\u01D8"],
["\xFC3","\u01DA"],
["\xFC4","\u01DC"],
["\xFC5","\xFC"],
["\xFCe1","\xFC\u0113"],
["\xFCe2","\xFC\xE9"],
["\xFCe3","\xFC\u011B"],
["\xFCe4","\xFC\xE8"],
["\xFCe5","\xFCe"],
];

function findPinyin(str) {
	for (var j = 0; j < pinyin.length; j++) {
		if (pinyin[j][0] == str)
			return pinyin[j][1];
	}
	return str;
}

function mungePronunciation(str,languageID) {
	if (languageID != 8)
		return str;
	var out = "";
	if (str == null || str.length == 0)
		return out;
	var start = 0;
	while (start < str.length) {
		var code = str.charCodeAt(start);
		if (code == 97 || code == 101 || code == 105 || code == 111 || code == 117 || code == 118 || code == 252) {
			var numloc = start + 1;
			var inner = 0;
			while (numloc < str.length) {
				inner = str.charCodeAt(numloc);
				if (inner == 32) {
					break;
				}
				else if (
					(inner >= 49 && inner <= 53) ||
					(inner >= 98 && inner <= 122 && inner != 101 && inner != 105 && inner != 111 && inner != 117 && inner != 118 && inner != 110 && inner != 103 && inner != 114))
				{
					out += findPinyin(str.substring(start,numloc+1));
					break;
				}
				numloc++;
			}
			if (numloc == str.length || inner == 32) {
				out += str.substring(start,numloc);
				start = numloc;
			}
			else {
				start = numloc + 1;
			}
		}
		else {
			out += String.fromCharCode(code);
			start++;
		}
	}
	return out;
}


function removeAllNodes(elem) {
	while (elem.hasChildNodes())
		elem.removeChild(elem.lastChild);
}


function encodeUTF8(s) {
	if (s == null)
		return "";
	var sbuf = "";
	var len = s.length;
	for (var i = 0; i < len; i++) {
		var ch = s.charCodeAt(i);
		if (65 <= ch && ch <= 90) {		// 'A'..'Z'
			sbuf += String.fromCharCode(ch);
		} else if (97 <= ch && ch <= 122) {	// 'a'..'z'
			sbuf += String.fromCharCode(ch);
		} else if (48 <= ch && ch <= 57) {	// '0'..'9'
			sbuf += String.fromCharCode(ch);
		} else if (ch == 32) {			// space
			sbuf += "+";
		} else if (ch == 45 || ch == 95 || ch == 46 || ch == 33 || ch == 126 || ch == 42 || ch == 39 || ch == 40 || ch == 41) {
			sbuf += String.fromCharCode(ch);
		} else if (ch <= 0x007f) {		// other ASCII
			sbuf += hex[ch];
		} else if (ch <= 0x07FF) {		// non-ASCII <= 0x7FF
			sbuf += hex[0xc0 | (ch >> 6)];
			sbuf += hex[0x80 | (ch & 0x3F)];
		} else {					// 0x7FF < ch <= 0xFFFF
			sbuf += hex[0xe0 | (ch >> 12)];
			sbuf += hex[0x80 | ((ch >> 6) & 0x3F)];
			sbuf += hex[0x80 | (ch & 0x3F)];
		}
	}
	return sbuf;
}

function decodeUTF8(s) {
	if (s == null)
		return "";
	var sbuf = "";
	var len  = s.length;
	var ch = -1;
	var b;
	var sumb = 0;
	var hb, lb;

	var more = -1;
	for (var i = 0; i < len; i++) {
		// Get next byte b from URL segment s
		ch = s.charCodeAt(i);
		switch (ch) {
			case 37:	// %
				ch = s.charCodeAt(++i);
				if (ch >= 48 && ch <= 57)	// 48-57 = '0'..'9'
					hb = ch - 48;
				else
					hb = (10 + ch - 97) & 0xF;	// 97 = 'a'
				ch = s.charCodeAt(++i);
				if (ch >= 48 && ch <= 57)	// 48-57 = '0'..'9'
					lb = ch - 48;
				else
					lb = (10 + ch - 97) & 0xF;	// 97 = 'a'
				b = (hb << 4) | lb;
				break;
			case 43:	// +
				b = 32;	// space
				break;
			default:
				b = ch;
				break;
		}
		// Decode byte b as UTF-8, sumb collects incomplete chars
		if ((b & 0xc0) == 0x80) {			// 10xxxxxx (continuation byte)
			sumb = (sumb << 6) | (b & 0x3f);	// Add 6 bits to sumb
			if (--more == 0)
				sbuf += String.fromCharCode(sumb); // Add char to sbuf
		} else if ((b & 0x80) == 0x00) {		// 0xxxxxxx (yields 7 bits)
			sbuf += String.fromCharCode(b);		// Store in sbuf
		} else if ((b & 0xe0) == 0xc0) {		// 110xxxxx (yields 5 bits)
			sumb = b & 0x1f;
			more = 1;				// Expect 1 more byte
		} else if ((b & 0xf0) == 0xe0) {		// 1110xxxx (yields 4 bits)
			sumb = b & 0x0f;
			more = 2;				// Expect 2 more bytes
		} else if ((b & 0xf8) == 0xf0) {		// 11110xxx (yields 3 bits)
			sumb = b & 0x07;
			more = 3;				// Expect 3 more bytes
		} else if ((b & 0xfc) == 0xf8) {		// 111110xx (yields 2 bits)
			sumb = b & 0x03;
			more = 4;				// Expect 4 more bytes
		} else {// if ((b & 0xfe) == 0xfc)	// 1111110x (yields 1 bit)
			sumb = b & 0x01;
			more = 5;				// Expect 5 more bytes
		}
		// We don't test if the UTF-8 encoding is well-formed
	}
	return sbuf;
}

function strWS(inStr,respectTags)
{
	if (inStr == null)
		return "";
	if (inStr.length == 0)
		return inStr;
	
	var out = "";
	var url = false;
	var urlStr = null;
	if (respectTags)
		urlStr = "";
	var len = inStr.length;
	var lastch = 0;
	var lastHigh = 0;
	var count = 0;
	for (var i = 0; i < len; i++) {
		count++;
		var ch = inStr.charCodeAt(i);
		if (	(65 <= ch && ch <= 90) ||	// 'A'..'Z'
				(97 <= ch && ch <= 122) ||	// 'a'..'z'
				(48 <= ch && ch <= 57) ||	// '0'..'9'
				ch == 32 ||	// space
				ch == 45 ||
				ch == 95 ||
				ch == 46 ||
				ch == 33 ||
				ch == 126 ||
				ch == 42 ||
				ch == 58 ||
				ch == 47 ||
				ch == 91 ||
				ch == 93 ||
				(!url && ch == 39) ||
				ch == 40 ||
				ch == 41
			)
		{
			if (ch == 32)
				count = 0;
			var outDone = false;
			if (respectTags && ch == 93) {
				var outlen = out.length;
				if (url) {
					var urllen = urlStr.length;
					if (urllen > 2 && urlStr.charCodeAt(urllen-3) == 91 && urlStr.charCodeAt(urllen-2) == 47 && (urlStr.charCodeAt(urllen-1) == 65 || urlStr.charCodeAt(urllen-1) == 97)) {
						url = false;
						urlStr = urlStr.substr(0,urllen-3);
						out += "<a href='";
						if (urlStr.substr(0,7) != "http://" && urlStr.substr(0,8) != "https://")
							out.append("http://");
						out += urlStr;
						out += "' target='_blank' rel='nofollow'>";
						out += urlStr;
						out += "</a>";
						outDone = true;
						urlStr = "";
					}
				}
				else if (outlen > 1 && out.charCodeAt(outlen-2) == 91) {
					var tag = out.charCodeAt(outlen-1);
					if (tag == 98 || tag == 66 || tag == 73 || tag == 105 || tag == 85 || tag == 117) {
						out = out.substr(0,outlen-2);
						out += '<';
						out += String.fromCharCode(tag);
						out += '>';
						outDone = true;
					}
					else if (tag == 65 || tag == 97) {
						out = out.substr(0,outlen-2);
						url = true;
						outDone = true;
					}
				}
				else if (outlen > 2 && out.charCodeAt(outlen-3) == 91 && out.charCodeAt(outlen-2) == 47) {
					var tag = out.charCodeAt(outlen-1);
					if (tag == 66 || tag == 98 || tag == 73 || tag == 105 || tag == 85 || tag == 117) {
						out = out.substr(0,outlen-3);
						out += '<';
						out += '/';
						out += String.fromCharCode(tag);
						out += '>';
						outDone = true;
					}
				}
			}
			if (!outDone) {
				if (url)
					urlStr += String.fromCharCode(ch);
				else
					out += String.fromCharCode(ch);
			}
		}
		else if (!url && ch == 13) {
			out += "<br>";
			count = 0;
		}
		else if (!url && ch == 10) {
			count = 0;
			if (lastch != 13)
				out += "<br>";
		}
		else {
			if (ch == 3000)
				count = 0;
			if (url) {
				if (ch != '<' && ch != '>' && ch != '\'')	// disallow
					urlStr.append(ch);
			}
			else {
				out += "&#";
				out += ch;
				out += ';';
			}
		}
		lastch = ch;
		if (count > 20) {
			out += "<wbr>";
			count = 0;
		}
	}
	return out;
}

function escapeQuote(str) {
	var outStr = "";
	for (var i = 0; i < str.length; i++) {
		var code = str.charCodeAt(i);
		if (code == 39)
			outStr += '\\x27';
		else if (code == 34)
			outStr += '\\x22';
		else
			outStr += str.charAt(i);
	}
	return outStr;
}

////////////////////////////////////////////////////////////////////////////

WORDCHAMP.dynamicScriptCommand=function(cmd,data) {
	var gDocument = WORDCHAMP.contentDocument;
	var lingCMD = gDocument.getElementById("lingCMD");
	if (lingCMD != null) {
		removeAllNodes(lingCMD);
		var script = gDocument.createElement("script");
		script.id = "lingScript";
		script.type = "text/javascript";
		script.src = cmd;
		lingCMD.appendChild(script);
		lingCMD.data = data;
	}	
}

////////////////////////////////////////////////////////////////////////////
WORDCHAMP.doOnPlay=function(audioID) {
	if (WORDCHAMP.audioProtocol==WORDCHAMP.AUDIO_PROTOCOL_FRAME) {
		var gDocument = WORDCHAMP.contentDocument;
		var href = WORDCHAMP.base + "Player.do?pronunciationID=" + audioID + "&playOnLoad=true&r=" + Math.floor(Math.random()*100000);
		
		if (WORDCHAMP.audioFrameProtocol==WORDCHAMP.AUDIO_FRAME_PROTOCOL_FRAME) {
			var frame = gDocument.getElementById("lingPlayerFrame");
			if (frame != null) {
				var parent = frame.parentNode;
				parent.removeChild(frame);
			}
			WORDCHAMP.addLingPlayerFrame(gDocument);
			frame = gDocument.getElementById("lingPlayerFrame");
			if (WORDCHAMP.isMSIE) {
				frame.contentWindow.document.location.replace(href);
			} else {
				frame.contentDocument.location.replace(href);
			}
		} else if (WORDCHAMP.audioFrameProtocol==WORDCHAMP.AUDIO_FRAME_PROTOCOL_HREF) {
			var frame = gDocument.getElementById("lingPlayerFrame");
			frame.src=href;
		} else if (WORDCHAMP.audioFrameProtocol==WORDCHAMP.AUDIO_FRAME_PROTOCOL_LOCATION) {
			try {
				var frame = gDocument.getElementById("lingPlayerFrame");
				if (WORDCHAMP.isMSIE) {
					frame.contentWindow.document.location.replace(href);
				} else {
					frame.contentDocument.location.replace(href);
				}
			} catch (e) {
				alert(e.toString());
			}
		}
	} else if (WORDCHAMP.audioProtocol==WORDCHAMP.AUDIO_PROTOCOL_EMBED) { 
		var gDocument = WORDCHAMP.contentDocument;
		var linguapiObj = gDocument.getElementById("linguapi");
		linguapiObj = gDocument.linguapi ? gDocument.linguapi : gDocument.all.linguapi;
		linguapiObj.SetVariable('itemID',audioID);
		linguapiObj.TGotoFrame('/api_mc',40);
	}	
}

WORDCHAMP.SV=function(elem,value) {
	if (value) {
		elem.style.visibility = "visible";
		elem.style.display = "";
	}
	else {
		elem.style.visibility = "hidden";
		elem.style.display = "none";
	}
}
WORDCHAMP.savePrefs=null;
WORDCHAMP.setUserTranslations=null;
WORDCHAMP.TRUST=function(showAll){
	if (WORDCHAMP.showAll!=showAll){
		WORDCHAMP.showAll=showAll;
		var gDocument = WORDCHAMP.contentDocument;
		
		var elem = gDocument.getElementById("aTrust");
		if (elem) {
			elem.innerHTML = showAll ? less : more;
		}
		if (WORDCHAMP.setUserTranslations) {
			WORDCHAMP.setUserTranslations(showAll);
		}
		
		if (WORDCHAMP.savePrefs != null) {
			WORDCHAMP.savePrefs();
		}
		
		elem = gDocument.getElementById("LING_NO_TRUSTED");
		if (elem)  {
			WORDCHAMP.SV(elem,!showAll);
		}
		elem = gDocument.getElementById("LINGExtraSeparator");
		if (elem)  {
			WORDCHAMP.SV(elem,!showAll);
		}
				
		var i = 0;
		elem = gDocument.getElementById("LING_UT"+i);
		while (elem) {
			WORDCHAMP.SV(elem,showAll);
			i++;
			elem = gDocument.getElementById("LING_UT"+i);
		}
		i = 0;
		elem = gDocument.getElementById("LING_TR"+i);
		while (elem) {
			WORDCHAMP.SV(elem,!showAll);
			i++;
			elem = gDocument.getElementById("LING_TR"+i);
		}
		i = 0;
		elem = gDocument.getElementById("LING_UNTRUSTED"+i);
		while (elem) {
			WORDCHAMP.SV(elem,showAll);
			i++;
			elem = gDocument.getElementById("LING_UNTRUSTED"+i);
		}
		
		elem = gDocument.getElementById("LINGAddToDrill");
		if (elem) {
			WORDCHAMP.SV(elem,WORDCHAMP.showAll);
		}
	}
}

WORDCHAMP.HELP=function(){
	window.open(WORDCHAMP.base + 'HelpUserTranslations.do','HelpUserTranslations','width=440,height=260,status=no,toolbar=no,menubar=no,scrollbars=yes,resizable=yes');
}

WORDCHAMP.isWordNode=function(node) {
	return node.tagName=="WORDCHAMP" && node.id.indexOf("LING")!=-1;
}
WORDCHAMP.getNeighborWords=function(wordNode,maxLen) {
	var text = wordNode.innerHTML;
	var charCode = text.charCodeAt(0);
	var block = WORDCHAMP.unicodeBlock.of(charCode);
	var wordResults = WORDCHAMP.getChildWords(wordNode.parentNode,block);

	// slice to only to limited array length
	for (var i=0; i<wordResults.length; i++) {
		if (wordResults[i].id == wordNode.id) {
			var start = i-maxLen;
			if (start < 0) 
				start = 0;
			var end = i+maxLen+1;
			if (end >= wordResults.length)
				end = wordResults.length;
			
			// slice at words not of the same block
			for (var j=i-1; j>=start; j--) {
				var jText = wordResults[j].innerHTML;
				var jCharCode = jText.charCodeAt(0);
				var jBlock = WORDCHAMP.unicodeBlock.of(jCharCode);
				if (jBlock != block) {
					start = j+1;
					break;
				}
			}
			// slice at words not of the same block
			for (var j=i+1; j<end; j++) {
				var jText = wordResults[j].innerHTML;
				var jCharCode = jText.charCodeAt(0);
				var jBlock = WORDCHAMP.unicodeBlock.of(jCharCode);
				if (jBlock != block) {
					end = j;
					break;
				}
			}
			
			wordResults = wordResults.slice(start,end);
			break;
		} 
	}
	
	return wordResults;
}
WORDCHAMP.getChildWords=function(node,block) {
	var results = new Array();
	if (node.hasChildNodes()) {
		for (var i=0;i<node.childNodes.length; i++) {
			if (WORDCHAMP.isWordNode(node.childNodes[i])) {
				results.push(node.childNodes[i]);
			} else {
				var list = WORDCHAMP.getChildWords(node.childNodes[i],block);
				results = results.concat(list);
			}
		}
	}
	return results;
}

WORDCHAMP.WIW=function() {
	var doc = WORDCHAMP.contentDocument;
	if (window.innerWidth)
		return window.innerWidth;
	else if (doc.body && doc.body.clientWidth)
		return doc.body.clientWidth;
	return 0;
}
WORDCHAMP.GOH=function(obj) {
	if (obj.offsetHeight)
		return parseInt(obj.offsetHeight);
	else if (obj.clip && obj.clip.height)
		return parseInt(obj.clip.height);
	else if (obj.style && obj.style.pixelHeight)
		return parseInt(obj.style.pixelHeight);
	return 0;
}
WORDCHAMP.GOW=function(obj) {
	return WORDCHAMP.MENUWIDTH;
}
WORDCHAMP.isIdeograph=function(code){
	return (code >= 0x4E00 && code <= 0x9FBF || code >= 0x3400 && code <= 0x4DBF || code >= 0x20000 && code <= 0x2A6DF || code >= 0x3040 && code <= 0x309F || code >= 0xF900 && code <= 0xFAFF);
}
WORDCHAMP.unhiliteList=function() {
	while (WORDCHAMP.hiliteList.length>0) {
		var wordNode = WORDCHAMP.hiliteList.pop();
		if (wordNode) {
			wordNode.style.backgroundColor='';
		}
	}
}
WORDCHAMP.setSelectionRangeCJK=function(result,searchStr,pos){
	var targetChar = searchStr.charAt(pos);
	var resultPos = result.indexOf(targetChar);
	if (resultPos < 0)
		return;
	var start = pos-1;
	var resultStart = resultPos-1;
	while (start >= 0 && resultStart >= 0){
		if (searchStr.charAt(start) != result.charAt(resultStart))
			break;
		start--;
		resultStart--;
	}
	start++;
	resultStart++;
	
	var end = pos+1;
	var resultEnd = resultPos+1;
	while (end < searchStr.length && resultEnd < result.length){
		if (searchStr.charAt(end) != result.charAt(resultEnd))
			break;
		end++;
		resultEnd++;
	}
	end--;
	resultEnd--;
	
	WORDCHAMP.selectionStart = WORDCHAMP.selectedIdx - (pos-start);
	WORDCHAMP.selectionEnd = WORDCHAMP.selectedIdx + (end-pos);
	
	// go through neighbors. match the result text to list.
	// result text might not match, so highlight only the consecutive matches
	var gDocument = WORDCHAMP.targetDocument;
	var wordNode = gDocument.getElementById("LING"+WORDCHAMP.selectedIdx);
	var wordList = WORDCHAMP.getNeighborWords(wordNode,4);
	for (var i=0; i<wordList.length; i++) {
		if (wordList[i] == wordNode) {
			var first = i-resultPos;
			if (first < 0) {
				first = 0;
			}
			var last = i+((result.length-resultPos) - 1);
			if (last >= wordList.length-1) {
				last = wordList.length-1;
			}
			for (var j=first; j<=last; j++) {
				if (result.indexOf(wordList[j].innerHTML) >= 0) {
					wordList[j].style.backgroundColor='#ffff00';
					WORDCHAMP.hiliteList.push(wordList[j]);
				}
			}
			break;
		}
	}
}
WORDCHAMP.doOVER=function() {
	if (WORDCHAMP.outTO!=null) {
		clearTimeout(WORDCHAMP.outTO);
		WORDCHAMP.outTO = null;
	}
}
WORDCHAMP.WRITE=function(str,langID,spanSize) {	
	switch (parseInt(langID)) {
		case WORDCHAMP.ARABIC:
		case WORDCHAMP.DARI:
		case WORDCHAMP.FARSI:
		case WORDCHAMP.PASHTO:
		case WORDCHAMP.URDU:
			return "<span class='LINGarabic" + spanSize + "'>&rlm;" + strWS(str) + "&rlm;</span>";
		case WORDCHAMP.HEBREW:
			return "<span class='LINGhebrew" + spanSize + "'>&rlm;" + strWS(str) + "&rlm;</span>";
		case WORDCHAMP.CHINESE_CANTONESE:
		case WORDCHAMP.CHINESE_MANDARIN:
		case WORDCHAMP.KOREAN:
		case WORDCHAMP.JAPANESE:
			return "<span class='LINGkanji" + spanSize + "'>" + strWS(str) + "</span>";
		case WORDCHAMP.THAI:
			return "<span class='LINGthai" + spanSize + "'>" + strWS(str) + "</span>";
	}
	return strWS(str);
}
WORDCHAMP.IN=function(evt,idx,fromLanguageID) {
	var doc = WORDCHAMP.targetDocument;
	if (WORDCHAMP.isEditing)
		return;
	if (WORDCHAMP.inTO != null)
		clearTimeout(WORDCHAMP.inTO);
	if (WORDCHAMP.selected==doc.getElementById("LING"+idx)) {
		if (WORDCHAMP.outTO != null) {
			clearTimeout(WORDCHAMP.outTO);
			WORDCHAMP.outTO = null;
		}
	}
	else {
		WORDCHAMP.mouseTop=1;
		WORDCHAMP.mouseLeft=1;
		if (evt.pageX) {
			WORDCHAMP.mouseLeft=evt.pageX;
			WORDCHAMP.mouseTop=evt.pageY;
		} else if (evt.clientX) {
			WORDCHAMP.mouseLeft=evt.clientX;
			WORDCHAMP.mouseTop=evt.clientY;
		}
		WORDCHAMP.inTO=setTimeout("WORDCHAMP.SHOW("+idx+","+ fromLanguageID +",true)",500);
	}
}
WORDCHAMP.SHOW=function(idx,fromLanguageID,reposition) {
	var doc = WORDCHAMP.targetDocument;
	if (!WORDCHAMP.readerEnabled)
		return;
	WORDCHAMP.inTO=null;
	doc.getElementById("LING"+idx).style.backgroundColor='#ffff00';
	idx = parseInt(idx);
	var wordIndex = 0;
	var text = doc.getElementById("LING"+idx).innerHTML;
	var display = text;
	var maxLen;
	var delimiter;
	var charCode = text.charCodeAt(0);
	
	// pre and post texts
	if (WORDCHAMP.isIdeograph(charCode)) {
		maxLen = 4;
		delimiter = '';
	}
	else {
		maxLen = 2;
		delimiter = ' ';
	}
	
	var wordNode = doc.getElementById("LING"+idx);
	var wordResults = WORDCHAMP.getNeighborWords(wordNode,maxLen);
	
	var searchText = new String();
	for (var i=0; i<wordResults.length; i++) {
		if (i > 0)
			searchText += delimiter;
		var str = wordResults[i].innerHTML;
		str = WORDCHAMP.trim(str);
		searchText += str;
		if (wordResults[i] == wordNode) {
			wordIndex = i;
		}
	}
	text = searchText;
	
	WORDCHAMP.doOVER();
	var callObj = doc.getElementById("LING"+idx);
	if (!callObj)
		return;
	if (WORDCHAMP.selected!=null && WORDCHAMP.selected!=callObj){

		WORDCHAMP.selected.style.backgroundColor='';
		WORDCHAMP.unhiliteList();
		WORDCHAMP.selectionStart = -1;
		WORDCHAMP.selectionEnd = -1;
	}

	WORDCHAMP.selected=callObj;
//	WORDCHAMP.selected.className='lingSH';
	WORDCHAMP.selectedIdx=idx;
	WORDCHAMP.selectionStart=idx;
	WORDCHAMP.selectionEnd=idx;
	
	doc=WORDCHAMP.contentDocument;
	var menu=doc.getElementById('lingCWM');
	if (menu!=null) {
		var arr = new Array();
		arr[arr.length] = '<table class="wcrtb" cellspacing="0" cellpadding="0" width="'+WORDCHAMP.MENUWIDTH+'" style="line-height:1.3em;background-image:url(' + WORDCHAMP.base + 'img/gradientGrayLong.gif);background-repeat:repeat-x" onmouseover="WORDCHAMP.doOVER()" onmouseout="WORDCHAMP.doOUT()">';
			arr[arr.length] = '<tr class="LINGsq" style="line-height:1.3em">';
				arr[arr.length] = '<td width="8" height="8"><img src="' + WORDCHAMP.base + 'img/bubbleSmallTopLeft.gif" width="8" height="8"></td>';
				arr[arr.length] = '<td width="100%" height="8" style="background-image:url(' + WORDCHAMP.base + 'img/bubbleSmallTopMiddle.gif);background-repeat:repeat-x"></td>';
				arr[arr.length] = '<td width="8" height="8"><img src="' + WORDCHAMP.base + 'img/bubbleSmallTopRight.gif" width="8" height="8"></td>';
			arr[arr.length] = '</tr>';
			arr[arr.length] = '<tr>';
				arr[arr.length] = '<td style="background-image:url(' + WORDCHAMP.base + 'img/bubbleSmallMiddleLeft.gif);background-repeat:repeat-y"></td>';
				if (WORDCHAMP.fromID >= 0 && WORDCHAMP.toID >= 0) {
					arr[arr.length] = '<td id="LINGTBLCONTENTS"><table class="wcrtb" cellspacing="0" cellpadding="1" width="100%" id="LINGTBL"><tr><td class="lingNH2">' + WORDCHAMP.WRITE(text,fromLanguageID,WORDCHAMP.BIG) + '</td></tr><tr><td align="center" class="lingNH3" id="LINGTBL_SEARCHING">searching...</td></tr></table></td>';
				}
				else {
					arr[arr.length] = '<td id="LINGTBLCONTENTS"><table class="wcrtb" cellspacing="0" cellpadding="1" width="100%" id="LINGTBL"><tr><td class="lingNH2">' + text + '</td></tr><tr><td align="left" class="lingNH3" style="line-height:1.3em" id="LINGTBL_SEARCHING">In order to search for a definition, you must specify the languages to translate from, and to translate to, in the red WordChamp header above.</td></tr></table></td>';
				}
				arr[arr.length] = '<td style="background-image:url(' + WORDCHAMP.base + 'img/bubbleSmallMiddleRight.gif);background-repeat:repeat-y"></td>';
			arr[arr.length] = '</tr>';
			arr[arr.length] = '<tr class="LINGsq" style="line-height:1.3em">';
				arr[arr.length] = '<td height="8"><img src="' + WORDCHAMP.base + 'img/bubbleSmallBottomLeft.gif" width="8" height="8"></td>';
				arr[arr.length] = '<td height="8" style="background-image:url(' + WORDCHAMP.base + 'img/bubbleSmallBottomMiddle.gif);background-repeat:repeat-x"></td>';
				arr[arr.length] = '<td height="8"><img src="' + WORDCHAMP.base + 'img/bubbleSmallBottomRight.gif" width="8" height="8"></td>';
			arr[arr.length] = '</tr>';
		arr[arr.length] = '</table>';
		menu.innerHTML = arr.join('');
		
		if (reposition) {
			WORDCHAMP.repositionPopup(callObj);
		}
		
		if (WORDCHAMP.fromID >= 0 && WORDCHAMP.toID >= 0) {
			var obj = new Object();
			obj.idx = idx;
			obj.text = text;
			obj.display = display;
			obj.wordIndex = wordIndex;
			obj.fromLanguageID = fromLanguageID;
			obj.searchID = ++WORDCHAMP.searchID;
			
			WORDCHAMP.dynamicScriptCommand(WORDCHAMP.base+"Command.do?cmd=WordChampReader&accessCode="+encodeUTF8(WORDCHAMP.accessCode)+"&url="+encodeUTF8(doc.URL)+"&readerLogID="+WORDCHAMP.readerLogID+"&fromID="+fromLanguageID+"&toID="+WORDCHAMP.toID+"&text=" + encodeUTF8(text) + "&wordIndex="+wordIndex+"&ads="+WORDCHAMP.maxAds+"&cb=WORDCHAMP.WordChampReaderCB"+"&r="+Math.random(),obj);
		}
	}
}
WORDCHAMP.repositionPopup=function(callObj) {
	var doc=WORDCHAMP.contentDocument;
	var menu=doc.getElementById('lingCWM');
	
	if (menu!=null) {
		var winWidth = WORDCHAMP.WIW();
		var menuWidth = WORDCHAMP.GOW(menu);
		var height = WORDCHAMP.GOH(callObj);
		var top = height;
		var left = WORDCHAMP.mouseLeft;
		while (callObj) {
			top += callObj.offsetTop;
			callObj = callObj.offsetParent;
		}
		
		if (WORDCHAMP.targetDocument != WORDCHAMP.contentDocument) {
			
			// figuring out iframe offset
			var frames = WORDCHAMP.contentDocument.getElementsByTagName("iframe");
			for (var frameIdx=0; frameIdx<frames.length; frameIdx++) {
				if (frames[frameIdx].contentDocument == WORDCHAMP.targetDocument) {
					var frameTop = 0;
					var frameLeft = 0;
					var parentObj = frames[frameIdx].offsetParent;
					while (parentObj) {
						frameTop += parentObj.offsetTop;
						frameLeft += parentObj.offsetLeft;
						parentObj = parentObj.offsetParent;
					}
					top += frameTop;
					left += frameLeft;
					break;
				}
			}
		}
		
		if (WORDCHAMP.mouseTop >= top)
			top = WORDCHAMP.mouseTop+8;
					
		left -= menuWidth / 2;
		if (left < 10)
			left = 10;
		else if (left+menuWidth+20 > winWidth)
			left = winWidth-menuWidth-20;
		
		menu.style.left=left+'px';
		menu.style.top=top+'px';

		menu.zIndex = 0;
		menu.style.visibility='visible';
		menu.style.display='';
		
		// post reposition after display settings.
		if (WORDCHAMP.isMSIE) {
			var contentWindow = WORDCHAMP.contentWindow;
			if ((top + menu.offsetHeight) > (contentWindow.document.body.scrollTop + contentWindow.document.body.clientHeight)) {
				menu.style.top = ((top - menu.offsetHeight) - 20) + 'px';
			}
		} else {
			var contentWindow = WORDCHAMP.contentWindow;
			if ((top + menu.offsetHeight) > (contentWindow.pageYOffset + contentWindow.innerHeight)) {
				menu.style.top = ((top - menu.offsetHeight) - 20) + 'px';
			}
		}

	}
}
WORDCHAMP.addDividerSection=function(tbl,id,show) {
	var gDocument = WORDCHAMP.contentDocument;
	
	tr = tbl.insertRow(tbl.rows.length);
	if (id) {
		tr.id = id;
		tr.className="LINGsq";
		tr.style.lineHeight="1.3em";
	}
	if (show) {
		tr.style.visibility="hidden";
		tr.style.display="none";
	}
	
	td = tr.insertCell(tr.cells.length);
	td.className="LINGdiv";
		
	if (WORDCHAMP.isMSIE) {
		img = gDocument.createElement("img");
		td.appendChild(img);
		img.src=WORDCHAMP.base + "img/cccccc.gif";
		img.width="100%";
		img.height="1";
		img.border="0";
	}
}
WORDCHAMP.addContentSection=function(tbl,content) {
	var tr = tbl.insertRow(tbl.rows.length);
	tr.className="LINGsq";
	tr.style.lineHeight="1.0em";
	
	td = tr.insertCell(tr.cells.length);
	td.style.paddingLeft="4px";
	td.style.paddingRight="2px";
	td.appendChild(content);	
}
WORDCHAMP.addExtrasItem=function(tbl,isLast,innerHTML) {
	tr = tbl.insertRow(tbl.rows.length);
	td = tr.insertCell(tr.cells.length);
	td.align="left";
	td.className="lingNT";
	td.style.lineHeight="0.7em";
	td.style.paddingTop="2px";
	if (isLast == true)
		td.style.paddingBottom="4px";
	td.innerHTML=innerHTML;
}
WORDCHAMP.addSearchTable=function(text,fromLanguageID) {
	var gDocument = WORDCHAMP.contentDocument;
	var tbl = gDocument.createElement("table");
	tbl.className="wcrtb";
	tbl.cellSpacing="0";
	tbl.cellPadding="1";
	tbl.width="100%";
	var tr = tbl.insertRow(tbl.rows.length);
	var td = tr.insertCell(tr.cells.length);
	td.align="left";
	td.className="lingNT";
	td.style.paddingTop="1px";
	td.style.lineHeight="1.0em";
	td.innerHTML='search results for <span class="lingNT2">"' + WORDCHAMP.WRITE(text,fromLanguageID,WORDCHAMP.BIG) + '"</span>:';
	
	var isLast = false;
	
	// wordchamp
	WORDCHAMP.addExtrasItem(tbl,isLast,'&bull;&nbsp;&nbsp;<a class="lingAsm" style="outline-width:0" href="http://www.wordchamp.com/Search.do?str='+encodeUTF8(text)+'&languageID=-1" target="wcreaderSearchWindow">WordChamp <i>Learn Language Faster</i></a>');
	
	// wikipedia
	isLast = true;
	var wikipediaLanguageServer = "en";
	var language = WORDCHAMP.getLanguageByLanguageID(WORDCHAMP.fromID);
	if (language != null) {
		wikipediaLanguageServer = language.iso639;
	}
	WORDCHAMP.addExtrasItem(tbl,isLast,'&bull;&nbsp;&nbsp;<a class="lingAsm" style="outline-width:0" href="http://'+ wikipediaLanguageServer +'.wikipedia.org/wiki/Special:Search?search='+ encodeUTF8(text) + '&go=Go" target="wcreaderSearchWindow">Wikipedia <i>The Free Encyclopedia</i></a>');

	return tbl;
}
WORDCHAMP.addExtraSections=function(xmlDoc,tbl,text,fromLanguageID) {
	WORDCHAMP.addContentSection(tbl,WORDCHAMP.addSearchTable(text,fromLanguageID));
}
WORDCHAMP.processReaderWordsCB=function(doc,dataObj) {
	
	var fromLanguageID = dataObj.fromLanguageID;
	
	var gDocument = WORDCHAMP.contentDocument;
	
	// get words
	var children = doc.childNodes[0].childNodes;
			
	var menu=gDocument.getElementById('lingCWM');
	removeAllNodes(menu);
	
	// level 1
	var tbl = gDocument.createElement("table");
	menu.appendChild(tbl);
	tbl.id="LING-menu-table";
	tbl.cellSpacing="0";
	tbl.cellPadding="0";
	tbl.width=WORDCHAMP.MENUWIDTH;

	var tr = tbl.insertRow(tbl.rows.length);
	tr.id="LINGADD";
	tr.style.visibility="hidden";
	tr.style.display="none";
	
	tr = tbl.insertRow(tbl.rows.length);
	tr.id="LINGTRANS";
	
	var td = tr.insertCell(tr.cells.length);
	
	// level 2
	var tbl2 = gDocument.createElement("table");
	td.appendChild(tbl2);
	tbl2.width="100%";
	tbl2.className="LINGsq wcrtb";
	tbl2.cellSpacing="0";
	tbl2.cellPadding="0";
	
	tbl2.style.lineHeight="1.3em";
	tbl2.style.backgroundImage="url(" + WORDCHAMP.base + "img/gradientGrayLong.gif)";
	tbl2.style.backgroundRepeat="repeat-x";
	
	if (WORDCHAMP.isMSIE) {
		tbl2.onmouseover=function() {WORDCHAMP.doOVER();};
		tbl2.onmouseout=function() {WORDCHAMP.doOUT();};
	} else { 
		tbl2.addEventListener("mouseover", function() {WORDCHAMP.doOVER();}, false);
		tbl2.addEventListener("mouseout", function() {WORDCHAMP.doOUT();}, false);
	}
	
	if (WORDCHAMP.showBanner==true) {
		WORDCHAMP.makeBanner(gDocument,tbl2);
	}
	
	WORDCHAMP.tuples=new Object();
	var untrustedIdx=0;
	var trustedCount=0;
	var searchSectionText=null;
	var maxEntries = Math.min(WORDCHAMP.maxEntries,children.length); 
	
	var hasUntrusted = false;
	for (var i = 0; i < maxEntries; i++)
	{
		var translations = children[i].childNodes;
		for (var j = 0; j < translations.length; j++){
			var trust=parseInt(translations[j].getAttribute("TR"));
			if (trust == 0) {
				hasUntrusted = true;
				break;
			}
		}
	}
	
	for (var i = 0; i < maxEntries; i++)
	{
		var translations = children[i].childNodes;
		var text = decodeUTF8(children[i].getAttribute("T"));
		var ptext = decodeUTF8(children[i].getAttribute("R"));
		var hasAudio = parseInt(children[i].getAttribute("A"));
		var id=children[i].getAttribute("I");
		var pID=children[i].getAttribute("P");
		var audioID=children[i].getAttribute("AUD");
		var subKind = parseInt(children[i].getAttribute("SK"));
		
		var trustedObj = new Object();
		var untrustedObj = new Object();
		var tuple=new Object();
		WORDCHAMP.tuples[id+"_"+pID]=tuple;
		tuple.fromText = text;
		tuple.fromPtext = ptext;
		tuple.untrusted=untrustedObj;
		tuple.trusted=trustedObj;
						
		if (i == 0) {
			var code = text.charCodeAt(0);
			if (WORDCHAMP.isIdeograph(code)) {
				WORDCHAMP.setSelectionRangeCJK(text,dataObj.text,dataObj.wordIndex);
				searchSectionText = text;
			}
		}
		
		var hasTrusted = false;
		for (var j = 0; j < translations.length; j++){
			var trust=parseInt(translations[j].getAttribute("TR"));
			if (trust == 1) {
				hasTrusted = true;
				break;
			}
		}
		if (hasTrusted)
			trustedCount++;
		
		tr2 = tbl2.insertRow(tbl2.rows.length);
		if (hasTrusted) {
			tr2.className="LINGsq";
			tr2.style.lineHeight="1.3em";
		} else if (WORDCHAMP.showAll) {
			tr2.className="LINGsq";
			tr2.style.lineHeight="1.3em";
			tr2.id="LING_UNTRUSTED" + (untrustedIdx++);
		} else {
			tr2.className="LINGsq";
			tr2.style.lineHeight="1.3em";
			tr2.style.visibility="hidden";
			tr2.style.display="none";
			tr2.id="LING_UNTRUSTED" + (untrustedIdx++);
		}
		
		td2 = tr2.insertCell(tr2.cells.length);
		td2.width="100%";
		td2.height="100%";
		
		// level 3
		var lastTD = WORDCHAMP.makeEntry(gDocument,td2,children[i],i,fromLanguageID,hasTrusted,translations,tuple);
		// end level 3
		
		if (!WORDCHAMP.showAll && hasTrusted && hasUntrusted) {
			var divShow = gDocument.createElement("div");
			divShow.id = "LING_TR"+(trustedCount-1);
			divShow.align="right";
			divShow.style.fontStyle="italic";
			divShow.className="lingNT";
			divShow.innerHTML="<a href='javascript:WORDCHAMP.TRUST(true);void 0;'>show user translations</a>";
			lastTD.appendChild(divShow);
		}
		
		
		tr2 = tbl2.insertRow(tbl2.rows.length);
		if (hasTrusted) {
			tr2.className="LINGsq";
			tr2.style.lineHeight="1.3em";
		} else if (WORDCHAMP.showAll) {				
			tr2.className="LINGsq";
			tr2.style.lineHeight="1.3em";
			tr2.id="LING_UNTRUSTED" + (untrustedIdx++);
		} else {
			tr2.className="LINGsq";
			tr2.style.lineHeight="1.3em";
			tr2.style.visibility="hidden";
			tr2.style.display="none";
			tr2.id="LING_UNTRUSTED" + (untrustedIdx++);
		}
		
		td2 = tr2.insertCell(tr2.cells.length);
		td2.className="LINGdiv";
		
		if (WORDCHAMP.isMSIE) {
			img2 = gDocument.createElement("img");
			td2.appendChild(img2);
			img2.src=WORDCHAMP.base + "img/cccccc.gif";
			img2.width="100%";
			img2.height="1";
			img2.border="0";
		}
	}
	
	if (i==0) {
		
		tr2 = tbl2.insertRow(tbl2.rows.length);
		
		td2 = tr2.insertCell(tr2.cells.length);
		td2.style.paddingLeft="4px";
		td2.style.paddingRight="2px";
		
		// level 3
		var tbl3 = gDocument.createElement("table");
		td2.appendChild(tbl3);
		tbl3.className="wcrtb";
		tbl3.cellSpacing="0";
		tbl3.cellPadding="1";
		tbl3.width="100%";
		
		var tr3 = tbl3.insertRow(tbl3.rows.length);
		
		var td3 = tr3.insertCell(tr3.cells.length);
		td3.className="lingNH2";
		td3.style.lineHeight="1.3em";
		
		td3.innerHTML=WORDCHAMP.WRITE(dataObj.display,fromLanguageID,WORDCHAMP.BIG + " \u00A0 ");
		
		tr3 = tbl3.insertRow(tbl3.rows.length);
		
		td3 = tr3.insertCell(tr3.cells.length);
		td3.align="left";
		td3.className="lingNH3";
		td3.style.paddingTop="2px";
		td3.style.paddingBottom="2px";
		td3.style.lineHeight="1.3em";
		
		text3 = gDocument.createTextNode('No translations were found.');
		td3.appendChild(text3);
		
		// end level 3
	} else if (trustedCount == 0) {
		
		tr2 = tbl2.insertRow(tbl2.rows.length);
		
		if (WORDCHAMP.showAll) {
			tr2.id="LING_NO_TRUSTED";
			tr2.style.visibility="hidden";
			tr2.style.display="none";
		} else {
			tr2.id="LING_NO_TRUSTED";
		}
		
		td2 = tr2.insertCell(tr2.cells.length);
		td2.style.paddingLeft="4px";
		td2.style.paddingRight="2px";
		
		// level 3
		var tbl3 = gDocument.createElement("table");
		td2.appendChild(tbl3);
		tbl3.className="wcrtb";
		tbl3.cellSpacing="0";
		tbl3.cellPadding="1";
		tbl3.width="100%";
		
		var tr3 = tbl3.insertRow(tbl3.rows.length);
		var td3 = tr3.insertCell(tr3.cells.length);
		td3.align="left";
		td3.className="lingNH3";
		td3.style.paddingTop="2px";
		td3.style.paddingBottom="2px";
		td3.style.lineHeight="1.0em";
		
		var text3 = gDocument.createTextNode('This word has user translations, but no "official" translations. ');
		td3.appendChild(text3);
		
		var a3 = gDocument.createElement("a");
		td3.appendChild(a3);
		a3.className="lingA";
		a3.style.outlineWidth="0";			
		a3.href="javascript:WORDCHAMP.TRUST(true);void 0;";
		if (WORDCHAMP.isMSIE) {
			a3.onclick=function() {WORDCHAMP.TRUST(true); return false;};
		} else {
			a3.addEventListener("click",function() {WORDCHAMP.TRUST(true); return false;}, false);
		}
		a3.innerHTML="<b>Click here</b> ";
		
		text3 = gDocument.createTextNode("to view the user translations. (");
		td3.appendChild(text3);
		
		a3 = gDocument.createElement("a");
		td3.appendChild(a3);
		a3.className="lingA";
		a3.style.outlineWidth="0";			
		a3.href=WORDCHAMP.base + 'HelpUserTranslations.do';
		a3.target='HelpUserTranslations';
		if (WORDCHAMP.isMSIE) {
			a3.onclick=function() { WORDCHAMP.HELP(); return false; };
		} else {
			a3.addEventListener("click",function() { WORDCHAMP.HELP(); return false; }, false);
		}
		a3.innerHTML="what does this mean?"
		
		text3 = gDocument.createTextNode(")");
		td3.appendChild(text3);
		
		// end level 3
	}
	
	// hide less span if all definitions are of trusted sources
	if (untrustedIdx==0) {
		var lessSpan = gDocument.getElementById("lessSpan");
		if (lessSpan != null) {
			lessSpan.style.visibility="hidden";
			lessSpan.style.display="none";
		}
	}
	
	// extra sections
	if (i == 0) {
		WORDCHAMP.addDividerSection(tbl2);
	} else if (trustedCount == 0) {
		WORDCHAMP.addDividerSection(tbl2,"LINGExtraSeparator",WORDCHAMP.showAll);
	}		
	WORDCHAMP.addExtraSections(doc,tbl2,(searchSectionText!=null)? searchSectionText:dataObj.display, fromLanguageID); // additional sections for toolbar
			
	tr2 = tbl2.insertRow(tbl2.rows.length);
	tr2.className="LINGsq";
	tr2.style.lineHeight="1.3em";
	
	td2 = tr2.insertCell(tr2.cells.length);
	td2.style.paddingTop="4px";
	
	// end level 2
	
	// end level 1
			
	if (trustedCount == 0) {
		var node = gDocument.getElementById("LINGAddToDrill");
		if (node)
			WORDCHAMP.SV(node,WORDCHAMP.showAll);
	}
	else {
		var node = gDocument.getElementById("LINGAddToDrill");
		if (node)
			node.id = "";
	}
	
	// see if need to reposition.
	var callObj = WORDCHAMP.targetDocument.getElementById("LING"+dataObj.idx);
	if (callObj != null) {
		WORDCHAMP.repositionPopup(callObj);
	}
}
WORDCHAMP.WordChampReaderCB=function(xml) {

	if (xml != null) {
		
		if (WORDCHAMP.isMSIE) {
			var xmlDocument=new ActiveXObject("Microsoft.XMLDOM");
			xmlDocument.async="false";
			xmlDocument.loadXML(xml);
		} else {	
			var parser = new DOMParser();
			var xmlDocument = parser.parseFromString(xml,"text/xml");
		}
	
		var doc = xmlDocument.documentElement;
		var gDocument = WORDCHAMP.contentDocument;
		var lingCMD = gDocument.getElementById("lingCMD");
		if (lingCMD) {
			if (lingCMD.data.searchID != WORDCHAMP.searchID)
				return;
			if (WORDCHAMP.readerLogID == -1 && typeof(gReaderLogID) == "number") {
				WORDCHAMP.readerLogID = gReaderLogID;
			}
			if (doc.tagName == "SUCCESS") {
				WORDCHAMP.processReaderWordsCB(doc,lingCMD.data);
			} else {
				WORDCHAMP.WordChampReaderErrorCB(lingCMD.data);
			}
		}
		
	} else {
		var gDocument = WORDCHAMP.contentDocument;
		var lingCMD = gDocument.getElementById("lingCMD");
		WORDCHAMP.WordChampReaderErrorCB(lingCMD.data);
	}
}
WORDCHAMP.WordChampReaderErrorCB=function(data) {
	if (data.searchID != WORDCHAMP.searchID)
		return;
	var doc = WORDCHAMP.contentDocument;
	doc.getElementById("LINGTBL_SEARCHING").innerHTML="An error occurred while searching for translations!";
}
WORDCHAMP.makeBanner=function(doc,tbl) {
	var bannerHeight = "18";
		
	var tr = tbl.insertRow(tbl.rows.length);
	tr.className="LINGsq";
	tr.style.lineHeight="1.3em";
	tr.style.backgroundColor="#2060a0";
		
	var td = tr.insertCell(tr.cells.length);
	td.align="center";
	td.width="100%";
	td.height=bannerHeight;

	var bannerTABLE = doc.createElement("table");
	td.appendChild(bannerTABLE);
	bannerTABLE.className="wcrtb";
	bannerTABLE.width="100%";
	bannerTABLE.cellSpacing="0";
	bannerTABLE.cellPadding="0";
	var bannerTR = bannerTABLE.insertRow(bannerTABLE.rows.length);
	var bannerTD = bannerTR.insertCell(bannerTR.cells.length);
	bannerTD.style.paddingLeft="2px";
	bannerTD.style.lineHeight="1.3em";
	bannerTD.align="left";
	bannerTD.vAlign="middle";
	bannerTD.className="lingNT";
	
	var a = doc.createElement("a");
	bannerTD.appendChild(a);
	a.href="http://www.wordchamp.com";
	a.hreflang="en";
	a.target="WordChamp";
	a.style.outlineWidth="0";
	a.className="lingA lingFF";
	a.innerHTML="powered by WordChamp";
	a.style.fontWeight="bold";
}
WORDCHAMP.makeWord=function(doc,parentNode,wordXmlData,fromLanguageID) {
	var text = decodeUTF8(wordXmlData.getAttribute("T"));
	var ptext = decodeUTF8(wordXmlData.getAttribute("R"));
	var hasAudio = parseInt(wordXmlData.getAttribute("A"));
	var id=wordXmlData.getAttribute("I");
	var pID=wordXmlData.getAttribute("P");
	var audioID=wordXmlData.getAttribute("AUD");
	var subKind = parseInt(wordXmlData.getAttribute("SK"));

	var tbl = doc.createElement("table");
	parentNode.appendChild(tbl);
	tbl.className="wcrtb";
	tbl.cellSpacing="0";
	tbl.cellPadding="4";
	tbl.width="100%";
	
	var tr = tbl.insertRow(tbl.rows.length);
	
	var td = tr.insertCell(tr.cells.length);

	var a;
	var span = doc.createElement("span");
	td.appendChild(span);
	span.className="lingNT";
	span.style.color="#3333FF";
	span.innerHTML="<b>"+WORDCHAMP.WRITE(text,fromLanguageID,WORDCHAMP.BIG)+"</b>";

	if (hasAudio==1) {
		var textNode = doc.createTextNode("\u00A0");
		td.appendChild(textNode);
		
		a = doc.createElement("a");
		td.appendChild(a);
		a.style.outlineWidth="0px";
		
		var listener = new Function("WORDCHAMP.doOnPlay('"+audioID+"'); return false;");
		
		if (WORDCHAMP.isMSIE) {
			a.onclick=listener;
		} else {
			a.addEventListener("click", listener, false);
		}
		
						
		var img = doc.createElement("img");
		a.appendChild(img);
		img.src=WORDCHAMP.base + "img/audioSmall.gif";
		img.border="0";
	}
	
	if (subKind>0) {				
		
		var textNode = doc.createTextNode(" \u00A0 ");
		td.appendChild(textNode);
		
		var span = doc.createElement("span");
		td.appendChild(span);
		span.className="lingNT";
		span.style.color="#aaaaaa";
		
		textNode = doc.createTextNode("[");
		span.appendChild(textNode);
		
		a = doc.createElement("a");
		span.appendChild(a);
		a.className="lingA";
		var str=WORDCHAMP.base+"Verb.do?text="+encodeUTF8(text)+"&languageID="+fromLanguageID;
		if (pID!=0)
			str += "&pronunciationID="+pID;
		a.href=str;
		a.target="_blank";
		a.innerHTML='verb chart';
		
		textNode = doc.createTextNode("]");
		span.appendChild(textNode);
		
	}
				
	if (ptext.length > 0) {				
		var span = doc.createElement("span");
		td.appendChild(span);
		span.innerHTML="<br>" + WORDCHAMP.WRITE(mungePronunciation(ptext,fromLanguageID),fromLanguageID,WORDCHAMP.SMALL);
	}
	
}
WORDCHAMP.makeTranslations=function(doc,parentNode,wordIndex,hasTrusted,translations,tuple) {
	var tbl = doc.createElement("table");
	parentNode.appendChild(tbl);
	tbl.className="wcrtb";
	tbl.cellSpacing="0";
	tbl.cellPadding="0";
	tbl.style.paddingLeft="2px";
	tbl.align="center";
	tbl.width="100%";
	
	var tr = tbl.insertRow(tbl.rows.length);
	
	var td = tr.insertCell(tr.cells.length);
	td.className="lingNH3";
	td.style.paddingLeft="4px";
	td.style.padding="2px";

	var userTrans = "";
	var trustTrans = "";
	var transCount = 0;
	
	for (var j = 0; j < translations.length && transCount < WORDCHAMP.maxTranslations; j++) {
		var trust=parseInt(translations[j].getAttribute("TR"));
		if (trust == 1) {
			var transText=decodeUTF8(translations[j].getAttribute("T"));
			var transID=translations[j].getAttribute("I");
			var transPID=translations[j].getAttribute("P");
			var transAudioID=translations[j].getAttribute("AUD");
			var canEdit=parseInt(translations[j].getAttribute("E"))==1;
			if (canEdit) {
				if (userTrans.length > 0)
					userTrans += '\n';
				userTrans += transText;
			}
			else {
				if (trustTrans.length > 0)
					trustTrans += ', ';
				trustTrans += transText;
			}
			var obj = new Object();
			obj.id = transID;
			obj.pID = transPID;
			obj.text = transText;
			tuple.trusted[transID+"_"+transPID]=obj;
			if (transCount++ > 0) {
				var textNode = doc.createTextNode(", ");
				td.appendChild(textNode);
			}
			var hasAudio=parseInt(translations[j].getAttribute("A"));
			span = doc.createElement("span");
			td.appendChild(span);
			span.className="lingNT";
			span.style.color="#3333FF";
			span.innerHTML=WORDCHAMP.WRITE(transText,WORDCHAMP.toID,WORDCHAMP.BIG);
			
			
			if (hasAudio == 1) {
				var textNode = doc.createTextNode("\u00A0");
				td.appendChild(textNode);
				
				a = doc.createElement("a");
				td.appendChild(a);
				a.style.outlineWidth="0px";
				
				var listener = new Function("WORDCHAMP.doOnPlay('"+transAudioID+"'); return false;");
				if (WORDCHAMP.isMSIE) {
					a.onclick=listener;
				} else {
					a.addEventListener("click", listener, false);
				}
				
				var img = doc.createElement("img");
				a.appendChild(img);
				img.src=WORDCHAMP.base + "img/audioSmall.gif";
				img.border="0";
			}					
		}
	}
	
	var div = doc.createElement("div");
	td.appendChild(div);
	div.className="lingNT";
	div.id="LING_UT" + wordIndex;
	if (hasTrusted) {
		div.style.marginTop="4px";
	}
	if (!WORDCHAMP.showAll) {
		div.style.visibility="hidden";
		div.style.display="none";
	}

	var maxTranslations = WORDCHAMP.maxTranslations - transCount;
	transCount = 0;
	for (var j = 0; j < translations.length && transCount < maxTranslations; j++) {
		var trust=parseInt(translations[j].getAttribute("TR"));
		if (trust == 0) {
			var transText=decodeUTF8(translations[j].getAttribute("T"));
			var transID=translations[j].getAttribute("I");
			var transPID=translations[j].getAttribute("P");
			var transAudioID=translations[j].getAttribute("AUD");
			var canEdit=parseInt(translations[j].getAttribute("E"))==1;
			if (canEdit) {
				if (userTrans.length > 0)
					userTrans += '\n';
				userTrans += transText;
			}
			var obj = new Object();
			obj.id = transID;
			obj.pID = transPID;
			obj.text = transText;
			tuple.untrusted[transID+"_"+transPID]=obj;
			var hasAudio=parseInt(translations[j].getAttribute("A"));
			
			var str = (transCount++ > 0 ? ', ' : 'user translations: ');
			var textNode = doc.createTextNode(str);
			div.appendChild(textNode);

			span = doc.createElement("span");
			div.appendChild(span);
			span.className="lingNT";
			span.style.color="#3333FF";
			span.innerHTML=WORDCHAMP.WRITE(transText,WORDCHAMP.toID,WORDCHAMP.MEDIUM);
			
			if (hasAudio==1){
				textNode = doc.createTextNode("\u00A0");
				div.appendChild(textNode);
				
				a = doc.createElement("a");
				div.appendChild(a);
				a.style.outlineWidth="0px";

				var listener = new Function("WORDCHAMP.doOnPlay('"+transAudioID+"'); return false;");
				if (WORDCHAMP.isMSIE) {
					a.onclick=listener;
				} else {
					a.addEventListener("click", listener, false);
				}
				
				var img = doc.createElement("img");
				a.appendChild(img);
				img.src=WORDCHAMP.base + "img/audioSmall.gif";
				img.border="0";
			}
		}
	}
	if (transCount > 0) {
		var divHide = doc.createElement("div");
		divHide.align="right";
		divHide.style.fontStyle="italic";
		divHide.innerHTML="<a href='javascript:WORDCHAMP.TRUST(false);void 0;'>hide user translations</a>";
		div.appendChild(divHide);
	}
	tuple.toText=userTrans;
	tuple.trustText=trustTrans;
}
WORDCHAMP.makeEntry=function(doc,parentNode,wordXmlData,wordIndex,fromLanguageID,hasTrusted,translations,tuple) {
	var tbl = doc.createElement("table");
	parentNode.appendChild(tbl);
	tbl.className="wcrtb";
	tbl.cellSpacing="0";
	tbl.cellPadding="0";
	tbl.width="100%";
	
	var tr = tbl.insertRow(tbl.rows.length);
	tr.className="lingNH3";
	tr.style.lineHeight="1.3em";
	
	var td = tr.insertCell(tr.cells.length);
	td.width="35%";
	td.vAlign="top";
	td.style.padding="2px";
	
	// level 4
	WORDCHAMP.makeWord(doc,td,wordXmlData,fromLanguageID);
	// end level4
	
	td = tr.insertCell(tr.cells.length);
	td.width="65%";
	td.style.borderLeft="1px solid #cccccc";
	
	// level4
	WORDCHAMP.makeTranslations(doc,td,wordIndex,hasTrusted,translations,tuple);
	// end level 4
	
	return td;
}

////////////////////////////////////////////////////////////////////////////
WORDCHAMP.OUT=function() {
	if (WORDCHAMP.inTO != null){
		clearTimeout(WORDCHAMP.inTO);
		WORDCHAMP.inTO=null;
		WORDCHAMP.doOUT();
	}
	WORDCHAMP.doOUT();	
}
WORDCHAMP.doOUT=function() {
	if (WORDCHAMP.isEditing)
		return;
	if (WORDCHAMP.outTO!=null)
		clearTimeout(WORDCHAMP.outTO);
	WORDCHAMP.outTO = setTimeout('WORDCHAMP.HIDE()',250);	
}
WORDCHAMP.HIDE=function() {
	WORDCHAMP.searchID++;
	var doc = WORDCHAMP.contentDocument;
	var menu = doc.getElementById('lingCWM');
	if (menu!=null) {
		menu.style.visibility='hidden';
		menu.style.display='none';
		removeAllNodes(menu);
	}
	if (WORDCHAMP.selected!=null){
		WORDCHAMP.selected.style.backgroundColor='';
		WORDCHAMP.unhiliteList();
		WORDCHAMP.selectionStart = -1;
		WORDCHAMP.selectionEnd = -1;
		WORDCHAMP.selected=null;
	}
}

////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////

WORDCHAMP.lTrim=function(str) {
	return str.replace(/^\s*/, '');
}
WORDCHAMP.rTrim=function(str) {
	return str.replace(/\s*$/, '');
}
WORDCHAMP.trim=function(str) {
	str = WORDCHAMP.lTrim(str);
	str = WORDCHAMP.rTrim(str);
	return str;
}

WORDCHAMP.hasStyleSheet=function(doc, css) {
	var links = doc.getElementsByTagName("link");
	for (var i=0; i<links.length; i++) {
		if (links[i].href == css) {
			return true;
		}
	}
	return false;
}
WORDCHAMP.addStyleSheet=function(doc, css) {
	if (WORDCHAMP.hasStyleSheet(doc,css)==false) {
		var headID = doc.getElementsByTagName("head")[0];         
		var cssNode = doc.createElement('link');
		cssNode.type = 'text/css';
		cssNode.rel = 'stylesheet';
		cssNode.href = css;
		cssNode.media = 'screen';	
		headID.appendChild(cssNode);
	}
}

WORDCHAMP.addLingCMD=function(doc) {
	var lingCMD = doc.getElementById("lingCMD");
	if (lingCMD == null) {
		lingCMD = doc.createElement("div");
		lingCMD.id = "lingCMD";
		doc.body.appendChild(lingCMD);
	}
}

// add reader menu
WORDCHAMP.addLingCWM=function(doc) {
	var lingCWM = doc.getElementById("lingCWM");
	if (lingCWM == null) {	
		lingCWM = doc.createElement("div");
		lingCWM.id = 'lingCWM';
		lingCWM.className = 'LINGMENU';
		doc.body.appendChild(lingCWM);
	}

	if (WORDCHAMP.isMSIE) {
		lingCWM.onmouseover=function() { WORDCHAMP.doOVER(); };
		lingCWM.onmouseout=function() { WORDCHAMP.doOUT(); };
	} else {
		lingCWM.addEventListener("mouseover", function() { WORDCHAMP.doOVER(); }, false);
		lingCWM.addEventListener("mouseout", function() { WORDCHAMP.doOUT(); }, false);
	}
	
}

WORDCHAMP.addLingPlayerFrame=function(doc) {
	var frame = doc.getElementById("lingPlayerFrame");
	if (frame == null) {
		frame = doc.createElement("iframe");
		
		frame.id="lingPlayerFrame";
		frame.name="lingPlayerFrame";
		frame.marginHeight="0";
		frame.marginWidth="0";
		frame.height="1";
		frame.width="1";
		frame.frameBorder="no";
		
		doc.body.appendChild(frame);
	}	
}

WORDCHAMP.addLingPlayerObjectIE=function(doc) {
	var lingPlayerObject = doc.getElementById("linguapi");
	
	if (lingPlayerObject != null)
		return;
	
	var arr = new Array(); 
	
	arr[arr.length] = '<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" ID="linguapi" movie="'+ WORDCHAMP.swfFileLocation +'?host=' + WORDCHAMP.host + '" WIDTH="1" HEIGHT="1" ALIGN="">';
	arr[arr.length] = '<PARAM NAME="allowScriptAccess" VALUE="sameDomain" />';
	arr[arr.length] = '<PARAM NAME="movie" VALUE="'+ WORDCHAMP.swfFileLocation +'?host=' + WORDCHAMP.host + '">';
	arr[arr.length] = '<PARAM NAME="quality" VALUE="high">';
	arr[arr.length] = '<PARAM NAME="scale" VALUE="noscale" />';
	arr[arr.length] = '<PARAM NAME="bgcolor" VALUE="#660000">';
	arr[arr.length] = '<EMBED src="'+ WORDCHAMP.swfFileLocation +'?host=' + WORDCHAMP.host + '" quality="best" scale="noscale" bgcolor="#660000" WIDTH="1" HEIGHT="1" swLiveConnect="true" ID="linguapi" NAME="linguapi" align="middle" TYPE="application/x-shockwave-flash" allowScriptAccess="sameDomain" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED>';
	arr[arr.length] = '</OBJECT>';
		
	var span = doc.createElement('span');
	span.innerHTML = arr.join('');
	
	doc.body.appendChild(span.firstChild);
}

WORDCHAMP.addLingPlayerObject=function(doc) {
	var lingPlayerObject = doc.getElementById("linguapi");
	
	if (lingPlayerObject != null)
		return;
	
	lingPlayerObject = doc.createElement("OBJECT");
	lingPlayerObject.setAttribute("classid","clsid:D27CDB6E-AE6D-11cf-96B8-444553540000");
	lingPlayerObject.setAttribute("codebase","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0");
	lingPlayerObject.setAttribute("ID","linguapi");
	lingPlayerObject.setAttribute("movie",WORDCHAMP.swfFileLocation + "?host=" + WORDCHAMP.host);
	lingPlayerObject.setAttribute("WIDTH","1");
	lingPlayerObject.setAttribute("HEIGHT","1");
	lingPlayerObject.setAttribute("ALIGN","");
	
	var param = doc.createElement("PARAM");
	param.setAttribute("NAME","allowScriptAccess");
	param.setAttribute("VALUE","sameDomain");	
	lingPlayerObject.appendChild(param);
	
	param = doc.createElement("PARAM");
	param.setAttribute("NAME","movie");
	param.setAttribute("VALUE",WORDCHAMP.swfFileLocation + "?host=" + WORDCHAMP.host);
	lingPlayerObject.appendChild(param);
	
	param = doc.createElement("PARAM");
	param.setAttribute("NAME","quality");
	param.setAttribute("VALUE","high");
	lingPlayerObject.appendChild(param);

	param = doc.createElement("PARAM");
	param.setAttribute("NAME","scale");
	param.setAttribute("VALUE","noscale");
	lingPlayerObject.appendChild(param);

	param = doc.createElement("PARAM");
	param.setAttribute("NAME","bgcolor");
	param.setAttribute("VALUE","#660000");
	lingPlayerObject.appendChild(param);
	
	var embed = doc.createElement("EMBED");
	embed.setAttribute("src",WORDCHAMP.swfFileLocation + "?host=" + WORDCHAMP.host);
	embed.setAttribute("quality","best");
	embed.setAttribute("scale","noscale");
	embed.setAttribute("bgcolor","#660000");
	embed.setAttribute("WIDTH","1");
	embed.setAttribute("HEIGHT","1");
	embed.setAttribute("swLiveConnect","true");
	embed.setAttribute("ID","linguapi");
	embed.setAttribute("NAME","linguapi");
	embed.setAttribute("align","middle");
	embed.setAttribute("TYPE","application/x-shockwave-flash");
	embed.setAttribute("allowScriptAccess","sameDomain");
	embed.setAttribute("PLUGINSPAGE","http://www.macromedia.com/go/getflashplayer");
	lingPlayerObject.appendChild(embed);
	
	doc.body.appendChild(lingPlayerObject);
}

WORDCHAMP.setFocus=function(event,mainDoc,mainWindow) {
	
	if (WORDCHAMP.isMSIE) {
		WORDCHAMP.targetDocument=event.srcElement.ownerDocument;
	} else {
		WORDCHAMP.targetDocument=event.target.ownerDocument;
	}
	
	WORDCHAMP.contentDocument=mainDoc;
	WORDCHAMP.contentWindow=mainWindow;
}
WORDCHAMP.createReaderSpan=function(mainDoc,mainWindow,doc,wordIndex,fromLanguageID) {
	var span = doc.createElement("WORDCHAMP");
	span.id = "LING" + wordIndex;
	if (fromLanguageID == null || fromLanguageID < 0 || typeof fromLanguageID == 'undefined')
		fromLanguageID = WORDCHAMP.fromID;
	
	if (WORDCHAMP.isMSIE) {
		span.onmouseover = function(e) { e=window.event; WORDCHAMP.setFocus(e,mainDoc,mainWindow); WORDCHAMP.IN(e,wordIndex,fromLanguageID); };
		span.onmouseout = function(e) { e=window.event; WORDCHAMP.setFocus(e,mainDoc,mainWindow); WORDCHAMP.OUT(); };
	} else {
		span.addEventListener("mouseover", function(e) { WORDCHAMP.setFocus(e,mainDoc,mainWindow); WORDCHAMP.IN(e,wordIndex,fromLanguageID); }, false);
		span.addEventListener("mouseout", function(e) { WORDCHAMP.setFocus(e,mainDoc,mainWindow); WORDCHAMP.OUT(); }, false);
	}

	return span;
}

// prepare text for web reader
WORDCHAMP.prepareTextForReader=function(mainDoc,mainWindow,doc, text, fromLanguageID, output) {
	
	var wordIndex = output.wordIndex;
	
	var str = null;
	
	var isIgnore;
	var lastWasIgnore = true;
	var spanOpen = false;
	var lastWasKanji = false;
	var lastBlock = null;
	
	var spanNode = null;
	var textNode = null;
		
	for (var i=0; i<text.length; i++) {
		var ch = text.charAt(i);
		var charCode = text.charCodeAt(i);
		var block = WORDCHAMP.unicodeBlock.of(charCode);
		if (block == WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS ||
			block == WORDCHAMP.unicodeBlock.HIRAGANA ||
			block == WORDCHAMP.unicodeBlock.CJK_COMPATIBILITY ||
			block == WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A ||
			block == WORDCHAMP.unicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B) 
		{
			if (spanOpen == true) {
				
				if (str != null) {
					textNode = doc.createTextNode(str);
					spanNode.appendChild(textNode);
					str = null;
				}
				
				output.childNodes.push(spanNode);
				textNode = null;
				spanNode = null;
				
				spanOpen = false;
			} else if (str != null && str.length>0) {
				textNode = doc.createTextNode(str);
				output.childNodes.push(textNode);
				textNode = null;
				str = null;
			}
			
			if (lastWasKanji == false) {
				wordIndex++;
			}
			
			spanNode = WORDCHAMP.createReaderSpan(mainDoc,mainWindow,doc,wordIndex,fromLanguageID);
			textNode = doc.createTextNode(ch);
			spanNode.appendChild(textNode);
			output.childNodes.push(spanNode);
			textNode = null;
			spanNode = null;
			wordIndex++;			
			
			lastWasKanji = true;
		}
		else if (block == WORDCHAMP.unicodeBlock.KATAKANA)
		{
			if (block != lastBlock) {
				
				if (spanOpen == true) {
					
					if (str != null) {
						textNode = doc.createTextNode(str);
						spanNode.appendChild(textNode);
						str = null;
					}
					
					output.childNodes.push(spanNode);
					textNode = null;
					spanNode = null;
				} else if (str != null && str.length>0) {
					textNode = doc.createTextNode(str);
					output.childNodes.push(textNode);
					textNode = null;
					str = null;
				}
				
				wordIndex++;
				
				spanNode = WORDCHAMP.createReaderSpan(mainDoc,mainWindow,doc,wordIndex,fromLanguageID);
				wordIndex += 2;
				
				spanOpen = true;
			}
			
			if (str == null) {
				str = new String();
			}
			str = str.concat(ch);
			
			lastWasKanji = false;
		}
		else
		{
			if (ch == '\'' || charCode == 146 || charCode == 0x2019) {
				isIgnore = (lastWasIgnore == true || (i == text.length - 1));
				if (isIgnore == false) {
					var nextch = text.charAt(i+1);
					var nextCharCode = text.charCodeAt(i+1);
					isIgnore =
						nextCharCode < 39 ||
						(nextCharCode > 39 && nextCharCode < 45) ||
						(nextCharCode > 45 && nextCharCode < 65) ||
						(nextCharCode > 90 && nextCharCode < 97) ||
						(nextCharCode > 122 && nextCharCode < 192 && nextCharChode != 138 && nextCharCode != 140 && nextCharCode != 154 && nextCharCode != 156 && nextCharCode != 159) ||
						(nextCharCode >= 0x2000 && nextCharCode <= 0x206F) ||
						(charCode >= 0x60B && charCode <= 0x60F) ||
						(charCode >= 0x61B && charCode <= 0x61F) ||
						(charCode >= 0x660 && charCode <= 0x66D) ||
						block == WORDCHAMP.unicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION ||
						(charCode >= 0xFF00 && charCode <= 0xFF20);
				}
			}
			else if (ch == '-')
				isIgnore = lastWasIgnore;
			else {
				isIgnore =
					charCode < 39 ||
					(charCode > 39 && charCode < 45) ||
					(charCode > 45 && charCode < 65) ||
					(charCode > 90 && charCode < 97) ||
					(charCode > 122 && charCode < 192 && charCode != 138 && charCode !=140 && charCode != 154 && charCode != 156 && charCode != 159) ||
					(charCode >= 0x2000 && charCode <= 0x206F) ||
					(charCode >= 0x60B && charCode <= 0x60F) ||
					(charCode >= 0x61B && charCode <= 0x61F) ||
					(charCode >= 0x660 && charCode <= 0x66D) ||
					block == WORDCHAMP.unicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION ||
					(charCode >= 0xFF00 && charCode <= 0xFF20);
			}
			
			if (isIgnore == true)
			{
				if (spanOpen == true) {
					
					if (str != null) {
						textNode = doc.createTextNode(str);
						spanNode.appendChild(textNode);
						str = null;
					}
					
					output.childNodes.push(spanNode);
					textNode = null;
					spanNode = null;
					
					spanOpen = false;
				}
				
				if (lastWasKanji) {
					wordIndex++;
					lastWasKanji = false;
				}
				
				// we do this to cause a break between words
				if (charCode == 33 || 
					charCode == 34 || 
					charCode == 40 || 
					charCode == 41 || 
					charCode == 44 ||
					(charCode >= 46 && charCode <= 93) ||
					(charCode >= 123 && charCode <= 125) ||
					charCode == 133 ||
					(charCode >= 0x2000 && charCode <= 0x206F && charCode != 0x2019) ||
					(charCode >= 0x60B && charCode <= 0x60F) ||
					(charCode >= 0x61B && charCode <= 0x61F) ||
					(charCode >= 0x660 && charCode <= 0x66D) ||
					block == WORDCHAMP.unicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION ||
					(charCode >= 0xFF00 && charCode <= 0xFF20)) 
				{
					wordIndex++;
				}
			}
			else if (lastWasIgnore == true && isIgnore == false)
			{
				if (spanOpen == true) {

					if (str != null) {
						textNode = doc.createTextNode(str);
						spanNode.appendChild(textNode);
						str = null;
					}
					
					output.childNodes.push(spanNode);
					textNode = null;
					spanNode = null;
				} else if (str != null && str.length>0) {
					textNode = doc.createTextNode(str);
					output.childNodes.push(textNode);
					textNode = null;
					str = null;
				}
				
				if (lastWasKanji == true) {
					wordIndex++;
					lastWasKanji = false;
				}
								
				spanNode = WORDCHAMP.createReaderSpan(mainDoc,mainWindow,doc,wordIndex,fromLanguageID);
				wordIndex++;
				
				spanOpen = true;
			}
			
			if (str == null) {
				str = new String();
			}
			str = str.concat(ch);

			lastWasIgnore = isIgnore;
		}
		
		lastBlock = block;
	}
	
	if (spanOpen == true) {
		
		if (str != null) {
			textNode = doc.createTextNode(str);
			spanNode.appendChild(textNode);
			str = null;
		}
		
		output.childNodes.push(spanNode);
		textNode = null;
		spanNode = null;
		
	} else {
		
		if (str != null) {
			textNode = doc.createTextNode(str);
			output.childNodes.push(textNode);
			textNode = null;
			str = null;
		}
	}
	
	output.wordIndex = wordIndex;
}

WORDCHAMP.processNode=function(mainDoc,mainWindow,doc,node,wordIndex,fromLanguageID) {
	
	var out = new Object();
	out.wordIndex = wordIndex;
	out.childNodes = new Array();

	WORDCHAMP.prepareTextForReader(mainDoc,mainWindow,doc,node.data,fromLanguageID,out);

	if (out.childNodes.length > 0) {
		var parentNode = node.parentNode;
		for(var i=0; i<out.childNodes.length; i++) {
			parentNode.insertBefore(out.childNodes[i],node);
		}
		parentNode.removeChild(node);
	}
	
	return out.wordIndex;
}


// read page
WORDCHAMP.shouldProcessNode=function(node) {
	var result = true;
	result = result && node.nodeType==3;
	result = result && node.data.length>0;
	result = result && node.data.indexOf("<!")==-1;
	result = result && node.parentNode.tagName != "HEAD";
	result = result && node.parentNode.tagName != "TITLE";
	result = result && node.parentNode.tagName != "STYLE";
	result = result && node.parentNode.tagName != "SCRIPT";
	result = result && node.parentNode.tagName != "NOSCRIPT";
	result = result && node.parentNode.tagName != "OPTION";
	result = result && node.parentNode.tagName != "SELECT";
	result = result && node.parentNode.tagName != "NOFRAMES";
	
	// http://www.w3schools.com/dom/dom_nodetype.asp
	// element node (type 1) and not attribute node (type 2). 
	result = result && node.parentNode.nodeType==1;	
		
	return result;
}
WORDCHAMP.shouldProcessChildNodes=function(node) {
	var result = true;
	result = result && node.tagName != "HEAD";
	result = result && node.tagName != "TITLE";
	result = result && node.tagName != "STYLE";
	result = result && node.tagName != "SCRIPT";
	result = result && node.tagName != "NOSCRIPT";
	result = result && node.tagName != "OPTION";
	result = result && node.tagName != "SELECT";
	result = result && node.tagName != "NOFRAMES";
	result = result && node.tagName != "WORDCHAMP";
	
	return result;
}
WORDCHAMP.processDocument=function(mainDoc, mainWindow, doc, rootNode, fromLanguageID) {	
	
	var wordIndex = WORDCHAMP.wordIndex;
	
	// run the nodes through a queue
	var nodes = new Array();
	if (rootNode != null)
		nodes.push(rootNode);
	else
		nodes.push(doc);
	while (nodes.length > 0) {
		var node = nodes.shift();
		
		// check for text node
		if (WORDCHAMP.shouldProcessNode(node))
		{
			wordIndex = WORDCHAMP.processNode(mainDoc, mainWindow, doc, node, wordIndex, fromLanguageID);
		}		
		
		// children
		if (WORDCHAMP.shouldProcessChildNodes(node) && node.hasChildNodes()) {
			var children = node.childNodes;
			for (var i=0; i<children.length; i++) {
				nodes.push(children[i]);
			}			
		}
	}
		
	WORDCHAMP.wordIndex = wordIndex;
}

WORDCHAMP.hasReadDocument=function(doc) {
	var list = doc.getElementsByTagName("WORDCHAMP");
	if (list != null && list.length>0) {
		return true;
	}
	else {
		return false;
	}
}

WORDCHAMP.hasReadNode=function(node) {
	var list = node.getElementsByTagName("WORDCHAMP");
	if (list != null && list.length>0) {
		return true;
	}
	else {
		return false;
	}
}

WORDCHAMP.onIFrameLoad=function(event,mainDoc,mainWindow) {
	if (event.currentTarget.id != "lingPlayerFrame") {
		WORDCHAMP.processDocument(mainDoc,mainWindow,event.currentTarget.contentDocument);
	}
}
WORDCHAMP.readIFrames=function(mainDoc,mainWindow,doc) {
	var frames = doc.getElementsByTagName("iframe");
	for (var i=0; i<frames.length; i++) {
		try {
			if (!WORDCHAMP.hasReadDocument(frames[i].contentDocument)) {
				WORDCHAMP.processDocument(mainDoc,mainWindow,frames[i].contentDocument);
				if (WORDCHAMP.isMSIE) {
					frames[i].onload=function(e) { e=window.event; WORDCHAMP.onIFrameLoad(e,mainDoc,mainWindow); return false; };
				} else {
					frames[i].addEventListener("load",function(e) { WORDCHAMP.onIFrameLoad(e,mainDoc,mainWindow); return false; },false);
				}
			}
		}
		catch (e) {}
	}
}

WORDCHAMP.prepareDocument=function(doc) {
	WORDCHAMP.addStyleSheet(doc,WORDCHAMP.base+'pages/css/reader.css');
	WORDCHAMP.addStyleSheet(doc,WORDCHAMP.base+'pages/css/wcrtbff.css');
	
	WORDCHAMP.addLingCMD(doc);
	WORDCHAMP.addLingCWM(doc);
	
	if (WORDCHAMP.audioProtocol==WORDCHAMP.AUDIO_PROTOCOL_FRAME) {
		WORDCHAMP.addLingPlayerFrame(doc);
	} else if (WORDCHAMP.audioProtocol==WORDCHAMP.AUDIO_PROTOCOL_EMBED) {
		if (WORDCHAMP.isMSIE) {
			WORDCHAMP.addLingPlayerObjectIE(doc);
		} else {
			WORDCHAMP.addLingPlayerObject(doc);
		}
	}
}
WORDCHAMP.readDocument=function(mainDoc,mainWindow,doc)
{
	WORDCHAMP.prepareDocument(doc);
	
	WORDCHAMP.processDocument(mainDoc,mainWindow,doc);
	WORDCHAMP.readIFrames(mainDoc,mainWindow,mainDoc);	
}
WORDCHAMP.toLanguageMenuSelect=function() {
	var gDocument = document;
	var select = gDocument.getElementById("wcToLanguageMenu");
	if (select != null) {
		WORDCHAMP.toID = select.value;
	}
	
	return false;
}
///////////////////////////////////////////////////////////////////////////

WORDCHAMP.init=function(accessCode,swfFileLocation) {
	if (location.href.substring(0,"http://www.wordchamp.com/ReaderProgress.do".length) == "http://www.wordchamp.com/ReaderProgress.do" ||
		location.href.substring(0,"http://www.wordchamp.com/ReaderResult.do".length) == "http://www.wordchamp.com/ReaderResult.do" ||
		location.href.substring(0,"http://wordchamp.com/ReaderProgress.do".length) == "http://wordchamp.com/ReaderProgress.do" ||
		location.href.substring(0,"http://wordchamp.com/ReaderResult.do".length) == "http://wordchamp.com/ReaderResult.do")
	{
		return;
	}
	if (WORDCHAMP.isMSIE) {
		WORDCHAMP.audioProtocol=WORDCHAMP.AUDIO_PROTOCOL_EMBED;
	} else {
//		WORDCHAMP.audioProtocol=WORDCHAMP.AUDIO_PROTOCOL_FRAME;
//		WORDCHAMP.audioFrameProtocol=WORDCHAMP.AUDIO_FRAME_PROTOCOL_FRAME;
		WORDCHAMP.audioProtocol=WORDCHAMP.AUDIO_PROTOCOL_EMBED;
	}
	WORDCHAMP.showBanner = true;
	if (swfFileLocation != null) {
		WORDCHAMP.swfFileLocation=swfFileLocation;
	}
	WORDCHAMP.accessCode = accessCode;
	
	WORDCHAMP.prepareDocument(document);
}
WORDCHAMP.prepareForReader=function(nodeID,fromLanguageID) {
	if (location.href.substring(0,"http://www.wordchamp.com/ReaderProgress.do".length) == "http://www.wordchamp.com/ReaderProgress.do" ||
		location.href.substring(0,"http://www.wordchamp.com/ReaderResult.do".length) == "http://www.wordchamp.com/ReaderResult.do" ||
		location.href.substring(0,"http://wordchamp.com/ReaderProgress.do".length) == "http://wordchamp.com/ReaderProgress.do" ||
		location.href.substring(0,"http://wordchamp.com/ReaderResult.do".length) == "http://wordchamp.com/ReaderResult.do")
	{
		return;
	}
	if (nodeID != null && nodeID.length>0) {
		var node = document.getElementById(nodeID);
		
		if (node == null)
			throw new Error("Could not find element id '" + nodeID + "'");
		
		if (WORDCHAMP.hasReadNode(node) == true)
			throw new Error("Already has prepared element id '" + nodeID + "'");
		
		WORDCHAMP.processDocument(document,window,document,node,fromLanguageID);
		
	} else {
		WORDCHAMP.processDocument(document,window,document);
		WORDCHAMP.readIFrames(document,window,document);
	}
}
WORDCHAMP.enableReader=function(enable) {
	WORDCHAMP.readerEnabled=enable;
}
WORDCHAMP.setLanguages=function(fromLanguageID,toLanguageID) {
	WORDCHAMP.fromID = fromLanguageID;
	WORDCHAMP.toID = toLanguageID;
}
WORDCHAMP.setFromLanguageID=function(fromLanguageID) {
	WORDCHAMP.fromID=fromLanguageID;
}
WORDCHAMP.setToLanguageID=function(toLanguageID) {
	WORDCHAMP.toID=toLanguageID;
}
WORDCHAMP.createToLanguageMenu=function(nodeID) {
	var gDocument = document;
	if (nodeID == null)
		throw new Error("No element id is specified");
	if (nodeID.length == 0)
		throw new Error("Element id is empty");
	var node = gDocument.getElementById(nodeID);
	if (node == null)
		throw new Error("Could not find element id '" + nodeID + "'");
	
	var select = gDocument.createElement("select");
	select.name = "wcToLanguageMenu";
	select.id = "wcToLanguageMenu";
	select.style.fontSize="12px";
	for (var i=0; i<WORDCHAMP.wclanguages.length; i++) {
		var option = gDocument.createElement("option");
		option.value = WORDCHAMP.wclanguages[i].languageID;
		option.innerHTML = WORDCHAMP.wclanguages[i].name;
		select.appendChild(option);
		
		if (option.value == WORDCHAMP.toID) {
			option.selected = "selected";
		}
	}
	
	node.appendChild(select);
	
	if (WORDCHAMP.isMSIE) {
		select.onchange=WORDCHAMP.toLanguageMenuSelect;
	} else {
		select.addEventListener("change",WORDCHAMP.toLanguageMenuSelect,false);
	}
	
}

WORDCHAMP.TINY=0;
WORDCHAMP.SMALL=1;
WORDCHAMP.MEDIUM=2;
WORDCHAMP.BIG=3;
WORDCHAMP.HUGE=4;

WORDCHAMP.AFRIKAANS=58;
WORDCHAMP.ALBANIAN=59;
WORDCHAMP.AMHARIC=130;
WORDCHAMP.ARABIC=0;
WORDCHAMP.ARMENIAN=60;
WORDCHAMP.ASSAMESE=61;
WORDCHAMP.AYMARA=63;
WORDCHAMP.AZERI=64;
WORDCHAMP.BALUCHI=65;
WORDCHAMP.BASHKIR=66;
WORDCHAMP.BASQUE=1;
WORDCHAMP.BENGALI=2;
WORDCHAMP.BHOJPURI=67;
WORDCHAMP.BOSNIAN=68;
WORDCHAMP.BRETON=69;
WORDCHAMP.BRIJ=70;
WORDCHAMP.BULGARIAN=3;
WORDCHAMP.BURMESE=4;
WORDCHAMP.BYELORUSSIAN=71;
WORDCHAMP.CATALAN=6;
WORDCHAMP.CHEROKEE=72;
WORDCHAMP.CHINESE_CANTONESE=7;
WORDCHAMP.CHINESE_MANDARIN=8;
WORDCHAMP.CREOLE=73;
WORDCHAMP.CROATIAN=74;
WORDCHAMP.CZECH=10;
WORDCHAMP.DANISH=11;
WORDCHAMP.DARI=75;
WORDCHAMP.DOGRI=76;
WORDCHAMP.DUTCH=12;
WORDCHAMP.ENGLISH=13;
WORDCHAMP.ESPERANTO=116;
WORDCHAMP.ESTONIAN=77;
WORDCHAMP.FARSI=14;
WORDCHAMP.FINNISH=15;
WORDCHAMP.FLEMISH=78;
WORDCHAMP.FRENCH=16;
WORDCHAMP.FRISIAN=79;
WORDCHAMP.FUR=90;
WORDCHAMP.GAELIC=122;
WORDCHAMP.GEORGIAN=81;
WORDCHAMP.GERMAN=17;
WORDCHAMP.GREEK=18;
WORDCHAMP.GUJARATI=82;
WORDCHAMP.HAUSA=83;
WORDCHAMP.HAWAIIAN=84;
WORDCHAMP.HEBREW=19;
WORDCHAMP.HINDI=20;
WORDCHAMP.HMONG=85;
WORDCHAMP.HUNGARIAN=21;
WORDCHAMP.ICELANDIC=86;
WORDCHAMP.IGBO=87;
WORDCHAMP.INDONESIAN=22;
WORDCHAMP.INTERLINGUA=110;
WORDCHAMP.IRISH=23;
WORDCHAMP.ITALIAN=24;
WORDCHAMP.JAPANESE=25;
WORDCHAMP.JAVANESE=88;
WORDCHAMP.JUDEOSPANISH=89;
WORDCHAMP.KANNADA=91;
WORDCHAMP.KANNAUJI=92;
WORDCHAMP.KASHMIRI=93;
WORDCHAMP.KAZAKH=94;
WORDCHAMP.KHMER=5;
WORDCHAMP.KINYARWANDA=132;
WORDCHAMP.KLINGON=26;
WORDCHAMP.KONKANI=96;
WORDCHAMP.KOREAN=27;
WORDCHAMP.KURDISH=28;
WORDCHAMP.KYRGYZ=97;
WORDCHAMP.LAKOTA=99;
WORDCHAMP.LAOTIAN=98;
WORDCHAMP.LATIN=29;
WORDCHAMP.LATVIAN=9;
WORDCHAMP.LITHUANIAN=30;
WORDCHAMP.MAITHILI=100;
WORDCHAMP.MALAGASY=101;
WORDCHAMP.MALAY=31;
WORDCHAMP.MALAYALAM=102;
WORDCHAMP.MALTESE=139;
WORDCHAMP.MANIPURI=103;
WORDCHAMP.MAORI=104;
WORDCHAMP.MARATHI=32;
WORDCHAMP.MIZO=105;
WORDCHAMP.MONGOLIAN=106;
WORDCHAMP.NEPALI=107;
WORDCHAMP.NORWEGIAN=33;
WORDCHAMP.ORIYA=108;
WORDCHAMP.OTHER=62;
WORDCHAMP.PAPIAMENTO=109;
WORDCHAMP.PASHTO=34;
WORDCHAMP.POLISH=35;
WORDCHAMP.PORTUGUESE=36;
WORDCHAMP.PUNJABI=37;
WORDCHAMP.QUECHUA=111;
WORDCHAMP.ROMANIAN=38;
WORDCHAMP.RUSSIAN=39;
WORDCHAMP.SANSKRIT=40;
WORDCHAMP.SERBIAN=41;
WORDCHAMP.SHONA=114;
WORDCHAMP.SINDHI=42;
WORDCHAMP.SINHALESE=43;
WORDCHAMP.SLOVAK=44;
WORDCHAMP.SLOVENIAN=115;
WORDCHAMP.SOMALI=138;
WORDCHAMP.SOTHO=112;
WORDCHAMP.SPANISH=45;
WORDCHAMP.SWAHILI=46;
WORDCHAMP.SWAZI=117;
WORDCHAMP.SWEDISH=47;
WORDCHAMP.TAGALOG=48;
WORDCHAMP.TAIWANESE=118;
WORDCHAMP.TAJIK=119;
WORDCHAMP.TAMIL=49;
WORDCHAMP.TATAR=120;
WORDCHAMP.TELUGU=50;
WORDCHAMP.THAI=51;
WORDCHAMP.TIBETAN=52;
WORDCHAMP.TSONGA=121;
WORDCHAMP.TSWANA=113;
WORDCHAMP.TURKISH=53;
WORDCHAMP.TURKMEN=123;
WORDCHAMP.TWI=124;
WORDCHAMP.UKRAINIAN=54;
WORDCHAMP.URDU=55;
WORDCHAMP.UZBEK=125;
WORDCHAMP.VENDA=126;
WORDCHAMP.VIETNAMESE=56;
WORDCHAMP.WELSH=127;
WORDCHAMP.XHOSA=128;
WORDCHAMP.YIDDISH=57;
WORDCHAMP.YORUBA=131;
WORDCHAMP.ZULU=129;
///////////////////////////////////////////////////////////////////////////
