1 2function UCSideMenu(menuWrapperID, urlAjax){ 3 4 var g_menuWrapper, g_menuID, g_objButtonToggle, g_objInputBox, g_isCloseOnOpen, g_isClickable, g_isOpenOnLoad; 5 var g_pushOnOpen, g_pushOnOpenMobile, g_lastBodyPadding; 6 var g_startExpanded; 7 var g_dataLinkNum; 8 var g_dataSpeed; 9 var g_menuOpenedClass; 10 11 //add support to swiper container 12 function pushSwipers(num){ 13 14 var objSwipers = jQuery(".swiper-container"); 15 16 objSwipers.each(function(){ 17 18 var objSwiper = jQuery(this); 19 20 objSwiper.css("transform", "translate("+num+"px, 0)"); 21 22 }); 23 24 } 25 26 function releaseSwipers(){ 27 28 var objSwipers = jQuery(".swiper-container"); 29 30 objSwipers.each(function(){ 31 32 var objSwiper = jQuery(this); 33 34 objSwiper.css("transform", ""); 35 }); 36 37 } 38 39 function openNav() { 40 41 var objBody = jQuery("body"); 42 var menuWidth = g_menuWrapper.width(); 43 44 objBody.addClass(g_menuOpenedClass); 45 46 if ( g_menuWrapper.hasClass("menu-right-close")) { 47 48 function pushContentToLeft(){ 49 objBody.addClass("uc-menu-push"); 50 objBody.css("padding-right",menuWidth+"px"); 51 52 pushSwipers(-menuWidth); 53 54 } 55 56 g_menuWrapper.removeClass("menu-right-close"); 57 g_menuWrapper.addClass("menu-right-open"); 58 59 if(window.matchMedia("(min-width: 420px)").matches && g_pushOnOpen == true){ 60 pushContentToLeft(); 61 } 62 63 if(window.matchMedia("(max-width: 420px)").matches && g_pushOnOpenMobile == true){ 64 pushContentToLeft(); 65 } 66 67 g_lastBodyPadding = objBody.css("padding-right"); 68 69 } else if (g_menuWrapper.hasClass("menu-left-close")) { 70 71 function pushContentToRight(){ 72 objBody.addClass("uc-menu-push"); 73 objBody.css("padding-left",menuWidth+"px"); 74 75 pushSwipers(menuWidth); 76 77 } 78 79 g_menuWrapper.removeClass("menu-left-close"); 80 g_menuWrapper.addClass("menu-left-open"); 81 82 if(window.matchMedia("(min-width: 420px)").matches && g_pushOnOpen == true){ 83 pushContentToRight(); 84 } 85 86 if(window.matchMedia("(max-width: 420px)").matches && g_pushOnOpenMobile == true){ 87 pushContentToRight(); 88 } 89 90 g_lastBodyPadding = objBody.css("padding-left"); 91 92 } 93 94 g_objButtonToggle.addClass("uc-close-action"); 95 96 } 97 98 /** 99 * close the menu 100 */ 101 function closeNav() { 102 103 g_objButtonToggle.removeClass("uc-close-action"); 104 105 checkUrlAndSelectActive(); 106 107 var objBody = jQuery("body"); 108 objBody.removeClass(g_menuOpenedClass); 109 110 if (g_menuWrapper.hasClass("menu-left-open")) { 111 112 function lastBodyPaddingLeft() { 113 114 setTimeout(function(){ 115 objBody.removeClass("uc-menu-push"); 116 },g_dataSpeed*1000); 117 118 objBody.css("padding-left", ''); 119 120 releaseSwipers(); 121 122 } 123 124 g_menuWrapper.toggleClass("menu-left-close"); 125 126 if(window.matchMedia("(min-width: 420px)").matches && g_pushOnOpen == true) { 127 lastBodyPaddingLeft(); 128 } 129 130 if(window.matchMedia("(max-width: 420px)").matches && g_pushOnOpenMobile == true) { 131 lastBodyPaddingLeft(); 132 } 133 134 } else if (g_menuWrapper.hasClass("menu-right-open")) { 135 136 function lastBodyPaddingRight() { 137 138 setTimeout(function(){ 139 objBody.removeClass("uc-menu-push"); 140 },g_dataSpeed*1000) 141 142 objBody.css("padding-right", ''); 143 144 releaseSwipers(); 145 146 } 147 148 g_menuWrapper.toggleClass("menu-right-close"); 149 150 if(window.matchMedia("(min-width: 420px)").matches && g_pushOnOpen == true){ 151 lastBodyPaddingRight(); 152 } 153 154 if(window.matchMedia("(max-width: 420px)").matches && g_pushOnOpenMobile == true) { 155 lastBodyPaddingRight(); 156 } 157 158 } 159 160 161 } 162 163 164 function isMenuClosed(){ 165 166 var isClose = g_objButtonToggle.hasClass("uc-close-action"); 167 168 return(!isClose); 169 } 170 171 function onButtonToggleClick(){ 172 173 var isClose = g_objButtonToggle.hasClass("uc-close-action"); 174 175 if(isClose == true) 176 closeNav(); 177 else 178 openNav(); 179 180 } 181 182 /** 183 * collapse inner section 184 */ 185 function collapseInnerSection(element){ 186 187 var sectionHeight = element.scrollHeight; 188 189 var elementTransition = element.style.transition; 190 element.style.transition = ''; 191 192 requestAnimationFrame(function() { 193 194 element.style.height = sectionHeight + 'px'; 195 element.style.transition = elementTransition; 196 197 requestAnimationFrame(function() { 198 element.style.height = 0 + 'px'; 199 }); 200 201 }); 202 203 element.setAttribute('data-collapsed', 'true'); 204 } 205 206 /** 207 * expand the inner of the section 208 */ 209 function expandSectionInner(element){ 210 211 var sectionHeight = element.scrollHeight; 212 element.style.height = sectionHeight + 'px'; 213 214 element.addEventListener('transitionend', function(e) { 215 element.removeEventListener('transitionend', arguments.callee); 216 element.style.height = null; 217 }); 218 element.setAttribute('data-collapsed', 'false'); 219 } 220 221 /** 222 * expand section 223 */ 224 function expandSection(section, objLink){ 225 226 expandSectionInner(section); 227 228 section.setAttribute('data-collapsed', 'false') 229 objLink.removeClass("collapsed"); 230 objLink.addClass("expanded"); 231 232 } 233 234 /** 235 * collapse the section 236 */ 237 function collapseSection(section, objLink){ 238 239 collapseInnerSection(section); 240 241 objLink.addClass("collapsed"); 242 objLink.removeClass("expanded"); 243 } 244 245 /** 246 * collapse all expanded sections 247 */ 248 function collapseAllExpanded(clickedItem){ 249 250 var clickedParentExpanded = jQuery(clickedItem).parents('.sub-menu').prev(); 251 var clickedChildrenExpanded = jQuery(clickedItem).next().find('.expanded'); 252 253 var objAllExpanded = g_menuWrapper.find(".expanded").not(clickedChildrenExpanded).not(clickedParentExpanded); 254 255 if(objAllExpanded.length == false) 256 return(false); 257 258 jQuery.each(objAllExpanded, function(index, link){ 259 var objLink = jQuery(link); 260 var section = link.nextElementSibling; 261 262 collapseSection(section, objLink); 263 264 }); 265 } 266 267 /** 268 * close or open link 269 */ 270 function toggleSection(objLink){ 271 272 var link = objLink[0]; 273 var section = link.nextElementSibling; 274 275 var isCollapsed = section.getAttribute('data-collapsed') === 'true'; 276 277 if (isCollapsed) { //expend current 278 279 if(g_isCloseOnOpen == true) 280 collapseAllExpanded(link); 281 282 expandSection(section, objLink); 283 284 } else { //collapse current 285 286 collapseSection(section,objLink); 287 } 288 289 } 290 291 /** 292 * toggle menu item icon 293 */ 294 function menuItemIconToggle(link){ 295 296 var objWrapper = jQuery("#"+menuWrapperID); 297 298 //add icons to pointer elements 299 var pointerSelector = ".uc-menu-item-pointer"; 300 301 var objPointer = jQuery(link).find(pointerSelector); 302 var objPsrentsMenuItems = jQuery(link).parents(".menu-item-has-children"); 303 var objParentsPointers = objPsrentsMenuItems.find(pointerSelector); 304 var objAllPointers = g_menuWrapper.find(pointerSelector).not(objParentsPointers); 305 306 var objExpandedIcon = objWrapper.find(".uc-side-menu-expand-icon"); 307 var objCollapsedIcon = objWrapper.find(".uc-side-menu-collapse-icon"); 308 309 if(!objExpandedIcon.length || !objCollapsedIcon) 310 return(false); 311 312 var expandedIconHtml = objExpandedIcon.html(); 313 var collapsedIconHtml = objCollapsedIcon.html(); 314 315 if(jQuery(link).hasClass("collapsed") == true){ 316 317 objAllPointers.html(expandedIconHtml); 318 objPointer.html(expandedIconHtml); 319 320 } 321 322 if(jQuery(link).hasClass("expanded") == true){ 323 324 objAllPointers.html(expandedIconHtml); 325 objPointer.html(collapsedIconHtml); 326 327 } 328 329 330 } 331 332 /** 333 * open or close some item 334 */ 335 function openCloseItem(link, event, isPointer, isOnlyOpen){ 336 337 var section = link.nextElementSibling; 338 339 if(isPointer == true){ 340 section = jQuery(link).parents("a")[0].nextElementSibling; 341 } 342 343 if(!section) 344 return(true); 345 346 var objSection = jQuery(section); 347 348 if(objSection.hasClass("sub-menu") == false) 349 return(true); 350 351 if(event) 352 event.preventDefault(); 353 354 var objLink = jQuery(link); 355 356 var isCollapsed = section.getAttribute('data-collapsed') === 'true'; 357 358 359 if(isCollapsed == true && isOnlyOpen == true){ 360 361 expandSection(section, objLink); 362 363 return(true); 364 365 } 366 367 368 369 if (isCollapsed == true && !isOnlyOpen) { //expend current 370 371 if(g_isCloseOnOpen == true) 372 collapseAllExpanded(link); 373 374 expandSection(section, objLink); 375 376 } else if(isCollapsed == false && !isOnlyOpen) { //collapse current 377 378 collapseSection(section,objLink); 379 } 380 381 menuItemIconToggle(link); 382 383 } 384 385 /** 386 * if clicked link is an anchor then close nav 387 */ 388 function closeNavOnAnchorLinkClick(objLink, event){ 389 390 var url = objLink.attr("href"); 391 url = jQuery.trim(url); 392 393 if(!url) 394 return(true); 395 396 var objLinkIcon = objLink.find('.uc-menu-item-pointer'); 397 398 if(!objLinkIcon) 399 return(true); 400 401 var target = event.target; 402 403 if(target == objLinkIcon[0]) 404 return(true); 405 406 var objLinkParent = objLink.parent(); 407 408 if(g_isClickable == false){ 409 410 if(objLinkParent.hasClass('menu-item-has-children')) 411 return(true) 412 413 //check if clicked link is an anchor link 414 if (url.indexOf("#") > -1) 415 closeNav(); 416 417 }else{ 418 419 //check if clicked link is an anchor link 420 if (url.indexOf("#") > -1) 421 closeNav(); 422 423 } 424 425 } 426 427
428 /** 429 * on menu item click, if sub menu, open or close 430 */ 431 function onMenuItemClick(event){ 432 433 openCloseItem(this,event); 434 435 var objLink = jQuery(this); 436 437 closeNavOnAnchorLinkClick(objLink, event) 438 439 } 440 441 /** 442 * console log shorcut 443 */ 444 function trace(str){ 445 446 console.log(str); 447 } 448 449 /** 450 * do search 451 */ 452 function doSearch(){ 453 454 if(!g_objInputBox) 455 return(false); 456 457 var searchString = g_objInputBox.val(); 458 459 searchString = jQuery.trim(searchString); 460 461 if(!searchString) 462 return(true); 463 464 var urlBase = g_objInputBox.data("urlbase"); 465 var urlSearch = urlBase+"?s="+searchString; 466 467 location.href = urlSearch; 468 469 } 470 471 472 /** 473 * on input box key up - if enter clicked - go to search 474 */ 475 function onInputBoxKeyUp(event){ 476 477 if(event.keyCode !== 13) 478 return(true); 479 480 doSearch(); 481 } 482 483 /** 484 * on menu body click - disable propogation 485 */ 486 function onMenuBodyClick(event){ 487 488 event.stopPropagation(); 489 } 490 491 /** 492 * on body click - close the menu if needed 493 */ 494 function onBodyClick(){ 495 496 var isClosed = isMenuClosed(); 497 498 if(isClosed == true) 499 return(true); 500 501 closeNav(); 502 } 503 504 //on trigger link click 505 506 function onLinkClick(e){ 507 508 var objLink = jQuery(this); 509 510 var dataMenuName = g_menuWrapper.data('name'); 511 var dataLinkName = objLink.data('name'); 512 513 if(dataLinkName == undefined){ 514 return(false); 515 } 516 517 e.preventDefault(); 518 if(dataLinkName == dataMenuName){ 519 g_objButtonToggle.trigger("click"); 520 }else{ 521 return(false); 522 } 523 } 524 525 /** 526 * init open links 527 */ 528 function initLinks(){ 529 530 var objLinks = jQuery('.ue-link-open-menu').not(".uc-link-inited"); 531 532 if(objLinks.length == 0){ 533 return(false); 534 } 535 536 var elementName = g_menuWrapper.data("name"); 537 538 jQuery.each(objLinks, function(index, linkElement){ 539 540 var objLink = jQuery(linkElement); 541 542 var name = objLink.data("name"); 543 544 if(name != elementName) 545 return(true); 546 547 objLink.addClass("uc-link-inited"); 548 549 objLink.on("click", onLinkClick); 550 551 }); 552 553 554 } 555 556 /* 557 * scrolls to elment 558 */ 559 function scrollMenuToElement(elementOffsetTop){ 560 561 var objScrollableHolder = jQuery("#"+menuWrapperID).find(".uc-side-menu-items"); 562 563 //wait untill all transitions are finished 564 setTimeout(function(){ 565 566 objScrollableHolder.animate({ 567 scrollTop: elementOffsetTop 568 }, 100) 569 570 }, 500); 571 572 } 573 574 /** 575 * finds if element is in viewport 576 */ 577 function isElementInViewport(element) { 578 579 var elementTop = element.offset().top; 580 var elementBottom = elementTop + element.outerHeight(); 581 582 var viewportTop = jQuery(window).scrollTop(); 583 var viewportBottom = viewportTop + jQuery(window).height(); 584 585 var isInViwport = elementBottom > viewportTop && elementTop < viewportBottom; 586 587 return(isInViwport); 588 } 589 590 /* 591 * check url and select active item 592 */ 593 function checkUrlAndSelectActive(){ 594 595 var currentPageClass = "current_page_item"; 596 597 var objlinks = jQuery("#"+menuWrapperID).find('a'); 598 599 objlinks.each(function(){ 600 601 var objLink = jQuery(this); 602 var linkHref = objLink.attr("href"); 603 604 //if link has same link adress as menu item then open menu item 605 if(linkHref != urlAjax) 606 return(true); 607 608 var objMenuListItem = objLink.parents('li'); 609 610 objlinks.removeClass(currentPageClass); 611 objMenuListItem.addClass(currentPageClass); 612 613 var objParentLinks = objLink.parents('.sub-menu').prev(); 614 615 objParentLinks.each(function(index, elem){ 616 617 var objParentLink = jQuery(this); 618 619 if(objParentLink.hasClass("collapsed")){ 620 621 if(g_isClickable == false){ 622 623 openCloseItem(objParentLink[0]); 624 625 } 626 627 if(g_isClickable == true){ 628 629 var objPointer = objParentLink.find(".uc-menu-item-pointer"); 630 631 openCloseItem(objPointer[0], false, true, true); 632 633 } 634 635 } 636 637 }); 638 639 //check if item is in viewport and scroll if needed 640 objLinkOffsetTop = objLink.offset().top; 641 642 if(isElementInViewport(objLink) == false){ 643 644 scrollMenuToElement(objLinkOffsetTop); 645 646 } 647 648 }); 649 650 } 651 652 /* 653 * open current page menu item 654 */ 655 function checkUrlAndTriggerClick(){ 656 657 if(g_startExpanded == true) 658 return(false); 659 660 var currentPageClass = "current_page_item"; 661 662 var objlinks = jQuery("#"+menuWrapperID).find('a'); 663 664 objlinks.each(function(){ 665 666 var objLink = jQuery(this); 667 var linkHref = objLink.attr("href"); 668 669 //if link has same link adress as menu item then open menu item 670 if(linkHref != urlAjax) 671 return(true); 672 673 var objMenuListItem = objLink.parents('li'); 674 675 objlinks.removeClass(currentPageClass); 676 objMenuListItem.addClass(currentPageClass); 677 678 679 //check if item is in viewport and scroll if needed 680 objLinkOffsetTop = objLink.offset().top; 681 682 if(isElementInViewport(objLink) == false){ 683 684 scrollMenuToElement(objLinkOffsetTop); 685 686 } 687 688 var objLinkToOpens = objLink.parents('.sub-menu').prev(); 689 690 if(g_isClickable == false){ 691 692 objLinkToOpens.each(function(){ 693 694 var objLinkToOpen = jQuery(this); 695 openCloseItem(objLinkToOpen[0]); 696 697 }); 698 699 } 700 701 if(g_isClickable == true){ 702 703 objLinkToOpens.each(function(){ 704 705 var objLinkToOpen = jQuery(this); 706 var objPointer = objLinkToOpen.find(".uc-menu-item-pointer"); 707 708 openCloseItem(objPointer[0], false, true, true); 709 710 }); 711 712 } 713 714 }); 715 716 } 717 718 /** 719 * check if menu is hidden after resize 720 */ 721 function onWindowResize(){ 722 723 var isMenuOpened = jQuery("body").hasClass(g_menuOpenedClass); 724 725 //only if menu is opened and body has overflow hidden 726 if(isMenuOpened == false) 727 return(false); 728 729 var objParents = g_menuWrapper.parents(); 730 731 objParents.each(function(){ 732 733 var objParent = jQuery(this); 734 var isParentVisible = objParent.is(":visible"); 735 736 if(isParentVisible == true) 737 return(true); 738 739 closeNav(); 740 741 }); 742 743 } 744 745 /** 746 * collapse inner section after init 747 */ 748 function initCollapsedState(item){ 749 750 collapseInnerSection(item.nextElementSibling); 751 752 jQuery(item).addClass("collapsed"); 753 jQuery(item).removeClass("expanded"); 754 755 } 756 757 /** 758 * run the menu, init 759 */ 760 function runMenu(){ 761 762 var objWrapper = jQuery("#"+menuWrapperID); 763 764 g_menuWrapper = objWrapper.find(".uc-side-menu-wrapper"); 765 g_isClickable = objWrapper.data("clickable"); 766 g_isCloseOnOpen = objWrapper.data("closeothers"); 767 768 var isCloseOnBody = objWrapper.data("closeonbody"); 769 g_isOpenOnLoad = g_menuWrapper.data("openonload"); 770 771 g_pushOnOpen = objWrapper.data("push"); 772 g_pushOnOpenMobile = objWrapper.data("push-mobile") 773 g_dataSpeed = objWrapper.data("speed"); 774 775 g_startExpanded = objWrapper.data("expand"); 776
777 var objButtonClose = g_menuWrapper.find(".uc-close-side-menu"); 778 779 g_objButtonToggle = objWrapper.find(".open_side_menu"); 780 781 g_objInputBox = g_menuWrapper.find("input[type='text']"); 782 783 g_menuID = menuWrapperID; 784 785 g_menuOpenedClass = "menu-opened"; 786 787 788 789 if(g_menuWrapper.length == 0){ 790 console.log("menu with ID: "+menuWrapperID+" not found!"); 791 return(false); 792 } 793 794 if(objButtonClose.length == 0){ 795 console.log("The close button not found"); 796 return(false); 797 } 798 799 if(g_objButtonToggle.length == 0){ 800 console.log("The trigger button not found"); 801 return(false); 802 } 803 804 //collapse or expand all 805 var dataExpandFirst = objWrapper.data("first-expand"); 806 807 g_menuWrapper.find("ul.uc-list-menu li a").each((i, item) => { 808 809 if(item.nextElementSibling){ 810 811 var objItem = jQuery(item); 812 objItem.append("<span class='uc-menu-item-pointer'></span>"); 813 814 if(g_startExpanded == false){ 815 816 //expand first 817 if(dataExpandFirst == true && i != 0) 818 initCollapsedState(item); 819 else if(dataExpandFirst == false) 820 initCollapsedState(item); 821 822 }else{ 823 824 jQuery(item).removeClass("collapsed"); 825 jQuery(item).addClass("expanded"); 826 827 } 828 829 //add icons to pointer elements 830 menuItemIconToggle(item); 831 832 } 833 834 }); 835 836 initLinks(); 837 838 //init events 839
840 if(g_objInputBox.length == 0) 841 g_objInputBox = null; 842 843 if(g_objInputBox) 844 g_objInputBox.on("keyup",onInputBoxKeyUp); 845 846 var objButtonSearch = g_menuWrapper.find(".side-menu-search-button-search"); 847 objButtonSearch.on("click", doSearch); 848 849 var objLinks = g_menuWrapper.find("ul.uc-list-menu li a"); 850 851 if(g_isClickable == false){ 852 objLinks.on("click", onMenuItemClick); 853 }else{ 854 855 var objPointers = g_menuWrapper.find("ul.uc-list-menu li .uc-menu-item-pointer"); 856 857 //pointer click - toggle section 858 objPointers.on("click", function(event){ 859 860 event.preventDefault(); 861 862 var objLink = jQuery(this); 863 var objParentLink = objLink.parent(); 864 865 toggleSection(objParentLink); 866 867 menuItemIconToggle(objParentLink[0]); 868 869 }); 870 871 //close nav if anchor link clicked 872 objLinks.on("click", function(event){ 873 874 var objLink = jQuery(this); 875 876 closeNavOnAnchorLinkClick(objLink, event); 877 878 }); 879 880 } 881 882 if(dataExpandFirst == false) 883 setTimeout(checkUrlAndTriggerClick,500); 884 885 objButtonClose.on("click", closeNav); 886 887 g_objButtonToggle.on("click", onButtonToggleClick); 888 889 if(isCloseOnBody === true){ 890 891 var objOverlay = g_menuWrapper.find(".ue_side_menu_overlay"); 892 893 if(objOverlay.length) 894 objOverlay.on("click", closeNav); 895 else{ 896 g_menuWrapper.on("click", onBodyClick); 897 g_objButtonToggle.on("click", onBodyClick); 898 899 jQuery("body").on("click", onBodyClick); 900 } 901 902 } 903 904 if(g_isOpenOnLoad === true){ 905 g_objButtonToggle.trigger("click"); 906 } 907 908 jQuery(window).on("resize", onWindowResize); 909 } 910 911 runMenu(); 912 913} 914
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.