1 2function UCContentAccordion(objAccordion){ 3 4 var g_activeClass; 5 var g_dataLinkNum, g_accItem, g_scrollOffset; 6 7 //scroll func 8 function scrollToTop(){ 9 var panel = jQuery(this).closest(".uc_ac_box"); 10 11 jQuery('html, body').animate({ 12 scrollTop: panel.offset().top + g_scrollOffset 13 }, 400); 14 } 15 16 /** 17 * set hash 18 */ 19 function setHash(objTab){ 20 21 var isHashSet = objAccordion.data("set-hash"); 22 23 if(isHashSet == false) 24 return(false); 25 26 var objTabDataId = objTab.parent().attr('id'); 27 28 window.location.hash = objTabDataId; 29 30 } 31 32 function onItemClick(){ 33 34 var objCaption = jQuery(this); 35 var objContent = objCaption.next(); 36 var objItem = objCaption.parent(); 37 38 setHash(objCaption); 39 40 var isActive = objItem.hasClass(g_activeClass); 41 var dataCloseothers = objAccordion.data("closeothers"); 42 43 if(dataCloseothers == true){ 44 45 if(isActive == true){ 46 //remove active class from clicked 47 objItem.removeClass(g_activeClass); 48 objContent.slideUp(); 49 return(false); 50 } 51 52 var objItems = objItem.siblings(); 53 54 objItems.each(function(){ 55 56 var objTab = jQuery(this); 57 var isTabActive = objTab.hasClass(g_activeClass); 58 59 //remove active class from all other tabs 60 //use carefully, not to touch inner accordion if such exists 61 if(isTabActive == true){ 62 objTab.removeClass(g_activeClass); 63 objTab.find(" > .uc_content").slideUp(); 64 } 65 }); 66 67 68 } 69 70 objItem.addClass(g_activeClass); 71 72 var dataScroll = objAccordion.data('scroll'); 73 74 if (dataScroll == "desktop"){ 75 if(window.matchMedia("(min-width: 1024px)").matches){ 76 objContent.slideDown(scrollToTop); 77 }else{ 78 objContent.slideDown(); 79 } 80 } 81 82 if (dataScroll == "mobile"){ 83 if(window.matchMedia("(max-width: 1024px)").matches){ 84 objContent.slideDown(scrollToTop); 85 }else{ 86 objContent.slideDown(); 87 } 88 } 89 90 if (dataScroll == "desktop+mobile"){ 91 objContent.slideDown(scrollToTop); 92 } 93 94 if (dataScroll == "off"){ 95 objContent.slideDown(); 96 } 97 98 return false; 99 } 100 101 102 function linkToSlideScroll(){ 103 104 jQuery('html, body').animate({ 105 scrollTop: g_accItem.offset().top + g_scrollOffset 106 }, 400); 107 } 108 109 /* 110 * check if element is in viewport 111 */ 112 function isElementInViewport(objElement) { 113 114 var elementTop = objElement.offset().top; 115 var elementBottom = elementTop + objElement.outerHeight(); 116 117 var viewportTop = jQuery(window).scrollTop(); 118 var viewportBottom = viewportTop + jQuery(window).height(); 119 120 var isInViwport = elementBottom > viewportTop && elementTop < viewportBottom; 121 122 return(isInViwport); 123 } 124 125 /* 126 * on trigger link click 127 */ 128 function onLinkClick(e){ 129 130 var objLink = jQuery(this); 131 132 var dataAccName = objAccordion.data('name'); 133 var dataLinkName = objLink.data('name'); 134 g_dataLinkNum = objLink.data('num'); 135 g_accItem = objAccordion.find('.uc_ac_box .uc_trigger').eq(g_dataLinkNum - 1); 136 var accItemNumber = objAccordion.find('.uc_ac_box').length; 137 138 139 if(dataLinkName != dataAccName) 140 return(false); 141 142 if(dataLinkName == undefined || g_dataLinkNum == '' || g_dataLinkNum > accItemNumber) 143 return(false); 144 145 var accItemContent = g_accItem.next(); 146 var accItemParent = g_accItem.parent(); 147 var isItemParentActive = accItemParent.hasClass(g_activeClass); 148 149 e.preventDefault(); 150 151 if(isItemParentActive == true){ 152 153 if(isElementInViewport(objAccordion) == false) 154 linkToSlideScroll(); 155 156 accItemContent.slideUp(); 157 accItemParent.removeClass(g_activeClass); 158 159 }else if(isItemParentActive == false && isElementInViewport(objAccordion) == false){ 160 161 onItemClick(); 162 accItemContent.slideDown(linkToSlideScroll); 163 accItemParent.addClass(g_activeClass); 164 165 }else if(isItemParentActive == false && isElementInViewport(objAccordion) == true){ 166 167 onItemClick(); 168 accItemContent.slideDown(); 169 accItemParent.addClass(g_activeClass); 170 } 171 172 173 } 174 175 /** 176 * init open links 177 */ 178 function initLinks(){ 179 180 var objLinks = jQuery('.ue-link-goto-item').not(".uc-link-inited"); 181 182 if(objLinks.length == 0){ 183 return(false); 184 } 185 186 var elementName = objAccordion.data("name"); 187 188 jQuery.each(objLinks, function(index, linkElement){ 189 190 var objLink = jQuery(linkElement); 191 var name = objLink.data("name"); 192 193 if(name != elementName) 194 return(true); 195 196 objLink.addClass("uc-link-inited"); 197 198 objLink.on("click", onLinkClick); 199 200 }); 201 202 } 203 204
205 function runPostAccordion(){ 206 //init globals 207 208 g_activeClass = "uc-item-active"; 209 g_scrollOffset = objAccordion.data('offset'); 210 211 initLinks(); 212 213 //init events 214 objAccordion.on("click", ".uc_trigger", onItemClick); 215 objAccordion.on("ucclick", ".uc_trigger", onItemClick); 216 217 //init hash 218 if(!window.location.hash) 219 return(false); 220 221 //find hashed tab object 222 var objHashedTabs = jQuery('[id=' + window.location.hash + ']'); 223 224 objHashedTabs.each(function(){ 225 226 var objHashedTab = jQuery(this); 227 228 //find main widget wrapper of the hashed tab 229 var objHashedTabWrapper = objHashedTab.parents('.uc_material_accordion'); 230 231 //find if main widget wrapper is inside another accordion tab 232 var objWrapperParent = objHashedTabWrapper.parents('.uc_ac_box'); 233 234 //if not than trigger click on hashed tab only and move to another hashed tab object 235 //do nothing with inner accordion on this stage (if its exists) 236 if(!objWrapperParent.length){ 237 238 setTimeout(function(){ 239 240 //find if tab is active 241 var isActive = objHashedTab.hasClass(g_activeClass); 242 243 if(isActive == true) 244 return(true); 245 246 objHashedTab.find(' > .uc_trigger').trigger('click'); 247 248 },200); 249 250 return(true); 251 } 252 253 //if wrapper is inside another accordion tab 254 setTimeout(function(){ 255 256 //if tab is active then skip and go to another one 257 var isActive = objHashedTab.hasClass('uc-item-active'); 258 259 if(isActive == true) 260 return(true); 261 262 objHashedTab.find(' > .uc_trigger').trigger('click'); 263 264 //open parent accordion tab it wasn't open already 265 var isParentTabActive = objWrapperParent.hasClass('uc-item-active'); 266 267 if(isParentTabActive == true) 268 return(true); 269 270 var objParentAccordionTab = objWrapperParent.find(' > .uc_trigger'); 271 var accItemContent = objParentAccordionTab.next(); 272 var accItemParent = objParentAccordionTab.parent(); 273 274 accItemContent.slideDown(); 275 accItemParent.addClass("uc-item-active"); 276 277 },300); 278 279 280 }); 281 282 objAccordion.addClass('uc-inited'); 283 284 } 285 286 if(objAccordion.hasClass('uc-inited') == false) 287 runPostAccordion(); 288 289}
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.