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 9 10 function openNav() { 11 12 var objBody = jQuery("body"); 13 var menuWidth = g_menuWrapper.width(); 14 15 objBody.addClass("menu-opened"); 16 17 if ( g_menuWrapper.hasClass("menu-right-close")) { 18 19 function pushContentToLeft(){ 20 objBody.addClass("uc-menu-push"); 21 objBody.css("padding-right",menuWidth+"px"); 22 } 23 24 g_menuWrapper.removeClass("menu-right-close"); 25 g_menuWrapper.addClass("menu-right-open"); 26 27 if(window.matchMedia("(min-width: 420px)").matches && g_pushOnOpen == true){ 28 pushContentToLeft(); 29 } 30 31 if(window.matchMedia("(max-width: 420px)").matches && g_pushOnOpenMobile == true){ 32 pushContentToLeft(); 33 } 34 35 g_lastBodyPadding = objBody.css("padding-right"); 36 37 } else if (g_menuWrapper.hasClass("menu-left-close")) { 38 39 function pushContentToRight(){ 40 objBody.addClass("uc-menu-push"); 41 objBody.css("padding-left",menuWidth+"px"); 42 } 43 44 g_menuWrapper.removeClass("menu-left-close"); 45 g_menuWrapper.addClass("menu-left-open"); 46 47 if(window.matchMedia("(min-width: 420px)").matches && g_pushOnOpen == true){ 48 pushContentToRight(); 49 } 50 51 if(window.matchMedia("(max-width: 420px)").matches && g_pushOnOpenMobile == true){ 52 pushContentToRight(); 53 } 54 55 g_lastBodyPadding = objBody.css("padding-left"); 56 57 } 58 59 g_objButtonToggle.addClass("uc-close-action"); 60 61 } 62 63 /** 64 * close the menu 65 */ 66 function closeNav() { 67 68 g_objButtonToggle.removeClass("uc-close-action"); 69 70 var objBody = jQuery("body"); 71 objBody.removeClass("menu-opened"); 72 73 if (g_menuWrapper.hasClass("menu-left-open")) { 74 75 function lastBodyPaddingLeft() { 76 objBody.css("padding-left",g_lastBodyPadding); 77 } 78 79 g_menuWrapper.toggleClass("menu-left-close"); 80 81 if(window.matchMedia("(min-width: 420px)").matches && g_pushOnOpen == true) { 82 lastBodyPaddingLeft(); 83 } 84 85 if(window.matchMedia("(max-width: 420px)").matches && g_pushOnOpenMobile == true) { 86 lastBodyPaddingLeft(); 87 } 88 89 } else if (g_menuWrapper.hasClass("menu-right-open")) { 90 91 function lastBodyPaddingRight() { 92 objBody.css("padding-right",g_lastBodyPadding); 93 } 94 95 g_menuWrapper.toggleClass("menu-right-close"); 96 97 if(window.matchMedia("(min-width: 420px)").matches && g_pushOnOpen == true){ 98 lastBodyPaddingRight(); 99 } 100 101 if(window.matchMedia("(max-width: 420px)").matches && g_pushOnOpenMobile == true) { 102 lastBodyPaddingRight(); 103 } 104 105 } 106 107 108 } 109 110 111 function isMenuClosed(){ 112 113 var isClose = g_objButtonToggle.hasClass("uc-close-action"); 114 115 return(!isClose); 116 } 117 118 function onButtonToggleClick(){ 119 120 var isClose = g_objButtonToggle.hasClass("uc-close-action"); 121 122 if(isClose == true) 123 closeNav(); 124 else 125 openNav(); 126 127 } 128 129 /** 130 * collapse inner section 131 */ 132 function collapseInnerSection(element){ 133 134 var sectionHeight = element.scrollHeight; 135 136 var elementTransition = element.style.transition; 137 element.style.transition = ''; 138 139 requestAnimationFrame(function() { 140 element.style.height = sectionHeight + 'px'; 141 element.style.transition = elementTransition; 142 requestAnimationFrame(function() { 143 element.style.height = 0 + 'px'; 144 }); 145 }); 146 147 element.setAttribute('data-collapsed', 'true'); 148 } 149 150 /** 151 * expand the inner of the section 152 */ 153 function expandSectionInner(element){ 154 155 var sectionHeight = element.scrollHeight; 156 element.style.height = sectionHeight + 'px'; 157 element.addEventListener('transitionend', function(e) { 158 element.removeEventListener('transitionend', arguments.callee); 159 160 element.style.height = null; 161 }); 162 element.setAttribute('data-collapsed', 'false'); 163 } 164 165 /** 166 * expand section 167 */ 168 function expandSection(section, objLink){ 169 170 expandSectionInner(section); 171 172 section.setAttribute('data-collapsed', 'false') 173 objLink.removeClass("collapsed"); 174 objLink.addClass("expanded"); 175 176 } 177 178 /** 179 * collapse the section 180 */ 181 function collapseSection(section, objLink){ 182 183 collapseInnerSection(section); 184 185 objLink.addClass("collapsed"); 186 objLink.removeClass("expanded"); 187 } 188 189 /** 190 * collapse all expanded sections 191 */ 192 function collapseAllExpanded(clickedItem){ 193 194 var clickedParentExpanded = jQuery(clickedItem).parents('.sub-menu').prev(); 195 var clickedChildrenExpanded = jQuery(clickedItem).next().find('.expanded'); 196 197 var objAllExpanded = g_menuWrapper.find(".expanded").not(clickedChildrenExpanded).not(clickedParentExpanded); 198 199 if(objAllExpanded.length == false) 200 return(false); 201 202 jQuery.each(objAllExpanded, function(index, link){ 203 var objLink = jQuery(link); 204 var section = link.nextElementSibling; 205 206 collapseSection(section, objLink); 207 208 }); 209 } 210 211 /** 212 * close or open link 213 */ 214 function toggleSection(objLink){ 215 216 var link = objLink[0]; 217 var section = link.nextElementSibling; 218 219 var isCollapsed = section.getAttribute('data-collapsed') === 'true'; 220 221 if (isCollapsed) { //expend current 222 223 if(g_isCloseOnOpen == true) 224 collapseAllExpanded(link); 225 226 expandSection(section, objLink); 227 228 } else { //collapse current 229 230 collapseSection(section,objLink); 231 } 232 233 } 234 235 /** 236 * toggle menu item icon 237 */ 238 function menuItemIconToggle(link){ 239 240 var objWrapper = jQuery("#"+menuWrapperID); 241 242 //add icons to pointer elements 243 var objPointer = jQuery(link).find(".uc-menu-item-pointer"); 244 var objExpandedIcon = objWrapper.find(".uc-side-menu-expand-icon"); 245 var objCollapsedIcon = objWrapper.find(".uc-side-menu-collapse-icon"); 246 247 if(!objExpandedIcon.length || !objCollapsedIcon) 248 return(false); 249 250 var expandedIconHtml = objExpandedIcon.html(); 251 var collapsedIconHtml = objCollapsedIcon.html(); 252 253 if(jQuery(link).hasClass("collapsed") == true) 254 objPointer.html(expandedIconHtml); 255 256 if(jQuery(link).hasClass("expanded") == true) 257 objPointer.html(collapsedIconHtml); 258 259 260 } 261 262 /** 263 * open or close some item 264 */ 265 function openCloseItem(link, event){ 266 267 var section = link.nextElementSibling; 268 if(!section) 269 return(true); 270 271 var objSection = jQuery(section); 272 if(objSection.hasClass("sub-menu") == false) 273 return(true); 274 275 if(event) 276 event.preventDefault(); 277 278 var objLink = jQuery(link); 279 280 var isCollapsed = section.getAttribute('data-collapsed') === 'true'; 281 282 if (isCollapsed) { //expend current 283 284 if(g_isCloseOnOpen == true) 285 collapseAllExpanded(link); 286 287 expandSection(section, objLink); 288 289 } else { //collapse current 290 291 collapseSection(section,objLink); 292 } 293 294 menuItemIconToggle(link); 295 296 } 297 298 /** 299 * if clicked link is an anchor then close nav 300 */ 301 function closeNavOnAnchorLinkClick(objLink, event){ 302 303 var url = objLink.attr("href"); 304 url = jQuery.trim(url); 305 306 if(!url) 307 return(true); 308 309 var objLinkIcon = objLink.find('.uc-menu-item-pointer'); 310 311 if(!objLinkIcon) 312 return(true); 313 314 var target = event.target; 315 316 if(target == objLinkIcon[0]) 317 return(true); 318 319 var objLinkParent = objLink.parent(); 320 321 if(g_isClickable == false){ 322 323 if(objLinkParent.hasClass('menu-item-has-children')) 324 return(true) 325 326 //check if clicked link is an anchor link 327 if (url.indexOf("#") > -1) 328 closeNav(); 329 330 }else{ 331 332 //check if clicked link is an anchor link 333 if (url.indexOf("#") > -1) 334 closeNav(); 335 336 } 337 338 } 339 340
341 /** 342 * on menu item click, if sub menu, open or close 343 */ 344 function onMenuItemClick(event){ 345 346 347 /*return*/ openCloseItem(this,event); 348 349 var objLink = jQuery(this); 350 351 closeNavOnAnchorLinkClick(objLink, event) 352 353 } 354 355 /** 356 * console log shorcut 357 */ 358 function trace(str){ 359 360 console.log(str); 361 } 362 363 /** 364 * do search 365 */ 366 function doSearch(){ 367 368 if(!g_objInputBox) 369 return(false); 370 371 var searchString = g_objInputBox.val(); 372 373 searchString = jQuery.trim(searchString); 374 375 if(!searchString) 376 return(true); 377 378 var urlBase = g_objInputBox.data("urlbase"); 379 var urlSearch = urlBase+"?s="+searchString; 380 381 location.href = urlSearch; 382 383 } 384 385 386 /** 387 * on input box key up - if enter clicked - go to search 388 */ 389 function onInputBoxKeyUp(event){ 390 391 if(event.keyCode !== 13) 392 return(true); 393 394 doSearch(); 395 } 396 397 /** 398 * on menu body click - disable propogation 399 */ 400 function onMenuBodyClick(event){ 401 402 event.stopPropagation(); 403 } 404 405 /** 406 * on body click - close the menu if needed 407 */ 408 function onBodyClick(){ 409 410 var isClosed = isMenuClosed(); 411 412 if(isClosed == true) 413 return(true); 414 415 closeNav(); 416 } 417 418 //on trigger link click 419 420 function onLinkClick(e){ 421 422 var objLink = jQuery(this); 423 424 var dataMenuName = g_menuWrapper.data('name'); 425 var dataLinkName = objLink.data('name'); 426 427 if(dataLinkName == undefined){ 428 return(false); 429 } 430 431 e.preventDefault(); 432 if(dataLinkName == dataMenuName){ 433 g_objButtonToggle.trigger("click"); 434 }else{ 435 return(false); 436 } 437 } 438 439 /** 440 * init open links 441 */ 442 function initLinks(){ 443 444 var objLinks = jQuery('.ue-link-open-menu').not(".uc-link-inited"); 445 446 if(objLinks.length == 0){ 447 return(false); 448 } 449 450 var elementName = g_menuWrapper.data("name"); 451 452 jQuery.each(objLinks, function(index, linkElement){ 453 454 var objLink = jQuery(linkElement); 455 456 var name = objLink.data("name"); 457 458 if(name != elementName) 459 return(true); 460 461 objLink.addClass("uc-link-inited"); 462 463 objLink.on("click", onLinkClick); 464 465 }); 466 467 468 } 469 470 /* 471 * open current page menu item 472 */ 473 function checkUrl(){ 474 475 var objCurrentPageItem = jQuery("#"+menuWrapperID).find('.current_page_item'); 476 477 if(!objCurrentPageItem) 478 return(false); 479 480 if(g_startExpanded == true) 481 return(false); 482 483 var objCurrentPageLink = objCurrentPageItem.find('> a'); 484 var currentPageHref = objCurrentPageLink.attr('href'); 485 486 //if current page has same link adress as menu item then open menu item 487 if(currentPageHref != urlAjax) 488 return(false); 489 490 var objLinkToOpen = objCurrentPageLink.parents('.sub-menu').prev(); 491 492 if(g_isClickable == false) 493 objLinkToOpen.trigger('click'); 494 495 if(g_isClickable == true){ 496 497 var objPointer = objLinkToOpen.find(".uc-menu-item-pointer"); 498 499 objPointer.trigger('click'); 500 501 } 502 503 } 504 505 /** 506 * run the menu, init 507 */ 508 function runMenu(){ 509 510 var objWrapper = jQuery("#"+menuWrapperID); 511 512 g_menuWrapper = objWrapper.find(".uc-side-menu-wrapper"); 513 g_isClickable = objWrapper.data("clickable"); 514 g_isCloseOnOpen = objWrapper.data("closeothers"); 515 516 var isCloseOnBody = objWrapper.data("closeonbody"); 517 g_isOpenOnLoad = g_menuWrapper.data("openonload"); 518 519 g_pushOnOpen = objWrapper.data("push"); 520 g_pushOnOpenMobile = objWrapper.data("push-mobile") 521 522 g_startExpanded = objWrapper.data("expand"); 523 524 var objButtonClose = g_menuWrapper.find(".uc-close-side-menu"); 525 526 g_objButtonToggle = objWrapper.find(".open_side_menu"); 527 528 g_objInputBox = g_menuWrapper.find("input[type='text']"); 529 530 g_menuID = menuWrapperID; 531 532 533 534 if(g_menuWrapper.length == 0){ 535 console.log("menu with ID: "+menuWrapperID+" not found!"); 536 return(false); 537 } 538 539 if(objButtonClose.length == 0){ 540 console.log("The close button not found"); 541 return(false); 542 } 543 544 if(g_objButtonToggle.length == 0){ 545 console.log("The trigger button not found"); 546 return(false); 547 } 548 549 //collapse or expand all 550 551 g_menuWrapper.find("ul.uc-list-menu li a").each((i, item) => { 552 553 if(item.nextElementSibling){ 554 555 var objItem = jQuery(item); 556 objItem.append("<span class='uc-menu-item-pointer'></span>"); 557 558 if(g_startExpanded == false){ 559 560 collapseInnerSection(item.nextElementSibling); 561 jQuery(item).addClass("collapsed"); 562 jQuery(item).removeClass("expanded"); 563 564 }else{ 565 566 jQuery(item).removeClass("collapsed"); 567 jQuery(item).addClass("expanded"); 568 569 } 570 571 //add icons to pointer elements 572 menuItemIconToggle(item); 573 574 } 575 576 }); 577 578 initLinks(); 579 580 //init events 581
582 if(g_objInputBox.length == 0) 583 g_objInputBox = null; 584 585 if(g_objInputBox) 586 g_objInputBox.on("keyup",onInputBoxKeyUp); 587 588 var objButtonSearch = g_menuWrapper.find(".side-menu-search-button-search"); 589 objButtonSearch.on("click", doSearch); 590 591 var objLinks = g_menuWrapper.find("ul.uc-list-menu li a"); 592 593 if(g_isClickable == false){ 594 objLinks.on("click", onMenuItemClick); 595 }else{ 596 597 var objPointers = g_menuWrapper.find("ul.uc-list-menu li .uc-menu-item-pointer"); 598 599 //pointer click - toggle section 600 objPointers.on("click", function(event){ 601 602 event.preventDefault(); 603 604 var objLink = jQuery(this); 605 var objParentLink = objLink.parent(); 606 607 toggleSection(objParentLink); 608 609 menuItemIconToggle(objParentLink[0]); 610 611 }); 612 613 //close nav if anchor link clicked 614 objLinks.on("click", function(event){ 615 616 var objLink = jQuery(this); 617 618 closeNavOnAnchorLinkClick(objLink, event); 619 620 }); 621 622 } 623 624 setTimeout(checkUrl,500); 625 626 objButtonClose.on("click", closeNav); 627 628 g_objButtonToggle.on("click", onButtonToggleClick); 629 630 if(isCloseOnBody === true){ 631 632 var objOverlay = g_menuWrapper.find(".ue_side_menu_overlay"); 633 634 if(objOverlay.length) 635 objOverlay.on("click", closeNav); 636 else{ 637 g_menuWrapper.on("click", onMenuBodyClick); 638 g_objButtonToggle.on("click", onMenuBodyClick); 639 640 jQuery("body").on("click", onBodyClick); 641 } 642 643 } 644 645 if(g_isOpenOnLoad === true){ 646 g_objButtonToggle.trigger("click"); 647 } 648 } 649 650 runMenu(); 651 652} 653
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.