1/** 2 * @file 3 * Colorbox module init js. 4 */ 5 6(function ($) { 7 8Drupal.behaviors.initColorbox = { 9 attach: function (context, settings) { 10 if (!$.isFunction($('a, area, input', context).colorbox) || typeof settings.colorbox === 'undefined') { 11 return; 12 } 13 14 if (settings.colorbox.mobiledetect && window.matchMedia) { 15 // Disable Colorbox for small screens. 16 var mq = window.matchMedia("(max-device-width: " + settings.colorbox.mobiledevicewidth + ")"); 17 if (mq.matches) { 18 return; 19 } 20 } 21 22 // Use "data-colorbox-gallery" if set otherwise use "rel". 23 settings.colorbox.rel = function () { 24 if ($(this).data('colorbox-gallery')) { 25 return $(this).data('colorbox-gallery'); 26 } 27 else { 28 return $(this).attr('rel'); 29 } 30 }; 31 32 $('.colorbox', context) 33 .once('init-colorbox').each(function(){ 34 // Only images are supported for the "colorbox" class. 35 // The "photo" setting forces the href attribute to be treated as an image. 36 var extendParams = { 37 photo: true 38 }; 39 // If a title attribute is supplied, sanitize it. 40 var title = $(this).attr('title'); 41 if (title) { 42 extendParams.title = Drupal.colorbox.sanitizeMarkup(title); 43 } 44 $(this).colorbox($.extend({}, settings.colorbox, extendParams)); 45 }); 46 47 $(context).bind('cbox_complete', function () { 48 Drupal.attachBehaviors('#cboxLoadedContent'); 49 }); 50 } 51}; 52 53// Create colorbox namespace if it doesn't exist. 54if (!Drupal.hasOwnProperty('colorbox')) { 55 Drupal.colorbox = {}; 56} 57 58/** 59 * Global function to allow sanitizing captions and control strings. 60 * 61 * @param markup 62 * String containing potential markup. 63 * @return @string 64 * Sanitized string with potentially dangerous markup removed. 65 */ 66Drupal.colorbox.sanitizeMarkup = function(markup) { 67 // If DOMPurify installed, allow some HTML. Otherwise, treat as plain text. 68 if (typeof DOMPurify !== 'undefined') { 69 var purifyConfig = { 70 ALLOWED_TAGS: [ 71 'a', 72 'b', 73 'strong', 74 'i', 75 'em', 76 'u', 77 'cite', 78 'code', 79 'br' 80 ], 81 ALLOWED_ATTR: [ 82 'href', 83 'hreflang', 84 'title', 85 'target' 86 ] 87 } 88 if (Drupal.settings.hasOwnProperty('dompurify_custom_config')) { 89 purifyConfig = Drupal.settings.dompurify_custom_config; 90 } 91 return DOMPurify.sanitize(markup, purifyConfig); 92 } 93 else { 94 return Drupal.checkPlain(markup); 95 } 96} 97 98})(jQuery); 99; 100/** 101 * @file 102 * Colorbox module style js. 103 */ 104 105(function ($) { 106 107Drupal.behaviors.initColorboxDefaultStyle = { 108 attach: function (context, settings) { 109 $(context).bind('cbox_complete', function () { 110 // Only run if there is a title. 111 if ($('#cboxTitle:empty', context).length == false) { 112 $('#cboxLoadedContent img', context).bind('mouseover', function () { 113 $('#cboxTitle', context).slideDown(); 114 }); 115 $('#cboxOverlay', context).bind('mouseover', function () { 116 $('#cboxTitle', context).slideUp(); 117 }); 118 } 119 else { 120 $('#cboxTitle', context).hide(); 121 } 122 }); 123 } 124}; 125 126})(jQuery); 127; 128/** 129 * @file 130 * Colorbox module load js. 131 */ 132(function ($) { 133 134Drupal.behaviors.initColorboxLoad = { 135 attach: function (context, settings) { 136 if (!$.isFunction($.colorbox) || typeof settings.colorbox === 'undefined') { 137 return; 138 } 139 140 if (settings.colorbox.mobiledetect && window.matchMedia) { 141 // Disable Colorbox for small screens. 142 var mq = window.matchMedia("(max-device-width: " + settings.colorbox.mobiledevicewidth + ")"); 143 if (mq.matches) { 144 return; 145 } 146 } 147 148 $.urlParams = function (url) { 149 var p = {}, 150 e, 151 a = /\+/g, // Regex for replacing addition symbol with a space. 152 r = /([^&=]+)=?([^&]*)/g, 153 d = function (s) { return decodeURIComponent(s.replace(a, ' ')); }, 154 q = url.split('?'); 155 while (e = r.exec(q[1])) { 156 e[1] = d(e[1]); 157 e[2] = d(e[2]); 158 switch (e[2].toLowerCase()) { 159 case 'true': 160 case 'yes': 161 e[2] = true; 162 break; 163 case 'false': 164 case 'no': 165 e[2] = false;
166 break; 167 } 168 if (e[1] == 'width') { e[1] = 'innerWidth'; } 169 if (e[1] == 'height') { e[1] = 'innerHeight'; } 170 if (e[2]) { 171 e[2] = Drupal.checkPlain(e[2]); 172 } 173 p[e[1]] = e[2]; 174 } 175 return p; 176 }; 177 178 $('.colorbox-load', context) 179 .once('init-colorbox-load', function () { 180 var href = $(this).attr('href'); 181 182 var params = $.urlParams(href); 183 184 // Always load in an iframe. 185 params.iframe = true; 186 187 // Set inner width and height if not already specified. 188 if (!params.hasOwnProperty('innerWidth')) { 189 params.innerWidth = $(window).width() * .8; 190 } 191 if (!params.hasOwnProperty('innerHeight')) { 192 params.innerHeight = $(window).height() * .8; 193 } 194 195 if (!params.hasOwnProperty('title')) { 196 // If a title attribute is supplied, sanitize it. 197 var title = $(this).attr('title'); 198 if (title) { 199 params.title = Drupal.colorbox.sanitizeMarkup(title); 200 } 201 } 202 $(this).colorbox($.extend({}, settings.colorbox, params)); 203 }); 204 } 205}; 206 207})(jQuery); 208; 209/** 210 * @file 211 * Colorbox module inline js. 212 */ 213 214(function ($) { 215 216Drupal.behaviors.initColorboxInline = { 217 attach: function (context, settings) { 218 if (!$.isFunction($.colorbox) || typeof settings.colorbox === 'undefined') { 219 return; 220 } 221 222 if (settings.colorbox.mobiledetect && window.matchMedia) { 223 // Disable Colorbox for small screens. 224 var mq = window.matchMedia("(max-device-width: " + settings.colorbox.mobiledevicewidth + ")"); 225 if (mq.matches) { 226 return; 227 } 228 } 229 230 $.urlParam = function(name, url){ 231 if (name == 'fragment') { 232 var results = new RegExp('(#[^&#]*)').exec(url); 233 } 234 else { 235 var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(url); 236 } 237 if (!results) { return ''; } 238 return results[1] || ''; 239 }; 240 $('.colorbox-inline', context).once('init-colorbox-inline').colorbox({ 241 transition:settings.colorbox.transition, 242 speed:settings.colorbox.speed, 243 opacity:settings.colorbox.opacity, 244 slideshow:settings.colorbox.slideshow, 245 slideshowAuto:settings.colorbox.slideshowAuto, 246 slideshowSpeed:settings.colorbox.slideshowSpeed, 247 slideshowStart:settings.colorbox.slideshowStart, 248 slideshowStop:settings.colorbox.slideshowStop, 249 current:settings.colorbox.current, 250 previous:settings.colorbox.previous, 251 next:settings.colorbox.next, 252 close:settings.colorbox.close, 253 overlayClose:settings.colorbox.overlayClose, 254 maxWidth:settings.colorbox.maxWidth, 255 maxHeight:settings.colorbox.maxHeight, 256 innerWidth:function(){ 257 return $.urlParam('width', $(this).attr('href')); 258 }, 259 innerHeight:function(){ 260 return $.urlParam('height', $(this).attr('href')); 261 }, 262 title:function(){ 263 return Drupal.colorbox.sanitizeMarkup( 264 decodeURIComponent($.urlParam('title', $(this).attr('href')))); 265 }, 266 iframe:function(){ 267 return $.urlParam('iframe', $(this).attr('href')); 268 }, 269 inline:function(){ 270 return $.urlParam('inline', $(this).attr('href')); 271 }, 272 href:function(){ 273 return $.urlParam('fragment', $(this).attr('href')); 274 } 275 }); 276 } 277}; 278 279})(jQuery); 280; 281 282(function($) { 283 284/** 285 * Drupal FieldGroup object. 286 */ 287Drupal.FieldGroup = Drupal.FieldGroup || {}; 288Drupal.FieldGroup.Effects = Drupal.FieldGroup.Effects || {}; 289Drupal.FieldGroup.groupWithfocus = null; 290 291Drupal.FieldGroup.setGroupWithfocus = function(element) { 292 element.css({display: 'block'}); 293 Drupal.FieldGroup.groupWithfocus = element; 294} 295 296/** 297 * Implements Drupal.FieldGroup.processHook(). 298 */ 299Drupal.FieldGroup.Effects.processFieldset = { 300 execute: function (context, settings, type) { 301 if (type == 'form') { 302 // Add required fields mark to any fieldsets containing required fields 303 $('fieldset.fieldset', context).once('fieldgroup-effects', function(i) { 304 if ($(this).is('.required-fields') && $(this).find('.form-required').length > 0) { 305 $('legend span.fieldset-legend', $(this)).eq(0).append(' ').append($('.form-required').eq(0).clone()); 306 } 307 if ($('.error', $(this)).length) { 308 $('legend span.fieldset-legend', $(this)).eq(0).addClass('error'); 309 Drupal.FieldGroup.setGroupWithfocus($(this)); 310 } 311 }); 312 } 313 } 314} 315 316/** 317 * Implements Drupal.FieldGroup.processHook(). 318 */ 319Drupal.FieldGroup.Effects.processAccordion = { 320 execute: function (context, settings, type) { 321 $('div.field-group-accordion-wrapper', context).once('fieldgroup-effects', function () { 322 var wrapper = $(this); 323 324 // Get the index to set active. 325 var active_index = false;
326 wrapper.find('.accordion-item').each(function(i) { 327 if ($(this).hasClass('field-group-accordion-active')) { 328 active_index = i; 329 } 330 }); 331 332 wrapper.accordion({ 333 heightStyle: "content", 334 active: active_index, 335 collapsible: true, 336 changestart: function(event, ui) { 337 if ($(this).hasClass('effect-none')) { 338 ui.options.animated = false; 339 } 340 else { 341 ui.options.animated = 'slide'; 342 } 343 } 344 }); 345 346 if (type == 'form') { 347 348 var $firstErrorItem = false; 349 350 // Add required fields mark to any element containing required fields 351 wrapper.find('div.field-group-accordion-item').each(function(i) { 352 353 if ($(this).is('.required-fields') && $(this).find('.form-required').length > 0) { 354 $('h3.ui-accordion-header a').eq(i).append(' ').append($('.form-required').eq(0).clone()); 355 } 356 if ($('.error', $(this)).length) { 357 // Save first error item, for focussing it. 358 if (!$firstErrorItem) { 359 $firstErrorItem = $(this).parent().accordion("activate" , i); 360 } 361 $('h3.ui-accordion-header').eq(i).addClass('error'); 362 } 363 }); 364 365 // Save first error item, for focussing it. 366 if (!$firstErrorItem) { 367 $('.ui-accordion-content-active', $firstErrorItem).css({height: 'auto', width: 'auto', display: 'block'}); 368 } 369 370 } 371 }); 372 } 373} 374 375/** 376 * Implements Drupal.FieldGroup.processHook(). 377 */ 378Drupal.FieldGroup.Effects.processHtabs = { 379 execute: function (context, settings, type) { 380 if (type == 'form') { 381 // Add required fields mark to any element containing required fields 382 $('fieldset.horizontal-tabs-pane', context).once('fieldgroup-effects', function(i) { 383 if ($(this).is('.required-fields') && $(this).find('.form-required').length > 0) { 384 $(this).data('horizontalTab').link.find('strong:first').after($('.form-required').eq(0).clone()).after(' '); 385 } 386 if ($('.error', $(this)).length) { 387 $(this).data('horizontalTab').link.parent().addClass('error'); 388 Drupal.FieldGroup.setGroupWithfocus($(this)); 389 $(this).data('horizontalTab').focus(); 390 } 391 }); 392 } 393 } 394} 395 396/** 397 * Implements Drupal.FieldGroup.processHook(). 398 */ 399Drupal.FieldGroup.Effects.processTabs = { 400 execute: function (context, settings, type) { 401 if (type == 'form') { 402 403 var errorFocussed = false; 404 405 // Add required fields mark to any fieldsets containing required fields 406 $('fieldset.vertical-tabs-pane', context).once('fieldgroup-effects', function(i) { 407 if ($(this).is('.required-fields') && $(this).find('.form-required').length > 0) { 408 $(this).data('verticalTab').link.find('strong:first').after($('.form-required').eq(0).clone()).after(' '); 409 } 410 if ($('.error', $(this)).length) { 411 $(this).data('verticalTab').link.parent().addClass('error'); 412 // Focus the first tab with error. 413 if (!errorFocussed) { 414 Drupal.FieldGroup.setGroupWithfocus($(this)); 415 $(this).data('verticalTab').focus(); 416 errorFocussed = true; 417 } 418 } 419 }); 420 } 421 } 422} 423 424/** 425 * Implements Drupal.FieldGroup.processHook(). 426 * 427 * TODO clean this up meaning check if this is really 428 * necessary. 429 */ 430Drupal.FieldGroup.Effects.processDiv = { 431 execute: function (context, settings, type) { 432 433 $('div.collapsible', context).once('fieldgroup-effects', function() { 434 var $wrapper = $(this); 435 436 // Turn the legend into a clickable link, but retain span.field-group-format-toggler 437 // for CSS positioning. 438 439 var $toggler = $('span.field-group-format-toggler:first', $wrapper); 440 var $link = $('<a class="field-group-format-title" href="#"></a>'); 441 $link.prepend($toggler.contents()); 442 443 // Add required field markers if needed 444 if ($(this).is('.required-fields') && $(this).find('.form-required').length > 0) { 445 $link.append(' ').append($('.form-required').eq(0).clone()); 446 } 447 448 $link.appendTo($toggler); 449 450 // .wrapInner() does not retain bound events. 451 $link.click(function () { 452 var wrapper = $wrapper.get(0); 453 // Don't animate multiple times. 454 if (!wrapper.animating) { 455 wrapper.animating = true; 456 var speed = $wrapper.hasClass('speed-fast') ? 300 : 1000; 457 if ($wrapper.hasClass('effect-none') && $wrapper.hasClass('speed-none')) { 458 $('> .field-group-format-wrapper', wrapper).toggle(); 459 } 460 else if ($wrapper.hasClass('effect-blind')) { 461 $('> .field-group-format-wrapper', wrapper).toggle('blind', {}, speed); 462 } 463 else { 464 $('> .field-group-format-wrapper', wrapper).toggle(speed); 465 } 466 wrapper.animating = false;
467 } 468 $wrapper.toggleClass('collapsed'); 469 return false; 470 }); 471 472 }); 473 } 474}; 475 476/** 477 * Behaviors. 478 */ 479Drupal.behaviors.fieldGroup = { 480 attach: function (context, settings) { 481 settings.field_group = settings.field_group || Drupal.settings.field_group; 482 if (settings.field_group == undefined) { 483 return; 484 } 485 486 // Execute all of them. 487 $.each(Drupal.FieldGroup.Effects, function (func) { 488 // We check for a wrapper function in Drupal.field_group as 489 // alternative for dynamic string function calls. 490 var type = func.toLowerCase().replace("process", ""); 491 if (settings.field_group[type] != undefined && $.isFunction(this.execute)) { 492 this.execute(context, settings, settings.field_group[type]); 493 } 494 }); 495 496 // Fixes css for fieldgroups under vertical tabs. 497 $('.fieldset-wrapper .fieldset > legend').css({display: 'block'}); 498 $('.vertical-tabs fieldset.fieldset').addClass('default-fallback'); 499 500 // Add a new ID to each fieldset. 501 $('.group-wrapper .horizontal-tabs-panes > fieldset', context).once('group-wrapper-panes-processed', function() { 502 // Tats bad, but we have to keep the actual id to prevent layouts to break. 503 var fieldgroupID = 'field_group-' + $(this).attr('id'); 504 $(this).attr('id', fieldgroupID); 505 }); 506 // Set the hash in url to remember last userselection. 507 $('.group-wrapper ul li').once('group-wrapper-ul-processed', function() { 508 var fieldGroupNavigationListIndex = $(this).index(); 509 $(this).children('a').click(function() { 510 var fieldset = $('.group-wrapper fieldset').get(fieldGroupNavigationListIndex); 511 // Grab the first id, holding the wanted hashurl. 512 var hashUrl = $(fieldset).attr('id').replace(/^field_group-/, '').split(' ')[0]; 513 window.location.hash = hashUrl; 514 }); 515 }); 516 517 } 518}; 519 520})(jQuery); 521; 522(function ($) { 523 524Drupal.behaviors.ulogin_async = {}; 525Drupal.behaviors.ulogin_async.attach = function(context, settings) { 526 527 function uloginInitWidgets() { 528 $.each(Drupal.settings.ulogin, function(index, value) { 529 $('#' + value + ':not(.ulogin-processed)', context).addClass('ulogin-processed').each(function() { 530 uLogin.initWidget(value); 531 }); 532 }); 533 } 534 535 if (typeof uLogin != 'undefined') { 536 uloginInitWidgets(); 537 } 538 else { 539 /*$.getScript('//ulogin.ru/js/ulogin.js', function(data, textStatus, jqXHR) { 540 uloginInitWidgets(); 541 });*/ 542 $.ajax({ 543 url: '//ulogin.ru/js/ulogin.js', 544 dataType: 'script', 545 cache: true, //otherwise will get fresh copy every page load, this is why not $.getScript(). 546 success: function(data, textStatus, jqXHR) { 547 uloginInitWidgets(); 548 } 549 }); 550 } 551}; 552 553})(jQuery); 554; 555/** 556* hoverIntent r6 // 2011.02.26 // jQuery 1.5.1+ 557* <http://cherne.net/brian/resources/jquery.hoverIntent.html> 558* 559* @param f onMouseOver function || An object with configuration options 560* @param g onMouseOut function || Nothing (use configuration options object) 561* @author Brian Cherne brian(at)cherne(dot)net 562*/ 563(function($){$.fn.hoverIntent=function(f,g){var cfg={sensitivity:7,interval:100,timeout:0};cfg=$.extend(cfg,g?{over:f,out:g}:f);var cX,cY,pX,pY;var track=function(ev){cX=ev.pageX;cY=ev.pageY};var compare=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);if((Math.abs(pX-cX)+Math.abs(pY-cY))<cfg.sensitivity){$(ob).unbind("mousemove",track);ob.hoverIntent_s=1;return cfg.over.apply(ob,[ev])}else{pX=cX;pY=cY;ob.hoverIntent_t=setTimeout(function(){compare(ev,ob)},cfg.interval)}};var delay=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);ob.hoverIntent_s=0;return cfg.out.apply(ob,[ev])};var handleHover=function(e){var ev=jQuery.extend({},e);var ob=this;if(ob.hoverIntent_t){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t)}if(e.type=="mouseenter"){pX=ev.pageX;pY=ev.pageY;$(ob).bind("mousemove",track);if(ob.hoverIntent_s!=1){ob.hoverIntent_t=setTimeout(function(){compare(ev,ob)},cfg.interval)}}else{$(ob).unbind("mousemove",track);if(ob.hoverIntent_s==1){ob.hoverIntent_t=setTimeout(function(){delay(ev,ob)},cfg.timeout)}}};return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover)}})(jQuery);; 564/* 565 * Supposition v0.2 - an optional enhancer for Superfish jQuery menu widget. 566 * 567 * Copyright (c) 2008 Joel Birch - based mostly on work by Jesse Klaasse and credit goes largely to him. 568 * Special thanks to Karl Swedberg for valuable input. 569 * 570 * Dual licensed under the MIT and GPL licenses: 571 * http://www.opensource.org/licenses/mit-license.php 572 * http://www.gnu.org/licenses/gpl.html 573 */ 574/* 575 * This is not the original jQuery Supersubs plugin. 576 * Please refer to the README for more information. 577 */ 578 579(function($){ 580 $.fn.supposition = function(){ 581 var $w = $(window), /*do this once instead of every onBeforeShow call*/ 582 _offset = function(dir) { 583 return window[dir == 'y' ? 'pageYOffset' : 'pageXOffset'] 584 || document.documentElement && document.documentElement[dir=='y' ? 'scrollTop' : 'scrollLeft'] 585 || document.body[dir=='y' ? 'scrollTop' : 'scrollLeft']; 586 }, 587 onHide = function(){ 588 this.css({bottom:''}); 589 }, 590 onBeforeShow = function(){ 591 this.each(function(){ 592 var $u = $(this); 593 $u.css('display','block'); 594 var menuWidth = $u.width(), 595 menuParentWidth = $u.closest('li').outerWidth(true), 596 menuParentLeft = $u.closest('li').offset().left, 597 totalRight = $w.width() + _offset('x'), 598 menuRight = $u.offset().left + menuWidth, 599 exactMenuWidth = (menuRight > (menuParentWidth + menuParentLeft)) ? menuWidth - (menuRight - (menuParentWidth + menuParentLeft)) : menuWidth; 600 if ($u.parents('.sf-js-enabled').hasClass('rtl')) { 601 if (menuParentLeft < exactMenuWidth) { 602 $u.css('left', menuParentWidth + 'px'); 603 $u.css('right', 'auto'); 604 } 605 } 606 else { 607 if (menuRight > totalRight && menuParentLeft > menuWidth) { 608 $u.css('right', menuParentWidth + 'px'); 609 $u.css('left', 'auto'); 610 } 611 } 612 var windowHeight = $w.height(), 613 offsetTop = $u.offset().top, 614 menuParentShadow = ($u.closest('.sf-menu').hasClass('sf-shadow') && $u.css('padding-bottom').length > 0) ? parseInt($u.css('padding-bottom').slice(0,-2)) : 0, 615 menuParentHeight = ($u.closest('.sf-menu').hasClass('sf-vertical')) ? '-' + menuParentShadow : $u.parent().outerHeight(true) - menuParentShadow, 616 menuHeight = $u.height(), 617 baseline = windowHeight + _offset('y'); 618 var expandUp = ((offsetTop + menuHeight > baseline) && (offsetTop > menuHeight)); 619 if (expandUp) { 620 $u.css('bottom', menuParentHeight + 'px'); 621 $u.css('top', 'auto'); 622 } 623 $u.css('display','none'); 624 }); 625 }; 626 627 return this.each(function() { 628 var o = $.fn.superfish.o[this.serial]; /* get this menu's options */ 629 630 /* if callbacks already set, store them */ 631 var _onBeforeShow = o.onBeforeShow, 632 _onHide = o.onHide; 633 634 $.extend($.fn.superfish.o[this.serial],{ 635 onBeforeShow: function() { 636 onBeforeShow.call(this); /* fire our Supposition callback */ 637 _onBeforeShow.call(this); /* fire stored callbacks */ 638 }, 639 onHide: function() { 640 onHide.call(this); /* fire our Supposition callback */ 641 _onHide.call(this); /* fire stored callbacks */ 642 } 643 }); 644 }); 645 }; 646})(jQuery);; 647/* 648 * Superfish v1.4.8 - jQuery menu widget 649 * Copyright (c) 2008 Joel Birch 650 * 651 * Dual licensed under the MIT and GPL licenses: 652 * http://www.opensource.org/licenses/mit-license.php 653 * http://www.gnu.org/licenses/gpl.html 654 * 655 * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt 656 */ 657/* 658 * This is not the original jQuery Supersubs plugin. 659 * Please refer to the README for more information. 660 */ 661 662(function($){ 663 $.fn.superfish = function(op){ 664 var sf = $.fn.superfish, 665 c = sf.c, 666 $arrow = $(['<span class="',c.arrowClass,'"> »</span>'].join('')), 667 over = function(){ 668 var $$ = $(this), menu = getMenu($$); 669 clearTimeout(menu.sfTimer); 670 $$.showSuperfishUl().siblings().hideSuperfishUl(); 671 }, 672 out = function(){ 673 var $$ = $(this), menu = getMenu($$), o = sf.op; 674 clearTimeout(menu.sfTimer); 675 menu.sfTimer=setTimeout(function(){ 676 o.retainPath=($.inArray($$[0],o.$path)>-1);
677 $$.hideSuperfishUl(); 678 if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);} 679 },o.delay); 680 }, 681 getMenu = function($menu){ 682 var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0]; 683 sf.op = sf.o[menu.serial]; 684 return menu; 685 }, 686 addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); }; 687 688 return this.each(function() { 689 var s = this.serial = sf.o.length; 690 var o = $.extend({},sf.defaults,op); 691 o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){ 692 $(this).addClass([o.hoverClass,c.bcClass].join(' ')) 693 .filter('li:has(ul)').removeClass(o.pathClass); 694 }); 695 sf.o[s] = sf.op = o; 696 697 $('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() { 698 if (o.autoArrows) addArrow( $('>a:first-child',this) ); 699 }) 700 .not('.'+c.bcClass) 701 .hideSuperfishUl(); 702 703 var $a = $('a',this); 704 $a.each(function(i){ 705 var $li = $a.eq(i).parents('li'); 706 $a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);}); 707 }); 708 o.onInit.call(this); 709 710 }).each(function() { 711 var menuClasses = [c.menuClass]; 712 if (sf.op.dropShadows && !(navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.match(/msie 6/i))) menuClasses.push(c.shadowClass); 713 $(this).addClass(menuClasses.join(' ')); 714 }); 715 }; 716 717 var sf = $.fn.superfish; 718 sf.o = []; 719 sf.op = {}; 720 sf.IE7fix = function(){ 721 var o = sf.op; 722 if (navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.match(/msie /i) && o.dropShadows && o.animation.opacity!=undefined) 723 this.toggleClass(sf.c.shadowClass+'-off'); 724 }; 725 sf.c = { 726 bcClass: 'sf-breadcrumb', 727 menuClass: 'sf-js-enabled', 728 anchorClass: 'sf-with-ul', 729 arrowClass: 'sf-sub-indicator', 730 shadowClass: 'sf-shadow' 731 }; 732 sf.defaults = { 733 hoverClass: 'sfHover', 734 pathClass: 'overideThisToUse', 735 pathLevels: 1, 736 delay: 800, 737 animation: {opacity:'show'}, 738 speed: 'normal', 739 autoArrows: true, 740 dropShadows: true, 741 disableHI: false, // true disables hoverIntent detection 742 onInit: function(){}, // callback functions 743 onBeforeShow: function(){}, 744 onShow: function(){}, 745 onHide: function(){} 746 }; 747 $.fn.extend({ 748 hideSuperfishUl : function(){ 749 var o = sf.op, 750 not = (o.retainPath===true) ? o.$path : ''; 751 o.retainPath = false; 752 var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass) 753 .find('>ul').css({top: '-99999em'}).addClass('sf-hidden'); 754 o.onHide.call($ul); 755 return this; 756 }, 757 showSuperfishUl : function(){ 758 var o = sf.op, 759 sh = sf.c.shadowClass+'-off', 760 $ul = this.addClass(o.hoverClass) 761 .find('>ul.sf-hidden').css({display: 'none', top: ''}).removeClass('sf-hidden'); 762 sf.IE7fix.call($ul); 763 o.onBeforeShow.call($ul); 764 $ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); }); 765 return this; 766 } 767 }); 768})(jQuery);; 769/* 770 * Supersubs v0.2b - jQuery plugin 771 * Copyright (c) 2008 Joel Birch 772 * 773 * Dual licensed under the MIT and GPL licenses: 774 * http://www.opensource.org/licenses/mit-license.php 775 * http://www.gnu.org/licenses/gpl.html 776 * 777 * This plugin automatically adjusts submenu widths of suckerfish-style menus to that of 778 * their longest list item children. If you use this, please expect bugs and report them 779 * to the jQuery Google Group with the word 'Superfish' in the subject line. 780 * 781 */ 782/* 783 * This is not the original jQuery Supersubs plugin. 784 * Please refer to the README for more information. 785 */ 786 787(function($){ // $ will refer to jQuery within this closure 788 $.fn.supersubs = function(options){ 789 var opts = $.extend({}, $.fn.supersubs.defaults, options);
790 // return original object to support chaining 791 return this.each(function() { 792 // cache selections 793 var $$ = $(this); 794 // support metadata 795 var o = $.meta ? $.extend({}, opts, $$.data()) : opts; 796 // get the font size of menu. 797 // .css('fontSize') returns various results cross-browser, so measure an em dash instead 798 var fontsize = $('<li id="menu-fontsize">—</li>').css({ 799 'padding' : 0, 800 'position' : 'absolute', 801 'top' : '-99999em', 802 'width' : 'auto' 803 }).appendTo($$).width(); //clientWidth is faster, but was incorrect here 804 // remove em dash 805 $('#menu-fontsize').remove(); 806 807 // Jump on level if it's a "NavBar" 808 if ($$.hasClass('sf-navbar')) { 809 $$ = $('li > ul', $$); 810 } 811 // cache all ul elements 812 $ULs = $$.find('ul:not(.sf-megamenu)'); 813 // loop through each ul in menu 814 $ULs.each(function(i) { 815 // cache this ul 816 var $ul = $ULs.eq(i); 817 // get all (li) children of this ul 818 var $LIs = $ul.children(); 819 // get all anchor grand-children 820 var $As = $LIs.children('a'); 821 // force content to one line and save current float property 822 var liFloat = $LIs.css('white-space','nowrap').css('float'); 823 // remove width restrictions and floats so elements remain vertically stacked 824 var emWidth = $ul.add($LIs).add($As).css({ 825 'float' : 'none', 826 'width' : 'auto' 827 }) 828 // this ul will now be shrink-wrapped to longest li due to position:absolute 829 // so save its width as ems. Clientwidth is 2 times faster than .width() - thanks Dan Switzer 830 .end().end()[0].clientWidth / fontsize; 831 // add more width to ensure lines don't turn over at certain sizes in various browsers 832 emWidth += o.extraWidth; 833 // restrict to at least minWidth and at most maxWidth 834 if (emWidth > o.maxWidth) { emWidth = o.maxWidth; } 835 else if (emWidth < o.minWidth) { emWidth = o.minWidth; } 836 emWidth += 'em'; 837 // set ul to width in ems 838 $ul.css('width',emWidth); 839 // restore li floats to avoid IE bugs 840 // set li width to full width of this ul 841 // revert white-space to normal 842 $LIs.css({ 843 'float' : liFloat, 844 'width' : '100%', 845 'white-space' : 'normal' 846 }) 847 // update offset position of descendant ul to reflect new width of parent 848 .each(function(){ 849 var $childUl = $('>ul',this); 850 var offsetDirection = $childUl.css('left')!==undefined ? 'left' : 'right'; 851 $childUl.css(offsetDirection,emWidth); 852 }); 853 }); 854 }); 855 }; 856 // expose defaults 857 $.fn.supersubs.defaults = { 858 minWidth: 9, // requires em unit. 859 maxWidth: 25, // requires em unit. 860 extraWidth: 0 // extra width can ensure lines don't sometimes turn over due to slight browser differences in how they round-off values 861 }; 862})(jQuery); // plugin code ends; 863/** 864 * @file 865 * The Superfish Drupal Behavior to apply the Superfish jQuery plugin to lists. 866 */ 867 868(function ($) { 869 Drupal.behaviors.superfish = { 870 attach: function (context, settings) { 871 // Take a look at each list to apply Superfish to. 872 $.each(settings.superfish || {}, function(index, options) { 873 // Process all Superfish lists. 874 $('#superfish-' + options.id, context).once('superfish', function() { 875 var list = $(this); 876 877 // Check if we are to apply the Supersubs plug-in to it. 878 if (options.plugins || false) { 879 if (options.plugins.supersubs || false) { 880 list.supersubs(options.plugins.supersubs); 881 } 882 } 883 884 // Apply Superfish to the list. 885 list.superfish(options.sf); 886 887 // Check if we are to apply any other plug-in to it. 888 if (options.plugins || false) { 889 if (options.plugins.touchscreen || false) { 890 list.sftouchscreen(options.plugins.touchscreen); 891 } 892 if (options.plugins.smallscreen || false) { 893 list.sfsmallscreen(options.plugins.smallscreen); 894 } 895 if (options.plugins.supposition || false) { 896 list.supposition(); 897 } 898 if (options.plugins.bgiframe || false) { 899 list.find('ul').bgIframe({opacity:false}); 900 } 901 } 902 }); 903 }); 904 } 905 }; 906})(jQuery);;
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.