1function popClose($popup){ 2 if (typeof $popup === 'undefined' || $popup.length === 0) { 3 return false; 4 } 5 var data = $popup.data(); 6 var anim = data.anim || 'fade'; 7 $(document).off('click.popup'+data.eventID).off('keydown.popup'+data.eventID); 8 $(window).off('resize.popup'+data.eventID); 9 10 if ( data.toggler !== undefined ) $(data.toggler).removeClass('toggled'); 11 $popup.velocity('finish').velocity('transition.'+anim+'Out',{ 12 begin: function(){ 13 if ( data.darken !== undefined && !$body.data('going-to-dark') ){ 14 $body.removeClass('darken-popup'); 15 } 16 }, 17 complete: function(){ 18 $popup.attr('data-state', 'hidden'); 19 if ($popup.hasClass('clone')) $popup.remove(); 20 } 21 22 23 }).trigger('close'); 24 25} 26 27function popOpen($popup, $caller){ 28 //console.log('open', $popup); 29 var counter = globalCounter++, 30 data = $popup.data(), 31 position = data.position, 32 $base = $(data.base), 33 anim = data.anim || 'fade'; 34 35 var viewport = ($caller && $caller.length) ? $caller.closest('.table-wrap') : $(); 36 if (viewport.length === 0) viewport = null; 37 else{ 38 $popup = $popup.clone().addClass('clone').appendTo($body); 39 viewport = viewport.children('.scroller'); 40 viewport.one('scroll.popup', function(){ 41 popClose($popup); 42 $(window).off('scroll.popup'); 43 }); 44 $(window).one('scroll.popup', function(){ 45 popClose($popup); 46 viewport.off('scroll.popup'); 47 }) 48 } 49 50 if (data.container){ 51 $popup = $popup.clone().addClass('clone').appendTo($(data.container)); 52 $(window).one('scroll.popup', function(){ 53 popClose($popup); 54 }) 55 } 56 57 if ( $caller && $caller.length > 0 ){ 58 var togglerID = $caller.data('toggler'); 59 var $toggler = $(togglerID); 60 if ( togglerID === undefined ){ 61 if ( $caller.attr('id') === undefined ) $caller.attr('id', 'popup' + counter); 62 togglerID = '#' + $caller.attr('id'); 63 $toggler = $caller; 64 } 65 $toggler.addClass('toggled'); 66 $popup.data('toggler', togglerID); 67 if ( $base.length === 0 ) $base = $toggler; 68 if ( !position ) position = $caller.data('position'); 69 } 70 71 // if we're dealing with backnav popup 72 if ( $caller && $caller.data('backnav') !== undefined ){ 73 if ( !b2.s.backnavEnabled ){ 74 window.location.href = $caller.attr('href'); 75 return true; 76 } 77 var callerOffset = $caller.position(), 78 targetIndex = parseInt($caller.data('backnav')), 79 backNavTarget = $popup.find('li').eq(targetIndex), 80 offsetTop = backNavTarget.position().top; 81 82 if (offsetTop > parseInt($caller.offset().top - 5)) 83 offsetTop = parseInt($caller.offset().top - 5); 84 85 backNavTarget.addClass('active').children('a').addClass('toggled'); 86 $popup.css({ 87 'top': callerOffset.top, 88 'left': callerOffset.left, 89 'margin-top': -offsetTop 90 }).one('close', function(){ 91 backNavTarget.off('click.backnav') 92 .removeClass('active') 93 .children('a').removeClass('toggled'); 94 }); 95 96 backNavTarget.on('click.backnav', function(e){ 97 popClose($popup); 98 return !$(e.target).is('i'); 99 }); 100 } 101 102 $( document ).on('click.popup'+counter, function(e){ 103 // do not close if the modal window is open 104 if ( !($(e.target).hasClass('modal')) && !($(e.target).closest('.modal').length) ) { 105 // closing on click outside 106 if ( !( $(e.target).closest($popup.add($caller)).length > 0 || 107 $popup.hasClass('click-stay')) ){ 108 //console.log('close via click outside', $popup); 109 if ( !($body.find('.modal.in').length) ) { 110 popClose($popup); 111 } 112 } 113 } 114 }).on('keydown.popup'+counter, function(e){ 115 // closing on ESC 116 if ( 27 === e.keyCode && !($body.hasClass('modal-open')) ){ 117 //console.log('close via ESC', $popup); 118 popClose($popup); 119 } 120 }); 121 $(window).on('resize.popup'+counter, function(){ 122 if (isHover) popClose($popup); 123 }) 124 125 $popup.attr('data-state', 'shown').data('eventID', counter) 126 .velocity('finish').velocity('transition.'+anim+'In', { 127 duration: 500, 128 begin: function(){ 129 $popup.css({ 130 opacity: 0, 131 display: 'block' 132 }) 133 if ( data.darken !== undefined ){ 134 $body.data('going-to-dark', true).addClass('darken-popup'); 135 } 136 if ( position !== undefined ){ 137 posPopup($popup, { 138 base: $base, 139 position: position, 140 viewport: viewport 141 }); 142 } 143 popHeightUpdate($popup); 144 }, 145 complete: function(){ 146 // $.ikSelect && $popup.find('select').ikSelect('redraw'); 147 148 if ( data.darken !== undefined ){ 149 $body.addClass('darken-popup').data('going-to-dark', false); 150 // ^ adding class again in case something removed it during 151 // the process. 152 } 153 } 154 }).trigger('open'); 155} 156 157function popHeightUpdate($popup){ 158 var scroller = $popup.children('.table-wrap').children('.scroller'); 159 if ( !scroller.length ) return; 160 161 scroller.css('height',''); 162 var popupTop = $popup.offset().top - $(window).scrollTop(), 163 popupH = $popup.outerHeight(); 164 165 if ( popupTop < 0 ){ 166 var scrollerH = scroller.outerHeight(); 167 scroller.css('height', scrollerH + popupTop).trigger('sizeChange'); 168 } else { 169 var windowH = $(window).height(), 170 scrollerH = scroller.outerHeight(); 171 diff = windowH - (popupTop + popupH); 172 if ( diff < 0 ) scroller.css('height', scrollerH + diff).trigger('sizeChange'); 173 } 174 scroller.trigger('sizeChange'); 175} 176 177function parseTarget(target, $el){ 178 if ( !target || target === '' ) return $el; 179 180 switch ( target[0] ){ 181 case '>': 182 // > : all children 183 // >>(someselector) : el.find(someselector) 184 // >(someselector) : el.children(someselector) 185 if ( 1 === target.length ) return $el.children(); 186 else if (target[1] === '>') return $el.find(target.substr(2)); 187 else return $el.children(target.substr(1)); 188 break; 189 190 case '^': 191 // ^ : el.parent() 192 // ^(selector)>(selector2) : el.closest(selector).find(selector2) 193 // ^(selector)~(selector2) : el.closest(selector).siblings(selector2) 194 // ^(selector) : el.closest(selector) 195 var index; 196 if ( 1 === target.length ) return $el.parent(); 197 else if ( (index = target.indexOf('>')) !== -1 ){ 198 var root = target.substr(1, index-1); 199 var tar = target.substr(index+1); 200 return $el.closest(root).find(tar); 201 202 } else if ( (index = target.indexOf('~')) !== -1 ){ 203 var root = target.substr(1, index-1); 204 var tar = target.substr(index+1); 205 return $el.closest(root).siblings(tar); 206 207 } else { 208 return $el.closest(target.substr(1)); 209 } 210 break; 211 212 case '#': 213 return $(target); 214 break; 215 216 case '.': 217 return $(target); 218 break; 219 220 case '+': 221 return $el.next(); 222 break; 223 224 case '~': 225 return $el.siblings(target.substr(1)); 226 break; 227 228 default: 229 console.log('error in parseTarget'); 230 } 231} 232 233function initPopups(){ 234 if (!Modernizr.mq('(max-width: 767px)')){ 235 $('[data-state="shown"]').each(function(){ 236 $(this).removeAttr('data-state'); 237 popOpen($(this)); 238 }); 239 } 240
241 $(document).on('click', '[data-popup]', function(e){ 242 var $this = $(this); 243 var $popup = parseTarget($this.data('popup'), $this); 244 if (!$popup.length) return; 245 246 if ( $popup.attr('data-state') !== 'shown' ) popOpen($popup, $this); 247 else{ 248 //console.log('close via toggler', $popup); 249 popClose($popup); 250 } 251 e.preventDefault ? e.preventDefault() : window.event.returnValue = false; 252 }); 253}
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.