index.tpl 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <!--[if lt IE 9]>
  2. <script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
  3. <![endif]-->
  4. <link type="text/css" rel="stylesheet" href="{$BASE_PATH_CSS}/ion.rangeSlider.css" property="stylesheet" />
  5. <link type="text/css" rel="stylesheet" href="{$BASE_PATH_CSS}/ion.rangeSlider.skinHTML5.css" property="stylesheet" />
  6. <div class="landing-page codeguard">
  7. <div class="hero">
  8. <div class="container">
  9. <img class="img-fluid p-3 hero-bg-white border rounded" src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/logo.png">
  10. <h4 class="strong-green mb-1">{lang key="store.codeGuard.headline"}</h4>
  11. <p class="text-muted">{lang key="store.codeGuard.tagline"}</p>
  12. </div>
  13. </div>
  14. <nav class="navbar navbar-light navbar-expand-lg border-top border-bottom">
  15. <div class="container">
  16. <span class="navbar-brand"></span>
  17. <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#nav-landing-page" aria-expanded="false">
  18. <span class="sr-only">{lang key="toggleNav"}</span>
  19. <span class="navbar-toggler-icon"></span>
  20. </button>
  21. <div class="collapse navbar-collapse" id="nav-landing-page">
  22. <ul class="nav navbar-nav">
  23. <li class="nav-item"><a class="nav-link" href="#" onclick="smoothScroll('#overview');return false">{lang key="store.codeGuard.tab.overview"}</a></li>
  24. <li class="nav-item"><a class="nav-link" href="#" onclick="smoothScroll('#pricing');return false">{lang key="store.codeGuard.tab.pricing"}</a></li>
  25. <li class="nav-item"><a class="nav-link" href="#" onclick="smoothScroll('#features');return false">{lang key="store.codeGuard.tab.features"}</a></li>
  26. <li class="nav-item"><a class="nav-link" href="#" onclick="smoothScroll('#faq');return false">{lang key="store.codeGuard.tab.faq"}</a></li>
  27. </ul>
  28. </div>
  29. </div>
  30. </nav>
  31. <div class="content-block image-standout border-bottom" id="overview">
  32. <div class="container">
  33. <div class="row">
  34. <div class="col-md-4 text-center">
  35. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/hero-image-a.png">
  36. </div>
  37. <div class="col-md-8">
  38. <h2 class="strong-green">{lang key="store.codeGuard.leadTitle"}</h2>
  39. <p>{lang key="store.codeGuard.leadText1"}</p>
  40. <p>{lang key="store.codeGuard.leadText2"}</p>
  41. </div>
  42. </div>
  43. </div>
  44. </div>
  45. <div class="content-block overview-features">
  46. <div class="container">
  47. <ul class="clearfix">
  48. <li>
  49. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/icons/backup-icon.png">
  50. <span>{lang key="store.codeGuard.dailyBackup"}</span>
  51. </li>
  52. <li>
  53. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/icons/client-icon.png">
  54. <span>{lang key="store.codeGuard.timeMachine"}</span>
  55. </li>
  56. <li>
  57. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/icons/wp-icon.png">
  58. <span>{lang key="store.codeGuard.wpPlugin"}</span>
  59. </li>
  60. <li>
  61. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/icons/alert-icon.png">
  62. <span>{lang key="store.codeGuard.changeAlerts"}</span>
  63. </li>
  64. <li>
  65. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/icons/malware-icon.png">
  66. <span>{lang key="store.codeGuard.malwareProtection"}</span>
  67. </li>
  68. </ul>
  69. </div>
  70. </div>
  71. <div class="content-block pricing get-started" id="pricing">
  72. <div class="container">
  73. <div class="mw-928 mx-auto">
  74. <div class="TM-card pricing-tables">
  75. <div class="pricing-slider-container">
  76. {if count($products) > 0}
  77. <div class="pricing-slider-header d-flex align-items-center">
  78. <h4>{lang key='store.codeGuard.chooseBackupPlan'}</h4>
  79. {if !$loggedin && $currencies}
  80. <form method="post" action="{routePath('store-product-group', $routePathSlug)}">
  81. <select name="currency" class="form-control currency-selector" onchange="submit()">
  82. <option>{lang key="changeCurrency"} ({$activeCurrency.prefix} {$activeCurrency.code})</option>
  83. {foreach $currencies as $currency}
  84. <option value="{$currency['id']}">{$currency['prefix']} {$currency['code']}</option>
  85. {/foreach}
  86. </select>
  87. </form>
  88. {/if}
  89. </div>
  90. <div class="pricing-slider-body">
  91. <div class="pricing-slider-top">
  92. <div class="slider">
  93. <div class="slider-slide">
  94. <input type="hidden" id="codeGuardPlanSelector" name="codeguardplan" value="" />
  95. </div>
  96. <div class="pricing-slider-actions" id="codeGuardPlanActions">
  97. </div>
  98. </div>
  99. </div>
  100. <div class="pricing-slider-bottom">
  101. <div class="pricing-slider-summary">
  102. <div class="pricing-slider-summary-item">
  103. <div class="pricing-slider-summary-label">
  104. Storage
  105. </div>
  106. <div class="pricing-slider-summary-value">
  107. <span id="diskSpace"></span>
  108. </div>
  109. </div>
  110. <div class="pricing-slider-summary-item">
  111. <div class="pricing-slider-summary-label">
  112. Price
  113. </div>
  114. <div class="pricing-slider-summary-value">
  115. <span id="pricingAmount" class="price"></span><span class="price-cycle" id="pricingCycle"></span>
  116. </div>
  117. </div>
  118. </div>
  119. <div class="pricing-slider-form-action form-actions">
  120. <form action="{routePath('cart-order')}" method="post">
  121. <input id="selectedProductId" type="hidden" name="pid" value="">
  122. <button type="submit" class="btn btn-primary btn-lg btn-block order-btn" id="product-order-button">
  123. {lang key='ordernowbutton'}
  124. </button>
  125. </form>
  126. </div>
  127. </div>
  128. </div>
  129. </div>
  130. {elseif $inPreview}
  131. <div class="alert alert-info">
  132. <div class="alert-body">
  133. {lang key="store.codeGuard.adminPreview"}
  134. </div>
  135. </div>
  136. {/if}
  137. </div>
  138. </div>
  139. </div>
  140. </div>
  141. <div class="content-block features" id="features">
  142. <div class="container">
  143. <div class="row">
  144. <div class="col-lg-4 col-sm-6">
  145. <div class="feature">
  146. <div class="icon">
  147. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/features/daily-backups-feature.png">
  148. </div>
  149. <h4>{lang key="store.codeGuard.features.dailyBackup"}</h4>
  150. <p>{lang key="store.codeGuard.features.dailyBackupDescription"}</p>
  151. </div>
  152. </div>
  153. <div class="col-lg-4 col-sm-6">
  154. <div class="feature">
  155. <div class="icon">
  156. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/features/unlimited-files-feature.png">
  157. </div>
  158. <h4>{lang key="store.codeGuard.features.unlimitedFiles"}</h4>
  159. <p>{lang key="store.codeGuard.features.unlimitedFilesDescription"}</p>
  160. </div>
  161. </div>
  162. <div class="col-lg-4 col-sm-6">
  163. <div class="feature">
  164. <div class="icon">
  165. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/features/click-restore-feature.png">
  166. </div>
  167. <h4>{lang key="store.codeGuard.features.oneClickRestore"}</h4>
  168. <p>{lang key="store.codeGuard.features.oneClickRestoreDescription"}</p>
  169. </div>
  170. </div>
  171. <div class="col-lg-4 col-sm-6">
  172. <div class="feature">
  173. <div class="icon">
  174. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/features/malware-feature.png">
  175. </div>
  176. <h4>{lang key="store.codeGuard.features.malwareMonitoring"}</h4>
  177. <p>{lang key="store.codeGuard.features.malwareMonitoringDescription"}</p>
  178. </div>
  179. </div>
  180. <div class="col-lg-4 col-sm-6">
  181. <div class="feature">
  182. <div class="icon">
  183. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/features/wp-feature.png">
  184. </div>
  185. <h4>{lang key="store.codeGuard.features.wp"}</h4>
  186. <p>{lang key="store.codeGuard.features.wpDescription"}</p>
  187. </div>
  188. </div>
  189. <div class="col-lg-4 col-sm-6">
  190. <div class="feature">
  191. <div class="icon">
  192. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/features/file-monitoring-feature.png">
  193. </div>
  194. <h4>{lang key="store.codeGuard.features.fileMonitoring"}</h4>
  195. <p>{lang key="store.codeGuard.features.fileMonitoringDescription"}</p>
  196. </div>
  197. </div>
  198. <div class="col-lg-4 col-sm-6">
  199. <div class="feature">
  200. <div class="icon">
  201. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/features/servers-feature.png">
  202. </div>
  203. <h4>{lang key="store.codeGuard.features.servers"}</h4>
  204. <p>{lang key="store.codeGuard.features.serversDescription"}</p>
  205. </div>
  206. </div>
  207. <div class="col-lg-4 col-sm-6">
  208. <div class="feature">
  209. <div class="icon">
  210. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/features/email-feature.png">
  211. </div>
  212. <h4>{lang key="store.codeGuard.features.email"}</h4>
  213. <p>{lang key="store.codeGuard.features.emailDescription"}</p>
  214. </div>
  215. </div>
  216. <div class="col-lg-4 col-sm-6">
  217. <div class="feature">
  218. <div class="icon">
  219. <img src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/features/api-feature.png">
  220. </div>
  221. <h4>{lang key="store.codeGuard.features.api"}</h4>
  222. <p>{lang key="store.codeGuard.features.apiDescription"}</p>
  223. </div>
  224. </div>
  225. </div>
  226. </div>
  227. </div>
  228. <div class="content-block faq" id="faq">
  229. <div class="container">
  230. <div class="mw-928 mx-auto">
  231. <h2 class="block-title text-center">{lang key="store.codeGuard.faq.title"}</h2>
  232. <div aria-multiselectable="true" class="panel-group" id="accordionFAQs" role="tablist">
  233. {foreach from=$codeGuardFaqs item=$faq key=num name=foo}
  234. <div class="panel panel-default">
  235. <div class="panel-heading" data-toggle="collapse" data-target="#codeguard_faq{$num}" aria-expanded="true">
  236. <h4 class="panel-title">{$faq['question']}</h4>
  237. </div>
  238. <div id="codeguard_faq{$num}" class="panel-collapse collapse {if $smarty.foreach.foo.first}show{/if}" data-parent="#accordionFAQs" aria-expanded="true">
  239. <div class="panel-body">
  240. <p>{$faq['answer']}</p>
  241. </div>
  242. </div>
  243. </div>
  244. {/foreach}
  245. </div>
  246. </div>
  247. </div>
  248. </div>
  249. <div class="content-block">
  250. <div class="container">
  251. <div class="text-center">
  252. <img class="img-fluid p-3 hero-bg-white border rounded" src="{$WEB_ROOT}/assets/img/marketconnect/codeguard/logo.png">
  253. </div>
  254. </div>
  255. </div>
  256. </div>
  257. <!-- RangeSlider JS -->
  258. <script type="text/javascript" src="{$BASE_PATH_JS}/ion.rangeSlider.js"></script>
  259. <script type="text/javascript">
  260. var sliderActivated = false;
  261. var sliderProductNames = [
  262. {foreach $products as $product}
  263. "{$product->diskSpace}",
  264. {/foreach}
  265. ];
  266. var allProducts = {
  267. {foreach $products as $num => $product}
  268. "{$num}": {
  269. "pid": "{$product->id}",
  270. "name": "{$product->name}",
  271. "desc": "{$product->formattedProductFeatures.featuresDescription|nl2br|trim}",
  272. "price": "{if $WHMCSCurrency.prefix}<span class='price-prefix'>{$WHMCSCurrency.prefix}</span>{/if}{$product->pricing()->first()->price()|replace:$WHMCSCurrency.prefix:""}",
  273. "cycle": {if $product->pricing()->first()->cycle() eq "monthly"}"/mo"{elseif $product->pricing()->first()->cycle() eq "quarterly"}"/3mo"{elseif $product->pricing()->first()->cycle() eq "semiannually"}"/6mo"{elseif $product->pricing()->first()->cycle() eq "annually"}"/yr"{elseif $product->pricing()->first()->cycle() eq "biennially"}"/2yr"{elseif $product->pricing()->first()->cycle() eq "triennially"}"/3yr"{/if},
  274. "diskspace": "{$product->diskSpace}"
  275. },
  276. {/foreach}
  277. };
  278. var definedProducts = {
  279. {foreach $products as $product}
  280. "{$product->id}": "{$product@index}"{if !($product@last)},{/if}
  281. {/foreach}
  282. };
  283. {foreach $products as $product}
  284. {if $product->isFeatured}
  285. var firstFeatured = definedProducts["{$product->id}"];
  286. {break}
  287. {/if}
  288. {/foreach}
  289. var rangeSliderValues = {
  290. type: "single",
  291. grid: false,
  292. grid_snap: true,
  293. hide_min_max: true,
  294. step: 1,
  295. from: 1,
  296. onStart: refreshSelectedProduct,
  297. {if $products|@count eq 1}
  298. disable: true,
  299. {/if}
  300. onChange: refreshSelectedProduct,
  301. onFinish: stopSliding,
  302. values: sliderProductNames
  303. };
  304. if (typeof firstFeatured !== 'undefined') {
  305. rangeSliderValues['from'] = firstFeatured;
  306. }
  307. var container = $('<div class="slider-actions-list"/>');
  308. $.each(sliderProductNames, function(i,val) {
  309. container.append('<div class="slider-actions-btn" data-sliderValue="'+i+'"><span>'+val+'</span></div>');
  310. });
  311. function refreshSelectedProduct(data)
  312. {
  313. var featureName = "";
  314. var featureMarkup = "";
  315. var i = parseInt(data.from);
  316. if (isNaN(i)) {
  317. i = 0;
  318. jQuery(".irs-single").text(sliderProductNames[0]);
  319. jQuery(".irs-grid-text").text('');
  320. }
  321. jQuery('.irs-slider').addClass('active');
  322. jQuery("#selectedProductId").val(allProducts[i].pid);
  323. jQuery("#productDescription").html(allProducts[i].desc);
  324. jQuery("#pricingAmount").html(allProducts[i].price);
  325. jQuery("#pricingCycle").html(allProducts[i].cycle);
  326. jQuery("#diskSpace").html(allProducts[i].diskspace);
  327. jQuery('#codeGuardPlanActions').html(container);
  328. jQuery('.slider-actions-btn').removeClass('active');
  329. jQuery('.slider-actions-btn[data-sliderValue="'+i+'"]').addClass('active');
  330. }
  331. function stopSliding(){
  332. jQuery('.irs-slider').removeClass('active');
  333. }
  334. jQuery("#codeGuardPlanSelector").ionRangeSlider(rangeSliderValues);
  335. {if $products|@count eq 1}
  336. jQuery(".irs-single").text(sliderProductNames[0]);
  337. jQuery(".irs-grid-text").text('');
  338. {/if}
  339. sliderActivated = true;
  340. let my_range = $("#codeGuardPlanSelector").data("ionRangeSlider");
  341. jQuery(document).on('click','.slider-actions-btn', function(){
  342. i = jQuery(this).data('slidervalue');
  343. my_range.update({literal}{from: i, to: i}{/literal});
  344. jQuery("#selectedProductId").val(allProducts[i].pid);
  345. jQuery("#productDescription").html(allProducts[i].desc);
  346. jQuery("#pricingAmount").html(allProducts[i].price);
  347. jQuery("#pricingCycle").html(allProducts[i].cycle);
  348. jQuery("#diskSpace").html(allProducts[i].diskspace);
  349. jQuery('#codeGuardPlanActions').html(container);
  350. jQuery('.slider-actions-btn').removeClass('active');
  351. jQuery('.slider-actions-btn[data-sliderValue="'+i+'"]').addClass('active');
  352. });
  353. </script>