1 2function UCPostAccordion(objAccordion){ 3 4 var g_activeClass; 5 var g_dataLinkNum, g_accItem, g_scrollOffset; 6 7 /** 8 * console log some string 9 */ 10 function trace(str){ 11 console.log(str); 12 } 13 14 //scroll func 15 function scrollToTop(){ 16 17 var panel = jQuery(this).closest(".uc_ac_box"); 18 19 var panelTop = panel.offset().top; 20 21 var scrollTop = panelTop + g_scrollOffset; 22 23 jQuery('html, body').animate({ 24 scrollTop: scrollTop 25 }, 400); 26 27 } 28 29 function onItemClick(){ 30 31 var objCaption = jQuery(this); 32 var objContent = objCaption.next(); 33 var objItem = objCaption.parent(); 34 35 var isActive = objItem.hasClass(g_activeClass); 36 37 if(isActive == true){ 38 objItem.removeClass(g_activeClass); 39 objContent.slideUp(); 40 return(true); 41 } 42 43 var objOpened = objAccordion.find("."+g_activeClass); 44 objOpened.removeClass(g_activeClass); 45 objOpened.find(".uc_content").slideUp(); 46 47 objItem.addClass(g_activeClass); 48 49 var dataScroll = objAccordion.data('scroll'); 50 51 var animationDuration = 400; 52 53 var isScroll = false; 54 55 switch(dataScroll){ 56 case "desktop": 57 if(window.matchMedia("(min-width: 1024px)").matches) 58 isScroll = true; 59 break; 60 case "mobile": 61 if(window.matchMedia("(max-width: 1024px)").matches) 62 isScroll = true; 63 break; 64 case "desktop+mobile": 65 isScroll = true; 66 break; 67 } 68 69 if(isScroll == true) 70 objContent.slideDown(animationDuration, scrollToTop); 71 else 72 objContent.slideDown(); 73 74 75 return false; 76 } 77 78 function linkToSlideScroll(){ 79 jQuery('html, body').animate({ 80 scrollTop: g_accItem.offset().top + g_scrollOffset 81 }, 400); 82 } 83 84 /* 85 * check if element is in viewport 86 */ 87 function isElementInViewport(objElement) { 88 89 var elementTop = objElement.offset().top; 90 var elementBottom = elementTop + objElement.outerHeight(); 91 92 var viewportTop = jQuery(window).scrollTop(); 93 var viewportBottom = viewportTop + jQuery(window).height(); 94 95 var isInViwport = elementBottom > viewportTop && elementTop < viewportBottom; 96 97 return(isInViwport); 98 } 99 100 /* 101 * on trigger link click 102 */ 103 function onLinkClick(e){ 104 105 var objLink = jQuery(this); 106 107 var dataAccName = objAccordion.data('name'); 108 var dataLinkName = objLink.data('name'); 109 g_dataLinkNum = objLink.data('num'); 110 g_accItem = objAccordion.find('.uc_ac_box .uc_trigger').eq(g_dataLinkNum - 1); 111 var accItemNumber = objAccordion.find('.uc_ac_box').length; 112 113 if(dataLinkName != dataAccName) 114 return(false); 115 116 if(dataLinkName == undefined || g_dataLinkNum == '' || g_dataLinkNum > accItemNumber) 117 return(false); 118 119 var accItemContent = g_accItem.next(); 120 var accItemParent = g_accItem.parent(); 121 var isItemParentActive = accItemParent.hasClass("uc-item-active"); 122 123 e.preventDefault(); 124 125 if(isItemParentActive == true && isElementInViewport(accItemParent) == false){ 126 127 linkToSlideScroll(); 128 129 }else if(isItemParentActive == false && isElementInViewport(accItemParent) == false){ 130 131 onItemClick(); 132 accItemContent.slideDown(linkToSlideScroll); 133 accItemParent.addClass("uc-item-active"); 134 135 }else if(isItemParentActive == false && isElementInViewport(accItemParent) == true){ 136 137 onItemClick(); 138 accItemContent.slideDown(); 139 accItemParent.addClass("uc-item-active"); 140 } 141 } 142 143 144 145 /** 146 * on expand all item clik 147 */ 148function onExpandAllClick(e) { 149 e.preventDefault(); 150 151 var objAllItems = objAccordion.find(".uc_ac_box"); 152 153 var anyAccordionClosed = objAllItems.filter(":not(." + g_activeClass + ")").length > 0; 154 155 objAllItems.each(function () { 156 var objItem = jQuery(this); 157 var objItemContent = objItem.find("> .uc_content"); 158 159 if (anyAccordionClosed) { 160 // If any accordion is closed, open all 161 objItem.addClass(g_activeClass); 162 if (objItemContent) objItemContent.css('display', 'block'); 163 } else { 164 // If all accordions are open, close all 165 objItem.removeClass(g_activeClass); 166 if (objItemContent) objItemContent.hide(); 167 } 168 }); 169} 170 171 172 173 /** 174 * init open links 175 */ 176 function initLinks(){ 177 178 179 var objLinks = jQuery('.ue-link-goto-item').not(".uc-link-inited"); 180 181 if(objLinks.length == 0){ 182 return(false); 183 } 184 185 var elementName = objAccordion.data("name"); 186 187 jQuery.each(objLinks, function(index, linkElement){ 188 189 var objLink = jQuery(linkElement); 190 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
206 function runPostAccordion(){ 207 //init globals 208 209 g_activeClass = "uc-item-active"; 210 211 g_scrollOffset = objAccordion.data('offset'); 212 213 initLinks(); 214 215 //init events 216 217 objAccordion.on("click", ".uc_trigger", onItemClick); 218 objAccordion.on("ucclick", ".uc_trigger", onItemClick); 219 jQuery(".ue-post-accordion-expand-all").on("click", onExpandAllClick); 220 } 221 222 runPostAccordion(); 223 224}
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.