Tap Wizard 2 (Product Key And Xforce Keygen) License Keygen Free [32|64bit]

 

 

 

 

 

PYTHIAN is a VR headset that comes with the most amazing new virtual reality experience ever. The presence of this headset is a moment to moment experience for you, with synchronized audio, picture and vibration technology. About Eersel Eersel, also known as Essel or Aarde, is a city in the Netherlands, located on the North Sea. With its rich history in entertainment and music, Eersel is the perfect place to host a truly unforgettable hard dance experience. Note : In response to the global COVID19 pandemic, some of our events have been postponed or cancelled. The following events are rescheduled and are expected to be held as follows: – The Clash of the Titans – 4 June 2020 at Maastricht Vredenburg – Masters of Hardcore – 24 June 2021 at Eersel South – Live for this – 9 July 2021 at Eersel South References Category:Events in the Netherlands Category:Music festivals in the Netherlands Category:Hardcore festivals{ “images” : [ { “idiom” : “universal”, “scale” : “1x” }, { “idiom” : “universal”, “scale” : “2x”, “filename” : “icon_no_permission@2x.png” }, { “idiom” : “universal”, “scale” : “3x” } ], “info” : { “version” : 1, “author” : “xcode” } }One Piece 431 – Read One Piece Chapter 431 You are now reading One Piece 431 online. If you are bored frommanga, you can try surprise me link at top of page or select another manga like One Piece 431 from our huge manga list. One Piece 431 released in mangareader fastest, recommend your friends to readnow! Tags: read One Piece 431 english, One Piece 431 raw manga, One Piece 431 online, One Piece 431 chap, One Piece 431 chapter, One Piece 431 high quality, One

 

Features Key:

  • Learn groups in groups
  • Learn in groups
  • Learn out of groups
  • Explore groups in groups
  • Explore out of groups

 

Tap Wizard 2 Crack + (LifeTime) Activation Code Free

Baseball Dream is a baseball dream simulation (which was first created as a student project at the IML Berlin). However, since it’s rather decent now, the guys at Remotes have made it bigger. Many years in the past. is assigned to the office of the sports editor of “Daimonz”. An all-rounder for talent, Nils is always keen to help his former collegues. You are sent out on an internship, and look for content for the newspaper. In your spare time, you can decide to play baseball on the practice pitches of the local club. After some time, you have to get to grips with the basics of the sport. For example, your best friend Nils will help you out with the hitting and will teach you the rules and tactics. In the process you become a more informed fan of the game. After completing the task at the end of the summer you will be able to advance further in the career. And later, if you work well, you can choose to pursue your career as a sports journalist, and at the same time you can also play on the professional baseball grounds in your new job. Features: – New mechanics for the player. In addition to the basic movement, you can now also choose a special mode that enables even greater movement options, although the movement takes a bit longer – Community interaction: Players can now create and play their own custom games. – A new customizable interface that you can configure to your own needs. – The game runs on Mac and Windows – literally everything is working and has been tested on both systems If you want to share the game: The support of the Windows Games App is not required. Simply send the shortcut to a friend Please note that the game will then have its own entry in your Windows Games App (made by Reliance and not Steam) Steam Achievements Baseball Dream is a sports simulation (therefore it will not contain achievements in its own right). The player will still get achievements in the games he plays, for example if he excels in single games or if he completes a task in the game. In the training mode (practice) you can add your own achievements. In order to receive achievements you need to play the game. When you are playing (within the game), you will be prompted to unlock the achievement if you succeeded. An unlock is a special text in the game’s interface (the “interface c9d1549cdd

 

Tap Wizard 2 Crack PC/Windows

Download Dead Rising 2: Off the RecordOff the Record2077 Playlist: In what world does donating 1% to the Electronic Frontier Foundation result in a career in BDSM and pedophilia?! Wanna see our updated content and read our new posts? Consider donating via Patreon: Get involved on Facebook: Twitter: Donate via Paypal: This is the official Daily ECOsta store: Shop the original Clean Bandit x Kid’s Club album: Listen to more music from online retailer Support Daily ECOsta by donating: BTC: 3ENkGPe6YBwRiwsFaHzTYX2A5Xx-xsCp4 ETH: 0x8e18e3c5a39f303c861d1c95c73c13b9b1933d8ec LTC: LNPY2HjN7RAh9TKwcwBUjKXLxzmpbhHvKq TREZ: 0xefc4c33e84fc4dc96230127d871885192672a931 Follow Daily ECOsta: These images/gif do not belong to me. The images were provided to Daily ECOsta with permission from childsplay. Flat affections, egoic emotions, and the DSM-5

 

What’s new in Tap Wizard 2:

Review – by Ian “IWAN” Ellwood A loaded review for you playing at home! A lot of talking about Pro Packs and I own a LOT of games, so even if it’s a review for one particular title, some of it may look familiar but I don’t have a ton of it to talk about in terms of other games. However, that never stopped us from playing & reviewing a ton of games back in the day as VNG. So, when I see one that I’ve only now been notified about, I find myself somewhat shaken up to be enjoying it on my platform of choice – Playcraft. I love the chaotic nature of the protagonist, being that he’s just straight up a shooting stuff. In a way I like shooting, but it’s not for me to take on so much of, so being able to play a game that doesn’t have the feel that I’m competing with myself is nice. I have yet to get a Pro Pack for Playcraft and have been working off my VNG collection in past weeks, but it’s time that I received a Pro Pack for it. We went into it just as a shooting game and this is one for you if you’d like to be precise. About Playcraft comes from the games called ReMIND & Poker Bob. The team behind the games will be known as “Kabin Staff”. This wasn’t a Kickstarter, so a lot of people saw it coming, which is great for getting the game ready as fast as possible. It also seems as if it’s being done with a lot of care and they’re putting a lot of work in. As a pro gamer? Well, you won’t be a super high level, but you will be a front runner for your class with some of the weapons you acquire. Gameplay As soon as I started to read up the game, I knew I was going to like this. It has several maps, all overlaid with some variety and an absurd amount of different weapons to craft. I’m already pumped up for the Super Tank or the Dual Flamer. You acquire a whole lot of guns and there are plenty of different mod types that you can use to make the best weapon available to you. I should also add that I

 

Free Download Tap Wizard 2 For PC

Airline Tycoon 2: Mario Zucchero is a combination of simulation and management games. You want to own a successful airline? Play as Mario Zucchero, the head of a real-world airline company, and rule the industry. Create your own airline and enjoy the rise and fall of air travel. Explore the completely reworked graphically engine. Winning in Mafia III is about anticipating the mob’s moves. Instead of doing your best to stay alive, you must stay one step ahead and figure out which of their actions will result in your death. This also means avoiding the bad guys during their most dangerous moves. So when you notice one of their weapons suddenly makes its way to a vent on top of a nearby building, you’ll want to move out of its way. You’ll never get that close to a rival mobster again. Requires the base game, Mafia III. The “Deja vu” expansion pack also requires the base game. Play as Lincoln Clay, the son of protagonist Agent 47. Pull off heists, draw out guards, and take a shot at becoming the new king of the underworld. The third chapter of the award-winning series adds more than 60 new missions across three unique areas. Includes the base game, expansion pack Deja Vu, and the Combat Mode update. Play as Agent 47 himself in an all-new story set three years after the events of Mafia III. Maraudeers will come out looking for you, but with police after you. Steal cars, escape on foot, and disable a few players to stay alive and keep the hustle moving. Head to the far east coast for a rundown sea view! Play the base game and join Marlo Stanfield and his crew as they run a corner of the city. But the streets of Atlantic City are not where things get easy. Instead of just robbing people in broad daylight, Marlo’s crew has honed their skills to take down the police and surveillance cameras. The coast guard follows too, so if you try to make it to the shore, you’ll be in for a long ride. When in doubt, find yourself some land and call in the Marlo Stanfield Transport crew. Includes the base game, Expansion Pack Razor’s Edge, and the Combat Mode update. You’ll have to fit in, blend in, and walk in the shadows to make it

 

How To Crack:

  • Download The Game
    • Click Here
      • Put the file on your Desktop
        • Double click on the file to open it
          • Wait a minute while the game installs
            • Now just run the game by double clicking on the icon
              • You will notice characters and the whole environment has changed!
        ]]> FanaticFAN Gaming may or may not have some content appearing off-page. This will not affect the functionality of the site and it will not effect your experience in any way.If there is a problem please email me using thecontact information listed at the bottom of the home page. Thanks!“<span style="color:#e3596b;text-decoration:none;"> fanaticfan123@gmail.com</span>”Date of making this mod: 1/22/2018 Wed, 22 Jan 2018 17:12:06 GMTServer: <b>Modded Dearem and PnP Server</b> Mod by: FanaticFAN Gaming Installation: 1. Extract the contents of the zip in the Mod directory (\BAINWP03). 2. Open the modman.cfg and add a line for Dearem (if you haven’t already) 3. If you are using Dearem2 and want to ensure your MP1 file is patched correctly, go to and download the latest version. 4. That’s it! Hopefully this mod is self-explanatory, else please ask for help in the comments section (the best way is to use the “What is this mod about?” section to describe what the mod does and what you expect<p> </p><a href="https://ed.ted.com/on/l3xOi06y">https://ed.ted.com/on/l3xOi06y</a><br> <a href="https://ed.ted.com/on/KLUUcB0O">https://ed.ted.com/on/KLUUcB0O</a><br> <a href="https://ed.ted.com/on/GSEwnd6u">https://ed.ted.com/on/GSEwnd6u</a><br> <a href="https://ed.ted.com/on/y09Y6aay">https://ed.ted.com/on/y09Y6aay</a><br> <a href="https://ed.ted.com/on/yekH3nbk">https://ed.ted.com/on/yekH3nbk</a><br> <h2><strong><span style="text-decoration: underline;">System Requirements For Tap Wizard 2:</span></strong></h2><p>OS: Microsoft Windows XP/Vista/7/8/8.1/10 Hard disk space: more than 600 MB Processor: Intel Pentium 4 3.0 GHz with 1 GB RAM or higher Video card: 256 MB of DirectX 11 compatible graphics card Internet connection: Broadband Internet connection Mouse: Microsoft Intellimouse mouse Minimum display resolution: 1024×768 Keyboard: English keyboard or one that has “Alt” key Drivers: Latest DirectX</p><p> </p><h2><strong><span style="text-decoration: underline;">Related sites:</span></strong></h2> <a href="https://themindfulpalm.com/oddventure-keygen-only-download-3264bit-final-2022/" >https://themindfulpalm.com/oddventure-keygen-only-download-3264bit-final-2022/</a><br><a href="https://postlistinn.is/a-walk-along-the-wall-trainer-free-download-for-pc-march-2022" >https://postlistinn.is/a-walk-along-the-wall-trainer-free-download-for-pc-march-2022</a><br><a href="https://in-loving-memory.online/train-simulator-munich-garmisch-partenkirchen-route-add-on-crack-with-serial-number-license-key-free-2022-latest/" >https://in-loving-memory.online/train-simulator-munich-garmisch-partenkirchen-route-add-on-crack-with-serial-number-license-key-free-2022-latest/</a><br><a href="" ></a><br><a href="https://kjvreadersbible.com/parasite-hack-mod-free-license-key-free-x64-latest-2022-2/" >https://kjvreadersbible.com/parasite-hack-mod-free-license-key-free-x64-latest-2022-2/</a><br><a href="https://zum-token.com/russian-fishing-4-trainer-3264bit-latest/" >https://zum-token.com/russian-fishing-4-trainer-3264bit-latest/</a><br><a href="http://ticketguatemala.com/focus-on-you-100th-day-dlc-crack-file-only-serial-key-free-download-win-mac/" >http://ticketguatemala.com/focus-on-you-100th-day-dlc-crack-file-only-serial-key-free-download-win-mac/</a><br><a href="http://insenergias.org/?p=42595" >http://insenergias.org/?p=42595</a><br><a href="https://rocketchanson.com/advert/bc-kings-keygen-license-keygen-2022/" >https://rocketchanson.com/advert/bc-kings-keygen-license-keygen-2022/</a><br><a href="https://digikiosk24.com/pirate-solitaire-2-serial-number-free-updated/" >https://digikiosk24.com/pirate-solitaire-2-serial-number-free-updated/</a><br><a href="https://charlottekoiclub.com/advert/root-crack-mega-activator/" >https://charlottekoiclub.com/advert/root-crack-mega-activator/</a><br><a href="https://resistanceschool.info/fantasy-grounds-pathfinder-rpg-ruins-of-azlant-ap-1-the-lost-outpost-pfrpg-crack-exe-file/" >https://resistanceschool.info/fantasy-grounds-pathfinder-rpg-ruins-of-azlant-ap-1-the-lost-outpost-pfrpg-crack-exe-file/</a><br><a href="https://theborejan.com/unworthy-soundtrack-cheat-code-free-registration-code-for-pc/" >https://theborejan.com/unworthy-soundtrack-cheat-code-free-registration-code-for-pc/</a><br><a href="http://alkalinedietexposed.com/ɗ里-hack-mod-license-keygen/" >http://alkalinedietexposed.com/ɗ里-hack-mod-license-keygen/</a><br><a href="https://in-loving-memory.online/agent-roswell-crack-activation-code-download/" >https://in-loving-memory.online/agent-roswell-crack-activation-code-download/</a><br><a href="https://danahenri.com/ggxrd-extra-color-palettes-ky-kiske-keygen-crack-serial-key-torrent-free-x64/" >https://danahenri.com/ggxrd-extra-color-palettes-ky-kiske-keygen-crack-serial-key-torrent-free-x64/</a><br><a href="http://eventaka.com/?p=37638" >http://eventaka.com/?p=37638</a><br><a href="https://spacebott.com/xxz-season-pass-mem-patch-with-keygen-download-for-windows/" >https://spacebott.com/xxz-season-pass-mem-patch-with-keygen-download-for-windows/</a><br><a href="https://www.myai-world.com/super-treasure-arena-product-key/" >https://www.myai-world.com/super-treasure-arena-product-key/</a><br><a href="https://diontalent.nl/2022/07/21/robos-world-the-zarnok-fortress-trainer-updated/" >https://diontalent.nl/2022/07/21/robos-world-the-zarnok-fortress-trainer-updated/</a><br> </div><!-- .fl-post-content --> <div class="fl-post-meta fl-post-meta-bottom"><div class="fl-post-cats-tags">Posted in <a href="https://epicphotosbyjohn.com/category/uncategorized/" rel="category tag">Uncategorized</a></div></div> </article> <div class="fl-comments"> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title">Leave a Comment <small><a rel="nofollow" id="cancel-comment-reply-link" href="/tap-wizard-2-product-key-and-xforce-keygen-license-keygen-free-3264bit#respond" style="display:none;">Cancel Reply</a></small></h3><p>You must be <a href="https://epicphotosbyjohn.com/wpa-epicphotosbyjohn/?redirect_to=https%3A%2F%2Fepicphotosbyjohn.com%2Ftap-wizard-2-product-key-and-xforce-keygen-license-keygen-free-3264bit%2F">logged in</a> to post a comment.</p> </div><!-- #respond --> </div> <!-- .fl-post --> </div> <div class="fl-sidebar fl-sidebar-right fl-sidebar-display-desktop col-md-4" itemscope="itemscope" itemtype="https://schema.org/WPSideBar"> <aside id="search-3" class="fl-widget widget_search"><form aria-label="Search" method="get" role="search" action="https://epicphotosbyjohn.com/" title="Type and press Enter to search."> <input aria-label="Search" type="search" class="fl-search-input form-control" name="s" placeholder="Search" value="" onfocus="if (this.value === 'Search') { this.value = ''; }" onblur="if (this.value === '') this.value='Search';" /> </form> </aside> <aside id="recent-posts-3" class="fl-widget widget_recent_entries"> <h4 class="fl-widget-title">Recent Posts</h4> <ul> <li> <a href="https://epicphotosbyjohn.com/the-best-natural-tourism-recommendations-in-germany-that-you-must-visit/">The Best Natural Tourism Recommendations in Germany That You Must Visit</a> </li> <li> <a href="https://epicphotosbyjohn.com/15-ways-to-lead-a-more-interesting-life/">15 Ways to Lead a More Interesting Life</a> </li> <li> <a href="https://epicphotosbyjohn.com/4-proses-tahapan-terjadinya-fotosintesis/">4 Proses Tahapan Terjadinya Fotosintesis</a> </li> <li> <a href="https://epicphotosbyjohn.com/manfaatkan-makanan-olahan-sehat-untuk-ayam/">Manfaatkan Makanan Olahan Sehat Untuk Ayam</a> </li> <li> <a href="https://epicphotosbyjohn.com/cartenz-hills-wawo-menikmati-panorama-sunset-yang-menawan-di-tomohon/">Cartenz Hills Wawo, Menikmati Panorama Sunset yang Menawan di Tomohon</a> </li> </ul> </aside><aside id="recent-comments-3" class="fl-widget widget_recent_comments"><h4 class="fl-widget-title">Recent Comments</h4><ul id="recentcomments"></ul></aside><aside id="archives-3" class="fl-widget widget_archive"><h4 class="fl-widget-title">Archives</h4> <ul> <li><a href='https://epicphotosbyjohn.com/2024/07/'>July 2024</a></li> <li><a href='https://epicphotosbyjohn.com/2024/03/'>March 2024</a></li> <li><a href='https://epicphotosbyjohn.com/2023/12/'>December 2023</a></li> <li><a href='https://epicphotosbyjohn.com/2023/11/'>November 2023</a></li> <li><a href='https://epicphotosbyjohn.com/2023/10/'>October 2023</a></li> <li><a href='https://epicphotosbyjohn.com/2023/09/'>September 2023</a></li> <li><a href='https://epicphotosbyjohn.com/2023/06/'>June 2023</a></li> <li><a href='https://epicphotosbyjohn.com/2023/02/'>February 2023</a></li> <li><a href='https://epicphotosbyjohn.com/2022/12/'>December 2022</a></li> <li><a href='https://epicphotosbyjohn.com/2022/10/'>October 2022</a></li> <li><a href='https://epicphotosbyjohn.com/2022/09/'>September 2022</a></li> <li><a href='https://epicphotosbyjohn.com/2022/08/'>August 2022</a></li> <li><a href='https://epicphotosbyjohn.com/2022/07/'>July 2022</a></li> <li><a href='https://epicphotosbyjohn.com/2022/06/'>June 2022</a></li> <li><a href='https://epicphotosbyjohn.com/2022/02/'>February 2022</a></li> <li><a href='https://epicphotosbyjohn.com/2021/07/'>July 2021</a></li> <li><a href='https://epicphotosbyjohn.com/2021/05/'>May 2021</a></li> <li><a href='https://epicphotosbyjohn.com/2021/02/'>February 2021</a></li> <li><a href='https://epicphotosbyjohn.com/2020/03/'>March 2020</a></li> <li><a href='https://epicphotosbyjohn.com/2020/02/'>February 2020</a></li> <li><a href='https://epicphotosbyjohn.com/2019/07/'>July 2019</a></li> </ul> </aside><aside id="categories-4" class="fl-widget widget_categories"><h4 class="fl-widget-title">Categories</h4> <ul> <li class="cat-item cat-item-2057"><a href="https://epicphotosbyjohn.com/category/advertising/">advertising</a> </li> <li class="cat-item cat-item-148"><a href="https://epicphotosbyjohn.com/category/animation/">animation</a> </li> <li class="cat-item cat-item-150"><a href="https://epicphotosbyjohn.com/category/anonymous/">anonymous</a> </li> <li class="cat-item cat-item-67"><a href="https://epicphotosbyjohn.com/category/architecture-and-interior-design/">architecture and interior design</a> </li> <li class="cat-item cat-item-2051"><a href="https://epicphotosbyjohn.com/category/arts-and-entertainment/">arts and entertainment</a> </li> <li class="cat-item cat-item-63"><a href="https://epicphotosbyjohn.com/category/business/">business</a> </li> <li class="cat-item cat-item-282"><a href="https://epicphotosbyjohn.com/category/businessentrepreneurs/">BusinessEntrepreneurs</a> </li> <li class="cat-item cat-item-103"><a href="https://epicphotosbyjohn.com/category/businesshome-based-business/">BusinessHome Based Business</a> </li> <li class="cat-item cat-item-145"><a href="https://epicphotosbyjohn.com/category/communications/">communications</a> </li> <li class="cat-item cat-item-126"><a href="https://epicphotosbyjohn.com/category/computers-and-technology/">computers and technology</a> </li> <li class="cat-item cat-item-5226"><a href="https://epicphotosbyjohn.com/category/dating-online/">Dating Online</a> </li> <li class="cat-item cat-item-307"><a href="https://epicphotosbyjohn.com/category/diet/">diet</a> </li> <li class="cat-item cat-item-91"><a href="https://epicphotosbyjohn.com/category/ecommerceshopify/">ecommerceShopify</a> </li> <li class="cat-item cat-item-123"><a href="https://epicphotosbyjohn.com/category/fashionclothing/">FashionClothing</a> </li> <li class="cat-item cat-item-122"><a href="https://epicphotosbyjohn.com/category/financeinsurance/">FinanceInsurance</a> </li> <li class="cat-item cat-item-119"><a href="https://epicphotosbyjohn.com/category/financeloans/">FinanceLoans</a> </li> <li class="cat-item cat-item-146"><a href="https://epicphotosbyjohn.com/category/financepersonal-finance/">FinancePersonal Finance</a> </li> <li class="cat-item cat-item-1886"><a href="https://epicphotosbyjohn.com/category/hardware/">hardware</a> </li> <li class="cat-item cat-item-1887"><a href="https://epicphotosbyjohn.com/category/home-and-family/">home and family</a> </li> <li class="cat-item cat-item-62"><a href="https://epicphotosbyjohn.com/category/home-based-business/">home based business</a> </li> <li class="cat-item cat-item-66"><a href="https://epicphotosbyjohn.com/category/home-improvement/">home improvement</a> </li> <li class="cat-item cat-item-125"><a href="https://epicphotosbyjohn.com/category/internet-businessezine-publishing/">Internet BusinessEzine Publishing</a> </li> <li class="cat-item cat-item-124"><a href="https://epicphotosbyjohn.com/category/internet-businesspodcasts/">Internet BusinessPodcasts</a> </li> <li class="cat-item cat-item-64"><a href="https://epicphotosbyjohn.com/category/marketing/">marketing</a> </li> <li class="cat-item cat-item-200"><a href="https://epicphotosbyjohn.com/category/mens-issues/">mens issues</a> </li> <li class="cat-item cat-item-149"><a href="https://epicphotosbyjohn.com/category/mobile-cell-phone/">mobile cell phone</a> </li> <li class="cat-item cat-item-2056"><a href="https://epicphotosbyjohn.com/category/mobile-cell-phone-reviews/">mobile cell phone reviews</a> </li> <li class="cat-item cat-item-98"><a href="https://epicphotosbyjohn.com/category/money/">money</a> </li> <li class="cat-item cat-item-35"><a href="https://epicphotosbyjohn.com/category/other/">Other</a> </li> <li class="cat-item cat-item-68"><a href="https://epicphotosbyjohn.com/category/painting/">painting</a> </li> <li class="cat-item cat-item-59"><a href="https://epicphotosbyjohn.com/category/photography/">photography</a> </li> <li class="cat-item cat-item-308"><a href="https://epicphotosbyjohn.com/category/popular-diets/">popular diets</a> </li> <li class="cat-item cat-item-142"><a href="https://epicphotosbyjohn.com/category/porn/">porn</a> </li> <li class="cat-item cat-item-2049"><a href="https://epicphotosbyjohn.com/category/productivity/">productivity</a> </li> <li class="cat-item cat-item-127"><a href="https://epicphotosbyjohn.com/category/self-improvementattraction/">Self ImprovementAttraction</a> </li> <li class="cat-item cat-item-65"><a href="https://epicphotosbyjohn.com/category/shopping-and-product-reviews/">shopping and product reviews</a> </li> <li class="cat-item cat-item-115"><a href="https://epicphotosbyjohn.com/category/travel-leisuredestinations/">Travel & LeisureDestinations</a> </li> <li class="cat-item cat-item-1"><a href="https://epicphotosbyjohn.com/category/uncategorized/">Uncategorized</a> </li> <li class="cat-item cat-item-2048"><a href="https://epicphotosbyjohn.com/category/visual-graphic-arts/">visual graphic arts</a> </li> <li class="cat-item cat-item-5227"><a href="https://epicphotosbyjohn.com/category/windows/">Windows</a> </li> <li class="cat-item cat-item-2438"><a href="https://epicphotosbyjohn.com/category/woodworking/">woodworking</a> </li> </ul> </aside> </div> </div> </div> </div><!-- .fl-page-content --> <footer class="fl-page-footer-wrap" itemscope="itemscope" itemtype="https://schema.org/WPFooter" role="contentinfo"> <div class="fl-page-footer-widgets"> <div class="fl-page-footer-widgets-container container"> <div class="fl-page-footer-widgets-row row"> <div class="col-sm-12 col-md-12 fl-page-footer-widget-col fl-page-footer-widget-col-1"><aside id="custom_html-2" class="widget_text fl-widget widget_custom_html"><div class="textwidget custom-html-widget"><div style="display:none;"> <p><a href="https://fisip.unpad.ac.id/ling/">hacker</a></p> <p><a href="https://simudik.banjarnegarakab.go.id/main/sbobet/">hacker</a></p> <p><a href="https://s1akuntansi.untidar.ac.id/parlay/">hacker</a></p> <p><a href="https://adventcalendar.whufc.com/sbobet/">hacker</a></p> <p><a href="https://lartsana.com/en/">hacker</a></p> <p><a href="https://fisip.unpad.ac.id/ling/">scam</a></p> <p><a href="https://simudik.banjarnegarakab.go.id/main/sbobet/">scam</a></p> <p><a href="https://s1akuntansi.untidar.ac.id/parlay/">scam</a></p> <p><a href="https://adventcalendar.whufc.com/sbobet/">scam</a></p> <p><a href="https://lartsana.com/en/">scam</a></p> </div> <div style="display:none;"> <a href="https://elearning.man1malukutengah.sch.id/app/">scam</a> <a href="https://lubukbangkar.desa.id/index.php/first/statistik/02/">scam</a> <a href="https://serasi.pa-sukoharjo.go.id/assets/plugins/uplot/">scam</a> <a href="https://lartsana.com/en/">scam</a> <a href="https://elearning.man1malukutengah.sch.id/app/">porn</a> <a href="https://lubukbangkar.desa.id/index.php/first/statistik/02/">porn</a> <a href="https://serasi.pa-sukoharjo.go.id/assets/plugins/uplot/">porn</a> <a href="https://lartsana.com/en/">porn</a> <a href="https://elearning.man1malukutengah.sch.id/app/">xxx</a> </div> <div style="display:none;"> <p><a href="https://journals.prosciences.net/blog/">sex</a></p> <p><a href="https://www.lsv-bay.de/">sex</a></p> <p><a href="https://evaluasi.bpsdmd.jatengprov.go.id/vendor/sbobet/">sex</a></p> <p><a href="https://agensedekah.com/public/parlay/">sex</a></p> <p><a href="https://e-proc.pamjaya.co.id/super/">sex</a></p> <p><a href="https://ppid.iainkediri.ac.id/wp-includes/parlay/">sex</a></p> <p><a href="https://bsmr-dev.basys.co.id/sbobet/">sex</a></p> <p><a href="https://journals.prosciences.net/blog/">bokep</a></p> <p><a href="https://www.lsv-bay.de/">bokep</a></p> <p><a href="https://evaluasi.bpsdmd.jatengprov.go.id/vendor/sbobet/">bokep</a></p> <p><a href="https://agensedekah.com/public/parlay/">bokep</a></p> <p><a href="https://e-proc.pamjaya.co.id/super/">bokep</a></p> <p><a href="https://ppid.iainkediri.ac.id/wp-includes/parlay/">bokep</a></p> <p><a href="https://bsmr-dev.basys.co.id/sbobet/">bokep</a></p> </div></div></aside></div> </div> </div> </div><!-- .fl-page-footer-widgets --> </footer> </div><!-- .fl-page --> <script> (function () { var c = document.body.className; c = c.replace(/woocommerce-no-js/, 'woocommerce-js'); document.body.className = c; })(); </script> <script src="https://epicphotosbyjohn.com/wp-content/plugins/woocommerce/assets/js/sourcebuster/sourcebuster.min.js?ver=9.3.3" id="sourcebuster-js-js"></script> <script id="wc-order-attribution-js-extra"> var wc_order_attribution = {"params":{"lifetime":1.0e-5,"session":30,"base64":false,"ajaxurl":"https:\/\/epicphotosbyjohn.com\/wp-admin\/admin-ajax.php","prefix":"wc_order_attribution_","allowTracking":true},"fields":{"source_type":"current.typ","referrer":"current_add.rf","utm_campaign":"current.cmp","utm_source":"current.src","utm_medium":"current.mdm","utm_content":"current.cnt","utm_id":"current.id","utm_term":"current.trm","utm_source_platform":"current.plt","utm_creative_format":"current.fmt","utm_marketing_tactic":"current.tct","session_entry":"current_add.ep","session_start_time":"current_add.fd","session_pages":"session.pgs","session_count":"udata.vst","user_agent":"udata.uag"}}; </script> <script src="https://epicphotosbyjohn.com/wp-content/plugins/woocommerce/assets/js/frontend/order-attribution.min.js?ver=9.3.3" id="wc-order-attribution-js"></script> <script src="https://epicphotosbyjohn.com/wp-content/plugins/bb-plugin/js/jquery.ba-throttle-debounce.min.js?ver=2.5.4.3" id="jquery-throttle-js"></script> <script src="https://epicphotosbyjohn.com/wp-content/plugins/bb-plugin/js/jquery.magnificpopup.js?ver=2.5.4.3" id="jquery-magnificpopup-js"></script> <script src="https://epicphotosbyjohn.com/wp-content/plugins/bb-plugin/js/jquery.fitvids.min.js?ver=1.2" id="jquery-fitvids-js"></script> <script src="https://epicphotosbyjohn.com/wp-includes/js/comment-reply.min.js?ver=6.6.2" id="comment-reply-js" async data-wp-strategy="async"></script> <script src="https://epicphotosbyjohn.com/wp-content/themes/bb-theme/js/bootstrap.min.js?ver=1.7.16" id="bootstrap-js"></script> <script id="fl-automator-js-extra"> var themeopts = {"medium_breakpoint":"992","mobile_breakpoint":"768","scrollTopPosition":"800"}; </script> <script src="https://epicphotosbyjohn.com/wp-content/themes/bb-theme/js/theme.js?ver=1.7.16" id="fl-automator-js"></script> <script>/*! * Bowser - a browser detector * https://github.com/ded/bowser * MIT License | (c) Dustin Diaz 2015 */ !function (name, definition) { if (typeof module != 'undefined' && module.exports) module.exports = definition() else if (typeof define == 'function' && define.amd) define(name, definition) else this[name] = definition() }('bowser', function () { /** * See useragents.js for examples of navigator.userAgent */ var t = true function detect(ua) { function getFirstMatch(regex) { var match = ua.match(regex); return (match && match.length > 1 && match[1]) || ''; } function getSecondMatch(regex) { var match = ua.match(regex); return (match && match.length > 1 && match[2]) || ''; } var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase() , likeAndroid = /like android/i.test(ua) , android = !likeAndroid && /android/i.test(ua) , nexusMobile = /nexus\s*[0-6]\s*/i.test(ua) , nexusTablet = !nexusMobile && /nexus\s*[0-9]+/i.test(ua) , chromeos = /CrOS/.test(ua) , silk = /silk/i.test(ua) , sailfish = /sailfish/i.test(ua) , tizen = /tizen/i.test(ua) , webos = /(web|hpw)os/i.test(ua) , windowsphone = /windows phone/i.test(ua) , windows = !windowsphone && /windows/i.test(ua) , mac = !iosdevice && !silk && /macintosh/i.test(ua) , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua) , edgeVersion = getFirstMatch(/edge\/(\d+(\.\d+)?)/i) , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i) , tablet = /tablet/i.test(ua) , mobile = !tablet && /[^-]mobi/i.test(ua) , xbox = /xbox/i.test(ua) , result if (/opera|opr|opios/i.test(ua)) { result = { name: 'Opera' , opera: t , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i) } } else if (/coast/i.test(ua)) { result = { name: 'Opera Coast' , coast: t , version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i) } } else if (/yabrowser/i.test(ua)) { result = { name: 'Yandex Browser' , yandexbrowser: t , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i) } } else if (/ucbrowser/i.test(ua)) { result = { name: 'UC Browser' , ucbrowser: t , version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i) } } else if (/mxios/i.test(ua)) { result = { name: 'Maxthon' , maxthon: t , version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i) } } else if (/epiphany/i.test(ua)) { result = { name: 'Epiphany' , epiphany: t , version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i) } } else if (/puffin/i.test(ua)) { result = { name: 'Puffin' , puffin: t , version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i) } } else if (/sleipnir/i.test(ua)) { result = { name: 'Sleipnir' , sleipnir: t , version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i) } } else if (/k-meleon/i.test(ua)) { result = { name: 'K-Meleon' , kMeleon: t , version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i) } } else if (windowsphone) { result = { name: 'Windows Phone' , windowsphone: t } if (edgeVersion) { result.msedge = t result.version = edgeVersion } else { result.msie = t result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i) } } else if (/msie|trident/i.test(ua)) { result = { name: 'Internet Explorer' , msie: t , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i) } } else if (chromeos) { result = { name: 'Chrome' , chromeos: t , chromeBook: t , chrome: t , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) } } else if (/chrome.+? edge/i.test(ua)) { result = { name: 'Microsoft Edge' , msedge: t , version: edgeVersion } } else if (/vivaldi/i.test(ua)) { result = { name: 'Vivaldi' , vivaldi: t , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier } } else if (sailfish) { result = { name: 'Sailfish' , sailfish: t , version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i) } } else if (/seamonkey\//i.test(ua)) { result = { name: 'SeaMonkey' , seamonkey: t , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i) } } else if (/firefox|iceweasel|fxios/i.test(ua)) { result = { name: 'Firefox' , firefox: t , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i) } if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) { result.firefoxos = t } } else if (silk) { result = { name: 'Amazon Silk' , silk: t , version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i) } } else if (/phantom/i.test(ua)) { result = { name: 'PhantomJS' , phantom: t , version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i) } } else if (/slimerjs/i.test(ua)) { result = { name: 'SlimerJS' , slimer: t , version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i) } } else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) { result = { name: 'BlackBerry' , blackberry: t , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i) } } else if (webos) { result = { name: 'WebOS' , webos: t , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i) }; if( /touchpad\//i.test(ua) ){ result.touchpad = t; } } else if (/bada/i.test(ua)) { result = { name: 'Bada' , bada: t , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i) }; } else if (tizen) { result = { name: 'Tizen' , tizen: t , version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier }; } else if (/qupzilla/i.test(ua)) { result = { name: 'QupZilla' , qupzilla: t , version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier } } else if (/chromium/i.test(ua)) { result = { name: 'Chromium' , chromium: t , version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier } } else if (/chrome|crios|crmo/i.test(ua)) { result = { name: 'Chrome' , chrome: t , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) } } else if (android) { result = { name: 'Android' , version: versionIdentifier } } else if (/safari|applewebkit/i.test(ua)) { result = { name: 'Safari' , safari: t } if (versionIdentifier) { result.version = versionIdentifier } } else if (iosdevice) { result = { name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod' } // WTF: version is not part of user agent in web apps if (versionIdentifier) { result.version = versionIdentifier } } else if(/googlebot/i.test(ua)) { result = { name: 'Googlebot' , googlebot: t , version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier } } else { result = { name: getFirstMatch(/^(.*)\/(.*) /), version: getSecondMatch(/^(.*)\/(.*) /) }; } // set webkit or gecko flag for browsers based on these engines if (!result.msedge && /(apple)?webkit/i.test(ua)) { if (/(apple)?webkit\/537\.36/i.test(ua)) { result.name = result.name || "Blink" result.blink = t } else { result.name = result.name || "Webkit" result.webkit = t } if (!result.version && versionIdentifier) { result.version = versionIdentifier } } else if (!result.opera && /gecko\//i.test(ua)) { result.name = result.name || "Gecko" result.gecko = t result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i) } // set OS flags for platforms that have multiple browsers if (!result.msedge && (android || result.silk)) { result.android = t } else if (iosdevice) { result[iosdevice] = t result.ios = t } else if (mac) { result.mac = t } else if (xbox) { result.xbox = t } else if (windows) { result.windows = t } else if (linux) { result.linux = t } // OS version extraction var osVersion = ''; if (result.windowsphone) { osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i); } else if (iosdevice) { osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i); osVersion = osVersion.replace(/[_\s]/g, '.'); } else if (android) { osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i); } else if (result.webos) { osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i); } else if (result.blackberry) { osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i); } else if (result.bada) { osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i); } else if (result.tizen) { osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i); } if (osVersion) { result.osversion = osVersion; } // device type extraction var osMajorVersion = osVersion.split('.')[0]; if ( tablet || nexusTablet || iosdevice == 'ipad' || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile))) || result.silk ) { result.tablet = t } else if ( mobile || iosdevice == 'iphone' || iosdevice == 'ipod' || android || nexusMobile || result.blackberry || result.webos || result.bada ) { result.mobile = t } // Graded Browser Support // http://developer.yahoo.com/yui/articles/gbs if (result.msedge || (result.msie && result.version >= 10) || (result.yandexbrowser && result.version >= 15) || (result.vivaldi && result.version >= 1.0) || (result.chrome && result.version >= 20) || (result.firefox && result.version >= 20.0) || (result.safari && result.version >= 6) || (result.opera && result.version >= 10.0) || (result.ios && result.osversion && result.osversion.split(".")[0] >= 6) || (result.blackberry && result.version >= 10.1) || (result.chromium && result.version >= 20) ) { result.a = t; } else if ((result.msie && result.version < 10) || (result.chrome && result.version < 20) || (result.firefox && result.version < 20.0) || (result.safari && result.version < 6) || (result.opera && result.version < 10.0) || (result.ios && result.osversion && result.osversion.split(".")[0] < 6) || (result.chromium && result.version < 20) ) { result.c = t } else result.x = t return result } var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent : '') bowser.test = function (browserList) { for (var i = 0; i < browserList.length; ++i) { var browserItem = browserList[i]; if (typeof browserItem=== 'string') { if (browserItem in bowser) { return true; } } } return false; } /** * Get version precisions count * * @example * getVersionPrecision("1.10.3") // 3 * * @param {string} version * @return {number} */ function getVersionPrecision(version) { return version.split(".").length; } /** * Array::map polyfill * * @param {Array} arr * @param {Function} iterator * @return {Array} */ function map(arr, iterator) { var result = [], i; if (Array.prototype.map) { return Array.prototype.map.call(arr, iterator); } for (i = 0; i < arr.length; i++) { result.push(iterator(arr[i])); } return result; } /** * Calculate browser version weight * * @example * compareVersions(['1.10.2.1', '1.8.2.1.90']) // 1 * compareVersions(['1.010.2.1', '1.09.2.1.90']); // 1 * compareVersions(['1.10.2.1', '1.10.2.1']); // 0 * compareVersions(['1.10.2.1', '1.0800.2']); // -1 * * @param {Array<String>} versions versions to compare * @return {Number} comparison result */ function compareVersions(versions) { // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2 var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1])); var chunks = map(versions, function (version) { var delta = precision - getVersionPrecision(version); // 2) "9" -> "9.0" (for precision = 2) version = version + new Array(delta + 1).join(".0"); // 3) "9.0" -> ["000000000"", "000000009"] return map(version.split("."), function (chunk) { return new Array(20 - chunk.length).join("0") + chunk; }).reverse(); }); // iterate in reverse order by reversed chunks array while (--precision >= 0) { // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true) if (chunks[0][precision] > chunks[1][precision]) { return 1; } else if (chunks[0][precision] === chunks[1][precision]) { if (precision === 0) { // all version chunks are same return 0; } } else { return -1; } } } /** * Check if browser is unsupported * * @example * bowser.isUnsupportedBrowser({ * msie: "10", * firefox: "23", * chrome: "29", * safari: "5.1", * opera: "16", * phantom: "534" * }); * * @param {Object} minVersions map of minimal version to browser * @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map * @param {String} [ua] user agent string * @return {Boolean} */ function isUnsupportedBrowser(minVersions, strictMode, ua) { var _bowser = bowser; // make strictMode param optional with ua param usage if (typeof strictMode === 'string') { ua = strictMode; strictMode = void(0); } if (strictMode === void(0)) { strictMode = false; } if (ua) { _bowser = detect(ua); } var version = "" + _bowser.version; for (var browser in minVersions) { if (minVersions.hasOwnProperty(browser)) { if (_bowser[browser]) { // browser version and min supported version. return compareVersions([version, minVersions[browser]]) < 0; } } } return strictMode; // not found } /** * Check if browser is supported * * @param {Object} minVersions map of minimal version to browser * @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map * @param {String} [ua] user agent string * @return {Boolean} */ function check(minVersions, strictMode, ua) { return !isUnsupportedBrowser(minVersions, strictMode, ua); } bowser.isUnsupportedBrowser = isUnsupportedBrowser; bowser.compareVersions = compareVersions; bowser.check = check; /* * Set our detect method to the main bowser object so we can * reuse it to test other user agents. * This is needed to implement future tests. */ bowser._detect = detect; return bowser }); (function($){ UABBTrigger = { /** * Trigger a hook. * * @since 1.1.0.3 * @method triggerHook * @param {String} hook The hook to trigger. * @param {Array} args An array of args to pass to the hook. */ triggerHook: function( hook, args ) { $( 'body' ).trigger( 'uabb-trigger.' + hook, args ); }, /** * Add a hook. * * @since 1.1.0.3 * @method addHook * @param {String} hook The hook to add. * @param {Function} callback A function to call when the hook is triggered. */ addHook: function( hook, callback ) { $( 'body' ).on( 'uabb-trigger.' + hook, callback ); }, /** * Remove a hook. * * @since 1.1.0.3 * @method removeHook * @param {String} hook The hook to remove. * @param {Function} callback The callback function to remove. */ removeHook: function( hook, callback ) { $( 'body' ).off( 'uabb-trigger.' + hook, callback ); }, }; })(jQuery); jQuery(document).ready(function( $ ) { var uabb_browser = bowser.name, uabb_browser_v = bowser.version, uabb_browser_class = uabb_browser.replace(/\s+/g, '-').toLowerCase(), uabb_browser_v_class = uabb_browser_class + parseInt( uabb_browser_v ); $('html').addClass(uabb_browser_class).addClass(uabb_browser_v_class); }); var wpAjaxUrl = 'https://epicphotosbyjohn.com/wp-admin/admin-ajax.php';var flBuilderUrl = 'https://epicphotosbyjohn.com/wp-content/plugins/bb-plugin/';var FLBuilderLayoutConfig = { anchorLinkAnimations : { duration : 1000, easing : 'swing', offset : 100 }, paths : { pluginUrl : 'https://epicphotosbyjohn.com/wp-content/plugins/bb-plugin/', wpAjaxUrl : 'https://epicphotosbyjohn.com/wp-admin/admin-ajax.php' }, breakpoints : { small : 768, medium : 992 }, waypoint: { offset: 80 } }; (function($){ if(typeof FLBuilderLayout != 'undefined') { return; } /** * Helper class with generic logic for a builder layout. * * @class FLBuilderLayout * @since 1.0 */ FLBuilderLayout = { /** * Initializes a builder layout. * * @since 1.0 * @method init */ init: function() { // Destroy existing layout events. FLBuilderLayout._destroy(); // Init CSS classes. FLBuilderLayout._initClasses(); // Init backgrounds. FLBuilderLayout._initBackgrounds(); // Init row shape layer height. FLBuilderLayout._initRowShapeLayerHeight(); // Only init if the builder isn't active. if ( 0 === $('.fl-builder-edit').length ) { // Init module animations. FLBuilderLayout._initModuleAnimations(); // Init anchor links. FLBuilderLayout._initAnchorLinks(); // Init the browser hash. FLBuilderLayout._initHash(); // Init forms. FLBuilderLayout._initForms(); } }, /** * Public method for refreshing Wookmark or MosaicFlow galleries * within an element. * * @since 1.7.4 * @method refreshGalleries */ refreshGalleries: function( element ) { var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), mfContent = $element.find( '.fl-mosaicflow-content' ), wmContent = $element.find( '.fl-gallery' ), mfObject = null; if ( mfContent ) { mfObject = mfContent.data( 'mosaicflow' ); if ( mfObject ) { mfObject.columns = $( [] ); mfObject.columnsHeights = []; mfContent.data( 'mosaicflow', mfObject ); mfContent.mosaicflow( 'refill' ); } } if ( wmContent ) { wmContent.trigger( 'refreshWookmark' ); } }, /** * Public method for refreshing Masonry within an element * * @since 1.8.1 * @method refreshGridLayout */ refreshGridLayout: function( element ) { var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), msnryContent = $element.find('.masonry'); if ( msnryContent.length ) { msnryContent.masonry('layout'); } }, /** * Public method for reloading BxSlider within an element * * @since 1.8.1 * @method reloadSlider */ reloadSlider: function( element ) { var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), bxContent = $element.find('.bx-viewport > div').eq(0), bxObject = null; if ( bxContent.length ) { bxObject = bxContent.data( 'bxSlider'); if ( bxObject ) { bxObject.reloadSlider(); } } }, /** * Public method for resizing WP audio player * * @since 1.8.2 * @method resizeAudio */ resizeAudio: function( element ) { var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), audioPlayers = $element.find('.wp-audio-shortcode.mejs-audio'), player = null, mejsPlayer = null, rail = null, railWidth = 400; if ( audioPlayers.length && typeof mejs !== 'undefined' ) { audioPlayers.each(function(){ player = $(this); mejsPlayer = mejs.players[player.attr('id')]; rail = player.find('.mejs-controls .mejs-time-rail'); var innerMejs = player.find('.mejs-inner'), total = player.find('.mejs-controls .mejs-time-total'); if ( typeof mejsPlayer !== 'undefined' ) { railWidth = Math.ceil(player.width() * 0.8); if ( innerMejs.length ) { rail.css('width', railWidth +'px!important'); //total.width(rail.width() - 10); mejsPlayer.options.autosizeProgress = true; // webkit has trouble doing this without a delay setTimeout(function () { mejsPlayer.setControlsSize(); }, 50); player.find('.mejs-inner').css({ visibility: 'visible', height: 'inherit' }); } } }); } }, /** * Public method for preloading WP audio player when it's inside the hidden element * * @since 1.8.2 * @method preloadAudio */ preloadAudio: function(element) { var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), contentWrap = $element.closest('.fl-accordion-item'), audioPlayers = $element.find('.wp-audio-shortcode.mejs-audio'); if ( ! contentWrap.hasClass('fl-accordion-item-active') && audioPlayers.find('.mejs-inner').length ) { audioPlayers.find('.mejs-inner').css({ visibility : 'hidden', height: 0 }); } }, /** * Public method for resizing slideshow momdule within the tab * * @since 1.10.5 * @method resizeSlideshow */ resizeSlideshow: function(){ if(typeof YUI !== 'undefined') { YUI().use('node-event-simulate', function(Y) { Y.one(window).simulate("resize"); }); } }, /** * Public method for reloading an embedded Google Map within the tabs or hidden element. * * @since 2.2 * @method reloadGoogleMap */ reloadGoogleMap: function(element){ var $element = 'undefined' == typeof element ? $( 'body' ) : $( element ), googleMap = $element.find( 'iframe[src*="google.com/maps"]' ); if ( googleMap.length ) { googleMap.attr( 'src', function(i, val) { return val; }); } }, /** * Unbinds builder layout events. * * @since 1.0 * @access private * @method _destroy */ _destroy: function() { var win = $(window); win.off('scroll.fl-bg-parallax'); win.off('resize.fl-bg-video'); }, /** * Checks to see if the current device has touch enabled. * * @since 1.0 * @access private * @method _isTouch * @return {Boolean} */ _isTouch: function() { if(('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)) { return true; } return false; }, /** * Checks to see if the current device is mobile. * * @since 1.7 * @access private * @method _isMobile * @return {Boolean} */ _isMobile: function() { return /Mobile|Android|Silk\/|Kindle|BlackBerry|Opera Mini|Opera Mobi|webOS/i.test( navigator.userAgent ); }, /** * Initializes builder body classes. * * @since 1.0 * @access private * @method _initClasses */ _initClasses: function() { var body = $( 'body' ), ua = navigator.userAgent; // Add the builder body class. if ( ! body.hasClass( 'archive' ) && $( '.fl-builder-content-primary' ).length > 0 ) { body.addClass('fl-builder'); } // Add the builder touch body class. if(FLBuilderLayout._isTouch()) { body.addClass('fl-builder-touch'); } // Add the builder mobile body class. if(FLBuilderLayout._isMobile()) { body.addClass('fl-builder-mobile'); } if ( $(window).width() < FLBuilderLayoutConfig.breakpoints.small ) { body.addClass( 'fl-builder-breakpoint-small' ); } if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.small && $(window).width() < FLBuilderLayoutConfig.breakpoints.medium ) { body.addClass( 'fl-builder-breakpoint-medium' ); } if ( $(window).width() > FLBuilderLayoutConfig.breakpoints.medium ) { body.addClass( 'fl-builder-breakpoint-large' ); } // IE11 body class. if ( ua.indexOf( 'Trident/7.0' ) > -1 && ua.indexOf( 'rv:11.0' ) > -1 ) { body.addClass( 'fl-builder-ie-11' ); } }, /** * Initializes builder node backgrounds that require * additional JavaScript logic such as parallax. * * @since 1.1.4 * @access private * @method _initBackgrounds */ _initBackgrounds: function() { var win = $(window); // Init parallax backgrounds. if($('.fl-row-bg-parallax').length > 0 && !FLBuilderLayout._isMobile()) { FLBuilderLayout._scrollParallaxBackgrounds(); FLBuilderLayout._initParallaxBackgrounds(); win.on('resize.fl-bg-parallax', FLBuilderLayout._initParallaxBackgrounds); win.on('scroll.fl-bg-parallax', FLBuilderLayout._scrollParallaxBackgrounds); } // Init video backgrounds. if($('.fl-bg-video').length > 0) { FLBuilderLayout._initBgVideos(); FLBuilderLayout._resizeBgVideos(); win.on('resize.fl-bg-video', FLBuilderLayout._resizeBgVideos); } }, /** * Initializes all parallax backgrounds in a layout. * * @since 1.1.4 * @access private * @method _initParallaxBackgrounds */ _initParallaxBackgrounds: function() { $('.fl-row-bg-parallax').each(FLBuilderLayout._initParallaxBackground); }, /** * Initializes a single parallax background. * * @since 1.1.4 * @access private * @method _initParallaxBackgrounds */ _initParallaxBackground: function() { var row = $(this), content = row.find('> .fl-row-content-wrap'), winWidth = $(window).width(), screenSize = '', imageSrc = { default: '', medium: '', responsive: '', }; imageSrc.default = row.data('parallax-image') || ''; imageSrc.medium = row.data('parallax-image-medium') || imageSrc.default; imageSrc.responsive = row.data('parallax-image-responsive') || imageSrc.medium; if (winWidth > FLBuilderLayoutConfig.breakpoints.medium) { screenSize = 'default'; } else if (winWidth > FLBuilderLayoutConfig.breakpoints.small && winWidth <= FLBuilderLayoutConfig.breakpoints.medium ) { screenSize = 'medium'; } else if (winWidth <= FLBuilderLayoutConfig.breakpoints.small) { screenSize = 'responsive'; } content.css('background-image', 'url(' + imageSrc[screenSize] + ')'); row.data('current-image-loaded', screenSize ); }, /** * Fires when the window is scrolled to adjust * parallax backgrounds. * * @since 1.1.4 * @access private * @method _scrollParallaxBackgrounds */ _scrollParallaxBackgrounds: function() { $('.fl-row-bg-parallax').each(FLBuilderLayout._scrollParallaxBackground); }, /** * Fires when the window is scrolled to adjust * a single parallax background. * * @since 1.1.4 * @access private * @method _scrollParallaxBackground */ _scrollParallaxBackground: function() { var win = $(window), row = $(this), content = row.find('> .fl-row-content-wrap'), speed = row.data('parallax-speed'), offset = content.offset(), yPos = -((win.scrollTop() - offset.top) / speed), initialOffset = ( row.data('parallax-offset') != null ) ? row.data('parallax-offset') : 0, totalOffset = yPos - initialOffset; content.css('background-position', 'center ' + totalOffset + 'px'); }, /** * Initializes all video backgrounds. * * @since 1.6.3.3 * @access private * @method _initBgVideos */ _initBgVideos: function() { $('.fl-bg-video').each(FLBuilderLayout._initBgVideo); }, /** * Initializes a video background. * * @since 1.6.3.3 * @access private * @method _initBgVideo */ _initBgVideo: function() { var wrap = $( this ), width = wrap.data( 'width' ), height = wrap.data( 'height' ), mp4 = wrap.data( 'mp4' ), youtube = wrap.data( 'youtube'), vimeo = wrap.data( 'vimeo'), mp4Type = wrap.data( 'mp4-type' ), webm = wrap.data( 'webm' ), webmType = wrap.data( 'webm-type' ), fallback = wrap.data( 'fallback' ), loaded = wrap.data( 'loaded' ), videoMobile = wrap.data( 'video-mobile' ), fallbackTag = '', videoTag = null, mp4Tag = null, webmTag = null; // Return if the video has been loaded for this row. if ( loaded ) { return; } videoTag = $( '<video autoplay loop muted playsinline></video>' ); /** * Add poster image (fallback image) */ if( 'undefined' != typeof fallback && '' != fallback ) { videoTag.attr( 'poster', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' ) videoTag.css( 'background', 'transparent url("' + fallback + '") no-repeat center center' ) videoTag.css( 'background-size', 'cover' ) videoTag.css( 'height', '100%' ) } // MP4 Source Tag if ( 'undefined' != typeof mp4 && '' != mp4 ) { mp4Tag = $( '<source />' ); mp4Tag.attr( 'src', mp4 ); mp4Tag.attr( 'type', mp4Type ); videoTag.append( mp4Tag ); } // WebM Source Tag if ( 'undefined' != typeof webm && '' != webm ) { webmTag = $( '<source />' ); webmTag.attr( 'src', webm ); webmTag.attr( 'type', webmType ); videoTag.append( webmTag ); } // This is either desktop, or mobile is enabled. if ( ! FLBuilderLayout._isMobile() || ( FLBuilderLayout._isMobile() && "yes" == videoMobile ) ) { if ( 'undefined' != typeof youtube ) { FLBuilderLayout._initYoutubeBgVideo.apply( this ); } else if ( 'undefined' != typeof vimeo ) { FLBuilderLayout._initVimeoBgVideo.apply( this ); } else { wrap.append( videoTag ); } } else { // if we are here, it means we are on mobile and NO is set so remove video src and use fallback videoTag.attr('src', '') wrap.append( videoTag ); } // Mark this video as loaded. wrap.data('loaded', true); }, /** * Initializes Youtube video background * * @since 1.9 * @access private * @method _initYoutubeBgVideo */ _initYoutubeBgVideo: function() { var playerWrap = $(this), videoId = playerWrap.data('video-id'), videoPlayer = playerWrap.find('.fl-bg-video-player'), enableAudio = playerWrap.data('enable-audio'), audioButton = playerWrap.find('.fl-bg-video-audio'), startTime = 'undefined' !== typeof playerWrap.data('start') ? playerWrap.data('start') : 0, startTime = 'undefined' !== typeof playerWrap.data('t') && startTime === 0 ? playerWrap.data('t') : startTime, endTime = 'undefined' !== typeof playerWrap.data('end') ? playerWrap.data('end') : 0, loop = 'undefined' !== typeof playerWrap.data('loop') ? playerWrap.data('loop') : 1, stateCount = 0, player,fallback_showing; if ( videoId ) { fallback = playerWrap.data('fallback') || false if( fallback ) { playerWrap.find('iframe').remove() fallbackTag = $( '<div></div>' ); fallbackTag.addClass( 'fl-bg-video-fallback' ); fallbackTag.css( 'background-image', 'url(' + playerWrap.data('fallback') + ')' ); fallbackTag.css( 'background-size', 'cover' ); fallbackTag.css( 'transition', 'background-image 1s') playerWrap.append( fallbackTag ); fallback_showing = true; } FLBuilderLayout._onYoutubeApiReady( function( YT ) { setTimeout( function() { player = new YT.Player( videoPlayer[0], { videoId: videoId, events: { onReady: function(event) { if ( "no" === enableAudio || FLBuilderLayout._isMobile() ) { event.target.mute(); } else if ( "yes" === enableAudio && event.target.isMuted ) { event.target.unMute(); } // Store an instance to a parent playerWrap.data('YTPlayer', player); FLBuilderLayout._resizeYoutubeBgVideo.apply(playerWrap); // Queue the video. event.target.playVideo(); if ( audioButton.length > 0 && ! FLBuilderLayout._isMobile() ) { audioButton.on( 'click', {button: audioButton, player: player}, FLBuilderLayout._toggleBgVideoAudio ); } }, onStateChange: function( event ) { if ( event.data === 1 ) { if ( fallback_showing ) { $( '.fl-bg-video-fallback' ).css( 'background-image', 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)' ) } } // Manual check if video is not playable in some browsers. // StateChange order: [-1, 3, -1] if ( stateCount < 4 ) { stateCount++; } // Comply with the audio policy in some browsers like Chrome and Safari. if ( stateCount > 1 && (-1 === event.data || 2 === event.data) && "yes" === enableAudio ) { player.mute(); player.playVideo(); audioButton.show(); } if ( event.data === YT.PlayerState.ENDED && 1 === loop ) { if ( startTime > 0 ) { player.seekTo( startTime ); } else { player.playVideo(); } } }, onError: function(event) { console.info('YT Error: ' + event.data) FLBuilderLayout._onErrorYoutubeVimeo(playerWrap) } }, playerVars: { playsinline: FLBuilderLayout._isMobile() ? 1 : 0, controls: 0, showinfo: 0, rel : 0, start: startTime, end: endTime, } } ); }, 1 ); } ); } }, /** * On youtube or vimeo error show the fallback image if available. * @since 2.0.7 */ _onErrorYoutubeVimeo: function(playerWrap) { fallback = playerWrap.data('fallback') || false if( ! fallback ) { return false; } playerWrap.find('iframe').remove() fallbackTag = $( '<div></div>' ); fallbackTag.addClass( 'fl-bg-video-fallback' ); fallbackTag.css( 'background-image', 'url(' + playerWrap.data('fallback') + ')' ); playerWrap.append( fallbackTag ); }, /** * Check if Youtube API has been downloaded * * @since 1.9 * @access private * @method _onYoutubeApiReady * @param {Function} callback Method to call when YT API has been loaded */ _onYoutubeApiReady: function( callback ) { if ( window.YT && YT.loaded ) { callback( YT ); } else { // If not ready check again by timeout.. setTimeout( function() { FLBuilderLayout._onYoutubeApiReady( callback ); }, 350 ); } }, /** * Initializes Vimeo video background * * @since 1.9 * @access private * @method _initVimeoBgVideo */ _initVimeoBgVideo: function() { var playerWrap = $(this), videoId = playerWrap.data('video-id'), videoPlayer = playerWrap.find('.fl-bg-video-player'), enableAudio = playerWrap.data('enable-audio'), audioButton = playerWrap.find('.fl-bg-video-audio'), player, width = playerWrap.outerWidth(), ua = navigator.userAgent; if ( typeof Vimeo !== 'undefined' && videoId ) { player = new Vimeo.Player(videoPlayer[0], { id : videoId, loop : true, title : false, portrait : false, background : true, autopause : false, muted : true }); playerWrap.data('VMPlayer', player); if ( "no" === enableAudio ) { player.setVolume(0); } else if ("yes" === enableAudio ) { // Chrome, Safari, Firefox have audio policy restrictions for autoplay videos. if ( ua.indexOf("Safari") > -1 || ua.indexOf("Chrome") > -1 || ua.indexOf("Firefox") > -1 ) { player.setVolume(0); audioButton.show(); } else { player.setVolume(1); } } player.play().catch(function(error) { FLBuilderLayout._onErrorYoutubeVimeo(playerWrap) }); if ( audioButton.length > 0 ) { audioButton.on( 'click', {button: audioButton, player: player}, FLBuilderLayout._toggleBgVideoAudio ); } } }, /** * Mute / unmute audio on row's video background. * It works for both Youtube and Vimeo. * * @since 2.1.3 * @access private * @method _toggleBgVideoAudio * @param {Object} e Method arguments */ _toggleBgVideoAudio: function( e ) { var player = e.data.player, control = e.data.button.find('.fl-audio-control'); if ( control.hasClass( 'fa-volume-off' ) ) { // Unmute control .removeClass( 'fa-volume-off' ) .addClass( 'fa-volume-up' ); e.data.button.find( '.fa-times' ).hide(); if ( 'function' === typeof player.unMute ) { player.unMute(); } else { player.setVolume( 1 ); } } else { // Mute control .removeClass( 'fa-volume-up' ) .addClass( 'fa-volume-off' ); e.data.button.find( '.fa-times' ).show(); if ( 'function' === typeof player.unMute ) { player.mute(); } else { player.setVolume( 0 ); } } }, /** * Fires when there is an error loading a video * background source and shows the fallback. * * @since 1.6.3.3 * @access private * @method _videoBgSourceError * @param {Object} e An event object * @deprecated 2.0.3 */ _videoBgSourceError: function( e ) { var source = $( e.target ), wrap = source.closest( '.fl-bg-video' ), vid = wrap.find( 'video' ), fallback = wrap.data( 'fallback' ), fallbackTag = ''; source.remove(); if ( vid.find( 'source' ).length ) { // Don't show the fallback if we still have other sources to check. return; } else if ( '' !== fallback ) { fallbackTag = $( '<div></div>' ); fallbackTag.addClass( 'fl-bg-video-fallback' ); fallbackTag.css( 'background-image', 'url(' + fallback + ')' ); wrap.append( fallbackTag ); vid.remove(); } }, /** * Fires when the window is resized to resize * all video backgrounds. * * @since 1.1.4 * @access private * @method _resizeBgVideos */ _resizeBgVideos: function() { $('.fl-bg-video').each( function() { FLBuilderLayout._resizeBgVideo.apply( this ); if ( $( this ).parent().find( 'img' ).length > 0 ) { $( this ).parent().imagesLoaded( $.proxy( FLBuilderLayout._resizeBgVideo, this ) ); } } ); }, /** * Fires when the window is resized to resize * a single video background. * * @since 1.1.4 * @access private * @method _resizeBgVideo */ _resizeBgVideo: function() { if ( 0 === $( this ).find( 'video' ).length && 0 === $( this ).find( 'iframe' ).length ) { return; } var wrap = $(this), wrapHeight = wrap.outerHeight(), wrapWidth = wrap.outerWidth(), vid = wrap.find('video'), vidHeight = wrap.data('height'), vidWidth = wrap.data('width'), newWidth = wrapWidth, newHeight = Math.round(vidHeight * wrapWidth/vidWidth), newLeft = 0, newTop = 0, iframe = wrap.find('iframe'); if ( vid.length ) { if(vidHeight === '' || typeof vidHeight === 'undefined' || vidWidth === '' || typeof vidWidth === 'undefined') { vid.css({ 'left' : '0px', 'top' : '0px', 'width' : newWidth + 'px' }); // Try to set the actual video dimension on 'loadedmetadata' when using URL as video source vid.on('loadedmetadata', FLBuilderLayout._resizeOnLoadedMeta); } else { if(newHeight < wrapHeight) { newHeight = wrapHeight; newLeft = -((newWidth - wrapWidth) / 2); if ( 0 != vidHeight ) { newWidth = Math.round(vidWidth * wrapHeight/vidHeight); } } else { newTop = -((newHeight - wrapHeight)/2); } vid.css({ 'left' : newLeft + 'px', 'top' : newTop + 'px', 'height' : newHeight + 'px', 'width' : newWidth + 'px' }); vid.on('loadedmetadata', FLBuilderLayout._resizeOnLoadedMeta); } } else if ( iframe.length ) { // Resize Youtube video player within iframe tag if ( typeof wrap.data('youtube') !== 'undefined' ) { FLBuilderLayout._resizeYoutubeBgVideo.apply(this); } } }, /** * Fires when video meta has been loaded. * This will be Triggered when width/height attributes were not specified during video background resizing. * * @since 1.8.5 * @access private * @method _resizeOnLoadedMeta */ _resizeOnLoadedMeta: function(){ var video = $(this), wrapHeight = video.parent().outerHeight(), wrapWidth = video.parent().outerWidth(), vidWidth = video[0].videoWidth, vidHeight = video[0].videoHeight, newHeight = Math.round(vidHeight * wrapWidth/vidWidth), newWidth = wrapWidth, newLeft = 0, newTop = 0; if(newHeight < wrapHeight) { newHeight = wrapHeight; newWidth = Math.round(vidWidth * wrapHeight/vidHeight); newLeft = -((newWidth - wrapWidth)/2); } else { newTop = -((newHeight - wrapHeight)/2); } video.parent().data('width', vidWidth); video.parent().data('height', vidHeight); video.css({ 'left' : newLeft + 'px', 'top' : newTop + 'px', 'width' : newWidth + 'px', 'height' : newHeight + 'px' }); }, /** * Fires when the window is resized to resize * a single Youtube video background. * * @since 1.9 * @access private * @method _resizeYoutubeBgVideo */ _resizeYoutubeBgVideo: function() { var wrap = $(this), wrapWidth = wrap.outerWidth(), wrapHeight = wrap.outerHeight(), player = wrap.data('YTPlayer'), video = player ? player.getIframe() : null, aspectRatioSetting = '16:9', // Medium aspectRatioArray = aspectRatioSetting.split( ':' ), aspectRatio = aspectRatioArray[0] / aspectRatioArray[1], ratioWidth = wrapWidth / aspectRatio, ratioHeight = wrapHeight * aspectRatio, isWidthFixed = wrapWidth / wrapHeight > aspectRatio, width = isWidthFixed ? wrapWidth : ratioHeight, height = isWidthFixed ? ratioWidth : wrapHeight; if ( video ) { $(video).width( width ).height( height ); } }, /** * Initializes module animations. * * @since 1.1.9 * @access private * @method _initModuleAnimations */ _initModuleAnimations: function() { if(typeof jQuery.fn.waypoint !== 'undefined') { $('.fl-animation').each( function() { var node = $( this ), nodeTop = node.offset().top, winHeight = $( window ).height(), bodyHeight = $( 'body' ).height(), waypoint = FLBuilderLayoutConfig.waypoint, offset = '80%'; if ( typeof waypoint.offset !== undefined ) { offset = FLBuilderLayoutConfig.waypoint.offset + '%'; } if ( bodyHeight - nodeTop < winHeight * 0.2 ) { offset = '100%'; } node.waypoint({ offset: offset, handler: FLBuilderLayout._doModuleAnimation }); } ); } }, /** * Runs a module animation. * * @since 1.1.9 * @access private * @method _doModuleAnimation */ _doModuleAnimation: function() { var module = 'undefined' == typeof this.element ? $(this) : $(this.element), delay = parseFloat(module.data('animation-delay')), duration = parseFloat(module.data('animation-duration')); if ( ! isNaN( duration ) ) { module.css( 'animation-duration', duration + 's' ); } if(!isNaN(delay) && delay > 0) { setTimeout(function(){ module.addClass('fl-animated'); }, delay * 1000); } else { setTimeout(function(){ module.addClass('fl-animated'); }, 1); } }, /** * Opens a tab or accordion item if the browser hash is set * to the ID of one on the page. * * @since 1.6.0 * @access private * @method _initHash */ _initHash: function() { var hash = window.location.hash.replace( '#', '' ).split( '/' ).shift(), element = null, tabs = null, responsiveLabel = null, tabIndex = null, label = null; if ( '' !== hash ) { try { element = $( '#' + hash ); if ( element.length > 0 ) { if ( element.hasClass( 'fl-accordion-item' ) ) { setTimeout( function() { element.find( '.fl-accordion-button' ).trigger( 'click' ); }, 100 ); } if ( element.hasClass( 'fl-tabs-panel' ) ) { setTimeout( function() { tabs = element.closest( '.fl-tabs' ); responsiveLabel = element.find( '.fl-tabs-panel-label' ); tabIndex = responsiveLabel.data( 'index' ); label = tabs.find( '.fl-tabs-labels .fl-tabs-label[data-index=' + tabIndex + ']' ); if ( responsiveLabel.is( ':visible' ) ) { responsiveLabel.trigger( 'click' ); } else { label[0].click(); FLBuilderLayout._scrollToElement( element ); } }, 100 ); } } } catch( e ) {} } }, /** * Initializes all anchor links on the page for smooth scrolling. * * @since 1.4.9 * @access private * @method _initAnchorLinks */ _initAnchorLinks: function() { $( 'a' ).each( FLBuilderLayout._initAnchorLink ); }, /** * Initializes a single anchor link for smooth scrolling. * * @since 1.4.9 * @access private * @method _initAnchorLink */ _initAnchorLink: function() { var link = $( this ), href = link.attr( 'href' ), loc = window.location, id = null, element = null, flNode = false; if ( 'undefined' != typeof href && href.indexOf( '#' ) > -1 && link.closest('svg').length < 1 ) { if ( loc.pathname.replace( /^\//, '' ) == this.pathname.replace( /^\//, '' ) && loc.hostname == this.hostname ) { try { id = href.split( '#' ).pop(); // If there is no ID then we have nowhere to look // Fixes a quirk in jQuery and FireFox if( ! id ) { return; } element = $( '#' + id ); if ( element.length > 0 ) { flNode = element.hasClass( 'fl-row' ) || element.hasClass( 'fl-col' ) || element.hasClass( 'fl-module' ); if ( !element.hasClass( 'fl-no-scroll' ) && ( link.hasClass( 'fl-scroll-link' ) || flNode ) ) { $( link ).on( 'click', FLBuilderLayout._scrollToElementOnLinkClick ); } if ( element.hasClass( 'fl-accordion-item' ) ) { $( link ).on( 'click', FLBuilderLayout._scrollToAccordionOnLinkClick ); } if ( element.hasClass( 'fl-tabs-panel' ) ) { $( link ).on( 'click', FLBuilderLayout._scrollToTabOnLinkClick ); } } } catch( e ) {} } } }, /** * Scrolls to an element when an anchor link is clicked. * * @since 1.4.9 * @access private * @method _scrollToElementOnLinkClick * @param {Object} e An event object. * @param {Function} callback A function to call when the scroll is complete. */ _scrollToElementOnLinkClick: function( e, callback ) { var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ); FLBuilderLayout._scrollToElement( element, callback ); e.preventDefault(); }, /** * Scrolls to an element. * * @since 1.6.4.5 * @access private * @method _scrollToElement * @param {Object} element The element to scroll to. * @param {Function} callback A function to call when the scroll is complete. */ _scrollToElement: function( element, callback ) { var config = FLBuilderLayoutConfig.anchorLinkAnimations, dest = 0, win = $( window ), doc = $( document ); if ( element.length > 0 ) { if ( 'fixed' === element.css('position') || 'fixed' === element.parent().css('position') ) { dest = element.position().top; } else if ( element.offset().top > doc.height() - win.height() ) { dest = doc.height() - win.height(); } else { dest = element.offset().top - config.offset; } $( 'html, body' ).animate( { scrollTop: dest }, config.duration, config.easing, function() { if ( 'undefined' != typeof callback ) { callback(); } if ( undefined != element.attr( 'id' ) ) { if ( history.pushState ) { history.pushState( null, null, '#' + element.attr( 'id' ) ); } else { window.location.hash = element.attr( 'id' ); } } } ); } }, /** * Scrolls to an accordion item when a link is clicked. * * @since 1.5.9 * @access private * @method _scrollToAccordionOnLinkClick * @param {Object} e An event object. */ _scrollToAccordionOnLinkClick: function( e ) { var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ); if ( element.length > 0 ) { var callback = function() { if ( element ) { element.find( '.fl-accordion-button' ).trigger( 'click' ); element = false; } }; FLBuilderLayout._scrollToElementOnLinkClick.call( this, e, callback ); } }, /** * Scrolls to a tab panel when a link is clicked. * * @since 1.5.9 * @access private * @method _scrollToTabOnLinkClick * @param {Object} e An event object. */ _scrollToTabOnLinkClick: function( e ) { var element = $( '#' + $( this ).attr( 'href' ).split( '#' ).pop() ), tabs = null, label = null, responsiveLabel = null; if ( element.length > 0 ) { tabs = element.closest( '.fl-tabs' ); responsiveLabel = element.find( '.fl-tabs-panel-label' ); tabIndex = responsiveLabel.data( 'index' ); label = tabs.find( '.fl-tabs-labels .fl-tabs-label[data-index=' + tabIndex + ']' ); if ( responsiveLabel.is( ':visible' ) ) { var callback = function() { if ( element ) { responsiveLabel.trigger( 'click' ); element = false; } }; FLBuilderLayout._scrollToElementOnLinkClick.call( this, e, callback ); } else { label[0].click(); FLBuilderLayout._scrollToElement( element ); } e.preventDefault(); } }, /** * Initializes all builder forms on a page. * * @since 1.5.4 * @access private * @method _initForms */ _initForms: function() { if ( ! FLBuilderLayout._hasPlaceholderSupport ) { $( '.fl-form-field input' ).each( FLBuilderLayout._initFormFieldPlaceholderFallback ); } $( '.fl-form-field input' ).on( 'focus', FLBuilderLayout._clearFormFieldError ); }, /** * Checks to see if the current device has HTML5 * placeholder support. * * @since 1.5.4 * @access private * @method _hasPlaceholderSupport * @return {Boolean} */ _hasPlaceholderSupport: function() { var input = document.createElement( 'input' ); return 'undefined' != input.placeholder; }, /** * Initializes the fallback for when placeholders aren't supported. * * @since 1.5.4 * @access private * @method _initFormFieldPlaceholderFallback */ _initFormFieldPlaceholderFallback: function() { var field = $( this ), val = field.val(), placeholder = field.attr( 'placeholder' ); if ( 'undefined' != placeholder && '' === val ) { field.val( placeholder ); field.on( 'focus', FLBuilderLayout._hideFormFieldPlaceholderFallback ); field.on( 'blur', FLBuilderLayout._showFormFieldPlaceholderFallback ); } }, /** * Hides a fallback placeholder on focus. * * @since 1.5.4 * @access private * @method _hideFormFieldPlaceholderFallback */ _hideFormFieldPlaceholderFallback: function() { var field = $( this ), val = field.val(), placeholder = field.attr( 'placeholder' ); if ( val == placeholder ) { field.val( '' ); } }, /** * Shows a fallback placeholder on blur. * * @since 1.5.4 * @access private * @method _showFormFieldPlaceholderFallback */ _showFormFieldPlaceholderFallback: function() { var field = $( this ), val = field.val(), placeholder = field.attr( 'placeholder' ); if ( '' === val ) { field.val( placeholder ); } }, /** * Clears a form field error message. * * @since 1.5.4 * @access private * @method _clearFormFieldError */ _clearFormFieldError: function() { var field = $( this ); field.removeClass( 'fl-form-error' ); field.siblings( '.fl-form-error-message' ).hide(); }, /** * Init Row Shape Layer's height. * * @since 2.5.3 * @access private * @method _initRowShapeLayerHeight */ _initRowShapeLayerHeight: function () { FLBuilderLayout._adjustRowShapeLayerHeight(); $( window ).on( 'resize', FLBuilderLayout._adjustRowShapeLayerHeight ); }, /** * Adjust Row Shape Layer's height to fix to remove the fine line that appears on certain screen sizes. * * @since 2.5.3 * @access private * @method _adjustRowShapeLayerHeight */ _adjustRowShapeLayerHeight: function() { var rowShapeLayers = $('.fl-builder-shape-layer'); $( rowShapeLayers ).each(function (index) { var rowShapeLayer = $(this), shape = $(rowShapeLayer).find('svg'), height = shape.height(), excludeShapes = '.fl-builder-shape-circle, .fl-builder-shape-dot-cluster, .fl-builder-shape-topography, .fl-builder-shape-rect'; if ( ! rowShapeLayer.is( excludeShapes ) ) { $(shape).css('height', Math.ceil( height ) ); } }); } }; /* Initializes the builder layout. */ $(function(){ FLBuilderLayout.init(); }); })(jQuery); /* Start Global JS */ /* End Global JS */ /* Start Global Node Custom JS */ /* End Global Node Custom JS */ /* Start Layout Custom JS */ /* End Layout Custom JS */ </script></body> </html>