PageSourceSearch

https://www.mdbg.net/chinese/rsc/js/chindict.js?v1766218147

js mdbg.net collected 2026-09-24 15:23:12 UTC 38,048 bytes, 1,327 lines download raw bytes

1/*
2 * MDBG free online Chinese-English dictionary JavaScript support file
3 * 
4 * Copyrights MDBG 2015
5 */
6
7jQuery.fn.identify = function(prefix) {
8    var i = 0;
9    return this.each(function() {
10        if(this.id) return;
11        do { 
12            i++;
13            var id = prefix + '_' + i;
14        } while($('#' + id).length > 0);            
15        $(this).attr('id', id);            
16    });
17};
18
19var mdbg = {};
20
21function isIE() {
22	return window.navigator.userAgent.match(/(MSIE|Trident)/);
23}
24
25mdbg.isHanziLookupInitialized = false;
26
27function enableHWIme(inputElementId) {
28
29	var openHwIme = function() {
30		if (isIE()) {
31			alert("The Chinese handwriting input section is no longer supported with Internet Explorer. Please update to a modern browser such as Chrome, Firefox, Safari or Edge.\n\nThere is no cost involved in upgrading to any of these browsers. Microsoft no longer actively develops Internet Explorer and discourages users to use it.");
32			return false;
33		}
34		mdbg.isHanziLookupInitialized = true;
35
36		var matcher = new HanziLookup.Matcher("orig", 0.25);
37
38		var hideOnHwImeOpen = $('.hide-on-hwime-open');
39		hideOnHwImeOpen.hide();
40
41		var divHWImeButton = $('#hwime_on_' + inputElementId);
42		divHWImeButton.hide();
43
44		var divHWIme = $('#hwime_' + inputElementId);
45		divHWIme.show();
46
47		var mdbgHwIme = new MdbgHwIme(divHWIme, "dictionary-ajax?c=hwime", matcher, function(selectedChar) {
48			var txbInput = $('#' + inputElementId);
49
50			if(txbInput.typeahead !== undefined && inputElementId == 'txt_word')
51			{
52				txbInput.focus().typeahead('val', txbInput.val() + selectedChar);
53			}
54			else
55			{
56				txbInput.val(txbInput.val() + selectedChar);
57			}
58		}, function() {
59			var divHWIme = $('#hwime_' + inputElementId);
60			divHWIme.html('');
61			divHWIme.hide();
62
63			var divHWImeButton = $('#hwime_on_' + inputElementId);
64			divHWImeButton.show();
65
66			var hideOnHwImeOpen = $('.hide-on-hwime-open');
67			hideOnHwImeOpen.show();
68		});
69
70	};
71
72	if (!mdbg.isHanziLookupInitialized) {
73		HanziLookup.init("orig", "rsc/js/hanzilookupjs/orig.json", openHwIme);
74	} else {
75		openHwIme();
76	}
77
78}
79
80
81function hideUsageTips()
82{
83	var usageTipsElement = document.getElementById("usage-tips");
84	usageTipsElement.style.display = "none";
85
86	$.ajax({
87		url: 'dictionary-ajax',
88		type: "get",
89		dataType: "html",
90		data: {
91			"c": "hide",
92			"i": "usagetips"
93		},
94		success: function(returnData) {
95		}
96	});
97}
98
99
100function resultOptionSelect(currentResultOption, name, value)
101{
102	currentResultOption = $(currentResultOption);
103
104	var resultOptions = currentResultOption.parent().find('.resultoption').removeClass('selected');
105	currentResultOption.addClass('selected');
106
107	var form = document.forms[0];
108	
109	var activeForms = $('form.active');
110	if(activeForms.length > 0)
111	{
112		form = activeForms[0];
113	}
114	
115	$(form).append('<input type="hidden" name="' + name + '" value="' + value + '" />');
116
117	form.submit();
118}
119
120var worddictCurrentTab = 'word';
121var worddictAdvancedDefaultValue = 'Use the form below, your Advanced Search will appear here';
122function selectWorddictTab(tab)
123{
124	if(window['autoComplete_txt_word'] != undefined)
125	{
126		autoComplete_txt_word.clearSuggestions();
127	}
128	
129	var oldValue = '';
130	if(worddictCurrentTab == 'word' && $('#txt_word').val() != '')
131	{
132		oldValue = $('#txt_word').val();
133	}
134	else if(worddictCurrentTab == 'wordadvanced' && $('#txt_word_advanced').val() != '' && $('#txt_word_advanced').val() != worddictAdvancedDefaultValue)
135	{
136		oldValue = $('#txt_word_advanced').val();
137	}
138	else if(worddictCurrentTab == 'text' && $('#txa_text').val() != '')
139	{
140		oldValue = $('#txa_text').val();
141	}
142
143	if(tab == 'word')
144	{
145		$('#form_wdqt').removeClass('active');
146		$('#form_wdqb').addClass('active');
147		$('#form_wdqb_advanced').removeClass('active');
148		
149		$('#section_text').hide();
150		$('#section_word_simple').show();
151		$('#section_word_advanced').hide();
152		$('#ime_text').hide();
153		$('#ime_word').show();
154		$('#tab_text').attr('class', '');
155		$('#tab_word').attr('class', 'tabset_selected');
156	
157		if(oldValue != '')
158		{
159			$('#txt_word').val(oldValue);
160		}
161
162		$('#txt_word').focus();
163		$('#txt_word').select();
164	}
165	else if(tab == 'wordadvanced')
166	{
167		$('#form_wdqt').removeClass('active');
168		$('#form_wdqb').removeClass('active');
169		$('#form_wdqb_advanced').addClass('active');
170		
171		updateWorddictTextOptionVisibility();
172		updateQueryFromAdvancedForm();
173	
174		$('#section_text').hide();
175		$('#section_word_simple').hide();
176		$('#section_word_advanced').show();
177		$('#ime_text').hide();
178		$('#ime_word').hide();
179		$('#tab_text').attr('class', '');
180		$('#tab_word').attr('class', 'tabset_selected');
181	}
182	else if(tab == 'text')
183	{
184		$('#form_wdqt').addClass('active');
185		$('#form_wdqb').removeClass('active');
186		$('#form_wdqb_advanced').removeClass('active');
187
188		updateWorddictTextOptionVisibility();
189
190		$('#section_text').show();
191		$('#section_word_simple').hide();
192		$('#section_word_advanced').hide();
193		$('#ime_text').show();
194		$('#ime_word').hide();
195		$('#tab_text').attr('class', 'tabset_selected');
196		$('#tab_word').attr('class', '');
197	
198		if(oldValue != '')
199		{
200			$('#txa_text').val(oldValue);
201		}
202
203		$('#txa_text').focus();
204		$('#txa_text').select();
205	}
206
207	updateWorddictTextOptionVisibility();
208	worddictCurrentTab = tab;
209}
210
211function updateWorddictTextOptionVisibility()
212{
213	if($('#select_wdqtm').val() == '2')
214	{
215		$('#section_wdqcham').show();
216		$('#select_wdqcham_tip').hide();
217	}
218	else
219	{
220		$('#section_wdqcham').hide();
221		$('#select_wdqcham_tip').show();
222	}
223}
224
225function processQueryFromAdvancedFormType(type, value)
226{
227	if(type == 1)
228	{
229		value = value + '*';
230	}
231	else if(type == 2)
232	{
233		value = '*'+ value;
234	}
235	else if(type == 3)
236	{
237		value = '*' + value + '*';
238	}
239	
240	return value;
241}
242
243function updateQueryFromAdvancedForm()
244{
245	var queryString = '';
246	var form = $('#wdqb_advanced');
247	
248	var chineseCharacters = form.find('input[name="chineseValue"]').val().split(' ');
249	for(var idx = 0, len = chineseCharacters.length ; idx < len ; ++idx)
250	{
251		var chineseCharacter = chineseCharacters[idx];
252		if(chineseCharacter != '')
253		{
254			queryString += ' c:' + processQueryFromAdvancedFormType(form.find('select[name="chineseType"]').val(), chineseCharacter);
255		}
256	}
257	var chineseNotCharacters = form.find('input[name="chineseNotValue"]').val().split(' ');
258	for(var idx = 0, len = chineseNotCharacters.length ; idx < len ; ++idx)
259	{
260		var chineseNotCharacter = chineseNotCharacters[idx];
261		if(chineseNotCharacter != '')
262		{
263			queryString += ' -c:' + processQueryFromAdvancedFormType(form.find('select[name="chineseNotType"]').val(), chineseNotCharacter);
264		}
265	}
266
267	var pinyinSyllables = form.find('input[name="pinyinValue"]').val().split(' ');
268	for(var idx = 0, len = pinyinSyllables.length ; idx < len ; ++idx)
269	{
270		var pinyinSyllable = pinyinSyllables[idx];
271		if(pinyinSyllable != '')
272		{
273			queryString += ' p:' + processQueryFromAdvancedFormType(form.find('select[name="pinyinType"]').val(), pinyinSyllable);
274		}
275	}
276	var pinyinNotSyllables = form.find('input[name="pinyinNotValue"]').val().split(' ');
277	for(var idx = 0, len = pinyinNotSyllables.length ; idx < len ; ++idx)
278	{
279		var pinyinNotSyllable = pinyinNotSyllables[idx];
280		if(pinyinNotSyllable != '')
281		{
282			queryString += ' -p:' + processQueryFromAdvancedFormType(form.find('select[name="pinyinNotType"]').val(), pinyinNotSyllable);
283		}
284	}
285
286	if($.trim(form.find('input[name="englishPhrase"]').val()) != '')
287	{
288		queryString += ' e:"' + processQueryFromAdvancedFormType(0, $.trim(form.find('input[name="englishPhrase"]').val()) + '"');
289	}
290	if($.trim(form.find('input[name="englishNotPhrase"]').val()) != '')
291	{
292		queryString += ' -e:"' + processQueryFromAdvancedFormType(0, $.trim(form.find('input[name="englishNotPhrase"]').val()) + '"');
293	}
294
295	var englishValues = form.find('input[name="englishValue"]').val().split(' ');
296	for(var idx = 0, len = englishValues.length ; idx < len ; ++idx)
297	{
298		var englishValue = englishValues[idx];
299		if(englishValue != '')
300		{
301			queryString += ' e:' + processQueryFromAdvancedFormType(form.find('select[name="englishType"]').val(), englishValue);
302		}
303	}
304	var englishNotValues = form.find('input[name="englishNotValue"]').val().split(' ');
305	for(var idx = 0, len = englishNotValues.length ; idx < len ; ++idx)
306	{
307		var englishNotValue = englishNotValues[idx];
308		if(englishNotValue != '')
309		{
310			queryString += ' -e:' + processQueryFromAdvancedFormType(form.find('select[name="englishNotType"]').val(), englishNotValue);
311		}
312	}
313
314	queryString = $.trim(queryString);
315	if(queryString == '')
316	{
317		$('#txt_word_advanced').val(worddictAdvancedDefaultValue);
318	}
319	else
320	{
321		$('#txt_word_advanced').val(queryString);
322	}
323}
324
325function formAutoPostGet(formElement)
326{
327	formElement = $(formElement);
328	if(formElement.serialize().length > 1000)
329	{
330		formElement.attr('method', 'post');
331	}
332	else
333	{
334		formElement.attr('method', 'get');
335	}
336}
337
338
339
340
341function GoBack()
342{
343	if(location.hash=="#top")
344		history.go(-2);
345	else
346		history.go(-1);
347}
348
349function as(unicode) {
350	var popup=window.open('popup_animation_strokes.php?uvd='+unicode, 'radical', 'resizable=yes,scrollbars=yes,width=380,height=420');
351
352	return false;
353}
354
355function wordVocabPopup(text, simpTrad)
356{
357	var popup=window.open('dictionary-ajax?c=wordvocab&i=' + encodeURIComponent(text) + '&st=' + encodeURIComponent(simpTrad), '_blank', 'resizable=yes,scrollbars=yes,width=900,height=700');
358	return false;
359}
360
361function popup(url) {
362	var popup=window.open(url, '_blank', 'resizable=yes,scrollbars=yes');
363	return false;
364}
365
366function addSearchEngine(name,ext,cat)
367{
368	if ((typeof window.sidebar == "object") && (typeof window.sidebar.addSearchEngine == "function"))
369	{
370		//cat="Web";
371		//cat=prompt("In what category should this engine be installed?","Web")
372		window.sidebar.addSearchEngine(
373			"https://www.mdbg.net/chinese/extras/searchplugins/"+name+".src",
374			"https://www.mdbg.net/chinese/extras/searchplugins/"+name+"."+ext,
375			name,
376			cat );
377	}
378	else
379	{
380		alert("Mozilla Firefox is needed to install this plugin");
381	}
382}
383
384function getUrlParameter( name )
385{
386  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
387  var regexS = "[\\?&]"+name+"=([^&#]*)";
388  var regex = new RegExp( regexS );
389  var results = regex.exec( window.location.href );
390  if( results == null )
391    return "";
392  else
393    return results[1];
394}
395
396function trackExitLink(target, fromPage, eventType)
397{
398	if(eventType === undefined)
399	{
400		if(target && target.startsWith('inline-'))
401		{
402			eventType = 'inline'
403		}
404		else if(target && target.startsWith('link-'))
405		{
406			eventType = 'link'
407		}
408		else
409		{
410			eventType = 'exitlink'
411		}
412	}
413
414	if(target.href !== undefined)
415	{
416		target = target.href.match(/\/\/([^\/]+)/)[1];
417	}
418//	var fromPage = getUrlParameter('page');
419	var eventName = target;
420	if(fromPage)
421	{
422		// eventName = eventName + '/page=' + fromPage;
423		eventName = eventName + '/' + fromPage;
424	}
425//	alert(trackUrl);
426
427	// Matomo event tracking
428	try {
429		if (window._paq) {
430			// exclude eventType == 'exitlink' as matomo already tracks exit links by default
431			if (eventType !== 'exitlink') {
432				let [category, ...actionParts] = target.split("-");
433				let action = actionParts.join('-');
434				// queue the matomo event tracking call
435				// console.log(['trackEvent', category, action, fromPage || null]);
436				window._paq.push(['trackEvent', category, action, fromPage || null]);
437			}
438		}
439	} catch(err) {}
440
441	// Umami event tracking
442	try {
443		if (window.umami) {
444			// window.umami.trackEvent(eventName, eventType);
445			let name = !eventName.startsWith(eventType) ? eventType + '-' + eventName : eventName;
446			window.umami.track(name.substring(0, 50));
447		}
448	} catch(err) {}
449
450	// Google Analytics event tracking
451	try {
452		if (ga) {
453			ga('send', 'pageview', '/exitlink/' + eventName);
454		}
455	} catch(err) {}
456}
457
458
459// ---------- mouse tracking ----------
460var mdbg_mousetracking_onMouseMove = null;
461
462var mdbg_mousetracking_mouseX = 0;
463var mdbg_mousetracking_mouseY = 0;
464
465var mdbg_mousetracking_scrollX = 0;
466var mdbg_mousetracking_scrollY = 0;
467
468var mdbg_mousetracking_sizeX = 0;
469var mdbg_mousetracking_sizeY = 0;
470
471var mdbg_mousetracking_topEdgeDistance = 0;
472var mdbg_mousetracking_bottomEdgeDistance = 0;
473var mdbg_mousetracking_rightEdgeDistance = 0;
474
475// detect browsers
476var mdbg_mousetracking_isBrowserIE = document.all?true:false;
477var mdbg_mousetracking_isBrowserSafari = (document.childNodes)&&(!document.all)&&(!navigator.taintEnabled)&&(!navigator.accentColorName)?true:false;
478
479
480function mdbg_mousetracking_enable()
481{
482	// set the on mouse move event handler
483	document.onmousemove = mdbg_mousetracking_updateMouseXY;
484	if (!mdbg_mousetracking_isBrowserIE)
485	{
486		document.captureEvents(Event.MOUSEMOVE);
487	}
488}
489
490// on mouse move event handler 
491function mdbg_mousetracking_updateMouseXY(e)
492{
493	// get the event object
494	if (!e) var e = window.event;
495
496	// get the scroll positions
497	if( typeof( window.pageYOffset ) == 'number' )
498	{
499		//Netscape compliant
500		mdbg_mousetracking_scrollY = window.pageYOffset;
501		mdbg_mousetracking_scrollX = window.pageXOffset;
502	}
503	else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) )
504	{
505		//DOM compliant
506		mdbg_mousetracking_scrollY = document.body.scrollTop;
507		mdbg_mousetracking_scrollX = document.body.scrollLeft;
508	}
509	else if( document.documentElement && ( !isNaN(document.documentElement.scrollLeft) || !isNaN(document.documentElement.scrollTop) ) )
510	{
511		//IE6 standards compliant mode
512		mdbg_mousetracking_scrollY = document.documentElement.scrollTop;
513		mdbg_mousetracking_scrollX = document.documentElement.scrollLeft;
514	}
515
516	if(isNaN(mdbg_mousetracking_scrollX))
517	{
518		mdbg_mousetracking_scrollX = 0;
519	}
520	if(isNaN(mdbg_mousetracking_scrollY))
521	{
522		mdbg_mousetracking_scrollY = 0;
523	}
524
525	// get window size
526	if( typeof( window.innerWidth ) == 'number' )
527	{
528		//Non-IE
529		mdbg_mousetracking_sizeX = window.innerWidth;
530		mdbg_mousetracking_sizeY = window.innerHeight;
531	}
532	else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
533	{
534		//IE 6+ in 'standards compliant mode'
535		mdbg_mousetracking_sizeX = document.documentElement.clientWidth;
536		mdbg_mousetracking_sizeY = document.documentElement.clientHeight;
537	}
538	else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
539	{
540		//IE 4-5 compatible
541		mdbg_mousetracking_sizeX = document.body.clientWidth;
542		mdbg_mousetracking_sizeY = document.body.clientHeight;
543	}
544
545	// get the mouse coordinates
546       if (e.pageX || e.pageY)
547       {
548		// grab the x-y pos.s if browser is NS
549           mdbg_mousetracking_mouseX = e.pageX;
550           mdbg_mousetracking_mouseY = e.pageY;
551       }
552       else if (e.clientX || e.clientY)
553       {        	
554		// grab the x-y pos.s if browser is IE
555		mdbg_mousetracking_mouseX = e.clientX + mdbg_mousetracking_scrollX;
556		mdbg_mousetracking_mouseY = e.clientY + mdbg_mousetracking_scrollY;
557       }
558	
559	if (mdbg_mousetracking_mouseX < 0)
560	{
561		mdbg_mousetracking_mouseX = 0;
562	}
563	if (mdbg_mousetracking_mouseY < 0)
564	{
565		mdbg_mousetracking_mouseY = 0;
566	}
567
568	// get distance to screen edges
569	if(mdbg_mousetracking_isBrowserIE && !window.opera)
570	{
571		mdbg_mousetracking_rightEdgeDistance = mdbg_mousetracking_sizeX - e.clientX;
572		mdbg_mousetracking_bottomEdgeDistance = mdbg_mousetracking_sizeY - e.clientY;
573		mdbg_mousetracking_topEdgeDistance = e.clientY;
574	}
575	else
576	{
577		if(mdbg_mousetracking_isBrowserSafari)
578		{
579			// Safari
580			mdbg_mousetracking_rightEdgeDistance = mdbg_mousetracking_sizeX - e.clientX + document.body.scrollLeft;
581			mdbg_mousetracking_bottomEdgeDistance = mdbg_mousetracking_sizeY - e.clientY + document.body.scrollTop;
582			mdbg_mousetracking_topEdgeDistance = e.clientY - document.body.scrollTop;
583		}
584		else
585		{
586			// Other browsers such as Mozilla, doesn't count scroll bar, so leave some space for it
587			mdbg_mousetracking_rightEdgeDistance = mdbg_mousetracking_sizeX - e.clientX - 20;
588			mdbg_mousetracking_bottomEdgeDistance = mdbg_mousetracking_sizeY - e.clientY - 20;
589			mdbg_mousetracking_topEdgeDistance = e.clientY;
590		}
591	}
592	
593	// update a few times, since it may be resized by the browser after being moved
594	mdbg_mousetracking_onMouseMove();
595	mdbg_mousetracking_onMouseMove();
596//	alert(mdbg_mousetracking_rightEdgeDistance+" "+mdbg_mousetracking_bottomEdgeDistance);
597
598	var debugElement = document.getElementById("debugLabel");
599//	debugElement.innerHTML = ''+mdbg_mousetracking_bottomEdgeDistance+' '+mdbg_mousetracking_rightEdgeDistance+' '+mdbg_mousetracking_topEdgeDistance;
600//	debugElement.innerHTML = ''+mdbg_mousetracking_mouseX+' '+mdbg_mousetracking_mouseY+' '+mdbg_mousetracking_scrollX+' '+mdbg_mousetracking_scrollY;
601	
602	return true;
603}
604
605// ---------- tooltip ----------
606
607var mdbg_tooltip_tooltipOffsetX = 20;
608var mdbg_tooltip_tooltipOffsetY = 20;
609var mdbg_tooltip_minTooltipWidth = 150;
610var mdbg_tooltip_maxTooltipWidth = 250;
611
612var mdbg_tooltip_tooltipEnabled = false;
613
614function mdbg_tooltip_enable()
615{
616	mdbg_mousetracking_onMouseMove = mdbg_tooltip_onMouseMove;
617	mdbg_mousetracking_enable();
618}
619
620function mdbg_tooltip_onMouseMove()
621{
622	mdbg_tooltip_updateTooltipPosition();
623	mdbg_tooltip_updateTooltipPosition();
624}
625
626function mdbg_tooltip_updateTooltipPosition()
627{
628	// update tooltip postition if it's enabled
629	if(mdbg_tooltip_tooltipEnabled)
630	{
631		// get tooltip
632		var tooltipElement = document.getElementById("mdbg_tooltip");
633
634		if(tooltipElement.offsetWidth < mdbg_tooltip_minTooltipWidth)
635		{
636			tooltipElement.style.width = mdbg_tooltip_minTooltipWidth + 'px';
637		}
638		if(tooltipElement.offsetWidth > mdbg_tooltip_maxTooltipWidth)
639		{
640			tooltipElement.style.width = mdbg_tooltip_maxTooltipWidth + 'px';
641		}
642
643		// set tooltip x location
644		if((mdbg_mousetracking_rightEdgeDistance - mdbg_tooltip_tooltipOffsetX - tooltipElement.offsetWidth) < 0)
645		{
646			tooltipElement.style.left = (mdbg_mousetracking_mouseX - mdbg_tooltip_tooltipOffsetX - tooltipElement.offsetWidth) + "px";
647		}
648		else
649		{
650			tooltipElement.style.left = (mdbg_mousetracking_mouseX + mdbg_tooltip_tooltipOffsetX) + "px";
651		}
652
653//		var debugElement = document.getElementById("debugLabel");
654//		debugElement.innerHTML = '' + tooltipElement.offsetWidth + ' ' + tooltipElement.offsetHeight;
655
656		// set tooltip y location
657		if((mdbg_mousetracking_bottomEdgeDistance - mdbg_tooltip_tooltipOffsetY - tooltipElement.offsetHeight) < 0)
658		{
659			// if the tooltip crosses the bottom screen edge, flip it to the top
660			
661			// calculate the distance between the top of the tooltip and the top screen edge
662			var tooltipTopEdgeDistance = mdbg_mousetracking_topEdgeDistance - (mdbg_tooltip_tooltipOffsetY + tooltipElement.offsetHeight);
663			
664			if(tooltipTopEdgeDistance < 0)
665			{
666				// the tooltip crosses the top border after flipping it, lock it to the top edge
667				tooltipElement.style.top = (mdbg_mousetracking_mouseY - mdbg_tooltip_tooltipOffsetY - tooltipElement.offsetHeight - tooltipTopEdgeDistance) + "px";
668			}
669			else
670			{
671				// place the tooltip on the top
672				tooltipElement.style.top = (mdbg_mousetracking_mouseY - mdbg_tooltip_tooltipOffsetY - tooltipElement.offsetHeight) + "px";
673			}
674		}
675		else
676		{
677			// place the tooltip on the bottom
678			tooltipElement.style.top = (mdbg_mousetracking_mouseY + mdbg_tooltip_tooltipOffsetY) + "px";
679		}
680	}
681}
682
683// show tooltip
684function mdbg_tooltip_show(content)
685{
686	var tooltipElement = document.getElementById("mdbg_tooltip");
687	tooltipElement.innerHTML = content;
688	mdbg_tooltip_updateTooltipPosition();
689	tooltipElement.style.visibility = "visible";
690	mdbg_tooltip_tooltipEnabled = true;
691}
692
693// hide tooltip
694function mdbg_tooltip_hide()
695{
696	var tooltipElement = document.getElementById("mdbg_tooltip");
697	mdbg_tooltip_tooltipEnabled = false;
698	tooltipElement.style.visibility = "hidden";
699	tooltipElement.innerHTML = "";
700	tooltipElement.style.width = '';
701}
702
703function aj(resultId, button, command, row, input)
704{
705	button = $(button);
706	
707	if(typeof mdbgAjState === 'undefined')
708	{
709		mdbgAjState = {};
710	}
711	if(mdbgAjState[resultId] === undefined)
712	{
713		mdbgAjState[resultId] = {};
714		mdbgAjState[resultId].state = new Array();
715		mdbgAjState[resultId].buttons = new Array();
716	}
717	
718	// if(navigator.userAgent.match(/ipad|ipod|iphone/i))
719	// {
720	// 	if(command == 'baike')
721	// 	{
722	// 		window.open('https://baike.baidu.com/searchword/?word=' + input + '&amp;pic=1&amp;sug=1');
723	//
724	// 		return false;
725	// 	}
726	// }
727
728	var elementId = 'aj' + resultId + '_' + row;
729	var element = $("#" + elementId);
730
731	if(mdbgAjState[resultId].buttons[row])
732	{
733		mdbgAjState[resultId].buttons[row].css('border', '');
734		mdbgAjState[resultId].buttons[row].css('background', '');
735	}
736	
737	if(mdbgAjState[resultId].state[row] == command)
738	{
739		button.css('border', '');
740		button.css('background', '');
741		mdbgAjState[resultId].state[row] = '';
742		element.html('');
743		var parent = element.parent();
744		parent.hide();
745	}
746	else
747	{
748		button.css('border', '#8080ff 2px solid');
749		button.css('background', '#e0e0ff');
750		mdbgAjState[resultId].state[row] = command;
751
752		var layoutTable = $('<table cellpadding="0" cellspacing="0" width="100%"></table>');
753		element.html(layoutTable);
754		var layoutTbody = $('<tbody></tbody>');
755		layoutTable.append(layoutTbody);
756		var layoutTr = $('<tr></tr>');
757		layoutTbody.append(layoutTr);
758		var layoutTdLeft = $('<td style="vertical-align: top"></td>');
759		layoutTr.append(layoutTdLeft);
760		var layoutTdRight = $('<td style="vertical-align: top; padding-left: 4px" width="1"></td>');
761		layoutTr.append(layoutTdRight);
762		
763		var closeLink = $('<a href="#"></a>');
764		closeLink.append($('<img class="ajc" src="rsc/img/close2.gif" alt="Close" />'));
765		closeLink.click(function(event) { aj(resultId, button, command, row, input); return false });
766		
767		layoutTdRight.append(closeLink);
768		
769		var content = $('<div></div>');
770		layoutTdLeft.append(content);
771		
772		content.html('<p>Loading data... please wait...</p>');
773		
774		var parent = element.parent();
775		parent.show();
776		
777		if(command == 'google')
778		{
779			content.html('<iframe src="//www.google.com/search?pws=0&amp;newwindow=1&amp;ie=UTF-8&amp;oe=UTF-8&amp;q=' + encodeURIComponent(input) + '" width="730" height="400"></iframe>');
780		}
781		else if(command == 'baike')
782		{
783			content.html('<div style="width: 745px"></div><iframe src="https://baike.baidu.com/searchword/?word=' + input.replace(/[<>&]/g, ' ') + '&amp;pic=1&amp;sug=1" width="99%" height="400" scrolling="yes" style="background-color: #ffffff"></iframe>');
784		}
785		else
786		{
787			$.ajax({
788				url: 'dictionary-ajax',
789				type: "get",
790				dataType: "html",
791				data: {
792					"c": command,
793					"i": input
794				},
795				success: function(returnData) {
796					content.html(returnData); 
797				},
798				error: function(e) {
799					alert(e);
800				}
801			});
802		}
803	}
804	
805	mdbgAjState[resultId].buttons[row] = button;
806	
807	return false;
808}
809
810mdbg.PlaylistSoundPlayer = function(element) {
811	this.element = $(element);
812	this.buttonElement = null;
813	this.playlist = null;
814	this.trackIdx = 0;
815	this.isPlaying = false;
816	this.isInitialized = false;
817	this.onInitHandler = null;
818	this.hadTimeout = false;
819	
820	this.initPlaylist = function(playlist) {
821		var that = this;
822		this.playlist = playlist;
823
824		this.element.html('');
825		this.element.attr('class', 'mdbg_playlistsoundplayer'); 
826		
827		if(window.soundManager) {
828			this.onInit();
829		}
830		else {
831			var sm2Element = $('<div id="sm2-container"></div>');
832			$(document.body).prepend(sm2Element);
833			sm2Element.html('<span class="wmesg"><strong>Warning: flash failed to load!</strong><br />Please click the button below if you are using a flash blocker.<br /></span>');
834
835//			var sm2DebugElement = new Element('div', { 'id': 'soundmanager-debug' });
836//			$(document.body).insert({top: sm2DebugElement});
837
838			window.soundManager = new SoundManager();
839			soundManager.useFlashBlock = true;
840			soundManager.useHTML5Audio = true;
841			soundManager.preferFlash = false;
842			soundManager.debugMode = false;
843			soundManager.debugFlash = false;
844			soundManager.consoleOnly = false;
845			soundManager.url = 'rsc/swf/sm2.v297a-20170601/swf/';
846			soundManager.onready(function() {
847				that.onInitDelayed();
848			});
849			soundManager.ontimeout(function() {
850				that.onTimeout();
851			});
852			soundManager.beginDelayedInit();
853		}
854	};
855
856	this.onTimeout = function() {
857		this.hadTimeout = true;
858	};
859
860	this.onInitDelayed = function() {
861		var that = this;
862		if(this.hadTimeout) {
863			this.hadTimeout = false;
864			setTimeout(function() {
865				that.onInit();
866			}, 1000);
867		}
868		else {
869			this.onInit();
870		}
871	};
872	
873	this.onInit = function() {
874		var that = this;
875
876		var buttonElement = $('<div class="playButton"></div>');
877		this.element.prepend(buttonElement);
878		buttonElement.click(function() {
879			that.onButtonClick();
880		});
881		this.buttonElement = buttonElement;
882
883		var trackListElement = $('<ol></ol>');
884		this.element.append(trackListElement);
885		for(var trackIdx = 0 ; trackIdx < this.playlist.length ; trackIdx++) {
886			var trackElement = $('<li></li>');
887			trackListElement.append(trackElement);
888			
889			var trackLink = $('<a href="#"></a>');
890			trackLink.html(this.playlist[trackIdx].name);
891			trackLink.click(
892				(function(thatTrackIdx){
893					return function() {
894						that.stop();
895						that.play(thatTrackIdx, true);
896						return false;
897					}
898				})(trackIdx));
899			trackElement.append(trackLink);
900
901			this.playlist[trackIdx].element = trackElement;
902		}
903
904		this.isInitialized = true;
905		if(this.onInitHandler) {
906			this.onInitHandler(this);
907		}
908	};
909	
910	this.setOnInitHandler = function(handler) {
911		this.onInitHandler = handler;
912	};
913	
914	this.stop = function() {
915		if(this.isInitialized && this.isPlaying) {
916			soundManager.stopAll();
917			this.onFinish(this.trackIdx);
918		}
919	};
920
921	this.onButtonClick = function() {
922		if(this.isPlaying) {
923			this.stop();
924		}
925		else {
926			this.play(0);
927		}
928	};
929
930	this.onPlay = function(trackIdx) {
931		this.isPlaying = true;
932		this.buttonElement.attr('class', 'stopButton');
933		this.playlist[trackIdx].element.addClass("playing");
934	};
935	
936	this.onFinish = function(trackIdx) {
937		this.isPlaying = false;
938		this.buttonElement.attr('class', 'playButton');
939		this.playlist[trackIdx].element.removeClass("playing");
940	};
941	
942	this.play = function(trackIdx, single) {
943		var that = this;
944		if(trackIdx !== undefined) {
945			this.trackIdx = trackIdx;
946		}
947		else {
948			trackIdx = this.trackIdx;
949		}
950
951		if(this.isInitialized) {
952			var soundId = this.element.attr('id') + '_' + trackIdx;
953			
954			var sound = soundManager.createSound({ id: soundId, url: this.playlist[trackIdx].url });
955
956			this.onPlay(trackIdx);
957
958			if(single || (trackIdx+1) >= this.playlist.length) {
959				sound.play({ onfinish: function() {
960					that.onFinish(trackIdx);
961				} });
962			}
963			else {
964				sound.play({ onfinish: function() {
965					that.onFinish(trackIdx);
966					that.play(trackIdx + 1, false);
967				} });
968//				sound.play({ onjustbeforefinish: function() { that.onFinish(trackIdx); that.play(trackIdx + 1, false); } });
969//				sound.play({ onjustbeforefinish: this.play.bind(this, trackIdx + 1), onfinish: this.onFinish.bind(this, trackIdx) });
970			}
971		}
972	};
973};
974
975mdbg.feedback = function(container, entityType, entityId) {
976	let that = this;
977
978	this.contentElement = $('<div></div>');
979	this.contentElement.addClass('feedback');
980	container.append(this.contentElement);
981
982	this.like = null;
983	this.likeUpCount = 0;
984	this.likeDownCount = 0;
985
986	this.onLike = function() {
987		if (that.like === true) {
988			that.deleteLike(entityType, entityId, that.displayLikes);
989		} else {
990			that.putLike(entityType, entityId, true, that.displayLikes);
991		}
992	};
993
994	this.onDislike = function() {
995		if (that.like === false) {
996			that.deleteLike(entityType, entityId, that.displayLikes);
997		} else {
998			that.putLike(entityType, entityId, false, that.displayLikes);
999		}
1000	};
1001
1002	this.createHtmlControls = function() {
1003		that.likeUpButtonElement = $('<span class="like-button like-up">🖒</span>');
1004		that.contentElement.append(that.likeUpButtonElement);
1005		that.likeUpButtonElement.on('click', that.onLike);
1006
1007		that.likeUpCountElement = $('<span class="like-count like-up"></span>');
1008		that.contentElement.append(that.likeUpCountElement);
1009
1010		that.likeDownButtonElement = $('<span class="like-button like-down">🖓</span>');
1011		that.contentElement.append(that.likeDownButtonElement);
1012		that.likeDownButtonElement.on('click', that.onDislike);
1013
1014		that.likeDownCountElement = $('<span class="like-count like-down"></span>');
1015		that.contentElement.append(that.likeDownCountElement);
1016	}
1017
1018	this.fetchLikes = function(entityType, entityId, success) {
1019		$.get( "api/feedback/likes/" + encodeURIComponent(entityType) + "/" + encodeURIComponent(entityId) + "/counts", success);
1020	}
1021
1022	this.putLike = function(entityType, entityId, like, success) {
1023		$.ajax({
1024			method: "PUT",
1025			url: "api/feedback/likes/" + encodeURIComponent(entityType) + "/" + encodeURIComponent(entityId) + "/counts",
1026			data: JSON.stringify(like),
1027			contentType: "application/json; charset=utf-8",
1028			dataType: 'json',
1029			success: success,
1030
1031		});
1032	}
1033
1034	this.deleteLike = function(entityType, entityId, success) {
1035		$.ajax({
1036			method: "DELETE",
1037			url: "api/feedback/likes/" + encodeURIComponent(entityType) + "/" + encodeURIComponent(entityId) + "/counts",
1038			success: success
1039		});
1040	}
1041
1042	this.displayLikes = function(data) {
1043		that.likeUpCount = data.up;
1044		that.likeDownCount = data.down;
1045		that.like = data.like;
1046
1047		that.likeUpCountElement.text(that.likeUpCount);
1048		that.likeDownCountElement.text(that.likeDownCount);
1049
1050		that.likeUpButtonElement.toggleClass('like-button-selected', that.like === true);
1051		that.likeDownButtonElement.toggleClass('like-button-selected', that.like === false);
1052	};
1053
1054	this.fetchLikes(entityType, entityId, function( data ) {
1055		that.createHtmlControls();
1056		that.displayLikes(data);
1057	});
1058
1059};
1060
1061
1062/* ---------- Start Lightbox ---------- */
1063
1064/*
1065Created By: Chris Campbell
1066Website: http://particletree.com
1067Date: 2/1/2006
1068
1069Adapted By: Simon de Haan
1070Website: http://blog.eight.nl
1071Date: 21/2/2006
1072
1073Adapted By: MDBG
1074Website: https://www.mdbg.net
1075Date: 2011-12-09
1076
1077Inspired by the lightbox implementation found at http://www.huddletogether.com/projects/lightbox/
1078And the lightbox gone wild by ParticleTree at http://particletree.com/features/lightbox-gone-wild/
1079
1080*/
1081
1082mdbg.lightbox = function(ctrl, content, onActivate, onDeactivate) {
1083
1084	this.contentElement = null;
1085	this.content = null;
1086	this.onActivate = null;
1087	this.onDeactivate = null;
1088	this.yPos = 0;
1089	this.xPos = 0;
1090
1091	// Test if the browser is Internet Explorer
1092	this.isIE = function() {
1093		if(navigator.userAgent.toLocaleLowerCase().match(/msie/) == 'msie')
1094			return true;
1095		else
1096			return false;
1097	};
1098	
1099	// Turn everything on - mainly the IE fixes
1100	this.activate = function() {
1101		if (this.isIE()) {
1102			this.getScroll();
1103			this.prepareIE('100%', 'hidden');
1104			this.setScroll(0,0);
1105			this.hideSelects('hidden');
1106		}
1107		
1108		if(this.content)
1109		{
1110			this.contentElement.html(this.content);
1111		}
1112		
1113		this.displayLightbox("block");
1114
1115		if(this.onActivate)
1116		{
1117			this.onActivate();
1118		}
1119	};
1120	
1121	// Ie requires height to 100% and overflow hidden or else you can scroll down past the lightbox
1122	this.prepareIE = function(height, overflow) {
1123		var body = $('body');
1124		body.css('height', height);
1125		body.css('overflow', overflow);
1126  
1127		var html = $('html');
1128		html.css('height', height);
1129		html.css('overflow', overflow);
1130	};
1131	
1132	// In IE, select elements hover on top of the lightbox
1133	this.hideSelects = function(visibility) {
1134		$('select').css('visibility', visibility);
1135	};
1136	
1137	// Taken from lightbox implementation found at http://www.huddletogether.com/projects/lightbox/
1138	this.getScroll = function() {
1139		if (self.pageYOffset) {
1140			this.yPos = self.pageYOffset;
1141		} else if (document.documentElement && document.documentElement.scrollTop) {
1142			this.yPos = document.documentElement.scrollTop; 
1143		} else if (document.body) {
1144			this.yPos = document.body.scrollTop;
1145		}
1146	};
1147	
1148	this.setScroll = function(x, y) {
1149		window.scrollTo(x, y); 
1150	};
1151	
1152	this.displayLightbox = function(display) {
1153		var that = this;
1154		
1155		// get the inner div
1156		var lightbox = this.contentElement.children(":first");
1157		
1158		// set the overlay display mode
1159		$('#overlay').css('display', display);
1160		
1161		// click on the overlay should close the lightbox
1162		if(display != 'none') {
1163			$('#overlay').click(function() {
1164				that.deactivate();
1165			});
1166		}
1167		else {
1168			$('#overlay').off('click');
1169		}
1170
1171		// center the lightbox based on it's size
1172		var width = lightbox.width();
1173		var height = lightbox.height();
1174		if(width == 0)
1175		{
1176			width = parseInt(lightbox.css('width'));
1177			height = parseInt(lightbox.css('height'));
1178		}
1179		lightbox.css('left', (-width / 2) + "px");
1180		lightbox.css('top', (-height / 2) + "px");
1181
1182		// set the lightbox display mode
1183		this.contentElement.css('display', display);
1184
1185		// bind actions
1186		if(display != 'none') {
1187			this.actions();
1188		}
1189	};
1190	
1191	// Search through new links within the lightbox, and attach click event
1192	this.actions = function() {
1193		var lbActions = $('.lbAction');
1194
1195		var that = this;
1196		lbActions.each( function(index) {
1197			var lbAction = $(this);
1198			lbAction.off('click');
1199			lbAction.click(function() {
1200				that[lbAction.attr('rel')]();
1201				return false;
1202			});
1203		});
1204
1205	};
1206	
1207	// Deactivate the lightbox
1208	this.deactivate = function() {
1209		if (this.isIE()) {
1210			this.setScroll(0,this.yPos);
1211			this.prepareIE("auto", "auto");
1212			this.hideSelects("visible");
1213		}
1214		
1215		this.displayLightbox("none");
1216
1217		if(this.content)
1218		{
1219			this.contentElement.html('');
1220		}
1221		
1222		if(this.onDeactivate)
1223		{
1224			this.onDeactivate();
1225		}
1226	};
1227
1228	
1229	
1230	// add the overlay div if missing
1231	if($('#overlay').length == 0)
1232	{
1233		var overlay = $('<div id="overlay"></div>');
1234		var body = $('body');
1235		body.append(overlay);
1236	}
1237	
1238	this.contentElement = $('<div></div>');
1239	this.contentElement.addClass('lightbox');
1240	var body = $('body');
1241	body.append(this.contentElement);
1242	
1243	if(onActivate)
1244	{
1245		this.onActivate = onActivate;
1246	}
1247	if(onDeactivate)
1248	{
1249		this.onActivate = onDeactivate;
1250	}
1251	
1252	this.content = content;
1253
1254	var that = this;
1255	ctrl.off('click');
1256	ctrl.click(function (){ 
1257		that.activate();
1258		return false;
1259	});
1260};
1261
1262/* ---------- End Lightbox ---------- */
1263
1264mdbg.createCrAdLightbox = function(ctrl, sourceId)
1265{
1266	var content = '<div style="width: 640px; height: 400px">';
1267	content += '	<iframe style="background-color: #bbb" width="640" height="360" src="//www.youtube.com/embed/6RtMX1Hf-KI?autohide=1&amp;autoplay=1&amp;controls=0&amp;hd=1&amp;iv_load_policy=3&amp;rel=0&amp;showsearch=0" frameborder="0" allowfullscreen></iframe>';
1268	content += '	<div style="padding-top: 5px">';
1269	content += '		<button onclick="trackExitLink(\'mdbg.loqu8.com\', \'' + sourceId + '-lb_download\', \'ad\'); window.location = \'https://mdbg.loqu8.com/installing.htm\'">Download</button>';
1270	content += '		<button onclick="trackExitLink(\'mdbg.loqu8.com\', \'' + sourceId + '-lb_moreinfo\', \'ad\'); window.location = \'https://mdbg.loqu8.com/\'">Learn more</button>';
1271	content += '	</div>';
1272	content += '	<div style="position: absolute; bottom: 30px; right: 10px">';
1273	content += '		<a href="#" class="lbAction" rel="deactivate">Close</a>';
1274	content += '	</div>';
1275	content += '	<div style="position: absolute; bottom: 10px; right: 10px">';
1276	content += '		<a href="dictionary?page=contact&amp;meelcommentabout=chinesereader&amp;meelcommentaboutversion=trial">Unable to install? Please contact us.</a>';
1277	content += '	</div>';
1278	content += '	<div style="position: absolute; bottom: -1px; left: 10px">';
1279	content += '		<iframe width="1" height="1" frameborder="0" style="background-color: #b8b8b8" src="https://mdbg.loqu8.com/installing.htm"></iframe>';
1280	content += '	</div>';
1281	content += '</div>';
1282
1283	new mdbg.lightbox(ctrl, content, function() { trackExitLink('mdbg.loqu8.com', sourceId + '-lb_open', 'ad'); } );
1284}
1285
1286
1287mdbg.createCrAdLightboxCn = function(ctrl, sourceId)
1288{
1289	var content = '<div style="width: 640px; height: 440px">';
1290	content += '	<embed src="//static.youku.com/v/swf/qplayer.swf?VideoIDS=XMzM0NTEyNzE2=&isAutoPlay=true&isShowRelatedVideo=false&embedid=-&showAd=0" quality="high" width="640" height="400" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>';
1291	content += '	<div style="padding-top: 5px">';
1292	content += '		<button onclick="trackExitLink(\'mdbg.loqu8.com\', \'' + sourceId + '-lb_download-cn\', \'ad\'); window.location = \'https://mdbg.loqu8.com/installing.htm\'">Download</button>';
1293	content += '		<button onclick="trackExitLink(\'mdbg.loqu8.com\', \'' + sourceId + '-lb_moreinfo-cn\', \'ad\'); window.location = \'https://mdbg.loqu8.com/\'">Learn more</button>';
1294	content += '	</div>';
1295	content += '	<div style="position: absolute; bottom: 30px; right: 10px">';
1296	content += '		<a href="#" class="lbAction" rel="deactivate">Close</a>';
1297	content += '	</div>';
1298	content += '	<div style="position: absolute; bottom: 10px; right: 10px">';
1299	content += '		<a href="dictionary?page=contact&amp;meelcommentabout=chinesereader&amp;meelcommentaboutversion=trial">Unable to install? Please contact us.</a>';
1300	content += '	</div>';
1301	content += '	<div style="position: absolute; bottom: -1px; left: 10px">';
1302	content += '		<iframe width="1" height="1" frameborder="0" style="background-color: #b8b8b8" src="https://mdbg.loqu8.com/installing.htm"></iframe>';
1303	content += '	</div>';
1304	content += '</div>';
1305	
1306	new mdbg.lightbox(ctrl, content, function() { trackExitLink('mdbg.loqu8.com', sourceId + '-lb_open-cn', 'ad'); } );
1307}
1308
1309
1310// source: http://lions-mark.com/jquery/scrollTo/
1311$.fn.scrollTo = function( target, options, callback ){
1312	  if(typeof options == 'function' && arguments.length == 2){ callback = options; options = target; }
1313	  var settings = $.extend({
1314	    scrollTarget  : target,
1315	    offsetTop     : 50,
1316	    duration      : 500,
1317	    easing        : 'swing'
1318	  }, options);
1319	  return this.each(function(){
1320	    var scrollPane = $(this);
1321	    var scrollTarget = (typeof settings.scrollTarget == "number") ? settings.scrollTarget : $(settings.scrollTarget);
1322	    var scrollY = (typeof scrollTarget == "number") ? scrollTarget : scrollTarget.offset().top + scrollPane.scrollTop() - parseInt(settings.offsetTop);
1323	    scrollPane.animate({scrollTop : scrollY }, parseInt(settings.duration), settings.easing, function(){
1324	      if (typeof callback == 'function') { callback.call(this); }
1325	    });
1326	  });
1327	}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.