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