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 + '&pic=1&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&newwindow=1&ie=UTF-8&oe=UTF-8&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, ' ') + '&pic=1&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&autoplay=1&controls=0&hd=1&iv_load_policy=3&rel=0&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&meelcommentabout=chinesereader&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&meelcommentabout=chinesereader&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.